Skip to content

Preserve connectivity across staggered Iroh upgrades - #8196

Merged
azooz2003-bit merged 15 commits into
mainfrom
feat-tailscale-iroh-migration
Jul 16, 2026
Merged

azooz2003-bit merged 15 commits into
mainfrom
feat-tailscale-iroh-migration

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 15, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

  • Upgrade saved legacy Tailscale pairings to authenticated Iroh routes by exact Mac device ID and instance tag, without sign-out, QR rescans, or raw bearer TCP fallback.
  • Keep older iOS releases working with newer Macs through TCP-first startup, retained Tailscale publication, and a tokenless v1 Tailscale-only compatibility payload.
  • Preserve saved pairings when an old Mac has not published Iroh yet, and tell the user to update the Mac instead of requesting reauthentication.
  • Restore the Bonsplit API pin required by current Workspace.swift.

Security

  • New iOS builds never dial raw Tailscale bearer routes; numeric Tailscale addresses remain authenticated Iroh private-path hints only.
  • Registry migration requires an exact same-account device and instance match and retains EndpointID pinning before token use.
  • Legacy payloads exclude Iroh identity, relay data, private paths, access tokens, and account email.

Compatibility

  • New iOS + old Mac: retain the saved Mac, reuse one authenticated registry snapshot, migrate when its Iroh route appears, and otherwise show an update-Mac message.
  • Old iOS + new Mac: continue TCP/Tailscale service and emit the historical full-key payload shape with old-client-compatible expiry.

Testing

  • swift test --package-path Packages/iOS/CmuxMobileShell --filter IrohReconnectRouteSelectionTests
  • swift test --package-path Packages/iOS/CmuxMobileShell --filter MobilePairingFailureTests
  • swift test --package-path Packages/iOS/CmuxMobileShell --filter DeviceRegistryRouteSelectionTests
  • swift test --package-path Packages/iOS/CmuxMobileShell --filter TaggedBuildRegistryRouteIsolationTests
  • swift test --package-path vendor/bonsplit (197 tests passed)
  • Historical v0.64.14, v0.64.15, and v0.64.16 pairing decoders accepted the compatibility payload.
  • Tagged macOS plus an isolated iOS Simulator completed an Iroh-only authenticated mobile.subscribe session.

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Keeps connections stable during staggered Iroh rollouts by upgrading legacy Tailscale pairings from one authoritative registry snapshot and only connecting over Iroh. Adds a centralized legacy pairing encoder for old iOS, preserves saved pairings, and shows clear “Update cmux on this Mac” guidance only when revalidated.

  • New Features

    • Builds one DeviceRegistryRouteIndex per refresh and selects routes by exact device ID + normalized instance tag; ambiguous or missing authority no longer shows an update message.
    • Revalidates “missing Iroh” against the latest paired‑Mac store before surfacing guidance; adopts concurrently published Presence routes; keeps reconnects linear and consistent.
    • Introduces macUpdateRequired failure that preserves the pairing and shows actionable guidance in disconnected views; UI now displays the classified reason with its guidance.
    • Centralizes legacy pairing with CmxLegacyPrivateNetworkPairingCode: emits a tokenless, Tailscale‑only v1 attach URL with far‑future expiry, drops authToken and macUserEmail, and retains macUserID.
    • New iOS builds never fall back to raw Tailscale/TCP; a Tailscale route is a migration hint only. Debug loopback remains allowed for development.
    • Normalizes instance tags/device IDs for authority matching and safely skips unknown/malformed routes.
    • Expands tests for registry authority races, presence races, migration revalidation, and legacy payload privacy/expiry.
  • Dependencies

    • Locks iroh-ffi in Package.resolved.
    • Restores the bonsplit fork API expected by current Workspace.swift.

