Session handover — 2026-07-05 pt3¶
Finished the Slice 2b capture lane, then verified the render and
found + fixed a silent bug that stopped tones painting at all, then
deployed garvanbay so tones paint live. Work on master, pushed.
Two code commits: 8ee6755, 13deb1b.
What changed — where to look¶
Slice 2b capture lane (8ee6755). Live section-background capture →
tone classification → seed stamping. New: lib/capture-section-backgrounds.js
(Playwright), lib/section-tone.js (pure classifier), lib/cms/apply-section-tones.js
(in-place seed stamper). Threading: seed-from-build.js makeToneLookup +
transformer.js transformLayoutMap({ toneFor }). garvanbay seed stamped
58/58. Full architecture + the 5-value enum contract is now ADR-0007
(new). Hardening from the review pass is in the commit body (gap-tone claim
fix, loud-fail JSON reads, blog ordinal).
Render verification → the tones-not-painting fix (13deb1b). Verified
against wfpainters and found 4 of 5 tones rendered white: correct class +
data-tone in HTML, but no CSS rule. Root cause: apps/cms Tailwind
v4 ignores the node_modules symlink to packages/components-v3, so tone
utilities that live only in section.astro were never generated (also
dropped bg-card/bg-destructive). Fix: emitGlobalCss(theme, { sources })
emits a Tailwind @source; CMS caller passes the components-v3 path. See
ADR-0007 "render-scan gap", known-patterns "Workspace-package utility
classes need an explicit Tailwind @source", and the known-issues
follow-up.
Verified¶
- Production
npm run build: emitted CSS 253KB → 299KB, all five tone backgrounds (bg-background/bg-muted/bg-primary/bg-secondary/bg-foreground) + theirtext-*-foregroundpairings now generate. Confirmed at the built-CSS level (authoritative) — the dev server's emdash+cloudflare dep-optimizer was too flaky for a clean screenshot, and the built CSS is stronger evidence than pixels here. - garvanbay dry alignment: 58 stamped, 0 unmatched.
Deployed (tones live)¶
Deployed the CMS worker this session — emdash.dcathal.org, tenant
garvanbay, personal account (cathaldempsey@gmail.com, 1ceb…).
Current version 3c5b10e6.
The stamping only ever wrote seed.json, so the deployed D1 had 0 pages
with tone — a CSS-only deploy would still have rendered default. Both
steps were needed and done:
node apps/cms/scripts/reseed-d1-from-json.mjs— reseeded remote D1 from the toned seed (22 changes; 58 tone values now inec_pages, 56 default / 2 muted).npm run deployfromapps/cms— prebuild baked garvanbayglobal.csswith the@sourcefix, thenwrangler deploy.
Verified live (emdash.dcathal.org/, HTTP 200, public): the 2 home
fcr.about sections render data-tone="muted" + bg-muted, and the
deployed CSS carries .bg-muted{background-color:var(--muted)} (+ all four
other tone rules) — the band paints. Garvanbay's tones are 56 default / 2
muted, and muted is oklch(0.96) (near-white), so the visible change is
two faint grey bands on the homepage. Pipeline proven in production;
wfpainters (brand:63) is where tones would be visually load-bearing, but
it isn't the deployed tenant (tenant swap declined this session).
Known gaps opened / carried¶
- Per-site static build (
assembler-fulldev/emit.js) has the same Tailwind@sourcegap — passes nosources. Tracked in known-issues "Per-site static builds don't scanpackages/components-v3". - Prior priorities still stand (from pt1/pt2): repeater-item image fields
before a 2nd site; seed-vs-admin source-of-truth policy; env-gate the
per-site
emit.jsnoindex; contact-form real submission.
Next priority¶
Slice 2b is closed and live. The carried CMS-milestone items (repeater-item
images, seed-vs-admin policy) are the next substantive work; the per-site
@source fix is a quick follow-up when that lane is next touched.
Note on the reseed: block.tone reaches remote D1 only via
reseed-d1-from-json.mjs, not seed.json alone — any future re-stamp needs
a reseed to go live (ties into the open seed-vs-admin source-of-truth
policy).