Skip to content

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-matches tag==='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 — composes Section(tone,align)SectionProse (slot) + SectionGrid(columns) + SectionActions; a superset of content-1/features-3.
  • CMS lane lib/cms/transformer.jsfromGenericSection + SECTION_TRANSLATORS entry + fcr.generic-section added to ALIGN_ELIGIBLE/COLUMNS_ELIGIBLE; the two previously-silent continues 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.jstranslateGenericSection.
  • 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-renderers 21 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 throwaway generic-proof scratch page rendered heading + prose (align=center), tone=muted band, columns=2 R2 image grid — then the row was deleted (/generic-proof now 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 hits MissingBlock.

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 (pinned tag, not section).

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.