Skip to content

iOS: reconnecting never exits the user's workspace or invalidates their current task - #11091

Closed
azooz2003-bit wants to merge 2 commits into
mainfrom
fix-ios-reconnect-context-loss
Closed

azooz2003-bit wants to merge 2 commits into
mainfrom
fix-ios-reconnect-context-loss

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Aug 28, 2026 •

Copy link
Copy Markdown
Collaborator

On iPhone (iroh, latest INTERNAL/NIGHTLY), the moment a reconnect began the mounted workspace detail was exited. Reproduced at the store level by the new regression tests (commit 1, red): recovery's redial teardown dropped every secondary Mac's workspacesByMac entry, which flips multi-Mac row-id scoping, changes every derived row id's raw value, remaps the selection, and re-keys the pushed navigation route (destroying the mounted detail); a failed first dial then re-entered the teardown with foregroundMacDeviceID already nil, so the retention filter keyed on the anonymous sentinel and wiped the whole list.

The fix is the general invariant the symptom kept violating: connection state changes never terminate or invalidate the user's current context.

  • Store: clearRemoteConnectionContext no longer removes workspace rows. Teardown is a transport event; rows are removed only by authoritative events (healthy list reconcile, unpair/hide in the secondary reconcile pass, sign-out, team change), all of which already do their own explicit removal. All retained entries downgrade to .unavailable so the Computers dots and list chrome stay truthful, the teardown is idempotent (a second clear is a status no-op), and the per-Mac entry count stays stable so row-id scoping and route identity survive reconnects. The post-reconnect secondary refresh re-syncs the retained rows.
  • Navigation policy (defense-in-depth): WorkspaceShellCompactNavigationPolicy takes listIsAuthoritative. While the list is reconnecting/disconnected, a cleared selection or a list hole keeps the mounted detail rendering its last-known snapshot (rename dialogs and sheets survive because the detail view identity survives); deletions confirmed by a healthy list still pop normally.

Commit 1 adds the failing store tests only (CI red); commit 2 adds the fix plus policy tests (CI green). Full CmuxMobileWorkspace suite passes (45/45); full CmuxMobileShell suite run included in the verification pass.

