Skip to content

Session handover — 2026-07-12 pt2

Shipped three slices from the priority list in session-2026-07-12-handover.md's "Next session" — in the user-chosen order: hero carousel/video variant → TopBar → globals into the scorecard. All three are CMS-lane, verified, and NOT deployed — each was scoped deliberately as a build-now, no-re-crawl, no-live-change half, with the re-crawl-dependent halves named and deferred (the same posture, three times).

What shipped (code + metric; no deploy this session)

  1. Hero variant — capability #1 build-now half (ADR-0009 Slice 3; capability-backlog #1). A first-class measured variant enum on fcr.hero (carousel|video|full-bleed|side-image|text, lib/section-style.js#classifyHeroVariant) retires the brittle imageSide && !media inference in lib/cms/transformer.js + the CMS Hero.astro adapter. Derived at the seed join (seed-from-build.js#makeStyleLookup) from already-persisted bounded capture values (bg.media/imageSide/assets.{slides,videos}) — no re-crawl. Zero-regression proven (old→new seed diff = only variant added; imageSide/scrim/imageUrl byte-identical → identical render); carousel/video routing proven locally (prerendered adapter render). New rail lesson: known-patterns "A dimension whose inputs are already-BOUNDED capture values derives at the JOIN". Deferred (asset half → Slice 5): the actual video.wixstatic.com video (#7) + carousel frames; Detector 2's asset-manifest already flags WCP's home hero video (video-unmigrated) + collapsed carousel.

  2. TopBar socials — capability #2 fast-follow #1 (known-issues "Header dimension — three fast-follows" #1). A per-field diagnosis split the "phone-only topbar" symptom: socials were a portfolio-wide threading bug (TopBar.js emits the URL as url; translate.js#translateTopBar read s.href → every site's topbar social links were silently empty) — fixed one line (href: s.href || s.url), both lanes, zero-regression (only the 2 WCP social URLs populate). email + location are genuine capture-plane misses (static body.html lacks the JS-rendered contact run) — fix layer pinned (a chrome.topbar contact record + seed overlay, mirroring the header layout), deferred to a re-crawl.

  3. Globals into the scorecard — capability #2 identify half (near-match scorecard contract; known-issues). New pure lib/globals-diff.js — an additive, reporting-only comparison of the LIVE chrome vs an independent re-measurement of OUR deployed chrome (header/topbar/footer background + headerLayout/headerCta), surfaced as a globals block in fidelity-scorecard.json. S/T/G_det byte-identical (additive proof run); lib/globals-diff.validate.mjs 36 checks. Every dim is null-safe (agree: true|false|null), so on the existing v2 captures it reports background/presence agreement and headerLayout/headerCta read n/a until a v3 re-capture. Deferred: gate vetoes + thresholds (Slice 6) and the real layout/CTA numbers (v3 re-capture).

Wiki changes

  • ADR-0009 — Slice 3 tracker appended (hero variant + topbar socials + globals projection; append-mostly).
  • known-patterns.md — one new entry (derive-at-the-JOIN when inputs are already bounded; retiring an inference with a measured enum is zero-regression under the hasMedia guard).
  • known-issues.md — fast-follow #1 rewritten (socials fixed; email/location refined to capture-plane with fix layer pinned); the identify-half paragraph updated (globals projection shipped, gate + real numbers deferred).
  • capability-backlog.md — #1 build-now half done, #2 socials + globals-identify done (Status + closing line).
  • section-style-contract.md — hero variant noted in the sequencing section.
  • near-match-scorecard-contract.md — globals reporting projection status added.

State

Committed to master this session-end: the three slices' code (lib/section-style.js + .validate.mjs, lib/cms/seed-from-build.js, lib/cms/transformer.js, lib/assembler-fulldev/translate.js, apps/cms/src/plugins/marketing-blocks/index.ts, apps/cms/src/components/fcr-blocks/Hero.astro, lib/scorecard.js, new lib/globals-diff.js + .validate.mjs) + the six wiki files + this handover. No deploy, no live D1/R2 write (each slice is render-byte-identical or metric-only). No seeds regenerated/committed — nothing was deployed, so a variant-bearing seed would sit ahead of live D1; the render is byte-identical with or without the field, so the seeds pick up variant on the next legitimate regen+deploy. Left alone (untracked/unrelated): infra/ (undecided ownership — known-issues), .claude/settings.local.json, scripts/.tmp/.

Next session (priority order)

  1. A single v3 re-capture of WCP (+ garvanbay) unlocks THREE deferred halves at once — hero carousel/video variant real measurement (currently full-bleed on the v2 capture), topbar email/location capture, and globals headerLayout/headerCta real live-vs-ours numbers. Highest-leverage single move. Mind the re-crawl brand-nondeterminism landmine (known-issues) — graft only the new fields onto the committed theme, diff the derived theme before commit. First step for topbar: the live-DOM check that the post-JS topbar exposes email/location (current chrome.topbar is zero-size).
  2. Hero asset plane — Slice 5 / Wix API — the actual video migration (#7, video.wixstatic.com branch in transform-seed-images.mjs) + carousel frames; scoped by Detector 2's asset-manifest.
  3. Section-style density dimension + Slice 6 calibration (fit lib/calibration.json on the 30–50-site batch; promote hero-variant/scrim/ textTone to scored dims and turn on the reporting-projection vetoes — variant-mismatch, asset-manifest, and now globals — there).