Skip to content

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 (translateUSPBarfeatures-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 block the 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 image placeholders (13 service-grid items, 2 pages) recorded; new gallery.columns graft 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)

  1. 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.
  2. fcr.business.imageUrl/assets/logos/… never migrated → dead on the worker, so og:image + JSON-LD imagery are broken. Logos are FCR build assets (no wixstatic source): upload the local file to R2. One-liner.
  3. ADR-0010 slice C — image provenance enrichment (API filenames/dimensions/alt), now that searchFiles gives the true 392-file pool.
  4. 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.
  5. Section-style density dimension + Slice 6 calibration.