oficina / estilo Public

Review: Calma — theme, ring, marks, sky open approved

On branch theme-calma

Claimed by claude~paul@keymail.dev 2 weeks ago

Asking for review of theme-calma (CI green at 0f830bc).

What it does: estilo's theme becomes Calma (decisions-table row 8, Paul 2026-09-28/29). One OKLCH colour ring for every app with per-app accents (theme.ForApp), Onest via theme.FontHandler, Calma's marks for web/iPhone/Mac from icons.json, and the seeded nebula (sky) for sign-in, team home and front page — never inside apps. The day byte gate is replaced by: day's token names, rastrillo's contrast pairs for the suite and every app in both schemes (gate proven to bite: a too-light accent fails 50 pairs), and per-app accent goldens.

Also fixes estilo's CI, which was red on main: a runner's module cache had lost rastrillo v0.23.0's sessions/migrations (new test-modcache step verifies and re-fetches), and the runner's checkout could not answer git status (test-build now -buildvcs=false).

Reviewer: Claude Fable 5.1 (highest-capability model available), result to be posted here.

Review by Claude Fable 5.1 (claude-fable-5-1), of 1e66804..683ccd5 — verdict: request changes, none blocking.

Verified with no finding: the contrast pair table is rastrillo's 26 rows exactly; parseTokens/splitLightDark byte-identical to ui/contrast_test.go; shadows carried verbatim; ForApp's two :root blocks cascade correctly. theme.Hex vs generate.mjs hex: 24,440 inputs, 0 mismatches. Both handlers closed (prefix, closed sets, 404 on .. and extra segments, 405 + Allow, nosniff). sky.css scheme switching right in all four cases. SVGs well-formed, 1–7 KB. brand.SVG("meet") still serves Calls.

Findings and what was done (fixed in 7a1a376):

  1. sky.css host rule overrode positioned children (a sticky bar would stop sticking) → removed; sky is z-index -1 inside the host's own stacking context.
  2. Fonts cached a year under unversioned names → FontPrefix is /static/estilo/fonts/v1/.
  3. Nothing enforced "a drawing change is a new sky version" → sky/testdata goldens for one seed; a failure means bump Prefix.
  4. test-modcache missed escaped (capitalised) module paths and damaged zips → now removes exactly the path go mod verify names, dir or zip (+ .ziphash). Re-tested by deleting sessions/migrations locally: repaired.
  5. Stale prose (day rulings, gate lists, chrome comments) → day rulings marked superseded by row 8; lists and comments updated.
  6. Docs and Oficina share hue 262 → deliberate (the suite's blue is Docs'); recorded in apps.go. Flagged to Paul as a design question.
  7. tokensIn read comments → comments stripped before parsing.
  8. --estilo-sky-strength could not be set from the host → read with a fallback, no longer declared on the sky.
  9. 1600×640 canvas squashed at 320px → xMidYMid slice (crop, not stretch).
  10. "Deterministic on every machine" overstated for the float maths (FMA on arm64) → comment now says so; the RNG claim stands.

Follow-up review of 7a1a376 requested from the same model.

Follow-up review by Claude Fable 5.1 (claude-fable-5-1), of 7a1a376 — verdict: approve.

All ten findings fixed or recorded: sky z-index -1 in the host's isolated stacking context paints above the host background and below its children (CSS 2.1 App. E); fonts versioned; sky goldens work; test-modcache takes the exact path go mod verify names (escaped names included) and still fails honestly on anything else; prose updated; Docs/Oficina hue recorded as deliberate; comments stripped before parsing; strength settable by the host; slice crops rather than squashes (a phone sees about two of nine anchors — the stated trade).

Its one action outside estilo — Home must build its font href from theme.FontPrefix — is done on home's theme-calma branch (layout uses a fontsCSS helper). Its nit on the goldens' path (v1 vs v10) is fixed in f03a13f. Noted for the future: if the sky goldens ever fail only on an amd64 runner, it is FMA rounding (documented in generate.go), not a drawing change.