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)¶
-
Hero
variant— capability #1 build-now half (ADR-0009 Slice 3; capability-backlog #1). A first-class measuredvariantenum onfcr.hero(carousel|video|full-bleed|side-image|text,lib/section-style.js#classifyHeroVariant) retires the brittleimageSide && !mediainference inlib/cms/transformer.js+ the CMSHero.astroadapter. 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 = onlyvariantadded; 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 actualvideo.wixstatic.comvideo (#7) + carousel frames; Detector 2's asset-manifest already flags WCP's home hero video (video-unmigrated) + collapsed carousel. -
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.jsemits the URL asurl;translate.js#translateTopBarreads.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 (staticbody.htmllacks the JS-rendered contact run) — fix layer pinned (achrome.topbarcontact record + seed overlay, mirroring the header layout), deferred to a re-crawl. -
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 aglobalsblock infidelity-scorecard.json. S/T/G_det byte-identical (additive proof run);lib/globals-diff.validate.mjs36 checks. Every dim is null-safe (agree: true|false|null), so on the existing v2 captures it reports background/presence agreement andheaderLayout/headerCtareadn/auntil 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
variantnoted 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)¶
- A single v3 re-capture of WCP (+ garvanbay) unlocks THREE deferred halves at
once — hero carousel/video variant real measurement (currently
full-bleedon the v2 capture), topbar email/location capture, and globalsheaderLayout/headerCtareal 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 (currentchrome.topbariszero-size). - Hero asset plane — Slice 5 / Wix API — the actual video migration (#7,
video.wixstatic.combranch intransform-seed-images.mjs) + carousel frames; scoped by Detector 2's asset-manifest. - Section-style density dimension + Slice 6 calibration (fit
lib/calibration.jsonon 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).