08. Policy Alignment Node (テナント層)
TL;DR(このノードは何をする・専門語ゼロ): 前段までの関門が「一般論として良い決定か」を見るのに対し、このノードは「この会社にとって良い決定か」を、自社が定めた判断の優先順位とリスクの線引きに照らして評価する。汎用の AI レビューでは拾えない自社ならではの事情を当てて、方針からの逸脱の見落としを防ぐ。ここも合否は決めず差し戻しもせず、評価結果を変更提案の本文に書き添えるだけで、判断は人間に残す。
実装:
drp/src/nodes/policy_alignment.tsプロンプト: KVpolicy-alignment経由 (loadPrompt、未設定時はノード内FALLBACK_PROMPT定数 / ADR-0085・PR #1090) 会社固有方針: ノード内BIZLP_POLICY定数 / 多テナント時はenv.COMPANY_POLICYで上書き テスト: なし
1. 役割と位置づけ
プラットフォーム層 (Scoring / Parallel Review) が「良い ADR か」を汎用基準で評価するのに対し、本ノード (policy alignment〔policy alignment=自社の意思決定方針との適合評価〕) は「この会社にとって良い決定か」を 会社固有の意思決定方針 に照らして評価する。
- 解決する課題: 同じ ADR でも「bizlp の判断軸 (ADR-010 整合性最重要 / 監査要件最重要 / 1 人法人運用コスト / Jr 受け入れ容易性 / Reversibility)」では評価が変わる。汎用 LLM レビューでは拾えない「自社固有の文脈」を機械的に当てる。
- 設計思想: 情報提供型 (差戻しなし)。
policyAlignmentDetailを生成して webhook で PR 本文に追記。レビュアーが「自社方針逸脱の見落とし」を防ぐ補助情報。 - 多テナント展開時:
env.COMPANY_POLICYを設定すれば BIZLP_POLICY を上書きできる構造 (会社別のポリシー文書を Workers Secrets 等で注入)。
2. フロー図
flowchart LR
PR[parallel_review] --> PA[policy_alignment]
PA --> SL[slug]
3. トリガー条件
| 条件 | 挙動 |
|---|---|
parallel_review から無条件 | 必ず実行 |
差戻しなしのため consistency 同等の前段ゲートを通った全 ADR で実行される。
4. 入力 (State)
| State フィールド | 用途 |
|---|---|
adrBody | 評価対象 ADR 本文 |
外部入力:
env.COMPANY_POLICYがあればそれを使用、なければBIZLP_POLICY(ノード内ハードコード)
5. 処理ロジック
1. policy = env.COMPANY_POLICY ?? BIZLP_POLICY
systemPrompt = loadPrompt(env, 'policy-alignment', FALLBACK_PROMPT) // KV 経由・未設定時 FALLBACK_PROMPT
2. loadLlmParams(env, 'gate2-consistency', { temperature: 0.4, seed: 42 }) → createLlm(env, MODELS.reviewClaude='claude-opus', params.temperature) // KV キーは gate2-consistency を流用・実効値は KV 優先
3. user msg: "【会社固有方針】\n{policy}\n\n【ADR ドラフト】\n{adrBody}"
4. invoke → JSON 抽出 → PolicyAlignmentResult
5. policyAlignmentDetail に summary_md のみ格納 (priority_alignment / unaccepted_risks 等の詳細は破棄)
評価 4 項目:
| キー | 内容 |
|---|---|
priority_alignment | 判断優先順位 1〜6 それぞれの aligned (boolean) + comment |
accepted_risks | ADR が受容しているリスクで「受容するリスク」と合致するもの |
unaccepted_risks | ADR が受容しているリスクで「受容しないリスク」に抵触するもの |
tech_constraint_violations | 技術制約への抵触 |
summary_md | PR 本文転記用 Markdown サマリー |
BIZLP_POLICY の判断優先順位 (重み順):
- ADR-010 整合性 (最重要): 数値プレフィックス命名規約・既存 580+ PR への破壊的変更不可
- 監査要件適合度 (最重要): hash chain 等で改ざん検知・追跡可能性を技術的担保
- 1 人法人の運用コスト (高): 管理オーバーヘッドが実装時間を上回らないこと
- 既存メモリ整合性 (中): ADR-018 (Markdown 維持・GitHub Issues 移行保留) との連続性
- Jr 受け入れ容易性 (中): 2026-10 入社予定 Jr 1 名が引き継げる設計か
- Reversibility (中): 段階的移行・ロールバック手順が定義されているか
受容するリスク: 自分の裁量で技術的に回収できる / 影響が自分だけに留まる / CI や四半期レビューで検知できる 受容しないリスク: 外部ツールロックイン / 監査トレーサビリティ欠如 / ADR-010・ADR-018 核心非互換 / 複数評価者前提 / 「全体設計が正しい」前提への依存
6. LLM 設定
| 項目 | 値 | 根拠 |
|---|---|---|
| モデル | claude-opus (MODELS.reviewClaude) | 方針文書 + ADR 本文の文脈理解・矛盾検出 |
| temperature | KV gate2-consistency params (fallback 0.4) | 判定の揺らぎ抑制。KV キーは consistency を流用・実効値は KV 優先 |
| コスト目安 | 0.10〜0.30 USD / 起案 | |
| レイテンシ | 10〜30 秒 |
7. 副作用
なし。LLM 呼出のみ。
8. 出力 (State)
{ policyAlignmentDetail: string } // summary_md (PR 本文転記用 Markdown)
webhook ノードが PR 本文に ## Policy Alignment(自社方針適合評価) セクションとして転記する (webhook.ts 内 policyAlignmentSection)。
priority_alignment / accepted_risks / unaccepted_risks / tech_constraint_violations の詳細は state に保存せず破棄 (summary_md に集約済の前提)。
9. 分岐 (次ノード)
.addEdge('policy_alignment', 'slug')
無条件で slug へ。
10. エラー時の挙動
- JSON parse 失敗:
safeParseLlmJson<PolicyAlignmentResult>()が空summary_mdフォールバックを返し通過する (例外を投げない / ADR-0081・PR #1087)。LLM 呼出自体の失敗は例外スロー。 - 空 summary_md: そのまま state に格納 → PR 本文の Policy Alignment セクションが空欄になるが PR 自体は作成される
env.COMPANY_POLICYの型不整合:(env as unknown as Record<string, string>)でキャストしているため型エラーは出ないが、object など想定外型なら??でフォールバック → BIZLP_POLICY 使用
11. 既知の弱点・運用注意
- README 未記載: 本ノードは README.md / phase3 設計メモで言及されていない (実装が後追いで追加)。仕様書 (本ファイル) が初の公式ドキュメント。
- プロンプト lifecycle: system prompt は KV
policy-alignmentで管理 (loadPrompt、未設定時FALLBACK_PROMPT/ ADR-0085・PR #1090)。一方BIZLP_POLICY会社方針定数は依然ハードコードで KV 管理外 → 多テナント化時に整理が必要。 - judgement の浅さリスク: 6 項目の優先順位を機械的に当てるだけで、ADR の文脈深さによっては「形式的には適合だが実質逸脱」を見逃す可能性。Parallel Review (Gate 3) と相補的に機能する前提。
- 方針更新時のメンテ: BIZLP_POLICY を変更するには
policy_alignment.tsを編集 + デプロイが必要。会社方針の rev 管理 (ADR ベース) と乖離するリスク → 将来は KV / Worker Secrets 化が望ましい。 - コスト累積: parallel_review 直後に claude-opus を追加実行。Pipeline 全体コストの 10〜15% を占める。
- multi-tenant の現実: 現状 bizlp 専用。
env.COMPANY_POLICY経由の上書き機構は将来拡張のプレースホルダ。
12. テストケース
なし。情報提供型のため pass/fail なし。
将来の検証案: 既存 ADR (例: ADR-018 = GitHub Issues 移行保留) を Pipeline に通し、policy_alignment が ADR-018 との整合性を正しく判定できるかの retroactive validation。
13. 過去の設計判断ログ
| 日時 | 変更 | 経緯 |
|---|---|---|
| (実装日不明) | 初期実装 | parallel_review (汎用) と分離して「自社方針整合」を独立評価する設計 |
| (設計時) | 多テナント対応の env.COMPANY_POLICY 機構 | bizlp 以外への展開を見据えた抽象化 |
| (設計時) | reviewClaude モデルキー流用 | 専用キーを増やさず Parallel Review と同モデルプール |
14. 関連リンク
- 前ノード: 07_parallel_review.md
- 次ノード: 09_slug.md
- 関連 ADR:
実装更新 (2026-05-28)
- JSON parse 堅牢化 (ADR-0081 / PR #1087):
policy_alignment.tsのJSON.parseをsafeParseLlmJson<PolicyAlignmentResult>()に置換 SYSTEM_PROMPTをFALLBACK_PROMPTにリネーム +loadPrompt(env, 'policy-alignment', FALLBACK_PROMPT)に切替 (PR #1090)ChatOpenAIインスタンスにmaxRetries=3(exponential backoff) を付与