mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-01 06:24:41 +01:00
* feat(ship): reviewers read one packet; the parent reads only a compact findings record (GSTA-167) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-167): keep the pinned CODEX_BOUNDARY literal in the resolver; a test holds the packet boundary equal to it Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-167): a Step 7/8 audit is one packet, never sharded Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-167): packets survive the replay: base as given, budget roles, read= ranges, data summaries, no stale partial manifest - --base origin/main no longer renders origin/origin/main (resolveBaseRef shared by build and audits) - PACKET lines carry budget_role and read= ranges under 30,000 bytes; build prints BUDGET_NEXT for gstack-ship-budget --next - each packet ends with END OF PACKET; the brief reads it with the read tool in parallel ranges, about 3 calls - .json/.jsonl/.ndjson/.csv/.tsv additions past 400 changed lines reach reviewers as a DATA SUMMARY - a partial build keeps other reviewers only at the same head, base and diff content - collect: a matrix counts only from a state-machines reviewer; a CRITICAL line failing validation is invalid Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(GSTA-167): pass-2 review fixes: data summaries read only the diff, a stale Red Team build refuses, any-case CRITICAL lines - topLevelKeys takes keys and columns from the diff's own lines, never the working tree, which a symlink can point at a private file (outside voice CRITICAL) - a --findings build whose head, diff base or content differs from the manifest refuses with STALE_MANIFEST instead of dropping the specialists' coverage (adversarial + Red Team) - collect: a CRITICAL line in any case, or one that fails to parse, makes its reviewer invalid (Red Team) - docs and the misplaced Value header in the review-packet tests Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * docs(GSTA-167): CHANGELOG entry for reviewer packets; ship-budget names BUDGET_NEXT as the --next value 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>
54 lines
3.8 KiB
TypeScript
54 lines
3.8 KiB
TypeScript
/**
|
|
* Result codes for the /ship token budget (bin/gstack-ship-budget, the
|
|
* reservation check in `gstack-review-log --start`) and the fresh-context
|
|
* handoff (lib/ship-handoff.ts), plus the reviewer packets' coverage stop
|
|
* (lib/review-packet-collect.ts). Kept beside lib/result-codes.ts, which spreads
|
|
* this table into RESULT_CODES; the same rules apply: one stable
|
|
* docs/troubleshooting.md anchor, a summary and a fix clause each. The flow is
|
|
* documented in docs/ship-budget.md.
|
|
*/
|
|
import type { ResultCode } from './result-codes';
|
|
|
|
export const BUDGET_RESULT_CODES = {
|
|
BUDGET_CAP_REACHED: {
|
|
anchor: 'budget-cap-reached',
|
|
summary: 'the next step or dispatch would push used + open reservations + its projection + the tail and stop reserve past the admission cap, so it did not start',
|
|
fix: 'the run stopped status=incomplete with a resumable record; raising the cap is the owner\'s call: run the printed RECOVER line, whose resume needs --approved-by <who> --words <their words>',
|
|
},
|
|
BUDGET_READING_MISSING: {
|
|
anchor: 'budget-reading-missing',
|
|
summary: 'the Capy meter needs a fresh counter reading and none was passed',
|
|
fix: 'read cost.tokens from tools.thread.get({ thread_id: "this" }) in one execute program and pass it with --reading <n> (ship/sections/budget-handoff.md has the recipe)',
|
|
},
|
|
BUDGET_READING_REJECTED: {
|
|
anchor: 'budget-reading-rejected',
|
|
summary: 'the reading does not fit the run\'s meter contract: it is lower than the last reading of the same epoch, it was passed to a meter that reads its own source, or --prior-reading is above --reading',
|
|
fix: 'pass the counter the run started with (the BUDGET line names meter, unit and epoch); a different meter starts a new epoch through gstack-ship-budget resume --meter <m>',
|
|
},
|
|
BUDGET_METER_UNAVAILABLE: {
|
|
anchor: 'budget-meter-unavailable',
|
|
summary: 'a cap is set and no meter is readable: no --reading, no bound Claude Code session and no --meter estimate',
|
|
fix: 'pass --reading <n> on Capy, --session <id> or --nonce <value> on Claude Code, or --meter estimate to accept the conservative estimate (printed meter=estimate)',
|
|
},
|
|
BUDGET_LEDGER_INVALID: {
|
|
anchor: 'budget-ledger-invalid',
|
|
summary: 'the budget ledger or the record\'s gstack-budget block is missing, unparseable, or from another schema version',
|
|
fix: 'restore it from the Drive checkpoint (gstack-ship-budget resume --run <id>) or rebuild it from the record with resume --record <path> --rebuild-from-record --reading <n>; open reservations are then charged as unknown',
|
|
},
|
|
BUDGET_CHECK_SKIPPED: {
|
|
anchor: 'budget-check-skipped',
|
|
summary: 'a dispatch under a cap started without an unspent reservation id from gstack-ship-budget check, or reused or mismatched one',
|
|
fix: 'run gstack-ship-budget check --run <id> --step <s> --next dispatch:<roles> before the dispatch and pass its RESERVATION id once; a reservation is never created after the fact, so an unreserved dispatch ends the run status=incomplete for the owner to accept',
|
|
},
|
|
REVIEW_COVERAGE_INCOMPLETE: {
|
|
anchor: 'review-coverage-incomplete',
|
|
summary: 'a dispatched reviewer wrote no usable result: its packet output file is missing, empty, or holds neither NO FINDINGS nor a valid finding',
|
|
fix: 'confirm the reviewer stopped, then dispatch its packet again with the same brief and rerun collect; missing coverage is never clean, and a peer cannot replace it',
|
|
},
|
|
HANDOFF_PIN_MOVED: {
|
|
anchor: 'handoff-pin-moved',
|
|
summary: 'the handoff brief no longer matches the tree it was written for: HEAD, the merge base, the working tree or the brief\'s own hash moved',
|
|
fix: 'the child returns status=refused; the parent regenerates the handoff at the current tree (gstack-ship-budget handoff ...) or stops; main moving alone never refuses',
|
|
},
|
|
} as const satisfies Record<string, ResultCode>;
|