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>
This commit is contained in:
garrytanandcapy-ai[bot] committed 2026-10-31 05:52:01 +00:00
1 parent c8ef82396a
commit 4fdbcc1ca9
21 files changed
+47 -45

No files matched your search

+3 -3
View File
@@ -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).
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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.
+2 -2
View File
@@ -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}}
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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.
+3 -4
View File
@@ -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":"<file>","line":<n>,"summary":"<what breaks, for which input>"},
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":"<file>","line":<n>,"summary":"<what breaks, for which input>"},
or the two words NO FINDINGS when the fixes are sound.`;
export function renderFixCheckPrompt(i: FixCheckInput): string {
+1 -1
View File
@@ -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.
+5 -2
View File
@@ -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.`;
+1 -1
View File
@@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+1 -1
View File
@@ -74,7 +74,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+2 -2
View File
@@ -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.
+1 -1
View File
@@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+1 -1
View File
@@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+1 -1
View File
@@ -206,7 +206,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+1 -1
View File
@@ -208,7 +208,7 @@ token; `--finish` stamps the binding fields automatically. Never borrow or repla
not a commit ID. Use `git diff <old-tree> <new-tree>` 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:
+8 -8
View File
@@ -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
}
}
+5 -5
View File
@@ -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<string, { sha: string; replay: Replay }> = {
'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<string, { sha: string; replay: Replay }> = {
'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' },
};
+3 -3
View File
@@ -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');
});
@@ -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"
}