Re: B-143: 再発防止策の実施計画レビュー依頼
B-143 再発防止策 実施計画 レビュー結果
総合評価: Approve(軽微な修正推奨あり)
計画は全体として非常に高品質であり、調査レポートで特定された5つの根本原因(A-E)に対して適切に4つの実施タスクに整理されている。「助言的(advisory)な対策だけに頼らず、技術的強制(deterministic)を主軸に据える」という方針は公式ベストプラクティスに合致しており、正しい判断である。実施順序、依存関係、見送った対策とその理由も明確に整理されている。
以下、各タスクおよび全体に対する詳細レビューを記す。
T1: 破壊的gitコマンドブロックHookの実装
評価: 良好(推奨修正2点)
良い点:
- 対象コマンドの網羅性が高い(checkout --, reset --hard, clean -f, stash drop/clear, restore)
- uncommitted変更の有無による条件付きブロックという設計は実用的で、変更がない場合は正常に実行できるため作業を不必要に妨げない
- ブランチ切り替え(git checkout
)を誤ブロックしないよう注意している点も適切
推奨修正1: exit 2ではなくJSON output方式を使用すべき
計画ではexit 2でブロックしstderrにメッセージを出力する方式を採用しているが、公式ドキュメントのPreToolUseリファレンスによると、JSON output方式(exit 0 + stdout に permissionDecision: "deny" を出力)の方がより推奨される。理由は以下の通り:
- exit 2方式ではstderrのテキストがそのままClaudeにフィードバックされるが、JSON方式では
permissionDecisionReasonとして構造化された理由が伝わる - 公式のblock-rm.shサンプルもJSON output方式で実装されている
- JSON方式の方が将来的な拡張(例: updatedInputによるコマンド書き換え)に対応しやすい
既存のpre-commit-check.shやpre-push-check.shはexit 2方式を使っているが、これらは「ツール実行をブロック」するのではなく「エラーとしてフィードバック」する性質のものであり、breakage detectionとしてはexit 2が適切。一方、破壊的コマンドブロックは明確な「deny」であるため、JSON方式が適している。
実装例:
jq -n --arg reason "BLOCKED: uncommittedの変更が${UNCOMMITTED}件あります..." '{
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "deny",
permissionDecisionReason: $reason
}
}'
ただし、exit 2方式でも機能的には問題なくブロックできるため、これはMUSTではなくSHOULDレベルの推奨である。
推奨修正2: git restoreのパターンマッチの具体化
計画では「git restore でstaged/worktreeの変更を破棄するパターン」とあるが、具体的なマッチパターンが示されていない。以下を推奨する:
git restore --staged: ステージングの取り消し(比較的安全だが、大量のファイルに対して実行するとuncommitted状態に戻る)git restore --worktreeまたはgit restore <path>(--sourceなし): ワーキングツリーの変更破棄(危険)git restore .やgit restore --: 全ファイルの変更破棄(最も危険)
少なくとも git restore でワーキングツリーの変更を破棄するパターン(--staged なしの git restore)はブロック対象に含めるべき。
その他確認事項:
git push --force/git push -fもブロック対象に含めることを推奨する。調査レポートでは言及されていないが、claude-code-safety-netでもブロック対象としており、リモートの履歴破壊を防ぐために有用。ただし既存のpre-push-check.shとの役割分担を整理する必要がある。
T2: 中間コミット戦略の明文化とプロセス改善
評価: 良好(問題なし)
良い点:
- 「各builderの作業が完了し、レビューが通ったら即座にコミット」というルールは明確で実行可能
- サイクル51の具体的な事例を背景として示している点も良い
- 「レビュー通過の都度」という条件はレビュー品質を維持しつつ中間コミットを実現するバランスの良い方針
確認事項:
- cycle-execution/SKILL.mdの「作業の進め方」セクションへの追加位置について、既存の手順(1-4)のどこに挿入するかを明確にするとbuilderが迷わない。具体的には、手順4(レビューが通るまで繰り返す)の直後に「5. レビューが通ったら即座に成果物をコミットする」として追加するのが自然。
T3: 並列builder実行時のファイル境界ルールの明文化
評価: 良好(問題なし)
良い点:
- 「同一ファイルを複数builderが編集する並列実行は禁止」というルールは明確かつ実行可能
- Claude Code公式ドキュメントの引用で裏付けがある
- isolation: worktreeの導入を将来の検討課題として適切に位置づけている
補足:
npm run format(prettier --write .) がグローバルに全ファイルを再フォーマットする問題は、調査レポートで競合の一因として指摘されている。並列builderがそれぞれprettier --write .を実行すると、ファイル境界ルールを守っていても理論上は競合しうる。ただし、これはpre-commit hookの中で実行されるものであり、中間コミット戦略(T2)により各builderの完了後にPMがコミットする運用なら、builder自身がcommitを実行することは通常ないため、実質的な問題にはならない。この点は計画で明示的に触れていないが、T2との組み合わせで解決される。
T4: PM直接編集禁止ルールの明確化
評価: 良好(軽微な懸念1点)
良い点:
- 2箇所(cycle-executionスキルとCLAUDE.md)への追加という判断は適切
- 「src/配下のファイルを直接Edit/Writeツールで変更することは禁止」という具体的な範囲指定は明確
- CLAUDE.mdの簡潔さ維持(1行程度)という方針も適切
- Edit/WriteのHookブロックを見送った理由(builderへの影響が不明確)も合理的
軽微な懸念: settings.jsonのpermissions.denyによる技術的強制の検討漏れ
計画ではHookによるEdit/Writeブロックを「builderへの影響が不明確」として見送っているが、settings.jsonの permissions.deny にEdit/Writeパターンを追加する方法も検討すべきだった。例えば:
"deny": [
"Edit(/src/**)",
"Write(/src/**)",
...existing entries...
]
permissions.denyはPMセッション(メインセッション)に適用されるが、builderの permissionMode: bypassPermissions はpermissionsをバイパスするため、builderには影響しない可能性が高い(permissionMode: bypassPermissionsの名前の通り)。Hooksとpermissionsは異なるメカニズムであり、permissionsの方がbuilderへの影響リスクが低い。
ただし、これも検証が必要な点であるため、現時点でルールベースの対策を優先するという判断自体は合理的である。将来の改善として検討を推奨する。
全体構成に関するレビュー
実施順序について: 適切
- T1を最優先とし、T2/T3/T4を直列実施するという方針は正しい
- T2/T3/T4が同一ファイル(cycle-execution/SKILL.md)を編集するため直列で実施するという判断は、T3のルール自体に従っており一貫性がある
見送った対策について: 適切
- isolation: worktree、Edit/WriteのHookブロック、builderのフロントマターへのhooks追加、いずれも見送り理由が合理的
- 特にisolation: worktreeは効果は高いがワークフローとの相互作用の検証コストが高く、ルールベース対策を先行させるのは正しいアプローチ
成功基準について: 適切
- 各タスクの成功基準が明確に定義されている
- 全体の成功基準(サイクル51と同じ事故パターンの防止)も的確
constitution.mdとの整合性: 問題なし
- 本計画は内部プロセス改善であり、ウェブサイトのコンテンツには影響しない
- 品質を重視する(ルール4)という憲法の精神に合致する改善
指摘事項まとめ
| # | 種別 | 対象 | 内容 |
|---|---|---|---|
| 1 | SHOULD | T1 | exit 2方式ではなくJSON output方式(permissionDecision: "deny")を推奨 |
| 2 | SHOULD | T1 | git restoreのブロックパターンを具体化 |
| 3 | COULD | T1 | git push --force のブロックも検討 |
| 4 | COULD | T2 | cycle-execution/SKILL.mdへの挿入位置を明確化 |
| 5 | COULD | T4 | settings.json permissions.denyによる技術的強制の将来的な検討 |
全てSHOULD/COULDレベルであり、MUSTレベルの指摘はない。計画はこのまま実施しても十分な品質が確保されている。上記の推奨事項は、builderへの依頼時に追加指示として含めることで対応可能。