Harness Work

SkillProductivity

Lets your agent carry out tasks from a Plans.md file, running one task or many in parallel.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Harness Work skill

About this capability

HAR: Execute Plans.md tasks from single task to full parallel team run. Trigger: implement, execute, do everything, breezing, team run, parallel, composer, composer 2.5. Do NOT load for: planning, review, release, setup.

What this skill tells your AI

The instructions your AI receives, as published by chachamaru127/claude-code-harness in skills/harness-work/SKILL.md and read by ahel’s review.

Harness の統合実行スキル。 以下の旧スキルを統合:

  • work — Plans.md タスクの実装(スコープ自動判断)
  • impl — 機能実装(タスクベース)
  • breezing — チームフル自動実行
  • parallel-workflows — 並列ワークフロー最適化
  • ci — CI 失敗時の復旧

Quick Reference

ユーザー入力モード動作
harness-workautoタスク数で自動判定(下記参照)
harness-work allauto全未完了タスクを自動モードで実行
harness-work 3soloタスク3だけ即実行
harness-work --parallel 5parallel5ワーカーで並列実行(強制)
harness-work --codexcodexCodex CLI に委託(明示時のみ)
harness-work --breezing allbreezingresolved backend でチーム実行(配布既定は claude、user/project default で cursor 可)
harness-work --breezing --backend cursor allbreezingCursor worker backend を明示してチーム実行
harness-work --breezing --backend claude allbreezingCodex native subagent worker を明示してチーム実行
harness-work --breezingbreezingチーム実行を強制
harness-work 3 --plan roadmapsolonamed Plans の roadmap からタスク3を実行

Execution Mode Auto Selection(フラグなし時の自動判定)

明示的なモードフラグ(--parallel, --breezing, --codex)がない場合、 対象タスク数に応じて最適なモードを自動選択する:

対象タスク数自動選択モード理由
1 件Soloオーバーヘッド最小。直接実装が最速
2〜3 件Parallel(Task tool)Worker 分離のメリットが出始める閾値
4 件以上BreezingLead 調整 + Worker 並列 + Reviewer 独立の三者分離が効果的

ルール

  1. 明示フラグは常にオートモードを上書きする
    • --parallel N → Parallel モード(タスク数に関係なく)
    • --breezing → Breezing モード(タスク数に関係なく)
    • --codex → Codex モード(タスク数に関係なく)
  2. --codex は明示時のみ発動。Codex CLI が未インストールの環境があるため、自動選択しない
  3. --codex は他モードと組み合わせ可能: --codex --breezing → Codex + Breezing

Execution Backend Selection(実装バックエンド選択)

バックエンド(どのランタイムが実装するか)は、トポロジー(実行モード: solo / parallel / breezing)と直交する。 トポロジーが「何ワーカーで・どう分割して回すか」を決めるのに対し、バックエンドは「実装の手を誰が動かすか」を決める。 この契約は host-neutral であり(spec.md「Execution Backend Contract」)、Codex host から harness を駆動しても Claude Code から駆動しても同じに振る舞う。

