* feat(ship): GSTA-167 turn levers on the restored reviewers: ship preflight/release bins, own-jam meter, dispatch-pair metering, ship/DRIVER.md
Ports the non-reviewer parts of #3633 (gsta-167-pr34) and #3637 (gsta-167-pr5 @2914400)
onto main ae3d58c (v1.91.331.0). Reviewer briefs, checklists, the fix-check prompt and
the depth rules are byte-identical to main and now pinned in
test/review-packets-removed.test.ts.
Left out: gstack-review-packet and its libs, parallel/batched fanout, --like, collect,
the audit prompt split, the docs-audit packet, review-army/adversarial/outside-voice
edits, the gate-scan summary-only block and the review-depth scope-error change.
Packet-bytes reader pricing is dropped from gstack-ship-budget; handoff READ ranges
send each section whole; the driver runs the audit, review, adversarial and
documentation sections as written.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(context-budget): raise the capy/skill/gstack eager ceiling to its captured value after the main merge (own-jam meter, driver and reviewer-batch prose, GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(ship-driver): name ship/DRIVER.md.tmpl so the pregate maps the template to its test lane (GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(ship-driver): keep the skill generator off lib/ship-budget so a minimal setup checkout still renders (GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* test(windows): keep test/ship-release.test.ts off the Windows subset; it launches the shebang bin and sh stubs directly (GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* feat(ship): variant E orchestration: one program per review pass and Step 14.5 audit, the review child starts at Step 9, a metered dispatch:docs role, and the driver's record headings (GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* feat(ship): variant G orchestration: one call per driver phase (9 for a clean pass, at most 12), gstack-ship-preflight --audit for single reads and deterministic audits, an observe-mode ledger with note and credits, 240 s wait pings, and small-model audit readers (GSTA-167)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(ship-budget): a Capy handoff child needs no jam id: verify-handoff with no reading makes it parent-metered (METER: parent), it never delegates on an unknown charge, and reconcile charges the parent's counter delta (GSTA-167 replay 7e)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(ship): a poll settles a reader only at done, failed or a final summary, never a fresh idle; return settles the child's open step reservation (GSTA-167 replay 7e)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(ship-budget): return releases an open step reservation under the estimate meter instead of booking its projection; measured meters still settle it (GSTA-167 replay 7e)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(review): a clean fix-check after below-floor fixes is done; Step 11 and fix-check below-floor findings are notes at pass 1
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* feat(ship): verbatim reviewer briefs and loss-free collection (gstack-review-dispatch render/sent/collect/judge/verify)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix: pre-landing review fixes
- verify requires each output's brief rendered and sent verbatim, reruns judge
against the recorded judged.jsonl hash, and flags outputs collected after judge
- judge drops self-folds, fold cycles and chains
- prose findings parse a leading label or a label heading, not any severity word
- releasePaths: manifests count as release metadata only for version-only edits,
lockfiles never; TODOS.md stays out of lane-evidence exemptions
- push stops when the sealed-output guard did not run
- ship-audit reads the test tree once instead of one git grep per file
- drop the uncalled --delegate measured mode; doc/help step-number fixes
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix: pre-landing review fixes (pass 2)
- collect keeps a finding wherever its label stands (headings, table rows,
mid-line, Informational and upper-case labels); only top-level list items
inherit a label heading, and any heading or bold-only line ends it
- judge treats a merged file missing any collected id as a drop; verify flags
merged_ids_missing and a sent reader never collected (NOT_COLLECTED)
- finish computes release paths after --build, so a build that rewrites
package.json is a build-input change
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(review-dispatch): verify per render, voided superseded mismatches
- verify treats each render as one dispatch of its reader, so a two-pass
ledger compares pass-1 sends with pass-1 briefs (later renders print as
<reader>@2); outputs bind to the latest send of their own render
- a mismatched send re-sent byte-exact before anything was collected is void
and counted (voided=N on the verdict line); one that produced an output
stays MISMATCH
- an indented bold sub-line no longer ends a label section (fix-check)
- docs: a failed reader is collected from its failure text
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(review-dispatch): only the newest render of a path checks its file; absolute ledger paths
- a later render into the same briefs directory overwrites the earlier brief by
design, so verify checks a brief file only for the newest render of that path
- collect and judge record absolute output, merged and judged paths, so verify
reads them from any directory
- docs: a failed reader's failure text is parsed like any output
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* chore: changelog and TODOS
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* fix(ship-release): the changelog_fragments fragment is release metadata
Fix-check 4 (CRITICAL) after the main merge: releasePaths omitted
<changelog_fragments.dir>/<branch-slug>.md, so finish stopped on the
fragment Step 13 writes under gstack's policy, or routed it to re-review.
version now names the fragment in its Step 13 NEXT line instead of
[Unreleased], DRIVER.md Step 13 writes and lints where NEXT says, and the
preflight POLICY line says Steps 12-16.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
* chore: changelog and TODOS
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>
6.1 KiB
Budget and context handoff (read when a cap is set or verdict=delegate prints)
The cap is an admission cap: gstack-ship-budget check admits the next step or
dispatch only when used + open reservations + unknown + its projection + the tail
and stop reserve fit. Work already admitted can still overrun its projection.
Field-by-field reference: docs/ship-budget.md. Exit 0 continue or delegate, 3 stop,
2 usage; any non-zero exit means the next step does not start. A ship/DRIVER.md run starts
--mode observe instead: no check, reservation or handoff; each program ends with note, and only a
note past the cap stops.
Meter. Read one per command:
- Capy: read
(await tools.thread.get({ thread_id: "<your own jam id>" })).cost(your own jam, its subagents included; a root thread's is"this") in the same program as thegstack-ship-budgetcommand, never its own call:--reading <cost.tokens> --credits <cost.credits>.--prior-reading <n>(per-call charge; three of them price steps at the run's own median) is a reading your previous call already took; never spend a call only to read the meter. One older than the run's last reading is ignored. - Claude Code:
start --session <id>, or echo the nonce the refusal prints once and rerunstart --nonce <value>; the helper reads the journals itself (never--reading). - Elsewhere:
--meter estimate(printedmeter=estimate), only when the owner accepts it.
Every boundary. gstack-ship-budget check --run <id> --step <done> --next <step> --reading <n>.
Before each dispatch batch, reserve the batch as one sum, one role per DISPATCH: line, then pass the printed id once
(READING is the current counter reading; RESERVATION_ID is the check's RESERVATION_ID: line, copied whole):
~/.claude/skills/gstack/bin/gstack-ship-budget check --run <id> --step 9 --next dispatch:specialist,red-team --reading "$READING"
~/.claude/skills/gstack/bin/gstack-review-log --start review --reservation "$RESERVATION_ID"
On ADMIT: k of n (remaining=<roles>), dispatch only those k and re-check the remaining roles
after they settle; close flags roles never re-checked. --finish settles the reservation and the pass's other dispatch reservations.
One program per review pass. On Capy one execute program runs a whole pass, in order (elsewhere
the same order): gstack-review-plan (its DISPATCH: lines), check --step <n> --next dispatch:<roles>,
gstack-review-log --start <skill> --reservation <id> once per
row the step logs, the reading BEFORE, the readers exactly as the step dispatches them (their
prompts unchanged), the wait until the last settles (done, failed or a final summary; a fresh idle
has not run), the reading AFTER, gstack-ship-budget settle;
a later batch of the same pass (the Red Team or an ADMIT remainder) takes no start and repeats the
rest (--finish settles it); last the collect, returning only the readers' final outputs. Step 11's
voices and Step 14.5's audit (dispatch:docs, no start) are one program each.
Settle each batch in the program that dispatched it: read the counter right before the readers
start and right after the last one settles, then gstack-ship-budget settle --run <id> --reservation <id> --dispatched-at <before> --reading <after> --readers <n> (--unknown when the meter cannot see it);
release one that never ran. Only that pair is measured: check --returned, a settle from a later
program (no --dispatched-at), --finish or a step change settles without measuring.
verdict=stop. Print the STOP, RECOVER and GSTACK_RESULT lines as your last output and
end status=incomplete. Raising the cap is the owner's call: /ship --resume <record> --token-cap <n> runs gstack-ship-budget resume --record <record> --token-cap <n> --approved-by <who> --words "<their words>" --reading <n>. After a machine change,
resume --run <id> restores the ledger and record from the Drive checkpoint; a
corrupt ledger takes --rebuild-from-record.
verdict=delegate. The next segment (Steps 9–11.5, 12–22, or 1–22 at start) runs in a fresh child; you wait and advance only after reconciling it. Steps 7–8 stay with the parent: the Steps 9–11.5 child reads review-army.md and adversarial.md and takes their results from the record.
gstack-ship-budget handoff --run <id> --from 9 --to 11.5 --base origin/<base> --reading <n>(add--reviewed-tree <t>,--trail <file> --trail-run <id>). It printsHANDOFF:andRETURN_FILE:; the brief lists the child'sREAD:line ranges and names--toas its last step.- Launch: on Capy a subagent on the shared machine whose brief is "Load gstack, source
GSTACK_LAUNCH_FILE, run /ship --continue "; on Claude Code
gstack-ship-budget launch --in <HANDOFF file>(background, explicit permissions). - The child runs
verify-handoff --in <file>first, with no--readingon Capy (a subagent cannot read its own jam id;METER: parent: the parent's handoff and reconcile readings measure it); aHANDOFF_PIN_MOVEDrefusal returns status=refused. It admits against its sub-cap and never stops on the context rule: after a completed step,verdict=delegatehands its remaining steps to a grandchild through these four steps (depth 3 at most); aCONTEXT_HIGH:note means continue. It reconciles any grandchild, then ends withgstack-ship-budget return --run <child> --to <the brief's last step> --changed <sections>(at most 40 lines). gstack-ship-budget reconcile --run <id> --return <RETURN_FILE> --reading <n>charges the return's own-counterused=. Read the record, never the child's transcript. Exit 3 (refused, incomplete or interrupted): regenerate the handoff or stop; every check refuses until a regenerated child reconciles complete or the owner resumes.
--resume and --continue (you are the child) attach to the existing
record and ledger instead of a fresh Step 1: keep the attempt counts and start tokens; under
--continue, run verify-handoff before any trail write.