Skip to content

Session handover — 2026-07-08 pt5

Continues from session-2026-07-08-pt4-handover.md (ADR-0009 Slice 4b-ii). Two pieces of work this session: (1) Slice 4b-ii shipped (pt4); (2) a garvanbay end-to-end fidelity pass across all 10 pages — the demo went HOLD → SHIP. Priority note: 5-vs-6 reordering was parked (calibration wants the Slice-5 content plane first); this pass is orthogonal demo-fidelity work.

garvanbay end-to-end — what changed (where to look)

First full-site scorecard pass (before: only home measured). HOLD (87.9, veto) → SHIP (composite 91.2, S 88.5, T 100, G_det 87.8, no veto). Three levers:

  • Lever 1 — subpage intro-band drop (root-caused + fixed). seed-from-build.js never wired the assembler's Hero-dedupe re-match callback, so every FCR subpage's page-title intro band (which loses Hero to the branded GARVANBAY ACCOUNTING band) was dropped from the seed. Fix committed f72a93e (see fix(cms-seed): wire Hero-dedupe re-match callback). Result: accountspreparation / management-accounting / payroll → S=100.
  • Lever 3 — no-booking book-an-appointment. Was empty (0 blocks → dropped a hero → the veto). Authored hero + 5-service grid (distinct real images) + enquiry CTA. Veto gone. (S=39.7 — our grid consolidates live's separate service sections; structural, page is presentable.)
  • Lever 2 — home muted bands: STILL OPEN. Reseeded D1 with tone:muted and redeployed (fresh global.css), but home still re-captures muted→default. Ruled out the @source gap and D1 divergence — the tone isn't reaching the rendered DOM. Needs deployed-DOM/adapter debugging next. See known-issues (both muted entries).

Deploy mechanics (important for next time)

  • garvanbay's build inputs (src/data/*.body.html) live only on EC2, and that checkout is 100+ commits behind + dirty. So the rebuild pulled the 10 body.html locally and ran the current generator — do NOT build on EC2 (stale code).
  • Images: a rebuilt seed has raw /assets/ paths; the deployed D1/renderer use resolved R2 URLs, and the R2 key is a lossy hash you can't recompute. Resolved via an authoritative basename→URL map from R2 object metadata (scripts/.tmp/r2-map.mjs; 16 objects). Images never uploaded → text-only (intro bands) or re-sourced from an in-R2 sibling (booking cards). See known-patterns "Re-seeding a rebuilt CMS seed needs the AUTHORITATIVE basename→R2-URL map from object metadata".
  • Reseed/redeploy target the demo D1/worker on the personal CF account (wrangler authed locally). Fixed sample seed committed at apps/cms/seed/garvanbay.json; worker redeployed (version bb2e95c8).

New known-patterns

  • Re-seeding a rebuilt CMS seed needs the authoritative basename→R2-URL map from object metadata (image resolution; R2 key is lossy; never-uploaded → text-only).
  • Re-matching a single-instance-dedupe loser must re-run dup-collapse — Wix responsive-doubles produce two losers that both re-match to duplicate blocks (4 removed post-hoc this session; pipeline fix is an open follow-up).

Residual / next priorities

Open, none blocking SHIP (all in known-issues "garvanbay end-to-end pass"): 1. Lever 2 muted-tone render bug (deployed DOM/adapter debug) — highest-value polish. 2. Re-match over-produces dups — fold dup-collapse re-run after re-match into lib/assembler-fulldev/dedupe.js (fixes both lanes; interim seed post-process used). 3. company-secretarial / tax-and-advisory / accountants-waterford each drop 1 band. 4. book-an-appointment grid-vs-sections (split to per-service if the number matters). 5. Promote the R2-metadata map builder + the image-resolve script from scripts/.tmp/ to committed helpers when the next site is re-seeded from a rebuild.

ADR-0009 slice work itself (Slice 5 content plane / Slice 6 calibration) is unchanged and still the strategic next step once demo polish is where you want it.