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);
+ }
+});