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-buildread the fulldev-translatedslotstring instead of the matcher's extract → empty text; fixed inlib/cms/transformer.js. (2)transform-seed-imagesemits §6 image objects; a raw-<img>adapter callsresolveImageRefon the object → SSR abort → 404. Extendedmigrate-block-image-fields-to-string.mjsto flatten all image keys incl. repeater items, made itSITE-aware. Verified in-browser (home + subpages render content + images). Two new known-patterns ("CMS seed extraction — matcher text lives inentry.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 + aGenericSectionfallback; 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 fromemitGlobalCss(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-radiusskipped (stale audit item); decorativering-2/ring-12left literal to preserve pixels.
Verified¶
- WCP live:
wcp.dcathal.orghome + 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).