From 9911da738be72bc85ca42de85383c18fb19940cf Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 3 Nov 2026 02:13:00 +0000 Subject: [PATCH 1/5] captain docs: plan-first rule matches R65 (no plan review for bug fixes) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- captain/SKILL.md | 5 ++++- captain/SKILL.md.tmpl | 5 ++++- captain/templates/CREW.md | 5 +++-- captain/templates/brief.md | 6 ++---- capy/skill/gstack/SKILL.md | 2 +- changelog.d/gsta258-row8-plan-wording.md | 1 + docs/captain.md | 8 +++++--- test/captain-skill.test.ts | 10 ++++++---- 8 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 changelog.d/gsta258-row8-plan-wording.md diff --git a/captain/SKILL.md b/captain/SKILL.md index 776349ddb..b2cae3996 100644 --- a/captain/SKILL.md +++ b/captain/SKILL.md @@ -374,7 +374,10 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt; every other fix gets a one-round, eng-only plan. The brief a +list are exempt. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, +R65), and its PR carries the proof: a repro on current main or a failing test written +first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and +the draft code together. The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl index 1a5fb0e40..485b5edf5 100644 --- a/captain/SKILL.md.tmpl +++ b/captain/SKILL.md.tmpl @@ -302,7 +302,10 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt; every other fix gets a one-round, eng-only plan. The brief a +list are exempt. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, +R65), and its PR carries the proof: a repro on current main or a failing test written +first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and +the draft code together. The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/templates/CREW.md b/captain/templates/CREW.md index 1d0165ae5..26dd7e3b3 100644 --- a/captain/templates/CREW.md +++ b/captain/templates/CREW.md @@ -135,8 +135,9 @@ Homes are paths in the gstack checkout the lane checked at session start. import --autoplan`. New scope taken on part-way gets the same. Exempt: read-only lanes, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (broken install or upgrade, red main, - a security bug) and fixes from an already-diagnosed, audited problem list; every - other fix gets a one-round, eng-only plan. Home: `docs/captain.md` (Plan before build), + a security bug) and fixes from an already-diagnosed, audited problem list. Any other + bug fix gets no plan review (`gstack-autoplan next --kind fix`, R65) and carries its + proof in the PR; a feature gets the lean run (`--kind feature`). Home: `docs/captain.md` (Plan before build), `captain/templates/brief.md`. ## Crew-specific rules diff --git a/captain/templates/brief.md b/captain/templates/brief.md index 6af25e7cd..7aa8b7abd 100644 --- a/captain/templates/brief.md +++ b/captain/templates/brief.md @@ -17,10 +17,8 @@ Spend cap: set, run dir under ~/.capy/work). Write the plan with its ## ELI5, ## Before → after, ## Why it matters, ## What caused this work, ## Big decisions and ## Implementation plan sections, then run gstack-autoplan next --out --plan - sized to this brief (a fix: --no-ui --no-dx --max-rounds 1 --estimate-usd - --spend-cap , then close the CEO phase before dispatching its voices with - gstack-autoplan close --out --phase ceo --deferred "eng-only fix plan" - --by agent:). + sized to this brief (a feature: --kind feature, the lean run with one reviewer over + the plan and the draft code; a bug fix needs no plan run, see Plan: exempt). At the gate send me the output of gstack-owner-brief render --captain --out whole, as a needs-you report. Build nothing yet. diff --git a/capy/skill/gstack/SKILL.md b/capy/skill/gstack/SKILL.md index ad8c801bf..a00712271 100644 --- a/capy/skill/gstack/SKILL.md +++ b/capy/skill/gstack/SKILL.md @@ -58,7 +58,7 @@ Every Capy thread that uses gstack follows these for new work, under a Captain o - **Stop a finished /ship subagent.** When a /ship subagent opens its PR, the parent subscribes to that PR with Capy's subscribe tool and keeps that one subscription until the PR merges or closes, re-subscribing if the watch expires, then cancels it. Once the subscription is in place and READY arrives, the parent stops the subagent and owns the PR from then on, slot stamp, re-READY and receipt carry included. A stopped /ship subagent woken by a check, review or merge notice, not by its parent, reports one line naming what woke it, its pin and the PR head (`gh pr view --json headRefOid --jq .headRefOid`) and ends the turn without acting, whether or not the head moved. A message from its parent is an instruction it carries out. - **No merge without the owner's word.** A thread never merges on its own; under a Captain the controller merges on a recorded standing approval, and a thread with no Captain asks the person. -Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Every other fix gets a one-round, eng-only plan. +Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, R65), and its PR carries the proof: a repro on current main or a failing test written first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and the draft code together. ## Working under a Captain diff --git a/changelog.d/gsta258-row8-plan-wording.md b/changelog.d/gsta258-row8-plan-wording.md new file mode 100644 index 000000000..b095189bf --- /dev/null +++ b/changelog.d/gsta258-row8-plan-wording.md @@ -0,0 +1 @@ +- **The plan-first rule now matches R65.** The captain skill, the CREW template, the lane brief, docs/captain.md and the Capy gstack skill no longer tell a lane that every fix needs a one-round, eng-only plan. A bug fix gets no plan review (`gstack-autoplan next --kind fix`), and its PR carries the proof: a repro on current main or a failing test written first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and the draft code together. The S1 and audited-problem-list exemptions are unchanged. diff --git a/docs/captain.md b/docs/captain.md index b09778c50..0dae70094 100644 --- a/docs/captain.md +++ b/docs/captain.md @@ -183,9 +183,11 @@ flaky pass's repairs, slot stamps, CHANGELOG-only conflict resolves and a size o cap re-pinned under the controller's written grant need no plan. Two kinds of fix are exempt too: an S1 emergency (a broken install or upgrade, a red main, a security bug), and a fix from a problem list that was already diagnosed and audited, where that list is the plan. -Every other fix, a one-line bug fix included, gets a one-round, eng-only plan: the short -run above, with the CEO phase closed before its voices are dispatched -(`gstack-autoplan close --out --phase ceo --deferred "eng-only fix plan" --by agent:`). +Any other bug fix gets no plan review (R65): `gstack-autoplan next --kind fix` prints +`AUTOPLAN: not needed (bug fix; R65)` and writes nothing, and the PR carries the bug's +proof, a repro on current main or a failing test written first. A feature gets the lean +run, `--kind feature`: one reviewer reading the plan and the draft code together, one gate +revision and no carry check (docs/unattended.md). `--full` brings back the full run. A crew may add exemptions in its rules file with the owner's words and date; it does not remove these. The brief says which applies, `Plan: required | approved: | exempt: `, so an diff --git a/test/captain-skill.test.ts b/test/captain-skill.test.ts index 60d21a1f7..a3f758f8b 100644 --- a/test/captain-skill.test.ts +++ b/test/captain-skill.test.ts @@ -81,15 +81,17 @@ describe('/captain skill', () => { expect(read('captain/templates/automation-flaky-pass.md')).toContain('never merge'); }); - test('every copy of the plan-first exemptions names the two fix exemptions and the eng-only plan for every other fix', () => { + test('every copy of the plan-first exemptions names the two fix exemptions and the R65 no-review rule for other bug fixes', () => { for (const rel of ['docs/captain.md', 'captain/SKILL.md', 'captain/templates/CREW.md', 'capy/skill/gstack/SKILL.md']) { const text = read(rel).replace(/\s+/g, ' '); expect(text, rel).toMatch(/S1 emergenc(?:y|ies) \(a? ?broken install or upgrade, a? ?red main, a security bug\)/); expect(text, rel).toMatch(/already[- ]diagnosed,? (?:and )?audited problem list|problem list that was already diagnosed and audited/); - expect(text, rel).toContain('one-round, eng-only plan'); + expect(text, rel).toContain('gstack-autoplan next --kind fix'); + expect(text, rel).toContain('--kind feature'); + expect(text, rel).not.toContain('one-round, eng-only plan'); } - expect(read('docs/captain.md')).toContain('gstack-autoplan close --out --phase ceo --deferred'); - expect(read('captain/templates/brief.md').replace(/\s+/g, ' ')).toContain('gstack-autoplan close --out --phase ceo --deferred'); + expect(read('docs/captain.md')).toContain('AUTOPLAN: not needed (bug fix; R65)'); + expect(read('captain/templates/brief.md').replace(/\s+/g, ' ')).toContain('--kind feature'); }); test('is generic: parameters, not one crew\'s codes, names or repository', () => { From 4ddc0e418b9e49412b29adddf990b22b32efc722 Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 3 Nov 2026 02:17:43 +0000 Subject: [PATCH 2/5] captain docs: trim plan-first wording under the context-budget ceilings The eager-loaded captain and Capy gstack skills grew past their context-budget ratchet ceilings (captain 6576 > 6551, capy/skill/gstack 5367 > 5315). Shorten the sentence in both, drop the duplicate bug-fix clause from the Capy skill's Plan first bullet, and remove the stale 'short run, not no run' clause from docs/captain.md that contradicted the new rule. The test now asks each copy for --kind fix and --kind feature. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- captain/SKILL.md | 6 ++---- captain/SKILL.md.tmpl | 6 ++---- capy/skill/gstack/SKILL.md | 4 ++-- docs/captain.md | 3 +-- test/captain-skill.test.ts | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/captain/SKILL.md b/captain/SKILL.md index b2cae3996..e40d72c10 100644 --- a/captain/SKILL.md +++ b/captain/SKILL.md @@ -374,10 +374,8 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, -R65), and its PR carries the proof: a repro on current main or a failing test written -first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and -the draft code together. The brief a +list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry their +proof; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl index 485b5edf5..bf68d1180 100644 --- a/captain/SKILL.md.tmpl +++ b/captain/SKILL.md.tmpl @@ -302,10 +302,8 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, -R65), and its PR carries the proof: a repro on current main or a failing test written -first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and -the draft code together. The brief a +list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry their +proof; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/capy/skill/gstack/SKILL.md b/capy/skill/gstack/SKILL.md index a00712271..3fe6230c5 100644 --- a/capy/skill/gstack/SKILL.md +++ b/capy/skill/gstack/SKILL.md @@ -52,13 +52,13 @@ Token caps on /ship: pass a brief's cap as `--token-cap `. /ship reads `cost. Every Capy thread that uses gstack follows these for new work, under a Captain or on its own. The rule in full is `docs/captain.md`, "Plan before build"; the lane side is section 3 of captain.md in this folder. -- **Plan first.** Run `/autoplan` on new functionality right after the install check. A bug fix needs none (`gstack-autoplan next --kind fix`), just a repro or failing test in the PR. A feature gets the lean run (the Capy default), one reviewer over plan and draft code; `--full` adds every phase. +- **Plan first.** Run `/autoplan` on new functionality right after the install check. The lean run (the Capy default) is one reviewer over plan and draft code; `--full` adds every phase. - **ELI5, then the word.** Send the plan and gate to the person, or the Captain, in plain language: `gstack-owner-brief render --captain --out --captain-name ""`, its choices as lettered lines in the ask format (`docs/captain.md`) and "do it" taking every recommendation at full scope. Build only after their word is answered into the run and it reports `APPROVED`; then `gstack-approvals import --autoplan --by ""`. - **/ship before ready.** Run /ship at the final pushed head before a PR is called ready; `SHIP_RECEIPT: pr= head=` must name that head, and a later push needs a new /ship. The review inside /ship, like the autoplan, is sized to the change. - **Stop a finished /ship subagent.** When a /ship subagent opens its PR, the parent subscribes to that PR with Capy's subscribe tool and keeps that one subscription until the PR merges or closes, re-subscribing if the watch expires, then cancels it. Once the subscription is in place and READY arrives, the parent stops the subagent and owns the PR from then on, slot stamp, re-READY and receipt carry included. A stopped /ship subagent woken by a check, review or merge notice, not by its parent, reports one line naming what woke it, its pin and the PR head (`gh pr view --json headRefOid --jq .headRefOid`) and ends the turn without acting, whether or not the head moved. A message from its parent is an instruction it carries out. - **No merge without the owner's word.** A thread never merges on its own; under a Captain the controller merges on a recorded standing approval, and a thread with no Captain asks the person. -Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Any other bug fix gets no plan review (`gstack-autoplan next --kind fix`, R65), and its PR carries the proof: a repro on current main or a failing test written first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and the draft code together. +Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Other bug fixes skip plan review (`--kind fix`, R65) but carry their proof; features get the lean run (`--kind feature`). ## Working under a Captain diff --git a/docs/captain.md b/docs/captain.md index 0dae70094..dd40fb2bb 100644 --- a/docs/captain.md +++ b/docs/captain.md @@ -136,8 +136,7 @@ alone is not an ask. A lane that builds something plans first. Its first act after the session-start install check, before any product code, is a `/autoplan` run on its brief, sized to the work. The phases run in order, CEO, then design, then DX, then eng, with design and DX only when the -scope has them, and a fix the exemptions below don't cover gets a short run (`--no-ui --no-dx --max-rounds 1`, with -`--estimate-usd` set so a small `--spend-cap` still seats its attempts), not no run. On Capy the +scope has them. A bug fix gets no plan review and a feature gets the lean run (both below). On Capy the unattended loop is `autoplan/DRIVER.md` in the gstack checkout. New functionality a lane takes on part-way, scope its brief did not name, gets its own plan and its own ask before the lane builds it. In the rules file this is rule 24 of the diff --git a/test/captain-skill.test.ts b/test/captain-skill.test.ts index a3f758f8b..8eb9ee154 100644 --- a/test/captain-skill.test.ts +++ b/test/captain-skill.test.ts @@ -86,7 +86,7 @@ describe('/captain skill', () => { const text = read(rel).replace(/\s+/g, ' '); expect(text, rel).toMatch(/S1 emergenc(?:y|ies) \(a? ?broken install or upgrade, a? ?red main, a security bug\)/); expect(text, rel).toMatch(/already[- ]diagnosed,? (?:and )?audited problem list|problem list that was already diagnosed and audited/); - expect(text, rel).toContain('gstack-autoplan next --kind fix'); + expect(text, rel).toContain('--kind fix'); expect(text, rel).toContain('--kind feature'); expect(text, rel).not.toContain('one-round, eng-only plan'); } From caa17fccc0f9459f27bf01a5c67bfca16ecdffbb Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 3 Nov 2026 02:26:15 +0000 Subject: [PATCH 3/5] fix: pre-landing review fixes (plain bug fixes are exempt, proof is a repro or failing test) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- captain/SKILL.md | 4 ++-- captain/SKILL.md.tmpl | 4 ++-- captain/templates/CREW.md | 4 ++-- captain/templates/brief.md | 2 +- capy/skill/gstack/SKILL.md | 2 +- docs/captain.md | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/captain/SKILL.md b/captain/SKILL.md index e40d72c10..e8e988f11 100644 --- a/captain/SKILL.md +++ b/captain/SKILL.md @@ -374,8 +374,8 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry their -proof; features get the lean run (`--kind feature`). The brief a +list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro +or failing test; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl index bf68d1180..9c5d13804 100644 --- a/captain/SKILL.md.tmpl +++ b/captain/SKILL.md.tmpl @@ -302,8 +302,8 @@ lane builds only after the owner's word is answered into the run and it reports New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's repairs, slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem -list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry their -proof; features get the lean run (`--kind feature`). The brief a +list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro +or failing test; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/templates/CREW.md b/captain/templates/CREW.md index 26dd7e3b3..1b440fc06 100644 --- a/captain/templates/CREW.md +++ b/captain/templates/CREW.md @@ -136,8 +136,8 @@ Homes are paths in the gstack checkout the lane checked at session start. lanes, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem list. Any other - bug fix gets no plan review (`gstack-autoplan next --kind fix`, R65) and carries its - proof in the PR; a feature gets the lean run (`--kind feature`). Home: `docs/captain.md` (Plan before build), + bug fix is exempt too (`gstack-autoplan next --kind fix`, R65) and carries a repro or + failing test in the PR; a feature gets the lean run (`--kind feature`). Home: `docs/captain.md` (Plan before build), `captain/templates/brief.md`. ## Crew-specific rules diff --git a/captain/templates/brief.md b/captain/templates/brief.md index 7aa8b7abd..6dd212cfd 100644 --- a/captain/templates/brief.md +++ b/captain/templates/brief.md @@ -18,7 +18,7 @@ Spend cap: ## Why it matters, ## What caused this work, ## Big decisions and ## Implementation plan sections, then run gstack-autoplan next --out --plan sized to this brief (a feature: --kind feature, the lean run with one reviewer over - the plan and the draft code; a bug fix needs no plan run, see Plan: exempt). + the plan and the draft code; a bug fix needs no plan run: Plan: exempt: bug fix (R65)). At the gate send me the output of gstack-owner-brief render --captain --out whole, as a needs-you report. Build nothing yet. diff --git a/capy/skill/gstack/SKILL.md b/capy/skill/gstack/SKILL.md index 3fe6230c5..a9c56d4d2 100644 --- a/capy/skill/gstack/SKILL.md +++ b/capy/skill/gstack/SKILL.md @@ -58,7 +58,7 @@ Every Capy thread that uses gstack follows these for new work, under a Captain o - **Stop a finished /ship subagent.** When a /ship subagent opens its PR, the parent subscribes to that PR with Capy's subscribe tool and keeps that one subscription until the PR merges or closes, re-subscribing if the watch expires, then cancels it. Once the subscription is in place and READY arrives, the parent stops the subagent and owns the PR from then on, slot stamp, re-READY and receipt carry included. A stopped /ship subagent woken by a check, review or merge notice, not by its parent, reports one line naming what woke it, its pin and the PR head (`gh pr view --json headRefOid --jq .headRefOid`) and ends the turn without acting, whether or not the head moved. A message from its parent is an instruction it carries out. - **No merge without the owner's word.** A thread never merges on its own; under a Captain the controller merges on a recorded standing approval, and a thread with no Captain asks the person. -Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Other bug fixes skip plan review (`--kind fix`, R65) but carry their proof; features get the lean run (`--kind feature`). +Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro or failing test; features get the lean run (`--kind feature`). ## Working under a Captain diff --git a/docs/captain.md b/docs/captain.md index dd40fb2bb..f7127194f 100644 --- a/docs/captain.md +++ b/docs/captain.md @@ -135,7 +135,7 @@ alone is not an ask. A lane that builds something plans first. Its first act after the session-start install check, before any product code, is a `/autoplan` run on its brief, sized to the work. The -phases run in order, CEO, then design, then DX, then eng, with design and DX only when the +full run's phases run in order, CEO, then design, then DX, then eng, with design and DX only when the scope has them. A bug fix gets no plan review and a feature gets the lean run (both below). On Capy the unattended loop is `autoplan/DRIVER.md` in the gstack checkout. New functionality a lane takes on part-way, scope its brief did not name, gets its own plan and its own ask before @@ -182,7 +182,7 @@ flaky pass's repairs, slot stamps, CHANGELOG-only conflict resolves and a size o cap re-pinned under the controller's written grant need no plan. Two kinds of fix are exempt too: an S1 emergency (a broken install or upgrade, a red main, a security bug), and a fix from a problem list that was already diagnosed and audited, where that list is the plan. -Any other bug fix gets no plan review (R65): `gstack-autoplan next --kind fix` prints +Any other bug fix is exempt too (R65; the brief's reason is `bug fix (R65)`): `gstack-autoplan next --kind fix` prints `AUTOPLAN: not needed (bug fix; R65)` and writes nothing, and the PR carries the bug's proof, a repro on current main or a failing test written first. A feature gets the lean run, `--kind feature`: one reviewer reading the plan and the draft code together, one gate From 5ecc503b4206299c6b3c120b157af58a4e131190 Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 3 Nov 2026 02:34:12 +0000 Subject: [PATCH 4/5] fix: pre-landing review fixes (proof is a repro on current main or a failing test written first) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- captain/SKILL.md | 2 +- captain/SKILL.md.tmpl | 2 +- captain/templates/CREW.md | 4 ++-- capy/skill/gstack/SKILL.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/captain/SKILL.md b/captain/SKILL.md index e8e988f11..897b7b312 100644 --- a/captain/SKILL.md +++ b/captain/SKILL.md @@ -375,7 +375,7 @@ New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro -or failing test; features get the lean run (`--kind feature`). The brief a +on current main or a failing test written first; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl index 9c5d13804..b234f7d31 100644 --- a/captain/SKILL.md.tmpl +++ b/captain/SKILL.md.tmpl @@ -303,7 +303,7 @@ New scope taken on part-way gets its own plan. Read-only lanes, the flaky pass's slot stamps, CHANGELOG resolves, cap re-pins under a grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem list are exempt. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro -or failing test; features get the lean run (`--kind feature`). The brief a +on current main or a failing test written first; features get the lean run (`--kind feature`). The brief a controller hands a lane, with its `Plan: required | approved | exempt` line, is `captain/templates/brief.md`; the rule is `docs/captain.md` (Plan before build). diff --git a/captain/templates/CREW.md b/captain/templates/CREW.md index 1b440fc06..fb6ac2fda 100644 --- a/captain/templates/CREW.md +++ b/captain/templates/CREW.md @@ -136,8 +136,8 @@ Homes are paths in the gstack checkout the lane checked at session start. lanes, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (broken install or upgrade, red main, a security bug) and fixes from an already-diagnosed, audited problem list. Any other - bug fix is exempt too (`gstack-autoplan next --kind fix`, R65) and carries a repro or - failing test in the PR; a feature gets the lean run (`--kind feature`). Home: `docs/captain.md` (Plan before build), + bug fix is exempt too (`gstack-autoplan next --kind fix`, R65) and carries a repro on + current main or a failing test written first in the PR; a feature gets the lean run (`--kind feature`). Home: `docs/captain.md` (Plan before build), `captain/templates/brief.md`. ## Crew-specific rules diff --git a/capy/skill/gstack/SKILL.md b/capy/skill/gstack/SKILL.md index a9c56d4d2..9e837424d 100644 --- a/capy/skill/gstack/SKILL.md +++ b/capy/skill/gstack/SKILL.md @@ -58,7 +58,7 @@ Every Capy thread that uses gstack follows these for new work, under a Captain o - **Stop a finished /ship subagent.** When a /ship subagent opens its PR, the parent subscribes to that PR with Capy's subscribe tool and keeps that one subscription until the PR merges or closes, re-subscribing if the watch expires, then cancels it. Once the subscription is in place and READY arrives, the parent stops the subagent and owns the PR from then on, slot stamp, re-READY and receipt carry included. A stopped /ship subagent woken by a check, review or merge notice, not by its parent, reports one line naming what woke it, its pin and the PR head (`gh pr view --json headRefOid --jq .headRefOid`) and ends the turn without acting, whether or not the head moved. A message from its parent is an instruction it carries out. - **No merge without the owner's word.** A thread never merges on its own; under a Captain the controller merges on a recorded standing approval, and a thread with no Captain asks the person. -Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro or failing test; features get the lean run (`--kind feature`). +Exempt from the plan step: read-only work, the daily flaky pass's repairs, slot stamps, CHANGELOG-only resolves, cap re-pins under a written grant, S1 emergencies (a broken install or upgrade, a red main, a security bug) and fixes from an already-diagnosed, audited problem list. Other bug fixes skip plan review (`--kind fix`, R65) but carry a repro on current main or a failing test written first; features get the lean run (`--kind feature`). ## Working under a Captain From 59bbd14c950b27c4b16498bfdede808673da4387 Mon Sep 17 00:00:00 2001 From: garrytan Date: Tue, 3 Nov 2026 02:42:24 +0000 Subject: [PATCH 5/5] changelog: gsta258 row 8 fragment matches the final wording Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- changelog.d/gsta258-row8-plan-wording.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/gsta258-row8-plan-wording.md b/changelog.d/gsta258-row8-plan-wording.md index b095189bf..9b37e522b 100644 --- a/changelog.d/gsta258-row8-plan-wording.md +++ b/changelog.d/gsta258-row8-plan-wording.md @@ -1 +1 @@ -- **The plan-first rule now matches R65.** The captain skill, the CREW template, the lane brief, docs/captain.md and the Capy gstack skill no longer tell a lane that every fix needs a one-round, eng-only plan. A bug fix gets no plan review (`gstack-autoplan next --kind fix`), and its PR carries the proof: a repro on current main or a failing test written first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and the draft code together. The S1 and audited-problem-list exemptions are unchanged. +- The captain skill, the CREW template, the lane brief, docs/captain.md and the Capy gstack skill now follow R65 instead of telling a lane that every fix needs a one-round, eng-only plan. A bug fix is exempt from plan review (`gstack-autoplan next --kind fix`; the brief's reason is `bug fix (R65)`), and its PR carries a repro on current main or a failing test written first. A feature gets the lean run (`--kind feature`): one reviewer reading the plan and the draft code together. The S1 and audited-problem-list exemptions are unchanged.