cmux NEXT: Chief Settings as grouped glass cards, names not ids, a styled last turn

Draft
TE
7d ago
+2772-132

What

The Chief Settings popover (the header's name pill) was cramped pickers, raw ids (claude-sr2-pipe, claude-opus-5-5) and a Diagnostics text dump (#89 item 2). It is now a settings page of grouped glass cards, wider (380 pt), each card only where it has something real:

  • Identity: avatar (menu to change it), name, where the Chief runs (display only), and the pet rows (Show Chief Pet, its character) that used to sit in a separate Appearance section.
  • Brain: Backend, Model, Effort and Speed, each with a one-line "what this means" under it. Every value reads by a name: official engines keep their titles, models their catalog names, and any other id is made readable by the new ChiefNames (claude-sr2-pipe โ†’ "Claude (SR2 Pipe)", claude-cr โ†’ "Claude (CodeRouter)", claude-opus-5-5 โ†’ "Claude Opus 5.5"). The raw id stays only in the popup item's tooltip.
  • Memory (this Mac's brain): what the Chief remembers, and Show Memory.
  • Diagnostics: a styled last turn: the engine by name, when it ended, then four measures (time, cost or tokens when the harness gives no price, cache %, tool calls with failures), the turn's error if it failed, Show Traces, and the recent replies behind the closed disclosure.

Behavior, Permissions and Notifications have no per-Chief setting on base, so they get no card (follow-up list below). The cards use the sidebar cards' glass (CardSurfaceView: a veil with the top-lit rim, opaque under Reduce Transparency) over the popover's overlay glass, and the shared Metrics and Typography tokens.

Data: chief.engine.get's recent already sends ts, effort, error and usage output (engine_control.rs turn_summary); ChiefEngineReport.Turn now decodes them when present, so an older brain still decodes. This Mac's trace lines give the same fields.

debug.chief_settings (DEBUG builds) shows a fixed brain answer in the open popover, since capture minis run no Chief brain; the chief-settings tour uses it.

No settings wire op here (#22639 has one). "Where it runs" stays display only.

Tests

Red, then green:

  • Red: fleet step c4f2516bf58298d895742b32 (chief-settings-cards-red-fdc6b7f0, the new tests on the old code): 3 of 3 suites failed. ChiefBackend.title(for: "claude-cr") gave claude-cr (want "Claude (CodeRouter)"), the Backend popup listed claude-sr2-pipe with no tooltip, and the last turn read claude-sr2-pipe ยท claude-opus-5-5 with no "Opus 5.5".
  • Green: fleet step 86e1ddd615a2e8be294c4763 (chief-settings-cards-green-5de20346 at 5de2034631): all 4 suites passed (ChiefNamesTests, HomeChiefTurnSummaryTests, HomeChiefSettingsViewTests, ChiefBackendTests; 6, 7, 9 and 9 tests). After it: e699b348 renames ChiefNames to String.chiefHarnessName / String.chiefModelName (same assertions, for the iOS package conventions gate), and a20bcef5 / 8a621b49 add acpmux's harness names and drop dashed snapshot dates, with their tests.

New: ChiefNamesTests (harness and model names, catalog name first, the Backend popup's tooltip), HomeChiefTurnSummaryTests (newer and older Turn decoding, cache %, cost, tokens, seconds, the card's last turn). Updated: ChiefBackendTests, HomeChiefSettingsViewTests (names instead of ids, the name field's edge inside the Identity card).

Capture

No capture: the media-tour run (cmux-next media, run 39706513337) is still queued and has posted no stills, and a capture from cmux16 could not lease capture-host. cmux-ci capture stops with "needs a manaflow-ai/cmuxterm-hq checkout (build-fleet/pr-capture and capture-host)". The chief-settings tour (scripts/cmux-next/media/tours/chief-settings.json, using debug.chief_settings) will post the stills when the media run gets a host.

Follow-up: settings the backend still lacks

  • Behavior, Permissions, Notifications: no per-Chief setting exists on base, so they get no card until the brain has one.
  • Where it runs: display only. Changing it needs a settings wire op (#22639 has one).

Changelog

  • Chief Settings is now a page of grouped cards with readable model and backend names and a last-turn summary (time, cost, cache, tools).

๐Ÿค– Generated with Claude Code

Agent session: cosmic-gray


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


Summary by cubic

Rewrites the Chief Settings popover from cramped pickers showing raw ids and a Diagnostics text dump into a settings page of grouped glass cards โ€” Identity, Brain, Reactions, Memory, Diagnostics โ€” each shown only where it has a per-Chief setting to offer. Every engine and model now displays a readable name (String.chiefHarnessName/chiefModelName): official engines keep their titles, acpmux's built-in harnesses read as acpmux names them (Pi, OpenCode, Gemini CLI, Aider, Muse Code), a known model keeps its catalog name, and a model id drops a trailing snapshot date (only a real date). The raw id stays only in tooltips, and Diagnostics shows a styled last turn: engine by name, when it ended, time, cost (or tokens when the harness gives no price), cache %, and tool calls, plus the error when a turn failed and the recent replies behind a disclosure.

Compatibility and testing

  • ChiefEngineReport.Turn decodes the newer ts, effort, error, and usage output fields only when present, so an older brain's summary still decodes.
  • The popover scrolls when the cards exceed the room on screen, so tall content like the pet rows and an open Diagnostics stays reachable.
  • New debug.chief_settings (DEBUG builds) shows a fixed brain answer in the open popover, since capture minis run no Chief brain; the body lives in HomeChiefSettingsView.handleCaptureControl in CmuxNextHomeEngine.
  • New tests cover naming (including acpmux's harness names and dashed snapshot dates), turn decoding from older and newer brains, and updated existing tests for the named values and scrolling.