Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds a substantial iOS thread-arrangement workflow with new UI, drag/drop state management, cross-environment reorder commands, lifecycle mutations, and changes to existing sorting behavior. Unresolved findings also report a possible compile issue and stale sheet presentation state, so the scope and runtime impact require human review. Not approved because:
Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more. |
The move planner treated every enabled environment as writable, so a reorder-capable server that dropped its connection kept stale rows in the canonical section and could receive writes aimed at a dead client. Rows outside the connected set now remain anchors but are never assigned keys, matching the review finding on pingdotgg#11379. Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Two review findings on pingdotgg#11379: moveThread now captures the section before awaiting so a mid-flight pin/unpin cannot misapply confirmed keys, and a spread rewrite that fails partway surfaces the confirmed assignments via FeatureThreadMovePartialError so the sidebar reflects the writes that actually landed. Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
Addressed the Macroscope findings on the latest push (
|
|
Note for reviewers on the Macroscope findings re-flagged against the drag-and-drop head (
|
The native client had no way to rearrange the thread list even though servers already support the fractional order-key protocol used by web drag and React Native mobile's Move up / Move down. Add both menu actions on pinned and active rows, planned against the canonical section across environments and written through thread.pin.reorder / thread.active.reorder, capability-gated and disabled at section edges. Pinning now also takes the top of the arranged run when the server supports it. Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
The move planner treated every enabled environment as writable, so a reorder-capable server that dropped its connection kept stale rows in the canonical section and could receive writes aimed at a dead client. Rows outside the connected set now remain anchors but are never assigned keys, matching the review finding on pingdotgg#11379. Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Two review findings on pingdotgg#11379: moveThread now captures the section before awaiting so a mid-flight pin/unpin cannot misapply confirmed keys, and a spread rewrite that fails partway surfaces the confirmed assignments via FeatureThreadMovePartialError so the sidebar reflects the writes that actually landed. Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Generated with Devin (swe-2-high, T3 Code/Cursor harness) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Replace the context-menu Move up/down actions with direct hold-and-drag reordering on the Home thread list, per review feedback. A long-press lifts a row inside its own section (pinned or active); the drop plans fractional order-key writes from the post-drop displayed order — the same input web passes to planPinnedReorder. A stationary hold still opens the context menu. - UICollectionView drag/drop delegates + diffable reorderingHandlers; drop proposals clamp to the dragged row's section so pinned rows can't cross the divider and shelf rows/search results/headers never lift. - planDrop() replaces movePlanner(): arbitrary-position drops with the same writability rules (reorder-capable + connected environments only; disconnected rows anchor but are never written). - pendingReorder holds the dropped order against mid-flight stream updates and converges on the common rows; a failed or partial write snaps back to the true model state. New lifts are blocked while a write is outstanding and no-op drops skip the write. - Stream updates defer while a drag is active (hasActiveDrag) so the lifted row can't shift under the finger. - FeatureThreadMoveDirection/MoveOptions removed; lift gating is a plain writable+connected check. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
524f5bd to
6e5f135
Compare
There was a problem hiding this comment.
🟡 Medium
Incoming navigation requests leave showingThreadArrangement set, so the workspace changes behind the still-present ThreadArrangementView and .newTask requests cannot present NewThreadView until the unrelated sheet is dismissed. Reset showingThreadArrangement in dismissTransientPresentations() along with the other transient presentation state.
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/swift-ios/Features/Workspace/WorkspaceView.swift around line 641:
Incoming navigation requests leave `showingThreadArrangement` set, so the workspace changes behind the still-present `ThreadArrangementView` and `.newTask` requests cannot present `NewThreadView` until the unrelated sheet is dismissed. Reset `showingThreadArrangement` in `dismissTransientPresentations()` along with the other transient presentation state.
e999c32
into
pingdotgg:t3code/rebuild-mobile-app-swift
SwiftUI could not arrange threads across Pinned, Active, Snoozed, and Settled like React Native.
Open Arrange threads from a thread menu. Drag a handle to reorder Pinned or Active, move between them, settle a thread, or bring a snoozed or settled thread back. VoiceOver actions provide the same supported moves. Normal thread holds still open menus. The Home swipe and scrolling implementation is unchanged.
This updates the existing order-key implementation against the latest SwiftUI branch. Order stays shared across environments and clients. Each write goes to the thread's owning server. The planner reserves hidden keys and rejects unsupported, disabled, or disconnected writes before starting a move. Failed writes retain confirmed keys and refresh every touched environment.
Verification:
git diff --checkpass.3b96928191.Original order-key work is retained from this PR. Updated in Codex.