19. Edge Block (補助モジュール)
TL;DR(このノードは何をする・専門語ゼロ): 生成された ADR の本文先頭に、ADR 同士の関係 (supersedes / depends_on など 7 種類) を書く YAML ブロックを必ず置くための補助モジュール。空のままでも構わないが、ブロック自体が無いと CI が落ちる。本文に既に書いてあれば何もせず、無ければ全部空配列の雛形を前置する。事業軸 (business) を起案時に指定していれば、その 1 行も先頭へ挿入する。AI は使わず、正規表現で frontmatter を見るだけの単純な処理。
実装:
drp/src/nodes/edge_block.ts呼び出し元:drp/src/nodes/body_generation.ts(ensureEdgeBlockで生成直後に前置) /drp/src/nodes/webhook.ts(insertBusinessLineで PR 起票直前に business 行を挿入) プロンプト: なし (LLM 呼出なし) テスト:drp/test/edge_block.test.ts基盤 ADR: ADR-0131 (新規 ADR の辺フィールド 7 種必須化) / ADR-0133 (辺の意味監査)
1. 役割と位置づけ
パイプライン生成本文に ADR 同士の型付き辺 frontmatter (7 種) が無いと、adr-lint --check-edges-new が error になり生成 PR が CI green にならない (PR #1722 検収差し戻し)。本モジュールは生成直後に決定的に前置し、CI gate を確実に通す。
- 解決する課題: LLM 任せでは frontmatter の有無や 7 キー網羅が安定せず、生成 PR が CI で落ちる。LLM を介さず純コードで前置することで確実性を担保する。
- 設計思想: graph には独立ノードとして addNode されない補助モジュール。
body_generation.tsの本文生成直後にensureEdgeBlockを呼び、webhook.tsの PR 起票直前にinsertBusinessLineを呼ぶ 2 段構成。雛形は全空配列 ([]) で十分。辺の意味は人間レビュー / ADR-0133 の意味監査で補正可能、という sub 検収の指針に従う。 - 由来: ADR-0131 (#1703) で新規 ADR の辺 frontmatter 7 種が必須化された。
2. フロー図
flowchart LR
BG[body_generation] -->|生成直後| EE[ensureEdgeBlock]
EE -->|前置済 adrBody| BG
BG --> SC[scoring]
WH[webhook] -->|起票直前| IB[insertBusinessLine]
IB -->|business 行挿入済 adrBody| WH
3. トリガー条件
graph の独立ノードではないため graph 上の edge 条件はない。以下 2 つの呼び出し点で発火:
| 呼び出し元 | タイミング | 用途 |
|---|---|---|
body_generation.ts:278 | 本文生成直後 | ensureEdgeBlock(adrBody) で 7 キー雛形を前置・補完 |
webhook.ts:129 | PR 起票直前 (routing.business あり時のみ) | insertBusinessLine(adrBody, business) で事業軸を 1 行挿入 |
4. 入力 (引数)
ensureEdgeBlock:
| 引数 | 用途 |
|---|---|
adrBody | 生成された ADR 本文 (frontmatter ありなし両対応) |
insertBusinessLine:
| 引数 | 用途 |
|---|---|
adrBody | 本文 |
business | 事業軸 (起案時指定の corp / mas / drp 等) |
5. 処理ロジック
1. ensureEdgeBlock(adrBody):
a. /^---\n([\s\S]*?)\n---\n?/ で frontmatter を抽出
b. frontmatter なし → SKELETON (7 キー全空配列 + コメント) を前置、added=全 7 キー
c. frontmatter あり → EDGE_KEYS のうち欠落分だけを補完、added=補完したキーのみ
d. すべて揃っていれば adrBody 不変、added=[]
2. insertBusinessLine(adrBody, business):
a. frontmatter 抽出
b. frontmatter なし or business 行が既にある → 何もしない (冪等)
c. frontmatter 先頭に `business: <value> # 事業軸 ...` を 1 行挿入
EDGE_KEYS (7 種):
supersedes/amends/refines/depends_on/relates_to/conflicts_with/follows_up_on
最終 frontmatter 順序 (CI autofix と整合): trio (id / type / status) → メタ → business → 辺ブロック。CI autofix (scripts/pipeline-adr-autofix.mjs) のトリオ+メタ複製は frontmatter 先頭へ挿入するため、business は trio+メタの直後・辺ブロックの直前に入る。
6. LLM 設定
LLM 不要 (コード合成のみ)。正規表現で frontmatter を抽出し、欠落キーを補完するだけ。冪等性は両関数とも保証。
7. 副作用
なし。本文文字列を返すのみ。
8. 出力
ensureEdgeBlock:
{
body: string, // 雛形前置 / 補完済の本文 (変更なしなら入力と同一)
added: string[], // 追記したキー (変更なしは空配列)
}
insertBusinessLine:
string // business 行挿入済の本文 (frontmatter なし / business 既存なら入力と同一)
9. 分岐 (次の処理)
graph の独立ノードではないため graph edge を持たない。
body_generationはensureEdgeBlockのbodyをadrBodyに上書きしてscoringへ進むwebhookはinsertBusinessLineの戻り値でadrBodyを上書きして PR を起票する
10. エラー時の挙動
エラー無し (deterministic)。
- frontmatter なし → SKELETON を前置 (例外なし)
- 全キー揃い → 入力をそのまま返す
- business 既存 → 何もしない (冪等)
- 正規表現マッチが入れ子になることはない (
^---\nを行頭固定マッチ)
11. 既知の弱点・運用注意
- 雛形は全空配列: 辺の型 (どの ADR を supersede するか等) は人間レビューで補正する前提。LLM に推論させる選択肢もあるが、誤った辺は混乱の元のため空配列の雛形で gate を通すのが sub 検収の指針。
- EDGE_KEYS 変更時の追従: 配列を増減させると CI 側
--check-edges-newの検査キーも追従が必要 (adr-lint側で SSoT 共有していない場合)。 - 業務軸 (business) の正規語彙: webhook 側 routing の正規語彙 (
corp/mas/drp等) に依存。CI 側の nav 登録グループ既定マップ (corp→09.5 / mas→09.3 / drp→09.4) と同期している必要がある。 - 冪等性:
insertBusinessLineはbusiness行が既にあれば何もしない。401 途中再開でも二重挿入しない設計。 - frontmatter なし時の前置: 本文先頭の空白 (
\s+) を除去してから前置するため、生成 LLM が改行を入れすぎても無害化される。
12. テストケース
drp/test/edge_block.test.ts (vitest):
| 観点 | 期待 |
|---|---|
| frontmatter なしの本文 | 7 キー全空配列の雛形を前置、added=EDGE_KEYS |
| frontmatter ありで 7 キー全揃い | 本文不変、added=[] |
| frontmatter ありで一部欠落 | 欠落分のみ補完、added=欠落キー配列 |
insertBusinessLine 通常 | frontmatter 先頭に business 行が 1 行挿入 |
insertBusinessLine 冪等 | business 既存なら何もしない |
insertBusinessLine frontmatter なし | 何もしない (前置は別関数の責務) |
13. 過去の設計判断ログ
| 日時 | 変更 | 経緯 |
|---|---|---|
| ADR-0131 採択 (#1703) | 新規 ADR の辺 frontmatter 7 種を必須化 | ADR 間関係の機械可読化 |
| PR #1722 検収差し戻し 2 | 生成 PR が --check-edges-new で落ちる | LLM 任せの frontmatter 生成が不安定 → コード前置で確実化 |
| 雛形は全空配列で確定 | 辺の型は人間レビューで補正、まず gate を通す | LLM 推論させると誤った辺で混乱の元 |
insertBusinessLine 追加 | nav 登録グループ既定マップとの整合 | corp/mas/drp の事業軸を frontmatter に保持 |
14. 関連リンク
- 呼び出し元: 03_body_generation.md / 11_webhook.md
- 関連 ADR:
- CI gate:
adr-lint --check-edges-new - CI autofix:
scripts/pipeline-adr-autofix.mjs