with one click
plan-review
workspace/plan.md の完成後、実装着手前に使用。計画の影響範囲・不変条件・スコープの漏れを検証する。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
workspace/plan.md の完成後、実装着手前に使用。計画の影響範囲・不変条件・スコープの漏れを検証する。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
GitHub issue から作業を開始するときに使用。実装の前段階(ブランチ作成・調査・計画・計画レビュー)までを行う。
コード変更を伴うタスク(機能追加・バグ修正・リファクタリング)の実装時に使用。実装からコミット作成まで自律的に行う(計画が要る変更は /start-issue へ)。
大きなサイクル完了後や定期メンテナンス時に使用。governance:check(決定的検査)を実行し、機械化できない意味的整合(コマンド直書き grep・npm ラッパー等価・メモリ整合)を検証して報告する(修正はしない)。
開発サイクル完了時(実装・レビュー・追加修正まで済んだ後)に使用。教訓の抽出・残タスクの振り分け・RETROSPECTIVE.md 更新を行う。
UI モード・状態遷移・ガード条件の追加・変更時、または計画レビュー時に使用。既存モードとの直交性・リセット経路・入力分岐・SPEC §8.6 整合を検証する。
worker スレッド・channel・フレーム drain・Tauri listener・スレッド/窓をまたぐ共有状態・フレーム内 live-read を追加/変更したとき、または async 関数を追加/変更したとき、あるいは計画レビュー時に使用。送信から適用までの窓での状態競合リスクを検証する。
| name | plan-review |
| description | workspace/plan.md の完成後、実装着手前に使用。計画の影響範囲・不変条件・スコープの漏れを検証する。 |
| allowed-tools | ["Read","Glob","Agent","Bash(gh issue view *)","Bash(rm -rf workspace/plan-review)","Bash(mkdir -p workspace)","Bash(mkdir workspace/plan-review)"] |
workspace/plan.md を読み、内容に基づいてサブエージェントを並列起動して検証する。
workspace/plan.md を読み、以下を把握する:
変更対象のレイヤー(Rust crate・設定ファイル・ガバナンス文書・scripts/ など)ごとにサブエージェントを分割して並列起動する。
起動前に台帳を確定する: 「レイヤー名 → 出力パス → 分割根拠(plan.md の変更ファイル)」を会話へ表として出力してから起動する。結果を見たあとにディスクから起こしたものは台帳ではない——それは写しであり、落ちたスカウトは写しにも現れない。台帳には /plan-review「Step 2b — 独立導出 + 差分(常に実施・盲点クラスの漏れ検出)」の 1 体も含める(配送経路を 1 本に束ねる)。
.claude/rules/safety-nets.md「検査の入力集合を、具体対象で検算する」)workspace/plan-review/<slug>.md。<slug> は [a-z0-9-]+ で台帳内で一意であること(衝突すると後勝ちで 1 体分が消え、N 件中 N 件実在のまま照合を通る)。スカウトへは絶対パスで渡す——委譲はコンテキストを継承せず worktree 隔離も使えるため、相対パスは別ツリーへ落ちて回収不能になるrm -rf workspace/plan-review → mkdir -p workspace → mkdir workspace/plan-review(-p を付けない)。PowerShell では rm -rf は失敗する(Remove-Item の別名で -rf を解釈できない・実測)。rm は対象が無くても exit 0 で削除できた証跡が残らず、mkdir -p は既存ディレクトリでも exit 0 なので観測点にならない(実測)——葉だけを非冪等にすることで、削除が silent fail していれば mkdir が失敗して止まる(-p 無しは既存ディレクトリに対して exit 1・実測)/start-issue の上書き列挙は「上書き」であって、書き手が落ちた回には何も起きない。単独実行かどうかを問わない)。コミット済みの前回分も消えるが git から復元できる/plan-review「Step 3 — 結果の統合と報告」)各サブエージェントへの指示に含めるもの:
担当レイヤーと対象ファイル: plan.md に記載の変更ファイルを起点にする
検証観点(担当レイヤーに関係するものを全て確認):
影響範囲
src-tauri/src/events.rs)の呼び出し元を grep し、plan.md に漏れた影響先がないかshow/hide、enter/exit、start/stop 等)が存在し、同様の変更が必要でないか不変条件
false に戻す経路のない AtomicBool、unlisten のない listen()、kill のない子プロセスが生まれないかスコープ
gh issue view <N> で読み、その本文に当該項目が実在するか確認する。 受け皿を確認せずに送った項目は誰にも受け取られずに消える。番号を挙げていない送り先(「束 C が拾う」「別サイクルで」等)は、それ自体が発見事項である——送り先が名指しされていない deferred は、deferred ではなく脱落である(#654: 計画は §20.3 の腐りを「束 C(#674/#698)へ送る」としたが、両 issue の本文はどちらも §20.3 を名指ししていなかった。#654 自身が「コードコメントだけの deferred は消えやすいため issue 化する」という理由で起票された issue であり、その失敗様態を再生産するところだった)ドキュメント・テスト同期
AGENTS.md「条件別チェック(トリガー → 参照先)」——ここに写しを置くと同じトリガーの行き先が 2 つに割れる(WebView2 e2e は #532 SU7 で撤去済み)Config::default / serde デフォルト (2) snotra-settings の UI (3) config_watcher の反映経路(SPEC §7.5) (4) 既存 config.toml への後方互換出力形式: 「問題なし」「軽微な懸念」「要対処」の3分類で列挙。各項目に根拠(file:line または grep 結果)を付けさせる。根拠のない指摘は統合時に「要確認」へ降格する。確認できなかった観点は第 4 分類「未検証(理由)」へ必ず書かせる——予算切れ・アクセス不能でも「問題なし」と書かせない(届いたが空洞なファイルは、実在確認を通り抜ける)
出力先: 台帳で割り当てた絶対パスへ書かせる(パスは呼び出し側が指定し、返り値に依存させない)。レイヤーが 1 件でも省略しない——並列度は理由の 1 つであって条件ではなく、1 体でも配送は落ちる(Step 2b の空振り 2 回がその実測である)
書いてよいのは割り当てられた 1 ファイルだけであること(下記「受容する残余」のプロンプト契約)
オーケストレーター自身は Write を持たない(allowed-tools から意図的に外してある)。持たせると、返り値で受けた内容を自分で成果物ファイルへ転記でき、実在確認も中身の検査も自作自演で通ってしまう——配送を測るという設計そのものが無効になる。
起動は general-purpose タイプ・model: sonnet(Sonnet 5)で行う。この 2 つは別々の理由で決まっている(畳んで書くと「型を変えるとモデルも落ちる」と誤読される。この誤読は実際に一度起きた):
general-purpose → Write を持つ型でなければならない(上記「出力先」のため)。Explore / Plan は Write / Edit を持たず、ToolSearch でも取得できない(両型で実測)——この手順を実行できない。Step 2b も同じ理由で同じ型を使う(型の事実はここが正本)model: sonnet を明示する → ここは偵察(証拠集め)の席——各項目に file:line または grep 結果の根拠を必ず付けさせ、統合・判断はオーケストレーター(Opus)が担う(scout は安く、judge は強く)。層ごとに複数体を並列起動するため単価差がそのまま効き、根拠付きの出力を Opus が再照合するので品質は落ちない。無指定ではどの型でも親(Opus)を継承するため、明示しなければ落ちない(Plan / Explore / general-purpose の 3 型とも transcript で実測)受容する残余: general-purpose は全ツール型ゆえ、スカウトも Bash / Edit を持つ。2026-07 時点の型一覧では、読み取り専用型はいずれも Write を持たないため、スカウトの書き込み範囲は上記「書いてよいのは割り当てられた 1 ファイルだけ」のプロンプト契約でしか縛れない(構造では表現不能)。配送の確実性を優先してこれを受容する——実装の成果は git に残るが、レビュー・判定は会話にしか無く、届かなければ実施の有無すら区別できない(#725)。
Step 2 の「成果物監査」はサブエージェントに plan.md を渡して検証させるため、作者の分解(枠組み)に anchor し、作者の盲点を継承しやすい。これに加えて「独立再導出 + 差分」を行う。レビュアーの独立性は「実行の独立」より**「枠組みの独立」**が盲点に効く。
要件の蒸留: plan.md の分解(HOW)ではなく、タスクの要件(WHAT)だけを簡潔にまとめる。issue があれば gh issue view <N> を SSOT とし、plan/research を要約しない。
独立導出サブエージェント(1 体): 型は Step 2 と同じ general-purpose(理由は /plan-review「Step 2 — 並列サブエージェントで検証」が正本。型の事実を 2 か所に書かない——片方だけ更新されたときに、古い側が新しい側を「実行不能な建前」と読ませる)。残る 2 つは Step 2 と異なる理由で異なる設定になる:
model を指定しない → 親(Opus)を継承する。この 1 体だけは Step 2 の偵察のように Sonnet へ落とさない——この非対称は意図的である。retrospective の実測が「独立再導出だけが毎回漏れを拾った」と示すとおり、ここは推論品質が盲点検出の要であり、審判席に安いモデルを座らせると false-green を気づかれないまま残す。モデルを決めるのは model の無指定であって型ではない(型が同じでも設定で分かれる)name: を渡さない → 名前を渡すと teammate 化し、最終テキストが呼び出し元へ配送されない(機序と回収手順は docs/development-principles.md「デバッグ・バグ修正」)以下を渡す:
AGENTS.md / 各 CLAUDE.md)workspace/plan.md と workspace/research.md を読ませないことを明示(作者の分解に引きずられないため)workspace/plan-review/independent-derivation.md(絶対パス)へ書かせる(パスは呼び出し側が指定し、返り値に依存させない)。この Step は 2 度、報告が届かずに空振りしている——エージェントは調査を完走していたのに最終テキストが配送されず、ファイルが無いことだけが「走らなかった」と「届かなかった」を区別する接地した観測点になる(機序と回収手順は docs/development-principles.md「デバッグ・バグ修正」、規範は CLAUDE.md「サブエージェント委譲と worktree」)。この 1 行が上の型の選択を縛っている——書けない型を選ぶと手順が実行不能になる/start-issue の上書き列挙は「上書き」であって削除ではなく、書き手が落ちた回には何も起きない)。Step 6 の git add workspace/ がディレクトリ単位なのでコミットにも自動で載る(PR で差分としてレビューできる)差分(主エージェントが実施):
トリガー: 常に実施する(#495)。かつては「リネーム / config キー変更 / データ移行 / 横断スイープ / 多モジュール」を列挙し「局所的な計画では省略可」としていたが、3 サイクル連続でトリガは外れた——#474 / #475+#476 / #497+#484 はいずれも hook のファイル 1 つを触る局所変更で、文言どおりなら 3 回とも省略できた。省略せず実施した結果、独立再導出だけが毎回漏れを拾った(CLAUDE.md のフック表ドリフト、「沈黙は合格」が 4 箇所・2 クラスあること)。的中率は 0% だった。
理由は 2 つある。盲点は変更の規模に比例しない(3 PR の漏れはすべてドキュメント側=作者が「触る範囲」に数えなかった場所にあった)。そして**「局所的か」を判定するのは、盲点を持つ当人である**。列挙型のトリガは「既に踏んだ盲点」の記録であって、次の盲点クラスには当たらない。
/plan-review は /start-issue「5a. check スキルによる計画検証」で常に実行され、その時点で Step 2 が複数体を並列起動している。Step 2b はサブエージェント 1 体の追加であり、限界コストは小さい。漏れが無かった場合も 一致は「盲点が無いこと」の能動的証拠として残る(Step 3 の報告に含める)。
省略するなら理由を Step 3 の報告に明記し、workspace/plan.md への追記を提案する(追記そのものは /start-issue「5b. セルフレビュー(plan-review 固有の補完)」が行う——このスキルは Write を持たない)。省略の判断を証跡として残す。書けないなら実施する。起動したうえで不着だったものは「省略」ではない——Step 3 の配送欄へ不成立として書く(良性の「省略」へ化けさせない)。
「漏れなく全部見つける」が要件のタスクでは、単一の分解枠組みは自身の盲点を構造的に継承する(#404)。独立再導出に加えて、次の 3 つは特に取りこぼしやすい:
git pathspec の **/ は 1 段以上を要求し、git ls-files はブレース {ts,tsx} を展開しない。#471 はこれで深さ 0 の実在ファイルを列挙から落とした(当時は TypeScript の exclude の **/ が 0 段にもマッチするという差が絡んでいた。フロントは #532 SU7 で撤去済みで、残るのは意味論がツールごとに食い違うという一般則である)。追跡ファイルなら git ls-files <dir> の全件フィルタ、ガバナンス文書なら npm run governance:check の照合件数のように、当のツール自身に列挙させ、件数を証跡に残す。まず台帳と突き合わせる: Glob で workspace/plan-review/*.md を列挙し、台帳と双方向で照合する——台帳にあってディスクに無いものは不着、ディスクにあって台帳に無いものは命名逸脱で、同じく不着として扱う。照合の前に全エントリの完了通知を待つ——サブエージェントは既定でバックグラウンド実行され、走行中を不着と判定して再起動すると同じパスへ二重に書かれる。実在したらそのエントリに期待される成果(スカウトなら分類と根拠、Step 2b なら変更集合の列挙)を備えているかまで見てから読む。空・スタブ・途中終了は、実在していても不着と同じである——「ファイルがある」に「レビューが行われた」という意味を与えた以上、その意味が成り立たない経路を塞ぐ(.claude/rules/safety-nets.md「これまで無意味だった状態に意味を与える変更は、その状態に到達する全経路を列挙する」)。ただし**「未検証」は正当な報告であって不着ではない**——その観点についてのみ不成立として扱い、配送欄に併記する(正直に書いた側が罰される形にしない)。不着があれば同じ指示で必ず 1 度再起動する(2 度目は行わない)。それでも不着なら下記テンプレートの配送欄へそのエントリは独立レビュー不成立と書く。返ってきた報告だけを数えてはならない——落ちた 1 体は「指摘なし」と見分けがつかず、統合は「全レイヤー問題なし」に見える。
「要対処」に載る全項目の根拠を、自分で開く: スカウトの分類にかかわらず、最終報告の「要対処」に載る項目はオーケストレーター(Opus)が根拠まで開いて成立を確認する。スカウトが最初から「要対処」に置いた項目も含む——「昇格させたか」ではなく「報告に載るか」で決まる(誤指摘の主経路は、自信をもって「要対処」と書かれた誤りである)。根拠が grep 結果なら同じ grep を自分で実行して件数を突き合わせる。引用文を読み返すのは再照合ではない(AGENTS.md「検証の作法(全タスク共通)」——サブエージェントの実測も一次証拠にしない)。成立しなかった項目は「軽微な懸念 / 要確認」へ降格し、降格した事実も報告に残す。レイヤーをまたぐ同一指摘はここで 1 件に束ね、根拠を合算する。
そのうえで各サブエージェント(Step 2 + Step 2b)の結果を統合し、以下の形式で報告する:
## plan-review 結果
### 配送(台帳 N 件中 M 件が実在)
- <レイヤー名> → <パス>: 実在(項目 n 件・未検証の観点があれば併記)/ 不着(未生成・空・スタブ・命名逸脱のいずれか → 再起動 1 回の結果)
- **台帳の全エントリを 1 行ずつ書く**(Step 2b の 1 体も台帳エントリである)。不着のエントリは **独立レビュー不成立**(=検証されていない。問題が無かったのではない)
### 問題なし
- ...
### 軽微な懸念 / 要確認(実装時の注意点・根拠不十分・再照合で不成立だったもの)
- ...
### 要対処(実装前に plan.md の修正が必要・スカウトの要対処 J 件を再照合し L 件を降格)
- ...(各項目に「再照合済み: <file:line>」を付す)
### 独立導出との差分(Step 2b・省略した場合はその理由。**起動して不着だった場合は「省略」ではなく配送欄へ**)
- 漏れ(導出 ∖ plan): ...
- スコープ過剰(plan ∖ 導出): ...
- 一致(完全性の証拠): 主要判断は独立に再一致 / 等
### 総評
計画の completeness: [高 / 中 / 低]
実装着手可否: [可 / 要修正後に着手]
不成立の台帳エントリが 1 つでもあるなら completeness は「高」にできない——そのエントリは検証されていないのであって、問題が無かったのではない。不成立を残したまま着手可否を「可」と書くときは、そのエントリを検証せずに着手する判断であることを明記する。
「要対処」事項がある場合、具体的な修正案を提示し workspace/plan.md の更新を提案する。