Written for commit 84fc14f. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • More resilient Mac reconnection with refreshed route recovery and improved “Iroh missing” handling.
    • Added “Update cmux” pairing guidance, plus more specific disconnected-connection messaging.
    • Introduced legacy private-network compatibility pairing support (Tailscale-only payload) and a migration fallback for listener-enabled behavior.
  • Bug Fixes
    • Improved device matching by normalizing instance tags.
    • Prevented incorrect “update cmux” prompts when registry data is empty/ambiguous or when Iroh authorization fails.
    • Updated disconnection behavior for authorization/account-mismatch failures.
  • Tests
    • Expanded reconnect, legacy pairing, and UI-message coverage.

@coderabbitai

coderabbitai Bot commented Jul 15, 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

Run ID: af5801cc-d31f-4896-9d53-a1bb6044cb9b

📥 Commits

Reviewing files that changed from the base of the PR and between 3847206 and 84fc14f.

📒 Files selected for processing (8)
  • Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/CmxLegacyPrivateNetworkPairingCode.swift
  • Packages/Shared/CMUXMobileCore/Tests/CMUXMobileCoreTests/CmxLegacyPrivateNetworkPairingCodeTests.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/DelayedTeamPairedMacStore.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/IrohReconnectRouteSelectionTests.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift
  • Sources/Mobile/MobileAttachTicketStore.swift

📝 Walkthrough

Walkthrough

This PR refactors iOS reconnect route resolution around shared registry snapshots, adds migration handling when secure Iroh routes are unavailable, surfaces classified failure copy, and preserves legacy private-network pairing through Tailscale-only attach payloads and historical listener settings.

Changes

Iroh reconnect migration

