cmux NEXT daemon update: a DEBUG capture hook for the ssh machine tooltip and the failure toast
Merged
TE
10d ago+150+150+012345678901234567890123456789-2-2-0123456789
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 nodebug.*route), inControl/DebugSidebarNestedFixture.swiftbeside the other sidebar fixture. It takes{state?, id?, name?, ssh_host?, reason?, build?, notify?, sidebar?, tooltip?, window?}and can:state: apply aDaemonUpdateEventtoDaemonUpdateBoard.shared, the same path the update queue writes. Withnotify, 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, asdebug.sidebar_nested_fixturedoes), 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, sosidebar: trueturns onDesignSettings.shared.sidebarSections.groupsByComputer(the preference each render applies), andsidebar: falserestores 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 ofsshMachineunchanged. 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'tmain; then the detail; an empty or missing detail is left out. Red first: 5fb41a2d has only the test, andsshTooltipdoesn't exist there.
Observed / Not run
- Fleet suites (
cmux-ci run ... package-test-lane.sh): at 5fb41a2d, red becauseSidebarBridgehas no membersshTooltip. At c3e962dd,SSHMachineTooltipTestsandSSHLinkReconnectingTestspassed (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 testfailure 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