Session handover — 2026-07-12 pt6¶
The USPBar misroute — the cause of WCP's 276 loud-fail placeholders — is closed. It was not the capture gap pt5 diagnosed; that diagnosis was wrong and is corrected in known-issues. This session found the real producer, fixed it, and shipped the trust ribbon.
What shipped¶
Root cause (CMS lane only). lib/cms/transformer.js mapped USPBar:
fromLogoStrip. USPBar emits text items ({icon, text}); fromLogoStrip reads
l.src off whatever props.logos || props.items hands it — so every text item became
{src:'', alt:''}, the text was destroyed, and the empty src painted a logo?.
Live shows a 67px band of pure text ("7-Year Guarantee · Fully insured · Reliable &
Long Lasting Results", zero images). The static lane never had the bug
(translateUSPBar → features-1), so the two lanes had silently diverged.
What found it: the build's section-matchers.json sidecar — 94 of the 105
fcr.logo-strip blocks came from USPBar, not LogoStrip. One lookup, and the
capture-gap theory evaporated. (Lesson banked in
known-patterns "One emitter, two item shapes".)
Fix: new canonical usp-bar.astro
(thin text ribbon — the standalone form of the ribbon hero-4 already hoists), new
CMS type fcr.usp-bar (+ adapter + dispatcher), and fromUspBar splitting by what
the section actually carries: logos → fcr.logo-strip (unchanged), text →
fcr.usp-bar.
Delivered: seed regenerated through the current pipeline (block types: logo-strip
105 → 12, usp-bar 0 → 93, every other type identical, 24 pages both), worker
redeployed first (19a8b763 — a new block type must be renderable before D1
carries it), then a pages-only D1 write.
Verified on the deployed site: ribbon text renders on every page;
ui-missing 276 → 39; all 237 logo? gone; the real 4-badge logo strip still
renders; block counts unchanged on all 24 pages; garvanbay untouched.
The graft check earned its keep¶
The mandatory pre-write check (known-patterns "A whole-content fleet regen+patch…") blocked a globals reseed and caught two things I had assumed away in scoping:
- Header CTA: regen
""vs live"SERVICE AREAS". I had scoped on the assumption that pt4's CTA auto-detection made WCP fully regenerable. It does not reproduce from the local capture — a globals reseed would have reverted the CTA. - Globals surplus: live carries a native
blockthe regen lacks.
So ec_globals was not touched at all (the slice only changes page blocks). A
field-level diff of every non-rerouted block then proved the regen loses nothing:
the only deltas were fcr.hero.variant (live null → measured value — a gain; the
variant was committed in pt2/pt3 but never synced to live D1) and one
fcr.gallery.columns, which was grafted from live rather than overwritten.
Wiki changes¶
- known-issues.md — the pt5 "capture gap" entry corrected
and closed (it was a misroute); residual 39
imageplaceholders (13 service-grid items, 2 pages) recorded; newgallery.columnsgraft entry; garvanbay-clean note. - known-patterns.md — new entry "One emitter, two item shapes", with the two detection rules (find the producer before theorising about a placeholder; audit many-to-one matcher→emitter maps for shape coercion).
State¶
Committed to master: packages/components-v3/…/blocks/usp-bar.astro (new),
apps/cms/src/components/fcr-blocks/UspBar.astro (new), FcrBlocks.astro
(dispatcher), marketing-blocks/index.ts (fcr.usp-bar schema),
lib/cms/transformer.js (fromUspBar), apps/cms/seed/waterfordcountypainters.json
(regenerated), the wiki + this handover. Live writes: WCP worker 19a8b763; 24
ec_pages rows updated (globals untouched). No garvanbay change.
Next session (priority order)¶
- Service-grid item images — the residual 39 placeholders (13 empty
fcr.service-grid.imageUrl, on/service-areas+/accessibility-statement). Same "find the producer first" discipline before assuming a capture gap. fcr.business.imageUrl—/assets/logos/…never migrated → dead on the worker, soog:image+ JSON-LD imagery are broken. Logos are FCR build assets (no wixstatic source): upload the local file to R2. One-liner.- ADR-0010 slice C — image provenance enrichment (API filenames/dimensions/alt),
now that
searchFilesgives the true 392-file pool. - Header CTA is not reproducible from a regen (found by the graft check above) — pt4's detector doesn't fire on the stored capture, so WCP is still not safely re-seedable end-to-end. Worth closing before the next fleet-wide regen.
- Section-style density dimension + Slice 6 calibration.