PlanGate

Hook Enforcement — runtime で強制すべき不変条件

Status: v5(Implementation: 10/10 hooks Done — #169 完走 — #157 で 3 hook、#169 セッション A で 2 / B で 3 / C で 2 = 計 10 hook、3 mode 設計) 関連: responsibility-boundary.md / tool-policy.md / model-profiles.md 実装: scripts/hooks/check-plan-exists.sh / check-c3-approval.sh / check-plan-hash.sh / check-test-cases.sh / check-verification-evidence.sh / check-forbidden-files.sh / check-merge-approvals.sh / check-v3-review.sh / check-handoff-elements.sh / check-fix-loop.sh 設定例: .claude/settings.example.json / 単体テスト: tests/hooks/run-tests.sh

1. 目的

PlanGate の Iron Law 7 項目相当の不変条件 を、プロンプトに頼らず runtime で決定論的にブロック する。プロンプト薄型化(PBI-116-01 で達成)と両立して、強制力を維持する。

2. 強制すべき不変条件(一覧)

responsibility-boundary.md § 5 と整合。最低 6 件:

EH-1: plan.md なし production code 編集ブロック

EH-2: C-3 承認なし exec ブロック

EH-3: plan_hash 改竄検知

EH-4: test-cases.md なし V-1 ブロック

EH-5: 検証ログなし PR 作成ブロック

EH-6: scope 外ファイル編集検知

EH-7: 2 段階レビューなしマージブロック(推奨)

3. validation_bias: strict 時の追加条件

Model Profile の validation_bias: strict プロファイル(gpt-5_5_pro)では、上記 EH-1〜EH-7 に加えて以下 3 件以上を追加で強制:

EHS-1: V-3 外部レビュー必須化

EHS-2: handoff.md 必須 6 要素チェック

EHS-3: V-1 fix loop 上限超過 escalation

4. 実装(#157 で 3 hook + #169 で 7 hook = 計 10 hook、すべて完了)

Hook 種別 実装 由来
EH-1(plan.md なし production code 編集 block) PreToolUse hook scripts/hooks/check-plan-exists.sh #169 セッション A / TASK-0056
EH-2(C-3 未承認 exec block) PreToolUse hook scripts/hooks/check-c3-approval.sh #157 / TASK-0048
EH-3(plan_hash 改竄検知) PreToolUse hook + CLI scripts/hooks/check-plan-hash.sh #169 セッション A / TASK-0056
EH-4(test-cases.md なし V-1 block) CLI(V-1 前で呼び出し) scripts/hooks/check-test-cases.sh #169 セッション B / TASK-0057
EH-5(検証ログなし PR 作成 block) CLI(PR 作成前で呼び出し) scripts/hooks/check-verification-evidence.sh #169 セッション B / TASK-0057
EH-6(scope 外ファイル編集検知) PreToolUse hook + CLI scripts/hooks/check-forbidden-files.sh #169 セッション B / TASK-0057
EH-7(2 段階レビューなしマージ block) CLI(マージ前で呼び出し) scripts/hooks/check-merge-approvals.sh #169 セッション C / TASK-0058
EHS-1(V-3 外部レビュー必須化) CLI(mode 連携) scripts/hooks/check-v3-review.sh #169 セッション C / TASK-0058
EHS-2(handoff 必須 6 要素) CLI(手動 / WF-05 で呼び出し) scripts/hooks/check-handoff-elements.sh #157 / TASK-0048
EHS-3(fix loop 上限超過) CLI(V-1 fix loop 内で increment / check) scripts/hooks/check-fix-loop.sh #157 / TASK-0048

残未実装: なし(10/10 完了)。EH-7 の GitHub branch protection 自動連携は別 PBI 候補。

4.1 3 モード設計

モード 環境変数 挙動
default(推奨初期値) なし 違反検出時は warning のみ、continue:true(block しない)。誤検出時の作業妨害を最小化
strict PLANGATE_HOOK_STRICT=1 違反検出時に block / exit 1。本番運用 / CI 等で有効化
bypass PLANGATE_BYPASS_HOOK=1 常時 pass。緊急対応 / 既知の例外時のみ使用、監査 log に必ず記録

4.2 監査ログ

すべての判定は docs/working/_audit/hook-events.log に append-only で記録される(タブ区切り):

<ISO8601 UTC>\t<level>\t<hook-name>\t<task-id>\t<message>

level: PASS / VIOLATION / BYPASS / SKIP / INCREMENT

4.3 設定方法(opt-in)

.claude/settings.example.json.claude/settings.json にコピーすると PreToolUse hook(EH-1 + EH-2 + EH-3 + EH-6)+ SessionStart(gh-pin-account)が有効化される。EH-4 / EH-5 / EH-7 / EHS-1 / EHS-2 / EHS-3 は CLI ツールとして workflow 内で呼び出す。

4.4 テスト

4.5 全 10 hook 完了(#169 完走)

Issue #169 完了。10/10 hooks 実装済(CLI / PreToolUse 構成)。残課題は GitHub branch protection 自動連携(EH-7 の上位拡張、外部 GitHub API 操作を伴うため別 PBI)。

5. 既存 .claude/settings.json hooks との関係

本ファイルが定義する不変条件は、既存 hooks(もしあれば)と:

6. 「block 通知」の文言ガイド

Hook が block する際の通知文言:

[Hook EH-1] plan.md がないため production code を編集できません。
docs/working/TASK-XXXX/plan.md を作成してください。

形式:

関連