backend実装の担い手委託コマンド
claude(global fallback)Codex native subagent(spawn_agentspawn_agent で worker を spawn
codexCodex CLIbash "${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh" task --write "<prompt>"
cursorcursor-agent(model composer-2.5-fastbash "${HARNESS_PLUGIN_ROOT}/scripts/cursor-companion.sh" task --write --workspace <worktree> "<prompt>"

解決手順

run 開始時に 1 回だけ解決する。backend 判定は 必ず resolver 経由にし、HARNESS_IMPL_BACKEND env だけを直読みして判定しない:

bash "${HARNESS_PLUGIN_ROOT}/scripts/resolve-impl-backend.sh"

precedence(高い順): --backend <v> / --cursor / --codex フラグ > HARNESS_IMPL_BACKEND 環境変数 > プロジェクト env.local の同名行 > ユーザー ~/.config/claude-harness/impl-backend.env の同名行 > call-site default。 明示フラグ(--backend / --cursor / --codex)は env / file / default を常に上書きする。プロジェクト設定はユーザースコープを上書きする。

Codex host の --breezing / breezing も配布 plugin では call-site default を変えない。 フラグなしは resolve-impl-backend.sh の結果に従い、未設定時の fallback は claude。 Cursor を既定にしたい環境は HARNESS_IMPL_BACKEND=cursor を env / project env.local / user-scope config に設定する。 明示的に Cursor を使う場合は --backend cursor / --cursor、Codex native subagent worker へ戻す場合は --backend claude を渡す。

モデル名の正本は model-routing.sh。本ドキュメント中の composer-2.5-fast は参照値であり、実解決は bash "${HARNESS_PLUGIN_ROOT}/scripts/model-routing.sh" --host cursor --role worker --field model に従う(drift 防止)。

自然言語 backend trigger

ユーザーが composer / コンポーザー / Composer で / composer 2.5 / composer モード と言った場合は、cursor backend 指定として扱う。 これは --cursor と同じ intent だが、backend の確定値は必ず resolve-impl-backend.sh で解決する。 解決時は明示 override として --backend cursor を渡し、env / project / user file / default より優先させる。 Lead は composer を Codex native Worker 内の追加 agent と解釈せず、非 claude backend の規約どおり Worker agent を挟まずに cursor-companion.sh を直接呼ぶ。

role-scoped 制約

バックエンドは role-scoped。解決済みバックエンドを使うのは実装(worker)ロールだけ。 Reviewer と Advisor の両ロールは常に brain(--host claude、Opus)に固定する。 Reviewer を cursor / codex バックエンドに routing しない(実装したバックエンドが自分の出力をレビューしてはならない)。

claude バックエンドの self_review ゲート

backend が codex または cursor の場合、worker-report.v1self_review 配列も生成されない。 そのため Lead は self_review ゲートをスキップし、Lead の diff レビューを唯一の品質ゲートとする(既存の codex path と同じ扱い)。

cursor バックエンドの banner(委託前に必須)

backend が cursor のとき、Lead は委託前に次の 1 行 banner を必ず出力する:

⚠️ cursor backend: model=composer-2.5-fast / R01-R13 ガードレールは cursor-agent 内部に適用されない / 出力は Lead レビューまで untrusted

cursor の write 委託は専用 .git を持つ worktree 内で実行し、Lead が main へ cherry-pick する(cherry-pick 経路で R01-R13 が適用される)。 ガバナンス詳細は .claude/rules/cursor-cli-only.md を参照。

オプション

オプション説明デフォルト
all全未完了タスクを対象-
N or N-Mタスク番号/範囲指定-
--parallel N並列ワーカー数auto
--sequential直列実行強制-
--codexCodex CLI で実装委託(明示時のみ、自動選択しない)false
--backend <claude|codex|cursor>明示バックエンド選択(worker ロールのみ適用、precedence 最上位)resolver result(未設定時は claude)
--cursorcursor backend(--backend cursor の別名)false
--plan NAMEplans/manifest.json の named plan を使うactive/default
--no-commit自動コミット抑制false
--resume <id|latest>前回セッション再開-
--breezingLead/Worker/Reviewer のチーム実行false
--no-tddTDD フェーズスキップfalse
--tdd-bypass緊急時だけ TDD 強制を bypass。HARNESS_TDD_BYPASS_REASON または明示理由を audit に残すfalse
--no-simplifyAuto-Refinement スキップfalse
--auto-modeAuto Mode rollout を明示。親セッションの permission mode が互換な場合のみ採用を検討false

Progressive Disclosure

まずこの本文で入口、自動選択、停止条件だけを確認する。 詳細は必要になった時だけ読む。

詳細参照
Codex native Solo / Parallel / Breezing の具体手順references/execution-modes.md
companion review、Reviewer fallback、AI Residuals、修正ループreferences/review-loop.md
完了報告の生成references/completion-report.md
テスト/CI 失敗時の再チケット化references/failure-reticketing.md
仕様正本チェックの基準docs/plans/spec-ssot.md

重要停止条件

  • Plans.md が旧フォーマットで DoD / Depends / Status を読めない時は停止する。
  • 仕様が実装判断に影響するのに project spec SSOT が見つからない時は、先に仕様正本を作成/更新してから実装する。
  • sprint-contract が required なのに ready でない時は実装に進まない。
  • critical / major review finding が残っている時は完了にしない。
  • テストを弱める、skip する、期待値を実装に合わせて緩める形では解決しない。
  • helper script は host project の scripts/ ではなく ${HARNESS_PLUGIN_ROOT}/scripts/ から呼ぶ。
  • 複数 Plans.md がある場合は、1 run の中で plan を切り替えない。必要なら --plan NAME を明示して新しい run を開始する。

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 自動選択

Effort レベル制御(Codex 0.148 / managed routes)

effort はモデルの推論強度を選ぶ正式なノブ。generic な standard / review route は low(○)/medium(◐)/high(●)/xhigh を使う。Breezing の implementation worker は managed worker route の設定をそのまま使い、skill から effort を上書きしない。 /effort auto は generic route の既定へ戻す操作であり、worker route の max 契約を xhigh へ静かに置換してはならない。

「浅い推論」を観測したら prompt で回避せず、対象 role の中央 routing 設定を確認する。 そのため複雑タスクの強化は free-text marker(旧 ultrathink)を spawn prompt に注入する方式を廃止し、 複雑度スコアから Worker spawn の effort tier を選ぶ方式に統一する。

多要素スコアリング

タスク着手時に以下のスコアを合算する。

要素条件スコア
ファイル数変更対象 4 ファイル以上+1
ディレクトリcore/, guardrails/, security/ を含む+1
キーワードarchitecture, security, design, migration を含む+1
失敗履歴agent memory に同タスクの失敗記録あり+2
明示指定PM テンプレートに effort: high / effort: xhigh(旧 ultrathink も互換受理)記載あり+3(自動採用)

effort tier の決め方(注入しない)

スコアから effort tier を escalation signal として決める(ultrathink 等の marker 文字列を spawn prompt に 書かない)。 適用 lever は次の 2 つだけ:

  • session /effort: 複雑タスクのバッチに入る前に host が /effort high / /effort xhigh を設定する(session 単位で効く確実な lever)。
  • worker frontmatter: agents/worker.mdeffort(既定 medium)が floor。CC の Agent / Task spawn API は per-spawn の effort 指定を公開しないため、worker 1 体ごとに effort を上げる機構はない。スコアは worker-report.v1task_complexity_note に記録し、Lead が session effort 引き上げの判断材料にする。
スコアcode-risk(core/guardrails/security/architecture/migration を含む)effort tier
0-2不問medium(Worker frontmatter 既定のまま)
≥ 3なしhigh
≥ 3ありxhigh

breezing モードでも同じロジックを適用する(harness-work が一本化して管理)。

実行モード詳細

Harness helper script root

Harness が同梱する helper script は、作業対象プロジェクトの scripts/ ではなく、必ず plugin bundle root から呼ぶ。

HARNESS_PLUGIN_ROOT="${HARNESS_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}"
if [ -z "$HARNESS_PLUGIN_ROOT" ] && [ -n "${CLAUDE_SKILL_DIR:-}" ]; then
  probe="$(cd "${CLAUDE_SKILL_DIR}" && pwd)"
  while [ "$probe" != "/" ] && [ ! -d "$probe/scripts" ]; do
    probe="$(cd "$probe/.." && pwd)"
  done
  [ -d "$probe/scripts" ] && HARNESS_PLUGIN_ROOT="$probe"
fi

以降の node "${HARNESS_PLUGIN_ROOT}/scripts/..." / bash "${HARNESS_PLUGIN_ROOT}/scripts/..." は、この解決済み root を前提にする。

Backend-resolved executor path (Solo / Parallel / Breezing)

Solo / Parallel / Breezing は同じ resolver result から実装 executor を選ぶ。 harness-work 3 --cursor と user/project HARNESS_IMPL_BACKEND=cursor は、1 件タスクでも local Read/Write/Edit/Bash に fall through してはいけない。

resolver_backend_arg = ""
if explicit_backend_value in ["claude", "codex", "cursor"]:
    resolver_backend_arg = "--backend {explicit_backend_value}"
backend = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/resolve-impl-backend.sh\" {resolver_backend_arg}")
if explicit_flag == "--cursor":
    backend = "cursor"
if explicit_flag == "--codex":
    backend = "codex"

if topology in ["solo", "parallel"] and backend in ["cursor", "codex"]:
    BASE_REF = git("rev-parse", "HEAD")
    WT_ID = "{task.number}-$(date +%Y%m%d-%H%M%S)-$$"
    worktree_path = ".claude/worktrees/{backend}-{WT_ID}"
    worktree_branch = "{backend}-work/{WT_ID}"
    bash("mkdir -p .claude/worktrees && git worktree add -b {worktree_branch} {worktree_path} {BASE_REF}")
    companion_prompt = "{task prompt}\n\nAfter making changes, create exactly one git commit in this worktree before returning."
    if backend == "cursor":
        companion_output = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/cursor-companion.sh\" task --write --workspace {worktree_path} \"{companion_prompt}\"")
    else:
        companion_state_file = "{worktree_path}/.claude/state/codex-primary-environment.json"
        companion_output = bash("CODEX_MODEL_TIER=worker HARNESS_CODEX_PRIMARY_ENV_STATE_FILE={companion_state_file} bash \"${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh\" task --write -C {worktree_path} \"{companion_prompt}\"")
    latest_commit = git("-C", worktree_path, "rev-parse", "HEAD")
    if backend == "cursor" and git("-C", worktree_path, "status", "--porcelain") != "":
        git("-C", worktree_path, "add", "-A")
        git("-C", worktree_path, "-c", "user.name=cursor-composer", "-c", "user.email=cursor-composer@local", "commit", "--no-verify", "-m", "cursor: delegated change")
        latest_commit = git("-C", worktree_path, "rev-parse", "HEAD")
    if latest_commit == BASE_REF:
        raise EscalationError("{backend} companion produced no commit")
    worker_result = {type: "companion-result.v1", baseCommit: BASE_REF, commit: latest_commit, worktreePath: worktree_path, branch: worktree_branch, files_changed: git("-C", worktree_path, "diff", "--name-only", "{BASE_REF}..HEAD"), summary: companion_output}
    enter_shared_review_loop(worker_result)
