Repository navigation
cmux NEXT Home: a Chief's avatar shows its state like the Codex pet, and never bounces - #33395
Conversation
…and never bounces Leo 2026-11-03: "don't bounce the circle. i mean like if you ask codex, ... their dot thing has a few different animations for different scenarios." #30534 read his first ask ("animated like how chatgpt animates their dots") as a bob of the whole avatar. Each state now has its own look on the avatar's place: idle glints now and then, working runs an arc round the edge, an unread reply draws a still accent ring, a failed send a still red ring; a turn ending pops 4% and a failure shakes a few degrees (240 ms cues). Ring is the default; Glow, Tilt and Still are the gallery's variants. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a1179b2311aff0f037aa
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Default changesThis pull request changes 2 defaults at
Signed off on this commit by Merge receipt: merged as Regenerate the snapshot with Shipped in:
|
…yer that drew it Fleet red at b2874ee: ChiefAvatarMotionTests.aStateChangePlaysOneShortCue (a changed row is drawn on another layer, which had no state before it). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a1179b2311aff0f037aa
…ns and pops drawn 3x Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a1179b2311aff0f037aa
|
Review (codex, router-review): SHIP at e6fd0c4 Reviewer: codex gpt-6.1-sol xhigh, fast tier. Follow-ups: 3. Each lands as an issue in this repo that links this receipt; the lane that opened the PR fixes it forward. SHIP at e6fd0c4
AppKit tests were unavailable on this Linux box without Swift. Follow-ups:
|
|
Fleet at e6fd0c4 (step d7ec8ee73e705a21ac145000): Red then green: at b2874ee, Compile check at e6fd0c4 (job 4398ca4252516670ba116cf2): one error, in |
…ic red since 25c69ee (#33986) * swift-logic-classes: classify the false counts of the tip's swift-logic red since 25c69ee The tip watcher's swift_logic_lines row has been red since 2026-11-02 05:38Z (last green 25c69ee: 415218). Part of the rise is not new Swift logic: declarations whose reviewed row did not follow a module move, and view, strings, tunables and debug code that the default rule counts in full because no row lists it. This commit corrects the table only (no code change). Each row carries its reason. - 24 rows follow their declaration's module move (class, shares and reason kept): DesktopNotifier and NotificationPermission* to CmuxNextNotifications (#32438), LinkHintController to CmuxNextBrowser (#32537), FirstFrameGate, LinkDragItem, LinkDropPlan, StaticURL, PageInstallCounter, AgentDialogLine, NewTabLayoutChoice, RunningPrograms, AgentChatMute, CloudAppOp*, PaneFullWidthTabs, PaneTabBarChoices, WindowRegistryStore. LOGIC rows stay LOGIC. - 3 stale rows follow a move that also changed the kind (enum to struct): WhatsNewTunables, NewTabTunables, NotificationPermissionStrings; the stale CloudMoveStrings enum row is replaced by its struct. - 48 new PLATFORM rows: the vertical tab list's AppKit drawing, pointer, accessibility and pane extensions (#32127; its row layout math, VerticalTabListLayout, stays counted), Core Animation avatar looks (#33395), view hosts (BrowserPageBars, TerminalStatusLabel, SidebarContainerView+PaneReach, AgentPaneView+MoveCover), the person click check of consent prompts, the glyph bitmap cache, the thin Swift side of the Rust Cloud start rules (CloudStartCore), the at-cap dialog spec, localized strings, Debug Settings tunables, and DEBUG, bench or DEV playground and fixture code. Not changed: every real rise stays counted (for example NativeDeviceEnrollment, NativeCloudLinkChild, GitHubConnections, VerticalTabListLayout, DisplayBackdropBinding, CreationInputBuffer); REWRITE R-SWIFT-MIRRORS names the wave that removes each. The green reference 415218 is not changed. swift_logic_lines at 2b3d7cd (python3 -I scripts/cmux-next/ swift-logic-lines.py --rev 2b3d7cd --json, then with --table of this commit): 431786 -> 427957 (-3829). mirror_lines 71688 unchanged. table_rows_missing 36 -> 8 (stale rows of deleted declarations); table_rows_invalid 0. scripts/cmux-next/tests/test_swift_logic_lines.py: 16 tests OK. * swift-logic-classes: the review's three rows count their rules; reasons say what the code is Review of #33986 (FIX at cb155fb, comment 6610083921): three rows put a rule under PLATFORM. Each now counts it: - RefusalStrings+Spaces: MIXED 0/46. Its spaceDelete (lines 14-19) is a Swift copy of the daemon's own rule (cmux-tui-core state/room_delete.rs:148 and personal_mutations.rs:241: the default room cannot be deleted), so its share is MIRROR and it counts in mirror_lines; the localized strings stay platform. - TerminalStatusLabel: MIXED 65/0. Lines 17-23, 46-47, 49-76 and 88-131 (81 of 125) are the reveal-wait state machine. - LinkHintController: MIXED 35/0. #32537 moved and rewrote it; who gets each key while the page answers (hold, release, replay marks, key kinds, the 500 ms answer bound, outcome handling: about 87 of 251 lines) is logic for REWRITE R-INPUT. Text: the reasons of the strings and tunables rows say what the code is and cite the table's own precedent rows, not a "table rule" no document has; the AgentPaneView #1 row of AgentPaneView+MoveCover describes the Chromium move it holds; LinkHintStrings moved to its own file, not to another module; CloudStartCore's reason names its one hand-copied fallback line. Three stale rows follow their moved code: PersonalGroupLifecycle (LOGIC, now a struct in CmuxNextAppCore), the NSResponder extension (PLATFORM, now in CmuxNextFocusUI), and DiffTabReuse (LOGIC, now enum DiffTabChange and an extension of DiffOpenSource in CmuxNextDiff; both rows LOGIC). swift_logic_lines at 2b3d7cd with this table: 428126 (base table 431786; the first version of this PR 427957); mirror_lines 71694. At feat f07e8d9: 433351 -> 429651. table_rows_missing 5, invalid 0; scripts/cmux-next/tests/test_swift_logic_lines.py: OK. * swift-logic-classes: LinkHintController counts the key routing its reason names; textInputHasKeyboard is listed Re-review of #33986 (FIX at 791c494, comment 6611048817): - LinkHintController: MIXED 35/0 -> 57/0. The reason already named hold, release, replay marks, key kinds, the answer bound and outcome handling as logic; those are lines 22-24, 28-31, 34-35, 45-46, 52-77, 79-85, 98-105, 107-130, 132-140, 142-149, 180-200, 202-210 and 217-237: 144 of 251 lines. The reason now lists them. - extension NSWindow in CmuxNextFocusUI/TypedTextInput.swift (#31865): new LOGIC row. textInputHasKeyboard is the rule which input has the person's keyboard; the view-shaped default (an NSWindow extension) counted its 13 lines as 0. - Reasons cite repository facts only (crates, files, PRs), not plan names outside the repository; the strings rows no longer quote a row count that changes. swift_logic_lines at 2b3d7cd with this table: 428194 (base table 431786). At feat f07e8d9: 429719. mirror_lines 71694 / 71698. table_rows_missing 5, invalid 0. scripts/cmux-next/tests/ test_swift_logic_lines.py: OK.
…lays once on a state change (#33534) * cmux NEXT Home: a Chief's avatar runs nothing at idle; Ring's glint plays once on a state change claude-sr2-coord (raised by fs-lane-2) on #33395: "The idle state's glint every 7 s is a loop running at idle. Check it against the 'no CPU/wakeups at idle' budget ... If it costs anything, run the glint only on hover or on a state change." Idle (Ring and Tilt) now adds no animation; only working loops. Ring glints once (240 ms) when the state changes out of working or into a new rest state. A cue still playing ends when motion stops (#33475, item 1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a1179b2311aff0f037aa * Home avatar looks test: the pinned tile restyles while working (idle runs nothing) Fleet red at ed861f1: aStyleChangeRestylesEveryAvatarAtOnce read the idle tile's loop, which this change removes on purpose. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-a1179b2311aff0f037aa --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
…g on you and done (#34416) * cmux NEXT Home: a Chief's avatar shows thinking, tool running, waiting on you and done Relayed by Chief (Leo, 2026-11-03): "Replace the Chief avatar's bounce with per-state animations like the Codex status dot: thinking, tool running, waiting on you, done." #30534 added the bounce; #33395 replaced it with Ring/Glow/Tilt looks for idle, working, waiting (unread) and failed. This splits working into thinking (the arc) and tool running (a slowly turning ring of dots, from the run's activity line), makes waiting mean an open question or approval (a still orange ring), and turns an unread reply into done (a green check badge on the lower trailing edge, the Chief card's done mark). Only a running turn loops; done and waiting are still. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7285061ffdc2a24af93a * Chief avatar tests: no try to the right of an operator Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-7285061ffdc2a24af93a --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: cmux-bot[bot] <348531757+cmux-bot[bot]@users.noreply.github.com>
Leo, 2026-11-03: "oh you guys completely misinterpreted the "animated" thing... don't bounce the circle. i mean like if you ask codex, codex (idk if you wanna ask sol 6.1 xhigh or astra high) their dot thing has a few different animations for different scenarios."
His first ask (2026-11-01: "i also want them animated like how chatgpt animates their dots") became #30534, which bobs the whole avatar up and down (Float, the default), faster while the Chief works. That is the bounce he turned down. The reference he points at is the Codex app's pet: one distinct animation per scenario, not one motion at two speeds.
What changes
A Chief's avatar in the Home list and pinned grid shows what its Chief is doing, one look per state. The avatar never leaves its place: no bob, bounce or slide. The only transforms are a small scale or turn about its centre.
InboxRow.isTyping)InboxRow.hasFailedSend)A state change plays one cue of at most 240 ms (
design/motion-and-polish.md). When a turn ends (working to idle or waiting), the avatar pops 4%. A failure gives it a quick shake of a few degrees. A reply that arrives with no turn seen fades its ring in. A reload of the same state replays nothing.Versions (gallery)
The list ships with four styles, and
ChiefAvatarMotionGalleryTestsdraws each one in every state plus the two cues, 8 frames each. It writes them toPackages/Shared/CmuxMessagesLab/.build/chief-avatar-motion-gallery.png:I picked Ring. Each state reads differently at row size, even at a glance and in a dense list. Working also matches the rest of the app's "running" language (an arc going round), so it reads as working without a second mark. Switch styles in Debug Settings > Home > Chief avatar motion (
home.avatarMotion). A saved Float, Breathe or Sway value no longer matches a choice and falls back to Ring.What it does not touch
Spinner(the thin 3/4 arc, One spinner: every working and loading mark draws the shared arc #32754) is unchanged. This is the Chief's avatar, not the agent working-state mark.ChiefPetSprite) are unchanged. A follow-up could also step the animated characters' state rows (Mochi, Captain, Sprout, Bolt) in the list.home.avatarMotionto Still so avatars stop bouncing. This PR removes the bounce itself and changes the same default line, so the two conflict on that line. A comment on fix(home): keep chief avatars still by default #32861 says so.Stop conditions and cleanup
Every loop and cue is removed by each of the following. The still waiting and failed rings stay, as static indicators:
ui.animationSpeedoff, and Home's motion switch, through the existingavatarLoopGateandreduceMotionDidChangepath. Working's arc stands still as a quarter ring, so the state still reads.setWindowActivetracking. No new observers.SidebarAvatarMotion.stopremoves everything, rings included.Performance
CAShapeLayerand a masked glint band), run by the render server. There is no timer or display link.Patches/is untouched.Tests
ChiefAvatarMotionTests(MessagesLab), rewritten for the states:Observed / Not run
python3 scripts/cmux-next/prepush-gate.py: no new violations. Fleet compile and the MessagesLab suites: results in a comment below.Spec:
design/motion-and-polish.md(240 ms cue cap, every loop stops). Prior art: #30534 (replaced here), #32861 (open, same default line).No capture: the looks are in the gallery sheet; Leo tries the build.
Changelog
Changed: A Chief's avatar in Home shows what the Chief is doing (a glint at rest, an arc while it works, a ring when a reply waits or a send failed) instead of bobbing.
Agent session: agent session
🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.Summary by cubic
Changes the Chief avatar in the Home list and pinned grid to show what its Chief is doing—one look per state, like the Codex pet—instead of bobbing. The avatar never leaves its place; the only transforms are a small scale or turn about its centre.
Written for commit fe426d3. Summary will update on new commits.