cmux NEXT: unread ring appears steady, stays until its pane is clicked, then blinks out (classic parity, GUI agents too)

Merged
AU
15d ago
+504-52

Summary

This makes cmux NEXT's blue unread pane ring behave the way Austin asked on 2026-10-20, matching cmux classic's ring.

  • Arrival: when an agent finishes, a steady blue ring appears. notifications.attention.style now defaults to steady; blink and pulse stay available.
  • Dismiss: the ring stays until you go into that pane, by clicking or typing in it or opening its notification. notifications.dismissal now defaults to click; focus stays a choice. Then the ring blinks blinkCount times and goes away, as classic's dismiss flash does. A ring cleared any other way (Mark Read, a timeout, a mute, Dismiss Highlight, another device) fades without the blink.
  • Clicks read only the clicked pane: a click reads the pane under the pointer, found with a layout hit test. A click on the sidebar, the titlebar or another pane no longer clears the focused pane's ring.
  • Finishes in a pane you can see: a turn or an OSC 7501 done that finishes in a visible pane keeps its ring under click. It posts no banner (cx-kxa2, cx-slk1h), the feed is told it didn't alert, and the timeout dismissal still gets its deadline.
  • GUI agent chats: these now ring when their turn ends. acpmux reads a turn that ends in a shown chat at once (cx-n8ou), so nothing marked the pane. AgentTurnStateStore.onTurnEnded feeds NotificationCenterService.agentFinished. Mark Workspace Read, Mark All Read and Clear All clear those rings too.

Takes back 78680d558526 (pushed directly on 2026-10-19, no PR), which set the focus dismissal default. Why: Austin dogfooded it and rings cleared before he clicked the pane. Lawrence's u2414 words were also "you click and it gets dismissed".

Changelog

  • Changed: In cmux NEXT, a pane's blue unread ring appears steady when an agent finishes, including agent chats, and stays until you click or type in that pane; it then blinks out.

Testing

Command: cmux-ci run --class light --script scripts/ci/package-test-lane.sh --arg=suite --arg=Packages/macOS/CmuxNext --arg=<suites>

  • Red 22646d37 (step 7ae3e9d2): UnreadRingClickReadTests fails. A click in the other pane read the focused pane (ack surface:1), and a click outside the panes read one too. The default tests fail on focus.
  • Red fa5f7fdc (step f7e502f3): no dismiss flash, and the style default was still blink.
  • Head 65aae85650e279ee2af1d3b6d734a59a6ce5f49a (step 454e5af5): 12 suites pass: AgentTurnRingTests, AttentionDismissFlashTests, AttentionDefaultTests, PaneAttentionDismissFlashTests, AttentionSteadyTests, StaticStatusIndicatorTests, BlinkRateCapTests, UnreadRingClickReadTests, UnreadDismissDefaultsTests, UnreadRingDismissTests, WatchedDoneReadTests and AgentChatDoneDotTests.
  • scripts/cmux-next/prepush-gate.py: no new violations.

Observed / Not run

  • Observed: Austin dogfooded tags 22678-unread-ring-click-only and 22678-unread-ring-steady-flash, which led to these changes. Tag 22678-unread-ring-gui-agents (1549a2ad) is with him now.
  • Not run: the generated docs/mdm/* still list the old defaults until the autofix regenerates them. The agentTurnEnded tab lookup and the observeAttention entry-read collection have no direct test. Nothing was run on the full CmuxNext suite.

🤖 Generated with Claude Code