cmux NEXT daemon update: an ssh machine's tooltip shows its update

Merged
TE
10d ago
+718-3

Part 7 of the rebuild of #23199 and #24070 (adopted by hb-acpmux). On feat-cmux-next (8b5cafb9, after the capture hook #25481): +718 −3, of which 655 are the five strings' translations.

An ssh machine's sidebar tooltip shows its daemon update: "Updating to this Mac's build…", "Update will try again soon", "Updated to ", "Update failed: ", "Update rolled back: ".

Leo: "BRO CANT YOU JUST LIKE SUSPEND SHIT AFTER A TOOL CALL/TURN THEN JUST GO AND AUTOUPDATE OUR TEAMMATES NEED ACPMUX UPDATING TOO..."

Leo: "OUR SHIT IS HARDLY EVER GOING TO GO IDLE. IT JUST WONT. YOU'LL JUST HAVE TO ACCEPT IT BREAKING AT SOME POINT BUT IT RESUMES WHATEVER IT INTERRUPTED. END OF STORY FOR THE DAEMON UPDATE."

Leo-ask: ask-48bbaec1d4
Leo-ask: ask-061e3574a6

Change

From #24070 at bd4892c8:

  • DaemonUpdateBoard.line(_:), detail(id:) and detail(sshHost:). The host is matched whatever its case, in one pass over the targets. With several targets on one host, the lowest id wins, so the line never flips between them.
  • SidebarBridge.sshTooltip (from #25481, used by the live header and the debug.daemon_update fixture) adds that line under the machine's own detail.
  • The five strings in CmuxNextAgentPane's Localizable.xcstrings, in every language base carries (translations from #24070).

Review (Codex gpt-6-astra xhigh, SHIP at e762a0fa, which covers the rebase onto #25481). Fixes from the earlier rounds: the per-row sort became the one-pass lookup. The board read sits in the sidebar's listsRows observation pass, and the reviewer accepted it as sparse, because the board changes only while an update runs.

No timers.

Tests

  • theBoardGivesAnSSHMachinesTooltipLine (DaemonUpdateTargetTests): none before any state; a failure's line by host in any case and by id; none for another host; each state's line carries its build or reason. With two targets on one host, the first one's line. Red on base: detail(sshHost:) and line(_:) don't exist there.
  • SSHMachineTooltipTests (base, #25481) still passes with the line added: no update event names its host, so the line is absent.

Observed / Not run

  • Fleet at e762a0fa: DaemonUpdateTargetTests and SSHMachineTooltipTests pass.
  • PR CI at e762a0fa: cmux-next swift test has 32 reds. 26 are on the known base and flaky list. The other 6 pass when their suites run again on the fleet at this head: AgentPaneTabRowHolesTests, DividerCursorUnderDockTests, CrashWatcherTests, AgentPaneDebugClickPageHostTests, UpdateCardHideTests and AgentPaneSessionInfoTests, all suites this PR doesn't touch.
  • Release compile (Xcode 26) at e762a0fa: green, https://github.com/manaflow-ai/cmux/actions/runs/40341221417/job/121636522702
  • Codex gpt-6-astra xhigh: SHIP at e762a0fa.

Capture

Before, at feat-cmux-next 8b5cafb9: the build-box header's tooltip is only "Connected — dev@build-box.example.com".

Capture steps-92aeb3c753 at 8b5cafb988ba (fleet build, capture mini, text checked for private data)

LightDark
lightdark

After, at e762a0fa: the tooltip adds the update line "Updating to this Mac's build…". The debug.daemon_update fixture (#25481) puts the update state on the board.

Capture steps-92aeb3c753 at e762a0fabadb (fleet build, capture mini, text checked for private data)

LightDark
lightdark

Agent session: big-red
🤖 Generated with Claude Code