HAR:Plans.md タスクを1件から全並列チーム実行まで担当。実装して、実行して、全部やって、breezing、チーム実行、parallel で起動。プランニング・レビュー・リリース・セットアップには使わない。
Harness の統合実行スキル。 以下の旧スキルを統合:
work — Plans.md タスクの実装(スコープ自動判断)impl — 機能実装(タスクベース)breezing — チームフル自動実行parallel-workflows — 並列ワークフロー最適化ci — CI 失敗時の復旧| ユーザー入力 | モード | 動作 |
|---|---|---|
harness-work | auto | タスク数で自動判定(下記参照) |
harness-work all | auto | 全未完了タスクを自動モードで実行 |
harness-work 3 | solo | タスク3だけ即実行 |
harness-work --parallel 5 | parallel | 5ワーカーで並列実行(強制) |
harness-work --codex | codex | Codex CLI に委託(明示時のみ) |
harness-work --breezing | breezing |
| チーム実行を強制 |
明示的なモードフラグ(--parallel, --breezing, --codex)がない場合、
対象タスク数に応じて最適なモードを自動選択する:
| 対象タスク数 | 自動選択モード | 理由 |
|---|---|---|
| 1 件 | Solo | オーバーヘッド最小。直接実装が最速 |
| 2〜3 件 | Parallel(Task tool) | Worker 分離のメリットが出始める閾値 |
| 4 件以上 | Breezing | Lead 調整 + Worker 並列 + Reviewer 独立の三者分離が効果的 |
--parallel N → Parallel モード(タスク数に関係なく)--breezing → Breezing モード(タスク数に関係なく)--codex → Codex モード(タスク数に関係なく)--codex は明示時のみ発動。Codex CLI が未インストールの環境があるため、自動選択しない--codex は他モードと組み合わせ可能: --codex --breezing → Codex + Breezing| オプション | 説明 | デフォルト |
|---|---|---|
all | 全未完了タスクを対象 | - |
N or N-M | タスク番号/範囲指定 | - |
--parallel N | 並列ワーカー数 | auto |
--sequential | 直列実行強制 | - |
--codex | Codex CLI で実装委託(明示時のみ、自動選択しない) | false |
--no-commit | 自動コミット抑制 | false |
--resume <id|latest> | 前回セッション再開 | - |
--breezing | Lead/Worker/Reviewer のチーム実行 | false |
--no-tdd | TDD フェーズスキップ | false |
--no-simplify | Auto-Refinement スキップ | false |
--auto-mode | Auto Mode rollout を明示。親セッションの permission mode が互換な場合のみ採用を検討 | false |
Token Optimization (v2.1.69+): git 操作を伴わない軽量タスクでは plugin settings の
includeGitInstructions: falseを有効にして プロンプトトークンを削減できる。
harness-work
どこまでやりますか?
1) 次のタスク: Plans.md の次の未完了タスク → Solo で実行
2) 全部(推奨): 残りのタスクをすべて完了 → タスク数で自動モード選択
3) 番号指定: タスク番号を入力(例: 3, 5-7)→ 件数で自動モード選択
引数ありなら即実行(対話スキップ):
harness-work all → 全タスク、自動モード選択harness-work 3-6 → 4件なので Breezing 自動選択Claude Code v2.1.68 で Opus 4.6 は medium effort (◐) がデフォルト。
v2.1.72 で max レベルが廃止され、3段階 low(○)/medium(◐)/high(●) に簡素化。
/effort auto でデフォルトにリセット可能。
複雑なタスクには ultrathink キーワードで high effort (●) を有効化する。
タスク着手時に以下のスコアを合算し、閾値 3 以上で ultrathink を注入:
| 要素 | 条件 | スコア |
|---|---|---|
| ファイル数 | 変更対象 4 ファイル以上 | +1 |
| ディレクトリ | core/, guardrails/, security/ を含む | +1 |
| キーワード | architecture, security, design, migration を含む | +1 |
| 失敗履歴 | agent memory に同タスクの失敗記録あり | +2 |
| 明示指定 | PM テンプレートに ultrathink 記載あり | +3(自動採用) |
スコア ≥ 3 の場合、Worker spawn prompt の冒頭に ultrathink を追加。
breezing モードでも同じロジックが適用される(harness-work が一本化して管理)。
harness-plan create --ci を自動呼び出し → Plans.md を生成して続行Plans.md が旧フォーマットです。harness-plan create で再生成してください。 → 停止cc:TODO で自動追記
git grep / Glob で 影響範囲(変更が及ぶファイル/モジュール)を推論表示cc:WIP に更新[skip:tdd] なし & テストFW存在時):
a. テストファイルを先に作成(Red)
b. 失敗を確認node scripts/generate-sprint-contract.js <task-id> で sprint-contract.json を生成scripts/enrich-sprint-contract.sh で加え、scripts/ensure-sprint-contract-ready.sh で approved を確認needs-spike / security-sensitive / state-migration)は、初回実行前に 1 回だけ相談するPIVOT_REQUIRED を返した時は、ユーザーへ止めて投げる前に 1 回だけ相談するadvisor-response.v1 で受け取り、PLAN は進め方の組み替え、CORRECTION は局所修正、STOP は即エスカレーションとして扱うtrigger_hash では 1 回しか相談しない。task ごとの相談回数は最大 3 回/simplify で Auto-Refinement(--no-simplify で省略可)sprint-contract.json の reviewer_profile が runtime の場合は scripts/run-contract-review-checks.sh を実行MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3)scripts/write-review-result.sh で review artifact を正規化して保存(browser profile は --browser-result を渡し、browser_verdict == PENDING_BROWSER の時は static verdict を採用)git commit で自動コミット(--no-commit で省略可)cc:完了 に更新(commit hash 付与)git log --oneline -1 で直近の commit hash(短縮形 7 文字)を取得cc:完了 [a1b2c3d] 形式で更新--no-commit 時)は hash なしで cc:完了 のみ--parallel N で強制)[P] マーク付きタスクを N ワーカーで並列実行。
--parallel N で明示指定した場合は、タスク数に関係なくこのモードを使用。
同一ファイルへの書き込みが競合する場合は git worktree で分離。
--codex 明示時のみ)公式プラグイン codex-plugin-cc の companion 経由で Codex CLI にタスクを委託する。
# タスク委託(書き込み可能)
bash scripts/codex-companion.sh task --write "タスク内容"
# stdin 経由(大きなプロンプト向け)
CODEX_PROMPT=$(mktemp /tmp/codex-prompt-XXXXXX.md)
# タスク内容を書き出し
cat "$CODEX_PROMPT" | bash scripts/codex-companion.sh task --write
rm -f "$CODEX_PROMPT"
# 前回スレッドの続行
bash scripts/codex-companion.sh task --resume-last --write "続きをやって"
companion は App Server Protocol 経由で Codex と通信し、 Job 管理・thread resume・構造化出力を提供する。 結果を検証し、品質基準を満たさない場合は自力で修正。
--breezing で強制)Lead / Worker / Advisor / Reviewer の役割分離でチーム実行する。
Codex では spawn_agent, wait, send_input, resume_agent, close_agent
を使った native subagent orchestration を前提にし、
古い TeamCreate / TaskCreate ベースの説明を採らない。
権限ポリシー:
bypassPermissions--auto-mode は互換な親セッション向けの opt-in rollout フラグとして扱うpermissions.defaultMode や agent frontmatter の permissionMode には未文書化の autoMode 値を書かないCC v2.1.69+: nested teammates はプラットフォーム側で禁止されるため、 Worker/Reviewer プロンプトには冗長な nested 防止文言を追加しない。
Lead (this agent)
├── Worker (task-worker agent) — 実装担当
├── Advisor (claude-code-harness:advisor) — 方針助言
└── Reviewer (code-reviewer agent) — レビュー担当
Phase A: Pre-delegate(準備):
node scripts/generate-sprint-contract.js で sprint-contract.json を生成scripts/enrich-sprint-contract.sh で Reviewer 観点を加え、scripts/ensure-sprint-contract-ready.sh で未承認なら停止Phase B: Delegate(Worker spawn → 必要時 Advisor → レビュー → cherry-pick):
各タスクについて以下を逐次実行する(依存順):
API 注記: 以下は Codex native の subagent API 構文で記述する。
spawn_agent(...),resume_agent(...),send_input(...),wait_agent(...)をそのまま使う。 Claude Code 向けのAgent(...)/SendMessage(...)/wait_for_response(...)は混ぜない。
for task in execution_order:
# B-1. sprint-contract を生成
contract_path = bash("node scripts/generate-sprint-contract.js {task.number}")
contract_path = bash("scripts/enrich-sprint-contract.sh {contract_path} --check \"DoD を reviewer 観点で確認\" --approve")
bash("scripts/ensure-sprint-contract-ready.sh {contract_path}")
# B-2. Worker spawn(フォアグラウンド、worktree 分離)
# Agent tool の戻り値に agentId が含まれる — 修正ループで SendMessage に使用
Plans.md: task.status = "cc:WIP" # 着手時に更新(未着手タスクは cc:TODO のまま)
worker_result = Agent(
subagent_type="claude-code-harness:worker",
prompt="タスク: {task.内容}\nDoD: {task.DoD}\ncontract_path: {contract_path}\nmode: breezing",
isolation="worktree",
run_in_background=false # フォアグラウンドで実行 → Worker 完了まで待機
)
worker_id = worker_result.agentId # SendMessage 用に保持
# worker_result には {commit, worktreePath, files_changed, summary} が含まれる
# B-3. Worker が advice request を返した時だけ、Lead が Advisor を呼ぶ
if worker_result.type == "advisor-request.v1":
advisor_result = spawn_agent({
message: worker_result.request_json,
agent_type: "default"
})
resume_agent({ id: worker_id })
send_input({
target: worker_id,
message: "advisor-response.v1: {advisor_result}"
})
worker_result = wait_agent({ targets: [worker_id] })
# B-4. Lead がレビュー実行(Codex exec 優先)
diff_text = git("-C", worker_result.worktreePath, "show", worker_result.commit)
verdict = codex_exec_review(diff_text) or reviewer_agent_review(diff_text)
profile = jq(contract_path, ".review.reviewer_profile")
review_input = "review-output.json"
if profile == "runtime":
review_input = bash("cd {worker_result.worktreePath} && scripts/run-contract-review-checks.sh {contract_path}")
runtime_verdict = jq(review_input, ".verdict")
if runtime_verdict == "REQUEST_CHANGES":
verdict = "REQUEST_CHANGES"
elif runtime_verdict == "DOWNGRADE_TO_STATIC":
pass # runtime 検証コマンドなし → static verdict をそのまま使う
browser_result = ""
if profile == "browser":
# browser artifact から route / browser_mode / execution_instructions を再利用して browser runner を起動する。
browser_artifact = bash("scripts/generate-browser-review-artifact.sh {contract_path}")
browser_result = bash("scripts/browser-review-runner.sh {browser_artifact}")
browser_verdict = jq(browser_result, ".browser_verdict")
if browser_verdict == "REQUEST_CHANGES":
verdict = "REQUEST_CHANGES"
elif browser_verdict == "APPROVE" and verdict != "REQUEST_CHANGES":
verdict = "APPROVE"
# browser_verdict == PENDING_BROWSER のときは static verdict を維持する
# review_input が DOWNGRADE_TO_STATIC の場合は static review 結果を使う
if review_input != "review-output.json" and jq(review_input, ".verdict") == "DOWNGRADE_TO_STATIC":
review_input = "review-output.json" # static review の結果にフォールバック
bash("scripts/write-review-result.sh {review_input} {latest_commit} --browser-result {browser_result}")
# B-5. 修正ループ(REQUEST_CHANGES 時、contract の max_iterations まで)
# Worker はフォアグラウンドで完了済みなので、resume_agent + send_input で再開する
review_count = 0
# sprint-contract が存在するときのみ max_iterations を読む。存在しない場合は 3(後方互換)
MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3
latest_commit = worker_result.commit
while verdict == "REQUEST_CHANGES" and review_count < MAX_REVIEWS:
resume_agent(worker_id)
send_input(worker_id, "指摘内容: {issues}\n修正して amend してください")
# Worker が修正 → amend → 更新された commit hash を返す
updated_result = wait_agent(worker_id)
latest_commit = updated_result.commit
diff_text = git("-C", worker_result.worktreePath, "show", latest_commit)
verdict = codex_exec_review(diff_text) or reviewer_agent_review(diff_text)
review_count++
# B-6. APPROVE → trunk に cherry-pick(feature ブランチ経由)
# Worker の Branch Guard により trunk HEAD は動かず、commit は feature ブランチ上にある想定
if verdict == "APPROVE":
TRUNK=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||' || echo "main")
git checkout "$TRUNK" # safety: 既に trunk なら no-op
# feature ブランチの commit が既に trunk にある(Branch Guard 失敗時のフォールバック)か確認
if git("merge-base", "--is-ancestor", latest_commit, "HEAD"):
pass # 既に trunk 上 — cherry-pick 不要(再入防止)
else:
git cherry-pick --no-commit {latest_commit} # feature branch → trunk
git commit -m "{task.内容}"
# Worker の worktree を remove してから feature ブランチを削除
if worker_result.worktreePath:
git worktree remove {worker_result.worktreePath} --force
if worker_result.branch and worker_result.branch not in ["main", "master"] and worker_result.branch != TRUNK:
git branch -D {worker_result.branch}
Plans.md: task.status = "cc:完了 [{hash}]"
# auto-checkpoint 記録(冪等性ガード (c))
# Plans.md 書き換え直後に呼ぶ。失敗しても fail-open(|| true)でループを止めない
HASH=$(git rev-parse --short HEAD)
REVIEW_RESULT_PATH=".claude/state/review-results/${task.number}.review-result.json"
bash scripts/auto-checkpoint.sh \
"${task.number}" "${HASH}" "${contract_path}" "${REVIEW_RESULT_PATH}" \
|| true # fail-open: harness-mem 未起動環境でも継続
else:
→ ユーザーにエスカレーション
# B-7. Progress feed
print("📊 Progress: Task {completed}/{total} 完了 — {task.内容}")
Advisor は「実装者」でも「レビュー担当」でもない。 迷った時だけ、実行役が次の一歩を決めるための相談役として入る。
advisor-request.v1 を返すPLAN / CORRECTION / STOP のどれかを返すsolo 実行では親セッション自身が Lead を兼ねる。 つまり「自分で実装し、自分で advisor に相談し、最後は独立レビューに回す」形になる。
STOP はその場で止まり、ユーザー判断へ上げるsprint-contract は「このタスクを何で合格にするか」を機械でも人でも同じ意味で読める形にする小さな契約ファイルです。
既定の保存先は .claude/state/contracts/<task-id>.sprint-contract.json です。
node scripts/generate-sprint-contract.js 32.1.1
生成物には次を含めます。
checks: DoD を分解した確認項目non_goals: 今回やらないことruntime_validation: test, lint, typecheck などの検証コマンドbrowser_validation: browser reviewer が残すべき UI フロー検証項目browser_mode: scripted または exploratoryroute: browser reviewer が playwright / agent-browser / chrome-devtools のどれを使うかrisk_flags: needs-spike, security-sensitive, ux-regression などreviewer_profile: static, runtime, browserPhase C: Post-delegate(統合・報告):
CI が失敗した場合:
タスク完了後にテスト/CI が失敗した場合、修正タスク案を自動生成し、承認後に Plans.md へ反映する:
| 条件 | アクション |
|---|---|
cc:完了 後にテスト失敗 | 修正タスク案を state に保存し、承認を待つ |
| CI 失敗(3回未満) | 修正を実施し、失敗カウントをインクリメント |
| CI 失敗(3回目) | 修正タスク案を提示 + エスカレーション |
.claude/state/pending-fix-proposals.jsonl に修正タスク案を保存:
.fix サフィックス(例: 26.1.fix)fix: [元タスク名] - [失敗原因カテゴリ]approve fix <task_id> を送ると Plans.md に cc:TODO で追加reject fix <task_id> で提案を破棄。pending が1件だけのときは yes / no でも応答可能実装完了後(ステップ 5 の後)に自動実行される品質検証ステージ。 全モード共通(Solo / Parallel / Breezing)で統一的に適用される。 Parallel モードでは各 Worker が step 10(外部レビュー受付)として同じループを実行する。
1. Codex exec(優先)
↓ codex コマンドが存在しない or タイムアウト(120s)
2. 内部 Reviewer agent(フォールバック)
レビュアーには以下の閾値基準を渡し、この基準のみで verdict を判定させる。
基準外の改善提案は recommendations として返すが、verdict には影響しない。
| 重要度 | 定義 | verdict への影響 |
|---|---|---|
| critical | セキュリティ脆弱性、データ損失リスク、本番障害の可能性 | 1 件でも → REQUEST_CHANGES |
| major | 既存機能の破壊、仕様との明確な矛盾、テスト不通過 | 1 件でも → REQUEST_CHANGES |
| minor | 命名改善、コメント不足、スタイル不統一 | verdict に影響しない |
| recommendation | ベストプラクティス提案、将来の改善案 | verdict に影響しない |
重要: minor / recommendation のみの場合は 必ず APPROVE を返すこと。 「あったほうが良い改善」は REQUEST_CHANGES の理由にならない。
タスク開始時の HEAD を BASE_REF として保持し、その ref との差分をレビュー対象にする。
公式プラグイン codex-plugin-cc の companion review を使用する。
# タスク開始時に base ref を記録(Step 2 の cc:WIP 更新前に実行)
BASE_REF=$(git rev-parse HEAD)
# ... 実装完了後 ...
# 公式プラグインの構造化レビューを実行
bash scripts/codex-companion.sh review --base "${BASE_REF}"
REVIEW_EXIT=$?
verdict マッピング(公式プラグイン → Harness 形式):
公式プラグインは review-output.schema.json 準拠の構造化出力を返す。
Harness の verdict 形式への変換ルール:
| 公式 plugin | Harness | verdict 影響 |
|---|---|---|
approve | APPROVE | - |
needs-attention | REQUEST_CHANGES | - |
findings[].severity: critical | critical_issues[] | 1件でも → REQUEST_CHANGES |
findings[].severity: high | major_issues[] | 1件でも → REQUEST_CHANGES |
findings[].severity: medium/low | recommendations[] | verdict に影響しない |
AI Residuals スキャンは引き続き scripts/review-ai-residuals.sh で実行し、
companion review の結果と合わせて最終 verdict を判定する。
# AI Residuals スキャン(companion review と並行実行可能)
AI_RESIDUALS_JSON="$(bash scripts/review-ai-residuals.sh --base-ref "${BASE_REF}" 2>/dev/null || echo '{"tool":"review-ai-residuals","scan_mode":"diff","base_ref":null,"files_scanned":[],"summary":{"verdict":"APPROVE","major":0,"minor":0,"recommendation":0,"total":0},"observations":[]}')"
Codex exec が使えない場合(command -v codex が失敗、または exit code ≠ 0):
Agent tool: subagent_type="reviewer"