else:
    run_native_solo_or_parallel()

Parallel は task ごとにこの resolver path を適用する。 backend=cursor / codex の場合は native Worker spawn を使わず、task ごとに isolated companion worktree を作成して companion-result.v1 に正規化してから共通 review / cherry-pick loop に入る。

Solo モード(1 件時の自動選択)

  1. Plans.md を読み込み、対象タスクを特定
    • Plans.md が存在しない場合: harness-plan create --ci を自動呼び出し → Plans.md を生成して続行
    • ヘッダーに DoD / Depends カラムがない場合: Plans.md が旧フォーマットです。harness-plan create で再生成してください。停止
    • 会話に未記載タスクがある場合: 直前の会話コンテキストから要件を抽出し、Plans.md に cc:TODO で自動追記
      • 抽出ロジック: ユーザー発言からアクション動詞(「〜を追加」「〜を修正」「〜を実装」)を検出
      • 追記時は v2 フォーマット(Task / 内容 / DoD / Depends / Status)に準拠
      • 追記後、ユーザーに「Plans.md に以下を追記しました」と表示(5 秒タイムアウト付きプロンプト、デフォルト: 続行) 1.5. タスク背景確認(30 秒):
    • タスクの「内容」と「DoD」から 目的(このタスクが解く課題)を 1 行で推論表示
    • git grep / Glob影響範囲(変更が及ぶファイル/モジュール)を推論表示
    • 推論に自信がある場合: そのまま実装に進む(フロー遅延なし)
    • 推論に自信がない場合: ユーザーに 1 問だけ確認(「この理解で合っていますか?」) 1.6. 仕様正本 preflight:
    • 既存の project spec SSOT を探す(例: docs/spec/00-project-spec.md, docs/ARCHITECTURE.md, docs/HANDOFF.md, docs/oem/PROJECT_COMPASS.md, docs/specs/
    • task が product behavior / API / data model / permission / billing / integration / tenant boundary を変える場合、spec がなければ docs/spec/00-project-spec.md を作る
    • spec が古い、または task と矛盾する場合は、実装前に spec を更新する
    • typo / format / dependency bump / docs-only / 動作変更なし refactor は skip 理由を残して続行する
    • Worker / Reviewer へ渡す context には spec_path または spec_skip_reason を含める
  2. タスクを cc:WIP に更新
  3. TDD フェーズ[skip:tdd] なし & テストFW存在時): a. テストファイルを先に作成(Red) b. 失敗を確認 c. bash "${HARNESS_PLUGIN_ROOT}/scripts/log-tdd-red.sh".claude/state/tdd-red-log/<task-id>.jsonl に FAIL 証跡を残す。script が利用できない環境では、literal な failing test output を worker-report の self_review evidence に添付する d. --tdd-bypass を使う場合は、HARNESS_TDD_BYPASS=1HARNESS_TDD_BYPASS_REASON="<理由>" を明示し、TDD を省略した理由を sprint-contract / worker-report に残す
  4. node "${HARNESS_PLUGIN_ROOT}/scripts/generate-sprint-contract.js" <task-id>sprint-contract.json を生成
  5. Reviewer 観点の追記を bash "${HARNESS_PLUGIN_ROOT}/scripts/enrich-sprint-contract.sh" で加え、bash "${HARNESS_PLUGIN_ROOT}/scripts/ensure-sprint-contract-ready.sh" で approved を確認
  6. Advisor consult(必要時のみ):
    • 高リスク task(needs-spike / security-sensitive / state-migration)は、初回実行前に 1 回だけ相談する
    • 同じ原因の失敗が 2 回続いたら、3 回目に入る前に相談する
    • plateau(行き詰まり検知)が PIVOT_REQUIRED を返した時は、ユーザーへ止めて投げる前に 1 回だけ相談する
    • 相談結果は advisor-response.v1 で受け取り、PLAN は進め方の組み替え、CORRECTION は局所修正、STOP は即エスカレーションとして扱う
    • 同じ trigger_hash では 1 回しか相談しない。task ごとの相談回数は最大 3 回
  7. backend-resolved executor path でコードを実装(Green)
    • backend=claude: local / native Read/Write/Edit/Bash path で実装
    • backend=cursor / codex: 上記 companion worktree path で実装し、companion-result.v1 を共通 review loop に渡す
  8. /simplify で Auto-Refinement(--no-simplify で省略可)
  9. 自動レビューステージ(「レビューループ」参照):
    • Codex exec 優先でレビュー実行 → フォールバックで内部 Reviewer agent
    • sprint-contract.jsonreviewer_profileruntime の場合は bash "${HARNESS_PLUGIN_ROOT}/scripts/run-contract-review-checks.sh" を実行
    • REQUEST_CHANGES の場合: 指摘を元に修正→再レビュー(MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3
    • APPROVE で次ステップへ。self-check だけでは完了を確定しない
  10. bash "${HARNESS_PLUGIN_ROOT}/scripts/write-review-result.sh" で review artifact を正規化して保存(browser profile は --browser-result を渡し、browser_verdict == PENDING_BROWSER の時は static verdict を採用)
  11. git commit で自動コミット(--no-commit で省略可)
  12. タスクを cc:完了 に更新(commit hash 付与)
  • git log --oneline -1 で直近の commit hash(短縮形 7 文字)を取得
  • Plans.md の Status を cc:完了 [a1b2c3d] 形式で更新
  • commit がない場合(--no-commit 時)は hash なしで cc:完了 のみ
  1. リッチ完了報告Completion Report Output Contractreferences/completion-report.md を参照)
  2. 失敗時の自動再計画(テスト/CI 失敗時のみ):
    • テスト実行結果を確認
    • 失敗した場合: 修正タスク案を state に保存し、承認コマンド経由で Plans.md に追加(「失敗タスクの自動再チケット化」参照)
    • 成功した場合: 次タスクへ進む

Parallel モード(2〜3 件時の自動選択 / --parallel N で強制)

[P] マーク付きタスクを N ワーカーで並列実行。 --parallel N で明示指定した場合は、タスク数に関係なくこのモードを使用。 同一ファイルへの書き込みが競合する場合は git worktree で分離。 各 task の実装 executor は Backend-resolved executor path に従う。 --parallel N --cursor--backend cursor、または default HARNESS_IMPL_BACKEND=cursor の場合、Parallel でも native Worker spawn ではなく task ごとの Cursor companion worktree を使う。

Codex モード(--codex 明示時のみ)

公式プラグイン codex-plugin-cc の companion 経由で Codex CLI にタスクを委託する。

# タスク委託(書き込み可能・worktree 分離)
BASE_REF="$(git rev-parse HEAD)"
WT_ID="codex-$(date +%Y%m%d-%H%M%S)-$$"
WORKTREE_PATH=".claude/worktrees/${WT_ID}"
git worktree add -b "codex-work/${WT_ID}" "$WORKTREE_PATH" "$BASE_REF"
CODEX_MODEL_TIER=worker HARNESS_CODEX_PRIMARY_ENV_STATE_FILE="$WORKTREE_PATH/.claude/state/codex-primary-environment.json" \
  bash "${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh" task --write -C "$WORKTREE_PATH" \
  "タスク内容。完了前にこの worktree で exactly one git commit を作成してください。"

