Repository navigation
v1.91.146.0 feat(ship-queue): merge trains with pattern bisect and train-record verify (GSTA-49 T1) - #3272
Merged
Conversation
…erify (GSTA-49 T1) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
😎 This pull request was merged. |
…h-pattern Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> # Conflicts: # test/fixtures/module-size-ratchet.json
…set (gh shim not resolved on windows-latest) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Contributor
E2E Evals: ✅ PASS121 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $33.02 rule/judge cost | reconcile exit: 0 Profile: pr / mode 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. |
This was referenced Oct 18, 2026
…ain-record verify (GSTA-49 T1) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
garrytan
added a commit
that referenced
this pull request
Oct 19, 2026
…er cleanup, like closetab PR #3272's Opus gate 39217387697 (slice 8) failed qa-only-no-fix when the agent stopped the browser inside the guard; the rule counted stop as a third probe that needed a checkpoint. The prompt now names both cleanup children. A free replay of the captured three guarded calls passes (and fails on the old rule); stop before a probe, a disguised probe, stop --all and stop outside the guard still fail. 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>
capy-ai Bot
added a commit
that referenced
this pull request
Oct 19, 2026
…err-to-null forms accepted (#3295) * fix(evals): qa-only opts in to the read-only grammar; stderr-to-null forms accepted Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(evals): qa-only checkpoint rule counts guarded "$B" stop as browser cleanup, like closetab PR #3272's Opus gate 39217387697 (slice 8) failed qa-only-no-fix when the agent stopped the browser inside the guard; the rule counted stop as a third probe that needed a checkpoint. The prompt now names both cleanup children. A free replay of the captured three guarded calls passes (and fails on the old rule); stop before a probe, a disguised probe, stop --all and stop outside the guard still fail. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * test(evals): register the qa-only stop-cleanup replay fixture in qa-only-no-fix touchfiles Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(evals): docs-sync observer ignores an unexecuted candidate call that exited 127 at a missing path PR #3295's gate (run 39223031058, slice 2) failed ship-docsync-current after Opus called gstack-docs-candidate compare at a path missing the fixture-home segment, got exit 127 (no such file or directory), and reran it at the declared path. The observer now ignores such a call only when the absolute binary path does not exist, the recorded result is exactly the shell's exit-127 not-found message for that path, and a later call runs the same command at the declared path without failing. A free replay of all 43 captured tool calls passes and fails on the previous observer; negative controls cover an existing wrong-path binary, other exits and messages, a missing/earlier/failing/changed retry, and non-candidate or relative binaries. GStack Minder-approved. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * v1.91.145.0 chore(release): stamp qa-only read-only opt-in, stderr forms, stop cleanup and docs-sync exit-127 exception 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>
…h-pattern Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> # Conflicts: # CHANGELOG.md # VERSION # agents-digest/gstack-AGENTS.md # package.json
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Lane T1 of the gate-cost-4x plan (GSTA-49, plan revision 6, approved by /autoplan gate rev 3). It adds merge trains to
gstack-ship-queue: a train is a few READY PRs gated together by one full paid gate on the exact tree the queue will produce, instead of one full gate per PR. Everything new is off unless the base revision's.gstack/ship-policy.jsondeclares atrainblock. Gstack's own policy does not declare one yet, because the workflow side (lane T1b,evals.yml) comes next.Commands
train build --prs <n>@<sha>,…free-tests.ymlontrain/<nonce>.train statusnever spends anything. It reconciles a dispatch whose outcome is unknown by its nonce, and rebuilds local state fromrefs/notes/gstack-trains.train verdictmaps every class in the paid report. It returns green only for a complete census in the run's own plan manifest. It reads the green-train record that the train's own workflow run publishes; a user token cannot create check runs.train bisect --spend-capATTRIBUTEDonly when the pattern is monotone (green before the PR, red from it on).RED_ON_MAINonly when every prefix is red.UNATTRIBUTED.train rebuildis Garry's 2026-10-18 rule: one unchanged rebuild, and only after an all-green bisect. Every other case is refused with its reason.verifyaccepts a green train record when main's tree after each merge equals the recorded prefix tree. On a mismatch, or when publication is interrupted, it freezes the queue. While frozen it admits one repair PR as a one-PR train, and it clears once main carries a green record.ready --screen | --no-screen [--broad]must state its choice when trains are on, and it prints the recommendation from Garry's rule. Dollar figures are left out until the T0 cost library (v1.91.137.0 feat(evals): gate-cost replay and merge-train cost model (GSTA-49 T0) #3271, now merged) is wired in, in a follow-up.Results and records. Every command ends with the canonical
GSTACK_RESULT: skill=ship-queue …line, preceded by aNEXT:line. The 18 new codes live inlib/result-codes-release.ts, each with adocs/troubleshooting.mdanchor. Records are versioned (schema: 1) under the state root and mirrored to the notes ref.eval-bg. The nonce dedupe key now carries the dispatch's purpose (screen, train, bisect or backstop) and, for screens, the screen policy. A broad screen therefore never adopts a narrow run, and plain lane keys are unchanged. The dispatch, list and await helpers are factored out unchanged. Run lookup now matches the run name's closing bracket exactly.
Test change
test/ship-policy-compat.test.ts: the fail-closed assertion for an unknown policy key namedSHIP_QUEUE_KEYS_VERSIONas the newest key version. Addingtrainmade that constant stale. The assertion now computes the newest version inPOLICY_KEY_INTRODUCEDitself, so T2'spr_screenkey needs no further edit. It is as strict as before: an unknown key is stillPOLICY_INVALID, and the message must still name the newest version this gstack reads.Deviations from the plan
REBUILD_ONCE = 1, besideINFRA_REDISPATCH = EVAL_POLICY.infraRedispatch). The EVAL_POLICY entry lands separately.TRAIN_KEYS_VERSIONis set to this PR's release slot at stamp time.Behavior change
None without a
trainblock:ready --pr <n>prints exactly today's block. With screen flags but no train block, it adds one stderr warning that they are ignored. Both paths are tested.Gate-integrity edits
The merge authority moves from per-PR gates to the train verdict, but only where a policy declares
train, so nothing changes for gstack until T1b lands. No threshold, assertion, trial count or case kind changes.Checks
bun run typecheckis clean;typecheck:testreports no new diagnostics.test/ship-queue-train.test.tsandtest/ship-queue-train-logic.test.ts. They run headless fixture repos through the real bin and cover: