Skip to content

Operational Restraint: docs site theme + M64 changelog#43

Merged
indykish merged 6 commits into
mainfrom
chore/m64-007-design-w4
May 9, 2026
Merged

Operational Restraint: docs site theme + M64 changelog#43
indykish merged 6 commits into
mainfrom
chore/m64-007-design-w4

Conversation

@indykish
Copy link
Copy Markdown
Contributor

@indykish indykish commented May 8, 2026

Summary

Two commits, both on this branch per direction:

  1. chore(design) — apply Operational Restraint to docs.usezombie.com (M64_007 / W4 of the design-system rollout). Heritage orange chrome → cyan-mint pulse, self-hosted Commit Mono + Instrument Sans (Latin subset, all under 80KB), brand-mark wake-pulse animated inside the logo SVGs, calm Vesper-style code-block syntax, prefers-reduced-motion honoured.
  2. docs(changelog) — consolidated <Update> for the Operational Restraint rollout (M64_006). 298 words, voice-matched to recent entries, tags ["What's new", "UI"] (both pre-existing in changelog.mdx).

What changed

  • docs.jsoncolors.primary/light/dark now point at the design-system pulse tokens; fonts.heading = Commit Mono 500, fonts.body = Instrument Sans 400 (self-hosted woff2); styling.codeblocks: "dark".
  • fonts/{CommitMono,InstrumentSans}-{Regular,Medium}.woff2 — 4 self-hosted faces, sourced from @fontsource Latin subset, ≤80KB each.
  • tokens.css + custom.css (Mintlify auto-loads custom.css) — token transcription, font-faces, body/heading family overrides, ~68ch measure, calm Vesper-style code-block syntax theme, focus ring on --uz-pulse, reduced-motion guard.
  • logo/{dark,light}.svg — pulse disc animates 2.4s ease-in-out infinite via embedded <style>; reduced-motion fallback to a static halo. Survives Mintlify's logo render path without needing a custom React component.
  • changelog.mdx — new <Update> block at the top.

Verification

Local Mintlify CLI not installed; relying on the Mintlify deploy preview bot for build + render verification. Once the preview URL is live, manual checks:

  • Network tab: zero requests to fonts.googleapis.com / fonts.gstatic.com
  • Brand-mark pulse animates in dark + light mode
  • Reduced-motion DevTools toggle: pulse becomes static halo
  • Body renders in Instrument Sans, headings in Commit Mono
  • Code-block syntax: no purple keywords; numbers in evidence amber
  • Light mode WCAG AA on every top-level page (axe-core)
  • Lighthouse Performance ≥ 90, Accessibility ≥ 95 on the preview

Spec deviations (called out)

  • M64_006 spec named branch chore/m64-changelog; bundled onto this branch per direction.
  • Spec asked for tags ["What's new", "Design", "App", "Website", "Docs"], but the canonical release template only enumerates UI from that family and the existing changelog.mdx has never used the others. Used ["What's new", "UI"] to satisfy the spec's own "tag re-use" invariant.
  • images/changelog/m64-pulse-cap.png screenshot omitted — its capture depends on M64_005 (e2e harness with seeded 6-zombie fixture), which isn't done. Surfaced as a "What's next" pointer in the entry rather than fabricated.

Test plan

  • Mintlify deploy preview renders without markdown / build errors
  • Navigate every top-level guide + API reference page; visual sanity check on dark + light
  • Open the changelog page; new entry appears at top, tag chips render, image-less layout looks intentional
  • DevTools Network tab confirms no third-party font requests
  • DevTools prefers-reduced-motion: reduce simulation: brand-mark falls back to static halo

🤖 Generated with Claude Code

Greptile Summary

