Session handover — 2026-07-08 pt3¶
Continues from session-2026-07-08-pt2-handover.md (Slice 4a — matcherGap into S).
This session ran ADR-0009 Slice 4b-i — the measured GenericSection fallback
renderer, both lanes. One slice: closed, live-proven, deployed.
Scope decision (user-confirmed)¶
Slice 4b split into 4b-i (renderer) + 4b-ii (metric) — genericFallbackRate
can't be computed until GenericSection exists to be counted, so the renderer ships
first (inverse of 4a/4b's meter-then-remediation). Full scope + sub-slice
breakdown: scope-2026-07-08-slice-4b.md. ADR-0009 tracker split accordingly
(4b → 4b-i done / 4b-ii planned).
Slice 4b-i — what changed (where to look)¶
- New matcher
lib/matchers/GenericSection.js— always-matchestag==='section'at constant score 0.05 (strictly below About's 0.15 floor → provably zero-regression; empty section → 0, still dropped). Extracts{heading, text, images}; DOM-only so it works identically in both lanes. - New canonical block
packages/components-v3/…/blocks/generic-section.astro— composesSection(tone,align)→SectionProse(slot) +SectionGrid(columns)+SectionActions; a superset ofcontent-1/features-3. - CMS lane
lib/cms/transformer.js—fromGenericSection+SECTION_TRANSLATORSentry +fcr.generic-sectionadded toALIGN_ELIGIBLE/COLUMNS_ELIGIBLE; the two previously-silentcontinues now loud-warn (ADR-0004). Schema block + adapter - dispatcher:
apps/cms/src/plugins/marketing-blocks/index.ts,apps/cms/src/components/fcr-blocks/GenericSection.astro,FcrBlocks.astro. - Static lane
lib/assembler-fulldev/translate.js—translateGenericSection. - known-patterns: new entry — an always-matches fallback is zero-regression iff its score sits strictly below every other matcher's min positive score; closing a silent-drop with a loud-warn exposes adjacent drops.
Verified¶
- Clean
astro build(exit 0);check-renderers21 types. (An earlier build fail was a Vite dep-cache race from back-to-back builds, not code — clean-cache rebuild green.) - Zero regression: WCP seed (24 pages) — 0 generic-section, block-type distribution unchanged; live garvanbay home unchanged post-deploy.
- CMS path end-to-end (matcher →
fromGenericSection→ PT block) with all three measured stamps flowing (tone/_bg, align, columns="2"). - Live render proof on the deployed demo worker (version
e4d96177): a throwawaygeneric-proofscratch page rendered heading + prose (align=center),tone=mutedband,columns=2R2 image grid — then the row was deleted (/generic-proofnow 404s). Per known-patterns "prove the render surface another way" — with the new wrinkle that a new block type needs a worker redeploy first or the forced instance hitsMissingBlock.
New this session (see known-issues)¶
- CMS lane silently drops FloatingCTA/FloatingSocial — surfaced by the new
loud-warn (48/WCP run): both match but have no CMS PT translator, so the CMS lane
renders no floating rail. New known-issue with a reopen trigger. Not a
GenericSection target (
pinnedtag, notsection).
Next priority — Slice 4b-ii (genericFallbackRate metric)¶
Build-time {sectionId→matcher} sidecar (order+heading join, mirroring
seed-from-build.js#makeStyleLookup) → nonzero rate in rollupMatcherGap → gate
veto for GenericSection on a role-weight-≥1.3 region → flip
structural-diff.validate.mjs line 161. Scope + the load-bearing join-key decision:
scope-2026-07-08-slice-4b.md §"4b-ii". Then Slice 5 (Wix API content plane) /
Slice 6 (calibration).
Carried / open¶
Deployed demo worker now runs 4b-i code (reconciled by this session's commit). The
static-lane GenericSection emit path is wired (matcher + translator registered)
but not separately built — no local static scaffold exists (garvanbay's is on EC2),
so static-lane render parity is reasoned, not re-built (eyeball on the next per-site
static build). Plus all prior carried items: seed thresholds uncalibrated (Slice 6);
theme-fidelity.js lacks a .validate.mjs; T re-measures emission not the deployed
DOM; imageSide over-fires on media heroes; deployed-site fidelity gaps
(garvanbay muted bands, WCP columns/align/FAQ-tone); per-site static lane consumes
no capture (Option A); cross-account sharding; brand-detection nondeterminism;
noindex launch blocker.