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); stillschemaVersion: 2.- Two render sinks (columns is not a single universal sink):
SectionGridgainsdata-columns(services-1 forwards it);team-gridkeeps its bespoke grid with its owndata-columnshook; 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 intransformer.js+apply-section-tones.js(identity-known only, not gap-tone); newCOLUMNS_FIELDselect; 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 check0 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 D1columns=3→grid-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.