Skip to content

Own the design system: CI, generated tokens, drop the llm stub - #7

Merged
brentrager merged 1 commit into
mainfrom
fix/parity
Aug 20, 2026
Merged

Own the design system: CI, generated tokens, drop the llm stub#7
brentrager merged 1 commit into
mainfrom
fix/parity

Conversation

@brentrager

Copy link
Copy Markdown
Contributor

The finding that changed my plan

The review recorded shared/styles.css, monogram.svg and tokens.json as byte-identical across SmooAI/ui and SmooAI/client-shared. On origin/main today, only tokens.json still is:

shared/styles.css     ui=26ee714d…  client-shared=c23abd72…  DIFFER
shared/monogram.svg   ui=a2db97f8…  client-shared=565d6108…  DIFFER
shared/tokens.json    ui=a06849b6…  client-shared=a06849b6…  IDENTICAL

The monogram this repo ships is broken. SmooAI/ui fixed it in f230808"restore the inner 'S' curve and the dot" — and the fix never crossed. client-shared carries the pre-fix path: an outer ring, no S, no dot. This is the repo the th CLI consumes in production. styles.css had separately fallen ~60 lines behind (the entire .input / .input--lg / .input-error / .input-hint family), and the class-existence test drifted along with it, so nothing was red.

That is the duplication defect having already fired, undetected, in the direction that reaches users. It is why this PR makes one repo the source rather than tidying both.

What changed

One source of truth. This repo's shared/ is now authoritative and adopts ui's correct assets. SmooAI/ui keeps a copy and gets a one-directional CI gate (separate PR) that fails when it diverges from here. I chose the gate over a cross-repo cargo dependency deliberately — see Judgment calls.

shared/tokens.json is code input now, not documentation. It was read by no code in any language while the Rust constants hand-mirrored the same values. rust/build.rs runs shared/tokens_codegen.rs and generates the entire tokens module from it, so a token cannot exist in the design system and be missing from Rust — nobody types the constants at all. That immediately surfaced six tokens the CSS declared and Rust omitted (MUTED, MUTED_FOREGROUND, ACCENT, INPUT, RING, SIDEBAR), plus the radius / space / font scales. RADIUS_PX is kept as an alias of the generated RADIUS_MD_PX so pinned consumers keep compiling.

The drift test could not fail in the direction that mattered. tokens_match_css asserted each Rust constant appeared somewhere in the CSS as a substring — it passes with a constant bound to the wrong custom property, and it is structurally blind to a token the CSS has and Rust lacks, because nothing walked the CSS. shared/tokens_css_check.rs replaces it: parses :root, resolves var() to a fixed point, and asserts both directions.

The llm feature is gone. rust/src/llm/mod.rs was six lines of doc comment; --features llm compiled to zero usable surface while Cargo.toml, the feature table and the architecture diagram advertised it. A feature that compiles to nothing reads as shipped, which is worse than an honest gap. Pearl th-f7b20f still tracks the implementation and the flag returns with code behind it. No consumer is affected — th builds features = ["auth"].

CI exists. .github/workflows/rust.yml: cargo fmt --check, clippy --all-targets -D warnings, and the tests — each in both feature configurations. Running only one reports a green suite over half the crate: the ui tests are the only ones in the default build, and the auth tests exist only behind the feature.

Module-tree guard. scripts/check-module-tree.py fails if any .rs under rust/src/ is unreachable from a mod declaration. This repo shipped auth/refresh.rs — 174 lines — that auth/mod.rs never declared, so it never compiled and build / clippy / test / coverage were all blind to it (fixed upstream in a21c06b). Textual on purpose: a mod behind a #[cfg] counts as declared, since the question is whether the file is wired in at all.

Verification — every new check confirmed red before green

Check Broken how Result
tokens_match_css drifted color.brand.orange in tokens.json FAILED
css_colors_are_all_tokens added --surprise: oklch(…) to styles.css FAILED
check-module-tree.py planted rust/src/auth/orphan.rs exit 1, named the file

Green state: 34 tests with --all-features, 6 on default features, fmt and clippy --all-targets -D warnings clean in both configurations.

