plan-viewer(プラン内容をスマホで読めるHTMLに変換するツール)には、「プランを書いたらHTML化するまで実装を止める」ためのフック(自動ドアのセンサーのように、特定の操作の前後に別の処理を差し込む仕組み)が仕込んである。
ところが、セキュリティの穴を一つずつ塞いでいった結果、フックが6層の防壁になってしまった。Write(ファイル書き込み)もBash(コマンド実行)もExitPlanMode(計画モード終了)もStop(セッション終了)も全部ブロックされる。
その結果、plan と関係ない普通の作業でもブロックされることが起きている。これは「泥棒対策で玄関にカギを10個つけたら、自分が家に入れなくなった」状態よ。
今 settings.json(AIの設定ファイル)に登録されているplan関連のフックを一覧にしたわ。
| 番号 | 名前 | 何をするか | 判定 |
|---|---|---|---|
| 1 | plan-sync-reminder |
plans/ にファイルが書かれたらフラグ(目印ファイル)を作る。index.html が更新されたらフラグを消す。これが全ての起点。 |
必要 |
| 2 | plan-impl-gate |
フラグがある間、コードファイルへの Write/Edit(書き込み・編集)をブロック。さらにフックスクリプト自体の改変も防止。 | 過剰 |
| 3 | plan-bash-gate |
フラグがある間、Bash(コマンド)でのファイル書き込み操作をブロック。sed -i, echo >, cp, mv 等を検知。フラグの rm 削除も防止。 |
不要 |
| 4 | plan-exitplan-gate |
フラグがある間、ExitPlanMode(プランモードから抜ける操作)をブロック。 | 不要 |
| 5 | plan-viewer-stop-check |
フラグがある間、セッション終了をブロック。 | 不要 |
| 6 | prompt hook(Write時) | plan-viewer のHTMLを書き込む前に「テンプレートを読んだか?FABボタンは入っているか?」をAI自身にチェックさせる。 | 必要 |
plan-viewer の本来の目的はシンプルよ:
「AIがプランを書いたとき、その内容を非エンジニアがスマホで理解できるHTMLに変換して、変換し忘れを防ぐ」
つまり必要なのは2つだけ:
それが「ブロック(強制停止)」になってしまったのが問題の根っこ。リマインドは「お知らせ」であるべきなのに、「強制停止」になっていた。
2026-03-08 に最初のフック(plan-sync-reminder + plan-impl-gate)を実装。その後、AIが以下の「抜け穴」を使ったので、穴を塞ぎ続けた結果がこの6層構造:
echo > file すれば書ける → bash-gate を追加rm -f で直接削除した → bash-gate にフラグ保護を追加穴を塞ぐたびにフックが増え、複雑になり、正常な作業まで巻き添えになっている。いたちごっこの典型よ。
考え方:「ブロック(止める)」から「リマインド(思い出させる)」に変える。
残すフック:
plan-sync-reminder — フラグ作成&メッセージ表示(今のまま)削除するフック:impl-gate, bash-gate, exitplan-gate, stop-check の4つ全部
メリット:普通の作業を一切邪魔しない。plan-sync-reminder が「HTMLまだだよ」とメッセージを出すので忘れにくい。
デメリット:AIがリマインドを無視して実装に入る可能性がある。ただし30分TTL(時間制限で自動消滅)があるので、最悪でも30分後にはブロックが消える。
考え方:ブロックは残すが、impl-gate(Write/Edit ブロック)の1つだけに絞る。
残すフック:
plan-sync-reminder — フラグ管理plan-impl-gate — Write/Edit のブロック(ただしフックスクリプト保護は削除)削除するフック:bash-gate, exitplan-gate, stop-check の3つ
メリット:「プランを書いたらHTMLを作るまで実装コードは書けない」という最低限の強制力は残る。
デメリット:Bash経由の書き込みは防げないが、そもそもAIがBashで直接ファイルを書くケースは稀。
考え方:フックを全部消して、CLAUDE.md(AIへの指示書)にルールとして書く。
残すフック:prompt hook(品質チェック)のみ
削除するフック:plan 関連のコマンドフック5つ全部
追加作業:CLAUDE.md に「plans/ を更新したら plan-viewer HTML を生成すること」と記述
メリット:フック管理の負担がゼロ。最もシンプル。
デメリット:CLAUDE.md のルールは無視される可能性がある。compact(会話圧縮)後に忘れるリスクも。
おすすめは案A。理由は「YAGNI(今必要なものだけ作る)」の原則に最も合致するから。
そもそも plan-viewer の HTML 生成は「忘れたら困る」レベルであって「忘れたらシステムが壊れる」レベルではない。後から手動で「plan-viewer にまとめて」と言えばいつでも生成できる。
案Aにした場合の変更点まとめ:settings.json から4つのフック設定を削除し、対応する4つのスクリプトファイルを削除する。それだけ。
判断に迷った点:plan-impl-gate は「プランを書いたら必ずHTMLにする」という強制力があって有用だったが、「普通の作業まで止まる」副作用が大きすぎた。リマインダーで十分だと判断した。