# PROOF — migrator-storefront (prototype #4, Q144)

Verification run 2026-08-19 (fleet worker firing, task Q144-migrator-storefront-prototype).
All outputs below are real, captured from this machine in this firing.

## 1. Drift-detecting bar (real run)

```
$ python3 check_storefront.py
canonical landing price formats at run time: ['$150', '$28k', '$45k', '$90k']
live H1 hook: "Your Framework Is EOL. Here's How to Move Without the Risk."
cross-door set rescue: ['1,800', '3,500', '495', '75']
cross-door set dossiers: ['1,200', '2,500', '200', '295', '85']
cross-door set installer: ['1,500', '100', '20', '24,000', '5,000', '800', '99']
cross-door set nightwatch: ['0', '12', '175', '18', '5', '99']
forbidden tokens: 24 | own-set exempt: ['150', '28', '4,500', '45', '90']
RESULT: PASS — storefront matches the Q130-ruled migrator price set, cross-door/retired
  clean, demo deterministic + JS-parse intact, O-12 complete
exit=0
```

- k-form quirk documented at run time as the card requires: the canonical landing's
  actual price formats are `$150`, `$28k`, `$45k`, `$90k` (thousands without the
  spelled-out digits). The `$28k` base anchor is re-extracted each run; FATAL rc=2 if gone.
- `$4,500` support-extension anchor: re-extracted from the Q130 ground-truth artifact
  (the canonical landing carries no support-ext figure — Q130 ruled it).

## 2. Negative case (self-test)

```
$ python3 check_storefront.py --self-test
  self-test P  positive-control (unmodified): accepted — ACCEPTED (correct)
  self-test N1 price-drift ($28,000->$29,000): rejected — REJECTED (correct)
  self-test N2 cross-door rescue-set injected: rejected — REJECTED (correct)
  self-test N3 cross-door installer+nightwatch injected ($99/$1,500 NOT exempt): rejected — REJECTED (correct)
  self-test N4 retired migrator band injected (Q132 sources A/B): rejected — REJECTED (correct)
  self-test N5 placeholder: rejected — REJECTED (correct)
  self-test N6 o12-missing ([A-4] gone): rejected — REJECTED (correct)
  self-test N7 broken-embed: rejected — REJECTED (correct)
  self-test N8 h1-changed: rejected — REJECTED (correct)
  self-test N9 js-syntax-error in demo (Q141 bug class): rejected — REJECTED (correct)
  self-test N10 demo non-deterministic (Math.random injected): rejected — REJECTED (correct)
  self-test N11 pricing leaked into demo: rejected — REJECTED (correct)
  self-test: ALL CASES BEHAVED AS EXPECTED (11 poison rejected + 1 positive accepted)
exit=0
```

## 3. Independent JS parse bar

```
$ python3 -c "import re;print(re.search(r'<script>(.*?)</script>',open('sample.html').read(),re.S).group(1))" > /tmp/demo.js
$ node --check /tmp/demo.js
rc=0 (JS parses)
```

## 4. Demo properties (verified by script, not by claim)

```
sample.html bytes: 11133            (> 3000 non-trivial bar)
no network calls: True              (no fetch/XHR/http(s):// literals)
no Date usage: True                 (no new Date — determinism bar)
iframe embed in index.html: True
faq count in index.html: 8          (faq-item divs; >= 5 bar)
o12 count in index.html: 5          (>= 4 bar)
```

## 5. Defects found by the gate and fixed in this firing

1. **Artifact self-poison (found by the real run, round 1):** `index.html` originally
   quoted the canonical landing's T&M contrast verbatim (`$150–$250 per hour`); the `250`
   token collides with the retired migrator band token (`$120k–$250k+`, Q132 source B).
   Fixed by paraphrasing the T&M line (no dollar figures) — the guard was NOT weakened.
2. **Checker hole (found by the self-test, round 2):** the N1 price-drift poison
   (`$28,000`→`$29,000`) was initially ACCEPTED because `$29,000` is in no forbidden set
   and the second anchor occurrence survived the single-replace. Fixed by adding an
   explicit price-amount-div byte-match bar (bar 2b) that rejects drift to ANY value.
   The strengthened checker then rejected N1 correctly.

