diff --git a/captain/SKILL.md b/captain/SKILL.md index 2655c6345..9984953c0 100644 --- a/captain/SKILL.md +++ b/captain/SKILL.md @@ -261,6 +261,13 @@ Never merge out of order, never merge anything else while a train is merging, an skip the second verify: a mismatch there is what writes the freeze. When every slot has merged, `train prune --train "$NONCE"` deletes the train branch. +**Under `changelog_fragments`** (a stamped train: `train build` printed `S1:`..`Sk:` lines) +there is no slot call and no lane stamp. Per slot, in `ORDER`, run +`gstack-ship-queue train land --train "$NONCE" --pr "$PR"` until it exits 0. It pushes the +stamped prefix S_i as a commit on [pin, `BASE`], waits for the policy's `required_checks`, +merges with `--match-head-commit` and confirms `BASE` is S_i exactly. A rerun resumes from +its journal, and any other `BASE` freezes the queue as above (docs/ship-policy.md#train-land). + **The tree rule.** A gate covers a tree, not a commit. A head whose diff from the gated prefix touches only `STAMP_FILES` reuses the gate; that is what lets the lane stamp after the gate ran. Anything else is a new tree and needs a new gate. diff --git a/captain/SKILL.md.tmpl b/captain/SKILL.md.tmpl index 2664b3d3c..7cc9f5873 100644 --- a/captain/SKILL.md.tmpl +++ b/captain/SKILL.md.tmpl @@ -189,6 +189,13 @@ Never merge out of order, never merge anything else while a train is merging, an skip the second verify: a mismatch there is what writes the freeze. When every slot has merged, `train prune --train "$NONCE"` deletes the train branch. +**Under `changelog_fragments`** (a stamped train: `train build` printed `S1:`..`Sk:` lines) +there is no slot call and no lane stamp. Per slot, in `ORDER`, run +`gstack-ship-queue train land --train "$NONCE" --pr "$PR"` until it exits 0. It pushes the +stamped prefix S_i as a commit on [pin, `BASE`], waits for the policy's `required_checks`, +merges with `--match-head-commit` and confirms `BASE` is S_i exactly. A rerun resumes from +its journal, and any other `BASE` freezes the queue as above (docs/ship-policy.md#train-land). + **The tree rule.** A gate covers a tree, not a commit. A head whose diff from the gated prefix touches only `STAMP_FILES` reuses the gate; that is what lets the lane stamp after the gate ran. Anything else is a new tree and needs a new gate. diff --git a/docs/skills.md b/docs/skills.md index 348777519..a0c7b827f 100644 --- a/docs/skills.md +++ b/docs/skills.md @@ -45,7 +45,7 @@ Detailed guides for every gstack skill — philosophy, workflow, and examples. | [`/write-skill`](#write-skill) | **Skill Editor** | Write or improve an agent skill without bloat: edit ladder, size per level, skill-to-bin drift check, full diets with a before/after test. | | [`/test-audit`](#test-audit) | **Test Auditor** | Sweep existing tests for low-value, implementation-coupled or duplicate tests. Report-only unless you approve a batch. | | [`/landing-report`](#landing-report) | **Ship Queue Dashboard** | Read-only snapshot of the workspace-aware ship queue. Which version slots are claimed, which sibling workspaces have WIP. | -| [`/captain`](#captain) | **Crew Controller** | Run many coding agents from one controller. Lanes build and send a READY block; the controller validates it, merges through trains (stamp on call, verify, merge with the expected head, verify again), keeps the digest, relays approvals in three fixed shapes and runs a daily flaky-fix pass. Also answers to `/crew`. | +| [`/captain`](#captain) | **Crew Controller** | Run many coding agents from one controller. Lanes build and send a READY block; the controller validates it, merges through trains (stamp on call, verify, merge with the expected head, verify again; `train land` per slot under `changelog_fragments`), keeps the digest, relays approvals in three fixed shapes and runs a daily flaky-fix pass. Also answers to `/crew`. | | [`/benchmark-models`](#benchmark-models) | **Model Benchmark** | Side-by-side cross-model benchmark for skills (Claude vs GPT vs Gemini). Latency, tokens, cost, optional LLM-judged quality. | | [`/eval-plan`](#eval-plan) | **Eval Planner** | Preregister a paid eval (bars, arms, decoys, stop rules), dry-run it for $0 with the stub model, pilot three priced items, then approve the spend from the extrapolation table. | | | | | @@ -1464,7 +1464,9 @@ receipt at the pin and the logged flaky cases); a green PR page or a cheap test never merge evidence. The controller batches READY pins into a **merge train**, reads one full gate on the train head (an in-run flaky rerun once; a case that failed twice is real), then merges slot by slot: slot call, lane stamps on call with a commit that holds -only tool output, `verify --train`, `gh pr merge --match-head-commit`, verify again. A red +only tool output, `verify --train`, `gh pr merge --match-head-commit`, verify again. Under +`changelog_fragments` there is no slot call: `train land` publishes each slot's stamped +prefix and merges it. A red train is bisected on its red cases and rebuilt at most once; a backstop gate on every base push freezes the queue when a tree no train covered lands. Approvals have three shapes (the per-thread record, the plan ask with before → after and a "do it" reply, the