# stdin 経由(大きなプロンプト向け)
CODEX_PROMPT=$(mktemp /tmp/codex-prompt-XXXXXX.md)
# タスク内容を書き出し
cat "$CODEX_PROMPT" | CODEX_MODEL_TIER=worker HARNESS_CODEX_PRIMARY_ENV_STATE_FILE="$WORKTREE_PATH/.claude/state/codex-primary-environment.json" \
  bash "${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh" task --write -C "$WORKTREE_PATH"
rm -f "$CODEX_PROMPT"

# Lead review 後に承認されたら range を取り込む
git -C "$WORKTREE_PATH" diff "$BASE_REF..HEAD"
WORKTREE_HEAD="$(git -C "$WORKTREE_PATH" rev-parse HEAD)"
git cherry-pick --no-commit "$BASE_REF..$WORKTREE_HEAD"

companion は App Server Protocol 経由で Codex と通信し、 Job 管理・thread resume・構造化出力を提供する。 結果を検証し、品質基準を満たさない場合は自力で修正。

Breezing モード(4 件以上で自動選択 / --breezing で強制)

Lead / Worker / Advisor / Reviewer の役割分離でチーム実行する。 Codex host の Breezing は resolver result に従う。配布 plugin のフラグなし fallback は claude なので、 spawn_agent, wait_agent, send_input, close_agent を使った Codex native subagent orchestration が互換既定。 --backend cursor / --cursor、または user/project config の HARNESS_IMPL_BACKEND=cursor がある時だけ cursor-companion.sh で Cursor worker に委託する。 古い TeamCreate / TaskCreate ベースの説明は採らない。

