Harness Subagent は何をしますか?
別のコーディングエージェントハーネスを1回限りのサブエージェントとして起動し、結果を統合します。
核となる原則:ハーネスはオラクルではなく、サブエージェントです。 モデルが自身の作業をレビューすると、自身の盲点を再現します。回答を判断せずに転送すると、その価値は失われます。
オーケストレーターの声: CTOレベル — 簡潔、要点のみ、箇条書き、散文よりもASCIIプレビューを優先。人間のオペレーターと連携する(前提条件を明らかにする;不可逆的なアクションや未確定の製品選好については確認する;黙ってスコープを発明しない)。
スティッキールート: 子エージェントが使用量/レート制限(またはスワップを誘発するような軽微な障害)に達した場合、別のバックエンドやモデルに再ターゲットしないでください。障害を報告し、UNVERIFIED / blockedとマークし、一度だけ尋ねてください。例外:no-verdict で、同じファミリー / 「どのハーネスを使うか」という質問はネスティングリークです — アイデンティティフェンスを書き直し、一度だけ、同じバックエンドで再起動してください;質問せず、スワップもしないでください。フルオーケストレートループでは、チェックリストを停止してください — 失敗したステージの成果物なしに後続のステージに進まないでください(例:プラクティスが制限で停止した場合、実装に進まない)。
タスクのステレオタイプだけでハーネスを選択しないでください。ユーザー設定にそのキーがある場合のみ選択してください(references/user-config.mdを参照)。ルーティング順序:この発言 → ユーザー設定 → 一度尋ねる。 すべてのバックエンドで同じプロトコル。ロールの個性とスーパーパワーマップ:references/roles.md(正規)。
デフォルトはレビュー(アプリケーションファイルを編集しない)。アプリケーションへの書き込みは、ユーザー(または承認された計画)が実装を要求した場合のみ許可。レビューとビジュアルは一時ファイルを作成し、レポートを書き込む場合があります。
コマンドレベル(混在禁止)
このスキルは1回限りです。子エージェントはこのスキルを再入力してはなりません。ベンダーCLIはネストされたAgent/spawn_agentを許可する場合がありますが、これはこのプロトコルを再度実行するライセンスではありません。
| レベル | 誰が | コマンド | 「あなたのもの」として禁止 |
|---|---|---|---|
| L0 | 人間 | /harness-subagent、「オーケストレート」、名前付きハーネス、self をピン | spawn.sh フラグ |
| L1 | このスキルをロードした親 | scripts/spawn.sh --backend --mode、設定ルーティング、同ファミリースキップ、一度尋ねる、統合 | ブリーフ内での spawn.sh の呼び出し;子エージェントにどのハーネスを使うか尋ねること |
| L2 | 起動されたCLI spawn.sh | ロールスーパーパワーのみ、Playwright / 名前付きショット、report.md | このスキル、spawn.sh、requesting-code-review、「どのハーネス?」、同ファミリーの質問 |
L1が scripts/spawn.sh --mode … を呼び出します。そのargvは子エージェントへの指示ではありません。あなたがL2(HARNESS_SUBAGENT_RUN が設定されている、またはプロンプトが YOU ARE THE WORKER で始まる)の場合、このスポーンプロトコルの読み取りを停止し、指示されたジョブを実行してください。
spawn.sh は HARNESS_SUBAGENT_RUN をエクスポートし、CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH=1 を設定します。ネストされた spawn.sh は(変数が既に設定されているため)停止します。
オーケストレート vs ワンショット
優先順位(この順で評価):
- 単一ジョブの絞り込みがワンショットより優先 — 発言が1つのジョブを指定する(セカンドオピニオン、この差分のレビュー、実装のみ…、READMEの書き換え、Xの調査)→ 1つのブリーフ、1回の起動。先頭に「これをオーケストレート —」があっても、フルループを強制しません。
- 明示的なフルループが優先 — ユーザーが「フルループを実行」/ プラクティス+実装+レビューを一緒に指定 / 「この機能をエンドツーエンドでオーケストレート」と単一ジョブの名詞なしで言った場合 → 以下のチェックリスト全体。ここで名前付きハーネスがある場合、各ステージのバックエンドをピン留めするだけ(またはステージごとの設定);ループを1回のショットにまとめることはしません。
- それ以外の場合は、何を望むか(フルループか1ジョブか)を一度尋ねます。
フルループチェックリスト(既に完了したステップやユーザーが免除したステップはスキップ;起動ごとに1ジョブ):
- プラクティス — 調査(またはピン留めされている場合は親の
self):正確に2つのアンカー — 1つのAnthropic + 1つのOpenAI公式ガイダンス。オプションで、スタック/ハーネスが関連する場合にCursor/xAIで補足する(置き換えない)。引用 + 日付スタンプを付ける。 - 実装 — それらのプラクティスに対する境界のあるスライス。roles.md から完全なTDDテーブルを貼り付ける。
- 検証 —
code-review(敵対的)。UIが関係する場合はcode-review-visualを追加。 - 最終コヒーレンス — 親デフォルト
self(または1回の短いレビュースポーン):論理、冗長性、2つのアンカーと元の質問に対する全体的な妥当性。
いずれかのステージがブロックされた場合(スティッキールート制限を含む)、停止して尋ねてください — 飛ばさないでください。
バックエンドを選択
ユーザーが今回明示的に指定した場合を除き、親自身のファミリーを起動しないでください(Grok親 → grok なし;Claude Code親 → claude なし;Codex親 → codex なし;Antigravity親 → agy なし)。質問ごとに1つのハーネス。ただし、ユーザーが複数の意見を求めた場合は除く。
ファミリーとは親製品/CLIであり、モデルIDではありません。Cursor Agent、cursor-agent、Grok Botは cursor(モデルがGrokであっても)。Grok Build CLIは grok。Claude Codeは claude。Codex CLIは codex。Antigravity CLIは agy。レガシーGemini CLIは gemini(別のファミリー;agy として扱わない)。defaults.implement = "cursor" を持つCursor親はスキップして一度尋ねます — そのトークンはバックエンドであり、self ではありません。このセッションでジョブを実行する必要がある場合は self をピン留めします。
| ユーザーが言ったこと | バイナリ (PATH) | デフォルトモデル(最新シリーズ) | デフォルト思考 | フラグ |
|---|---|---|---|---|
| Claude、Opus、Fable、ask-claude | claude | opus(fable、sonnet、haiku も可) | xhigh | references/backend-claude.md |
| GPT、Codex、Sol、Terra、Luna、ask-gpt | codex | gpt-5.6-sol | xhigh | references/backend-codex.md |
| Grok、ask-grok | grok | grok-4.6 | xhigh | references/backend-grok.md |
| Gemini、Antigravity、agy、ask-gemini | agy | ベンダーデフォルト(--model を省略;リスト:agy models) | high | references/backend-agy.md |
| 未指定 | ユーザー設定の defaults.* キーに一致(spec、spec-ui、plan、plan-ui、implement、implement-ui、writer、research、code-review、code-review-visual、…)それが設定されているかつ(バックエンドが親ファミリーでない、または値がselfクラスである)場合;それ以外は一度尋ねる。レビューエイリアス:code-review-task / code-review-adversarial / code-review-adverserial / review → code-review(解決順序はuser-configを参照)。 | 設定 [models] / [effort]、それ以外はテーブルデフォルト | — | references/user-config.md |
ユーザーがモデルIDを指定した場合、それを使用します。Cursor Agent / OpenCode / Droid / レガシーGemini CLI:references/more-clis.md(scripts/spawn.sh にはありません)。設定トークン gemini はそのレガシーCLIであり、agy のエイリアスではありません。
このマシンが実際に持っているものをリストアップ:
claude --help
codex debug models --bundled
grok models
agy models
cursor-agent --list-models
Windows PowerShell:Get-Command claude,codex,grok,agy。~/.local/bin/… をハードコードしないでください。PATH上の agent は多くの場合Grok Buildであり、Cursorではありません。CursorのCLIは cursor-agent です。
harness-spawn スキルはありません。古い ask-claude / ask-gpt / ask-grok スタブ:このスキル。
ユーザー設定
オプション。スキルアップデート後も存続します。決してスキルクローンに設定を保存しないでください(npx skills add はすべてのエージェントディレクトリに展開されます)。
$HARNESS_SUBAGENT_CONFIGが設定されている場合:そのファイル。ファイルがない場合 → 一度尋ねてください(フォールスルーしない)。- それ以外:
${XDG_CONFIG_HOME:-$HOME/.config}/harness-subagent/config.toml
スキーマ、検索、「常にXを使用」の書き込みパス:references/user-config.md。ユーザーがピン留めを要求しない限り、ファイルを作成しないでください。
一致した defaults.* の値が self、orchestrator、parent、または you の場合、このセッションでジョブを実行します。ブリーフを書き込まないでください。scripts/spawn.sh を呼び出さないでください。親ファミリーのバックエンド(あなたがGrokのときに grok)はselfではありません — この発言がそのハーネスを指定していない限り、スキップして一度尋ねてください。
OS、一時ディレクトリ、標準入力
親エージェントはしばしば標準入力をパイプします。それを敵対的なものとして扱います。
| Linux / macOS / WSL | Windows cmd | Windows PowerShell | |
|---|---|---|---|
| 実行ディレクトリ | ${TMPDIR:-/tmp}/harness-subagent/<run-id> | %TEMP%\harness-subagent\<id> | Join-Path $env:TEMP "harness-subagent\<id>" |
| 起動 | bash <skill>/scripts/spawn.sh … | Git Bash on the script path | Git Bash ファイルargv(以下) — 二重引用符で囲まれた -lc レシピは決して使用しない |
scripts/spawn.sh は、今回ロードしたSKILL.mdのスキルディレクトリから呼び出します(スキルヘッダーのパス)。npx skills add -g はコピーを展開します;~/.claude/skills、~/.cursor/skills、~/.agents/skills を1つのセッションで混在させないでください。
cwd / -C / --cwd はそのCLIが理解できるパスでなければなりません(WSLの /mnt/d/… とWindowsの D:\…)。Windowsの claude.exe をWSLに混ぜないでください。
ビジュアルスクリーンショット:ClaudeとCursor Agentは --add-dir "$RUN" をshotsと一緒に $RUN に渡す必要があります。agy Review/Visualも同様;agy Implementは --add-dir を渡してはいけません($RUN が書き込み可能なワークスペースになります)。Grok:shotsを --project(アプリケーションツリー)にコピーし、決して $RUN だけにしないでください — Grokは一時実行ディレクトリを読み取れません。Codex:-i(スクリプト --image)。
Windows PowerShell(落とし穴 — スキップしないこと)
PowerShellは、bashがそれらを認識する前に $(…)、cat、$RUN を展開します。二重引用符で囲まれた & bash -lc "claude … $(cat $RUN/brief.md) > $RUN/last.md" は D:\c\Users\… を探し、last.md を / に書き込むか、空または平坦化されたプロンプトを渡します。system32\bash.exe はWSLです — それは %TEMP% を /c/… として認識できません。
- Git Bashをピン留め:
"$env:ProgramFiles\Git\bin\bash.exe"(Test-Pathで確認;WSL bashを使用しない)。 brief.mdをWriteツールで(UTF-8)書き込みます。PowerShell 5.1からOut-File/>を使用しないでください(UTF-16LE + NUL)。- スキルスクリプトを引数として実行し、Shell呼び出しをバックグラウンドにします(Cursorでは
block_until_ms: 0):
& "$env:ProgramFiles\Git\bin\bash.exe" -- "<skill-dir>\scripts\spawn.sh" --backend claude --mode review --project "D:/Code/app" --run "C:/Users/<you>/AppData/Local/Temp/harness-subagent/<id>"
- 実行ディレクトリをShellでリストアップします(
Get-ChildItem/ls)。CursorのGlobはワークスペーススコープであり、%TEMP%を見逃します。 - 2回の起動失敗 → 停止。親の証拠から回答します。ハーネスをUNVERIFIEDとマークします。3番目の引用レシピを発明しないでください。
この親が一部のCLIのみを自動許可する場合、スポーンは bash / bash.exe、このスクリプト、またはターゲットバックエンド(codex、…)でブロックされます。ユーザーにそれらを許可するように依頼するか、1回のスポーンを許可できる承認モードを使用してください。マシンの許可リストをハードコードしないでください。
スポーンは自動同等権限をピン留めします:Claude/Grok --permission-mode auto。Codexのすべてのモード --approve-for-me(--sandbox も渡さない:0.147ミューテックス)。agy Implement --dangerously-skip-permissions(agyには分類子Autoがありません;これはYOLOです)。agy Reviewはそれを省略します。Claude Reviewも --tools でEdit/Writeを省略します(Bashは一時ファイルのまま)。codex exec に --ask-for-approval を渡さないでください(TUIのみ;execはそれを拒否します)。アプリ編集の制約はブリーフ(「アプリケーションファイルを編集しないでください。」)であり、読み取り専用のサンドボックスではありません。
共有プロトコル
- ゲート。 このリポジトリ/このコンテキストから答えられない唯一のことを挙げてください。それが挙げられない場合、起動しないでください — ただし、この発言がすでにハーネスを指定している場合を除く(発言が依然として優先;
writer=selfは「ClaudeにREADMEを書き換えさせる」を抑制しません)。命名、スタイル、フォーマット、および「すでに試したこと」がすでに答えである場合は、実行する価値がありません。持続的なライター/リサーチ(READMEの書き換え、競合調査)は「命名」ではありません:解決されたルートがCLIである場合に起動します。 - 一時実行ディレクトリの下に
brief.mdを書き込みます(決してリポジトリ内には書き込まない)。 scripts/spawn.shをバックグラウンドで起動します(数分かかります;フォアグラウンドのタイムアウトは費用を浪費します)。スクリプトをコピーまたは編集しないでください。- プロセスが終了するまで待ちます。その後、
$RUN/last.mdと$RUN/capture-status.txtを読み取ります。プロセスがまだ実行中でVERDICTがない場合 → 完了していません。spawn.shはすでに$RUN/report.mdを最終標準出力よりも優先し、太字/VERDICT:行を正規化します。ステータスがusage-limitまたはno-verdictの場合、ハーネスをUNVERIFIED / blockedとマークします — 評決を発明せず、バックエンドを再ターゲットしないでください(スティッキールート)。例外:no-verdictが同じファミリー / 「どのハーネスを使うか」という質問の場合、それはネスティングリークです — アイデンティティフェンスを書き直し、一度だけ(同じバックエンドで)再起動します。前置きのために完了したジョブを再起動しないでください。 - 統合 — 決して貼り付けのみにしないでください。
ブリーフを書く
タスクの説明であって、データダンプではありません。差分やファイルの内容を貼り付けないでください — パスと境界のある調査対象を指定してください。例外:ワーキングディレクトリから到達できないファイル(一時実行ディレクトリ下のスクリーンショット)。
- 名前付きファイル/シンボルを「リポジトリを探索」よりも優先します。
- 差分:正確な範囲、
git diff <A>..<B> -- <paths…>。 - ビジュアル/確認:
git log、フルツリーのgit diff、ステータスダンプを禁止します。spawn.sh --imageはCodexのみ。Claude:shotsを$RUNにコピーします(すでに--add-dir "$RUN"を取得)。Grok:shotsを--projectにコピーします。 ブリーフ内でファイルに名前を付けます。 - 親の証拠をすでに試したことの下に置きます。「これを検証」を「再発見」よりも優先します。すでに
gh/curlを実行し、Codex Reviewがネットワークを持たない可能性がある場合、ここに出力を置き、それらのコマンドの再実行を禁止します。 - 製品オーバーライド: ユーザーが製品決定をロックした場合、それを明記します。
6つのパーツ、順番に:
- 子エージェントのアイデンティティフェンス — references/roles.md から、最初に、そのまま貼り付けます。ブリーフ内に
scripts/spawn.shまたは--mode visualを決して書かないでください(L2はそれを再オーケストレートの命令として扱います)。 - 目的 — 評決/成果物に名前を付ける1文(ロールカードの目的キューの合図)。
- どこを見るか — パス、境界のあるコマンド、シンボル;実装の場合は編集許可リスト。
- すでに試したこと
- 何が私の考えを変えるか — 決定的な証拠(レビュー)または受け入れゲート(実装)。
- 返却形式 — references/roles.md から貼り付け:ロールの返却契約(クリーンアップ前に
report.mdを書くを含む)、スーパーパワーマップ(正確な名前)、必須/禁止事項、および実装/実装UIの場合は完全なTDDポリシーテーブル(「roles.mdを参照」だけでは不十分)。ロールカードは、古いスタブの文言よりも優先されます。reportのために実行ディレクトリパスに名前を付けます
…[翻訳のため省略]