Repository navigation
cmux NEXT: status dots are still; a guard fails on any breathing or blinking dot in a web stylesheet - #24057
Conversation
… forever Reads every shipped webview stylesheet and lists each forever-repeating animation that fades (opacity), blinks (visibility) or pulses (scale). Each must be on an allowlist with the reason it is not a status dot. Red on base: the floating chat and Chief dock streaming dots, the Home ledger working marks and the Settings accounts busy dot still breathe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray
… ledger and Settings accounts dots no longer breathe The floating chat and Chief dock streaming status faded in and out (acpmux-floating-breathe), the Home ledger working and running marks pulsed (lg-pulse), and the Settings cmux account dot pulsed while a sign-in ran (accounts-busy). Each is now a still dot in its state colour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
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)
Gallery before/after for
States
Pick other states with a Unclear: CI failed on
Failures:
Matched log linesNot re-run automatically: Written by red: cmux-next checks (god files, concurrency, crash safety, l10n); no finished base run on 44fc3d3 to compare; do not merge until green; see lane-rules Tour of |
|
Found 19 test failures on Blacksmith runners: Failures
...and 9 more test failures. View all on Blacksmith: run 39821535911, run 39821536093, run 39821535815
|
|
Owned by land-stuck on cmux16 |
|
Bead |
…he dots guard catches -webkit-, any-case infinite and a repeat count set in another rule The running avatar carries its status dot, so its breathe was a breathing dot: removed, and its allowlist entry with it. The Apps skeleton entry is marked as going with #23870 (which renames it), so base + #23870 + this passes. Drops the dead Reduce Motion rule for the Chief dock status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16027-99fc-73f0-9482-5a4babfe1b0a&host=cosmic-gray
|
Review (codex gpt-6.1-sol): SHIP at 6cf03d2 No blocking findings. Non-blocking finding: Checked the exact merge-base diff and whole changed files, enumerated all shipped webview CSS from the fetched commit, exercised the guard’s synthetic cases and current allowlist, and did not build the macOS app or run native suites. |
|
Review (codex gpt-6.1-sol): SHIP at d9c3bf9 No blocking findings. Non-blocking findings: none. Checked the merge result against both parents, verified the delta since 6cf03d2 is only the clean base merge plus the intended four-file change, audited the status-dot CSS and stylesheet guard, and ran the focused no-breathing-dots Bun test from an archived PR tree. |
|
|
|
|
|
|
|
|
|
Shipped in:
|
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Leo: "let's get rid of the blinking dot asap", "we need to guarantee the breathing dot doesnt come back".
#23776 (merged) made the spinner the default working look again, and #23870 (open, owner alive) deletes the native and web breathing working look. Both leave alone the other web status dots that still breathe at default settings. #23870's body lists them as "a different feature". This PR makes those dots still and adds a guard over every shipped web stylesheet, so a breathing or blinking dot can't come back under any class name.
Still now (they breathed at default settings on base)
.acpmux-floating-status[data-status=streaming],acpmux-floating-breathe,webviews/src/agent-session/acpmux/styles.css:543). It is a still accent dot now..acpmux-chief-dock-status[data-status=streaming], same keyframes,styles.css:633). It is a still accent colour now..lg-state.working::before,.lg-state-mark.working), and a running run's mark (.lg-run-mark.running). These usedlg-pulseinwebviews/src/pages/home-channels/ledger.css:303-313, 1252-1256..accounts-status[data-busy] .accounts-dot,accounts-busy,webviews/src/pages/settings/styles.css:926-935). The status words beside it ("Signing in…") still say it is busy, andaria-busyis unchanged.The Static status indicators triangle for a floating chat that needs you is unchanged. The unused
acpmux-floating-breathekeyframes are deleted, along with the Static and Reduce Motion rules that only stopped them. That includes the Chief dock status's deadanimation:nonein its Reduce Motion block.The Inspector's running subagent avatars carry their status dot (
.cv-subagent-avatar__dot,subagents.css:87-98). They breathed on this PR's original base (acpmux-chat-inspector-breathe), and this PR's second commit deleted that. Since then, #23995 (merged) replaced it on base with RUNNING-WAVE (ui/wave.css,cmux-wave): one opacity shimmer that sweeps across the running avatars. Static, Reduce Motion and the motion gate stop it. That is a newer, deliberate decision by another lane, so the guard lists it explicitly rather than this PR undoing it.Guard
webviews/test/no-breathing-dots.test.tsis a static read, with no browser. It parses every stylesheet underwebviews/src, except the never-loadedprototypes/. It reads:@mediaand in CSS nesting;animationshorthand and theanimation-name/animation-iteration-countlonghands, with or without-webkit-, withinfinitein any case;infiniteshorthand) set in a different rule, which counts for every rule whose subject has the same class.It lists every animation that repeats forever and whose keyframes fade (
opacity), blink (visibility) or pulse (scale).Each loop it finds must be on an allowlist (file, keyframes, selector) that gives the reason it is not a status dot. Those reasons cover the mic's start wait, #23995's running wave, the Apps loading skeleton, the Cloud illustration, Home's "writing" word and the music level bars. Jump to latest's dots are listed under Left alone. The test also fails when an allowlist entry matches nothing, so the list can't quietly cover a new loop. Entries that another open PR removes or adds carry
goneWithand may match nothing.A synthetic stylesheet proves it catches a dot under any name, inside a media query, nested, with
-webkit-, writtenINFINITE, by longhands, and with its repeat count in another rule. It also proves the guard ignores a spinner's rotation and a one-shot fade.6feda44f5fc1d8da8ae5de2612519ac4cccd1900, before the fix): 3 pass, 1 fail.no stylesheet fades, blinks or pulses a dot foreverlists the 5 rules above.6cf03d272fac71bbe27010f5860f64edf223008d(feat-cmux-next brought in by a merge commit): 4 pass.990280666b+ this head, combined: 4 pass.static-status-loops.test.tspasses there too.webviews/):bun test test/no-breathing-dots.test.tsAlso green on head:
CMUX_BROWSER_TESTS=1 bun test test/static-status-loops.test.ts test/running-wave-loops.test.ts: 11 pass.bun test test/chat-inspector.test.tsx test/floating-chat.test.tsx src/pages/settings/accounts.test.tsx: 25 pass.cmux-ci compile-check --ref 6cf03d272fac71bbe27010f5860f64edf223008d --app: passed (job 39abaa6c7ff32ca85d29b332).Left alone (reported to the lane, not changed here)
.cv-spinner[data-working]withcmux-breathe): fix(agent status): keep spinner defaults and preserve dot options #23870 deletes it. The allowlist marks that entry and the Apps skeleton's currentcmux-breatheentry withgoneWith: #23870. It also lists ahead of time the Apps skeleton's new name from fix(agent status): keep spinner defaults and preserve dot options #23870 (cmux-skeleton-pulse). Either PR can land first.acpmux-jump-latest-dot, cmux NEXT: Jump to latest morphs into pulsing accent dots while the agent works #21800) still pulse while the agent works. Static and Reduce Motion stop them. Making them still at default is a product call for that surface's lane, so here they are an explicit allowlist entry.Observed / Not run
vp fmt/vp checkon the changed files.No capture: webview-only change; the visible difference is motion, which a still gallery frame can't show.
Changelog
Leo-ask: ask-27caf770fa
Leo-ask: ask-f5fd37435f
Agent session: cosmic-gray
🤖 Generated with Claude Code