with one click
harness-work
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.
Menu
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.
Based on SOC occupation classification
HAR: Multi-angle code, plan, scope review. Security/quality check. Trigger: review, code review, plan review, scope analysis. Do NOT load for: implementation, new features, bugfix, setup, release.
HAR: Multi-angle code, plan, scope review. Security/quality check. Trigger: review, code review, plan review, scope analysis. Do NOT load for: implementation, new features, bugfix, setup, release.
Generic release automation for projects using Keep a Changelog + GitHub. Single confirmation gate then end-to-end automation: bump detection, CHANGELOG promotion, PR/main merge, tag, GitHub Release. Trigger: release, version bump, publish. Do NOT load for: implementation, review, planning, setup.
Generic release automation for projects using Keep a Changelog + GitHub. Single confirmation gate then end-to-end automation: bump detection, CHANGELOG promotion, PR/main merge, tag, GitHub Release. Trigger: release, version bump, publish. Do NOT load for: implementation, review, planning, setup.
HAR: Project init, tool setup, agent config, memory setup, skill mirror sync. Trigger: setup, init, new project, CI/Codex setup, harness-mem, mirror. Do NOT load for: implementation, review, release, planning.
HAR: Project init, tool setup, agent config, memory setup, skill mirror sync. Trigger: setup, init, new project, CI/Codex setup, harness-mem, mirror. Do NOT load for: implementation, review, release, planning.
| name | harness-work |
| description | 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. |
| description-en | 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. |
| description-ja | HAR:Plans.md ã¿ã¹ã¯ã1ä»¶ããå šäžŠåããŒã å®è¡ãŸã§æ åœãå®è£ ããŠãå®è¡ããŠãå šéšãã£ãŠãbreezingãããŒã å®è¡ãparallelãcomposerãã³ã³ããŒã¶ãŒãcomposer 2.5 ã§èµ·åããã©ã³ãã³ã°ã»ã¬ãã¥ãŒã»ãªãªãŒã¹ã»ã»ããã¢ããã«ã¯äœ¿ããªãã |
| kind | workflow |
| purpose | Execute Plans.md tasks end to end through Codex-native tools |
| trigger | implement, execute, do everything, breezing, team run, parallel, composer, composer 2.5, composer mode, ã³ã³ããŒã¶ãŒ |
| shape | workflow |
| role | executor |
| pair | harness-review |
| owner | harness-core |
| since | 2026-05-05 |
| allowed-tools | ["Read","Write","Edit","Grep","Glob","Bash","spawn_agent","send_input","wait_agent","close_agent"] |
| argument-hint | [all] [task-number|range] [--backend claude|codex|cursor] [--cursor] [--codex] [--parallel N] [--no-commit] [--resume id] [--breezing] [--auto-mode] [--tdd-bypass] |
| effort | high |
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 all | breezing | resolved backend ã§ããŒã å®è¡ïŒé åžæ¢å®ã¯ claudeãuser/project default ã§ cursor å¯ïŒ |
harness-work --breezing --backend cursor all | breezing | Cursor worker backend ãæç€ºããŠããŒã å®è¡ |
harness-work --breezing --backend claude all | breezing | Codex native subagent worker ãæç€ºããŠããŒã å®è¡ |
harness-work --breezing | breezing | ããŒã å®è¡ãåŒ·å¶ |
harness-work 3 --plan roadmap | solo | named Plans ã® roadmap ããã¿ã¹ã¯3ãå®è¡ |
æç€ºçãªã¢ãŒããã©ã°ïŒ--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ããã¯ãšã³ãïŒã©ã®ã©ã³ã¿ã€ã ãå®è£ ãããïŒã¯ãããããžãŒïŒå®è¡ã¢ãŒã: solo / parallel / breezingïŒãšçŽäº€ããã ããããžãŒããäœã¯ãŒã«ãŒã§ã»ã©ãåå²ããŠåããããæ±ºããã®ã«å¯Ÿããããã¯ãšã³ãã¯ãå®è£ ã®æã誰ãåãããããæ±ºããã ãã®å¥çŽã¯ host-neutral ã§ããïŒspec.mdãExecution Backend ContractãïŒãCodex host ãã harness ãé§åããŠã Claude Code ããé§åããŠãåãã«æ¯ãèãã
| backend | å®è£ ã®æ ãæ | å§èšã³ãã³ã |
|---|---|---|
claudeïŒglobal fallbackïŒ | Codex native subagentïŒspawn_agent({message, fork_context})ïŒ | spawn_agent ã§ worker ã spawn |
codex | Codex CLI | bash "${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh" task --write "<prompt>" |
cursor | cursor-agentïŒmodel composer-2.5-fastïŒ | bash "${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 鲿¢ïŒã
ãŠãŒã¶ãŒã 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ã解決æžã¿ããã¯ãšã³ãã䜿ãã®ã¯å®è£
ïŒworkerïŒããŒã«ã ãã
Reviewer ãš Advisor ã®äž¡ããŒã«ã¯åžžã« brainïŒ--host claudeãOpusïŒã«åºå®ããã
Reviewer ã cursor / codex ããã¯ãšã³ãã« routing ããªãïŒå®è£
ããããã¯ãšã³ããèªåã®åºåãã¬ãã¥ãŒããŠã¯ãªããªãïŒã
claude ããã¯ãšã³ãã® self_review ã²ãŒãbackend ã codex ãŸã㯠cursor ã®å Žåãworker-report.v1 ã self_review é
åãçæãããªãã
ãã®ãã Lead 㯠self_review ã²ãŒããã¹ãããããLead ã® diff ã¬ãã¥ãŒãå¯äžã®å質ã²ãŒããšããïŒæ¢åã® codex path ãšåãæ±ãïŒã
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 | çŽåå®è¡åŒ·å¶ | - |
--codex | Codex CLI ã§å®è£ å§èšïŒæç€ºæã®ã¿ãèªåéžæããªãïŒ | false |
--backend <claude|codex|cursor> | æç€ºããã¯ãšã³ãéžæïŒworker ããŒã«ã®ã¿é©çšãprecedence æäžäœïŒ | resolver resultïŒæªèšå®æã¯ claudeïŒ |
--cursor | cursor backendïŒ--backend cursor ã®å¥åïŒ | false |
--plan NAME | plans/manifest.json ã® named plan ã䜿ã | active/default |
--no-commit | èªåã³ãããæå¶ | false |
--resume <id|latest> | ååã»ãã·ã§ã³åé | - |
--breezing | Lead/Worker/Reviewer ã®ããŒã å®è¡ | false |
--no-tdd | TDD ãã§ãŒãºã¹ããã | false |
--tdd-bypass | ç·æ¥æã ã TDD 匷å¶ã bypassãHARNESS_TDD_BYPASS_REASON ãŸãã¯æç€ºçç±ã audit ã«æ®ã | false |
--no-simplify | Auto-Refinement ã¹ããã | false |
--auto-mode | Auto Mode rollout ãæç€ºã芪ã»ãã·ã§ã³ã® permission mode ãäºæãªå Žåã®ã¿æ¡çšãæ€èš | false |
ãŸããã®æ¬æã§å ¥å£ãèªåéžæã忢æ¡ä»¶ã ãã確èªããã 詳现ã¯å¿ èŠã«ãªã£ãæã ãèªãã
| 詳现 | åç § |
|---|---|
| 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 ãèªããªãæã¯åæ¢ãããscripts/ ã§ã¯ãªã ${HARNESS_PLUGIN_ROOT}/scripts/ ããåŒã¶ã--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 ã¯ã¢ãã«ã®æšè«åŒ·åºŠãéžã¶æ£åŒãªãããlow(â)/medium(â)/high(â)/xhigh ã® 4 段éã§ã
/effort auto ã§ããã©ã«ãã«ãªã»ããã§ããïŒmax 㯠v2.1.72 ã§å»æ¢ãxhigh ãåŸç¶ïŒã
Opus 4.8 ã§ã¯ thinking ã¯æ¢å® off ã§ãeffort ãæšè«æ·±åºŠã®äž»ã¬ããŒïŒéå»ã®ã©ã® Opus ãã effort ã®åœ±é¿ã倧ããïŒã
ãæµ
ãæšè«ãã芳枬ããã prompt ã§åé¿ãã effort ãäžããã
ãã®ããè€éã¿ã¹ã¯ã®åŒ·å㯠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 ã escalation signal ãšããŠæ±ºããïŒultrathink çã® marker æååã spawn prompt ã« æžããªãïŒã
é©çš lever ã¯æ¬¡ã® 2 ã€ã ã:
/effort: è€éã¿ã¹ã¯ã®ãããã«å
¥ãåã« host ã /effort high / /effort xhigh ãèšå®ããïŒsession åäœã§å¹ã確å®ãª leverïŒãagents/worker.md ã® effortïŒæ¢å® mediumïŒã floorãCC ã® Agent / Task spawn API 㯠per-spawn ã® effort æå®ãå
¬éããªããããworker 1 äœããšã« effort ãäžããæ©æ§ã¯ãªããã¹ã³ã¢ã¯ worker-report.v1 ã® task_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 ã¯ãäœæ¥å¯Ÿè±¡ãããžã§ã¯ãã® 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 ãåæã«ããã
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("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 ã«å
¥ãã
harness-plan create --ci ãèªååŒã³åºã â Plans.md ãçæããŠç¶è¡Plans.md ãæ§ãã©ãŒãããã§ããharness-plan create ã§åçæããŠãã ããã â 忢cc:TODO ã§èªå远èš
git grep / Glob 㧠圱é¿ç¯å²ïŒå€æŽãåã¶ãã¡ã€ã«/ã¢ãžã¥ãŒã«ïŒãæšè«è¡šç€ºdocs/spec/00-project-spec.md, docs/ARCHITECTURE.md, docs/HANDOFF.md, docs/oem/PROJECT_COMPASS.md, docs/specs/ïŒdocs/spec/00-project-spec.md ãäœãspec_path ãŸã㯠spec_skip_reason ãå«ããcc:WIP ã«æŽæ°[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=1 ãš HARNESS_TDD_BYPASS_REASON="<çç±>" ãæç€ºããTDD ãçç¥ããçç±ã sprint-contract / worker-report ã«æ®ãnode "${HARNESS_PLUGIN_ROOT}/scripts/generate-sprint-contract.js" <task-id> ã§ sprint-contract.json ãçæbash "${HARNESS_PLUGIN_ROOT}/scripts/enrich-sprint-contract.sh" ã§å ããbash "${HARNESS_PLUGIN_ROOT}/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 åclaude: local / native Read/Write/Edit/Bash path ã§å®è£
cursor / codex: äžèš companion worktree path ã§å®è£
ããcompanion-result.v1 ãå
±é review loop ã«æž¡ã/simplify ã§ Auto-RefinementïŒ--no-simplify ã§çç¥å¯ïŒsprint-contract.json ã® reviewer_profile ã runtime ã®å Žå㯠bash "${HARNESS_PLUGIN_ROOT}/scripts/run-contract-review-checks.sh" ãå®è¡MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3ïŒbash "${HARNESS_PLUGIN_ROOT}/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 ã§åé¢ã
å 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-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"
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" | 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 ã§åŒ·å¶ïŒ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 ããŒã¹ã®èª¬æã¯æ¡ããªãã
æš©éããªã·ãŒ:
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ïŒæºåïŒ:
docs/spec/00-project-spec.md ãŸãã¯æ¢å spec ãå®è£
åã«æŽæ°node "${HARNESS_PLUGIN_ROOT}/scripts/generate-sprint-contract.js" ã§ sprint-contract.json ãçæ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("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({
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_context: true
})
worker_result = wait_agent({ targets: [worker_id] })
# worker_result ã«ã¯ {commit, worktreePath, branch, files_changed, summary} ãå«ãŸãã
# backend=cursor/codex ã§ã¯ Lead ã companion stdout ã companion-result.v1 ã«æ£èŠåããã
# B-3. Worker ã advice request ãè¿ããæã ããLead ã Advisor ãåŒã¶
if backend == "claude" and worker_result.type == "advisor-request.v1":
advisor_id = spawn_agent({
message: worker_result.request_json,
agent_type: "default",
fork_context: true
})
advisor_result = wait_agent({ targets: [advisor_id] })
close_agent({ target: advisor_id })
send_input({
target: worker_id,
message: "advisor-response.v1: {advisor_result}"
})
worker_result = wait_agent({ targets: [worker_id] })
# B-4. Lead ãã¬ãã¥ãŒå®è¡ïŒCodex exec åªå
ïŒ
if backend == "claude":
diff_text = git("-C", worker_result.worktreePath, "show", worker_result.commit)
else:
diff_text = git("-C", worker_result.worktreePath, "diff", "{worker_result.baseCommit}..HEAD")
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} && bash \"${HARNESS_PLUGIN_ROOT}/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("bash \"${HARNESS_PLUGIN_ROOT}/scripts/generate-browser-review-artifact.sh\" {contract_path}")
browser_result = bash("bash \"${HARNESS_PLUGIN_ROOT}/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("bash \"${HARNESS_PLUGIN_ROOT}/scripts/write-review-result.sh\" {review_input} {latest_commit} --browser-result {browser_result}")
# B-5. ä¿®æ£ã«ãŒãïŒREQUEST_CHANGES æãcontract ã® max_iterations ãŸã§ïŒ
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:
if backend == "claude":
send_input({
target: worker_id,
message: "ææå
容: {issues}\nä¿®æ£ã㊠amend ããŠãã ãã"
})
# Worker ãä¿®æ£ â amend â æŽæ°ããã commit hash ãè¿ã
updated_result = wait_agent({ targets: [worker_id] })
latest_commit = updated_result.commit
elif backend == "cursor":
previous_commit = latest_commit
companion_output = bash("bash \"${HARNESS_PLUGIN_ROOT}/scripts/cursor-companion.sh\" task --write --workspace {worker_result.worktreePath} \"Review findings:\n{issues}\n\nFix the findings and commit the result.\"")
latest_commit = git("-C", worker_result.worktreePath, "rev-parse", "HEAD")
if git("-C", worker_result.worktreePath, "status", "--porcelain") != "":
git("-C", worker_result.worktreePath, "add", "-A")
git("-C", worker_result.worktreePath, "-c", "user.name=cursor-composer", "-c", "user.email=cursor-composer@local", "commit", "--no-verify", "-m", "cursor: review fix")
latest_commit = git("-C", worker_result.worktreePath, "rev-parse", "HEAD")
if latest_commit == previous_commit:
raise EscalationError("cursor companion retry produced no new commit")
worker_result.commit = latest_commit
worker_result.summary = companion_output
else:
previous_commit = latest_commit
companion_state_file = "{worker_result.worktreePath}/.claude/state/codex-primary-environment.json"
companion_output = bash("HARNESS_CODEX_PRIMARY_ENV_STATE_FILE={companion_state_file} bash \"${HARNESS_PLUGIN_ROOT}/scripts/codex-companion.sh\" task --write -C {worker_result.worktreePath} \"Review findings:\n{issues}\n\nFix the findings and commit the result.\"")
latest_commit = git("-C", worker_result.worktreePath, "rev-parse", "HEAD")
if latest_commit == previous_commit:
raise EscalationError("codex companion retry produced no new commit")
worker_result.commit = latest_commit
worker_result.summary = companion_output
if backend == "claude":
diff_text = git("-C", worker_result.worktreePath, "show", latest_commit)
else:
diff_text = git("-C", worker_result.worktreePath, "diff", "{worker_result.baseCommit}..HEAD")
verdict = codex_exec_review(diff_text) or reviewer_agent_review(diff_text)
review_count++
# B-6. Worker çµäº
if backend == "claude":
close_agent({ target: worker_id })
# B-7. 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:
if backend == "claude":
git cherry-pick --no-commit {latest_commit} # feature branch â trunk
else:
git cherry-pick --no-commit {worker_result.baseCommit}..{latest_commit} # companion range â 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 "${HARNESS_PLUGIN_ROOT}/scripts/auto-checkpoint.sh" \
"${task.number}" "${HASH}" "${contract_path}" "${REVIEW_RESULT_PATH}" \
|| true # fail-open: harness-mem æªèµ·åç°å¢ã§ãç¶ç¶
else:
â ãŠãŒã¶ãŒã«ãšã¹ã«ã¬ãŒã·ã§ã³
# B-8. 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 "${HARNESS_PLUGIN_ROOT}/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 "${HARNESS_PLUGIN_ROOT}/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 ã¹ãã£ã³ã¯åŒãç¶ã bash "${HARNESS_PLUGIN_ROOT}/scripts/review-ai-residuals.sh" ã§å®è¡ãã
companion review ã®çµæãšåãããŠæçµ verdict ãå€å®ããã
# AI Residuals ã¹ãã£ã³ïŒcompanion review ãšäžŠè¡å®è¡å¯èœïŒ
AI_RESIDUALS_JSON="$(bash "${HARNESS_PLUGIN_ROOT}/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"
prompt: "以äžã®å€æŽãã¬ãã¥ãŒããŠãã ãããå€å®åºæº: critical/major â REQUEST_CHANGESãminor/recommendation ã®ã¿ â APPROVEãdiff: {git diff ${BASE_REF}}"
Reviewer agent 㯠Read-onlyïŒWrite/Edit/Bash ç¡å¹ïŒã§å®å šã«ã¬ãã¥ãŒãå®è¡ããã
review_count = 0
# sprint-contract ãååšãããšãã®ã¿ max_iterations ãèªããååšããªãå Žå㯠3ïŒåŸæ¹äºæïŒ
contract_path = get_sprint_contract_path() # äŸ: .claude/state/contracts/<task-id>.sprint-contract.json
MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3
while verdict == "REQUEST_CHANGES" and review_count < MAX_REVIEWS:
1. ã¬ãã¥ãŒææãè§£æïŒcritical / major ã®ã¿å¯Ÿè±¡ïŒ
2. åææã«å¯ŸããŠä¿®æ£ãå®è£
3. å床ã¬ãã¥ãŒãå®è¡ïŒåãå€å®åºæºã»åãåªå
é äœïŒ
review_count++
if review_count >= MAX_REVIEWS and verdict != "APPROVE":
â ãŠãŒã¶ãŒã«ãšã¹ã«ã¬ãŒã·ã§ã³
â ãMAX_REVIEWS åä¿®æ£ããŸããã以äžã® critical/major ææãæ®ã£ãŠããŸãã+ ææäžèЧã衚瀺
â ãŠãŒã¶ãŒå€æãåŸ
ã€ïŒç¶è¡ / äžæïŒ
Breezing ã¢ãŒãã§ã¯ Lead ãã¬ãã¥ãŒã«ãŒããå®è¡ããïŒäžèš Phase B åç §ïŒ:
send_input ã§ Worker ã«ä¿®æ£æç€ºããwait_agent ã§åå¿çãåŸ
〠â Worker ã amendMAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3 åãŸã§ïŒcc:å®äº [{hash}] ã«æŽæ°ã¿ã¹ã¯å®äºæïŒcc:å®äº + commit åŸïŒã«èªååºåãããèŠèŠçãµããªã
éå°éå®¶ã«ã倿Žå
容ãšåœ±é¿ãäŒããããšãç®çãšããã
âââââââââââââââââââââââââââââââââââââââââââââââ
â â Task {N} å®äº: {ã¿ã¹ã¯å} â
âââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â â äœãããã â
â ⢠{倿Žå
容 1} â
â ⢠{倿Žå
容 2} â
â â
â â äœãå€ããã â
â Before: {æ§åäœ} â
â After: {æ°åäœ} â
â â
â â 倿Žãã¡ã€ã« ({N} files) â
â {ãã¡ã€ã«ãã¹ 1} â
â {ãã¡ã€ã«ãã¹ 2} â
â â
â â æ®ãã®èª²é¡ â
â ⢠Task {X} ({status}): {å
容} â Plans.md â
â ⢠Task {Y} ({status}): {å
容} â Plans.md â
â ïŒPlans.md ã« {M} ä»¶ã®æªå®äºã¿ã¹ã¯ããïŒ â
â â
â commit: {hash} | review: {APPROVE} â
âââââââââââââââââââââââââââââââââââââââââââââââ
git diff --stat HEAD~1 ãš commit message ããèªåæœåºãæè¡çšèªã¯æå°éã«ããåè©ã§å§ããgit diff --name-only HEAD~1 ããååŸã5 ãã¡ã€ã«è¶
ã¯çç¥ããŠä»¶æ°è¡šç€ºcc:TODO / cc:WIP ã¿ã¹ã¯ãäžèŠ§è¡šç€ºãPlans.md ã«èšèŒæžã¿ãã©ãããæç€º--parallel åŒ·å¶æïŒ: Solo ãã³ãã¬ãŒãã䜿çšå šã¿ã¹ã¯å®äºåŸã«ãŸãšããŠåºåãåã¿ã¹ã¯ã¯ç°¡ç¥çïŒäœãããã + commit hash ã®ã¿ïŒã§äžèЧãã æåŸã«å šäœãµããªïŒåèšå€æŽãã¡ã€ã«æ° + æ®ã課é¡ïŒãåºåãã:
âââââââââââââââââââââââââââââââââââââââââââââââ
â â Breezing å®äº: {N}/{M} ã¿ã¹ã¯ â
âââââââââââââââââââââââââââââââââââââââââââââââ€
â â
â 1. â {ã¿ã¹ã¯å 1} [{hash1}] â
â 2. â {ã¿ã¹ã¯å 2} [{hash2}] â
â 3. â {ã¿ã¹ã¯å 3} [{hash3}] â
â â
â â å
šäœã®å€æŽ â
â {N} files changed, {A} insertions(+), â
â {D} deletions(-) â
â â
â â æ®ãã®èª²é¡ â
â Plans.md ã« {K} ä»¶ã®æªå®äºã¿ã¹ã¯ãã â
â ⢠Task {X}: {å
容} â
â â
âââââââââââââââââââââââââââââââââââââââââââââââ
harness-plan â å®è¡ããã¿ã¹ã¯ãèšç»ããharness-sync â å®è£
ãš Plans.md ãåæããharness-review â å®è£
ã®ã¬ãã¥ãŒharness-release â ããŒãžã§ã³ãã³ãã»ãªãªãŒã¹