# PROOF — prototype #2 (dossiers-storefront), 2026-08-19 (fleet worker)

## 1. Check run (real output, `python3 check_storefront.py`)
```
live kit prices re-extracted from 2026-08-10_q40_dossiers_pricing_page.html: ['$1,200', '$2,500/mo', '$295']
live H1 hook: "Your competitor already knows about this prospect. Your dossier doesn't. Most dossiers check out to stale data."
forbidden cross-door/retired tokens: 25
RESULT: PASS — storefront matches live pricing, demo embed + JS parse intact, O-12 complete
```
Exit code: **0**

## 2. Self-test (real output, `python3 check_storefront.py --self-test`)
```
  self-test P  positive-control (unmodified): accepted — ACCEPTED (correct)
  self-test N1 price-drift ($295->$999): rejected — REJECTED (correct)
  self-test N2 cross-door rescue-set injected: rejected — REJECTED (correct)
  self-test N3 retired old-landing set injected: rejected — REJECTED (correct)
  self-test N4 placeholder: rejected — REJECTED (correct)
  self-test N5 o12-missing ([A-4] gone): rejected — REJECTED (correct)
  self-test N6 broken-embed: rejected — REJECTED (correct)
  self-test N7 h1-changed: rejected — REJECTED (correct)
  self-test N8 js-syntax-error in demo (Q141 bug class): rejected — REJECTED (correct)
  self-test: ALL 9 CASES BEHAVED AS EXPECTED (8 poison rejected + 1 positive accepted)
```
Exit code: **0**

## 3. Adversarial greps (real output)
```
index.html $0 count: 0
index.html $25 standalone: 0
index.html $100 standalone: 0
index.html $1,500 standalone: 0
index.html $495: 0
index.html DRAFT banner: 0
sample.html fetch/network calls: 0
index faq-items: 5
index [O-12]: 5
index A-tags: [A-1] [A-2] [A-3] [A-4] [A-5]
node --check on extracted sample.html <script>: rc=0
```

## 4. Negative case (why the check is not theater)
- N1–N7 prove the drift / cross-door / retired / placeholder / O-12 / embed / H1 guards
  each fire on a poisoned copy and do NOT fire on the real artifact (positive control P).
- N8 is the Q141 bug class itself: a JS syntax error inside the demo's `<script>` is
  caught by the `node --check` bar — the same class of defect that silently killed the
  live rescue readiness scan before Q141 fixed it.
- The positive control (unmodified artifact) must PASS in the same self-test run — a
  checker that rejects its own artifact is broken too.

## 5. Live-interactive verification — Q167 (2026-08-20, fleet worker)

Q142 shipped this prototype with parse-level proof only (section 2, N8: `node --check`).
The RESCUE prototype (Q141) got the live-interactive proof and that run exposed a real
JS defect. `check_demo.py` gives the DOSSIERS demo the same proof: real headless Chrome
over CDP (:9334), the live Build button clicked, rendered DOM asserted against an
INDEPENDENT re-derivation of the page's visible logic (counts re-derived from the
template in sample.html's source, not byte-comparisons), zero network at page-hook AND
CDP-protocol level, zero page/console errors.

### 5a. Main run — real output (`python3 check_demo.py`), exit 0
```
Q167 guard — DOSSIERS storefront demo, real headless Chrome (CDP :9334)
   sample.html sha256[:12] = d60651f09a6b
   index.html sha256[:12] = 2d281870f01e
--- D-1 mid-name (input 'Brightway Dental') ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report visible (display:block)
   title 'Sample Dossier: Brightway Dental' == independent (name carried, esc() intact)
   tier note == independent tierFor(16) ✓
   date 2026-08-20 == today ISO ✓
   signal rows 6 == independent 6 ✓
   badges 2 HIGH + 4 MED == independent ✓
   6/6 signal rows signed ✓
   pain hypotheses 3 == independent ✓
   opening angle carries the input name ✓
   O-12 assumption block complete in render ✓
--- D-2 long-name (input 'Northgate Consolidated Holding Group') ---
   (same 10 bars green; tier note == independent tierFor(36) — long-name band)
--- D-0 (empty input) ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   empty input: page alert fired ('Type a company name first.') ✓
   empty input: report stays hidden + empty ✓
--- I-1 (storefront iframe loads the demo) ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   iframe src = http://127.0.0.1:49893/sample.html ✓
   iframe content loaded: banner 'DEMO — runs entirely in your browser. Nothing is sent, nothi' + #target live ✓
--- I-2 (storefront CTA) ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   CTA -> #sample anchor resolves ✓
main: ALL PASS
```
Notes: D-1/D-2/D-0 run over `file://`; I-1/I-2 run over a local 127.0.0.1 HTTP origin
because Chrome treats `file://` as opaque origins (the iframe's `contentDocument` is
null over file:// — proven live during the guard's development). Serving the storefront
over http is also how it will actually be hosted. I-1 proves the demo loaded INSIDE the
storefront's own iframe (banner + live `#target` input in `contentDocument`).

### 5b. Self-test — real output (`python3 check_demo.py --self-test`), exit 0
```
--- S1 poisoned copy (injected syntax error) (input 'Brightway Dental') ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report display='none' (expected block — Build did not render)
   DRIVER ERROR: JS error: TypeError: Cannot read properties of null (reading 'textContent')
S1 OK: guard REJECTED the poisoned demo (render never executed)
--- S2 clean control (input 'Brightway Dental') ---
   (all 10 bars green, as 5a)
S2 OK: unpoisoned page still passes
--self-test rc=0
```
The poison is a real syntax error injected into a COPY of sample.html's `render()`
(`const x =;`) — the page's own script then fails to parse, Build does nothing, and the
guard fails on the missing render. A guard that accepted the broken demo would be
theater; this one rejects it.

### 5c. Live defect found?
None. The demo behaved exactly per its visible logic on all 5 cases (both name-length
bands, empty-input branch, iframe embed, CTA). sample.html and index.html were NOT
modified by Q167 — shas above are before AND after (unchanged).

## 9. Q173 hook retraction note (2026-08-25, fleet worker)
The §1 capture above is the genuine 2026-08-19 output (the live H1 then carried the
73% stat hook). On 2026-08-25 the Q173 retraction (no reproducible source on disk —
SEED §2 / Q101 precedent) replaced the H1 stat in the LIVE landing, this prototype's
`<title>` + `<h1>`, the Q140 Upwork hook, and the legacy hook ground truth with the
qualitative "Most dossiers check out to stale data." — `check_storefront.py` re-extracts
the hook at run time, so the current live H1 is the post-retraction one (re-run rc=0
2026-08-25). The §1 block is preserved as the dated record of the as-shipped state.
