Repository navigation
v1.91.336.0 ship-queue: assign VERSION/CHANGELOG at merge time (changelog fragments + gstack-ship-queue land) - #3594
Conversation
|
😎 This pull request was merged. |
5078ad1 to
04d25ce
Compare
E2E Evals: ✅ PASS (flaky: 1 case(s) passed on their one rerun)125 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $32.87 rule/judge cost | reconcile exit: 0 Profile: pr / mode Full gate restored by:
Derived dependents (scripts/pr-dependencies.ts):
Rule and judge shards
Fail-closed reconciliationSliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry. Flaky: failed once, passed on its one rerun (rule 16)Each failed and passed on its rerun in run 40845695405 at the attempts named above. Logged for the daily flaky-fix pass in this run's Dispatched narrow screen (gstack-ship-queue ready --screen) of merge commit |
04d25ce to
8ecdf45
Compare
…tree receipt accepts the fold Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…fragments Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…CHANGELOG Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ts; land checks the depth-checked receipt (#3567) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…cation tripwire) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…safe subset (gh shim cannot launch there) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…lds only with the key on Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
land without --no-wait now compares the pushed branch head and polls the stamp commit's checks, refuses a PR whose base is not the stamped base, releases the lock on a pre-push failure, keeps --break-lock off drift locks, resumes from a lost journal via the stamp commit's pin, honours history merge-only, and refuses a fragment whose text is already released on the base. Version Gate stops applying open claims to a fragments stamp. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
land reconciles a merge GitHub completed behind an error reply, refuses --break-lock against a holder that just entered a push or a merge, keeps a repair takeover on the lock itself (any checkout can land the repair PR), resumes --repair after a failed PR create, releases the lock on QUEUE_LAND_BASE_BUSY, never writes through a symlinked release file, keeps a package.json version source's other edits, and refuses an empty object id instead of pushing a deletion. A carried-back fragment is matched on whole released lines. Under changelog_fragments Version Gate accepts a stamped head only as a [pin, base] merge-step commit with valid fragments. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…iles refuse before restamp Under changelog_fragments, gstack-ship-queue ready records a READY receipt (refs/notes/gstack-trains) once its pregate, full_e2e and /ship receipt checks pass, and land refuses a pin without one (fix: run gstack-ship-queue ready --pr N), --dry-run included (GStack Minder ruling, 2026-10-29). The merged tree's release files may not be symlinks, so restamp never writes outside the scratch worktree. --repair adopts an existing branch only when it holds land's repair commit. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ragments fold; docs match land and ready gstack-pregate clear and gstack-tree-receipt now classify through one classifyFiles, so under changelog_fragments a receipt for the fragment head clears the stamped head when the stamp is exactly the fold. The ship-policy reference names ready's receipt push, land's own check polling, the key-off refusal and the /ship changelog_fragments line. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…d clear applies them too Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
8ecdf45 to
b12d406
Compare
… grant) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…n fits maxSkeletonBytes Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…91.336.0 (gstack-restamp --next --pr 3594, train gate.train-98e1977e3e71-723b73ea8970-082cfa slot 1) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…sta154-train-stamps Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…ain-stamps; CHANGELOG: main's plus this PR's [Unreleased] entry Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
GSTA-154 PR A (draft). /ship is running; the body is replaced by the /ship receipt and PR summary.
What changed
gstack-ship-queue gains land: the merge step stamps VERSION and CHANGELOG itself, so a PR never carries a version.
Before/after as text: gstack-ship-queue gains land: the merge step stamps VERSION and CHANGELOG itself, so a PR never carries a version
Why
Garry asked to "assign VERSION/CHANGELOG at merge time, not in the PR". Today every PR picks a version before it merges, so each merge makes the next PR's version stale and its lane redoes the stamp (a median 14.5 minutes from stamp commit to merge over 30 slots, Oct 27-29). With
changelog_fragmentson, a PR carries an unversioned fragment andgstack-ship-queue landallocates the version, so two PRs cut from one base never collide.Blast radius
The change touches restamp, Version Gate (now on every PR), the tree receipt,
gstack-pregate clearandready. Every new behavior is behindchangelog_fragments, which gstack's own.gstack/ship-policy.jsonleaves off, and the remote free tier (23,607 tests) passed on the branch with the key off, so repositories that do not opt in see no change (script ran).Approvals
Source: gstack-approvals record for gsta154-changelog-fragments (display only; not an approval citation).
Summary
A lane hit stale versions on every merge. The PR stamped itself, the base moved, and the stamp had to be redone by hand. This PR lets a repository move version allocation to the merge step. A PR adds
changelog.d/<slug>.md;gstack-restampfolds the fragments under one new heading and deletes them;gstack-ship-queue land --pr <n>takes a land lock, merges the base resolving release fields only, stamps, pushes a [pin, base] commit under an exact lease, waits for its checks and squashes with--match-head-commit. Every step is journaled and resumable, and drift from a merge outside land stops loudly with a--repairpath. Version Gate runs on every PR so a fragment-only PR still proves its entry, and accepts a stamped head only as land's [pin, base] commit.readyrecords a READY receipt under the key andlandrefuses a pin without one, so land checks the same pregate and full_e2e evidencereadyenforces. /ship Step 13 writes the fragment under the key.Test Coverage
Step 7: 30 new code paths, all tested after two generation passes (9 tests); the rating subagent rated all 9 at two stars or better. Coverage: 100% value-weighted. Review fixes added 21 more cases, each failing before its fix: land without
--no-waitmerging in one run, a PR on another base,--break-lockagainst a drift lock and a holder mid-merge, a conflict releasing the lock, a stacked parent's fragment, a lost journal,merge-only, a merge GitHub completed behind an error reply,--repairafter a failed PR create, symlinked VERSION and CHANGELOG at the pin, apackage.jsonversion source,QUEUE_LAND_BASE_BUSYreleasing the lock, the READY receipt on both sides, the whole-line carried-back check, a lane-stamped head refused by Version Gate, andclearapplying the fragment fold.Tests ran: remote free tier 23607
Pre-Landing Review
Pass 1 (six specialists and the red team) found two blocking defects, both fixed with failing-first tests: land without
--no-waitcompared a stale pre-push head and never merged, and land never checked the PR's base branch. The native adversarial pass and the Codex outside voice found 13 more, fixed in one batch: a failed object write pushing a branch deletion,--break-lockbreaking a holder mid-merge, apackage.jsonversion source losing dependency edits, PR-controlled symlinks writing outside land's scratch worktree, a merge GitHub completed behind an error reply never reconciling, and others. Two fix checks came back clean.REVIEW_LOOP: passes=1 blocking_found=2 deferred=0 noted=2 fixed=13 scope=frozen fix_checks=2 dispatches=7
Gate edits: 13 listed, 6 read, 1 findings — 1 kept (reasons below), 0 restored, 0 open
--no-verifyand its cleanup usesworktree remove --forceon a temporary worktree land created itself; neither skips a check on a person's commit.Outside review: completed (Codex, gpt-6-astra), VERDICT findings P1, all P1s fixed or ruled on (standalone land's evidence: GStack Minder's ruling, built here).
Review notes
lib/version-gate-train.ts:119single-parent inference: noted. Under fragments a single-parent stamped head is now refused outright.lib/changelog-fragments.ts:28fragmentSlug takes only numeric PRs: noted, advisory.Exploratory QA
Functional probes on an owned fixture at a74725d: restamp folds a fragment in dry run; a fragment repeating released text refuses; a fragment with a release heading refuses with nothing written;
landwithout--pris a usage error writing no refs. Verdict pass, final. Land's gh-backed paths are covered by test/ship-queue-land.test.ts, not probed.Design Review
No frontend files changed — design review skipped.
Eval Results
No prompt-related eval selected beyond the ship skill's one-line Step 13 change; the paid gate runs on the train.
Plan Completion
Step 8 audited 41 plan items for PR A; the one NOT DONE (the rollback docs claim) is fixed. Items 10-16 (stamped train prefixes, train land) are in #3595. Deferred with approval: S_i pretests, the controller reuse check and train-prefix refs wait for GSTA-156; peer-repo opt-ins and gstack's policy flip come after the pilot train.
Issues
Refs #3557
Refs #3567
Verification Results
Exploratory probes: all four held; none failed, was blocked or went unrun.
TODOS
No TODO items completed in this PR.
Documentation
Status: updated. The re-audit of 043feff..18d531b (14 commits, 31 files; staged and unstaged trees clean) found docs/pregate.md's verdict-parity claim true again after 18d531b and made three factual edits.
Scope: docs/pregate.md, docs/ship-policy.md, docs/troubleshooting.md, docs/captain.md, captain/templates, README.md, each checked against lib/tree-receipt.ts, lib/pregate/remote-receipt.ts, lib/ship-policy.ts, lib/ship-queue.ts, lib/ship-queue-land.ts, lib/result-codes-release.ts and bin/gstack-ship-queue.
Documentation health:
changelog-fragmentsandchangelog_fragments)gstack-pregate clearapplies the same rule, and requires an exact fold)changelog_fragmentsoff)Coverage debt:
changelog_fragments(land in place of slot stamps, a fragment in place of rule 15's[Unreleased]): reference only in docs/ship-policy.md; docs/captain.md and captain/templates have no how-to.changelog_fragments: docs/ship-policy.md's /land-and-deploy section does not mention fragments.Diagram drift: none.
Test plan
gstack-pregate --stage tests --remote) at tree d6bce1ab, after merging main 11c17d4 (v1.91.333.0, CHANGELOG by mergeChangelogs): 23814 tests, 0 failed; lanes cleared from runs 41060804078 and 41060809886bun run typecheck,bun run gen:skill-docsfreshness,bun run buildbun test test/parity-suite.test.tsand the skill size guard green after the Steps 12-16 hyphen trim that keeps ship's skeleton within maxSkeletonBytes🤖 Generated with Claude Code