feat(desktop): state on the glyph, not in dots: harness marks with a working ring, an alert on failure, semibold for unread
Dean: "I don't like indicator dots in general. Especially in the tab for a coding agent." This replaces every status dot in the window with state drawn on the glyph itself, or with words.
Coding agent tabs
One shared component, renderer/state-glyph.tsx (StateGlyph, GLYPH_STATE), used by the agent tab (AgentGlyph) and the subagent tab:
| State | Before | Now |
|---|---|---|
| starting / running | blue pulsing dot | the harness mark (Claude Code's Clawd / Codex's cloud, #2012's assets) shrunk inside a turning ring. Under reduced motion or a capture run the ring holds still (--loop-motion), which still reads as working. role="img", aria-label="Working"; hint "Opus 5.5 · Working" |
| failed | red dot | the mark is replaced by CircleAlertIcon in --danger. aria-label="Failed"; hint "… · Failed" |
| completed | green dot | the mark alone |
| cancelled (stopped by hand) | orange dot | the mark alone; hint "… · Stopped" |
| unread (an arrival, or an agent that ended unseen) | corner dot (.tab-note) | the label in semibold, in the primary colour (#2055's convention for plan rows); aria-description="New result" and "New result" in the hint |
- The harness comes from the catalog id's provider prefix (
providerOf), so the mark shows before the model catalog has been read. A provider Luke has no harness for falls back to the Coding agents glyph. - Subagent tabs: the robot (it was lit while running, #2036 (a)) now gets the same ring while running. A delegated worker that failed gets the alert. A planning worker whose call ended under it is shown at rest with "Stopped" in the hint, because its own transcript says "Stopped" there (Devin's review). The strip doesn't know a subagent's model, so it stays the robot rather than a harness mark.
- The "Failed" hint has no reason.
CodingAgentSummarycarries no failure reason; only the transcript read does. The reason stays on the transcript's end line ("Failed: …"), and the tab says "Failed".
Every other dot
- Side panel tabs' unread dot (#1851): now the semibold label described above, for every tab (Board, Code, Transcript, Work, agents).
- The Settings gear's update dot (#1826): dropped. #1980's sidebar row already covered downloading and ready-to-restart. The one case it didn't cover was an install that failed while a newer version was known. That case now gets its own row in the sidebar: "Download update", which opens the releases page (the same act as Settings' Download), with a hint saying what went wrong.
updateInSidebaris now "a newer release is known to a build that installs in place". - Settings "changed from default" dot: now the word "Modified" in small tertiary type, VS Code's word.
- "Live" dot on the Code and Transcript tabs' call dividers: now a voice glyph (
AudioLinesIcon) beside the word. - The pulsing accent dot after the heading Luke is writing in the plan: now a small accent spinner ring, the same spinner
StateGlyphuses. - The sidebar plan card's agent lines (#2068, which landed before this): each line now leads with
AgentGlyph, the same harness mark with ring or alert that the agent's tab wears, in place of the card's own spinner and alert. Finished agents now show their mark too. The row's single status mark keeps #2068's plain spinner or pull-request glyph, since a row has no harness to wrap. - Kept on purpose: the three "thinking" dots (a typing indicator, not a status dot) and the "+" menu's agent rows, which already show no status.
I checked the hover card (#2049) and plan row (#2068) workspaces: neither adds a dot. #2068's alert now uses --danger like this one.
Screenshots
The real TabStrip/Tab/StateGlyph/HarnessMark components, rendered to static markup over the built styles.css in headless Chrome (Linux fonts, so not pixel-identical to macOS). Left to right: Board (unread), Transcript, Claude agent working (chosen), Codex agent working, Claude agent finished + unread, Codex agent failed + unread, Codex agent finished, subagent working.
Light

Dark

Tests
desktop-plans.test.ts: an agent tab shows its harness mark (Clawd svg / Codex img), the ring and "Working" while running, semibold + "New result" when unseen, the hint with model and state, and no.agent-status-dot/.tab-note. A new test covers failed (alert in the mark's place, "Failed" hint) and stopped ("Stopped", mark alone). Subagent tabs: the ring while running. Fixed tabs: unread is semibold with no dot.desktop-sidebar.test.ts: a failed install shows Download update, with the reason in its hint and opening the releases page; the gear has no dot in any state.plan-card.test.ts: a card's agent lines show the harness mark with the ring while working, the mark alone once done, and the alert in its place when failed.select-row.test.ts: a changed value says "Modified" in words.plan-transcript.test.ts: the live divider shows the voice glyph, not a dot.
./scripts/check.sh exits 0.
CI could not verify the Mac UI, and ./scripts/verify.sh was not run (this is a Linux cloud VM). LUKE-159 is the manual Mac pass.
🤖 Generated with Claude Code