cmux NEXT daemon update: a DEBUG capture hook for the ssh machine tooltip and the failure toast

Merged
TE
10d ago
+150-2

A DEBUG-only capture hook so the daemon update's visible parts can be captured on a fleet Mac, which has no ssh peer and runs no update. It is for the before/after captures of #25393 (an ssh machine's tooltip line) and #25394 (the toast of a failed update).

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

  • debug.daemon_update (DEBUG builds only; Release registers no debug.* route), in Control/DebugSidebarNestedFixture.swift beside the other sidebar fixture. It takes {state?, id?, name?, ssh_host?, reason?, build?, notify?, sidebar?, tooltip?, window?} and can:
    • state: apply a DaemonUpdateEvent to DaemonUpdateBoard.shared, the same path the update queue writes. With notify, a failure shows the real toast once #25394 adds it.
    • sidebar: show a fixture This Mac plus one ssh machine in the window's sidebar (SidebarRows.fixture, as debug.sidebar_nested_fixture does), drawn in the same turn (renderNow()), or bring the live rows back. Two machines are needed because a sole machine's header titles the list and has no tooltip. Machine headers are drawn only with a section per computer, so sidebar: true turns on DesignSettings.shared.sidebarSections.groupsByComputer (the preference each render applies), and sidebar: false restores the value from the settings snapshot.
    • tooltip: rest the synthetic pointer on that machine's header (DebugPointerHover, as the rail-card tours do), so its themed tooltip opens after the usual delay.
  • SidebarBridge.sshTooltip(destination:session:detail:): the live ssh header's tooltip text, moved out of sshMachine unchanged. The fixture uses the same function, so whatever the live tooltip adds (#25393's update line) shows in the capture.
  • SidebarContainerView.machineHeaderFrameInWindow(_:) (DEBUG): where a machine header is drawn.
  • scripts/cmux-next/media/tours/daemon-update.json: a machine updating, with its header tooltip; then a failed update, with its toast and tooltip.

No timers: the tooltip's own delay and recheck are the presenter's, unchanged.

Tests

  • SSHMachineTooltipTests.theTooltipIsTheDestinationTheSessionAndTheDetail: destination; destination and session when the session isn't main; then the detail; an empty or missing detail is left out. Red first: 5fb41a2d has only the test, and sshTooltip doesn't exist there.

Observed / Not run

  • Fleet suites (cmux-ci run ... package-test-lane.sh): at 5fb41a2d, red because SidebarBridge has no member sshTooltip. At c3e962dd, SSHMachineTooltipTests and SSHLinkReconnectingTests passed (step 60811b8a8d33cf55f36a6652).
  • Fleet capture (cmux-ci capture 793d4f4f --state tour:daemon-update, DEV build 486226a402f6237800596baf, cmux12s): all four steps ok. The still shows the This Mac and build-box headers, with build-box's themed tooltip open ("Connected — dev@build-box.example.com"). There is no update line or toast yet, because those are #25393 and #25394. Earlier capture runs found three bugs, each fixed here: the header frame helper needed a public AppKit import; the header was looked up before the list reloaded; and the model's grouping was reset by the next render.
  • CI at 793d4f4f: the fleet app compile passed. Every cmux-next swift test failure also fails on base. The Release compile runs on the base push after merge.
  • Review: Codex gpt-6-astra xhigh, SHIP at 793d4f4f.

No capture: DEBUG-only capture hook; its use is #25393's and #25394's captures.

Agent session: big-red
šŸ¤– Generated with Claude Code