{
  "project": "gpu-pilot",
  "doc": "docs/superpowers/plans/2026-07-18-commutingcost-pilot-implementation.md",
  "title": "\u2605 PLAN 7/18 \u2014 commutingcost.com pilot: Editorial Warm + motion + SEO/GEO/AEO (9 stages \u2014 READ THIS FIRST)",
  "oneline": "The executable implementation plan for the commutingcost.com redesign pilot: the homepage + the /commute-cost/[metro] template (x53), all four layers end to end \u2014 discovery (SSR JSON-LD, sitemap, llms.txt, /methodology, OG cards), motion (the approved Editorial Warm system with per-page transit vehicles), conversion (prefilled CTAs, provenance, email hook), and the data pipeline (GTFS-derived dominant mode per metro). Built from a 13-agent audit of the REAL codebase (115 verified findings, 77 gaps) and hardened by two adversarial critics. 9 stages, 49 files to create + 18 to modify, each stage ending in a verifiable checkpoint. Q1/Q2/Q4 are now closed; Q3/Q5/Q6/Q7 have safe defaults.",
  "tldr": [
    "SCOPE: two surfaces only (/ and /commute-cost/[metro]) + root artifacts. /map, /compare, /rankings, /TLCcosts, /losing-ground explicitly OUT \u2014 they inherit the component kit in Phase 3. NO backend/GPU/kernel changes; the only pipeline work is regenerating the SEO data spine.",
    "LOCKED DESIGN: Editorial Warm (cream #faf7f1 / ink #221d19 / Georgia serif) with per-template accent tints, each carrying an AA-safe deep variant. Motion = 8 inline-SVG transit vehicles crossing the hero, TWO per scene at different depths, over a two-depth parallax skyline, with a diagonal cream scrim that keeps copy legible. Metro pages show that metro's OWN dominant mode, derived from GTFS route_type weighted by trip count.",
    "AUDIT \u2014 ALREADY GOOD: both pilot pages are already true server components; the metro template already emits 3 server-rendered JSON-LD blocks (FAQPage/Dataset/BreadcrumbList); sitemap.ts, robots.ts and llms.txt already exist; maplibre is already deferred. The SSR constraint is structurally satisfied today.",
    "AUDIT \u2014 REAL PROBLEMS: robots.ts invites GPTBot/ClaudeBot into /admin/ and /api/ (AI-crawler groups declare allow:/ with no disallow, and robots groups match exclusively); notes[] (32 of 51 metros) + data_coverage (all 51) are generated and rendered NOWHERE (free provenance/AEO content); all 51 seo.title values are 68-87 chars so every one truncates in SERP; llms.txt is stale (still says OpenTripPlanner 2.6, US-only) and force-dynamic re-parses 442KB per bot hit; the bottom metro CTA links to a bare /route with no prefill (biggest conversion leak); homepage has no metadata export and zero JSON-LD; 20 of 51 metros have no priced transit fare and ottawa renders nearly empty.",
    "TOP RISK \u2014 MOTION vs CWV: SVG-internal transform animations are NOT compositor-promoted in Blink, so wheels/cranks/legs repaint on the main thread every frame while a compositor-property grep still passes. Mitigations are mandatory, not optional: a DevTools 5s idle measurement gate, animated sub-parts capped at 2 per vehicle, and SceneMotionController (IntersectionObserver pause) treated as required.",
    "HONESTY RULE (C8): every homepage stat must carry a verify: command and any that fails is DELETED, not shipped. Prior audits already contradict two (tolls 139 priced facilities vs 6,935 displayed; parking 1,515 garages vs 3,183). The illustrative $9,400/year line is deleted outright. Even '151,781 destinations' must be verified against Postgres \u2014 a 2026-07-20 check puts the stored figure at 133,984.",
    "RESOLVED: Q1 \u2014 'metros covered' and 'guide pages' are DIFFERENT numbers. nec/midatlantic/socal are mega-regions covering multiple metros each (new-york is a metro slug with no network dir; it rides on nec, as do 5 others), so 62 was never unsupported. Copy says '60+ metros'; we ship 53 guide pages with all counts derived. Q2 \u2014 the plan's claim that .btn-primary FAILS AA was WRONG: the live #b23a1e measures 5.97:1 and PASSES; 3.2:1 belonged to the proposed #cc7a5c. No live defect, so the palette is SCOPED to the pilot and the 18 out-of-scope files are untouched. Q4 \u2014 no @commutingcost handle exists, so twitter.site is omitted rather than invented."
  ],
  "updated": "2026-07-20 07:14",
  "sections": [
    {
      "level": 1,
      "title": "CommutingCost Pilot \u2014 Editorial Warm + Motion + AEO/GEO"
    },
    {
      "level": 2,
      "title": "Final implementation plan"
    },
    {
      "level": 2,
      "title": "Part A \u2014 Locked design decisions (do not re-litigate)"
    },
    {
      "level": 3,
      "title": "Hard constraints"
    },
    {
      "level": 3,
      "title": "Verified stack facts"
    },
    {
      "level": 2,
      "title": "Part B \u2014 What the audit found"
    },
    {
      "level": 3,
      "title": "Already good \u2014 do not break it"
    },
    {
      "level": 3,
      "title": "Missing or broken \u2014 the actual work"
    },
    {
      "level": 2,
      "title": "Part C \u2014 Decisions resolved before any code"
    },
    {
      "level": 3,
      "title": "C1 \u2014 Metro count: **53 pages, 54 routing regions**"
    },
    {
      "level": 3,
      "title": "C2 \u2014 Dominant mode field shape: **`hero_vehicle`**"
    },
    {
      "level": 3,
      "title": "C3 \u2014 Token naming: **`--accent` / `--accent-deep`**, with tint aliases"
    },
    {
      "level": 3,
      "title": "C4 \u2014 `llms.txt` / `llms-full.txt`: **pre-built artifacts, served by static file readers**"
    },
    {
      "level": 3,
      "title": "C5 \u2014 Freshness metadata: **generated sidecar, `id`-keyed**"
    },
    {
      "level": 3,
      "title": "C6 \u2014 Homepage primary CTA target: **`#plan`**"
    },
    {
      "level": 3,
      "title": "C7 \u2014 Copy ownership: **`src/lib/copy.ts` owns prose, `src/lib/seo.ts` owns shaping**"
    },
    {
      "level": 3,
      "title": "C8 \u2014 Fabricated numbers: deleted, not shipped"
    },
    {
      "level": 3,
      "title": "C9 \u2014 Next metadata is **shallow-merged**. Never inherit `openGraph`/`twitter`."
    },
    {
      "level": 3,
      "title": "C10 \u2014 Verification never touches `:3035`"
    },
    {
      "level": 3,
      "title": "C11 \u2014 robots.txt is a crawl directive, not a security control"
    },
    {
      "level": 3,
      "title": "C12 \u2014 Fonts: move the `@import` to a parallel `<link>`; do **not** delete it"
    },
    {
      "level": 3,
      "title": "C13 \u2014 Reference-port fidelity notes"
    },
    {
      "level": 2,
      "title": "Part D \u2014 Implementation stages"
    },
    {
      "level": 3,
      "title": "STAGE 0 \u2014 Preflight & baseline (30 min)"
    },
    {
      "level": 3,
      "title": "STAGE 1 \u2014 Data pipeline (geocoder) \u26d4 HARD BLOCKER, gated on Q1"
    },
    {
      "level": 3,
      "title": "STAGE 2 \u2014 Shared modules in the web repo (no visual change)"
    },
    {
      "level": 3,
      "title": "STAGE 3 \u2014 Token layer \u26d4 3.5 gated on Q3"
    },
    {
      "level": 3,
      "title": "STAGE 4 \u2014 Motion + data components (new files only, no page edits)"
    },
    {
      "level": 3,
      "title": "STAGE 5 \u2014 The two page rewrites \u26d4 the big one"
    },
    {
      "level": 3,
      "title": "STAGE 6 \u2014 Metadata root, JSON-LD graph, OG images"
    },
    {
      "level": 3,
      "title": "STAGE 7 \u2014 Root artifacts"
    },
    {
      "level": 3,
      "title": "STAGE 8 \u2014 Conversion plumbing"
    },
    {
      "level": 2,
      "title": "Part E \u2014 Files touched"
    },
    {
      "level": 3,
      "title": "Create (49)"
    },
    {
      "level": 3,
      "title": "Modify (18)"
    },
    {
      "level": 3,
      "title": "Move out of the ship path"
    },
    {
      "level": 2,
      "title": "Part F \u2014 Deploy"
    },
    {
      "level": 3,
      "title": "F1 \u2014 Acknowledge the deploy window"
    },
    {
      "level": 3,
      "title": "F2 \u2014 Steps"
    },
    {
      "level": 1,
      "title": "1. Ship data artifacts geocoder -> geo3 (validator runs as a gate inside the script)"
    },
    {
      "level": 1,
      "title": "2. Confirm ONLY expected paths are staged \u2014 NEVER git add -A"
    },
    {
      "level": 1,
      "title": "3. Snapshot the current build tree OUTSIDE the repo"
    },
    {
      "level": 1,
      "title": "4. Build (node 20 required)"
    },
    {
      "level": 1,
      "title": "5. Confirm the new data artifacts landed in the standalone tree"
    },
    {
      "level": 1,
      "title": "6. Restart by REGISTRY NAME (check ~/.claude/service-registry.json first \u2014 never guess)"
    },
    {
      "level": 3,
      "title": "F3 \u2014 Health poll before any verification"
    },
    {
      "level": 3,
      "title": "F4 \u2014 Post-deploy, in order"
    },
    {
      "level": 2,
      "title": "Part G \u2014 Rollback"
    },
    {
      "level": 1,
      "title": "re-sync, rebuild, restart."
    },
    {
      "level": 2,
      "title": "Part H \u2014 Testing & validation matrix"
    },
    {
      "level": 2,
      "title": "Part I \u2014 Open questions for Krishna"
    },
    {
      "level": 2,
      "title": "Appendix \u2014 Rules that must survive review"
    }
  ],
  "stats": {
    "lines": 731,
    "words": 11564
  },
  "html": "https://board.certihomes.com/project-docs/gpu-pilot/docs-superpowers-plans-2026-07-18-commutingcost-pilot-implementation.html",
  "out_name": "docs-superpowers-plans-2026-07-18-commutingcost-pilot-implementation.md",
  "comments_api": "https://board.certihomes.com/api/doc-comments?project=gpu-pilot&doc=docs/superpowers/plans/2026-07-18-commutingcost-pilot-implementation.md"
}