Skip to content

Prove live Iroh relay token rollover before release - #8499

Merged
azooz2003-bit merged 24 commits into
mainfrom
task-iroh-relay-token-rollover
Jul 20, 2026
Merged

azooz2003-bit merged 24 commits into
mainfrom
task-iroh-relay-token-rollover

Conversation

@azooz2003-bit

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

Copy link
Copy Markdown
Collaborator

Summary

  • add a long-running relay-only release gate that crosses the old JWT expiry without changing EndpointID or the admitted QUIC connection
  • prove the control stream, fresh independent event delivery, and a flow-controlled 32 MiB artifact lane remain live through credential replacement
  • add a negative relay-expiry gate that disables refresh and requires the original transport to close
  • expose credential and connection continuity only to Debug release-gate code, extend redacted reports, and correct relay expiry documentation

Verification

  • CmuxIrohTransport: 424 tests passed
  • CmuxMobileShell: 617 tests passed
  • CmuxMobileRPC: 106 tests passed
  • release-gate script tests: 36 passed
  • diff check: passed
  • current-head tagged macOS build and isolated Simulator compile are running
  • live staging relay-only and relay-expiry workflows will run before merge

Residual risk

The artifact proof assumes the pinned noq per-stream receive window remains below 32 MiB. A dependency update that increases the window must increase the gated payload too.


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


Summary by cubic

Adds a Debug-only release gate to prove live Iroh relay credential rollover and hard-expiry using local continuity evidence and scenario-driven timeouts. Now consumes iroh-ffi@1.0.2-cmux.4 for stable connection identity and reuses verified discovery on first dial to avoid broker rate-limit drops.

  • Bug Fixes

    • Reuse the last verified discovery snapshot on first dial when the broker rate-limits duplicate lookups, preventing initial connection failures.
  • Migration

    • Run gates:
      • Rollover: scripts/run-iroh-release-gate.sh --mode relay-only --tag <tag> (330s soak).
      • Expiry: scripts/run-iroh-release-gate.sh --mode relay-expiry --tag <tag> (refresh auto-disabled).
    • Env:
      • CMUX_IROH_RELEASE_GATE_SCENARIO=standard|relay_rollover|relay_expiry.
      • CMUX_IROH_DISABLE_RELAY_CREDENTIAL_REFRESH=1 for expiry.

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

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added relay-expiry release-gate support alongside standard and relay-rollover scenarios.
    • Release-gate reports now include scenario details plus expanded relay/continuity/artifact/expiry verification outputs.
    • Added support for continuity identification and closure observation (used by release-gate tooling).
  • Bug Fixes
    • Improved relay credential expiry handling so older expiry timers can’t incorrectly terminate refreshed connections.
  • Documentation
    • Updated guidance on relay credential expiry and the associated connection-lifecycle behavior.
  • Tests
    • Expanded release-gate and transport continuity/closure test coverage.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds relay rollover and relay expiry release-gate scenarios, propagates transport continuity and closure evidence through Iroh and mobile RPC layers, makes relay credential refresh configurable, and updates simulator workflows, reports, validation, and tests.

Changes

Iroh relay continuity and release gate

Layer / File(s) Summary
Transport continuity and credential lifecycle
Packages/Shared/CMUXMobileCore/..., Packages/Shared/CmuxIrohTransport/..., Packages/iOS/CmuxMobileRPC/..., ios/cmuxPackage/Sources/cmuxFeature/...
Transport continuity identifiers, closure observations, relay credential expiry access, and configurable automatic credential refresh are wired through native connections, pooled transports, sessions, RPC, and runtime composition.
Release-gate probe contracts and continuity checks
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/...
Debug release-gate scenarios, continuity result fields, artifact validation, rollover verification, expiry disconnect verification, and related tests are added.
Scenario runner and application wiring
ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/..., ios/cmuxPackage/Sources/cmuxFeature/..., ios/cmux/cmuxApp.swift
Scenario-aware runner reports, timeouts, readiness checks, runtime identity providers, debug UI wiring, and runner tests are implemented.
Simulator mode and report orchestration
.github/workflows/..., scripts/..., docs/..., web/services/relay/token.ts
The relay-expiry mode is added to CI and launch scripts, scenario-specific report validation is expanded to schema v3, and relay expiry documentation is updated.

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

Possibly related PRs

Sequence Diagram(s)

sequenceDiagram
  participant GateScript
  participant MobileIrohReleaseGateRunner
  participant MobileIrohRuntimeComposition
  participant MobileShellComposite
  participant CmxIrohPooledByteTransport
  GateScript->>MobileIrohReleaseGateRunner: launch selected scenario
  MobileIrohReleaseGateRunner->>MobileIrohRuntimeComposition: read endpoint identity and credential expiry
  MobileIrohReleaseGateRunner->>MobileShellComposite: run scenario probe
  MobileShellComposite->>CmxIrohPooledByteTransport: inspect continuity and closure
  CmxIrohPooledByteTransport-->>MobileShellComposite: return continuity or closure evidence
  MobileShellComposite-->>MobileIrohReleaseGateRunner: return scenario verification result
  MobileIrohReleaseGateRunner-->>GateScript: emit schema v3 report
Loading

Suggested reviewers: lawrencecchen


Important

Pre-merge checks failed

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

❌ Failed checks (1 error, 1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Cmux Swift Blocking Runtime ❌ Error New DEBUG runtime code adds Task.sleep polling/timeout loops in MobileShellComposite+IrohReleaseGate.swift and MobileIrohReleaseGateRunner.swift, which the rule forbids in non-test Swift. Replace sleeps/polling with explicit async signals/state transitions (callbacks, notifications, async sequences) or move the timing logic into test-only scaffolding.
Docstring Coverage ⚠️ Warning Docstring coverage is 15.71% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Cmux Swift Logging ❓ Inconclusive placeholder2 placeholder2
✅ Passed checks (22 passed)
Check name Status Explanation
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 The only production source change is an actor adding async protocol conformances and forwarding methods; it doesn’t introduce MainActor coupling or unsafe shared Sendable state.
Cmux Browser Automation Off-Main ✅ Passed No diff touches the scoped browser automation files or related browser symbols, so the off-main WebKit wait rule isn’t implicated.
Cmux Expensive Synchronous Load ✅ Passed No touched production Swift file adds RestorableAgentSessionIndex.load() or other heavy agent-history/file scans on MainActor or interactive paths.
Cmux Cache Substitution Correctness ✅ Passed The only snapshot/cached read is in DEBUG-only release-gate code, with explicit non-persistence docs; no persistence/history/undo path now trusts a stale cache.
Cmux No Hacky Sleeps ✅ Passed No new hacky sleeps or polling loops were added; the shell script waits on notifyutil with a bounded timeout, and the only sleep stub is test-only.
Cmux Algorithmic Complexity ✅ Passed No new scalable collection hotspot: the PR adds only bounded polling/single-pass scans in debug-only release-gate code, with fixed-size key/path sets kept tiny.
Cmux Swift Concurrency ✅ Passed Diff adds async/await and structured/stored Tasks only; no new DispatchQueue, Combine, or completion-handler APIs, and the lone callback-hops are boundary-safe.
Cmux Swift @Concurrent ✅ Passed No changed Swift code adds missing @concurrent or invalid concurrent annotations; new async work stays on @MainActor/actors or is intentionally UI-bound.
Cmux Swift Package Boundaries ✅ Passed PASS: the only production Swift change is in Packages/Shared/CmuxIrohTransport, a SwiftPM target; it adds protocol forwarding plus a test, not app-target feature logic.
Cmux Swiftpm Lockfiles ✅ Passed Diff has no Package.swift, Package.resolved, Xcode project, or .gitignore changes; static audit found no cmux-owned .gitignore ignoring Package.resolved.
Cmux User-Facing Error Privacy ✅ Passed The added output is generic/debug-only; no new user-facing errors or recovery copy expose vendor names, secrets, env vars, or raw upstream messages.
Cmux Full Internationalization ✅ Passed No production user-facing text was added; changed Swift release-gate code is DEBUG-only, and the rest is tests/docs/config tokens with no locale catalogs touched.
Cmux Swiftui State Layout ✅ Passed Changed SwiftUI files only add debug release-gate wiring; scans found no GeometryReader, ObservableObject/@published, list-row store refs, or body-time state writes.
Cmux Architecture Rethink ✅ Passed The sleeps/polling/observers are isolated to DEBUG-only release-gate/test harness code; the runtime change is a single-owner flag for a negative test path.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The diff only touches transport code/tests; no NSWindow/NSPanel/WindowGroup/WindowController changes or cmuxAuxiliaryWindowIdentifiers issues are present.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source/docs/tests/scripts; none are logs, caches, build outputs, temp dirs, or other source artifacts.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The only changed production source adds real transport capabilities, not a DEBUG/test-only seam; the release-gate protocols are explicitly for release gates, and the new test lives under Tests/.
Cmux No Ambient Global State ✅ Passed HEAD^..HEAD only changes CmxIrohDeferredByteTransport; the new continuity/closure APIs are actor instance methods, with no new top-level funcs, globals, or singletons.
Title check ✅ Passed The title is concise and accurately highlights the main change: proving Iroh relay token rollover before release.
Description check ✅ Passed The description covers the summary and verification/testing details and is mostly complete, though some template sections are omitted.
✨ 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 task-iroh-relay-token-rollover

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 19, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a Debug-only relay credential rollover/expiry release gate that proves live Iroh connections survive JWT rollover and disconnect correctly on hard expiry, without changing EndpointID or the admitted QUIC session. It also bumps iroh-ffi to 1.0.2-cmux.4 for stable stableId() connection identity.

  • New relay-rollover gate: soaks for 330 s while driving RPC heartbeats and a flow-controlled 32 MiB artifact lane over a single QUIC connection; verifies endpoint, QUIC connection, control stream, independent event subscription, and artifact-lane continuity after the relay JWT rotates.
  • New relay-expiry gate: disables automatic credential refresh via CMUX_IROH_DISABLE_RELAY_CREDENTIAL_REFRESH=1, awaits the transport's exact closure observation after expiry, and verifies the disconnect is tied to the admitted connection and not a reconnect.
  • Production auth fix in MobileHostIrohRuntime+Lifecycle.swift: extracts shouldReconcileAuthObservation into a tested static function that suppresses redundant reconciliation when the account state is already stable and a transition is in flight.

Confidence Score: 5/5

Safe to merge; all gate code is #if DEBUG-only, production changes are narrow and well-tested.

Production changes are limited to: a tested shouldReconcileAuthObservation static extraction in the auth lifecycle, a one-shot verified-discovery cache in CmxIrohRegistryContextProvider, and the automaticRelayCredentialRefreshEnabled flag plumbed through CmxIrohClientRuntime to CmxIrohRelayCredentialCoordinator (always true in release builds). All release-gate additions are guarded by #if DEBUG. The iroh-ffi bump to 1.0.2-cmux.4 is reflected in all three cmux-owned Package.resolved lockfiles.

No files require special attention.

Important Files Changed

Filename Overview
Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileShellComposite+IrohReleaseGate.swift Large addition of relay-rollover and relay-expiry probe logic; all inside #if DEBUG. Soak loop, artifact lane, and heartbeat polling are deliberate CI-orchestration patterns with no production impact.
Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohRelayCredentialCoordinator.swift Adds automaticRefreshEnabled flag and installInitialCredentialAfterRetry for relay-required activation; renames startLoop to startLoopIfEnabled to gate refresh scheduling. Bounded-backoff retry loop is correct.
Sources/Mobile/MobileHostIrohRuntime+Lifecycle.swift Extracts auth-observation reconciliation guard into a tested internal static function. New logic correctly suppresses redundant reconciliation when account state is stable and a transition is already in flight.
Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/CmxTransport.swift Adds CmxByteTransportContinuityIdentifying and CmxByteTransportClosureObserving production protocols plus CmxTransportClosureObservation value type. All are safe, opaque, and never serialized.
Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohRegistryContextProvider.swift Adds a one-shot verifiedDiscoverySnapshot cache that reuses a freshly fetched discovery response on the first dial, bounding revocation visibility to 30 s. Cache is invalidated on binding change.
ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/MobileIrohReleaseGateRunner.swift Adds scenario-aware routing, extended 420 s timeout for non-standard gates, and completedReport helper consolidating the previously duplicated inline Report construction; schema bumped from 2 to 3.
scripts/run-iroh-release-gate.sh Adds relay-expiry mode, bumps CMUX_ATTACH_MINT_MAX_ATTEMPTS to 600 and Python timeout to 480 s, adds scenario validation in the report checker, and bumps schemaVersion check to 3.
scripts/lib/mobile-attach.sh Splits CLI stdout/stderr, captures exit status, and emits a structured last_reason on timeout; error detail is never echoed to stderr, preventing token leakage through the attach log.
Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohConnectionContinuityIdentifying.swift New package-private protocol that isolates stableId() behind a separate conformance so alternate endpoint implementations are not burdened with the diagnostic handle.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Gate as run-iroh-release-gate.sh
    participant Runner as MobileIrohReleaseGateRunner
    participant Probe as MobileShellComposite+IrohReleaseGate
    participant Coord as CmxIrohRelayCredentialCoordinator
    participant Conn as CmxIrohLibConnection

    Gate->>Runner: "CMUX_IROH_RELEASE_GATE_SCENARIO=relay_rollover"
    Runner->>Probe: runIrohReleaseGateProbe(scenario:.relayRollover, soakDurationSeconds:330)
    Probe->>Conn: connectionContinuityID() - connectionBefore
    Probe->>Coord: relayCredentialExpiresAt() - expiryBefore
    Probe->>Probe: waitForArtifact 32 MiB flow-controlled
    loop 330 s soak
        Probe->>Runner: workspace.list heartbeat
    end
    Probe->>Conn: connectionContinuityID() - connectionAfter
    Probe->>Coord: relayCredentialExpiresAt() - expiryAfter
    Probe-->>Probe: "assert connectionAfter == connectionBefore"
    Probe-->>Probe: "assert expiryAfter > expiryBefore"
    Probe->>Probe: control-stream round-trip
    Probe->>Probe: reassert event subscription
    Probe->>Probe: drain artifact bytes
    Runner->>Gate: Report schemaVersion 3 passed true

    Gate->>Runner: "CMUX_IROH_RELEASE_GATE_SCENARIO=relay_expiry"
    Runner->>Coord: "automaticRefreshEnabled=false"
    Runner->>Probe: verifyUnrefreshedRelayExpiry
    Probe->>Conn: transportClosureObservation()
    loop poll until expiry+20s
        Probe->>Runner: workspace.list heartbeat
        alt connectionClosed near expiry
            Probe->>Conn: closureObservation.waitUntilClosed()
            Probe-->>Runner: "unrefreshedExpiryDisconnectVerified=true"
        end
    end
    Runner->>Gate: Report scenario relay_expiry passed
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Gate as run-iroh-release-gate.sh
    participant Runner as MobileIrohReleaseGateRunner
    participant Probe as MobileShellComposite+IrohReleaseGate
    participant Coord as CmxIrohRelayCredentialCoordinator
    participant Conn as CmxIrohLibConnection

    Gate->>Runner: "CMUX_IROH_RELEASE_GATE_SCENARIO=relay_rollover"
    Runner->>Probe: runIrohReleaseGateProbe(scenario:.relayRollover, soakDurationSeconds:330)
    Probe->>Conn: connectionContinuityID() - connectionBefore
    Probe->>Coord: relayCredentialExpiresAt() - expiryBefore
    Probe->>Probe: waitForArtifact 32 MiB flow-controlled
    loop 330 s soak
        Probe->>Runner: workspace.list heartbeat
    end
    Probe->>Conn: connectionContinuityID() - connectionAfter
    Probe->>Coord: relayCredentialExpiresAt() - expiryAfter
    Probe-->>Probe: "assert connectionAfter == connectionBefore"
    Probe-->>Probe: "assert expiryAfter > expiryBefore"
    Probe->>Probe: control-stream round-trip
    Probe->>Probe: reassert event subscription
    Probe->>Probe: drain artifact bytes
    Runner->>Gate: Report schemaVersion 3 passed true

    Gate->>Runner: "CMUX_IROH_RELEASE_GATE_SCENARIO=relay_expiry"
    Runner->>Coord: "automaticRefreshEnabled=false"
    Runner->>Probe: verifyUnrefreshedRelayExpiry
    Probe->>Conn: transportClosureObservation()
    loop poll until expiry+20s
        Probe->>Runner: workspace.list heartbeat
        alt connectionClosed near expiry
            Probe->>Conn: closureObservation.waitUntilClosed()
            Probe-->>Runner: "unrefreshedExpiryDisconnectVerified=true"
        end
    end
    Runner->>Gate: Report scenario relay_expiry passed
Loading

Reviews (6): Last reviewed commit: "fix(iroh): reuse verified discovery for ..." | Re-trigger Greptile

Comment thread ios/cmuxPackage/Sources/cmuxFeature/MobileIrohRuntimeComposition.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: 3

🤖 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
`@ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/MobileIrohReleaseGateRunner.swift`:
- Around line 136-151: Consolidate the relay rollover timing values into shared
type-level constants, including the soak duration and scenario timeout values.
Update the runProbe wiring, scenarioPassed threshold, and timeout configuration
to reference Self.relayRolloverSoakDurationSeconds and the corresponding timeout
constants, eliminating duplicated 330/90/420 literals while preserving current
behavior.
- Around line 312-330: Update the relay-expiry settings observation loop in the
operation flow to check Task.isCancelled on each iteration, matching the
cancellation handling in the readiness and post-probe path loops. When
cancellation is detected, exit the loop and propagate the existing
cancellation/timeout outcome so the suspended operation and settings
subscription do not remain active.

In
`@Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohClientSession.swift`:
- Around line 202-213: Update connectionContinuityID() to use a single guard
that verifies the session is open, unwraps connection, and casts it to any
CmxIrohConnection & CmxIrohConnectionContinuityIdentifying before calling
isClosed(). Check isClosed() only after the continuity-capable cast succeeds,
preserving nil for closed, missing, or unsupported connections.
🪄 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: 24d88de7-68d9-43e3-a462-f111617caa14

📥 Commits

Reviewing files that changed from the base of the PR and between ddcc374 and 81bdb30.

📒 Files selected for processing (32)
  • .github/workflows/iroh-release-gate.yml
  • Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/CmxTransport.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohClientRuntime+Policy.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohClientRuntime+RelayPolicy.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohClientRuntime.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohClientSession.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohConnectionContinuityIdentifying.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohLibConnection.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohPooledByteTransport.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohRelayCredentialCoordinator.swift
  • Packages/Shared/CmuxIrohTransport/Tests/CmuxIrohTransportTests/CmxIrohClientSessionTests.swift
  • Packages/Shared/CmuxIrohTransport/Tests/CmuxIrohTransportTests/CmxIrohRelayCredentialCoordinatorTests+Refresh.swift
  • Packages/Shared/CmuxIrohTransport/Tests/CmuxIrohTransportTests/TestIrohConnection.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCClient.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCSession.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileIrohReleaseGateProbeFailure.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileIrohReleaseGateProbeResult.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileIrohReleaseGateResponseValidator.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileIrohReleaseGateScenario.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileShellComposite+IrohReleaseGate.swift
  • Packages/iOS/CmuxMobileShell/Tests/CmuxMobileShellTests/MobileIrohReleaseGateResponseValidatorTests.swift
  • docs/iroh-app-transport-architecture.md
  • ios/cmux/cmuxApp.swift
  • ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/MobileIrohReleaseGateHostView.swift
  • ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/MobileIrohReleaseGateRunner.swift
  • ios/cmuxPackage/Sources/CmuxIrohReleaseGateSupport/MobileIrohReleaseGateScene.swift
  • ios/cmuxPackage/Sources/cmuxFeature/MobileIrohRuntimeComposition.swift
  • ios/cmuxPackage/Tests/cmuxFeatureTests/MobileIrohReleaseGateRunnerTests.swift
  • scripts/lib/mobile-attach.test.mjs
  • scripts/mobile-dev-launch.sh
  • scripts/run-iroh-release-gate.sh
  • web/services/relay/token.ts

@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: 1

🤖 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/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCClient.swift`:
- Around line 148-153: Move the release-gate-only transportClosureObservation()
accessors out of production type definitions into dedicated `#if` DEBUG extension
files, preserving the client-to-session delegation and existing visibility.
Update
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCClient.swift#L148-L153
and
Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCSession.swift#L193-L201;
both sites require removal from the main files and relocation to the debug
extensions.
🪄 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: 6ea1e4e0-1fa2-4e1d-93af-0d176d844c19

📥 Commits

Reviewing files that changed from the base of the PR and between 81bdb30 and 5e91dbc.

📒 Files selected for processing (8)
  • Packages/Shared/CMUXMobileCore/Sources/CMUXMobileCore/CmxTransport.swift
  • Packages/Shared/CmuxIrohTransport/Sources/CmuxIrohTransport/CmxIrohPooledByteTransport.swift
  • Packages/Shared/CmuxIrohTransport/Tests/CmuxIrohTransportTests/CmxIrohClientSessionPoolTests.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCClient.swift
  • Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCSession.swift
  • Packages/iOS/CmuxMobileShell/Sources/CmuxMobileShellReleaseGateSupport/MobileShellComposite+IrohReleaseGate.swift
  • ios/cmuxPackage/Sources/cmuxFeature/MobileIrohRuntimeComposition+ReleaseGate.swift
  • ios/cmuxPackage/Sources/cmuxFeature/MobileIrohRuntimeComposition.swift

Comment thread Packages/iOS/CmuxMobileRPC/Sources/CmuxMobileRPC/MobileCoreRPCClient.swift Outdated
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