Proof of Work Done, NVSP paid-media landing pages

Project: nvsp-paid-media · Date: 2026-07-27 · Description: lp-tracking-wiring
Live URL: https://nvsp-picks.vercel.app
Shared tracking file: https://nvsp-picks.vercel.app/_js/nvsp-launch.js
Commit: not a git repository, source at 09-paid-media/landing-pages/nvsp-picks/

VERDICT: DONE

Score 1.00 across 10 requirements. Zero critical NOT MET, zero major NOT MET.

Verified by Queen against the DEPLOYED URL in a Steel cloud browser at mobile 390, with every flow driven, not just screenshotted. Second check by Dan, independent re-verification of all four critical requirements: he byte-diffed the deployed /_js/nvsp-launch.js against local source (identical, so the live file is not stale), re-fetched all 8 pages, re-ran the execution suite at 11 of 11, and confirmed window.fbq is never even created while the pixel ID is empty. Deterministic gate powd-gate.js: PASS, score 1.000.

Verification level: FULL. Every requirement below is graded MET or NOT MET against a named piece of real evidence.

What shipped

Conversion tracking for all 8 landing pages, wired through ONE shared file rather than 8 copies of a snippet. HubSpot Forms API v3 submission, CallRail DNI, and Meta Pixel with exactly one deduplicated Lead per conversion. Three fake success handlers and one inert onsubmit="return false;" were removed: those pages were showing visitors a "Thanks" while transmitting nothing, or reloading and losing the lead entirely.

Five empty CONFIG values at the top of the shared file are the entire launch switch. While they are empty every page runs in preview mode on purpose: forms validate and confirm so Kurt can walk the flow, nothing is transmitted, and no conversion is ever counted.

Requirements checklist

#RequirementStatusEvidence observed
1Critical. All 8 deployed pages load the shared launch script, and the file itself serves as real JavaScriptMETDriven in Steel: launchScript: true on all 8. curl of all 8 page URLs plus /_js/nvsp-launch.js returned 200, and the served JS body contains the real fireLead and HUBSPOT_FORM_GUID source
2Critical. A filled submit on every form page is intercepted: no navigation, and the visitor sees a confirmationMETAll 6 form pages driven live: navigated: false, URL unchanged, confirmation text "Thanks. We are checking availability in your area." Screenshots below show the filled fields and the confirmation on the real page
3Critical. TCPA consent is required, and submit is blocked without itMETDriven live on all 6 form pages: unchecking consent gives blockedWithoutConsent: true. No page carries novalidate, enforced by the static gate
4Critical. No Lead event can be counted while the pixel is unconfiguredMETpixelLoaded: false on all 8 live pages, so fbq does not exist and fireLead returns early. Confirmed again by the "preview mode never counts a Lead" test, which stubs a configured pixel and asserts zero Lead events
5Major. Every phone number carries the CallRail DNI swap classMETLive: 04-callfirst 3 of 3 tel links swap-classed, 13-solatec 4 of 4. Test every tel: link carries the CallRail swap class asserts it across all 8 pages
6Major. The dead and fake submit paths are goneMET05-calculator (was onsubmit="return false;", completely inert) and 11-solarex (had no handler, reloaded the page) both now confirm on submit, driven live. Test asserts no page carries a fake status-writing handler
7Major. Compliance gate still passes on all 8 pagesMETnode .planning/gate.mjs: 8 pages, 0 failures. Bans checked: em dash, install claim, third-party trademark, savings promise, approval verdict, novalidate, gradient text, fat radius
8Major. Everything blocked on a person is written up as a concrete askMETKURT-SIGNOFF.md: 8 figure questions traced to the 43 TODO tokens, 4 asset items, the 5 tracking values with owners, and a per-page approval table
9Minor. The 4-step quiz still completes to the capture form on the live pageMETDriven live: quizWalked: true, then the capture form filled and submitted successfully. Screenshot below
10Minor. Pre-launch placeholders still render literally, which is correct and deliberateMETtokenStillVisible: true on all 6 form pages. A half-wired page must look unfinished rather than quietly ship a dead phone number into paid traffic

Evidence, the real flow driven on the deployed pages

Steel cloud browser, mobile 390 wide at 2x, against https://nvsp-picks.vercel.app. Each form shot is the state AFTER a real filled submit, scrolled to the confirmation.

01 split form after a filled submit, showing the confirmation message
01 split-formFilled, consented, submitted. Confirmation shown, no navigation.
05 calculator after a filled submit, showing the confirmation message
05 calculatorWas completely inert before this pass. Now confirms.
11 solarex after a filled submit, showing the confirmation message
11 solarexHad no handler at all, submitting reloaded and lost the lead.
12 solargen after a filled submit, showing the confirmation message
12 solargenFake success handler replaced by the real path.
14 quiz after walking four questions and submitting the capture form
14 quizFour questions walked, then capture submitted.
15 advertorial after a filled submit, showing the confirmation message
15 advertorialFake success handler replaced by the real path.
04 call-first page on mobile
04 call-first3 of 3 tel links swap-classed, zero capture forms. The tap is the conversion.
13 solatec page on mobile
13 solatec4 of 4 tel links swap-classed, zero capture forms.

Test output

$ node .planning/gate.mjs
ok   01-split-form/index.html  22KB, 5 Kurt TODOs
ok   04-callfirst/index.html   12KB, 1 Kurt TODOs
ok   05-calculator/index.html  22KB, 6 Kurt TODOs
ok   11-solarex/index.html     38KB, 9 Kurt TODOs
ok   12-solargen/index.html    29KB, 5 Kurt TODOs
ok   13-solatec/index.html     28KB, 7 Kurt TODOs
ok   14-quiz/index.html        24KB, 4 Kurt TODOs
ok   15-advertorial/index.html 23KB, 6 Kurt TODOs

8 pages, 0 failures

$ node --test .planning/walk-wiring.mjs
ok every page loads the shared launch script and owns no competing handler
ok 01-split-form: submit is intercepted and answered, not navigated
ok 05-calculator: submit is intercepted and answered, not navigated
ok 11-solarex: submit is intercepted and answered, not navigated
ok 12-solargen: submit is intercepted and answered, not navigated
ok 14-quiz: submit is intercepted and answered, not navigated
ok 15-advertorial: submit is intercepted and answered, not navigated
ok preview mode never counts a Lead, because no lead exists yet
ok 04-callfirst: the call tap is the conversion and fires one Lead
ok 13-solatec: the call tap is the conversion and fires one Lead
ok every tel: link carries the CallRail swap class
tests 11, pass 11, fail 0

$ node --test .planning/walk-14-quiz.mjs
tests 4, pass 4, fail 0

The wiring test was itself mutation-tested: a launch script tag was deleted from 15-advertorial, two tests failed, the page was restored. The test only evaluates the launch script when the page actually links it, so a missing tag cannot pass silently the way the dead quiz once did.

Still blocked, and on whom

These pages cannot take ad spend yet, and nothing on this page claims otherwise.
Kurt: every figure. Ownership year, Travis Credit Union terms, the PG&E rate we are cleared to cite, ongoing-cost wording, pricing claim, years in business, which offices may be named, final disclaimer, privacy and terms URLs, and approved testimonials. All 43 placeholder tokens on the live pages trace back to those questions.
Gino or Freddy: the 5 tracking values, and the server-side CAPI job must reuse the meta_event_id the page submits, or Meta counts every lead twice.
The full written ask is KURT-SIGNOFF.md in the project folder.