Session handover — 2026-05-07¶
End-of-day note for tomorrow's pickup. Today closed the three render-layer gaps from yesterday's deploy (hero / services / cta-strip), shipped a full brand-default theme layer, fixed verify-design's owner attribution so its output is actionable, and reconciled the EC2/origin/local git divergence. Eleven regions verified; eight still need work, and three of them (header, faq, footer) are still in the 2/10 tier.
Where we ended up¶
- Branch:
master @ 5d6c5a5(origin + EC2 + local all aligned). - Backup tag (local only):
pre-reconcile-2026-05-06 @ 4686c81— recover fromgit reset --hard pre-reconcile-2026-05-06if the reconcile turns out to have lost something we missed. - Garvanbay deployed:
- LIVE: https://www.garvanbay.ie/
- OURS: https://master.garvanbay-fulldev.pages.dev/ (latest immutable: https://c5f49328.garvanbay-fulldev.pages.dev/)
- EC2 build directory:
~/replatform-dashboard/builds/garvanbay.ie/assembled-fulldev/— clean, re-built and deployed at end of session.
What today's session shipped¶
Eight commits on master (all pushed):
5d6c5a5 fix(hero-4): scope white heading + suppress global accent line + white button border
2528c33 fix(section-prose): emit data-slot attribute so themed selectors match
36a7788 feat(theme): brand-default heading colour + button pill + accent underline
f36b6d7 fix(verify-design): resolve component owner from caller / assembled tree
dc26553 fix(header): add bg/border/shadow to More dropdown popover
2247e8f fix(header): restore More dropdown with less-aggressive threshold (>7 items)
29f3b67 fix(header): stop over-collapsing nav into More + raise z-index above hero
762f72e feat(assembler): split-layout for service-teaser sections via content-2
9f94b54 chore: reconcile EC2 working tree (theme-extractor + matcher fallbacks + today's fixes)
Plus the asset-download fixes that landed early in the session:
- lib/dom-pipeline.js (silent catch → 3x retry + warn-on-fail)
- lib/backfill-assets.js (new — post-assemble safety net)
- lib/assembler-fulldev/translate.js (inferIcon helper, content-2 routing,
alternation pass, More dropdown threshold)
- lib/theme-extractor.js (networkidle wait fallback)
- lib/components-v3/blocks/{cta-wcp,content-2,header-wcp,hero-4}.astro
- lib/components-v3/ui/{button,section/section-prose}.astro
Score deltas across the session (full-region sweep)¶
| Region | start | end | Δ |
|---|---|---|---|
| hero | 2 | 5 | +3 |
| welcome | n/a | 2.5 | — |
| cta-strip | 2 | 4 | +2 |
| svc-payroll | 1 | 6 | +5 |
| svc-management | n/a | 6 | — |
| svc-company-secretary | n/a | 6 | — |
| svc-accounts-prep | n/a | 6 | — |
| svc-tax | n/a | 4.5 | — |
| header | n/a | 2 | — |
| faq | n/a | 2 | — |
| footer | n/a | 2 | — |
n/a = not measured at session start (only hero / one service / cta-strip
were verified yesterday). Today's first action was a full-region sweep —
that's the right opening move next session too.
The three open regions to attack tomorrow¶
Header, FAQ, and footer are all still 2/10 tier and represent the remaining cross-cutting gap on garvanbay.
1. Header — topbar missing entirely (Gemini score 2/10)¶
- Symptom: the rebuild has no top contact bar (live shows phone + email + Book CTA pinned above the main nav). The main nav has 6 visible + More dropdown after this session's fix, but Gemini also flags missing dividers between nav items and incorrect link colour.
- Suspected layer:
topbar-wcpis in the assembler's component pick list and renders in the assembledindex.astro, but on the deploy it's empty / invisible. Either:- The topbar matcher (
lib/matchers/TopBar.js) emits empty props for garvanbay (no contact info captured) topbar-wcp.astrorenders nothing when given empty props- The translator drops the topbar's content
- The topbar matcher (
- Where to start:
- Inspect
topBar_1_propsinbuilds/garvanbay.ie/assembled-fulldev/src/data/content.ts. If empty, the matcher isn't capturing. - Check
lib/matchers/TopBar.jsagainst live'scomp-l63c1gdo(the pinned overlay layer at the very top of the site). The matcher needs to extract phone, email, and the Book CTA. - If props are flowing but the component isn't rendering them
visibly, check
lib/components-v3/blocks/topbar-wcp.astro.
2. FAQ (2/10)¶
- Symptom: missing background pattern, missing first-item-expanded default state, wrong heading colour, plain horizontal lines instead of styled accordion panels.
- Suspected layer:
lib/components-v3/blocks/faqs-1.astro— needs accordion-panel styling (live uses Wix's expandable cards with subtle borders + bg) and adefaultValueon the first accordion item. - Where to start:
- Read live's first FAQ accordion item's CSS (light grey panel bg, rounded, with chevron).
- Update
faqs-1.astroto mirror that styling. - Add
defaultValue={items[0]?.title}to<Accordion>so the first item starts open (Gemini explicitly flagged this).
3. Footer (2/10)¶
- Symptom: completely different column structure. Live has a multi-column grid (address | links | hours | credit). Ours stacks everything in a single block, missing phone, missing design credit ("Designed by ..."), adds an unrequested logo column.
- Suspected layer: both translator + component.
translateFooterinlib/assembler-fulldev/translate.js— check whatprops.columnsit receives from the matcher.lib/components-v3/blocks/footer-1.astro— needs to render a proper grid of columns matching live's shape.- Where to start:
- Check
footer_12_propsincontent.tsto see what data is being passed. - Inspect
lib/matchers/Footer.jsto confirm it's grouping address / phone / hours / links into separate columns. - Compare
footer-1.astro's grid layout with live's.
Methodological lesson — data-slot audit¶
The biggest waste of the day was discovering, mid-deploy cycle, that
SectionProse was missing its data-slot="section-prose" attribute.
Every themed selector targeting it had been a silent no-op for half
the session. Same gap likely exists on:
SectionContent(a div, no data-slot)SectionActionsSectionMedia
Tomorrow's first 10 minutes: grep lib/components-v3/ui/ for
the primitives that don't emit data-slot= and add it. Otherwise
the next round of theme rules will silently miss its targets.
This lesson is in memory at feedback_data_slot_attribute_required.md.
How to run the verifier sweep¶
The script that drove today's diagnostics is tmp/sweep-design.sh on
EC2 (untracked, recreate from this template if tmp/ got cleaned):
#!/usr/bin/env bash
set -u
LIVE=https://www.garvanbay.ie/
OURS=https://master.garvanbay-fulldev.pages.dev/
OUT=gaps/garvanbay-sweep
cd ~/replatform-dashboard
mkdir -p "$OUT"
# region | live-selector | ours-selector | label | ours-component
REGIONS=(
"header|header#SITE_HEADER|header.header-wcp|header|header-wcp"
"hero|section#comp-l60h58h5|body > section:nth-of-type(1)|hero|hero-4"
"about|section#comp-l60h58h6|body > section:nth-of-type(2)|welcome|content-1"
"cta-strip|section#comp-l60jla9h|body > section:nth-of-type(4)|cta-strip|cta-wcp"
"about|section#comp-l60jz64o|body > section:nth-of-type(5)|svc-payroll|content-2"
"about|section#comp-l60kyc3w|body > section:nth-of-type(6)|svc-management|content-2"
"about|section#comp-l60l9ij9|body > section:nth-of-type(7)|svc-company-secretary|content-2"
"about|section#comp-l60lkwh0|body > section:nth-of-type(8)|svc-accounts-prep|content-2"
"about|section#comp-l60loazy|body > section:nth-of-type(9)|svc-tax|content-2"
"faq|section#comp-l60lrz7n|body > section:nth-of-type(10)|faq|faqs-1"
"footer|footer#SITE_FOOTER|footer|footer|footer-1"
)
for entry in "${REGIONS[@]}"; do
IFS='|' read -r region live_sel ours_sel label component <<< "$entry"
echo "▶ $label ($region → $component)" >&2
node lib/verify-design.js --live "$LIVE" --ours "$OURS" \
--live-selector "$live_sel" --ours-selector "$ours_sel" \
--region "$region" --ours-component "$component" \
--out "$OUT/$label.json" 2>&1 | grep -E "score:|issues:|summary:" || echo " (no summary)"
done
After the sweep, aggregate by theme via node /tmp/aggregate.js (the
node script lives in tmp/aggregate.js on local; recreate per the
shape in commit f36b6d7's implementation notes).
--ours-component is critical — without it, verify-design.js falls
back to a stale REGION_OWNERS map and routes 39+ issues at
content-1.astro when they should go to content-2.astro or
hero-4.astro (etc.). The fix landed in f36b6d7 but the sweep
script must explicitly pass the per-region component basename.
Other follow-ups (lower priority)¶
- EC2 GitHub auth. EC2 has no token / SSH key for github.com,
so all sync today went via
git bundle create … master:master, scp,git fetch <bundle> master:origin/master,git reset --hard. That works but adds ceremony. Install a PAT in~/.git-credentialson EC2 to push/pull directly. Reference memory:reference_git_topology.md. tmp/is gitignored as of36a7788— but earlier commits this session (dc26553,2247e8f,29f3b67) accidentally committedtmp/gaps/garvanbay/services-*-v5.json. ~50KB of noise in history, accepted rather than force-pushing master.- Hero buttons are still flagged for padding (Gemini wants
larger). Tailwind utility classes (
px-6from CVA) win over the globalpaddingrule. Either move global rules to@layer utilities, append!important, or extend the button variant system.
Suggested tomorrow's order¶
data-slotaudit on SectionContent / SectionActions / SectionMedia — quick win, prevents future invisible-CSS bugs (~10 min).- Topbar / header — most user-visible miss after today, single matcher + component to investigate (~30–60 min).
- FAQ accordion — straightforward styling work + first-open default (~30 min).
- Footer — biggest scope (matcher + component); leave for last in the cycle so a partial fix doesn't block the smaller wins.
- Re-sweep all 11 regions after each, snapshot deltas in a v2 comparison table.