Layer / File(s) Summary
Registry-backed route resolution
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/DeviceRegistryService.swift, Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift
Registry devices and instance tags are normalized, route authority is resolved from parsed snapshots, and reconnect refreshes use captured paired-Mac and registry data.
Secure reconnect orchestration
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift, Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift
Reconnect and Mac switching cache snapshots, gate initial connections on secure routes, retry with refreshed routes, and classify missing-Iroh migration failures.
Mac update failure presentation
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobilePairingFailure.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/*, ios/cmux/Resources/Localizable.xcstrings
The new failure category maps analytics and localized guidance, while disconnected views render classified error and guidance text.
Reconnect migration validation
Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/*
Tests cover snapshot reuse, route upgrades, persistence, ambiguous or empty registry results, authorization precedence, normalized tags, and update-required messaging.

Legacy private-network compatibility

Layer / File(s) Summary
Legacy attach payload generation
Sources/Mobile/MobileAttachTicketStore.swift, Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/*, cmuxTests/MobileHostIrohAdmissionTests.swift
Legacy compatibility attach URLs contain only Tailscale routes, omit authentication metadata, synthesize expiry data, and encode a tokenless payload.
Historical listener setting fallback
Sources/Mobile/MobileHostService.swift, cmuxTests/MobileHostServiceSettingsTests.swift
Listener state recognizes the historical defaults key and uses it when the canonical override is absent, including XCTest route-publishing behavior.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MobileShellComposite
  participant DeviceRegistryService
  participant PairedMacStore
  participant TransportFactory
  MobileShellComposite->>PairedMacStore: load saved Macs
  MobileShellComposite->>DeviceRegistryService: capture registry snapshot
  MobileShellComposite->>TransportFactory: attempt secure reconnect
  TransportFactory-->>MobileShellComposite: local connection failure
  MobileShellComposite->>DeviceRegistryService: resolve refreshed routes
  DeviceRegistryService-->>MobileShellComposite: refreshed routes or missing Iroh
  MobileShellComposite->>PairedMacStore: apply route upgrade or migration failure
Loading

Possibly related PRs

Suggested reviewers: lawrencecchen, austinywang


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (2 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Package Boundaries ❌ Error App-target Sources/Mobile gained reusable auth/settings logic (legacy pairing URL + listener migration) in files built by cmux.xcodeproj, violating the boundary rule. Extract this into a small SwiftPM target (e.g. CmuxMobileHostCore) and expose a narrow API such as MobileAttachTicketStore or a MobileHostServiceProtocol.
Cmux User-Facing Error Privacy ❌ Error The PR adds user-facing recovery/help copy with vendor names like “Iroh” and “Tailscale,” which the rule forbids. Remove vendor/service names from visible error and guidance text, or rephrase them generically (e.g. “private network”/“saved route”).
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (22 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: preserving connectivity during staggered Iroh upgrades.
Description check ✅ Passed The description is mostly complete, covering summary, security, compatibility, and testing, but it omits the demo video, review trigger, and checklist sections.
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 New helpers are pure Sendable/value types; touched UI/store code stays on @MainActor, and no new shared mutable Sendable refs or implicit MainActor models were introduced.
Cmux Swift Blocking Runtime ✅ Passed The actual parent→HEAD Swift diff only adds the legacy pairing encoder/refactor and contains no new blocking waits, sleeps, semaphores, or sync locks in production code.
Cmux Browser Automation Off-Main ✅ Passed PR diff only touches mobile pairing/reconnect files; no browser.* socket commands, processV2Command, or socketWorkerMethods changes.
Cmux Expensive Synchronous Load ✅ Passed No rule-violating sync agent-history/file scans were added; the new reconnect loads are async actor/network calls, and UI changes are string-only.
Cmux Cache Substitution Correctness ✅ Passed The snapshot is freshly loaded per reconnect pass, nil-safeguarded to inconclusive, and stale legacy guidance re-reads paired store before acting; no persistence path trusts an old cache.
Cmux No Hacky Sleeps ✅ Passed The PR diff only changes Swift, xcstrings, and Package.resolved files; no covered non-Swift runtime code introduces sleeps or polling.
Cmux Algorithmic Complexity ✅ Passed PASS — reconnect uses one cached snapshot and dictionary indexes; no nested full scans or per-candidate registry/store rescans were introduced, and UI/text helpers are tiny.
Cmux Swift Concurrency ✅ Passed The new async code uses stored/cancelled Tasks tied to reconnect work; I found no new DispatchQueue, Combine, or completion-handler APIs in the diff.
Cmux Swift @Concurrent ✅ Passed PASS: New async reconnect helpers are @MainActor UI coordinators; I/O happens via other actors or Task hops, and no added nonisolated async/@Concurrent misuse appears.
Cmux Swiftpm Lockfiles ✅ Passed No cmux package .gitignore or Package.swift/package-ref changes were made; the only dependency pin change is the root Xcode ios/cmux.xcworkspace Package.resolved, which satisfies the rule.
Cmux Swift Logging ✅ Passed HEAD patch adds no logging statements or logger declarations; only pairing codec and a UI access modifier changed.
Cmux Full Internationalization ✅ Passed New Swift UI text uses L10n/String(localized:) and the added xcstrings keys have en/ja translations.
Cmux Swiftui State Layout ✅ Passed No new state-owner, GeometryReader, or render-time mutation was introduced; the touched lists still use snapshots/closures, and store-derived text is computed outside row subtrees.
Cmux Architecture Rethink ✅ Passed The diff is a small codec refactor: legacy pairing payload logic moved to one shared helper, with no new timing, observer, cache, or split-owner path introduced.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed Diff only touches pairing logic, tests, and in-view messaging; it adds no standalone NSWindow/WindowGroup code or cmuxAuxiliaryWindowIdentifiers changes.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source, tests, localization, or config; the only lockfile change is a deliberate iroh-ffi pin, with no artifact/scratch outputs.
Cmux No Test Or Debug Seam In Production Source ✅ Passed Touched production changes are product-facing only: a UI helper, a legacy pairing encoder, and a store refactor; no new DEBUG/test seam was added.
Cmux No Ambient Global State ✅ Passed New production code stays on constructable types; I found no new top-level API, mutable globals, or singleton state.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-tailscale-iroh-migration

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.

@greptile-apps

greptile-apps Bot commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR preserves saved Tailscale pairings during staggered Iroh rollouts by upgrading them through a single authenticated registry snapshot rather than per-candidate requests, and adds a macUpdateRequired failure that keeps the pairing intact while directing the user to update the Mac.

  • Registry snapshot refactor: A DeviceRegistryRouteIndex is built once from listDevices() output and reused across all reconnect candidates, replacing repeated per-Mac registry calls; a ReconnectRefreshSnapshot combines the index with a post-request pairedMac store read so a concurrent Presence write during the request is not missed.
  • Legacy compatibility: CmxLegacyPrivateNetworkPairingCode emits a full-key v1 tokenless Tailscale-only URL with a synthetic far-future expiry for iOS builds that predate the compact ticket grammar; insecureManualRoute is removed from the reauth-triggering set so the pairing is preserved instead of requiring a rescan.
  • macUpdateRequired failure path: When the registry confirms no Iroh identity for a legacy Tailscale-only pairing, the UI shows the classified headline and guidance (both localized in en/ja) instead of the generic "computer unavailable" copy, and the pairing row is left intact.

Confidence Score: 5/5

The change is safe to merge; the migration path is fully guarded, the pairing is only preserved (never cleared) by the new code path, and all new user-facing strings are localized for both supported locales.

The registry snapshot is built once from an already-parsed listDevices() result and shared across all reconnect candidates. The macUpdateRequired failure is applied only after a second fresh store read confirms no Iroh identity, eliminating the race with a concurrent Presence write. The insecureManualRoute reclassification is intentional and correctly scoped. The workspace Package.resolved matches the existing CmuxIrohTransport pin exactly.

No files require special attention; the most complex logic in MobileShellComposite.swift and MobileShellComposite+ReconnectRoutes.swift is well-guarded with scope and generation checks throughout.

Important Files Changed

Filename Overview
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/DeviceRegistryService.swift Refactors route lookup into a DeviceRegistryRouteIndex struct with O(1) normalized device-ID lookup; fixes tag storage to use the trimmed value, and delegates the pre-parsed [RegistryDevice] path to the shared index.
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift Replaces per-candidate registry requests with a single authenticated ReconnectRefreshSnapshot; introduces ReconnectRouteRefreshOutcome with confirmedMissingIroh to distinguish a missing-Iroh outcome from transient failures.
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift Extends the stored-mac reconnect loop to skip raw TCP/Tailscale dials, pre-fetches one shared snapshot, adds macUpdateRequired failure surfacing, and moves insecureManualRoute out of reauth-triggering errors.
Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/CmxLegacyPrivateNetworkPairingCode.swift New encoder for the full-key v1 tokenless Tailscale-only compatibility payload; strips authToken and macUserEmail, retains macUserID, uses synthetic far-future expiry.
Sources/Mobile/MobileAttachTicketStore.swift Routes legacyPrivateNetworkCompatibility disclosure mode through the new CmxLegacyPrivateNetworkPairingCode encoder before the existing QR path.
Sources/Mobile/MobileHostService.swift Adds migration fallback for the pre-catalog cmuxMobilePairingHostEnabled UserDefaults key; new key checked first, legacy key as fallback.
ios/cmux/Resources/Localizable.xcstrings Adds macUpdateRequired headline and guidance strings with complete en and ja translations matching the catalog's supported locales.
ios/cmux.xcworkspace/xcshareddata/swiftpm/Package.resolved Adds iroh-ffi 1.0.2-cmux.2; revision matches the existing CmuxIrohTransport/Package.resolved pin exactly.

Reviews (3): Last reviewed commit: "refactor: centralize legacy pairing code..." | Re-trigger Greptile

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobilePairingFailure.swift`:
- Around line 334-338: Update the .macUpdateRequired case in
MobilePairingFailure guidance to remove the internal “Iroh route” terminology
and tell users their saved computer will reconnect automatically after updating
cmux on the Mac, while preserving the instruction that they do not need to sign
out or pair again.

In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift`:
- Around line 1785-1800: The reconnect flow currently infers Mac-update
requirements from missing Iroh data instead of one authoritative result. In
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift#L1785-L1800,
replace the didSuccessfullyLoadRegistrySnapshot/foundPublishedIroh inference
with a typed confirmed outcome; at `#L2227-L2242`, initialize confirmed-missing
state only after exact route resolution succeeds; and at `#L2294-L2298`, trigger
the shared failure action only for the current-scope .confirmedMissingIroh
result.
- Around line 1737-1768: Eliminate per-candidate full snapshot rescans in the
reconnect flow: in MobileShellComposite.swift lines 1737-1768, build reusable
indexes once before iterating candidates; in DeviceRegistryService.swift lines
292-301, update the registry API to accept the selected device/instance or
provide indexed snapshot lookup; and in
MobileShellComposite+ReconnectRoutes.swift lines 181-185, use keyed row
retrieval or one indexed post-request store snapshot. Preserve existing
reconnect behavior while ensuring lookups are indexed or single-pass rather than
O(candidates × collection size).

In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite`+ReconnectRoutes.swift:
- Around line 173-180: Update the reconnect flow around the currentMac.routes
comparison so it evaluates the authoritative current row before requiring
registryRoutes. Move DeviceRegistryService.routes resolution out of the initial
guard and into the fallback branch, allowing the newer current row to be used
when the device snapshot lacks or ambiguously matches the target. Preserve the
existing scope and forgotten-device checks.

In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift`:
- Around line 666-678: Convert MobileDisconnectedFailureCopy from a static-only
namespace into an instantiable value type with immutable error and guidance
properties and an instance property exposing the combined, trimmed result.
Preserve the existing filtering and joining behavior, then update both callers
to construct MobileDisconnectedFailureCopy values and read the instance result
instead of calling combine.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: be4b73e0-18de-4551-bd31-34a25e9b811a

📥 Commits

Reviewing files that changed from the base of the PR and between 4a94848 and 1ecd0d4.

⛔ Files ignored due to path filters (1)
  • ios/cmux.xcworkspace/xcshareddata/swiftpm/Package.resolved is excluded by !**/Package.resolved