権限ポリシー:

  • 現行の shipped default は 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 (resolver result: Codex native spawn_agent / codex-companion / cursor-companion) — 実装担当
├── Advisor (claude-code-harness:advisor) — 方針助言
└── Reviewer (code-reviewer agent) — レビュー担当

Phase A: Pre-delegate(準備):

  1. Plans.md を読み込み、対象タスクを特定
  2. 依存グラフを解析し、実行順序を決定(Depends カラム)
  3. 各タスクの仕様正本 preflight を行い、必要なら docs/spec/00-project-spec.md または既存 spec を実装前に更新
  4. 各タスクの effort スコアリング(effort tier 判定 — high/xhigh)
  5. node "${HARNESS_PLUGIN_ROOT}/scripts/generate-sprint-contract.js"sprint-contract.json を生成
  6. bash "${HARNESS_PLUGIN_ROOT}/scripts/enrich-sprint-contract.sh" で Reviewer 観点を加え、bash "${HARNESS_PLUGIN_ROOT}/scripts/ensure-sprint-contract-ready.sh" で未承認なら停止

Phase B: Delegate(Worker spawn → 必要時 Advisor → レビュー → cherry-pick):

各タスクについて以下を逐次実行する(依存順):

API 注記: 以下は Codex native の subagent API 構文で記述する。 backend=claude の時だけ spawn_agent(...), send_input(...), wait_agent(...), close_agent(...) をそのまま使う。 backend=cursor / codex の時は Worker agent を spawn せず、Lead が companion を直接呼ぶ。 Claude Code 向けのサブエージェント構文やメッセージ送信構文は混ぜない。