This PR applies the Operational Restraint design system to the docs site (M64_007) and adds the corresponding changelog entry (M64_006). It replaces the heritage orange --z-orange palette with the cyan-mint --uz-pulse token set, introduces self-hosted Commit Mono + Instrument Sans Variable fonts via custom.css, embeds a wake-pulse SVG animation in both logo variants, and updates AGENTS.md to reflect the new token namespace.

  • Token system (tokens.css + docs.json): Dark-first surfaces, borders, text, status, and radius tokens transcribed from the upstream design system; colors.primary/light/dark in docs.json now point at the pulse tokens; styling.codeblocks: \"dark\" selects Mintlify's built-in Shiki dark theme.
  • Typography (custom.css): Three self-hosted font files (CommitMono-Regular, CommitMono-Medium, InstrumentSans-Variable) declared via @font-face; headings land on Commit Mono, body on Instrument Sans Variable; Mintlify's fonts config is intentionally omitted to avoid double-fetching.
  • Logo animations (logo/dark.svg, logo/light.svg): Symmetrical pulse keyframes (0% and 100% share the same scale/opacity values for a seamless loop) with transform-origin: center; transform-box: fill-box; prefers-reduced-motion falls back to a static halo.

Confidence Score: 5/5

This is a docs-only visual redesign with no logic, API, or data changes — safe to merge.

The changes are scoped to CSS tokens, font files, SVG logos, Mintlify config, and a changelog entry. All issues from the previous review round are resolved. Remaining findings are comment-accuracy nits that do not affect rendered output or runtime behaviour.

No files require special attention — the two minor observations in tokens.css and custom.css are documentation/comment consistency issues that will not affect the deployed site.

Important Files Changed

