Repository navigation
cnx-ios: after a redial the shown browser tab keeps its video; terminals follow a Mac restart - #22419
azooz2003-bit wants to merge 19 commits into
Conversation
transport-verify-20261019.md defects 7 and 4: only the shown tab reopens after a redial, closed workspaces' tabs are dropped, the shown tab takes the media lane back (WireGuard RTP, media session, WebRTC), the host limit stops hidden tabs first and says evicted, and Block UDP is not shown for WebRTC. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
transport-verify-20261019.md defect 7 (high) and 4 (low). - Phone: on a new link only the shown tab opens again; hidden tabs open when shown. Tabs the Mac no longer lists are dropped when the tree arrives. The shown state goes to the Mac as rb.visibility. A page the Mac stopped (evicted) reopens at its current address while shown (twice, then a Reopen button); one another viewer took offers Reopen. - cnx-hostd: rb.visibility true takes the media lane back for the shown tab (fresh track bridge, keyframe), on WireGuard RTP, the media session and WebRTC alike. The host limit stops idle, then hidden, then shown hosts, and says evicted instead of replaced. - cnx-ffi: a tab whose video came on the channel restarts its lane frames at a keyframe. - Settings: Block UDP is shown only for WireGuard (WebRTC ignores it). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s surfaces transport-verify-20261019.md defect 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…enumbers surfaces
transport-verify-20261019.md defect 2 (medium). A Mac daemon that
restarted numbers its surfaces again, so the phone's open terminal kept
asking for its old number ('[unknown surface 15]', stuck Reattaching).
A reattach now asks resolve-terminal for the terminal's surface first and
follows it; a terminal the Mac no longer has ends with a clear line; a
reattach that ran out of retries says so and the next keystroke tries
again. Sessions whose terminal moved to another surface reattach on a new
link. Older daemons without resolve-terminal attach by number as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shown tab's stream also opens when the app becomes active (a link that came up in the background). Adds verify/e2e/redial_video.py (browser kill/switch rows with a workspace closed on the Mac, and Mac app restart with an open terminal) on the verifier's transport_verify.py rig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…redial-video.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d, restoring terminals waited for - A hidden page does not open on layout; a stream that opened hidden makes the shown tab say rb.visibility true again (it takes the lane back). - The reopen count is forgiven only after 20 s live, so two viewers evicting each other stop after two rounds. - A reopen at the page's current address only after the Mac stopped the page; otherwise the tab's own address (a tab id reused after a restart). - resolve-terminal with a null surface (daemon still adopting) retries instead of ending the terminal; a reattach that gave up shows no spinner and restarts its backoff from the shortest delay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…or typing on the phone) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t too Live check: a hostd kill stops every browser host; reopening at the tab's first address showed a blank page. The current address goes on every reopen (the tab-id-reuse case after a daemon restart stays open). Rig: every row relaunches the phone with its environment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live check (switch row): the page hidden when the person left for Settings stayed hidden under the next link's viewer (the host keeps the last rb.visibility), so the reopened tab showed a blank page at 2 fps. Every stream now sends its visibility right after rb.open. Rig: terminal 'daemon' row kills the app and its daemon (surfaces renumbered). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live check (switch row): a browser workspace made on the phone streams under its placeholder tab id (new-<id>-t1); once the Mac confirms, the tab is s<N>, and the redial opened s<N>'s own blank host. The creation now reports the placeholder-to-real tab, and the streamed model moves to it (the open stream keeps going; the next open uses the real id at the page's current address). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live check: reopening under the real tab id started a new host whose page was blank (the model's address had followed an about:blank report). The phone finds the page under the real id, and it reopens the same host. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e page's Back); drop noisy logs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: true
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Found 14 test failures on Blacksmith runners: Failures
...and 4 more test failures. View all on Blacksmith
|
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Probably yours: CI failed on
Matched log linesNot re-run automatically: Written by
|
Live check: after a simulator reboot the scene stayed inactive, so the shown page told the Mac it was hidden (it stopped painting) and did not reopen on a new link. Only the background hides streamed pages now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…retried first Live check (Mac app killed, daemon alive): resolve-terminal answered terminal_not_found for a moment after the restart, and the session ended a live terminal. A terminal now ends only when it is still missing after the reattach retries. The session asks with terminal_resource_id (term_...), which a daemon restart keeps; terminal_id is the host id, which it does not. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A renumbered terminal reattaches on a new link (match the public id). - A page counts the views showing it, and starts hidden: a tab's new view appearing before its old one disappears keeps it shown, and a page laid out ahead never opens. - Only a browser workspace's opening tab is renamed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…erminal rows pass) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Correctness review (two fresh subagents): findings and resolutions are in the Reviews section of First review: both must-fix items are fixed (a restoring terminal was ended; two viewers could evict each other forever). Of the should-fix items, four are fixed and two are accepted with the reason recorded. Second review: the must-fix is fixed (a renumbered terminal did not reattach on a new link), and so are two should-fix items and one nice-to-have. Two should-fix items are still open:
Not done (nice-to-have): a late channel frame in the cnx-ffi viewer costs one extra keyframe. |
Fixes the redial defects a fresh verifier found (cnx-ios/verify/transport-verify-20261019.md on
feat-cnx-ios-transportverify), on top of the hybrid link (#22337).What changed
rb.visibility. cnx-hostd gives it back the media lane, starting at a keyframe. This works on WireGuard RTP, the WebRTC media session (hybrid) and WebRTC-only.evictedinstead ofreplaced.terminal_idwithresolve-terminalbefore it attaches. If the Mac's daemon restarted, the surface number has changed and the reattach follows it.Details, tests and live numbers:
cnx-ios/verify/redial-video.md. Contract: PROTOCOL.mdbrowser.Tests
cargo test --workspaceand clippy-D warnings, both green.Review
Two fresh review subagents checked correctness: one after the first fix, one after the live fixes. Every finding and how it was handled is in redial-video.md. Two items are still open:
rb.visibilityreminder and a hidden tab's open travel on different channels, so they can arrive at hostd out of order. Fixing this needs visibility insiderb.open, which is a hostd change.Live check (real link, mini-cmuxs-mac-mini-3)
The phone opens two browser workspaces, the Mac closes one, and the other stays on screen. Then cnx-hostd is killed, or the transport is switched in Settings. This ran on WireGuard-only, hybrid and WebRTC-only.
wg-rtpon WireGuard-only,trackon hybrid and WebRTC-only.browseropen (the verifier saw 3 to 5) and stopped no host.Terminal: the Mac app was quit, killed, and killed together with its daemon (surfaces renumbered from 269 to 394). Each time, a command typed on the phone reached the same terminal, with no
[unknown surface].Several bugs were found and fixed during the live check:
resolve-terminalansweredterminal_not_foundfor a moment after a Mac app restart, which ended a live terminal.Changelog
none (cnx-ios is unreleased)
🤖 Generated with Claude Code