Skip to content

Session handover — 2026-07-06 pt2

Continues from session-2026-07-06-handover.md (which covered the multi-tenant CMS fleet, ADR-0008, and waterfordcountypainters going live). This half: fixed WCP's empty content, then made the strategic pivot to a near-match fidelity target (ADR-0009) and executed its first slice. Three commits on master, all pushed: 5021a84, b088863, 4b952ce.

What changed — where to look

  • WCP content + images fixed (5021a84). WCP rendered structure with no text, then 404'd after the image step — two stacked bugs. (1) seed-from-build read the fulldev-translated slot string instead of the matcher's extract → empty text; fixed in lib/cms/transformer.js. (2) transform-seed-images emits §6 image objects; a raw-<img> adapter calls resolveImageRef on the object → SSR abort → 404. Extended migrate-block-image-fields-to-string.mjs to flatten all image keys incl. repeater items, made it SITE-aware. Verified in-browser (home + subpages render content + images). Two new known-patterns ("CMS seed extraction — matcher text lives in entry.props…", "Block image fields must be scalar resolved-URL strings at render…") document the onboarding pipeline order. Residual: 3 logo-strip placeholders on WCP home (known-issues).

  • ADR-0009 (new, Accepted) — target output = measured near-match over an editable canonical skeleton (b088863). Raises the fidelity bar to structural near-match (revises ADR-0002's house-style acceptance; forward- pointer added there). Synthesized from parallel Fable + Codex studies (both advised "pursue, moderated"; they split on evolve-vs-rebuild the renderer). Fork resolved toward evolve because self-service editing is a hard requirement (owner-confirmed) → the render must keep a stable editable schema; Codex's faithful-reconstruction renderer is rejected as default, kept as the cap for the editable residue and re-openable per-tier if self-service is dropped. Fidelity via measured/bounded params (ADR-0007 generalized) + generated per-site CSS + a GenericSection fallback; Wix API = content/media source, Playwright capture = layout source of truth; semantic HTML + external CSS (no 46-block rewrite); a screenshot-diff scorecard on a 30–50-site batch sets the ceiling empirically. 6-slice tracker in the ADR.

  • ADR-0009 Slice 1 executed (4b952ce) — tokenize the aesthetic surface, zero visual change. --ring-width, --btn-h/px/gap, --site-shadow-* now emitted from emitGlobalCss (shared by both lanes) with defaults = today's exact values; 12 primitives swap literals for tokens. Shadow wiring resolved (Tailwind v4 inlines built-ins; used @theme inline --shadow-*: var(--site- shadow-*), dodging a self-referential-var trap). Contract: docs/pipeline/aesthetic-token-contract.md (the knob list Slice 2 populates). --hero-radius skipped (stale audit item); decorative ring-2/ring-12 left literal to preserve pixels.

Verified

  • WCP live: wcp.dcathal.org home + subpages render content and images (browser-confirmed); garvanbay untouched.
  • Slice 1 zero-change: declaration-level diff of the compiled bundle shows only the expected literal→var swaps; other CSS bundles byte-identical. Tokens emit with original-value defaults (--ring-width:3px, --btn-h:2.25rem, --site-shadow-* = Tailwind verbatim). No redeploy needed (output identical).

Next priority

ADR-0009 Slice 2 — Capture v2. Extend the capture lane to record per-section style + site-level design tokens into a design.json, each dimension a bounded enum/scale (ADR-0009's "fidelity from measured params, scale from bounded contracts"), and wire emitSiteCss to feed those into the Slice-1 tokens. That is where a site first starts to look like its original. The aesthetic-token contract is the input list.

Carried/open (known-issues): 3 WCP logo-strip placeholders; cross-account sharding unproven (Slice 2 of ADR-0008 was same-account); non-fatal Map/Prose/Features build errors; per-site static-build @source gap (ADR-0007).