Skip to content

Session handover — 2026-07-07 pt3

Continues from session-2026-07-07-pt2-handover.md (ADR-0009 alignment). This session: drove the third section-style dimension — columns — end-to-end on the CMS lane, including the team-grid/checklist <Section> migration that was its prerequisite. One code+docs commit (cf6b55f) + this wiki commit.

What changed — where to look

  • ADR-0009 columns (cf6b55f) — third dimension, same rail as imageSide/alignment:
  • lib/section-style.js#classifyColumns (+ .validate.mjs, 36/36) — grid track count → else first-row cluster; omit <2, clamp 4+→4.
  • lib/capture-section-backgrounds.js#resolveSectionStyle_styleRaw.columns {gridTracks, firstRow} (densest even-width first-row grid); still schemaVersion: 2.
  • Two render sinks (columns is not a single universal sink): SectionGrid gains data-columns (services-1 forwards it); team-grid keeps its bespoke grid with its own data-columns hook; gallery already had one.
  • team-grid + checklist migrated to compose <Section> (minimal-wrap, zero-regression) — the shared prerequisite.
  • Threading: makeStyleLookup + COLUMNS_ELIGIBLE {service-grid, team-grid, gallery} stamped in transformer.js + apply-section-tones.js (identity-known only, not gap-tone); new COLUMNS_FIELD select; ServiceGrid/TeamGrid adapters forward.
  • Contract + specifics in docs/pipeline/section-style-contract.md (columns row now Shipped, new "columns — specifics" section; density is next).
  • Two new known-patterns (known-patterns.md): minimal-wrap migration of a raw-<section> block into <Section> + N-sinks-one-enum for a heterogeneous dimension; and a measured value equal to the block default (or a gap-tone-only eligible block) is a faithful no-op — prove the render surface by forcing a value.

Verified

  • validate 36/36; astro check 0 new errors (5 pre-existing, untouched files); CMS build green; re-capture → 0 tone/imageSide/align diffs (prior values reproduced), columns measured (team=2, FAQs 3/4).
  • Deployed + screenshot-verified on the garvanbay demo (worker version f7568797): migrated team-grid (2-col, Section-wrapped) and checklist (56rem, primary prose, ✔ bullets) both zero-regression; columns render surface proven live via a temp D1 columns=3grid-template-columns: repeat(3,1fr), then reverted.
  • garvanbay is a faithful no-op for the automatic stamp — no service-grid/gallery, and its one team-grid is gap-tone-matched → columns correctly withheld (see the known-pattern). First automatic live columns awaits a site with an identity-matched grid.

Next priority — SHIFT TO BREADTH/VALIDATION, not more dimensions

Recommendation (owner-endorsed this session): stop fanning out dimensions on garvanbay and validate what's built against variety. The rail (capture→classify→ store→join→stamp→render→edit) is proven and each dimension now rides it cheaply — but three dimensions (imageSide/align/columns) are all proven on one deployed site, CMS lane only, and this session columns was a no-op on that site (nothing to exercise it). We're building capability faster than we're validating outcome. The core ADR-0009 bet — does measured-near-match actually clear near-match at scale? — is unmeasured (that's Slice 6, still Planned).

Concrete next move (a lightweight Slice 6 / Slice 4 seed): - Bring a second already-deployed site (WCP) — which has service-grids and a gallery — into section-style capture + stamp + deploy, so imageSide/align/columns are exercised on real grids and a second palette. Then eyeball vs live. - Or pull a small batch (5–10 sites) through capture and look — start shaping the screenshot-diff scorecard (ADR-0009 §6, Slice 4) that becomes the ship/hold gate. - Density/header dimensions can wait; they'll be cheaper after we know the real pass rate and which gaps actually move the near-match needle.

For the Fable session that opens next: point it at the hard reasoning, not the fan-out. Highest-value targets: (a) design the near-match scorecard / metric — what does "reads as the same site" operationalize to (section-weighted screenshot diff + structural-fidelity metrics: section count/order/band sequence/image sides/column counts), and what thresholds gate automated-ship vs manual-polish (ADR-0009 §6); (b) the static-lane consumption architecture (Option A — bring all captured styling to assembler-fulldev/emit.js at once), since the static long tail is the bulk of the 1800 and currently gets none of this; (c) cross-account fleet sharding (ADR-0008), the unproven scaling premise. (a) is the one that unblocks everything else.

Carried / open (see known-issues)

Per-site static lane consumes no section-style capture (Option A, now covers columns); team-grid/checklist migration verified CMS-lane only — static lane not separately built (new entry); columns capture over-fires cols= on non-grid sections (gated, harmless — new entry); sync-style-to-D1 still a scratchpad tool (no D1 style-sync needed this deploy — garvanbay was a no-op); garvanbay D1 diverges from seed (native block); brand-detection nondeterminism; $card-sample reliability; cross-account sharding unproven; per-site static @source + noindex blockers.