diff --git a/bin/gstack-owner-brief b/bin/gstack-owner-brief
index a6468e875..bdce6e054 100755
--- a/bin/gstack-owner-brief
+++ b/bin/gstack-owner-brief
@@ -3,7 +3,7 @@
* gstack-owner-brief — the one-page owner brief at the autoplan gate (plan E3).
*
* gstack-owner-brief render --out
[--page N] [--summary ] [--write] [--json]
- * gstack-owner-brief render --captain --out [--allow-incomplete] [--write] [--json]
+ * gstack-owner-brief render --captain --out [--captain-name ] [--allow-incomplete] [--write] [--json]
* gstack-owner-brief close --out --plan [--date YYYY-MM-DD] [--json]
*
* `render` prints the plain-language summary (--summary , else /summary.md
@@ -12,8 +12,9 @@
* taken if unanswered, approval items stay pending) and points at review-record.md
* for the full review; --write also saves brief.md in the run directory.
* `render --captain` prints the plan ask in the shape Capy Captains relay (lib/captain-brief.ts): header with
- * the one-word reply, Before → after, Why it matters, What caused this work, Big decisions, What we need from
- * you, and one trailing line for the relaying agent; a plan missing a section exits 1
+ * the "do it" reply, Before → after, Why it matters, What caused this work, Big decisions, What we need from
+ * you (the lettered ask lines of docs/captain.md § The ask format, headed by --captain-name), and one
+ * trailing line for the relaying agent; a plan missing a section exits 1
* (CAPTAIN_BRIEF_INCOMPLETE) unless --allow-incomplete. --write saves captain-brief.md.
* `close` rewrites every `draft direction stands until the owner decides` line in
* the plan to the decided option and date; pending lines stay and are reported
@@ -29,7 +30,7 @@ import { resultLine } from '../lib/result-codes';
const HELP = `gstack-owner-brief — one page for the owner: summary, URGENT block, numbered decisions (docs/unattended.md#owner-brief)
render --out [--page N] [--summary ] [--write] [--json]
- render --captain --out [--allow-incomplete] [--write] [--json] the plan ask for a Capy Captain (capy/skill/gstack/captain.md)
+ render --captain --out [--captain-name ] [--allow-incomplete] [--write] [--json] the plan ask for a Capy Captain (capy/skill/gstack/captain.md); --captain-name heads the lettered ask
close --out --plan [--date YYYY-MM-DD] [--json]
${exitTableHelp()}`;
@@ -49,7 +50,7 @@ function main(argv: string[]): number {
const json = rest.includes('--json');
if (cmd === 'render' && rest.includes('--captain')) {
- const brief = renderCaptainBrief(loaded.inputs, { outDir: path.resolve(out) });
+ const brief = renderCaptainBrief(loaded.inputs, { outDir: path.resolve(out), captainName: flag(rest, '--captain-name') });
if (rest.includes('--write')) fs.writeFileSync(path.join(path.resolve(out), 'captain-brief.md'), brief.text);
if (json) process.stdout.write(JSON.stringify({ run: loaded.inputs.gate.run, gate_rev: loaded.inputs.gate.gate_rev, rec_hash: brief.recHash, pending: brief.pending, missing: brief.missing, brief: brief.text }) + '\n');
else process.stdout.write(brief.text);
diff --git a/captain/SKILL.md b/captain/SKILL.md
index 9984953c0..f249b5cbb 100644
--- a/captain/SKILL.md
+++ b/captain/SKILL.md
@@ -324,8 +324,8 @@ to be outside the merged PR. Reruns on `BASE` are never a way to get a green.
The controller keeps one digest file (`captain/templates/DIGEST.md`), rewritten at every
turn, three sections in this order, each row with its thread, one line, and an age:
-1. **Needs you**: decisions only the owner can make, each with the plain-language ask and
- the one-word default. Empty means the owner has nothing to do.
+1. **Needs you**: decisions only the owner can make, in the ask format below (the
+ Captain's name, one lettered line per decision). Empty means the owner has nothing to do.
2. **New**: what landed or changed since the last digest (merges with versions, READYs
received, trains built, incidents), newest first.
3. **In progress**: every working lane, what it owns, its state (building, READY, in
@@ -352,11 +352,17 @@ says so instead of looking empty.
**B. The plan ask**, in this order, written for someone outside the project (no gate codes
in the body): before → after with concrete examples; why it matters, with numbers; what
caused the work (issue, run, report, or the owner's words quoted); the big decisions
-(options, pick, why, what would flip it); what we need from you, one decision with each
-option's cost and the recommended one-word reply as the default; and a closing
-**"do it"** reply that takes every recommendation at full scope, follow-ons included,
-with one line saying what it covers. `gstack-owner-brief render --captain` prints this shape from
-a plan; relay it whole. Template: `captain/templates/plan-ask.md`.
+(options, pick, why, what would flip it); what we need from you in the ask format; and a
+closing **"do it"** reply that takes every recommendation at full scope, follow-ons
+included. `gstack-owner-brief render --captain --captain-name ""` prints this
+shape from a plan; relay it whole. Template: `captain/templates/plan-ask.md`.
+
+**The ask format** (every ask to the owner, the digest's Needs you included), explained like
+the owner is five: the Captain's name, then one lettered line per decision, letters unique
+across the list: `- A: hit problem p, which happens when h. We could fix it in these
+ways: 1) x; 2) y; 3) z. Recommendation: x because why. A1 to take recommendation.` The
+recommendation is option 1; "do it" takes every recommendation in the last list, and a named
+option ("A2") takes that option instead. Home: `docs/captain.md`, The ask format.
**Plan before build.** A lane that builds something runs a sized `/autoplan` on its brief as
its first act after the session-start check and sends the controller the plan ask above; the controller relays it, and the
diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl
index 7cc9f5873..27926b03b 100644
--- a/captain/SKILL.md.tmpl
+++ b/captain/SKILL.md.tmpl
@@ -252,8 +252,8 @@ to be outside the merged PR. Reruns on `BASE` are never a way to get a green.
The controller keeps one digest file (`captain/templates/DIGEST.md`), rewritten at every
turn, three sections in this order, each row with its thread, one line, and an age:
-1. **Needs you**: decisions only the owner can make, each with the plain-language ask and
- the one-word default. Empty means the owner has nothing to do.
+1. **Needs you**: decisions only the owner can make, in the ask format below (the
+ Captain's name, one lettered line per decision). Empty means the owner has nothing to do.
2. **New**: what landed or changed since the last digest (merges with versions, READYs
received, trains built, incidents), newest first.
3. **In progress**: every working lane, what it owns, its state (building, READY, in
@@ -280,11 +280,17 @@ says so instead of looking empty.
**B. The plan ask**, in this order, written for someone outside the project (no gate codes
in the body): before → after with concrete examples; why it matters, with numbers; what
caused the work (issue, run, report, or the owner's words quoted); the big decisions
-(options, pick, why, what would flip it); what we need from you, one decision with each
-option's cost and the recommended one-word reply as the default; and a closing
-**"do it"** reply that takes every recommendation at full scope, follow-ons included,
-with one line saying what it covers. `gstack-owner-brief render --captain` prints this shape from
-a plan; relay it whole. Template: `captain/templates/plan-ask.md`.
+(options, pick, why, what would flip it); what we need from you in the ask format; and a
+closing **"do it"** reply that takes every recommendation at full scope, follow-ons
+included. `gstack-owner-brief render --captain --captain-name ""` prints this
+shape from a plan; relay it whole. Template: `captain/templates/plan-ask.md`.
+
+**The ask format** (every ask to the owner, the digest's Needs you included), explained like
+the owner is five: the Captain's name, then one lettered line per decision, letters unique
+across the list: `- A: hit problem p, which happens when h. We could fix it in these
+ways: 1) x; 2) y; 3) z. Recommendation: x because why. A1 to take recommendation.` The
+recommendation is option 1; "do it" takes every recommendation in the last list, and a named
+option ("A2") takes that option instead. Home: `docs/captain.md`, The ask format.
**Plan before build.** A lane that builds something runs a sized `/autoplan` on its brief as
its first act after the session-start check and sends the controller the plan ask above; the controller relays it, and the
diff --git a/captain/templates/AGENTS.md b/captain/templates/AGENTS.md
index b9c09f064..c60cb966f 100644
--- a/captain/templates/AGENTS.md
+++ b/captain/templates/AGENTS.md
@@ -25,9 +25,11 @@ a standing approval instead of asking again. Append; never rewrite an owner's wo
rerun: . Over the cap is a fresh ask.
## Asks to the owner (, : "")
-- Plain language, each option with what it is, why it matters, what each answer does and
- the cost. The recommended one-word reply is the default. Every ask ends with "do it":
- every recommendation at full scope, follow-ons included, no further ask.
+- The ask format (gstack docs/captain.md), explained like I'm five: , then one
+ lettered line per decision: "A: hit problem p, which happens when h. We could fix it
+ in these ways: 1) x; 2) y; 3) z. Recommendation: x because why. A1 to take recommendation."
+ "do it" takes every recommendation in the list at full scope, follow-ons included, no
+ further ask; a named option ("A2") takes that option instead.
## Parallelism (, : "")
- Keep about lanes working on disjoint files whenever there is backlog. Serial steps
diff --git a/captain/templates/DIGEST.md b/captain/templates/DIGEST.md
index 71246ba60..81cf2d3d2 100644
--- a/captain/templates/DIGEST.md
+++ b/captain/templates/DIGEST.md
@@ -7,7 +7,12 @@ every row with its thread and an age. Codes are the thread codes the host assign
-- · · · default reply: **** · cost:
+
+- A: hit problem
, which happens when . We could fix it in these ways: 1) ; 2) ; 3) . Recommendation: because (cost: ; asked ago). A1 to take recommendation.
+- B: …
+
+"do it" takes every recommendation above; a named option ("A2") takes that option instead. The
+ask format is gstack docs/captain.md, The ask format.
## New
diff --git a/captain/templates/merge-ask.md b/captain/templates/merge-ask.md
index 568a0a287..6ec91f2ad 100644
--- a/captain/templates/merge-ask.md
+++ b/captain/templates/merge-ask.md
@@ -24,4 +24,5 @@ flaky: · pregate: pass tree=
```
The controller's merge report: the PR link, the key image inline, the version it will
-take, the slot, and the one-word reply if a decision is attached.
+take, the slot, and, if a decision is attached, its lettered line in the ask format
+(gstack docs/captain.md): "A: … Recommendation: x because why. A1 to take recommendation."
diff --git a/captain/templates/plan-ask.md b/captain/templates/plan-ask.md
index 854998ffc..4ef5369f6 100644
--- a/captain/templates/plan-ask.md
+++ b/captain/templates/plan-ask.md
@@ -5,7 +5,7 @@ gate codes in the body. `gstack-owner-brief render --captain --out ` pr
shape from an autoplan run; write it by hand for any other plan.
```text
-Decision needed on : . Reply **rec** to take every recommendation.
+Decision needed on : . Reply **do it** to take every recommendation.
## ELI5
<5-10 plain sentences: what changes, for whom, and what it costs>
@@ -25,10 +25,13 @@ output, a screen, a cost or time number>
2. …
## What we need from you
-: