Session handover — 2026-05-06¶
End-of-day note for tomorrow's pickup. Today closed the matcher-gate
work and ran garvanbay end-to-end (extract → assemble → build → deploy →
visual compare). The verifiers say green; the deployed page exposes three
render-layer gaps the verifiers are blind to. Tomorrow's job is to attack
those, run verify-design.js for the first time on a real deploy, and
decide whether to introduce a routing-regression check.
Where we ended up¶
- Branch:
master@248f90f(pushed to origin). - Verifier (20-site phase3 sample): matcher 0 unmatched / 8 total gaps, translator 29 gaps. Down from baseline 35 / 67 / 24.
- Garvanbay deployed:
- LIVE: https://www.garvanbay.ie/
- OURS: https://master.garvanbay-fulldev.pages.dev/ (latest immutable: https://787f0490.garvanbay-fulldev.pages.dev/)
- Local artifacts:
tmp/garvanbay-live.png— full-page LIVE screenshottmp/garvanbay-ours.png— broken first deploy (CTAStrip overgrab)tmp/garvanbay-ours-v2.png— current state after the reverttmp/snap-pair.js— the script that captures both pages at 1440×900- EC2 build directory:
~/replatform-dashboard/builds/garvanbay.ie/assembled-fulldev/— fresh from this session's clean rebuild (phases 0→4, theme phase failed via networkidle timeout but assemble fell back to defaults).
What today's session shipped¶
Five commits, in order:
94462e9 matchers + verify-design: drain unmatched bucket, build design gate
cc6f513 matchers: drop the 35 unmatched-section bucket from 35 → 8
c7c315e matchers: drain remaining 8 → 0 unmatched on phase3 sample
4f0bd59 matchers: drain extraction-gap layer 51 → 8 across phase3 sample
248f90f matchers/CTAStrip: revert image-less textLen 500 → 300
Net effect on the 20-site verifier:
| Metric | Before | After |
|---|---|---|
| Unmatched sections | 35 | 0 |
| Total matcher gaps | 67 | 8 |
| Sites at zero gaps | 3 | 12 |
New artifacts in the perimeter:
lib/matchers/ImageStrip.js— decorative 2+-image rows, plus 1-image full-bleed banners (incl. section-bg-only payloads).lib/matchers/FloatingCTA.js— pinned single-anchor overlays; translator no-ops scroll-to-top FABs (href === '/'or#*).lib/verify-design.js— per-region Gemini call returning a singleownerper issue. Built but never run on a real deploy yet.
The three render-layer gaps to attack tomorrow¶
The matcher gate is genuinely clean. The drift is past the matcher, in translators + components. Each gap below has a concrete first investigation step.
1. Hero renders as dark "GARVANBAY ACCOUNTING" panel instead of LIVE's white photo hero¶
- Symptom: OURS hero is a black band with the words "GARVANBAY ACCOUNTING" centered. LIVE has a white-bg section with a photo of an accountant + overlay CTA.
- Matcher trace (clean): Hero matched the first content section as expected. About matched the welcome heading section.
- Suspected layer: translator +
hero-4.astrocomponent. The dark bg suggests the component fell back to a default fill instead of rendering the live hero's bgImage / video. - Where to start tomorrow:
node lib/verify-translator.js garvanbay.ie— focus on the Hero gap. Look atprops.backgroundImage/backgroundVideo/slideshowImagesflow into hero-4's prop interface.- Read
lib/components-v3/blocks/hero-4.astroand verify it actually rendersimage/backgroundImageprops. ADR-0003 mentioned the side-image variant was deferred — hero-4 may not support the live hero's layout. - If hero-4 lacks the right variant, route to a different fulldev
hero (1/2/3/5/7) via
translateHerobased on signal shape, or extend hero-4.
2. Service-section images render as alt text instead of <img>¶
- Symptom: Each of PAYROLL / MANAGEMENT ACCOUNTING / COMPANY SECRETARY / Accounts Preparation / Tax & Advisory shows the literal string "PAYROLL", "MANAGEMENT ACCOUNTING", … below the body text. No actual photo. LIVE shows a photo on each section.
- Matcher trace (clean):
- Suspected layer: the alt-as-text suggests
content-1.astrois emitting{props.image}as a string somewhere instead of an<img>, ORtranslateAbout's split logic (returns array[content-1, gallery-wcp]when 3+ images) is dropping the single-image case incorrectly. - Where to start tomorrow:
- Inspect emitted
content.tsfor one service section — see how About'simage/images[]props serialised. - Read
lib/components-v3/blocks/content-1.astroand check the image-rendering path (Astro<Image>vs raw<img>vs{src}interpolation). translateAboutis the most likely culprit since it's the layer that splits About into multiple blocks. Checklib/assembler-fulldev/translate.js.
3. "Book an appointment" CTA strip mostly empty¶
- Symptom: The CTAStrip section between hero and welcome is mostly empty — only a single "056 95555" button visible. LIVE has the full "Book an appointment today to avail of our accounting services" heading + a phone button + an email button.
- Matcher trace (clean):
Matcher captured heading. Components picked:
cta-wcp. - Suspected layer:
cta-wcp.astroslot rendering ortranslateCTAStripnot surfacing the heading + email button correctly. This session added animages[]array to translateCTAStrip — that may have shifted the slot composition. - Where to start tomorrow:
- Read the emitted slot HTML for this section in
content.ts. lib/components-v3/blocks/cta-wcp.astro— check that<slot />renders the heading + body, and thatlinks[]displays each button correctly.
Methodological lesson — verifier-green ≠ render-correct¶
The first deploy was visually broken (5 service-detail sections collapsed to bare buttons) while the verifier reported 0 unmatched / 8 gaps. Root cause: my round-1 textLen bump in CTAStrip's image-less clause (300 → 500) made PAYROLL et al. (textLen 310-348) match CTAStrip 0.6 over About 0.4. The match was structurally valid (props flowed, the verifier had nothing to flag) but semantically wrong (About-shaped sections rendered as bare CTA tiles).
The matcher gate measures completeness, not routing correctness. The deterministic perimeter as it stands has no gate that catches a correctly-extracted-but-wrongly-routed section.
Two ways forward:
- Use
verify-design.js— that's exactly the gap it's designed to fill (per-region visual diff). It was built today but never exercised. Tomorrow we should run it against the current garvanbay deploy and see whether it picks up all three gaps above. - Add a routing-regression manifest — a tiny per-site JSON file pinning the expected matcher for each section ID. CI / verifier flags drift. Cheap to maintain for the ~20 reference sites; catches the failure mode that bit us today before it ships.
Both are low cost. The verify-design route is more general (catches component-render drift too); the manifest route is faster feedback for matcher-routing changes specifically.
Suggested tomorrow's order¶
- Run
verify-design.json the deployed garvanbay (live vs master.garvanbay-fulldev.pages.dev), one region at a time. First real exercise of the gate. - Fix Hero — biggest visible win, single component file.
- Fix About → content-1 image rendering — affects 5 sections in one site, also paid forward across the portfolio (every About section uses content-1).
- Fix CTAStrip → cta-wcp slot rendering — last visible deploy gap.
- Re-deploy and screenshot-compare. If still drifting, that's the signal to introduce the routing-regression manifest.
Translator-gate work (29 gaps across 20 sites, mostly newly-introduced by today's matcher relaxations) is real but can sit until the visible render is right — translator gaps that affect render will show up as render bugs, and the ones that don't aren't urgent.