mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-09 18:28:15 +01:00
feat(ship): Step 9 dispatches what gstack-review-plan plans; fix-check after below-floor fixes; cap two full passes plus one fix-check
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
dc364b1582
commit
636776fcf6
14 files changed
+98
-18
No files matched your search
@@ -5,6 +5,7 @@
|
||||
* gstack-review-plan --base <ref> [--pass <full passes run>] [--last none|full|fix-check] [--fixed-blocking] [--fixed-below]
|
||||
* [--blocking-open] [--touched-gate] [--critical-found] [--gate-tagged <n>] [--gated a,b] [--force a,b|all]
|
||||
* [--reviewed-numbers <fingerprint>] [--no-tiers] [--json]
|
||||
* gstack-review-plan --fix-check-prompt --fix-list <file> --hunks <file> --tests <file> [--callers <file>]
|
||||
*
|
||||
* Reads the diff against the merge base with <ref> (committed, working tree and
|
||||
* untracked), runs gstack-diff-scope and, unless --gate-tagged is given,
|
||||
@@ -17,6 +18,7 @@ import * as path from 'node:path';
|
||||
import { EXIT, exitTableHelp } from '../lib/headless-artifacts';
|
||||
import { runScriptSync } from '../lib/script-invocation';
|
||||
import { planReview, reviewPlanLine, scanNumbers, type History } from '../lib/review-depth';
|
||||
import { renderFixCheckPrompt } from '../scripts/resolvers/fix-check';
|
||||
|
||||
const HELP = `gstack-review-plan — the review depth of the next /ship step (docs/review-policy.md#review-depth)
|
||||
|
||||
@@ -34,6 +36,7 @@ const HELP = `gstack-review-plan — the review depth of the next /ship step (do
|
||||
--reviewed-numbers <fp> the numeric-claim fingerprint the outside voice already reviewed
|
||||
--no-tiers audits and watchers at the host's default effort too (as gstack-config review_effort_tiers off does)
|
||||
--json the plan as JSON
|
||||
--fix-check-prompt print the fix-check reviewer's prompt from --fix-list, --hunks, --tests and --callers files
|
||||
${exitTableHelp()}`;
|
||||
|
||||
const args = process.argv.slice(2);
|
||||
@@ -44,6 +47,17 @@ const git = (a: string[]) => { const r = spawnSync('git', ['-c', 'core.quotePath
|
||||
|
||||
function main(): number {
|
||||
if (has('--help') || has('-h')) { process.stdout.write(HELP + '\n'); return EXIT.ok; }
|
||||
if (has('--fix-check-prompt')) {
|
||||
const read = (n: string, required: boolean) => {
|
||||
const f = flag(n);
|
||||
if (!f) return required ? null : '';
|
||||
try { return fs.readFileSync(f, 'utf8'); } catch { return null; }
|
||||
};
|
||||
const [fixList, touchedHunks, testResults, callers] = [read('--fix-list', true), read('--hunks', true), read('--tests', true), read('--callers', false)];
|
||||
if (fixList === null || touchedHunks === null || testResults === null || callers === null) { process.stderr.write('gstack-review-plan: --fix-check-prompt needs readable --fix-list, --hunks and --tests files (--callers optional)\n'); return EXIT.usage; }
|
||||
process.stdout.write(renderFixCheckPrompt({ fixList, touchedHunks, testResults, callers }));
|
||||
return EXIT.ok;
|
||||
}
|
||||
const base = flag('--base');
|
||||
if (!base) { process.stderr.write(`gstack-review-plan: --base <ref> is required\n${HELP}\n`); return EXIT.usage; }
|
||||
const last = (flag('--last') ?? 'none') as History['last'];
|
||||
|
||||
+13
-1
@@ -165,7 +165,7 @@ unpushed head is `QUEUE_RECEIPT_STALE` to the queue.
|
||||
|
||||
The receipt's `review_loop` object, written from `gstack-review-scope summary
|
||||
--since <REVIEW_SINCE>`, is the loop's machine-readable outcome: `passes`
|
||||
(Step 9 passes this ship ran, 1 to 3), `blocking_found` (distinct blocking
|
||||
(Step 9 full passes this ship ran, 1 or 2), `blocking_found` (distinct blocking
|
||||
findings across them), `deferred` (blocking findings in unchanged code filed
|
||||
as issues, Step 11's late defers included), `noted`, `fixed` and `scope`. The
|
||||
summary line a parent reads prints it as `passes=<n> blocking_found=<k>
|
||||
@@ -173,6 +173,18 @@ deferred=<m>`; the PR body lists the deferred issues under `## Deferred
|
||||
findings` and the below-floor items under `## Review notes`. A pass that finds
|
||||
nothing is `NO FINDINGS` from every reviewer and a pass with no edits, which
|
||||
is the loop's exit, never a failed review ([review-policy.md](review-policy.md)).
|
||||
Three counters appear only when the run recorded them: `fix_checks` (fix-check
|
||||
rows, never passes), `dispatches` (reviewer dispatches by role) and
|
||||
`est_input_tokens` (prompt plus diff bytes the dispatches read, / 4, a relative
|
||||
estimate and never a bill).
|
||||
|
||||
### Report length
|
||||
|
||||
A parent reads many lanes, so length is a cost it pays per lane. A READY block
|
||||
holds its required lines plus at most 150 words; a completion report holds at
|
||||
most 300 words; a subagent brief names the files to read instead of pasting
|
||||
them. Evidence goes in files the report points to. Waits go on operations,
|
||||
never on polling wakes.
|
||||
|
||||
### The outside voice on Capy
|
||||
|
||||
|
||||
+1
-1
@@ -205,7 +205,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<!-- AUTO-GENERATED from adversarial.md.tmpl — do not edit directly -->
|
||||
<!-- Regenerate: bun run gen:skill-docs -->
|
||||
**Step 9's plan governs this step:** run the native pass only on
|
||||
`DISPATCH: adversarial-native` and the outside voice only on
|
||||
`DISPATCH: outside-voice`; otherwise print `ADVERSARIAL: skipped (review plan)`.
|
||||
|
||||
## Step 11: Adversarial review (always-on)
|
||||
|
||||
Every diff gets the Claude adversarial pass. Add Codex when its preflight is ready; unavailable or disabled outside coverage stays explicit.
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
**Step 9's plan governs this step:** run the native pass only on
|
||||
`DISPATCH: adversarial-native` and the outside voice only on
|
||||
`DISPATCH: outside-voice`; otherwise print `ADVERSARIAL: skipped (review plan)`.
|
||||
|
||||
{{ADVERSARIAL_STEP}}
|
||||
|
||||
{{LEARNINGS_LOG}}
|
||||
|
||||
@@ -13,6 +13,14 @@ Steps 10–11 queue findings without editing; include those findings in this pas
|
||||
Every repeat starts before the checklist read and captures a fresh REVIEW_START.
|
||||
Finish the complete review and QA before applying any fix in Step 9.4.
|
||||
|
||||
**Review plan.** Pass 1 runs `~/.claude/skills/gstack/bin/gstack-review-plan
|
||||
--base <base>`; a repeat uses decision 2's run. Save its `REVIEW_PLAN:` line and
|
||||
fingerprint. Dispatch exactly its `DISPATCH:` lines (specialists, Red Team, Step
|
||||
11's voices), each at its `effort=` on the same model family; a `SKIP:` reviewer
|
||||
logs `{"dispatched":false,"reason":"scope"}`. Audits run at `AUDIT_EFFORT:`. The
|
||||
core checklist, gate scan and QA always run. Item 6's row adds
|
||||
`"dispatches":[{"role":R,"prompt_bytes":N,"diff_bytes":N}]`.
|
||||
|
||||
**Pass 2+ reads the range, not the tree** (`review_scope frozen`): the core read
|
||||
in item 2 becomes `git diff $RANGE_BASE`, and every dispatched prompt (specialists,
|
||||
Red Team, the Step 11 reviewers) carries a literal sha you write in:
|
||||
@@ -797,18 +805,27 @@ Apply these decisions in order:
|
||||
resume at the next decision; otherwise run a fresh complete Step 9. A successful
|
||||
peer or a QA exception cannot replace missing dispatched coverage.
|
||||
2. **Third fixing cycle reached (`CYCLES >= 3`):** STOP and report recurring findings with
|
||||
`converged:false`; do not run a fourth fixing cycle. Under `frozen` the cap comes
|
||||
sooner: a blocking finding still in `fix` scope on pass 3 (`PASS >= 3`) stops
|
||||
here too, unfixed. Name each blocking finding (path, severity, problem) for the
|
||||
owner. Deferred and noted items are never recurring findings, so a capped pass
|
||||
`converged:false`; do not run a fourth fixing cycle. Under `frozen` the plan
|
||||
decides sooner: `gstack-review-plan --base <base> --pass $PASS --last full` with
|
||||
each flag that holds (`--fixed-blocking`, `--fixed-below`, `--blocking-open`,
|
||||
`--touched-gate` for a fix to an item 2.5 path, `--reviewed-numbers <fp>`).
|
||||
`NEXT: stop` stops here, unfixed; `full` is decision 3, `fix-check` 3.5, `done` 4.
|
||||
Name each blocking finding (path, severity, problem) for the owner. Deferred and noted items are never recurring findings, so a capped pass
|
||||
whose remaining findings are all below the floor applies no edits and continues
|
||||
at decision 4: the loop ships below the floor. The cap is a stop, not an
|
||||
approval: a blocker it leaves standing is reported, never waved through.
|
||||
3. **Fixes applied below the cap:** Insert Step 5, affected Steps 6–8 and all of
|
||||
Step 9 before the pending Step 10 in the work list. If the fixes grew the diff
|
||||
Step 9 before the pending Step 10 in the work list (`NEXT: full`). If the fixes grew the diff
|
||||
past what the request needs (a helper, a guard, a case nothing takes), cut that
|
||||
growth before anything else; the repeat reviews the cut as part of the range. Tests must pass or retain approval for the same verified pre-existing
|
||||
failures and scope. Keep CYCLES and scoped approvals across this repeat; PASS increments on entry.
|
||||
3.5. **One fix-check.** Take a `gstack-review-log --start review` token; write the
|
||||
fix list, touched hunks (`git diff $PASS_HEAD`), callers of changed symbols and
|
||||
test results to `.gstack/tmp/fix-check-*.txt`; dispatch one full-effort reviewer
|
||||
on `gstack-review-plan --fix-check-prompt --fix-list <f> --hunks <f> --tests <f>
|
||||
--callers <f>`, plus the outside voice only if the plan lists it. Log item 6's
|
||||
row as `"skill":"review-fix-check"` with `--finish <token>`; not a pass. A
|
||||
CRITICAL stops as decision 2; else decision 4.
|
||||
4. **No edits in this pass:** Resolve the required-probe gate below. Only after it
|
||||
clears may you continue to Step 10. A pass whose only findings were deferred or
|
||||
noted applied no edits and continues here: the loop converges below the floor.
|
||||
|
||||
@@ -11,6 +11,14 @@ Steps 10–11 queue findings without editing; include those findings in this pas
|
||||
Every repeat starts before the checklist read and captures a fresh REVIEW_START.
|
||||
Finish the complete review and QA before applying any fix in Step 9.4.
|
||||
|
||||
**Review plan.** Pass 1 runs `~/.claude/skills/gstack/bin/gstack-review-plan
|
||||
--base <base>`; a repeat uses decision 2's run. Save its `REVIEW_PLAN:` line and
|
||||
fingerprint. Dispatch exactly its `DISPATCH:` lines (specialists, Red Team, Step
|
||||
11's voices), each at its `effort=` on the same model family; a `SKIP:` reviewer
|
||||
logs `{"dispatched":false,"reason":"scope"}`. Audits run at `AUDIT_EFFORT:`. The
|
||||
core checklist, gate scan and QA always run. Item 6's row adds
|
||||
`"dispatches":[{"role":R,"prompt_bytes":N,"diff_bytes":N}]`.
|
||||
|
||||
**Pass 2+ reads the range, not the tree** (`review_scope frozen`): the core read
|
||||
in item 2 becomes `git diff $RANGE_BASE`, and every dispatched prompt (specialists,
|
||||
Red Team, the Step 11 reviewers) carries a literal sha you write in:
|
||||
@@ -211,18 +219,27 @@ Apply these decisions in order:
|
||||
resume at the next decision; otherwise run a fresh complete Step 9. A successful
|
||||
peer or a QA exception cannot replace missing dispatched coverage.
|
||||
2. **Third fixing cycle reached (`CYCLES >= 3`):** STOP and report recurring findings with
|
||||
`converged:false`; do not run a fourth fixing cycle. Under `frozen` the cap comes
|
||||
sooner: a blocking finding still in `fix` scope on pass 3 (`PASS >= 3`) stops
|
||||
here too, unfixed. Name each blocking finding (path, severity, problem) for the
|
||||
owner. Deferred and noted items are never recurring findings, so a capped pass
|
||||
`converged:false`; do not run a fourth fixing cycle. Under `frozen` the plan
|
||||
decides sooner: `gstack-review-plan --base <base> --pass $PASS --last full` with
|
||||
each flag that holds (`--fixed-blocking`, `--fixed-below`, `--blocking-open`,
|
||||
`--touched-gate` for a fix to an item 2.5 path, `--reviewed-numbers <fp>`).
|
||||
`NEXT: stop` stops here, unfixed; `full` is decision 3, `fix-check` 3.5, `done` 4.
|
||||
Name each blocking finding (path, severity, problem) for the owner. Deferred and noted items are never recurring findings, so a capped pass
|
||||
whose remaining findings are all below the floor applies no edits and continues
|
||||
at decision 4: the loop ships below the floor. The cap is a stop, not an
|
||||
approval: a blocker it leaves standing is reported, never waved through.
|
||||
3. **Fixes applied below the cap:** Insert Step 5, affected Steps 6–8 and all of
|
||||
Step 9 before the pending Step 10 in the work list. If the fixes grew the diff
|
||||
Step 9 before the pending Step 10 in the work list (`NEXT: full`). If the fixes grew the diff
|
||||
past what the request needs (a helper, a guard, a case nothing takes), cut that
|
||||
growth before anything else; the repeat reviews the cut as part of the range. Tests must pass or retain approval for the same verified pre-existing
|
||||
failures and scope. Keep CYCLES and scoped approvals across this repeat; PASS increments on entry.
|
||||
3.5. **One fix-check.** Take a `gstack-review-log --start review` token; write the
|
||||
fix list, touched hunks (`git diff $PASS_HEAD`), callers of changed symbols and
|
||||
test results to `.gstack/tmp/fix-check-*.txt`; dispatch one full-effort reviewer
|
||||
on `gstack-review-plan --fix-check-prompt --fix-list <f> --hunks <f> --tests <f>
|
||||
--callers <f>`, plus the outside voice only if the plan lists it. Log item 6's
|
||||
row as `"skill":"review-fix-check"` with `--finish <token>`; not a pass. A
|
||||
CRITICAL stops as decision 2; else decision 4.
|
||||
4. **No edits in this pass:** Resolve the required-probe gate below. Only after it
|
||||
clears may you continue to Step 10. A pass whose only findings were deferred or
|
||||
noted applied no edits and continues here: the loop converges below the floor.
|
||||
|
||||
+1
-1
@@ -205,7 +205,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
+1
-1
@@ -205,7 +205,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
+1
-1
@@ -203,7 +203,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
+1
-1
@@ -205,7 +205,7 @@ not a commit ID. Use `git diff <old-tree> <new-tree>` to compare these snapshots
|
||||
**Review policy** (docs/review-policy.md): a finding blocks another review pass
|
||||
only when it would fail a test, break production, or lose data or secrets;
|
||||
everything below that floor ships as a named note in the PR body. Pass 1 reviews
|
||||
the diff; later passes read only the range since the previous pass; three passes
|
||||
the diff; a later pass reads only the range; two full passes plus one fix-check
|
||||
is the cap. `NO FINDINGS` is a complete reviewer result. The ship receipt's
|
||||
`review_loop` counters record the outcome; `ship: review_scope` (Step 3) is the knob.
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@ export const CARVE_GUARDS: Record<string, CarveGuard> = {
|
||||
// wave's headline capability) grows the union to 1.195x. Deliberate:
|
||||
// the section is on-demand (loads only for Apple store targets), so
|
||||
// per-invocation cost for non-iOS ships is one manifest line.
|
||||
maxSizeRatio: 1.7529, // GSTA-128 flaky pass (#3516, 2026-10-27, GStack Minder's rule 19 grant): the review-army section's small-diff clause names State Machines as item 9's call and a State Machines-only specialist list, +5 union bytes on a main (703b0049, v1.91.280.0) that sat 4 bytes under the 1.7524 cap after #3515 and #3517; measured 328,937 / 187,706 = 1.7524 (before: 328,932 = 1.7524) on the merged tree, pinned one in the last place above. Before that: GSTA-96 hoist merged with v1.91.273.0 (#3501, 2026-10-27): main's 1.7500 plus the hoist's own raise, no trim; measured 328,918 / 187,706 = 1.7523 on the merged tree. Before: Shared advisory identity/dedup + critical-severity validation: 248,065 union bytes / 187,706 baseline = 1.3216 (2026-09-17). + test value bar in the lazy Step 7 section (value cards, weak paths, gate table, base control, machine checks; ~13.6KB): measured 1.396 (2026-09-29). + W1 guarded state-root resolution (`eval gstack-paths; : "${GSTACK_STATE_ROOT:?…}"`) in the Context Recovery preamble, the eureka log and each state-writing bash block; measured 1.401 (2026-09-30). + the shared QA review step's plan-check timing rule (plan checks and their revalidation run on --timeout-ms after smoke expiry); measured 1.4022 (2026-09-30). + the shared TEST_BOOTSTRAP owned-change undo rules (s03 H1-H3, M1) and the value-bar coverage wording (s03 M2/M3); measured 1.4044 (2026-10-02). + severe fix wave ship-review lane: G1 NO_VERSION dispatch, title and CHANGELOG arms (versionless repos ship without inventing a version), F1 parent-side plan binding before the audit dispatch (binding, docs/designs candidates, exact not-run line) and D3's data-not-instructions line; +2,126 union bytes, measured 1.4135 (2026-10-03). + INV-1 consumer lines (outside review `unverified`/`unavailable` is missing coverage in the readiness note and PR body); measured 1.4148 (2026-10-03). + v1.91.19.0 severe fix wave: verdict-form outside-review callers with sandbox preflight and first-use notice (INV-1/B1/Q2), P0/P1 gate and unverified wording, bound-plan discovery (F1), visible LEARNINGS failures (B5), carved external pointers; measured 267,752 / 187,706 = 1.4264 (2026-10-03). + v1.91.18.0 (#3023) merged into the v1.91.19.0 wave; measured 267,874 / 187,706 = 1.4271 (2026-10-04). + Oct 6 fix wave: quota_exhausted preflight branch (#3051) and quoted-heredoc issue template (#3046); measured 268,199 / 187,706 = 1.4288 (2026-10-06). + Step 10's inline no-PR check before the Greptile dispatch (#3020); measured 268,655 / 187,706 = 1.4313 (2026-10-06). + Oct 6 fix wave A3/CEO-12: free text reaches commands only through agent-written mktemp files (mktemp block, write rule, path rebuild and refusal at each posting, prompt and brief site); measured 275,422 / 187,706 = 1.4673 (2026-10-06). Combined Oct 6 wave head (B free-text files + D measure loop + A rework): measured 280,363 / 187,706 = 1.4936 (2026-10-06). + gate-once push rule (no second paid gate after a CI push); measured 280,573 / 187,706 = 1.4947 (2026-10-06). + the measurement bar's decision step (exit-code branches for MEETS, MEETS-qualified, needs-classify with the qualifying and fix-round classes, EXTEND once; the measure prose was tightened to offset most of it); measured 281,058 / 187,706 = 1.4973 (2026-10-06). + Oct 7 wave B3: the Codex probe runs as a command (select-model capture lines, check-sandbox/probe-model/run-with-timeout subcommands) instead of being sourced; measured 281,438 / 187,706 = 1.4994 (2026-10-07). + Oct 7 wave CEO-28/DX-11: review prompts ask for a severity per finding and design proposals use the proposal gate; measured 281,556 / 187,706 = 1.5000 (2026-10-07). + Oct 7 wave B4: /ship publishes through gstack-post (title prepared in a file in the pr-body section, compose block plus gstack-post exit-code branches replacing the two scans); measured 281,894 / 187,706 = 1.5018 (2026-10-07). + B2 early Greptile PR (lazy Step 6.5 section: detect, public-repo consent, push, provisional title file, open; Step 10's bounded wait; the stop-leaves-the-draft rule); measured 286,626 / 187,706 = 1.5270 (2026-10-07). B3, the classifier, B4 and B2 merged: measured 287,128 / 187,706 = 1.5297 (2026-10-07). + Oct 7 wave guard (CEO-20): conditional `run_in_background` request plus the background-run recovery at each foreground dispatch site; measured 281,370 / 187,706 = 1.4990 (2026-10-07). Merged with the guard area: measured 287,440 / 187,706 = 1.5313 (2026-10-07). + Oct 8 wave: the defensive-security framing and fixture summary mode reach the security specialist and the Red Team (stated once in the dispatch, referenced by the Red Team); measured 288,783 / 187,706 = 1.5385 (2026-10-08). + gate integrity (HONEST_WORK_GATE_INTEGRITY W3): the shared GATE_SCAN_BLOCK in the core checklist (2.5) and after Step 7's child, the four-option gate question and record fields in 9.4, tests_ran states in Step 5, Gate edits and per-lane counts in the PR body with draft-whil
Line truncated
|
||||
maxSizeRatio: 1.7610, // GSTA-131 token efficiency (2026-10-27, Garry's D1; GStack Minder's re-pin with the rule 19 grant): the review-army section's review plan (gstack-review-plan dispatch lines and effort, the plan-driven repeat decision, the 3.5 fix-check) and the adversarial section's plan line, +1,515 union bytes; measured 330,539 / 187,706 = 1.76094 on the tree merged with 10b77de4 (before: 329,024 = 1.75287). Before that: GSTA-128 flaky pass (#3516, 2026-10-27, GStack Minder's rule 19 grant): the review-army section's small-diff clause names State Machines as item 9's call and a State Machines-only specialist list, +5 union bytes on a main (703b0049, v1.91.280.0) that sat 4 bytes under the 1.7524 cap after #3515 and #3517; measured 328,937 / 187,706 = 1.7524 (before: 328,932 = 1.7524) on the merged tree, pinned one in the last place above. Before that: GSTA-96 hoist merged with v1.91.273.0 (#3501, 2026-10-27): main's 1.7500 plus the hoist's own raise, no trim; measured 328,918 / 187,706 = 1.7523 on the merged tree. Before: Shared advisory identity/dedup + critical-severity validation: 248,065 union bytes / 187,706 baseline = 1.3216 (2026-09-17). + test value bar in the lazy Step 7 section (value cards, weak paths, gate table, base control, machine checks; ~13.6KB): measured 1.396 (2026-09-29). + W1 guarded state-root resolution (`eval gstack-paths; : "${GSTACK_STATE_ROOT:?…}"`) in the Context Recovery preamble, the eureka log and each state-writing bash block; measured 1.401 (2026-09-30). + the shared QA review step's plan-check timing rule (plan checks and their revalidation run on --timeout-ms after smoke expiry); measured 1.4022 (2026-09-30). + the shared TEST_BOOTSTRAP owned-change undo rules (s03 H1-H3, M1) and the value-bar coverage wording (s03 M2/M3); measured 1.4044 (2026-10-02). + severe fix wave ship-review lane: G1 NO_VERSION dispatch, title and CHANGELOG arms (versionless repos ship without inventing a version), F1 parent-side plan binding before the audit dispatch (binding, docs/designs candidates, exact not-run line) and D3's data-not-instructions line; +2,126 union bytes, measured 1.4135 (2026-10-03). + INV-1 consumer lines (outside review `unverified`/`unavailable` is missing coverage in the readiness note and PR body); measured 1.4148 (2026-10-03). + v1.91.19.0 severe fix wave: verdict-form outside-review callers with sandbox preflight and first-use notice (INV-1/B1/Q2), P0/P1 gate and unverified wording, bound-plan discovery (F1), visible LEARNINGS failures (B5), carved external pointers; measured 267,752 / 187,706 = 1.4264 (2026-10-03). + v1.91.18.0 (#3023) merged into the v1.91.19.0 wave; measured 267,874 / 187,706 = 1.4271 (2026-10-04). + Oct 6 fix wave: quota_exhausted preflight branch (#3051) and quoted-heredoc issue template (#3046); measured 268,199 / 187,706 = 1.4288 (2026-10-06). + Step 10's inline no-PR check before the Greptile dispatch (#3020); measured 268,655 / 187,706 = 1.4313 (2026-10-06). + Oct 6 fix wave A3/CEO-12: free text reaches commands only through agent-written mktemp files (mktemp block, write rule, path rebuild and refusal at each posting, prompt and brief site); measured 275,422 / 187,706 = 1.4673 (2026-10-06). Combined Oct 6 wave head (B free-text files + D measure loop + A rework): measured 280,363 / 187,706 = 1.4936 (2026-10-06). + gate-once push rule (no second paid gate after a CI push); measured 280,573 / 187,706 = 1.4947 (2026-10-06). + the measurement bar's decision step (exit-code branches for MEETS, MEETS-qualified, needs-classify with the qualifying and fix-round classes, EXTEND once; the measure prose was tightened to offset most of it); measured 281,058 / 187,706 = 1.4973 (2026-10-06). + Oct 7 wave B3: the Codex probe runs as a command (select-model capture lines, check-sandbox/probe-model/run-with-timeout subcommands) instead of being sourced; measured 281,438 / 187,706 = 1.4994 (2026-10-07). + Oct 7 wave CEO-28/DX-11: review prompts ask for a severity per finding and design proposals use the proposal gate; measured 281,556 / 187,706 = 1.5000 (2026-10-07). + Oct 7 wave B4: /ship publishes through gstack-post (title prepared in a file in the pr-body section, compose block plus gstack-post exit-code branches replacing the two scans); measured 281,894 / 187,706 = 1.5018 (2026-10-07). + B2 early Greptile PR (lazy Step 6.5 section: detect, public-repo consent, push, provisional title file, open; Step 10's bounded wait; the stop-leaves-the-draft rule); measured 286,626 / 187,706 = 1.5270 (2026-10-07). B3, the classifier, B4 and B2 merged: measured 287,128 / 187,706 = 1.5297 (2026-10-07). + Oct 7 wave guard (CEO-20): conditional `run_in_background` request plus the background-run recovery at each foreground dispatch site; measured 281,370 / 187,706 = 1.4990 (2026-10-07). Merged with the guard area: measured 287,440 / 187,706 = 1.5313 (2026-10-07). + Oct 8 wave: the defensive-security framing and fixture summary mode reach the security spec
Line truncated
|
||||
},
|
||||
'plan-ceo-review': {
|
||||
skill: 'plan-ceo-review',
|
||||
|
||||
@@ -46,6 +46,18 @@ describe('gstack-review-plan', () => {
|
||||
expect(r.stdout).toContain('next=fix-check dispatches=1');
|
||||
expect(r.stdout).toContain('DISPATCH: fix-check fix-check effort=full');
|
||||
});
|
||||
test('--fix-check-prompt renders the fix-check reviewer prompt from the parent\'s files and refuses a missing one', () => {
|
||||
const r = repo({ 'docs/howto.md': '# x\n' });
|
||||
const w = (n: string, t: string) => { const f = path.join(r.state, n); fs.writeFileSync(f, t); return f; };
|
||||
const files = ['--fix-list', w('fix.txt', 'lib/a.ts:3 guard now refuses unknown'), '--hunks', w('hunks.diff', '+if (s !== "MERGED") return false;'), '--tests', w('tests.txt', '12 pass 0 fail')];
|
||||
const ok = spawnSync(BIN, ['--fix-check-prompt', ...files], { cwd: r.dir, encoding: 'utf8', timeout: 60_000 });
|
||||
expect(ok.status).toBe(0);
|
||||
expect(ok.stdout).toContain('You are the fix-check reviewer');
|
||||
expect(ok.stdout).toContain('lib/a.ts:3 guard now refuses unknown');
|
||||
expect(ok.stdout).toContain('(none found)');
|
||||
const missing = spawnSync(BIN, ['--fix-check-prompt', '--fix-list', path.join(r.state, 'nope.txt'), '--hunks', files[3]!, '--tests', files[5]!], { cwd: r.dir, encoding: 'utf8', timeout: 60_000 });
|
||||
expect(missing.status).toBe(2);
|
||||
});
|
||||
test('usage errors exit 2', () => {
|
||||
expect(spawnSync(BIN, [], { encoding: 'utf8', timeout: 10_000 }).status).toBe(2);
|
||||
expect(run(repo({ 'a.md': 'x' }), ['--last', 'later']).status).toBe(2);
|
||||
|
||||
Reference in new issue
Block a user