HIG: Feedback — status feedback should reach people "without having to take action or leave their current context"; only alerts may deliberately disrupt context. Transient connectivity is status, so it is shown in place (existing title spinner from #10821) instead of ejecting the user.

Follow-up (out of scope): genuine Mac removal while N→1 still flips row-id scoping and re-keys a mounted route; making scoping sticky would remove that last identity change, but it changes persisted-selection semantics and deserves its own pass.


Summary by cubic

Fixes iOS reconnects so reconnecting never exits the user's workspace or invalidates their current task. Connection teardown no longer removes workspace rows or retargets the selection, and compact navigation keeps the mounted detail while the list is reconnecting or disconnected.

Store

  • clearRemoteConnectionContext keeps all workspacesByMac rows, downgrading their status to .unavailable so the Computers dots and list chrome stay truthful.
  • Rows are removed only by authoritative events: a healthy list reconcile, unpair/hide, sign-out, or team change.
  • Retaining secondary entries means multi-Mac row-id scoping never flips mid-recovery, so derived row ids and the pushed navigation route keep their identity; a second teardown is now a status no-op.
  • A genuine Mac removal while N→1 still flips row-id scoping and re-keys a mounted route; making scoping sticky is a follow-up.

Navigation

  • WorkspaceShellCompactNavigationPolicy takes listIsAuthoritative; while the list is reconnecting or disconnected, a cleared selection or list hole keeps the mounted detail on its last-known snapshot.
  • Deletions confirmed by a healthy list still pop normally.

Written for commit a0c781b. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes
    • Workspace rows now remain visible during connection teardown and recovery.
    • Workspace selections and mounted detail views are preserved while reconnecting or disconnected.
    • Workspace statuses are updated to unavailable without removing retained rows.
    • Navigation now avoids popping detail routes until the workspace list is confirmed current.
  • Tests
    • Added coverage for workspace retention, selection preservation, repeated teardown, and reconnect navigation behavior.

azooz2003-bit and others added 2 commits August 28, 2026 01:10
On iPhone, the moment an iroh reconnect began the mounted workspace
detail popped back to the list. Mechanism, reproduced by these tests:

1. Recovery's redial teardown (`clearRemoteConnectionContext`) drops
   every secondary Mac's `workspacesByMac` entry. Going from N Macs to
   1 flips multi-Mac row-id scoping, so every derived row id changes
   raw value and the selection remaps to a different id, re-keying the
   pushed navigation route and destroying the mounted detail.
2. A failed first dial (immediate when the network just dropped) runs
   the teardown again with `foregroundMacDeviceID` already nil, so the
   retention filter keys on the anonymous sentinel and wipes the whole
   list.

Two tests fail on main; the preserving-mode baseline passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Connection teardown (`clearRemoteConnectionContext`) no longer removes
`workspacesByMac` rows. Teardown is a transport event; rows are removed
only by authoritative events (healthy list reconcile, unpair/hide,
sign-out, team change). This fixes both halves of the reconnect pop:
secondary entries survive so multi-Mac row-id scoping never flips
mid-recovery (the pushed navigation route keeps its identity), and the
failed-dial re-teardown that used to wipe the whole list through the
anonymous-sentinel retention filter now only downgrades statuses, which
is idempotent. All retained entries downgrade to `.unavailable` so the
Computers dots and list chrome stay truthful, and the post-reconnect
secondary refresh already re-syncs them.

Defense-in-depth at the navigation layer: the compact path policy takes
`listIsAuthoritative`. While the workspace list is reconnecting or
disconnected, a cleared selection or a list hole keeps the mounted
detail on its last-known snapshot; pops still happen normally when a
healthy list confirms a deletion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Aug 28, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

@vercel

vercel Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux41 Ready Ready Preview Aug 28, 2026 9:22am

@coderabbitai

coderabbitai Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: afa78e6a-e962-4b7b-ba81-561f9603669c

📥 Commits

Reviewing files that changed from the base of the PR and between 102aa3d and a0c781b.

📒 Files selected for processing (6)
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+WorkspaceListRecovery.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/ConnectionTeardownWorkspaceRetentionTests.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift
  • Packages/iOS/CmuxMobileWorkspace/Sources/CmuxMobileWorkspace/WorkspaceShellCompactNavigationPolicy.swift
  • Packages/iOS/CmuxMobileWorkspace/Tests/CmuxMobileWorkspaceTests/WorkspaceShellCompactNavigationPolicyTests.swift

Included review availability: Your plan provides up to 10 included reviews per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The change retains workspace rows during connection teardown and prevents compact navigation from removing mounted detail routes when workspace-list data is not authoritative. Tests cover repeated teardown, selection retention, status changes, and navigation behavior.

Changes

Workspace retention and navigation

Layer / File(s) Summary
Connection teardown workspace retention
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift, Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+WorkspaceListRecovery.swift, Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/ConnectionTeardownWorkspaceRetentionTests.swift
clearRemoteConnectionContext retains secondary Mac workspace rows during non-preserving teardown and downgrades retained rows to .unavailable. Tests verify repeated teardown and selection retention.
Non-authoritative compact navigation
Packages/iOS/CmuxMobileWorkspace/Sources/CmuxMobileWorkspace/WorkspaceShellCompactNavigationPolicy.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceShellView.swift, Packages/iOS/CmuxMobileWorkspace/Tests/CmuxMobileWorkspaceTests/WorkspaceShellCompactNavigationPolicyTests.swift
Compact navigation receives workspace-list authority and preserves mounted detail routes during reconnecting or disconnected states. Tests cover cleared selections, missing visible workspaces, and selected workspace retargeting.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: 🔵 Low · up to a0c78

The PR keeps users in their workspace during transient reconnects while preserving authoritative removal behavior. It is mergeable with owner awareness because concurrent refreshes or failed non-foreground switches could still leave workspace state or secondary updates stale in edge cases.

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 14 functions across 5 files. (1 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary iOS reconnect behavior change and its user impact.
Description check ✅ Passed The description provides a detailed summary, rationale, implementation scope, testing results, and follow-up context. It omits the template's explicit Testing, Demo Video, Review Trigger, and Checklis…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PASS. The production diff does not introduce or materially worsen an actor-isolation mistake. MobileShellComposite remains the pre-existing @MainActor class, and its changed teardown logic stays w…
Cmux Swift Blocking Runtime ✅ Passed PASS — The PR introduces no blocking or timing-based synchronization in production Swift. The production diff changes workspace retention, status updates, navigation policy parameters, and comments on…
Cmux Browser Automation Off-Main ✅ Passed PASS: The PR changes only iOS workspace teardown and navigation files. The two rule-target files, Sources/TerminalController.swift and `Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Wir…
Cmux Expensive Synchronous Load ✅ Passed PASS: The pull request adds no expensive synchronous agent-history load. The production diff only changes workspace retention and navigation state. Added production lines contain no `RestorableAgentSe…
Cmux Cache Substitution Correctness ✅ Passed PASS — the PR does not replace a fresh persistence, history, undo, or snapshot read with a cache. The production diff only retains in-memory workspacesByMac rows during connection teardown, downgrad…
Cmux No Hacky Sleeps ✅ Passed PASS: The complete PR range (HEAD~2..HEAD) changes only six .swift files under the iOS packages. It introduces no TypeScript, JavaScript, shell, or build/runtime-script changes, and the patch adds…
Cmux Algorithmic Complexity ✅ Passed No algorithmic-complexity failure is introduced. In clearRemoteConnectionContext, the new keysToDowngrade filter and dictionary-update loop each scan workspacesByMac once, for linear O(M) work w…
Cmux Swift Concurrency ✅ Passed PASS: The parent-to-HEAD diff adds no legacy Swift concurrency pattern. The changes are synchronous workspace-state retention, a Boolean navigation-policy parameter, call-site plumbing, comments, and …
Cmux Swift @Concurrent ✅ Passed PASS. The full PR diff adds no @concurrent, nonisolated async, or async helper call site. The changed store method, navigation-policy methods, and new property are synchronous. `clearRemoteConnect…
Cmux Swift Package Boundaries ✅ Passed PASS. The production diff does not keep the changed logic in the app target. The changed store code is in the CmuxMobileShell SwiftPM library target, which has a dedicated CmuxMobileShellTests tar…
Cmux Swiftpm Lockfiles ✅ Passed PASS: The PR diff from d1e6aaa to a0c781b changes only Swift source and test files. It does not change Package.swift, Package.resolved, .gitignore, workflow files, or Xcode project files. Theref…
Cmux Swift Logging ✅ Passed PASS. The PR diff adds or materially changes no logging. The production changes contain only teardown logic, navigation state, and comments. The added tests and comments contain no print, `debugPrin…
Cmux User-Facing Error Privacy ✅ Passed PASS: The complete PR range changes connection-state retention and navigation behavior, plus developer comments and tests. No production user-facing error, alert, command output, API error body, or re…
Cmux Full Internationalization ✅ Passed PASS: The PR adds no user-facing Swift text, web copy, metadata, or localization/catalog changes. Production additions are connection-state and navigation logic plus developer-only comments. The new S…
Cmux Swiftui State Layout ✅ Passed PASS. The SwiftUI diff only adds the workspaceListIsAuthoritative computed value and passes it to the existing compact navigation policy callbacks. It adds no new ObservableObject, @Published, `…
Cmux Architecture Rethink ✅ Passed PASS. The diff applies a small store correctness fix with an explicit invariant: transport teardown retains workspacesByMac rows, downgrades their status, and leaves authoritative reconciliation and…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS. The pull request changes only connection-state retention, workspace navigation policy, and tests. The complete diff adds or modifies no NSWindow, NSPanel, NSWindowController, SwiftUI Window/Wind…
Cmux Source Artifacts ✅ Passed PASS: The aggregate diff changes six Swift source/test paths only. The new ConnectionTeardownWorkspaceRetentionTests.swift is a deliberate regression test in the existing test directory. The other c…
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS: The PR adds no test/debug seam to production Swift source. The production diff only changes teardown behavior/comments, adds the private workspaceListIsAuthoritative property, passes `listIsAu…
Cmux No Ambient Global State ✅ Passed PASS: The PR diff adds no ambient global state in production Swift. clearRemoteConnectionContext and the navigation-policy methods remain members of existing types. The only new production property,…
Full details: Description check

Explanation

The description provides a detailed summary, rationale, implementation scope, testing results, and follow-up context. It omits the template's explicit Testing, Demo Video, Review Trigger, and Checklist sections, but the core change and verification information are present.

Full details: Docstring Coverage

Explanation

Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 14 functions across 5 files. (1 skipped: 1 too large.)

Full details: Cmux Swift Actor Isolation

Explanation

PASS. The production diff does not introduce or materially worsen an actor-isolation mistake. MobileShellComposite remains the pre-existing @MainActor class, and its changed teardown logic stays within that isolation boundary. MobileShellComposite+WorkspaceListRecovery remains @MainActor. WorkspaceShellView only adds state-derived UI policy and is an allowed SwiftUI view type. WorkspaceShellCompactNavigationPolicy remains a plain value-only struct; the diff adds only a Bool parameter and conditional path logic. No service protocol, shared mutable Sendable reference type, logger, formatter, or background access to a UI store was added. The new changes in test files are excluded by the check, and the shell regression tests are explicitly @MainActor isolated.

Full details: Cmux Swift Blocking Runtime

Explanation

PASS — The PR introduces no blocking or timing-based synchronization in production Swift. The production diff changes workspace retention, status updates, navigation policy parameters, and comments only. Added production lines contain no semaphore waits, sleeps, delayed dispatch, polling, main-queue sync, or manual locks. The new Swift tests are deterministic and contain no timing or blocking primitives, which the policy allows.

Full details: Cmux Browser Automation Off-Main

Explanation

PASS: The PR changes only iOS workspace teardown and navigation files. The two rule-target files, Sources/TerminalController.swift and Packages/macOS/CmuxControlSocket/Sources/CmuxControlSocket/Wire/ControlCommandExecutionPolicy.swift, are unchanged. The diff adds no browser.* socket command, WebKit wait, worker routing change, or browser policy test requirement. The added @MainActor code is unrelated iOS workspace logic.

Full details: Cmux Expensive Synchronous Load

Explanation

PASS: The pull request adds no expensive synchronous agent-history load. The production diff only changes workspace retention and navigation state. Added production lines contain no RestorableAgentSessionIndex, SharedLiveAgentIndex, agent-history file parsing, directory scans, JSON decoding, or synchronous file/syscall operations. The changed Swift files also contain no matching prohibited load call introduced by the diff.

Full details: Cmux Cache Substitution Correctness

Explanation

PASS — the PR does not replace a fresh persistence, history, undo, or snapshot read with a cache. The production diff only retains in-memory workspacesByMac rows during connection teardown, downgrades their status, and keeps a transient navigation route mounted while the list is non-authoritative. No persistence or authoritative-read call site changed, and the retained UI snapshot is not persisted.

Full details: Cmux No Hacky Sleeps

Explanation

PASS: The complete PR range (HEAD~2..HEAD) changes only six .swift files under the iOS packages. It introduces no TypeScript, JavaScript, shell, or build/runtime-script changes, and the patch adds no sleep or timer constructs. This check explicitly excludes Swift changes.

Full details: Cmux Algorithmic Complexity

Explanation

No algorithmic-complexity failure is introduced. In clearRemoteConnectionContext, the new keysToDowngrade filter and dictionary-update loop each scan workspacesByMac once, for linear O(M) work with O(1) dictionary lookups; they are not nested or per-workspace rescans. The navigation-policy changes add only constant-time checks and one existing path filter. The Set(store.workspaces.map(\.id)) UI expression was already present and is not worsened by this diff. Added tests do not affect the production-code check.

Full details: Cmux Swift Concurrency

Explanation

PASS: The parent-to-HEAD diff adds no legacy Swift concurrency pattern. The changes are synchronous workspace-state retention, a Boolean navigation-policy parameter, call-site plumbing, comments, and synchronous tests. The changed files contain existing Task usages, but no new or materially expanded Task, DispatchQueue, Combine, completion-handler, or continuation code appears in the diff.

Full details: Cmux Swift `@Concurrent`

Explanation

PASS. The full PR diff adds no @concurrent, nonisolated async, or async helper call site. The changed store method, navigation-policy methods, and new property are synchronous. clearRemoteConnectionContext remains actor-isolated on the existing @MainActor type, and the new tests use synchronous @MainActor methods. The only changed async function area is an explanatory comment in reconnectToMac; no async execution or isolation changed. Therefore, no stated Swift concurrency failure condition was introduced.

Full details: Cmux Swift Package Boundaries

Explanation

PASS. The production diff does not keep the changed logic in the app target. The changed store code is in the CmuxMobileShell SwiftPM library target, which has a dedicated CmuxMobileShellTests target. The pure WorkspaceShellCompactNavigationPolicy is in the separate CmuxMobileWorkspace SwiftPM library and test target. WorkspaceShellView is UI code in CmuxMobileShellUI, an allowed UI package. The diff adds no files under the cmuxFeature app composition target. Repository documentation also identifies cmuxFeature as the composition root and CmuxMobileShell/CmuxMobileWorkspace as focused domain/core packages.

Full details: Cmux Swiftpm Lockfiles

Explanation

PASS: The PR diff from d1e6aaa to a0c781b changes only Swift source and test files. It does not change Package.swift, Package.resolved, .gitignore, workflow files, or Xcode project files. Therefore, no SwiftPM lockfile or package-reference policy condition applies.

Full details: Cmux Swift Logging

Explanation

PASS. The PR diff adds or materially changes no logging. The production changes contain only teardown logic, navigation state, and comments. The added tests and comments contain no print, debugPrint, dump, NSLog, ad hoc file/stdout logging, or new Logger declarations. The existing mobileShellLog declaration is unchanged. No secret or personal-data logging was introduced.

Full details: Cmux User-Facing Error Privacy

Explanation

PASS: The complete PR range changes connection-state retention and navigation behavior, plus developer comments and tests. No production user-facing error, alert, command output, API error body, or recovery copy is added or materially changed. The only added Swift string literals are test fixtures such as workspace and Mac identifiers, which the rule explicitly allows. The changed comments are developer-only comments.

Full details: Cmux Full Internationalization

Explanation

PASS: The PR adds no user-facing Swift text, web copy, metadata, or localization/catalog changes. Production additions are connection-state and navigation logic plus developer-only comments. The new Swift strings are confined to regression-test fixtures, which the rule allows. The diff changes only six Swift source/test files and adds no locale or string-catalog entries.

Full details: Cmux Swiftui State Layout

Explanation

PASS. The SwiftUI diff only adds the workspaceListIsAuthoritative computed value and passes it to the existing compact navigation policy callbacks. It adds no new ObservableObject, @Published, @StateObject, @EnvironmentObject, GeometryReader, lazy/list row store reference, or render-time state mutation. The existing @Bindable var store and GeometryReader are unchanged. The policy and tests are non-view Swift code.

Full details: Cmux Architecture Rethink

Explanation

PASS. The diff applies a small store correctness fix with an explicit invariant: transport teardown retains workspacesByMac rows, downgrades their status, and leaves authoritative reconciliation and removal paths as the owners of row deletion. The navigation change uses a pure policy with a computed workspaceListIsAuthoritative value derived from the existing connection status; it adds no mutable state owner, cache, observer, side channel, timing repair, lock, or duplicate action path. The added tests cover repeated teardown, selection retention, and authoritative versus non-authoritative navigation behavior.

Full details: Cmux Swift Auxiliary Window Close Shortcuts

Explanation

PASS. The pull request changes only connection-state retention, workspace navigation policy, and tests. The complete diff adds or modifies no NSWindow, NSPanel, NSWindowController, SwiftUI Window/WindowGroup, close-shortcut routing, or auxiliary-window identifier code. WorkspaceShellView remains a main workspace view, which the rule allows. The new window-specific tests are not present.

Full details: Cmux Source Artifacts

Explanation

PASS: The aggregate diff changes six Swift source/test paths only. The new ConnectionTeardownWorkspaceRetentionTests.swift is a deliberate regression test in the existing test directory. The other changes are hand-written source files and a comment update. No logs, screenshots, recordings, temporary or hidden scratch directories, caches, build output, dependency checkouts, or binary artifacts appear in the changed paths. The diff metadata reports normal text files with no binary additions.

Full details: Cmux No Test Or Debug Seam In Production Source

Explanation

PASS: The PR adds no test/debug seam to production Swift source. The production diff only changes teardown behavior/comments, adds the private workspaceListIsAuthoritative property, passes listIsAuthoritative to navigation policy methods, and adds that policy parameter. No #if DEBUG test-observability block, debug/test-named member, visibility widening, or wrapper accessor was added. New test scaffolding remains under **/Tests/** and uses @testable import.

Full details: Cmux No Ambient Global State

Explanation

PASS: The PR diff adds no ambient global state in production Swift. clearRemoteConnectionContext and the navigation-policy methods remain members of existing types. The only new production property, private var workspaceListIsAuthoritative, is an instance property inside WorkspaceShellView. The new test type uses private static constants, which the rule explicitly permits. No new file-scope API, mutable global, static-helper namespace, or singleton appears in the changed production lines.

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix-ios-reconnect-context-loss

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@azooz2003-bit

Copy link
Copy Markdown
Collaborator Author

Superseded by #11873: same two commits rebuilt onto current main (this branch fell 622 commits behind and conflicts with the demonstration-mode retention added in #11289).

This branch was successfully deployed

1 active deployment
Preview – cmux41 — a0c781bd Deployed Aug 28, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant