cmux-next: Dots and Pictograms status glyph sets behind a debug switch (hq#1957)

Merged
TE
16d ago
+1117-23

Adds two alternative static status glyph sets to compete with #20410's set, which stays the default: Dots and Pictograms. You can switch between them in Debug Settings → Status icons, or with <StatusGlyph set=…> on the web. Stacked on #20410 (hq#1957 glyph thunderdome).

  • schemas/status-glyphs/static-status.json now lists sets. Every set uses the same six states in the same order with the same tints, and the generator enforces this.
  • Swift StaticStatusGlyph(state)?.plan(style:) and the web StatusGlyph render any set.
  • Recommendation: Pictograms. Each state has its own outline (moon, hourglass, chat dots, padlock, check, warning triangle), so states read apart without color at 1x. Dots is the quietest set but the hardest to tell apart.

Contact sheet: all three sets × 6 states, light and dark, 1x and 2x, with sidebar rows.

In context

A tagged cmux NEXT dev build of this branch (3afe69cbf68), with a sidebar and a tab strip that show six states. Each terminal tab reports its state over OSC 7501: working, blocked with kind question (waiting), blocked with kind permission, done, and error. The idle tab sends no report. Idle draws no mark in any set, by design (StatusIconSet.plan). The sidebar has one workspace per state plus glyphs, which holds the six tabs, so every state shows on a row. Sets were switched with the status.iconSet tunable, the same switch as Debug Settings → Status icons. The theme was set in the app's own config (GitHub Light Default and GitHub Dark Default). The captures are 2x window snapshots (debug.window_snapshot), and the lower part of each set's image zooms them a further 2x. No 1x display was available.

glyphs compare

Each set, light and dark, with zoomed detail

Static light
Static dark
Dots light
Dots dark
Pictograms light
Pictograms dark

Recording

Tagged cmux NEXT dev builds, recorded with debug.window_record at real speed. In each clip the live sidebar row and the live tab cycle working → waiting → permission → done → error over OSC 7501, about 1.4 s apart. The other rows and tabs hold one state each. The set was switched with the status.iconSet tunable, the same switch as Debug Settings → Status icons.

Before: Static on the base, 2035f37a936.

before: Static on the base

After: Static on this PR's head, 3afe69cbf68. The glyphs match the base. With no tunable set, both builds show the same default (Symbols) marks, so the PR changes nothing by default. The sidebar order and one row's subtitle differ between the two clips; that comes from staging, not this PR, which doesn't touch the sidebar rows.

after: Static on the head

Static Pictograms:

Static Pictograms

Static Dots:

Static Dots

Full-quality mp4s: , , , .

Verification

  • Swift StaticStatusGlyphStyleTests: 4 tests pass.
  • Web status-glyphs.test.ts (Chromium): 6 tests pass.
  • Typecheck, lint, format, the namespace lint, and the check:status-glyphs, type-scale, system-blue and layers checks are clean.
  • Seen in a tagged cmux NEXT dev build (Retina captures above; tab states driven over OSC 7501, idle draws no mark by design).

Changelog

none (DEV/NIGHTLY debug switch; default unchanged)

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Adds two alternative static status glyph sets—Dots and Pictograms—next to the existing Static set, switchable via Debug Settings → Status icons or <StatusGlyph set=…> on the web. The default status icon set stays Codex.

  • schemas/status-glyphs/static-status.json defines all three sets; the generator enforces their shared states, order, and tints.
  • Swift StaticStatusGlyph and web StatusGlyph render any set; CoreGraphics and browser tests hold each set to the same rules (six states apart by shape, crisp at 1x and 2x, never animated, theme-tinted).
  • Recommendation: Pictograms—each state has its own outline (moon, hourglass, chat dots, padlock, check, warning triangle) that reads without color; Dots is the quietest but the hardest to tell apart.

Agent session: cosmic-gray