for task in execution_order:
    # B-0. backend 解決(配布 fallback は claude、user/project default で cursor 可)
    resolver_backend_arg = ""
    if explicit_backend_value in ["claude", "codex", "cursor"]:
        resolver_backend_arg = "--backend {explicit_backend_value}"
    backend = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/resolve-impl-backend.sh\" {resolver_backend_arg}")
    if explicit_flag == "--cursor":
        backend = "cursor"
    if explicit_flag == "--codex":
        backend = "codex"

    # B-1. sprint-contract を生成
    contract_path = bash("node \"${HARNESS_PLUGIN_ROOT}/scripts/generate-sprint-contract.js\" {task.number}")
    contract_path = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/enrich-sprint-contract.sh\" {contract_path} --check \"DoD を reviewer 観点で確認\" --approve")
    bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/ensure-sprint-contract-ready.sh\" {contract_path}")

    # B-2. Worker 委託(worktree 分離)
    Plans.md: task.status = "cc:WIP"  # 着手時に更新(未着手タスクは cc:TODO のまま)

    if backend == "cursor":
        BASE_REF = git("rev-parse", "HEAD")
        WT_ID = "{task.number}-$(date +%Y%m%d-%H%M%S)-$$"
        worktree_path = ".claude/worktrees/cursor-{WT_ID}"
        worktree_branch = "cursor-work/{WT_ID}"
        bash("mkdir -p .claude/worktrees && git worktree add -b {worktree_branch} {worktree_path} {BASE_REF}")
        print("🚀 cursor / $(bash \"${HARNESS_PLUGIN_ROOT}/scripts/model-routing.sh\" --host cursor --role worker --field model) / {branch} / {task.number}")
        companion_prompt = "{task prompt}\n\nAfter making changes, create exactly one git commit in this worktree before returning."
        companion_output = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/cursor-companion.sh\" task --write --workspace {worktree_path} \"{companion_prompt}\"")
        latest_commit = git("-C", worktree_path, "rev-parse", "HEAD")
        if git("-C", worktree_path, "status", "--porcelain") != "":
            git("-C", worktree_path, "add", "-A")
            git("-C", worktree_path, "-c", "user.name=cursor-composer", "-c", "user.email=cursor-composer@local", "commit", "--no-verify", "-m", "cursor: delegated change")
            latest_commit = git("-C", worktree_path, "rev-parse", "HEAD")
        if latest_commit == BASE_REF:
            raise EscalationError("cursor companion produced no commit")
        worker_result = {type: "companion-result.v1", baseCommit: BASE_REF, commit: latest_commit, worktreePath: worktree_path, branch: worktree_branch, files_changed: git("-C", worktree_path, "diff", "--name-only", "{BASE_REF}..HEAD"), summary: companion_output}
        worker_id = null
    elif backend == "codex":
        BASE_REF = git("rev-parse", "HEAD")
        WT_ID = "{task.number}-$(date +%Y%m%d-%H%M%S)-$$"
        worktree_path = ".claude/worktrees/codex-{WT_ID}"
        worktree_branch = "codex-work/{WT_ID}"
        bash("mkdir -p .claude/worktrees && git worktree add -b {worktree_branch} {worktree_path} {BASE_REF}")
        companion_prompt = "{task prompt}\n\nAfter making changes, create exactly one git commit in this worktree before returning."
        companion_state_file = "{worktree_path}/.claude/state/codex-primary-environment.json"
        companion_output = bash("CODEX_MODEL_TIER=worker HARNESS_CODEX_PRIMARY_ENV_STATE_FILE={companion_state_file} bash \"${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh\" task --write -C {worktree_path} \"{companion_prompt}\"")
        latest_commit = git("-C", worktree_path, "rev-parse", "HEAD")
        if latest_commit == BASE_REF:
            raise EscalationError("codex companion produced no commit")
        worker_result = {type: "companion-result.v1", baseCommit: BASE_REF, commit: latest_commit, worktreePath: worktree_path, branch: worktree_branch, files_changed: git("-C", worktree_path, "diff", "--name-only", "{BASE_REF}..HEAD"), summary: companion_output}
        worker_id = null
    else:
        print("🚀 claude / native-subagent / {branch} / {task.number}")
        worker_id = spawn_agent({
            agent_type: "worker",
            message: "タスク: {task.内容}\nDoD: {task.DoD}\ncontract_path: {contract_path}\nspec_path: {spec_path}\nspec_skip_reason: {spec_skip_reason}\nmode: breezing\n\n作業は分離 worktree で行い、完了後に git commit してください。\n完了時は {commit, worktreePath, branch, files_changed, summary} を返してください。",
            fork_turns: "3"
        })
        worker_result = wait_agent({ targets: [worker_id] })
    # worker_result には {commit, worktreePath, branch, files_changed, summary} が含まれる
    # backend=cursor/codex では Lead が companion stdout を companion-result.v1 に正規化する。

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
3k
Forks
299
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
harness-work
Source
github.com/chachamaru127/claude-code-harness