SwiftUI PR cleanup
pingdotgg/t3code · all authors · supporting PRs for t3code/rebuild-mobile-app-swift · drafts included · default branch main · reconciled 2026-10-02T00:09:17.158022+00:00
17 supporting PRs closed. 12 small fixes applied. 3 behavior additions declined. 2 broader implementations declined.
The rewrite keeps React Native behavior. This pass kept small correctness, performance, and native interaction fixes. The main rewrite #5178 remains open.
Applied head: bb01adbf90. Focused native tests: 241 passed, 1 existing skip, 0 failed. The native CI check passed on the applied head, confirmed 2026-10-02T00:11:16.188315+00:00. Independent review of device, review, and accepted-message changes found no concrete regression. Two old base-branch test expectations were updated for current attachment and provider counts.
Small fixes applied (12)
Only the focused changes were ported. The stale rewrite history was excluded. The queued-message port kept the existing UI and changed acceptance feedback only.
| PR and purpose | Decision and evidence | Completed action | Checks and state |
|---|---|---|---|
| #10733 fix(swift-ios): compare Windows checkout paths consistently Compare remote Windows project roots and selected worktree roots correctly without changing POSIX case handling. | The current Swift function still uses iOS file URL normalization for remote Windows paths. The patch is 18 added production lines with focused path cases. It changes no feature, screen, contract, or provider behavior. Preserve all three fix commits because the second fixes an actual POSIX regression in the first.Source and parity evidenceapps/swift-ios/Features/Workspace/NewTaskWorkspaceModels.swift · NewTaskWorkspaceDefaults.normalizedWorktreePath | Applied in 5ecd432969; source PR closed. Closure note +67 / −4; 3 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead a041532ee9; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10735 fix(swift-ios): preserve literal plus signs in pairing tokens Preserve literal plus signs in form bodies for direct pairing, managed environment token exchange, and relay JWT token exchange. | All three current form encoders still emit raw plus signs from Foundation percentEncodedQuery. Form decoding treats these as spaces. Escaping raw plus signs to %2B is a small serialization correctness fix and restores normal RN encoding behavior. Existing percent escapes remain untouched.Source and parity evidenceapps/swift-ios/Core/PairingService.swift · PairingService.exchange | Applied in 1df2c071a8; source PR closed. Closure note +85 / −3; 5 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead cfc8bbe42c; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10736 fix(swift-ios): classify numeric local addresses consistently Use parsed numeric IP addresses to classify LAN hosts and share the classifier with connection details. | Current probe still classifies fc.example.com, fe80.example.com, and 10.example.com as local based on prefixes. The details classifier has a separate IPv6 interpretation that treats ::fd00 as unique-local. The intended patch corrects existing connection defaults and error diagnosis with 16 added and 40 removed production lines. No new connection feature.Source and parity evidenceapps/swift-ios/Core/LocalNetworkProbe.swift · LocalNetworkProbe.isLocalHost | Applied in 97c2f23521; source PR closed. Closure note +53 / −40; 4 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead 229d43a039; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10739 fix(swift-ios): recover when a keepalive send stalls Recover from a suspended native WebSocket Ping send by closing only that connection after a bounded deadline. | Current keepalive loop awaits the send indefinitely and cannot reach its next missed-Pong check while send is suspended. Eleven production lines add a deadline using existing interval and expected connection UUID. Existing reconnect and subscriptions are retained. The focused fixture verifies replacement and late old-send completion.Source and parity evidenceapps/swift-ios/Core/WebSocketRPC.swift · keepaliveLoop / sendKeepalive | Applied in 1ce981fb1b; source PR closed. Closure note +53 / −0; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead 114dda31ce; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10740 fix(swift-ios): avoid connecting for cancelled requests Check unary request cancellation before starting WebSocket transport or allocating request state. | Current requestRaw starts connection and path monitoring before it checks Task.isCancelled inside the continuation. A single production line prevents needless native transport work for already-cancelled callers. Existing subsequent requests still start normally. No product behavior expansion.Source and parity evidenceapps/swift-ios/Core/WebSocketRPC.swift · requestRaw | Applied in 0345221677; source PR closed. Closure note +9 / −0; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead fd20500a4e; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #12655 fix(swift-ios): defer composer focus until after view updates Defer native composer become/resignFirstResponder calls until after the SwiftUI view update; ignore superseded focus requests and cancel pending attachment focus. | The current rewrite retains both unsafe synchronous responder paths. This is a contained native correctness/performance repair, with no added feature or layout change. Both touched files in the current rewrite are byte-identical to this intended commit parent, so the port should apply cleanly.Source and parity evidenceapps/swift-ios/Features/Chat/FeatureComposerTextInput.swift · updateUIView | Applied in 6f1ae28e30; source PR closed. Closure note +44 / −7; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead 4f46c4d722; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10734 fix(swift-ios): start queued uploads before draft persistence completes Free a completed transfer concurrency slot and start the next queued upload before awaiting attachment draft persistence. | The current upload coordinator still starts queued jobs only after a successful upload awaits persistThenPublish. This delays queued transfers on slow local saves. The two actual intended commits together are a tiny scheduler repair with one focused receipt-driven test. It preserves ready-after-persistence and existing ownership/cancellation behavior.Source and parity evidenceapps/swift-ios/Features/Shared/FeatureAttachmentUploadCoordinator.swift · transferReturned | Applied in a2825e2cb2; source PR closed. Closure note +33 / −5; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead b3f7b8107a; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10755 fix(swift-ios): preserve remote source-control paths Preserve the owning server working-directory string when subscribing to source-control status. | Real one-line remote-path bug still exists. iPhone URL normalization changes Windows drive and UNC paths; preserving context.cwd matches React Native and existing Swift remote file operations. No new feature.Source and parity evidenceapps/swift-ios/App/NativeFeatureClient.swift:3137 · sourceControlStatusEvents | Applied in 5f157632db; source PR closed. Closure note +51 / −1; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead ec0a2198c0; CONFLICTING / DIRTY. Test Server 2. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10762 perf(swift-ios): skip validated stale detail replay Avoid reducing validated stale detail events whose sequence was already applied. | Small, independent performance repair. Current Swift fully reduces duplicates before discarding their result; RN discards stale sequence before reduction. Tip validates envelope and owning thread before skipping, preserving malformed/foreign repair behavior. It needs none of the prior scheduler, completion-recovery, or passive-bootstrap layers.Source and parity evidenceapps/swift-ios/App/NativeFeatureClient.swift:4692-4702 · applyDetailItem | Applied in e4eaa597ab; source PR closed. Closure note +123 / −2; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead dca56985ba; CONFLICTING / DIRTY. No failing checks recorded on source head. 6 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10760 fix(swift-ios): show queued messages until server acceptance Show queued message status until server acceptance and publish accepted state before durable outbox cleanup; retain accepted state through cleanup failure and stale reads. | Current Swift already displays Queued for both text and attachment-only user bubbles, making that visual addition obsolete. Its model still publishes acceptance only after awaited outbox removal and emits an empty message delta, so a small real state/update bug remains. Port only model and focused tests; optionally generalize existing image-only attachment accessibility copy. Do not add a second Queued label.Source and parity evidenceapps/swift-ios/Features/Chat/ThreadDetailView.swift · FeatureMessageView.messageBody | Applied in 1a395b1b45; source PR closed. Closure note +116 / −7; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead 084bc0fb2f; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #14683 fix(swift-ios): ignore stale device reads after revocation Prevent a late device reload from restoring revoked devices or replacing newer feedback. | A small generation guard and serialized access change fix an existing race. No device capability is added.Source and parity evidenceExisting React Native device management is the reference. This preserves the same removal workflow. | Applied in fb39fcb6c3; source PR closed. Closure note +271 / −84; 2 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead d1c473b8c4; MERGEABLE / UNSTABLE. Contract fixtures and native tests, Native fingerprint diff. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #14684 fix(swift-ios): retain review content during refresh failures Keep review content when a refresh fails, show the failure, and allow retry. | The current Swift code swallows load failures. React Native already reports review and diff errors.Source and parity evidenceReact Native useReviewDiffData and ReviewSheet already expose failures and retry. | Applied in 380a48cac9; source PR closed. Closure note +214 / −17; 6 files including tests Confidence: high | Focused native tests passed on the combined head. Main rewrite CI and review remain separate.Assessed source stateHead badb34dfe0; MERGEABLE / UNSTABLE. Contract fixtures and native tests. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
Closed for scope (5)
The two larger repairs describe real remaining problems. Their closure notes preserve those problems and request smaller fixes.
| PR and purpose | Decision and evidence | Completed action | Checks and state |
|---|---|---|---|
| #11530 feat(swift-ios): customize thread swipe actions Add persisted, independent left/right thread swipe action settings, selectable full-swipe actions, reset, and an interactive Settings preview. | This is an extra Swift-only preference workflow and changes gesture defaults. It adds configurable full-swipe delete and leading pin actions. The current RN version uses fixed, caller-selected swipe actions rather than user swipe settings, so this directly conflicts with the requested rewrite scope.Source and parity evidenceapps/swift-ios/Features/Workspace/HomeThreadCollectionView.swift · trailingSwipeActions / HomeThreadSwipeAction.trailingActions | Closed without applying. Closure note +497 / −224; 9 intended files Confidence: high | Merge conflicts on the stale branch. Closure is a scope decision.Assessed source stateHead b4ce8b3db6; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #14021 fix(swift-ios): show last message age on the thread activity row Add time since the latest non-queued user/assistant message beneath the Swift agent activity row; remove a receipt header introduced by its prerequisite stack. | The layer adds a new last-message-age indicator that React Native does not have. Current Swift also has no receipt header to fix or remove. It replaces activity detail with a new timed label and depends on a large old repair stack, so it is outside the requested parity work.Source and parity evidenceapps/swift-ios/Features/Chat/ThreadDetailView.swift · FeatureThreadWorkingIndicator | Closed without applying. Closure note +90 / −68; 6 intended files Confidence: high | Merge conflicts on the stale branch. Closure is a scope decision.Assessed source stateHead 2e25d10a9e; CONFLICTING / DIRTY. No failing checks recorded on source head. 2 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10756 fix(swift-ios): preserve queued messages during incomplete hydration Preserve queued messages while sidebar hydration is incomplete, then recover absent threads through an authoritative owning-server HTTP lookup. | The underlying premature discard is real, but this implementation adds a cross-layer thread-recovery and sending path. In particular it sends to threads absent from the live sidebar and keeps absent threads until a structured server 404. Current React Native deliberately removes existing-thread queue entries when a live shell omits the thread. This is a meaningful behavior difference, beyond a simple parity repair.Source and parity evidenceapps/swift-ios/Features/Root/FeatureRootModel.swift:1649-1655 · restoreOutbox | Closed without applying. Closure note +411 / −19; 8 intended files Confidence: high | Merge conflicts on the stale branch. Closure is a scope decision.Assessed source stateHead 66aa8a43ab; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10758 fix(swift-ios): release accepted commands before optional refreshes Return Send and Stop after command acceptance instead of waiting for optional HTTP reads; keep accepted messages visible while detail catches up. | Current awaited optional reads can hold Send/Stop, so the latency issue is real and RN behavior is better. However the complete intended layer is seven commits adding a coalescing accepted-command scheduler, cancellation ownership, superseded-read behavior, and a second message-retention lifecycle. This exceeds the narrow simple-fix cleanup scope. It is not superseded or an extra UI feature.Source and parity evidenceapps/swift-ios/App/NativeFeatureClient.swift:2325-2329 · sendMessageResolved | Closed without applying. Closure note +992 / −29; 4 intended files Confidence: High on the verified problem; medium on the cost judgment | Merge conflicts on the stale branch. Closure is a scope decision.Assessed source stateHead 93fe314002; CONFLICTING / DIRTY. No failing checks recorded on source head. 0 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
| #10759 fix(swift-ios): recover missing completed thread replies Repair completed turns whose selected transcript lacks final content, preserve newer detail state against delayed shell metadata, and correct cached pagination state on reopen. | Real completion/state repair remains absent, but this introduces forced authoritative snapshot recovery based on shell completion and alters stream/cache synchronization. It is broader than a small isolated correction and should not bring the preceding scheduler stack into this cleanup pass. A stale-shell metadata guard could be extracted later if needed. Not superseded.Source and parity evidenceapps/swift-ios/App/NativeFeatureClient.swift:5284-5336 · synchronizeActiveDetail | Closed without applying. Closure note +522 / −31; 2 intended files Confidence: High on the verified problem; medium on the cost judgment | Merge conflicts on the stale branch. Closure is a scope decision.Assessed source stateHead 392394d4a7; CONFLICTING / DIRTY. No failing checks recorded on source head. 1 unresolved review comments were inspected. Final state: CLOSED Updated 2026-10-01 |
Method
Inspected the full inventory, complete source diffs, intended commits, current Swift code, current React Native behavior, checks, and review findings. Fifteen old source branches had divergent rewrite history, so their GitHub diffs included about 300 unrelated files. The intended patches were reviewed separately and tested together. All closures were verified after their explanations were posted.
Contribution policy revision: 10ac2f2ba4. The Swift target has no branch protection or branch rules. Passing local focused tests does not mean all GitHub checks or main-rewrite review are complete. No browser or manual device verification was performed. No new supporting SwiftUI PR was found in the final inventory.
Prepared by GPT-6.1-Sol through the Codex harness in T3 Code, with three read-only cohort reviewers and one focused integration review.