Skip to content

Session handover — 2026-07-07 pt2

Continues from session-2026-07-07-handover.md (ADR-0009 Slice 3 — imageSide). This session: drove the second section-style dimension — alignment — end-to-end on the CMS lane and deployed it to the garvanbay demo. One code commit (b00c482) + this wiki commit.

What changed — where to look

  • ADR-0009 alignment (b00c482) — second dimension shipped, same rail as imageSide, CMS lane:
  • lib/section-style.js + .validate.mjs — pure classifyAlign (heading text-align, paragraph-majority fallback; right/justify/ambiguous → omit), 25/25 locked.
  • lib/capture-section-backgrounds.js — in-page _styleRaw.align (computed text-align of prominent heading + paragraph majority); still schemaVersion: 2.
  • New universal render sinkSection primitive gains aligndata-align
    • 6 unlayered global CSS rules that override each block's hard-coded alignment by attribute-specificity (0,3,0 > 0,1,0), absent attr = block default.
  • makeStyleLookup/transformer.js/apply-section-tones.js stamp align on fcr.{about,cta-strip,service-grid,faq} (ALIGN_ELIGIBLE), identity-known only. Threaded through content-1/2, cta-wcp, services-1, faqs-1 + their 4 adapters. New ALIGN_FIELD (Auto/Left/Centre) select.

  • Full contract + specifics in docs/pipeline/section-style-contract.md (alignment row now Shipped, new "alignment — specifics" section; columns is next).

Verified

  • Classifier orientation confirmed against the live DOM — garvanbay home service teasers measure text-align: center in a ~32%-wide side text column (content-2's exact shape), so align=center there is a faithful correction, not a regression.
  • Zero-regression: re-capture → 0 tone / 0 imageSide diffs across 94 sections; garvanbay seed stamp is align-additive only (0 tone/imagePosition churn); WCP untouched. Build ships all 6 data-align rules; astro check 0 new errors.
  • Deployed + screenshot-verified — worker redeployed (version e797c676) + surgical 7-row D1 patch; deployed demo renders content-2 teasers centred to match live, faqs left, hero/CTA unchanged; home's native 10th block preserved.

Two new known-patterns (see known-patterns.md)

  • A measured section-style prop overrides a block's hard-coded alignment via attribute-specificity — not by editing each block.
  • A style dimension that adds NEW render code needs a worker redeploy + a surgical multi-row D1 patch — imageSide's D1-only UPDATE doesn't generalize (match by _type+heading, not _key; preserve native blocks).

Next priority

ADR-0009 fan-out continues — columns is next (docs/pipeline/section-style-contract.md order: imageSide → alignment → columns → density → header/topbar). columns needs a new SectionGrid data-columns render surface and the team-grid/checklist <Section> migration (they're raw <section>, so tone/density/columns/align are all unsupported on them until migrated — the shared prerequisite). Or bring captured styling to the per-site static lane when the first static launch is scoped.

Carried/open (see known-issues): surgical "sync-style-to-D1" should graduate from the scratchpad to a committed fleet tool (new entry — reopen at the next dimension deploy or ADR-0008 Slice 3); per-site static lane capture-consumption deferred (Option A, now covers alignment too); garvanbay D1 diverges from seed (native block); section-band selection deferred (2b-band); brand-detection nondeterminism; $card-sample reliability; cross-account sharding unproven; per-site static @source + noindex blockers.