## 6. File hashes (this tree)

```
cb33323c156da83f3aa37caa964bceba101ffe88b46a4ed48b80576db9e802d4  index.html
75476d1c62c221beb0b0852ced387d4866c759917709324e3c5d29e950b739c5  sample.html
2a2f1d53b85d4504cedf132a848278da66027e1029f1d323ff21aeaeed2b8adf  check_storefront.py
```

Live sources (unmodified by this firing — read-only):

```
42ce56b06b463b8df9d22315b08ec0079ae13cc65a91715b2e8ca915248d40da  .../migrator/landing/2026-08-09_migrator-landing-page.html
43350cbeb7e67897a134312a9b1d79ff32d83a19820655d4c46238e22ca4a59d  .../migrator/gift/2026-08-15_migrator-free-readiness-scan.md
```

## 7. Live-interactive demo guard (Q177, verification run 2026-08-21, fleet worker)

`check_demo.py` drives the demo in REAL headless Chrome over CDP :9336 (port distinct
from 9333/9334/9335): the card's non-vacuous gate (the Q169 self-referential byte-identical
bar) is resolved head-on — determinism is proven LIVE against real renders, and each render
is asserted against an INDEPENDENT Python re-derivation of the page's visible FNV-1a logic
(exact JS float64 mirror, NOT exact-integer FNV), self-calibrated against the page's own
`hashStr` on every run (3 seeds, in M-1/M-2/M-3 below). Real button clicked; zero network at
page-hook AND CDP-protocol level; zero console errors in every case.

Input A = ("Internal HR portal, 78,000 employee records", "Django 1.11 / Postgres 9,
single VPS", medium); input B = same sys+stack, crit=high.

```
$ python3 check_demo.py
Q177 guard — MIGRATOR storefront demo, real headless Chrome (CDP :9336)
   sample.html sha256[:12] = 75476d1c62c2
   index.html sha256[:12] = cb33323c156d
--- M-1 (input A, crit=medium) ---
   calibration: mirror == page hashStr on 3 seeds ✓
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report visible (display:block)
   title 'Readiness Scan: Internal HR portal, 78,000 employee records' == independent ✓
   stack-as-described carried in .meta ✓
   score 5/100 == independent ✓
   score label 'High risk — plan carefully' == independent ✓
   12/12 category rows: category + per-row level == independent re-derivation ✓
   tier 'Enterprise Migration' + band note == independent ✓
   top-3 risk list (ordered category+level) == independent ✓  ['Business continuity impact', 'Deployment environment', 'Testing coverage']
   sample-flag banner present ✓
   O-12 assumption tokens [A-1..A-4] + O-12 complete in render ✓
--- M-1 (input A, crit=medium) ---   [report innerHash=497247306]
--- M-2 (input B, crit=high) ---
   calibration: mirror == page hashStr on 3 seeds ✓
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report visible (display:block)
   title 'Readiness Scan: Internal HR portal, 78,000 employee records' == independent ✓
   stack-as-described carried in .meta ✓
   score 5/100 == independent ✓
   score label 'High risk — plan carefully' == independent ✓
   12/12 category rows: category + per-row level == independent re-derivation ✓
   tier 'Enterprise Migration' + band note == independent ✓
   top-3 risk list (ordered category+level) == independent ✓  ['Technical debt ratio', 'Data volume & structure', 'Documentation state']
   sample-flag banner present ✓
   O-12 assumption tokens [A-1..A-4] + O-12 complete in render ✓
M-2 different-input bar: B innerHash=1186494470 != A innerHash=497247306 — different input changes output ✓
--- M-3 (input A again) ---
   calibration: mirror == page hashStr on 3 seeds ✓
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report visible (display:block)
   title 'Readiness Scan: Internal HR portal, 78,000 employee records' == independent ✓
   stack-as-described carried in .meta ✓
   score 5/100 == independent ✓
   score label 'High risk — plan carefully' == independent ✓
   12/12 category rows: category + per-row level == independent re-derivation ✓
   tier 'Enterprise Migration' + band note == independent ✓
   top-3 risk list (ordered category+level) == independent ✓  ['Business continuity impact', 'Deployment environment', 'Testing coverage']
   sample-flag banner present ✓
   O-12 assumption tokens [A-1..A-4] + O-12 complete in render ✓
M-3 determinism bar: A re-render innerHash=497247306 == M-1 497247306 — same input -> byte-identical output ✓
--- M-0 (empty input) ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   empty input: page alert fired ('Describe the system 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:59859/sample.html ✓
   iframe content loaded: banner 'DEMO — runs entirely in your browser. Nothing is sent, nothi' + #sys live ✓
--- I-2 (storefront CTA) ---
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   CTA -> #demo anchor resolves ✓
main: ALL PASS
exit=0
```

Key bars from the real run: M-1 A render == independent (score 5/100, Enterprise Migration,
12/12 rows, top-3 ordered); M-2 B render == independent AND B innerHash 1186494470 != A
497247306 → different input changes output (critBoost branch moves the top-3 list:
A [Business continuity, Deployment env, Testing] vs B [Technical debt, Data volume,
Documentation]); M-3 A re-render innerHash 497247306 == M-1 → same input byte-identical
(determinism); M-0 empty input → page alert "Describe the system first." + report hidden+empty;
I-1 storefront iframe really loads the demo over a local http same-origin (contentDocument
reachable, banner + #sys live); I-2 CTA → #demo resolves.

Defect found and fixed in place this firing (checker, not the demo): `calibrate()` was
defined but never called — the docstring claimed "re-proves this mirror ... on every run"
and the dead function meant a mirror precision regression would silently assert wrong
values (false demo defect). Fix: calibrate() wired into every run_case (2 lines). Pre-fix
negative proven: the first main run (no calibration lines) passed only because the mirror
happened to be in sync; post-fix run shows "calibration: mirror == page hashStr on 3 seeds"
in M-1/M-2/M-3 and the poisoned-copy path still rejects.

```
$ python3 check_demo.py --self-test
--- S1 poisoned copy (injected syntax error in render()) ---
   DRIVER ERROR: JS error: ReferenceError: hashStr is not defined
    at <anonymous>:1:182
    at Array.map (<anonymous>)
    at <anonymous>:1:166
S1 OK: guard REJECTED the poisoned demo (render never executed -> report hidden)
--- S2 clean control ---
   calibration: mirror == page hashStr on 3 seeds ✓
   NET: 0 requests (page hooks + CDP protocol)
   ERRORS: 0 page/console errors
   report visible (display:block)
   title 'Readiness Scan: Internal HR portal, 78,000 employee records' == independent ✓
   stack-as-described carried in .meta ✓
   score 5/100 == independent ✓
   score label 'High risk — plan carefully' == independent ✓
   12/12 category rows: category + per-row level == independent re-derivation ✓
   tier 'Enterprise Migration' + band note == independent ✓
   top-3 risk list (ordered category+level) == independent ✓  ['Business continuity impact', 'Deployment environment', 'Testing coverage']
   sample-flag banner present ✓
   O-12 assumption tokens [A-1..A-4] + O-12 complete in render ✓
S2 OK: unpoisoned page still passes
--self-test rc=0
exit=0
```

S1 = poisoned copy (injected JS syntax error in render() → render never executes → report
stays hidden) REJECTED; S2 clean control ACCEPTED. A guard that cannot reject a broken
demo is theater.

File hashes (this tree):

```
36c119acc1ac26c7600ae816c90b51bdeef19d373787ffe0ee6853285d88272e  check_demo.py
75476d1c62c221beb0b0852ced387d4866c759917709324e3c5d29e950b739c5  sample.html
cb33323c156da83f3aa37caa964bceba101ffe88b46a4ed48b80576db9e802d4  index.html
```
