# Task 02 — Design token layer **Agent**: `design-system-keeper` · **Model**: Gemini (long context + visual judgement) **Depends on**: 01 · **Parallel with**: 03, 04 · **Blocks**: 07 **Worktree**: `.agents/scripts/worktree.sh start 02 tokens` ## Goal One value per token, a named type scale, five breakpoints — and photographic proof the site looks the same. ## Read first `.agents/context/design-system.md`. It documents two traps you will otherwise walk into. ## Scope `src/styles/tokens.css`, `src/styles/base.css`, `.agents/scripts/check-tokens.mjs`. You are the only writer of these. ## The two decisions to surface 1. **Three palettes → one.** `--ink` is `#172f42` / `#122534` / `#173044`; `--paper`, `--muted`, `--line`, `--gold` likewise. Most deltas are sub-perceptual — canonicalize. **`--blue` (`#527f9f` vs `#215675`) is visibly different**: screenshot both, get a human decision, record it here. 2. **The fonts have never rendered.** `styles.css:1` has a malformed `@font-face` whose `src:` points at a Google Fonts _stylesheet_. Manrope and DM Mono have always fallen back to Arial and generic monospace. Default: delete the dead rule, declare what actually renders. Self-hosting the real fonts is a **redesign** and needs sign-off. ## Steps 1. Run the extraction script in `.agents/skills/design-tokens/SKILL.md`. 2. Capture baseline screenshots: 10 routes × {560, 800, 1100, 1600} **plus the eight breakpoint widths you are removing** (520, 530, 600, 620, 720, 850, 880, 900). 3. Write `tokens.css`: one value per semantic name, `--step-*` type scale replacing the 14 ad-hoc `clamp()` triples, five `--bp-*` widths. 4. Re-capture. Compare. Explain every visible difference. ## Done when - [ ] Extraction prints exactly one value per token - [ ] `node .agents/scripts/check-tokens.mjs` passes on `src/` - [ ] Before/after screenshots attached at all twelve widths - [ ] The `--blue` decision and the font decision are written down here ## Do not - Do not add a webfont. **(Reversed 2026-09-05 — see Decisions.)** - Do not rename tokens to numeric scales (`--color-neutral-900`). - Do not convert the `gap:1px` over a coloured parent trick into `border` — it is deliberate house style and appears everywhere. ## Decisions - **Palette Consolidation:** The three drifted palettes were canonicalized into one. For `--blue`, `#527f9f` (from styles.css) was chosen over `#215675` (from chapters.css) to unify the look. - **Fonts (superseded 2026-09-05):** task 02 recorded "delete the dead rule, fall back to `Arial, sans-serif` / `ui-monospace, monospace`, zero visual change", and deferred even that deletion to "future component tasks", which never picked it up. The human has since chosen the opposite: Manrope and DM Mono are now self-hosted in `public/fonts/` and really render. The "Do not add a webfont" line above no longer applies.