goal
ユーザーが与えた目標を、複数サイクル回して達成する。
disable-model-invocation: true を付けている。このスキルは commit まで自律的に行うので、ユーザーが /goal と打ったときだけ動かす。Codex 向けには agents/openai.yaml の allow_implicit_invocation: false が同じ役割をする。
原則
完了の単位はユーザーの目標。コミットは通過点。
1 ステップ終わった、1 コミットできた、テストが通った — どれも止まる理由にならない。各通過点で「目標に対してまだ足りないものは何か」を問い直し、次の小さな目標を選ぶ。止まるのは目標を達成して検証したときか、ユーザー入力なしに解けないブロッカーに当たったときだけ。
引数
<goal>: 達成したい目標。曖昧なら最も妥当な解釈を採り、解釈を作業ノートに書いて進める。解釈次第で有害・不可逆な作業になるときだけ聞く
作業ノート
解釈・完了条件・次の数手・試した実験を書き留める場所。応答の中に短く書くのが既定。セッションをまたぐ見込みのある長い目標では、リポジトリ管理外のファイル(${TMPDIR} など)に置き、最終報告にパスを書く。リポジトリ内には作らない — 差分に混ざり、commit されうる。
Step 0: 現状を把握する
編集する前に、目標の達成に要る範囲で把握する:
- プロジェクトの目的と構成、既存の規約(AGENTS.md / CLAUDE.md / rules)
- テスト・lint・ビルド・実行コマンド(ドキュメントと設定ファイルから拾い、実行して確かめる)
- 直近のコミットメッセージの流儀(
git log --oneline -20) - 作業ツリーの状態(
git status --short)。既に差分があるなら、目標と無関係なものは触らない
Step 1: 目標を完了条件に翻訳する
目標を、観測できる完了条件に言い換えて作業ノートに書く:
- 望む結果(何ができるようになるか)
- 完了の証拠(テストが通る / 挙動を実演できる / 再現したバグが直る / 結果が記録される / 無関係な差分が残っていない)
- 検証に使うコマンド
- 既知のリスク・不明点
計画は次の数手だけ。先まで書いた計画は最初の検証で古くなる。
Step 2: ループを回す
目標を達成するまで繰り返す。
2-1. 次の小目標を選ぶ
目標に直結し、1 つの論理的なコミットに収まる大きさのものを 1 つ選ぶ。無関係な変更を同時に始めない。
2-2. 変更する
既存の設計・命名・構成に合わせる。最小で一貫した変更を、広い書き換えより優先する。
2-3. 検証する
もっとも関係の深い検査を先に走らせる(対象のテスト、型検査、lint、再現コマンド)。広い検査(全テスト、ビルド)は節目で。失敗は情報として扱う — 原因を診断し、直し、再度検証する。失敗を隠さない。
根拠にするのは最後の変更より後に走らせた結果だけ。直前の編集のあとに走らせていない検査は、通ったことにせず走らせ直す。
2-4. 差分を見直す
commit の前に差分そのものを読む:
- 小目標の範囲に収まっているか。無関係な編集は戻すか分ける
- 一時ファイル・デバッグ出力・secrets が混ざっていないか
- 挙動が小目標どおりか
2-5. commit する
差分が意味のある 1 単位になっていれば commit する。目標全体の完了を待たない。壊れた状態を commit しない(チェックポイントとして明示的に有用な場合を除き、その場合はメッセージにそう書く)。
コミットメッセージ:
- 日本語で、端的に。prefix は
git logの慣習に合わせる(Conventional Commits を使っていなければ付けない) - AI ツールの署名を入れない(
Co-Authored-By:trailer、🤖 Generated with ...、noreply@anthropic.com) commitスキルが入っていればその規約に従う
2-6. 再計画して続ける
目標に照らして残りを見直し、2-1 に戻る。計画の項目が尽きたが目標が未達なら、新しい短い計画を立てて続ける。
止まらない理由・止まる条件
次の理由だけでは止まらない:
- 1 ステップが終わった / 1 コミットを作った / 一部のテストが通った
- 中間の節目に達した / 計画の項目が尽きた
- 残りが整理・検証・ドキュメント・計画だけになった
止まるのは次のどれか:
- 目標を達成し、完了条件を検証した
- ユーザー入力なしに解けないブロッカーがある
- 認証情報・課金・破壊的操作・外部への送信・権限が要る
- リポジトリが安全に進められない状態にある
- ユーザーが作業量の上限を指示していた
止まるときの片付け
ブロッカーで止まるときも、達成して止まるときも、作業ツリーを再開しやすい状態にしてから止まる:
- 塊になっている変更は commit する。途中の変更は「チェックポイント」とメッセージに明記して commit する
- stash は使わない(ユーザーの無関係な変更まで巻き込む)
- 実験の残骸は消す。元からあった無関係な差分には触らない
- 自分が作った未コミットの変更を残したまま最終回答しない(Stop hook が 1 回だけ差し戻す)
実験するとき
- 実験的な変更は分離する。試したことをノートに残す
- 有用な結果だけを残し、死んだ実験は commit 前に消す(意図的に記録する場合を除く)
- 実験の基盤と本番の挙動変更は、可能なら別コミットにする
最終回答の前に
- 目標は本当に達成されたか。完了条件を 1 つずつ確認したか
- 既知の検証をすべて走らせたか。飛ばしたなら理由があるか
- 残っている明らかな実装・検証・整理・ドキュメントの作業は無いか
- ユーザー入力なしに進められる次の行動がまだあるか — あるなら最終回答せず、ループに戻る
強制されること(hook)
指示だけでは守られない 3 つを hook にしてある。いずれも Claude Code でのみ効く。Codex では上の規約を指示として守る。
| hook | イベント | 何をするか |
|---|---|---|
hooks/no-ai-attribution.sh |
PreToolUse(git commit) |
AI ツールの署名が含まれる commit を exit 2 でブロックする。署名の形だけを見るので、AI ツールに言及したメッセージ自体は通る |
hooks/no-destructive-git.sh |
PreToolUse(Bash) | git reset --hard / git clean -f / 作業ツリー全体の checkout・restore / force push / stash drop・clear / branch -D をブロックする。パスを指定した restore と restore --staged . は通る。コマンド文字列を見るので、&& や ; でつないだ後続も対象 |
hooks/record-baseline.sh + hooks/stop-dirty-tree.sh |
PreToolUse(初回のみ) + Stop | 起動時点の git status を控え、最終回答の前にこのセッションで作った未コミットの変更が残っていれば 1 回だけ差し戻す。元からあった差分は数えない。差し戻しはセッションに 1 回まで(無限ループにしない) |
完了時に返すもの
- 目標を達成したか(達成 / ブロッカーで停止)。解釈を置いた場合はその内容
- 作成したコミットの一覧(
git log --onelineの該当分) - 実行した検証コマンドと結果。飛ばしたものとその理由
- 残っているブロッカー・後続作業