Filename Overview
tokens.css New design-token file transcribing the upstream token set; complete for surfaces/borders/text/status/radii/type-scale. Missing --ff-mono/--ff-sans font-family tokens referenced in AGENTS.md.
custom.css New Mintlify override sheet; handles font-faces (variable Instrument Sans, two Commit Mono weights), typography, inline code, code-block chrome, focus ring, cover-grid, and reduced-motion. Header comment overstates the --uz-pulse constraint relative to AGENTS.md.
docs.json Color tokens updated from heritage orange to cyan-mint pulse; styling.codeblocks: "dark" added. No fonts key present — consistent with the custom.css comment that Mintlify's font injection is intentionally bypassed.
logo/dark.svg Pulse-ring circle added with transform-origin: center; transform-box: fill-box; keyframes are symmetrical (0% and 100% both at scale(1) opacity:0.55) so the loop is seamless; reduced-motion fallback to static halo is present.
logo/light.svg Identical animation approach to dark.svg with light-mode pulse colour (#14B8A6); all animation concerns from the previous review round appear resolved.
changelog.mdx New <Update> entry added at the top for the Operational Restraint design system rollout with tags ["What's new", "UI"].
AGENTS.md Design-system color and token guidance updated from heritage --z-orange palette to new --uz-pulse / --uz-bg / --uz-surface token family; grep command updated to match new token prefix.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[tokens.css] -->|"@import"| B[custom.css]
    A -->|pulse/bg/surface values| C[docs.json]
    B -->|font-family headings| D["CommitMono-Regular/Medium.woff2"]
    B -->|font-family body| E["InstrumentSans-Variable.woff2"]
    B -->|focus-visible outline| F["--uz-pulse / --uz-pulse-glow"]
    C -->|"codeblocks: dark"| G[Mintlify Shiki dark theme]
    H["logo/dark.svg"] -->|embedded style| I[uz-wake-pulse keyframes]
    J["logo/light.svg"] -->|embedded style| I
    I -->|"prefers-reduced-motion"| K[static halo fallback]
    B -->|global reduced-motion| L["animation-duration: 0.01ms !important"]
Loading

Comments Outside Diff (1)

  1. fonts/InstrumentSans-Medium.woff2, line 1 (link)

    P1 Duplicate woff2 — Medium weight is identical to Regular

    InstrumentSans-Regular.woff2 and InstrumentSans-Medium.woff2 share the same git blob SHA (78557c7) and the same MD5 (d4be1b605ba7e3dbf6525cacf758be0d). Both @font-face declarations in custom.css (weight 400 and weight 500) will resolve to the same physical font, so nothing in the UI that requests font-weight: 500 will actually render heavier. The Medium woff2 needs to be replaced with the real Medium subset.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: fonts/InstrumentSans-Medium.woff2
    Line: 1
    
    Comment:
    **Duplicate woff2 — Medium weight is identical to Regular**
    
    `InstrumentSans-Regular.woff2` and `InstrumentSans-Medium.woff2` share the same git blob SHA (`78557c7`) and the same MD5 (`d4be1b605ba7e3dbf6525cacf758be0d`). Both `@font-face` declarations in `custom.css` (weight 400 and weight 500) will resolve to the same physical font, so nothing in the UI that requests `font-weight: 500` will actually render heavier. The Medium woff2 needs to be replaced with the real Medium subset.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
custom.css:14-15
**`--uz-pulse` used for the focus ring contradicts the file's own "exactly once" constraint**

The header comment asserts `--pulse` appears "EXACTLY ONCE on the docs site: the brand-mark logo in the top nav. Any other use is a violation." The `:focus-visible` rule on line 128 then uses `--uz-pulse` and `--uz-pulse-glow`, which violates the stated constraint. `AGENTS.md` is the authoritative source and explicitly permits focus rings, so the file-level comment is the stale artefact — but an auditor or future contributor reading the comment and then this file will see an apparent policy breach. Update the header comment to match `AGENTS.md`: the pulse appears on live signals, focus rings, and the brand-mark.

### Issue 2 of 2
tokens.css:52-60
**`--ff-mono` and `--ff-sans` font-family tokens missing from `tokens.css`**

`AGENTS.md` names `--ff-mono` (Commit Mono) and `--ff-sans` (Instrument Sans Variable) as canonical token identifiers for the typography system. Neither is defined in `tokens.css`; `custom.css` instead hardcodes the full font stacks inline. A future contributor following `AGENTS.md` will look for `--ff-mono` as a CSS custom property, not find it, and either duplicate the stack or break the token invariant. Adding the two properties to the type-scale block keeps the tokens file the single source of truth for all design values.

Reviews (3): Last reviewed commit: "fix(design): cover-grid dot pattern live..." | Re-trigger Greptile

Context used:

  • Context used - AGENTS.md (source)

indykish and others added 2 commits May 9, 2026 01:15
Maps every Mintlify theme variable to design-system tokens, swaps
the heritage orange chrome for cyan-mint pulse, self-hosts Commit
Mono + Instrument Sans (Latin subset, ≤80KB each), and animates the
brand-mark wake-pulse inside the logo SVGs so it survives Mintlify's
render path without a custom React component.

- docs.json: colors → pulse tokens, fonts.heading/body → self-hosted
  woff2, styling.codeblocks → dark
- fonts/{CommitMono,InstrumentSans}-{Regular,Medium}.woff2: new
  self-hosted faces, sourced from @fontsource Latin subset, all
  under the 80KB perf cap
- tokens.css + custom.css: design-system token transcription, font
  faces, headings/body type, calm Vesper-style code-block syntax
  theme, focus ring, prefers-reduced-motion guard
- logo/{dark,light}.svg: pulse disc animates 2.4s ease-in-out
  infinite via embedded SVG <style>; reduced-motion fallback to a
  static halo

Markdown content untouched. Spec: M64_007 (W4 — docs apply).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Consolidates the M64 design-system rollout into a single user-facing
<Update>: one token system end to end, the wake-pulse as currency,
light mode at WCAG AA, prefers-reduced-motion honoured, and the docs
site finally reading in the same voice.

Followed the canonical release template (~/Projects/dotfiles/skills/
release-template.md): MMM DD, YYYY label, "What's new" + "UI" tags
(both already present in changelog.mdx), user-facing voice, no
milestone IDs or workstream numbers, 298 words (≤400 cap).

Dashboard pulse-cap screenshot deferred — requires the e2e harness
(separate spec) to seed a fixture user with 6 active zombies.
Captured as a What's next pointer instead of fabricated evidence.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
indykish added a commit to usezombie/usezombie that referenced this pull request May 8, 2026
…006/007 specs

QA was failing on three real regressions from prior commits in this PR:

1. `tests/e2e/design-system-smoke.spec.ts:141` — "terminal has
   surface-terminal background" queried `<pre>` for background-color,
   but the Terminal rebuild moved bg + border to the outer wrapper
   (window-chrome strip lives there now). Added a
   `terminalWrapperStyle` helper alongside the existing
   `terminalPreStyle` so colour-vs-structure queries land on the
   right element.
2. `tests/e2e/home.spec.ts:11` — expected "The daemon already knows
   why." but Hero copy was renamed to "The agent already knows why."
   in 3001ad6. Unit tests were updated; this e2e was missed.
3. `tests/e2e/humans-agents-links.spec.ts:33` — same string.

100/100 Playwright tests now pass (was 97 + 3 fail).

Specs M64_006 (docs-repo changelog `<Update>`) and M64_007 (W4 docs
site design apply) shipped via `usezombie/docs#43`. Moving both
from `docs/v2/pending/` to `docs/v2/done/` and flipping
`Status: PENDING` → `Status: DONE` to match the shipped reality.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread logo/dark.svg
Comment thread logo/light.svg
Comment thread logo/dark.svg
Comment thread logo/light.svg
Comment thread custom.css
Comment thread docs.json
Comment thread docs.json Outdated
Comment thread changelog.mdx
8 of 9 issues fixed; 1 confirmed intentional.

P1:
- logo/{dark,light}.svg: transform-origin: center (was 10px 16px which,
  combined with transform-box: fill-box, anchored the scale outside the
  circle's centre).
- logo/{dark,light}.svg: keyframe 100% now matches 0% (opacity: 0.55,
  scale(1)) so the loop is seamless — previously snapped from 0 → 0.55
  every 2.4s.
- custom.css: .cover-grid now position: relative so .cover-grid::before's
  absolute positioning anchors to it instead of escaping to the page root.
- fonts/InstrumentSans-{Regular,Medium}.woff2 → InstrumentSans-Variable.woff2:
  the two static files had identical SHAs (the Medium file was a copy of
  Regular, no actual heavier weight). Replaced with the wght-axis variable
  file from @fontsource — 30KB single download serves every weight 400-700.

P2:
- docs.json: dropped the `fonts` block; @font-face in custom.css is now the
  single source of truth (Mintlify's build-time injection was duplicating
  the registration and risking double-fetch).
- AGENTS.md "Design system colors" updated from heritage --z-orange (#d96b2b)
  to the M64 Operational Restraint tokens — pulse cyan + pulse glow + the
  semantic info/warn/error/evidence set, with Instrument Sans + Commit Mono
  named as the typeface pair.

Confirmed intentional (not changed):
- changelog.mdx label "May 9, 2026" — today's date in IST per the
  authoring environment, aligned to deploy day.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@indykish
Copy link
Copy Markdown
Contributor Author

indykish commented May 8, 2026

Addressed in 8516736.

P1 (all fixed):

P2 (fixed):

  • docs: changelog + M27 scoring & replay updates #5 (Issue 7) stale AGENTS.md color guidance — rewrote the "Design system colors" section. Heritage --z-orange palette is gone; section now documents --pulse / --bg / --surface-1 / semantic status tokens and names Commit Mono + Instrument Sans Variable. The sync-source comment now greps for the new token names.
  • docs(index): pivot statement and April 11 pre-release notice #6 (Issue 8) fonts double-registered — fair point. Dropped the fonts block from docs.json; custom.css's @font-face declarations are now the single source of truth. Eliminates the double-fetch risk and keeps the font story in one file.

P2 (intentional, not changed):

Thanks for the review — all eight code issues had real teeth, especially the duplicate-Medium-woff2 catch.

…STEM.md

Two audit findings against ~/Projects/usezombie/docs/DESIGN_SYSTEM.md:

- Focus ring outer shadow: 4px → 3px to match the spec's
  `box-shadow: 0 0 0 3px var(--pulse-glow)`.
- Reduced-motion pulse fallback: opacity 0.30/0.35 → 0.2 to match
  the spec's "static ring at 0.2 opacity".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread custom.css
indykish and others added 2 commits May 9, 2026 01:45
…per-level tracking

Three fixes from the self-review:

- custom.css: font-size moves from `:where(html, body)` to `:where(body)`.
  Setting font-size on html redefined the rem unit (16px → 15px), which
  silently rescaled every Mintlify rule expressed in rem (~6% smaller
  paddings/margins/gaps). Body-only keeps inheritance without compounding
  into the rem base.
- custom.css: deleted the `.token.*` Prism class overrides as dead CSS.
  Mintlify renders syntax via Shiki, which emits inline `style="--shiki-…"`
  attributes rather than Prism token classes — the override block was
  unenforced. The chrome around code blocks (font, surface, border, radius)
  remains; the syntax palette comes from `styling.codeblocks: "dark"` in
  docs.json (Mintlify's built-in dark theme).
- custom.css: heading letter-spacing now per-level per DESIGN_SYSTEM.md
  §Type scale — h1 -0.025em, h2 -0.02em, h3 -0.015em, h4-h6 flat.
  Previous flat -0.015em deviated from the spec's tightening curve.

Also trimmed the changelog "What's next" line — the previous wording
("end-to-end browser harness against api-dev is in progress") was an
aspirational claim about M64_005 work that hasn't started, violating
the "Changelog claim challenge" rule.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Greptile P1 catch on the prior commit. The pattern was on `.cover-grid`
at opacity: 1 (fully visible) and `::before` overlaid via `background:
inherit; opacity: 0.08` — adding a negligible second layer. The dots
were supposed to render at the 8% tint per DESIGN_SYSTEM.md "subtle
dot-grid background … 8% opacity".

Now: parent `.cover-grid` only provides the positioning context;
`::before` owns the radial-gradient at 0.08 opacity. Single layer,
correct subtlety.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@indykish
Copy link
Copy Markdown
Contributor Author

indykish commented May 8, 2026

Two follow-up pushes:

3acf05c — addresses the new P1 (custom.css:156 cover-grid dot opacity).

Good catch. The dot pattern was on .cover-grid at opacity: 1 and the ::before was overlaying via background: inherit; opacity: 0.08, which made the dots fully visible (the comment about an 8% tint was wrong because the parent rendered the same pattern at full opacity beneath it). Moved the radial-gradient exclusively to ::before so the dots render once at the intended 0.08 opacity. Parent only owns the positioning context now.

0e9a6aa — self-review pass (separate from the greptile thread).

Three issues I found while auditing the PR myself before requesting review:

  • html font-size override redefining the rem unit. :where(html, body) { font-size: 0.9375rem } made html's font-size 15px, which silently rescaled every Mintlify rule expressed in rem (~6% smaller). Moved the rule to :where(body) so inheritance still flows to children but the rem base stays at the browser default.
  • .token.* Prism overrides were dead CSS. Mintlify renders syntax via Shiki, which emits inline style="--shiki-…" attributes — Prism's .token.keyword class never appears in the output. Deleted the block. Code-block syntax now comes from Mintlify's built-in dark theme via styling.codeblocks: "dark" in docs.json; the chrome rules (font, surface, border, radius) remain.
  • Heading letter-spacing was flat across h1–h6. DESIGN_SYSTEM.md §Type scale specifies a tightening curve (display-xl -0.025em → heading flat). Split into per-level rules.

Also trimmed the changelog "What's next" line — the prior wording made an aspirational claim about M64_005 work that hasn't started, which violates the AGENTS.md "Changelog claim challenge" rule.

@indykish indykish merged commit d0fd511 into main May 9, 2026
4 checks passed
@indykish indykish deleted the chore/m64-007-design-w4 branch May 9, 2026 03:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant