# QA · factory-v1 (2026-10-22/23) ## Summary | Check | Result | |---|---| | Worker + site tests (`cd worker && npm test`) | 21/21 pass (API: exact email incl. look-alikes, kill switch, meter cap 402, sandbox + sink + audit, rate limit 429, review save/list/validate; site: 10 gated + 10 unlock pages, session links with UTMs, no pixels, widgets, 110 OK/FIX controls, 90 files, copy lint) | | Copy lint (`python3 qa/lint.py`) | 0 hard hits over drops, image-ad copy + on-image text, 20 scripts, 50 hooks. Warnings: 38 `[FILL]` (see PLACEHOLDERS.md), "guarantee" only in "No income is guaranteed" disclaimers | | Ad DOM QA (`render.py --qa`) | 90/90 files: every text ≥ 28 px, inside the safe zone (4:5 inset 64 · 9:16 top 269 / bottom 384 · 1:1 inset 56), nothing clipped | | Editor's pass (full-size contact sheets `qa/sheet_*.jpg`) | Round 1 found: scene token bug (no backgrounds), empty space in F01/F02/F04/F08/F10/F12/F13/F15/F17/F22/F24, F19 number overflowing its ring, F29 headline card covering the whiteboard, F09 ticket doubled and touching the CTA, a "to-do" line break. All fixed and re-rendered; round 2 clean | | Images | Codex image gen (account auth, $0): 9 text-free scenes × 3 ratios, one base per ratio, no people, no text. Real photos: Nik (bookshelf plaque, HighLevel stage), clients Tracy and Ellis (first names only). No fal, no Canva | | Browser QA live (`qa/browser.mjs`, 1440 + 390) | 44 page loads (hub, vault, 10 gated, 10 unlock × 2 widths): all 200, 0 horizontal overflow, 0 page errors . Every tool page produced output. Screenshots `qa/shots/` | | Test account | `test@funnelingmedia.com` on a drop form → `{"sandbox": true, "tenant": "test-sandbox", "unlock_all": true}`, then all 10 unlock pages open without `?k=preview` (10/10). Fresh visitor on an unlock page is sent back to the gate: True | | Video scripts | 20 scripts, 211 Avatar III credits for one take (35.2% of 600/month). Not rendered (Nik's web-UI step) | | Nothing uploaded | No Meta upload, no ManyChat, no GHL, no sends. Preview opt-ins stay in KV (`FORWARD_URL` unset) | ## Image ads | Ad | Family | ABCDE | DOM | Copy | Visual | |---|---|---|---|---|---| | F01 | gift | B | 3/3 pass | 88 words, headline 26 ch, description 31 ch | pass | | F02 | gift | E | 3/3 pass | 91 words, headline 27 ch, description 28 ch | pass | | F03 | gift | B | 3/3 pass | 106 words, headline 29 ch, description 31 ch | pass | | F04 | gift | D | 3/3 pass | 86 words, headline 24 ch, description 25 ch | pass | | F05 | gift | A | 3/3 pass | 89 words, headline 29 ch, description 25 ch | pass | | F06 | gift | E | 3/3 pass | 82 words, headline 29 ch, description 25 ch | pass | | F07 | gift | A | 3/3 pass | 104 words, headline 21 ch, description 30 ch | pass | | F08 | gift | B | 3/3 pass | 86 words, headline 29 ch, description 33 ch | pass | | F09 | gift | B | 3/3 pass | 89 words, headline 21 ch, description 32 ch | pass | | F10 | gift | B | 3/3 pass | 101 words, headline 31 ch, description 29 ch | pass | | F11 | gift | A | 3/3 pass | 92 words, headline 32 ch, description 33 ch | pass | | F12 | gift | D | 3/3 pass | 102 words, headline 28 ch, description 33 ch | pass | | F13 | gift | E | 3/3 pass | 93 words, headline 27 ch, description 30 ch | pass | | F14 | gift | B | 3/3 pass | 80 words, headline 28 ch, description 25 ch | pass | | F15 | proof | C | 3/3 pass | 109 words, headline 29 ch, description 32 ch | pass | | F16 | proof | C | 3/3 pass | 92 words, headline 30 ch, description 32 ch | pass | | F17 | proof | E | 3/3 pass | 96 words, headline 27 ch, description 30 ch | pass | | F18 | proof | C | 3/3 pass | 85 words, headline 25 ch, description 32 ch | pass | | F19 | launchpad | E | 3/3 pass | 97 words, headline 31 ch, description 31 ch | pass | | F20 | launchpad | A | 3/3 pass | 100 words, headline 27 ch, description 32 ch | pass | | F21 | launchpad | E | 3/3 pass | 105 words, headline 27 ch, description 26 ch | pass | | F22 | launchpad | A | 3/3 pass | 104 words, headline 33 ch, description 33 ch | pass | | F23 | launchpad | C | 3/3 pass | 98 words, headline 27 ch, description 35 ch | pass | | F24 | launchpad | E | 3/3 pass | 89 words, headline 26 ch, description 36 ch | pass | | F25 | launchpad | A | 3/3 pass | 80 words, headline 34 ch, description 30 ch | pass | | F26 | launchpad | A | 3/3 pass | 91 words, headline 28 ch, description 30 ch | pass | | F27 | launchpad | A | 3/3 pass | 98 words, headline 34 ch, description 30 ch | pass | | F28 | launchpad | C | 3/3 pass | 97 words, headline 32 ch, description 28 ch | pass | | F29 | gift | C | 3/3 pass | 77 words, headline 33 ch, description 36 ch | pass | | F30 | launchpad | E | 3/3 pass | 99 words, headline 32 ch, description 29 ch | pass |