test(ship): keep the Step 9 first-entry and Fix-First phrasing the skip/requeue contract asserts; fill the review record's pass, review_scope and range_base placeholders in the caller template test; narrow a test type

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-26 15:30:51 +00:00
1 parent 0d5c0f6fbf
commit 6f5782b5fd
4 files changed
+13 -10

No files matched your search

+5 -4
View File
@@ -2,9 +2,9 @@
<!-- Regenerate: bun run gen:skill-docs -->
## Step 9: Pre-Landing Review
On first entry only: set CYCLES to 0 and PASS to 1, save
`REVIEW_SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)` and the `ship: review_scope` policy
line (Step 3). Every entry saves `PASS_HEAD=$(git rev-parse HEAD)`; from pass 2 on,
Set CYCLES to 0 on first entry only, with PASS set to 1,
`REVIEW_SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)` saved and the `ship: review_scope`
policy line (Step 3) kept. Every entry saves `PASS_HEAD=$(git rev-parse HEAD)`; from pass 2 on,
`RANGE_BASE` is the previous pass's PASS_HEAD. Keep existing approvals; changed
finding scope needs a new decision. Order: checklist/design, specialists (9.1),
Red Team (9.2), QA (9.2.1), dedup (9.3), scope, fixes and logging (9.4).
@@ -635,7 +635,8 @@ but missing dispatched output still blocks continuation, even with a QA exceptio
code is `fix`, never `defer`; under `all` everything is `fix`. Save the `REVIEW_SCOPE:` line.
A `REVIEW_SCOPE_INPUT` or `REVIEW_SCOPE_RANGE` refusal is a STOP until repaired.
1. **Classify only `scope: fix` findings as AUTO-FIX or ASK** per the Fix-First Heuristic in
1. **Classify only unmatched or reopened findings as AUTO-FIX or ASK** when the
classified output marks them `scope: fix`, per the Fix-First Heuristic in
checklist.md. Critical findings lean toward ASK; informational lean toward AUTO-FIX.
2. **Auto-fix all AUTO-FIX items.** Apply each fix. Output one line per fix:
+5 -4
View File
@@ -1,8 +1,8 @@
## Step 9: Pre-Landing Review
On first entry only: set CYCLES to 0 and PASS to 1, save
`REVIEW_SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)` and the `ship: review_scope` policy
line (Step 3). Every entry saves `PASS_HEAD=$(git rev-parse HEAD)`; from pass 2 on,
Set CYCLES to 0 on first entry only, with PASS set to 1,
`REVIEW_SINCE=$(date -u +%Y-%m-%dT%H:%M:%SZ)` saved and the `ship: review_scope`
policy line (Step 3) kept. Every entry saves `PASS_HEAD=$(git rev-parse HEAD)`; from pass 2 on,
`RANGE_BASE` is the previous pass's PASS_HEAD. Keep existing approvals; changed
finding scope needs a new decision. Order: checklist/design, specialists (9.1),
Red Team (9.2), QA (9.2.1), dedup (9.3), scope, fixes and logging (9.4).
@@ -81,7 +81,8 @@ but missing dispatched output still blocks continuation, even with a QA exceptio
code is `fix`, never `defer`; under `all` everything is `fix`. Save the `REVIEW_SCOPE:` line.
A `REVIEW_SCOPE_INPUT` or `REVIEW_SCOPE_RANGE` refusal is a STOP until repaired.
1. **Classify only `scope: fix` findings as AUTO-FIX or ASK** per the Fix-First Heuristic in
1. **Classify only unmatched or reopened findings as AUTO-FIX or ASK** when the
classified output marks them `scope: fix`, per the Fix-First Heuristic in
checklist.md. Critical findings lean toward ASK; informational lean toward AUTO-FIX.
2. **Auto-fix all AUTO-FIX items.** Apply each fix. Output one line per fix:
+2 -1
View File
@@ -326,7 +326,8 @@ describe('caller native-event observer controls', () => {
.replace('"commit":"COMMIT"', `"commit":"'"$(git rev-parse --short HEAD)"'"`)
.replace('"STATUS"', '"issues_found"').replace(/"issues_found":N/, '"issues_found":1').replace('"critical":N', '"critical":1').replace('"informational":N', '"informational":0')
.replace('SCORE', '10.0').replace('SPECIALISTS_JSON', '{}').replace('FINDINGS_JSON', '[{"fingerprint":"scale.ts:3:functional-contract","severity":"CRITICAL","action":"ask-pending"}]')
.replace('COMPLETED', 'false').replace('CONVERGED', 'false').replace('CYCLES', '0').replace('REVIEW_START', 'native-token');
.replace('COMPLETED', 'false').replace('CONVERGED', 'false').replace('CYCLES', '0').replace('REVIEW_START', 'native-token')
.replace('"pass":PASS', '"pass":1').replace('"review_scope":"SCOPE"', '"review_scope":"frozen"').replace('RANGE_BASE_OR_NULL', 'null');
expect(errorsFor(filled)).toEqual([]);
const fixture = createQaCallerFixture(caller === 'review' ? 'review-exploratory-small-cli' : 'ship-exploratory-small-cli', { installRuntime: false });
try { expect(qaCallerSessionOptions(fixture, 'free-control').prompt).toContain(callerReviewRecordTemplate(fixture)); } finally { fs.rmSync(fixture.root, { recursive: true, force: true }); }
+1 -1
View File
@@ -104,7 +104,7 @@ describe('scope decisions', () => {
const p2 = by(scopeFindings(findings, { policy: 'diff-plus-blocking', pass: 2, diffHunks: diff, rangeHunks: range }));
expect(p2['lib/legacy.ts:7:data-loss']).toBe('outside/defect/blocking/fix');
expect(p2['src/auth.ts:42:naming']).toBe('diff/defect/below/note');
expect(Object.values(p2).some(v => v.endsWith('/defer'))).toBe(false);
expect(Object.values(p2).some(v => String(v).endsWith('/defer'))).toBe(false);
});
test('frozen pass 2+: only blocking findings in the range or the diff are fixed; everything below the floor is a note', () => {