From 4034a55029ca8fab095d2a5c41dc57c8eeb3b505 Mon Sep 17 00:00:00 2001 From: garrytan Date: Sat, 3 Oct 2026 21:31:56 +0000 Subject: [PATCH] F1: ship and review count unverified/unavailable outside reviews as missing coverage INV-1 consumers in this lane's templates: /ship's readiness note, its PR body Pre-Landing Review section and /review's completion rule now say an outside review reporting unverified or unavailable is missing coverage, never a pass. The PR body's Plan Completion section prints F1's not-run line instead of the old 'No plan file detected.' The /ship union-size cap moves to 1.415 for these lines (measured 1.4148). --- review/SKILL.md.tmpl | 2 ++ ship/SKILL.md.tmpl | 2 ++ ship/sections/pr-body.md.tmpl | 3 ++- test/helpers/carve-guards.ts | 2 +- test/review-workflow-clarity.test.ts | 10 ++++++++++ 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/review/SKILL.md.tmpl b/review/SKILL.md.tmpl index dc0192a55..7a3d9ce3a 100644 --- a/review/SKILL.md.tmpl +++ b/review/SKILL.md.tmpl @@ -383,6 +383,8 @@ Before replying to any comment, run the **Escalation Detection** algorithm from The required in-host adversarial result controls native completion. Optional outside attempts keep their own incomplete records when unavailable and cannot substitute for the native result, or vice versa. Step 4.8's structured-review gate still applies. +An outside review reporting `unverified` or `unavailable` is missing coverage, never a +pass: report it with its reason. - Use Step 4.6's `specialists` object unchanged, including its empty small-diff map. If this host omits Review Army, use `specialists: {}` without claiming specialist coverage. diff --git a/ship/SKILL.md.tmpl b/ship/SKILL.md.tmpl index b65645fb9..278f68990 100644 --- a/ship/SKILL.md.tmpl +++ b/ship/SKILL.md.tmpl @@ -130,6 +130,8 @@ repository-landing asks, including on Apple repos. {{REVIEW_DASHBOARD}} +An outside review with status `unverified` or `unavailable` is missing coverage, never a pass. + For diffs >200 lines (`git diff origin/ --stat | tail -1`), recommend `/plan-eng-review` or `/autoplan` for architecture review. diff --git a/ship/sections/pr-body.md.tmpl b/ship/sections/pr-body.md.tmpl index a111c4c5c..7c802d6f1 100644 --- a/ship/sections/pr-body.md.tmpl +++ b/ship/sections/pr-body.md.tmpl @@ -42,6 +42,7 @@ details for cards whose file type has no known comment syntax.> ## Pre-Landing Review + ## Exploratory QA ## Plan Completion - + ## Linked Spec diff --git a/test/helpers/carve-guards.ts b/test/helpers/carve-guards.ts index bba335129..5cac7250f 100644 --- a/test/helpers/carve-guards.ts +++ b/test/helpers/carve-guards.ts @@ -166,7 +166,7 @@ export const CARVE_GUARDS: Record = { // 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.414, // 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). + maxSizeRatio: 1.415, // 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). }, 'plan-ceo-review': { skill: 'plan-ceo-review', diff --git a/test/review-workflow-clarity.test.ts b/test/review-workflow-clarity.test.ts index e42948bb4..09dfed343 100644 --- a/test/review-workflow-clarity.test.ts +++ b/test/review-workflow-clarity.test.ts @@ -480,3 +480,13 @@ test('review keeps its smoke-clock, setup-authority, plan-gate and findings-sour const persist = skill.slice(skill.indexOf('### 2. Fill the record')).replace(/\s+/g, ' '); expect(persist).toMatch(/combined final-pass findings \(core, specialist, adversarial, actionable Greptile, verified exploratory QA findings\)/i); }); + +// INV-1 consumers: an outside review that reports `unverified` or +// `unavailable` is missing coverage in /ship's readiness note, its PR body +// and /review's completion, never a pass. +test('ship and review count unverified or unavailable outside reviews as missing coverage', () => { + const read = (rel: string) => readFileSync(join(import.meta.dir, '..', rel), 'utf-8').replace(/\s+/g, ' '); + for (const rel of ['ship/SKILL.md', 'ship/sections/pr-body.md', 'review/SKILL.md']) { + expect(read(rel)).toMatch(/`unverified` or `unavailable` is (listed as )?missing coverage[^.]*never (as )?(a )?pass/i); + } +});