Judgment calls

  • Gate, not cross-repo dependency. ui could have become a thin re-export of this crate, deleting its shared/ outright. Both crates are git dependencies rather than crates.io publishes, so it is technically possible — but it would put two independently rev-pinned git deps in one graph for any consumer that ever wants both, and ui's live consumer (observability-studio) is pinned at tag = v0.1.0. The gate closes the silent-divergence defect without the coupling.
  • The gate is one-directional. A bidirectional gate deadlocks: neither repo's PR can go green until the other merges. This repo is the source and is ungated; ui must match it.
  • space / font are generated too. They were the same inert data as the colours; generating them costs nothing and leaves no unbacked claim in tokens.json.
  • Completeness is scoped to colour-valued properties. --rail-width / --status-bar-height are geometry tokens.json does not claim to cover; the check says so where it is enforced.

Pearls: th-42c460, th-ea969b

🤖 Generated with Claude Code

https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC

…m stub

This repo had NO CI — `.github/` held only banner images — and it showed.

**The monogram in production was broken.** SmooAI/ui fixed the smoo monogram
in f230808 ("restore the inner 'S' curve and the dot"). client-shared, which
declares itself ui's successor and is what the `th` CLI actually ships, still
carried the pre-fix path: an outer ring with no S and no dot. `shared/styles.css`
had likewise fallen ~60 lines behind (the whole `.input` family). The review
that prompted this work recorded the two repos' `shared/` as byte-identical;
they are not, and nothing would ever have said so.

- Adopt SmooAI/ui's `shared/styles.css` + `monogram.svg`. This repo's `shared/`
  is now the declared source; SmooAI/ui gets a CI gate that fails if its copy
  diverges (separate PR there).

- **`shared/tokens.json` was read by no code in any language** while the Rust
  constants hand-mirrored the same values — a "language-agnostic source of
  truth" that was inert. It is now the build input: `rust/build.rs` runs
  `shared/tokens_codegen.rs` to generate the whole `tokens` module, so a token
  cannot exist in the design system and be missing from Rust — nobody types
  the constants. Generation also surfaced six tokens the CSS had and Rust
  omitted (MUTED, MUTED_FOREGROUND, ACCENT, INPUT, RING, SIDEBAR), plus the
  radius/space/font scales.

- **`tokens_match_css` could not fail in the direction that mattered.** It
  asserted each Rust constant appeared *somewhere* in the CSS as a substring:
  blind to a constant attached to the wrong property, and structurally
  incapable of noticing a token the CSS has and Rust lacks. Replaced by
  `shared/tokens_css_check.rs`, which parses `:root`, resolves `var()`, and
  checks both directions. Verified red by hand-drifting a token value and by
  adding an untracked `--surprise` colour to the CSS.

- **Drop the `llm` feature.** `rust/src/llm/mod.rs` was six lines of doc
  comment; `--features llm` compiled to zero usable surface while Cargo.toml
  and the README advertised it. A feature that compiles to nothing is worse
  than an absent one — it reads as shipped. Pearl th-f7b20f still tracks the
  real implementation; the flag comes back with code behind it. No consumer
  used it (`th` builds `features = ["auth"]`).

- **CI** (`.github/workflows/rust.yml`): fmt, clippy `--all-targets -D warnings`
  and the test suite in BOTH feature configurations — the default `no_std` `ui`
  build and `--all-features`. Running one would report green over half the crate.

- **Module-tree guard** (`scripts/check-module-tree.py`): fails if any `.rs`
  file under `rust/src/` is unreachable from a `mod` declaration. This repo
  shipped `auth/refresh.rs` — 174 lines — that `mod.rs` never declared, so it
  never compiled and no other check could see it (fixed in a21c06b). Verified
  by planting an orphan in `rust/src/auth/`.

Tests: 34 with `--all-features`, 6 on default features; fmt + clippy clean in
both configurations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0152bbE1veqfG1SVJdyLCBxC
@changeset-bot

changeset-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: bbfef42

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@brentrager
brentrager merged commit 7c5b948 into main Aug 20, 2026
2 checks passed
@brentrager
brentrager deleted the fix/parity branch August 20, 2026 18:30
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