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)¶
- Capture-driven
hero-1side-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.jsctx hascompLayout: new Map(), computedLayout: null), so it can't "distinguish full-bleed from side withclassifyImageSidegeometry". The LIVE capture already measured it (bg.media=false+style.imageSide). Fix:makeStyleLookupexposesmedia; the transformer stampsimageSide+scrim:noneonfcr.heroonly whenimageSide && !media→ CMSHero.astroroutes tohero-1(reworked from unused to mirrorcontent-2'sSectionSplit); genuine media heroes keephero-4. 10 service heroes converged; garvanbay 0 stamps. NewimageSideselect on thefcr.heroschema. - WCP image migration. WCP's committed seed had never been image-migrated —
every
imageUrla 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). Rantransform-seed-images.mjs(342 refs →r2:, 0 uploads — all idempotent) + graft-divergence check (clean) + reseed. All WCP images now resolve (28/_imageURLs/page). - Object-src adapter crash (fix #2 surfaced it). The migration's
siblingshape writes repeater item images as an object{src, originalName};LogoStrip/Gallery/Footercalled scalar-onlyresolveImageRef→TypeError: ref.startsWith is not a function→ SSR truncated every WCP page. Fixed all three to shape-agnosticgetImageSrc(also pre-empts garvanbay's latent 7 objects).
Where to look¶
- Code (uncommitted → this commit):
lib/cms/seed-from-build.js(mediaflag),lib/cms/transformer.js(heroimageSide && !mediabranch + JSDoc),apps/cms/src/plugins/marketing-blocks/index.ts(fcr.heroimageSideselect),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 heroimageSide:right+scrim:nonefields AND the fullr2:image migration (342 refs, 0 raw/assets/images/left; the 1 herovideoUrlstays 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, notresolveImageRef" (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¶
- 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→defaultand a couple contentimageSidemisses. - 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. - Static lane hero-1 routing deferred (Option A) — WCP is CMS-deployed, not verifiable on the static lane; same trigger as imageSide/columns.
- 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 inscorecard.js's page join; re-match dup-collapse; the WCP video-herovideoUrlmigration gap.