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. |
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 ã«å§èšïŒæç€ºæã®ã¿ïŒ |
| Cursor host (adapter candidate) | cursor | Task/subagent routing via .cursor/AGENTS.md; not auto-selected |
/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ïŒãšçŽäº€ããã å®è¡ã¢ãŒãããäœã¯ãŒã«ãŒã§ã»ã©ãåå²ããŠåããããæ±ºããã®ã«å¯Ÿããããã¯ãšã³ãã¯ãå®è£ ã®æã誰ãåãããããæ±ºããã
| backend | å®è£ ã®æ ãæ | å§èšã³ãã³ã |
|---|---|---|
claudeïŒæ¢å®ïŒ | Task subagentïŒagents/worker.mdïŒ | Agent tool ã§ 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 ã®ååè¡ > æ¢å®å€ claudeããããžã§ã¯ãèšå®ã¯ãŠãŒã¶ãŒã¹ã³ãŒããäžæžãããã
æç€ºãã©ã°ïŒ--backend / --cursor / --codexïŒã¯ env / file / default ãåžžã«äžæžãããã
ãŠãŒã¶ãŒã 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 ã Claude Worker å
ã®è¿œå agent ãšè§£éãããé claude backend ã®èŠçŽã©ãã Worker agent ãæãŸãã« cursor-companion.sh ãçŽæ¥åŒã¶ã
ããã¯ãšã³ã㯠role-scopedã解決æžã¿ããã¯ãšã³ãã䜿ãã®ã¯å®è£
ïŒworkerïŒããŒã«ã ãã
Reviewer ãš Advisor ã®äž¡ããŒã«ã¯åžžã« brainïŒ--host claudeãOpusïŒã«åºå®ããã
Reviewer ã cursor / codex ããã¯ãšã³ãã« routing ããªãïŒå®è£
ããããã¯ãšã³ããèªåã®åºåãã¬ãã¥ãŒããŠã¯ãªããªãïŒã
# å®è£
ããŒã«ã ã解決æžã¿ backend ã«åŸãïŒäŸ: backend=cursor ãªã composer-2.5-fast ã解決ïŒ
bash "${HARNESS_PLUGIN_ROOT}/scripts/model-routing.sh" --host cursor --role worker --field model
# review / advisor ã¯åžžã« claudeïŒOpusïŒåºå®
bash "${HARNESS_PLUGIN_ROOT}/scripts/model-routing.sh" --host claude --role reviewer --field model
bash "${HARNESS_PLUGIN_ROOT}/scripts/model-routing.sh" --host claude --role advisor --field model
ã¢ãã«åã®æ£æ¬ã¯
model-routing.shåŽãæ¬ããã¥ã¡ã³ãäžã®composer-2.5-fastã¯åç §å€ã§ãããå®éã®è§£æ±ºã¯äžèšã³ãã³ãã«åŸãïŒdrift 鲿¢ïŒã
claude ããã¯ãšã³ãã®ããããžãŒïŒWorker ä»åšãªãïŒbackend ã codex ãŸã㯠cursor ã®å ŽåãLead 㯠Worker agent (claude-code-harness:worker) ã spawn ããªãã
代ããã« Lead èªèº«ã cursor-companion.sh / codex-companion.sh ãçŽæ¥åŒã¶ã
Worker å±€ã®ä»åšã¯ backend=claude ã®ãšãã ãã
é ç·:
| backend | çµè·¯ |
|---|---|
claudeïŒæ¢å®ïŒ | Lead â Worker (claude-code-harness:worker agent) â ⊠â Lead review â cherry-pick |
codex | Lead â codex-companion.sh task --write â Lead review â cherry-pick |
cursor | Lead â cursor-companion.sh task --write --workspace <isolated-wt> â Lead review â cherry-pick |
é claude backend ã§ Worker ãéã«æããšãLead â Worker â companion â composer/codex ãšäºæ®µå§è²ã«ãªããWorker ã®ååšæçŸ©ïŒagent å¥çŽã«ãã self_review 5 ä»¶ã®ã²ãŒãïŒã空åãããïŒé claude ã§ã¯ worker-report.v1 ã self_review ãçæãããªãããïŒãLead 㯠Worker ãã¹ãããã㊠companion ãçŽæ¥åŒã¶ã
é claude backend ã® companion åŒã³åºãã§ããLead ã¯å
ã«å°çš worktree ãäœããcompanion stdout ã companion-result.v1 çžåœã® {baseCommit, commit, worktreePath, branch, files_changed, summary} ã«æ£èŠåããŠããæ¢åã® Lead review / cherry-pick çµè·¯ãžæž¡ããREQUEST_CHANGES æã¯ SendMessage ã䜿ãããåã worktree ã§ cursor-companion.sh / codex-companion.sh ãåå®è¡ããbaseCommit..HEAD ãåã¬ãã¥ãŒã㊠range cherry-pick ããã
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 ãåç
§ã
é claude backend (cursor / codex) ã®åºåã main ã«ãšã蟌ãåã«ãLead 㯠ç®èŠ diff + contract grep ã®äºæ®µã²ãŒããå¿ ãéããç®èŠ diff ã ãã§ APPROVE ããªãã
| ã²ãŒã | ã³ãã³ã | æ€ç¥ã§ãããã® |
|---|---|---|
| diff ç®èŠ | git show <sha> | 倿Žãæå³ã©ãããã»ä»ãã¡ã€ã« touch ãªããã»support tier 衚èšäžå€ã |
| contract grep | bash tests/test-support-claim-wording.sh | å ¬é support 衚èšã®ç Žå£ |
| contract grep | bash scripts/ci/check-consistency.sh | i18n / locale / mirror / capability matrix ã®åºå®æååå¥çŽç Žå£ |
| contract grep | bash tests/validate-plugin.sh | plugin é åžå¥çŽã»hook é ç· |
å š PASS ã®ãšãã ã cherry-pickã1 ä»¶ã§ã fail ãªã revert ãŸã㯠composer ã«åå§èšïŒåäžæååå¥çŽãä¿ã€ããæç€ºïŒã
çç±: docs / README / locale / capability-matrix / spec.md ã«ã¯ grep ã§ç£èŠããã åºå®æååå¥çŽããã (äŸ: README_ja.md ã® 5åè©ã¯ãŒã¯ãããŒ)ãcomposer ã¯è¡šé¢çãªèšèªçéè€ãæ©æ¢°çã«åæžããåŸåããããç®èŠ diff ã§ã¯ã綺éºãª dedupãã«èŠããŠãåºå®å¥ãç Žå£ãããã
| ãªãã·ã§ã³ | 説æ | ããã©ã«ã |
|---|---|---|
all | å šæªå®äºã¿ã¹ã¯ã察象 | - |
N or N-M | ã¿ã¹ã¯çªå·/ç¯å²æå® | - |
--parallel N | 䞊åã¯ãŒã«ãŒæ° | auto |
--sequential | çŽåå®è¡åŒ·å¶ | - |
--codex | Codex CLI ã§å®è£ å§èšïŒæç€ºæã®ã¿ãèªåéžæããªãïŒ | false |
--backend <claude|codex|cursor> | æç€ºããã¯ãšã³ãéžæïŒworker ããŒã«ã®ã¿é©çšãprecedence æäžäœïŒ | claude |
--cursor | cursor backendïŒ--codex ãšåæ§ãæç€ºæã®ã¿ãcursor-agent æªã€ã³ã¹ããŒã«ç°å¢ãããããèªåéžæããªãïŒ | false |
--plan NAME | plans/manifest.json ã® named plan ã䜿ã | active/default |
--no-commit | èªåã³ãããæå¶ | false |
--resume <id|latest> | ååã»ãã·ã§ã³åéãé·ã空ããåŸã¯ /recap 䜵çšãæšå¥š | - |
--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 | Harness åŽã® Auto Mode rollout ãæç€ºãCC 2.1.111 ã§äžèŠã«ãªã£ã --enable-auto-mode ãšã¯å¥ç© | false |
ãŸããã®æ¬æã§å ¥å£ãèªåéžæã忢æ¡ä»¶ã ãã確èªããã 詳现ã¯å¿ èŠã«ãªã£ãæã ãèªãã
| 詳现 | åç § |
|---|---|
| Solo / Parallel / Codex / Breezing ã®å ·äœæé | references/execution-modes.md |
| Codex reviewãReviewer fallbackãAI Residualsãä¿®æ£ã«ãŒã | references/review-loop.md |
| Solo / Breezing å®äºå ±åã®çæ | 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ãæå¹ã«ã㊠ããã³ããããŒã¯ã³ãåæžã§ããã
Prompt Cache (CC 2.1.108+): é·ãã®å®è£ ã
--resumeãå€çšããäœæ¥ã§ã¯ENABLE_PROMPT_CACHING_1H=1ãåªå ããã
/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 ãéžã¶æ¹åŒã«çµ±äžããã
ãã㯠docs/model-routing-policy.mdïŒeffort ã free-text ããæšæž¬ããªãïŒãš
.claude/rules/opus-4-7-prompt-audit.md åæ Œæ¡ä»¶ 5ïŒxhigh ã¯åŒã³åºãåŽãéžã¶ïŒãšæŽåããã
ã¿ã¹ã¯çææã«ä»¥äžã®ã¹ã³ã¢ãåç®ããã
| èŠçŽ | æ¡ä»¶ | ã¹ã³ã¢ |
|---|---|---|
| ãã¡ã€ã«æ° | 倿Žå¯Ÿè±¡ 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 ãäžæ¬åããŠç®¡çïŒã
Worker 㯠Sonnet 4.6 ã®ãã xhigh ã¯å®å¹ high ã«ããŠã³ã°ã¬ãŒããããããtier åŒãäžãèªäœã¯æå¹ïŒdocs/effort-level-policy.mdïŒã
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_non_claude_companion_review_loop(worker_result)
else:
run_native_solo_or_parallel()
def enter_non_claude_companion_review_loop(worker_result):
# companion-result.v1 has no worker_id and no worker_result.self_review.
# Do not use the Worker-only SendMessage/self_review loop for cursor/codex.
latest_commit = worker_result.commit
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 = 0
MAX_REVIEWS = read_contract(contract_path, ".review.max_iterations") or 3
while verdict == "REQUEST_CHANGES" and review_count < MAX_REVIEWS:
previous_commit = latest_commit
if backend == "cursor":
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.\"")
else:
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 backend == "cursor" and 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("{backend} companion retry produced no new commit")
worker_result.commit = latest_commit
worker_result.summary = companion_output
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++
if verdict == "APPROVE":
git cherry-pick --no-commit {worker_result.baseCommit}..{worker_result.commit}
Parallel 㯠task ããšã«ãã® resolver path ãé©çšããã
backend=cursor / codex ã®å Žå㯠native Worker spawn ã䜿ãããtask ããšã« isolated companion worktree ãäœæã㊠companion-result.v1 ã«æ£èŠåããŠãã non-Claude companion å°çšã® range 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ã»æ§é ååºåãæäŸããã çµæãæ€èšŒããåè³ªåºæºãæºãããªãå Žåã¯èªåã§ä¿®æ£ã
Cursor host ã§ã¯ .cursor/AGENTS.md ãš .cursor-plugin/plugin.json ã
bootstrap routeãCursor 㯠candidate ã®ãŸãŸ â supported claim ã¯çŠæ¢ã
.cursor/agents/worker.md subagentModel routing:
bash scripts/model-routing.sh --host cursor --role worker --format json
Explicit Task/subagent model ã routed default ããåªå
ã
æ€èšŒ:
bash tests/test-cursor-adapter-candidate.sh
--breezing ã§åŒ·å¶ïŒLead / Worker / Advisor / Reviewer ã®åœ¹å²åé¢ã§ããŒã å®è¡ããã
Codex ã§ã¯ spawn_agent, wait, send_input, resume_agent, close_agent
ã䜿ã£ã native subagent orchestration ãåæã«ãã
å€ã TeamCreate / TaskCreate ããŒã¹ã®èª¬æãæ¡ããªãã
Cursor ã§ã¯ Task/subagent/background agents ãž mapping ãããã
review/cherry-pick ã®çŽå責å㯠core åŽã«æ®ãïŒadapter smoke targetïŒã
æš©éããªã·ãŒ:
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 "${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 泚èš: 以äžã¯ Claude Code ã® API æ§æã§èšè¿°ã Codex ç°å¢ã§ã¯
Agent(...)âspawn_agent(...),SendMessage(...)âsend_input(...)ã«èªã¿æ¿ãã 詳现ã¯team-composition.mdã® API ãããã³ã°è¡šãåç §ã
for task in execution_order:
# 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 spawnïŒãã©ã¢ã°ã©ãŠã³ããworktree åé¢ïŒ
# Agent tool ã®æ»ãå€ã« agentId ãå«ãŸãã â ä¿®æ£ã«ãŒãã§ SendMessage ã«äœ¿çš
Plans.md: task.status = "cc:WIP" # çææã«æŽæ°ïŒæªçæã¿ã¹ã¯ã¯ cc:TODO ã®ãŸãŸïŒ
# 鿬¡ /harness-work ã飿ããŠããæã universal violations ãäŒæããã
# ïŒååå®è¡æã¯ universal_violations = [] ã§åæåæžã¿æ³å®ïŒ
briefing_header = ""
if universal_violations:
briefing_header = (
"ðš åäžã»ãã·ã§ã³ã§æ¢ã«æ€åºããã universal éåïŒåçºçŠæ¢ïŒ:\n"
+ "\n".join(f"- {v}" for v in universal_violations)
+ "\n\n"
)
worker_result = Agent(
subagent_type="claude-code-harness:worker",
prompt=briefing_header + "ã¿ã¹ã¯: {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 = Advisor(
prompt=worker_result.request_json
)
worker_result = SendMessage(
to=worker_id,
message="advisor-response.v1: {advisor_result}"
)
# B-3.5. self_review ã²ãŒãïŒReviewer spawn åãLead ãæ©æ¢°çã«æ€èšŒïŒ
# Worker ã® worker-report.v1 ã« active self_review rules ãããããå
š verified=true ã〠evidence é空ã§ããããš
# tdd.enforce.enabled=true ã〠tdd_required=true ã®æã¯ `tdd-red-evidence-attached` ã active rule ãšããŠå¿
é
# verified=false ãŸã㯠evidence=="" ã 1 ä»¶ã§ãããã° Reviewer ã spawn ãã Worker ã«å·®ãæ»ã
self_review_failures = 0
MAX_SELF_REVIEW_RETRIES = 2 # 3 åç® (retries=2) ã§ Lead ã escalate
while True:
unverified = [
r for r in worker_result.self_review
if (not r.get("verified")) or (not r.get("evidence"))
]
if not unverified:
break # å
š rule verified â B-4 (å®ã¬ãã¥ãŒ) ãžé²ã
self_review_failures += 1
if self_review_failures > MAX_SELF_REVIEW_RETRIES:
# 3 åç®ã§ãæªç¢ºèªé
ç®ãã â Lead ã« escalate
Plans.md: task.status = "cc:TODO" # çæåã«æ»ã
raise EscalationError(f"self_review ã 3 åã®å·®ãæ»ãã§ãæªç¢ºèª (rules: {[u['rule'] for u in unverified]})")
# Worker ã«å·®ãæ»ã (Reviewer spawn ãã)
SendMessage(
to=worker_id,
message=f"self_review ã«æªç¢ºèª rule ããããŸã: {[u['rule'] for u in unverified]}ãå rule ã® evidence ãå®ã³ãã³ãåºåãŸã㯠literal ãã¹ãçµæã§åããTDD å¿
é æã¯ .claude/state/tdd-red-log/<task-id>.jsonl ãŸã㯠literal failing test output ãæ·»ã㊠verified=true ã«ããŠãã amend ããŠãã ãã"
)
worker_result = wait_for_response(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} && 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 ãŸã§ïŒ
# Worker ã¯ãã©ã¢ã°ã©ãŠã³ãã§å®äºæžã¿ã ããSendMessage ã§åéå¯èœ
# ïŒCC: SendMessage(to: agentId) / Codex: resume_agent(agent_id) + 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:
SendMessage(to=worker_id, message="ææå
容: {issues}\nä¿®æ£ã㊠amend ããŠãã ãã")
# Worker ãä¿®æ£ â amend â æŽæ°ããã commit hash ãè¿ã
updated_result = wait_for_response(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 "${HARNESS_PLUGIN_ROOT}/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 "${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}" --include-untracked 2>/dev/null || echo '{"tool":"review-ai-residuals","scan_mode":"diff","base_ref":null,"include_untracked":true,"files_scanned":[],"untracked_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 åç §ïŒ:
MAX_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 â ããŒãžã§ã³ãã³ãã»ãªãªãŒã¹