From 4fdbcc1ca9fe78ccb9a3f29a7ae08c26f00e1917 Mon Sep 17 00:00:00 2001 From: garrytan Date: Sat, 31 Oct 2026 05:52:01 +0000 Subject: [PATCH] fix(review): build the GSTA-160 floor on #3660's floor words; pin the changed briefs under a pending GSTA-160 replay entry The resolver floor now extends lib/review-scope.ts BLOCKING_FLOOR (the prose voices' copy) with the security clause, so every copy contains #3660's floor words and the voices stay at G1 bytes. fix-check carries the sentence literally for the F10 copy check. Two review-skill lines are shortened to keep the generated SKILL.md size pins from growing. Replay: 4c53e80a (pre-#3660 wording); GSTA-167 cohort no-loss arm on these bytes pending. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --- changelog.d/gsta160-severity-floor.md | 6 +++--- docs/review-policy.md | 2 +- docs/ship-policy.md | 2 +- review/SKILL.md | 4 ++-- review/SKILL.md.tmpl | 4 ++-- review/checklist.md | 4 ++-- review/sections/review-army.md | 4 ++-- scripts/resolvers/fix-check.ts | 7 +++---- scripts/resolvers/review-army.ts | 2 +- scripts/resolvers/review-floor.ts | 7 +++++-- ship/SKILL.md | 2 +- ship/SKILL.md.tmpl | 2 +- ship/sections/review-army.md | 4 ++-- test/fixtures/golden/agy-ship-SKILL.md | 2 +- test/fixtures/golden/claude-ship-SKILL.md | 2 +- test/fixtures/golden/codex-ship-SKILL.md | 2 +- test/fixtures/golden/factory-ship-SKILL.md | 2 +- test/fixtures/skill-md-size-allowlist.json | 16 ++++++++-------- test/review-packets-removed.test.ts | 10 +++++----- test/review-severity-floor.test.ts | 6 +++--- .../size-ledger/ship/gsta160-severity-floor.json | 2 +- 21 files changed, 47 insertions(+), 45 deletions(-) diff --git a/changelog.d/gsta160-severity-floor.md b/changelog.d/gsta160-severity-floor.md index 1c7767d5b..b9ddd2f51 100644 --- a/changelog.d/gsta160-severity-floor.md +++ b/changelog.d/gsta160-severity-floor.md @@ -1,12 +1,12 @@ -**A real bug now gets the CRITICAL label because of what it breaks, not because of the checklist section or reviewer lens that found it (GSTA-160).** Every gstack reviewer prompt carries one blocking-floor sentence: a finding that would fail a test, break production, lose data or secrets, or open a security hole (injection, auth bypass, secret exposure) is CRITICAL, and everything else is INFORMATIONAL. On a preregistered replay of GSTA-11's 12 real gstack bugs, Opus 5.5 with gstack's /review prompts went from 4 to 6 CRITICAL catches out of 36 trials. False alarms on clean decoys fell from 5 to 3 of 24 (Haiku: 7 to 4). The replay's main bar was 10 catches, and Garry approved shipping below it; the remaining gap is GST-389. +**A real bug now gets the CRITICAL label because of what it breaks, not because of the checklist section or reviewer lens that found it (GSTA-160).** The core checklist, every specialist and the fix-check carry one blocking-floor sentence: a finding that would fail a test, break production, or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure) is CRITICAL, and everything else is INFORMATIONAL. On a preregistered replay of GSTA-11's 12 real gstack bugs, Opus 5.5 with gstack's /review prompts went from 4 to 6 CRITICAL catches out of 36 trials. False alarms on clean decoys fell from 5 to 3 of 24 (Haiku: 7 to 4). The replay's main bar was 10 catches, and Garry approved shipping below it; the remaining gap is GST-389. ### Changed - The checklist's two passes now set check order, not severity. The headings are "Pass 1 — check first" and "Pass 2 — check second", and the Severity Classification section opens with the floor, so a Pass 2 finding such as a /retro date-window bug can be CRITICAL. -- **One floor sentence, `BLOCKING_FLOOR`** in `scripts/resolvers/review-floor.ts`, is used by the specialist schema line and the fix-check prompt. `review/SKILL.md`, docs/review-policy.md and docs/ship-policy.md carry it word for word, and `ship/SKILL.md`'s review policy line names the same four cases. +- **One floor sentence, `BLOCKING_FLOOR`** in `scripts/resolvers/review-floor.ts`, builds on the prose voices' floor words in `lib/review-scope.ts` and adds the security clause. The specialist schema line uses it; the fix-check prompt, `review/SKILL.md`, docs/review-policy.md and docs/ship-policy.md carry it word for word, and `ship/SKILL.md`'s review policy line names the same four cases. - **Shell injection is no longer Python-only.** It covers bash `eval`, `source` and `sh -c` built from a file, environment variable, argument or network value. - **A state swap before a step that can fail, with no rollback,** is a Pass 1 check (GSTA-159's miss). - **The Testing specialist files a floor-level product defect as `correctness`,** so it blocks instead of reading as a test gap. ### Tests - `test/review-severity-floor.test.ts` checks that the floor appears in every copy, that no checklist heading names a severity, that shell injection covers bash, and that the state-swap check exists. It also checks that a `correctness` CRITICAL from the Testing specialist stays blocking through `classifyFindings`. -- `test/review-packets-removed.test.ts` repins five reviewer briefs on the GSTA-160 replay (prereg 4c53e80a). +- `test/review-packets-removed.test.ts` pins five reviewer briefs under a `GSTA-160` replay entry (prereg 4c53e80a; GSTA-167's cohort no-loss arm on these bytes is pending). diff --git a/docs/review-policy.md b/docs/review-policy.md index 3270e20be..4486a5925 100644 --- a/docs/review-policy.md +++ b/docs/review-policy.md @@ -11,7 +11,7 @@ instead of restating it. A one-line crew rule is enough: ## The blocking floor A finding is **blocking** when it is a CRITICAL defect. CRITICAL is the blocking -floor: a finding that would fail a test, break production, lose data or secrets, or +floor: a finding that would fail a test, break production, or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. Below the floor are an advisory, an informational item, a test finding (category `testing`: a gap, a weak or flaky test), a wording or naming diff --git a/docs/ship-policy.md b/docs/ship-policy.md index efeb3b7ee..0fee6b990 100644 --- a/docs/ship-policy.md +++ b/docs/ship-policy.md @@ -985,7 +985,7 @@ construction: gives each one a `locus` (`diff`: a hunk the PR changed, with three lines of context; `outside`: anything else), a `kind`, `blocking` and a `scope`. `blocking` is a CRITICAL defect. CRITICAL is the blocking floor: a finding that - would fail a test, break production, lose data or secrets, or open a security hole + would fail a test, break production, or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. An advisory, an informational item, a test gap or a wording note is below the floor. Pass 1 fixes findings in diff --git a/review/SKILL.md b/review/SKILL.md index daa69f788..ffd80dce4 100644 --- a/review/SKILL.md +++ b/review/SKILL.md @@ -457,9 +457,9 @@ Use this host's installation, never the product tree. If missing or unreadable, QA's `sections/...` and `templates/...` paths resolve from installed QA SKILL.md, not caller/product. -Apply both checklist passes in order with its suppressions; neither sets severity. +Apply both checklist passes in order with suppressions; neither sets severity. CRITICAL is the blocking floor: a finding that would fail a test, break production, -lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). +or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. `NO FINDINGS` is a complete result from any reviewer. **Sideways sweep (every finding; reads code OUTSIDE the diff).** Grep the finding's pattern at every other ingress, command and call site, Read each match and rate severity on the worst sibling; a new enum value, status, tier or type constant is traced through every consumer the same way (checklist: Sideways sweep). Data loss, a trust-boundary bypass or uncapped spend is forced CRITICAL: no lane, specialist, dedup or saved decision downgrades it. Keep findings anchored to changed code. diff --git a/review/SKILL.md.tmpl b/review/SKILL.md.tmpl index 45f0fce03..16fe25d1c 100644 --- a/review/SKILL.md.tmpl +++ b/review/SKILL.md.tmpl @@ -169,9 +169,9 @@ the core review. {{QA_REVIEW_PREFLIGHT}} -Apply both checklist passes in order with its suppressions; neither sets severity. +Apply both checklist passes in order with suppressions; neither sets severity. CRITICAL is the blocking floor: a finding that would fail a test, break production, -lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). +or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. `NO FINDINGS` is a complete result from any reviewer. {{SIDEWAYS_SWEEP}} diff --git a/review/checklist.md b/review/checklist.md index 3b284f31b..58c5d8176 100644 --- a/review/checklist.md +++ b/review/checklist.md @@ -7,7 +7,7 @@ Review the merge-base diff from the caller, including its selected uncommitted a **Two-pass review:** - **Pass 1 (check first):** Run SQL & Data Safety, Race Conditions, LLM Output Trust Boundary, Shell Injection, Enum Completeness, and Gate Integrity first. These categories hold blocking defects most often. - **Pass 2 (check second):** Run remaining categories below. Still actioned. -- **The pass never sets severity.** Rate every finding from either pass by the blocking floor (Severity Classification below): a Pass 2 finding that would fail a test, break production, lose data or secrets, or open a security hole is CRITICAL, and a Pass 1 finding that would not is INFORMATIONAL. +- **The pass never sets severity.** Rate every finding from either pass by the blocking floor (Severity Classification below): a Pass 2 finding at the floor is CRITICAL, and a Pass 1 finding below it is INFORMATIONAL. - **Specialist categories (handled by parallel subagents, NOT this checklist):** Test Gaps, Dead Code, Magic Numbers, Conditional Side Effects, Performance & Bundle Impact, Crypto & Entropy, Simplification (unrequested structure). See `review/specialists/` for these. Completeness Gaps and Simplification are orthogonal, not contradictory: Completeness pushes coverage UP (tests, edge cases, error paths), Simplification pushes unrequested structure DOWN (one-implementation abstractions, hand-rolled stdlib, dead flexibility). The same diff can legitimately receive both. @@ -165,7 +165,7 @@ A finding is a defect class, not a line. Before rating any finding from either p ## Severity Classification CRITICAL is the blocking floor: a finding that would fail a test, break production, -lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). +or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. A category says what to check and in which order; it never sets severity. Rate every diff --git a/review/sections/review-army.md b/review/sections/review-army.md index 4e6f808ba..7ec2a5304 100644 --- a/review/sections/review-army.md +++ b/review/sections/review-army.md @@ -106,13 +106,13 @@ Every other specialist, including Testing, reads the full diff with fixtures. Required fields: severity, confidence, path, category, summary, specialist. Optional: line, fix, fingerprint, evidence, test_stub, advisory, evidence_paths, helper_target, cause. -CRITICAL is the blocking floor: a finding that would fail a test, break production, lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. +CRITICAL is the blocking floor: a finding that would fail a test, break production, or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. A defect the diff causes but that shows elsewhere (a caller broken by a changed signature, a consumer of a removed export) keeps the victim as `path` and names the changed line in `cause`: {\"cause\":{\"path\":\"file\",\"line\":N}}. Without it the finding reads as pre-existing code. Leave extraction advice to the core shared-code check; report real defects in duplicated code independently, keep advisory metadata on structural advice, and never call a demonstrated defect advisory because a shared helper could fix it. For a finding a test could catch, add a minimal `test_stub` skeleton in the detected test -framework ({TEST_FW}); skip it for architectural or design-only findings. +framework ({TEST_FW}); none for architectural or design-only findings. Output nothing else: no preamble, no summary or commentary. diff --git a/scripts/resolvers/fix-check.ts b/scripts/resolvers/fix-check.ts index f41d99ab6..37001cc9b 100644 --- a/scripts/resolvers/fix-check.ts +++ b/scripts/resolvers/fix-check.ts @@ -3,8 +3,6 @@ * step whose fixes do not earn a full pass. It reads the fixes, never the whole diff. The parent * writes every input in literally: a reviewer never sees the parent's shell. */ -import { BLOCKING_FLOOR } from './review-floor'; - export interface FixCheckInput { fixList: string; touchedHunks: string; callers: string; testResults: string } export const FIX_CHECK_INSTRUCTIONS = `You are the fix-check reviewer for a pre-landing review. An earlier review pass found @@ -16,8 +14,9 @@ fails open (accepts what it refused) or fails closed (refuses what it accepted), behaviour the code had before the fix, an error or unreadable state now read as success, a test made weaker. Name the input or call site that reaches each defect. -Rate each finding against the blocking floor. ${BLOCKING_FLOOR} Output one JSON object per -line, {"severity":"CRITICAL|INFORMATIONAL","path":"","line":,"summary":""}, +Rate each finding against the blocking floor. CRITICAL is the blocking floor: a finding that +would fail a test, break production, or lose data or secrets, or open a security hole (injection, +auth bypass, secret exposure). Everything else is INFORMATIONAL. Output one JSON object per line, {"severity":"CRITICAL|INFORMATIONAL","path":"","line":,"summary":""}, or the two words NO FINDINGS when the fixes are sound.`; export function renderFixCheckPrompt(i: FixCheckInput): string { diff --git a/scripts/resolvers/review-army.ts b/scripts/resolvers/review-army.ts index ae9e34d08..92a8176c6 100644 --- a/scripts/resolvers/review-army.ts +++ b/scripts/resolvers/review-army.ts @@ -153,7 +153,7 @@ A defect the diff causes but that shows elsewhere (a caller broken by a changed Leave extraction advice to the core shared-code check; report real defects in duplicated code independently, keep advisory metadata on structural advice, and never call a demonstrated defect advisory because a shared helper could fix it. For a finding a test could catch, add a minimal \`test_stub\` skeleton in the detected test -framework ({TEST_FW}); skip it for architectural or design-only findings. +framework ({TEST_FW}); none for architectural or design-only findings. Output nothing else: no preamble, no summary or commentary. diff --git a/scripts/resolvers/review-floor.ts b/scripts/resolvers/review-floor.ts index 3cc54373c..85bfe85b1 100644 --- a/scripts/resolvers/review-floor.ts +++ b/scripts/resolvers/review-floor.ts @@ -1,6 +1,9 @@ /** * The blocking floor every gstack reviewer prompt carries (docs/review-policy.md#the-blocking-floor). * One sentence, so the core checklist, each specialist and the fix-check rate severity the - * same way. test/review-severity-floor.test.ts keeps the markdown copies in step. + * same way. It extends lib/review-scope.ts's floor words (the prose voices' copy) with the + * security clause. test/review-severity-floor.test.ts keeps the markdown copies in step. */ -export const BLOCKING_FLOOR = 'CRITICAL is the blocking floor: a finding that would fail a test, break production, lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL.'; +import { BLOCKING_FLOOR as FLOOR_WORDS } from '../../lib/review-scope'; + +export const BLOCKING_FLOOR = `CRITICAL is the blocking floor: a finding that ${FLOOR_WORDS}, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL.`; diff --git a/ship/SKILL.md b/ship/SKILL.md index c3e02da49..9188482a3 100644 --- a/ship/SKILL.md +++ b/ship/SKILL.md @@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl index bbf6d4861..cd1d8faa6 100644 --- a/ship/SKILL.md.tmpl +++ b/ship/SKILL.md.tmpl @@ -74,7 +74,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/ship/sections/review-army.md b/ship/sections/review-army.md index 737bb44b9..0dbbd0baa 100644 --- a/ship/sections/review-army.md +++ b/ship/sections/review-army.md @@ -407,13 +407,13 @@ Every other specialist, including Testing, reads the full diff with fixtures. Required fields: severity, confidence, path, category, summary, specialist. Optional: line, fix, fingerprint, evidence, test_stub, advisory, evidence_paths, helper_target, cause. -CRITICAL is the blocking floor: a finding that would fail a test, break production, lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. +CRITICAL is the blocking floor: a finding that would fail a test, break production, or lose data or secrets, or open a security hole (injection, auth bypass, secret exposure). Everything else is INFORMATIONAL. A defect the diff causes but that shows elsewhere (a caller broken by a changed signature, a consumer of a removed export) keeps the victim as `path` and names the changed line in `cause`: {\"cause\":{\"path\":\"file\",\"line\":N}}. Without it the finding reads as pre-existing code. Leave extraction advice to the core shared-code check; report real defects in duplicated code independently, keep advisory metadata on structural advice, and never call a demonstrated defect advisory because a shared helper could fix it. For a finding a test could catch, add a minimal `test_stub` skeleton in the detected test -framework ({TEST_FW}); skip it for architectural or design-only findings. +framework ({TEST_FW}); none for architectural or design-only findings. Output nothing else: no preamble, no summary or commentary. diff --git a/test/fixtures/golden/agy-ship-SKILL.md b/test/fixtures/golden/agy-ship-SKILL.md index 2bfab079d..fcb7e6b32 100644 --- a/test/fixtures/golden/agy-ship-SKILL.md +++ b/test/fixtures/golden/agy-ship-SKILL.md @@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/test/fixtures/golden/claude-ship-SKILL.md b/test/fixtures/golden/claude-ship-SKILL.md index c3e02da49..9188482a3 100644 --- a/test/fixtures/golden/claude-ship-SKILL.md +++ b/test/fixtures/golden/claude-ship-SKILL.md @@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/test/fixtures/golden/codex-ship-SKILL.md b/test/fixtures/golden/codex-ship-SKILL.md index 70f6a7018..f52203492 100644 --- a/test/fixtures/golden/codex-ship-SKILL.md +++ b/test/fixtures/golden/codex-ship-SKILL.md @@ -206,7 +206,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/test/fixtures/golden/factory-ship-SKILL.md b/test/fixtures/golden/factory-ship-SKILL.md index 977e5421d..7b5e908ef 100644 --- a/test/fixtures/golden/factory-ship-SKILL.md +++ b/test/fixtures/golden/factory-ship-SKILL.md @@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla not a commit ID. Use `git diff ` to compare these snapshots. **Review policy** (docs/review-policy.md): only a finding that would fail a test, -break production, lose data or secrets, or open a security hole blocks a pass; the +break production, or lose data or secrets, or open a security hole blocks a pass; the rest is a PR-body note. Step 9's plan sets both reviews' depth (`--depth-floor standard|full` only raises it). Pass 1 reads the diff, later passes the range; the cap is two full passes and a fix-check. `NO FINDINGS` is complete. `ship: diff --git a/test/fixtures/skill-md-size-allowlist.json b/test/fixtures/skill-md-size-allowlist.json index 25d08a8f9..30c9266c0 100644 --- a/test/fixtures/skill-md-size-allowlist.json +++ b/test/fixtures/skill-md-size-allowlist.json @@ -6,29 +6,29 @@ "agy/gstack-plan-design-review": 110044, "agy/gstack-plan-devex-review": 116496, "agy/gstack-plan-eng-review": 144907, - "agy/gstack-review": 104280, + "agy/gstack-review": 104279, "codex/gstack-autoplan": 108553, "codex/gstack-land-and-deploy": 100284, "codex/gstack-plan-design-review": 111116, "codex/gstack-plan-devex-review": 118004, "codex/gstack-plan-eng-review": 146072, - "codex/gstack-review": 103803, + "codex/gstack-review": 103802, "copilot/gstack-autoplan": 109253, "copilot/gstack-plan-design-review": 110355, "copilot/gstack-plan-devex-review": 115958, "copilot/gstack-plan-eng-review": 145072, - "copilot/gstack-review": 103861, + "copilot/gstack-review": 103860, "cursor/gstack-autoplan": 108485, "cursor/gstack-plan-design-review": 108900, "cursor/gstack-plan-devex-review": 115228, "cursor/gstack-plan-eng-review": 143662, - "cursor/gstack-review": 122131, + "cursor/gstack-review": 122130, "factory/gstack-autoplan": 110763, "factory/gstack-land-and-deploy": 100105, "factory/gstack-plan-design-review": 111675, "factory/gstack-plan-devex-review": 118591, "factory/gstack-plan-eng-review": 146770, - "factory/gstack-review": 125904, + "factory/gstack-review": 125903, "gbrain/gstack-autoplan": 108892, "gbrain/gstack-plan-eng-review": 126289, "hermes/gstack-autoplan": 108891, @@ -37,18 +37,18 @@ "kiro/gstack-plan-design-review": 108752, "kiro/gstack-plan-devex-review": 115080, "kiro/gstack-plan-eng-review": 143524, - "kiro/gstack-review": 121955, + "kiro/gstack-review": 121954, "openclaw/gstack-autoplan": 108715, "openclaw/gstack-plan-eng-review": 124804, "opencode/gstack-autoplan": 109234, "opencode/gstack-plan-design-review": 110187, "opencode/gstack-plan-devex-review": 115836, "opencode/gstack-plan-eng-review": 144931, - "opencode/gstack-review": 122753, + "opencode/gstack-review": 122752, "slate/gstack-autoplan": 108372, "slate/gstack-plan-design-review": 108826, "slate/gstack-plan-devex-review": 115154, "slate/gstack-plan-eng-review": 143593, - "slate/gstack-review": 122043 + "slate/gstack-review": 122042 } } diff --git a/test/review-packets-removed.test.ts b/test/review-packets-removed.test.ts index cfcd2a8e2..6ac4e3af1 100644 --- a/test/review-packets-removed.test.ts +++ b/test/review-packets-removed.test.ts @@ -54,16 +54,16 @@ const NO_LOSS_REPLAYS = { '#3638': 'no-loss round 3: main restored the pre-#3621 reviewers (v1.91.331.0)', 'PR-a': "GSTA-167 variant G Arm 4: structural plan identity at the 14 cohort heads and the free exact re-score of saved C, D and A' findings (parts 4a and 4b)", 'G1': "GSTA-167 variant G Arm G1: live no-loss replay of both prose voices with part 1's prompts, 2 passes, normalizer v2, paired rule against pooled C' (parts 1 and 3; specialists at medium as in C and C2)", - 'GSTA-160': "GSTA-160 severity-floor replay prereg 4c53e80a on GSTA-11's 12 bugs plus decoys (a severity no-loss check: P2, G1 and G2 pass, P1 below bar under Garry's exception); GSTA-167's cohort no-loss arm on these bytes is pending", + 'GSTA-160': "GSTA-160 severity floor: replay prereg 4c53e80a (GSTA-11's 12 bugs plus decoys) passed P2, G1 and G2 on the pre-#3660 wording; GSTA-167's cohort no-loss arm on these bytes is pending", 'L': "GSTA-167 variant G Arm L: live no-loss replay of one batched reader (testing and security plus scoped checklists) and the Red Team on its findings, 2 passes, scored L∘G1 against G1 on the paired rule (part 2)", } as const; type Replay = keyof typeof NO_LOSS_REPLAYS; const REVIEWER_BRIEFS: Record = { - 'ship/sections/review-army.md': { sha: '08503248b4cd816975c3d2b045c64008c5a6e5e0823aee36dfa5077a2b5fada2', replay: 'GSTA-160' }, + 'ship/sections/review-army.md': { sha: '82b93325070c47b9f310d7b1125ae3c2eca032f76672efef0b32f1bc3fb77a01', replay: 'GSTA-160' }, 'ship/sections/adversarial.md': { sha: 'c48aa7717c7438941fa23418367e19a62e07edda7445d0d5a55924e172dd5d33', replay: 'G1' }, - 'review/sections/review-army.md': { sha: '4fa13b9830259649b136df5a6c1beccfcb5c6732921f109730a2a71c671ceba1', replay: 'GSTA-160' }, + 'review/sections/review-army.md': { sha: '6269bb14fde178abd544ae966c0850c6b70dd7e822d73d5996dd4a1cb17d4879', replay: 'GSTA-160' }, 'review/sections/adversarial.md': { sha: 'e6962fa25b78f362654f2954f79683e524d2ebd452d1494f8a2b099888e8e255', replay: 'G1' }, - 'review/checklist.md': { sha: '08e059eafdf22d0fdbc2f8daa2130bb51a5a0cb5fa2ce8a0780cc380e9ddab63', replay: 'GSTA-160' }, + 'review/checklist.md': { sha: 'bcc8d926dd7365b00693863e124b11757b430bff219cecc7e477723bcb1875a1', replay: 'GSTA-160' }, 'review/design-checklist.md': { sha: 'b9205f88313cc64902c0b13e9685722ab8138d3dcc58916154f47274abda7d83', replay: '#3638' }, 'review/gate-integrity.md': { sha: 'f570db344c9a01df633bcaa281d6017f4f12420fd3e0aa3078c1ce06e0df8332', replay: '#3638' }, 'review/specialists/api-contract.md': { sha: '263d23ac119dd601d315c191dbdbd503d47c00264c9c0ca81959559ca11d4e95', replay: '#3638' }, @@ -75,7 +75,7 @@ const REVIEWER_BRIEFS: Record = { 'review/specialists/simplification.md': { sha: 'f33846b1dcf2fdeef82d0744ab2ef48fb4a33b34a737dafc33dd0e891756689f', replay: '#3638' }, 'review/specialists/state-machines.md': { sha: '597215e4438d85d9cc71b48097c61eef7cba4f4b09dc14c92b4b94893b3d3ea2', replay: '#3638' }, 'review/specialists/testing.md': { sha: 'f028ca6da0940b1b8b8861ae5f9c156606c0fc343a554f6da6637f9dac1d2581', replay: 'GSTA-160' }, - 'scripts/resolvers/fix-check.ts': { sha: '2f2fca5db2d3408377dc1ccbd89a820e9ebf9c3152707af7d47896bd074b0c0a', replay: 'GSTA-160' }, + 'scripts/resolvers/fix-check.ts': { sha: '44608ce5713f56989b76f2332255418d8aad91f4638546861d70da31b7ae826e', replay: 'GSTA-160' }, 'lib/review-depth.ts': { sha: 'd4715a5f534d1470c63da879a3d66bb090a9b4929065d1f06c30acd97ef77bb0', replay: 'L' }, }; diff --git a/test/review-severity-floor.test.ts b/test/review-severity-floor.test.ts index 3e349af68..3405d9423 100644 --- a/test/review-severity-floor.test.ts +++ b/test/review-severity-floor.test.ts @@ -24,7 +24,7 @@ afterEach(() => { while (repos.length) cleanup(repos.pop()!); }); describe('one blocking floor in every reviewer prompt', () => { test('the floor names security and keeps the 2026-10-26 words', () => { - expect(BLOCKING_FLOOR).toContain('would fail a test, break production, lose data or secrets, or open a security hole'); + expect(BLOCKING_FLOOR).toContain('would fail a test, break production, or lose data or secrets, or open a security hole'); }); test.each([ @@ -35,7 +35,7 @@ describe('one blocking floor in every reviewer prompt', () => { }); test('the ship skeleton Review policy line names the same four outcomes', () => { - for (const file of ['ship/SKILL.md.tmpl', 'ship/SKILL.md']) expect(read(file)).toContain('only a finding that would fail a test, break production, lose data or secrets, or open a security hole blocks a pass'); + for (const file of ['ship/SKILL.md.tmpl', 'ship/SKILL.md']) expect(read(file)).toContain('only a finding that would fail a test, break production, or lose data or secrets, or open a security hole blocks a pass'); }); test('the fix-check prompt carries it too', () => { @@ -51,7 +51,7 @@ describe('the checklist sets check order, never severity', () => { } expect(checklist).toContain('The pass never sets severity.'); expect(checklist).toContain('A category says what to check and in which order; it never sets severity.'); - expect(read('review/SKILL.md.tmpl')).toContain('Apply both checklist passes in order with its suppressions; neither sets severity.'); + expect(read('review/SKILL.md.tmpl')).toContain('Apply both checklist passes in order with suppressions; neither sets severity.'); expect(read('review/SKILL.md.tmpl')).not.toContain('CRITICAL, then INFORMATIONAL'); }); diff --git a/test/size-ledger/ship/gsta160-severity-floor.json b/test/size-ledger/ship/gsta160-severity-floor.json index 75b63c274..3670d93a1 100644 --- a/test/size-ledger/ship/gsta160-severity-floor.json +++ b/test/size-ledger/ship/gsta160-severity-floor.json @@ -1,4 +1,4 @@ { - "bytes": -49, + "bytes": -46, "why": "GSTA-160: the blocking floor names security; the Review policy line and the specialist schema line were tightened to fit" }