📒 Files selected for processing (14)
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/DeviceRegistryService.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobilePairingFailure.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/IrohReconnectRouteSelectionTests.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/MobilePairingFailureTests.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/DisconnectedWorkspaceShellView.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift
  • Sources/Mobile/MobileAttachTicketStore.swift
  • Sources/Mobile/MobileHostService.swift
  • cmuxTests/MobileHostIrohAdmissionTests.swift
  • cmuxTests/MobileHostServiceSettingsTests.swift
  • ios/cmux/Resources/Localizable.xcstrings
  • vendor/bonsplit

Comment thread Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift Outdated
Comment thread Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift`:
- Around line 1788-1796: Revalidate the snapshot-derived confirmedMissingIroh
result from the current structured paired-device row before consuming it. In
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
lines 1788-1796, reload the exact device/instance row and require current
connection, reauthentication, and Iroh state before
applyStoredMacUpdateRequiredFailure(disconnect: true); in lines 2277-2287,
reload the target row and require it to remain Tailscale-only before showing
update guidance. Ensure both paths derive reconnect authority from that single
current structured source.

In
`@Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite`+ReconnectRoutes.swift:
- Around line 266-275: Update the refreshed-route condition in the
currentMac.routes branch of listDevices so it returns .refreshedRoutes only when
reconnectRoutes includes an Iroh or permitted debug-loopback route, regardless
of requiresIroh; otherwise leave Tailscale-only routes for registry
classification and preserve the existing empty-route guard.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7e4344b7-c7cd-419c-aad5-c2f811aa72ac

📥 Commits

Reviewing files that changed from the base of the PR and between 1ecd0d4 and 3847206.

📒 Files selected for processing (10)
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/DeviceRegistryService.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobilePairingFailure.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite+ReconnectRoutes.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShell/MobileShellComposite.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/DeviceRegistryListParsingTests.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/IrohReconnectRouteSelectionTests.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/MobilePairingFailureTests.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/DisconnectedWorkspaceShellView.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift
  • ios/cmux/Resources/Localizable.xcstrings

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