Skip to content

Session handover — 2026-07-10 pt4

Single-slice session: WCP service-page hero fix (the pt3 handover's #1 lever), which grew a second half when it exposed a WCP-wide image-404 problem. Net: WCP composite 76.3 → 79.0, S 65.5 → 70.8 (the S=70 floor is now cleared — WCP is no longer S-floor-blocked, held below τ_ship only by the gallery Wix-Pro-Gallery case). garvanbay untouched (its worker was not redeployed; my code is inert on its media heroes). Deployed WCP worker 6f2cb2cf; live D1 reseeded (r2: images + hero routing). Still MANUAL-POLISH.

What shipped (three linked changes)

  1. Capture-driven hero-1 side-image variant. The framing in the (now-deleted) "WCP service-page heroes render full-bleed" known-issue was wrong: the matcher is geometry-blind in the CMS seed path (seed-from-build.js ctx has compLayout: new Map(), computedLayout: null), so it can't "distinguish full-bleed from side with classifyImageSide geometry". The LIVE capture already measured it (bg.media=false + style.imageSide). Fix: makeStyleLookup exposes media; the transformer stamps imageSide+scrim:none on fcr.hero only when imageSide && !media → CMS Hero.astro routes to hero-1 (reworked from unused to mirror content-2's SectionSplit); genuine media heroes keep hero-4. 10 service heroes converged; garvanbay 0 stamps. New imageSide select on the fcr.hero schema.
  2. WCP image migration. WCP's committed seed had never been image-migrated — every imageUrl a raw /assets/images/ path that 404s on the CMS worker (images were already in R2 from an earlier session; only the seed pointed at dead paths). Ran transform-seed-images.mjs (342 refs → r2:, 0 uploads — all idempotent) + graft-divergence check (clean) + reseed. All WCP images now resolve (28 /_image URLs/page).
  3. Object-src adapter crash (fix #2 surfaced it). The migration's sibling shape writes repeater item images as an object {src, originalName}; LogoStrip/ Gallery/Footer called scalar-only resolveImageRefTypeError: ref.startsWith is not a function → SSR truncated every WCP page. Fixed all three to shape-agnostic getImageSrc (also pre-empts garvanbay's latent 7 objects).

Where to look

  • Code (uncommitted → this commit): lib/cms/seed-from-build.js (media flag), lib/cms/transformer.js (hero imageSide && !media branch + JSDoc), apps/cms/src/plugins/marketing-blocks/index.ts (fcr.hero imageSide select), apps/cms/src/components/fcr-blocks/Hero.astro (hero-1 route), packages/components-v3/src/components/blocks/hero-1.astro (reworked), apps/cms/src/components/fcr-blocks/{Footer,Gallery,LogoStrip}.astro (getImageSrc).
  • Committed seed apps/cms/seed/waterfordcountypainters.json — now carries the 10 hero imageSide:right+scrim:none fields AND the full r2: image migration (342 refs, 0 raw /assets/images/ left; the 1 hero videoUrl stays a raw /assets/videos/ path — the known video-migration gap).
  • known-patterns (NEW ×2) — "The capture plane — not the matcher — is the authority for a hero's full-bleed-vs-side layout" (Hero section); "An item-image adapter must resolve via getImageSrc, not resolveImageRef" (Components/pipeline).
  • known-issues — the standalone "WCP service-page heroes" entry DELETED (fixed); scorecard WCP line + the columns-regen residual #2 updated; the "WCP home trust-badge" entry rewritten (WCP now migrated; object-src crash closed).
  • ADR-0009 Slice 3 tracker — hero variant + WCP image migration noted.

Residual / next priorities

  1. WCP is now the closest MANUAL-POLISH to SHIP (79.0, all floors cleared). The gap to τ_ship 85 is dominated by the gallery page S=44.4 (Wix Pro-Gallery structural case: one giant live widget → junk-filtered to ~1 common section vs our 5 structured blocks) — a scorecard/segmentation limitation, not a content fix. The remaining non-hero diffs are cta-strip tone:brand→default and a couple content imageSide misses.
  2. Repeater item-src data hygiene — the migration leaves item images object-shaped ({src, originalName}); render is now safe (getImageSrc), but flattening to scalar (like the top-level fields) stays open under the "repeater-item images" workstream. Same class as garvanbay's 7 unflattened objects.
  3. Static lane hero-1 routing deferred (Option A) — WCP is CMS-deployed, not verifiable on the static lane; same trigger as imageSide/columns.
  4. Earlier residuals unchanged: upstream emdash save-race repro still unposted (docs/pipeline/upstream-emdash-1158-repro.md); infra/llm-gateway/ commit-or-delete (Cathal's call); ADR-0009 Slices 5/6; home/index alias in scorecard.js's page join; re-match dup-collapse; the WCP video-hero videoUrl migration gap.