diff --git a/changelog.d/capy-gst-1346-ship-judge-repair.md b/changelog.d/capy-gst-1346-ship-judge-repair.md
new file mode 100644
index 000000000..63297c691
--- /dev/null
+++ b/changelog.d/capy-gst-1346-ship-judge-repair.md
@@ -0,0 +1 @@
+- **/ship's workflow now gives one answer where it used to give two, so main's backstop gate can pass again.** The `ship/SKILL.md workflow` judge failed twice on main at b244e6d (run 41817566885) because its readers kept finding the same conflicts. Steps 12 and 16 now say their item and stage commands serve only a `STOP:`, apart from stage 1's builds, which go to the one `gstack-ship-release finish` call as `--build`. Stage 5 says `finish` already made the release commit and only regenerated outputs are left to commit. The CI-carry early push names its full draft-PR command, says Step 6.5's question covers only Greptile, and runs `accept` after Step 17's push. A PR that `gh` failed to create (Step 19 exit 3) now ends Step 22 with `status=refused` instead of a result line that needs a PR number. The ship skill is 70 bytes smaller. (GST-1346)
diff --git a/ship/SKILL.md b/ship/SKILL.md
index 811b00bb7..d0e3cdcee 100644
--- a/ship/SKILL.md
+++ b/ship/SKILL.md
@@ -517,7 +517,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `~/.claude/skills/gstack/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -653,12 +653,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `~/.claude/skills/gstack/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -668,7 +668,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -764,8 +764,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl
index 01f47a4aa..6de461916 100644
--- a/ship/SKILL.md.tmpl
+++ b/ship/SKILL.md.tmpl
@@ -240,7 +240,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `~/.claude/skills/gstack/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -374,12 +374,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `~/.claude/skills/gstack/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -389,7 +389,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -485,8 +485,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/ship/sections/pr-body.md b/ship/sections/pr-body.md
index 898fd5576..850570bdb 100644
--- a/ship/sections/pr-body.md
+++ b/ship/sections/pr-body.md
@@ -277,7 +277,7 @@ reads the title back. Then resolve the draft state from Step 9's gate findings:
under Step 17's recorded human authorisation (option B there); the body already
carries the `Gate edits: N open` banner. Without that record, STOP here and report.
-Print the existing URL and continue to Step 20; do not run the create command below.
+Print the existing URL and continue to Step 20; skip the create command below.
**No open PR/MR:** add `--draft` when any gate finding is `open` (a later agent never
infers approval from the PR existing; the human marks it ready after dispositioning
@@ -298,17 +298,17 @@ Branch on the exit code of either block:
finding (sterner on public repos, no batch acknowledge). PII offers auto-redact:
write `~/.claude/skills/gstack/bin/gstack-redact --from-file "$PR_BODY_FILE" --auto-redact `
output back into the body file and rerun the block, which scans again. Only when the
- user accepts the findings as they are, rerun the same block with
+ user accepts the findings unchanged, rerun the same block with
`--confirm ` added to the command that printed it; any edit needs a new token.
- **64** with stderr saying the current body holds a title `more than once`: nothing was
posted. STOP and report the duplicated titles; never rerun with `--replace` yourself,
since a human picks which copy stays (docs/troubleshooting.md#gstack-post-pr-body-merge).
-- **3** `gh`/`glab` failed, or any other **64** (no usable remote or CLI): print the error, the
- branch name, the remote URL and the block for posting by hand. Do not stop — the code
- is pushed — but never report a PR that was not created. With open gate findings,
+- **3** `gh`/`glab` failed, or any other **64** (no usable remote or CLI): print the error, branch,
+ remote URL and the block to post by hand. Do not stop — the code is pushed — but never
+ report a PR that was not created; Step 22 ends `status=refused`. With open gate findings,
also say the gate edits were not disclosed and leave the Step 16 open-items report
in the invocation record; never report the disclosure as done.
-- Any other exit is an error that blocks publication until its cause is fixed.
+- Any other exit errors: it blocks publication until its cause is fixed.
**Output the PR/MR URL** — then proceed to Step 20.
diff --git a/ship/sections/pr-body.md.tmpl b/ship/sections/pr-body.md.tmpl
index 9b510a3f9..b7cbe34e6 100644
--- a/ship/sections/pr-body.md.tmpl
+++ b/ship/sections/pr-body.md.tmpl
@@ -260,7 +260,7 @@ reads the title back. Then resolve the draft state from Step 9's gate findings:
under Step 17's recorded human authorisation (option B there); the body already
carries the `Gate edits: N open` banner. Without that record, STOP here and report.
-Print the existing URL and continue to Step 20; do not run the create command below.
+Print the existing URL and continue to Step 20; skip the create command below.
**No open PR/MR:** add `--draft` when any gate finding is `open` (a later agent never
infers approval from the PR existing; the human marks it ready after dispositioning
@@ -281,17 +281,17 @@ Branch on the exit code of either block:
finding (sterner on public repos, no batch acknowledge). PII offers auto-redact:
write `~/.claude/skills/gstack/bin/gstack-redact --from-file "$PR_BODY_FILE" --auto-redact `
output back into the body file and rerun the block, which scans again. Only when the
- user accepts the findings as they are, rerun the same block with
+ user accepts the findings unchanged, rerun the same block with
`--confirm ` added to the command that printed it; any edit needs a new token.
- **64** with stderr saying the current body holds a title `more than once`: nothing was
posted. STOP and report the duplicated titles; never rerun with `--replace` yourself,
since a human picks which copy stays (docs/troubleshooting.md#gstack-post-pr-body-merge).
-- **3** `gh`/`glab` failed, or any other **64** (no usable remote or CLI): print the error, the
- branch name, the remote URL and the block for posting by hand. Do not stop — the code
- is pushed — but never report a PR that was not created. With open gate findings,
+- **3** `gh`/`glab` failed, or any other **64** (no usable remote or CLI): print the error, branch,
+ remote URL and the block to post by hand. Do not stop — the code is pushed — but never
+ report a PR that was not created; Step 22 ends `status=refused`. With open gate findings,
also say the gate edits were not disclosed and leave the Step 16 open-items report
in the invocation record; never report the disclosure as done.
-- Any other exit is an error that blocks publication until its cause is fixed.
+- Any other exit errors: it blocks publication until its cause is fixed.
**Output the PR/MR URL** — then proceed to Step 20.
diff --git a/ship/sections/tests.md b/ship/sections/tests.md
index 32cf548d5..eff635e9a 100644
--- a/ship/sections/tests.md
+++ b/ship/sections/tests.md
@@ -213,8 +213,7 @@ Only commit if there are changes. Stage the bootstrap's own files by name (confi
**Run it:** `~/.claude/skills/gstack/bin/gstack-ship-preflight --tests-only --base --lane =...`
(or the Step 1 call with lanes). It runs the free pre-gate first, before any lane, eval or
remote gate (`gstack-pregate --allow-repo-commands`: stage 1 regen, secrets, strays, literals;
-stage 2 the selected lanes under pipefail), then the lanes inside the evidence ledger (one at
-a time on 4 or fewer cores unless `--lanes serial|parallel`), and prints `PREGATE:`, `LANES:` and
+stage 2 the selected lanes under pipefail), then the lanes inside the evidence ledger, and prints `PREGATE:`, `LANES:` and
one `LANE: exit= tests_ran= log=` line each.
`fail` or `incomplete` blocks: fix, rerun. **No-stop** (docs/review-policy.md#no-stop): a pregate flake rerun (one per branch), a
timeout-only fix and three other routine stops go through `gstack-no-stop record` (`--help`); `recorded` goes on,
@@ -228,16 +227,16 @@ Use the project's test commands discovered in Step 4 or documented in CLAUDE.md/
**CI is the one full test run.** When `origin/ `'s `.gstack/pregate.json` maps a lane's exact
command in `ship_lanes_from` (gstack maps `bun run test`), that lane is carried from a verified CI run
at this exact, clean tree instead of running here: `LANE: carried run=/ tests_ran=`.
-Before the first push run only targeted tests and the repro (the full suite too when the diff touches
+Before the first push that lane runs only targeted tests and the repro (the full suite too when the diff touches
merge-check code: `lib/ship-*`, `lib/pregate/*`, the ship and pregate bins,
`scripts/lib/shard-engine.ts`). Push early so CI runs beside the review: commit, `gstack-ship-release push
---branch --early` (sealed, secrets and guards first), open a draft PR, then `gstack-ci-carry wait` in
+--branch --early` (sealed, secrets and guards first; Step 6.5 asks only for Greptile), open a draft PR
+(`gstack-post pr-create --base --draft --title-file --body-file `), then `gstack-ci-carry wait` in
the background; once it prints `CI_WAIT: green`, rerun `--tests-only` and the mapped lane is carried. A red
run is a failed lane: triage it below. Batch review fixes into one commit and one push. `CI_CARRY: none
-label= ()` names why a mapped lane ran here (a dirty tree, no green run at HEAD yet, a fork or stale
-run, a newer red run, a tree.json that misses an inventory file). Any other lane that already passed at this
+label= ()` names why a mapped lane ran here. Any other lane that already passed at this
tree, command and runtime is reused (`reused=`), never run twice. In Step 16, `finish` defers a mapped
-lane it cannot carry (`EVIDENCE: DEFERRED`); after the push, `gstack-ship-release accept --base
+lane it cannot carry (`EVIDENCE: DEFERRED`); after Step 17's push, `gstack-ship-release accept --base
--lane …` carries it from the green run at the final head and reruns the pregate there.
**If no applicable test suite exists:** Name the untested scope. AskUserQuestion:
diff --git a/ship/sections/tests.md.tmpl b/ship/sections/tests.md.tmpl
index 165e9f998..d8a8dc1ea 100644
--- a/ship/sections/tests.md.tmpl
+++ b/ship/sections/tests.md.tmpl
@@ -9,8 +9,7 @@
**Run it:** `~/.claude/skills/gstack/bin/gstack-ship-preflight --tests-only --base --lane =...`
(or the Step 1 call with lanes). It runs the free pre-gate first, before any lane, eval or
remote gate (`gstack-pregate --allow-repo-commands`: stage 1 regen, secrets, strays, literals;
-stage 2 the selected lanes under pipefail), then the lanes inside the evidence ledger (one at
-a time on 4 or fewer cores unless `--lanes serial|parallel`), and prints `PREGATE:`, `LANES:` and
+stage 2 the selected lanes under pipefail), then the lanes inside the evidence ledger, and prints `PREGATE:`, `LANES:` and
one `LANE: exit= tests_ran= log=` line each.
`fail` or `incomplete` blocks: fix, rerun. **No-stop** (docs/review-policy.md#no-stop): a pregate flake rerun (one per branch), a
timeout-only fix and three other routine stops go through `gstack-no-stop record` (`--help`); `recorded` goes on,
@@ -24,16 +23,16 @@ Use the project's test commands discovered in Step 4 or documented in CLAUDE.md/
**CI is the one full test run.** When `origin/ `'s `.gstack/pregate.json` maps a lane's exact
command in `ship_lanes_from` (gstack maps `bun run test`), that lane is carried from a verified CI run
at this exact, clean tree instead of running here: `LANE: carried run=/ tests_ran=`.
-Before the first push run only targeted tests and the repro (the full suite too when the diff touches
+Before the first push that lane runs only targeted tests and the repro (the full suite too when the diff touches
merge-check code: `lib/ship-*`, `lib/pregate/*`, the ship and pregate bins,
`scripts/lib/shard-engine.ts`). Push early so CI runs beside the review: commit, `gstack-ship-release push
---branch --early` (sealed, secrets and guards first), open a draft PR, then `gstack-ci-carry wait` in
+--branch --early` (sealed, secrets and guards first; Step 6.5 asks only for Greptile), open a draft PR
+(`gstack-post pr-create --base --draft --title-file --body-file `), then `gstack-ci-carry wait` in
the background; once it prints `CI_WAIT: green`, rerun `--tests-only` and the mapped lane is carried. A red
run is a failed lane: triage it below. Batch review fixes into one commit and one push. `CI_CARRY: none
-label= ()` names why a mapped lane ran here (a dirty tree, no green run at HEAD yet, a fork or stale
-run, a newer red run, a tree.json that misses an inventory file). Any other lane that already passed at this
+label= ()` names why a mapped lane ran here. Any other lane that already passed at this
tree, command and runtime is reused (`reused=`), never run twice. In Step 16, `finish` defers a mapped
-lane it cannot carry (`EVIDENCE: DEFERRED`); after the push, `gstack-ship-release accept --base
+lane it cannot carry (`EVIDENCE: DEFERRED`); after Step 17's push, `gstack-ship-release accept --base
--lane …` carries it from the green run at the final head and reruns the pregate there.
**If no applicable test suite exists:** Name the untested scope. AskUserQuestion:
diff --git a/test/fixtures/golden/agy-ship-SKILL.md b/test/fixtures/golden/agy-ship-SKILL.md
index a6f35a0bb..76e29936a 100644
--- a/test/fixtures/golden/agy-ship-SKILL.md
+++ b/test/fixtures/golden/agy-ship-SKILL.md
@@ -518,7 +518,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `~/.gemini/antigravity-cli/skills/gstack/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -654,12 +654,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `~/.gemini/antigravity-cli/skills/gstack/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -669,7 +669,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -765,8 +765,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/test/fixtures/golden/claude-ship-SKILL.md b/test/fixtures/golden/claude-ship-SKILL.md
index 811b00bb7..d0e3cdcee 100644
--- a/test/fixtures/golden/claude-ship-SKILL.md
+++ b/test/fixtures/golden/claude-ship-SKILL.md
@@ -517,7 +517,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `~/.claude/skills/gstack/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -653,12 +653,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `~/.claude/skills/gstack/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -668,7 +668,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -764,8 +764,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/test/fixtures/golden/codex-ship-SKILL.md b/test/fixtures/golden/codex-ship-SKILL.md
index b0fad23e4..4d49d1bf9 100644
--- a/test/fixtures/golden/codex-ship-SKILL.md
+++ b/test/fixtures/golden/codex-ship-SKILL.md
@@ -517,7 +517,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `$GSTACK_ROOT/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -656,12 +656,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `$GSTACK_ROOT/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -671,7 +671,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -768,8 +768,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/test/fixtures/golden/factory-ship-SKILL.md b/test/fixtures/golden/factory-ship-SKILL.md
index b0c143c5b..2c2e8ee5b 100644
--- a/test/fixtures/golden/factory-ship-SKILL.md
+++ b/test/fixtures/golden/factory-ship-SKILL.md
@@ -519,7 +519,7 @@ Item 3 needs `BUMP_LEVEL`: reuse this invocation's saved level. Else FRESH
chooses it in item 2 and ALREADY_BUMPED derives it in item 1.
**One call:** `$GSTACK_ROOT/bin/gstack-ship-release version --base [--bump ] --why ''`
-runs items 1 and 3–5; each decision left to you is a `STOP:` naming its rerun flag
+runs items 1 and 3–5; item commands serve only a `STOP:`, which names its rerun flag
(`--bump`, `--accept-incomplete`, `--version `, `--keep-current`, `--answer`).
`VERSION: skipped` or `VERSION: kept (…; no write)` ends Step 12 with
@@ -658,12 +658,12 @@ Make bisectable commits; if already committed, continue to Step 16. Never create
**IRON LAW: NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE.**
-Run stages 1–5 in order; recovery notes below name where to resume. Content
+Stages run in order; 1–4's other commands are `STOP:` recoveries. Content
changes during or after verification restart at stage 1 and complete all five
stages before Step 17. Content-preserving commits keep evidence valid.
**One call for stages 1–4:** `$GSTACK_ROOT/bin/gstack-ship-release finish --base --reviewed-tree --reviewed-base --docs-post -post.json --lane =... [--build ]... --trailer ''`
-makes Step 15's item-3 commit and runs stages 1–4 and the pregate; each `STOP:` is a recovery
+makes Step 15's item-3 commit, runs stages 1–4 and the pregate; each `STOP:` is a recovery
below (`--docs-rechecked`, `--no-lanes-approved` record stage 2.2 and Step 5's approval).
### 1. Finish writers and prepare outputs
@@ -673,7 +673,7 @@ termination before another writer runs; timeout or cancellation acknowledgment
alone means STOP until confirmed.
Find declared generation/build commands in project instructions, manifests, build
-files and CI. Run them and save results. If none exists, record not applicable and
+files and CI. Pass each to `finish` as `--build`. If none exists, record not applicable and
the inspected sources. A missing prerequisite or failed build stops shipping:
report **Build failed or prerequisite missing**, with the command, error and needed
repair. Never invent a substitute command.
@@ -770,8 +770,8 @@ does not authorize a third attempt.
### 5. Report, then push
-Commit only approved, verified release changes left uncommitted after Step 15,
-including generated outputs; use its grouping rules; never create an empty commit.
+`finish` made the release commit. Commit only verified outputs stage 1's
+builds regenerated, grouped as in Step 15; never create an empty commit.
Preserve unrelated user files.
Paste build/docs/test results. Reuse waivers only for the same verified
diff --git a/test/size-ledger/ship/capy-gst-1346-ship-judge-repair.json b/test/size-ledger/ship/capy-gst-1346-ship-judge-repair.json
new file mode 100644
index 000000000..033aa0fa3
--- /dev/null
+++ b/test/size-ledger/ship/capy-gst-1346-ship-judge-repair.json
@@ -0,0 +1,4 @@
+{
+ "bytes": -70,
+ "why": "GST-1346: ship workflow judge repair (one-call Steps 12/16 with --build; stage 5 commit owner from #3951; CI-carry draft PR and Greptile-only consent; exit 3 terminal), net -70 bytes"
+}