feat(sidebar): sync pinned thread order - #5528
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
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. Comment |
There was a problem hiding this comment.
One finding: the new web reorder path reuses ThreadPinningUnsupportedError, whose caller-visible message describes pinning rather than pin reordering. Everything else (namespace subpath imports in the new migration, decider/projector event handling, contracts schema additions) follows the service conventions.
Posted via Macroscope — Effect Service Conventions
ApprovabilityVerdict: Needs human review 1 blocking correctness issue found. This PR introduces a substantial new feature (synced pinned thread ordering) with new database schema, API commands/events, and cross-platform UI changes. Additionally, there is an unresolved high-severity review comment identifying a potential bug in legacy server handling that requires attention. You can customize Macroscope's approvability policy. Learn more. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 5869138. Configure here.

Pinned threads are global, but their order was fixed by creation time. This adds manual ordering that is stored by the server and follows the user across connected clients.
What changed
thread.pin.reordercommand andthread.pin-reorderedeventScreenshots
The integrated browser pass moved “Review API changes” from third to first with the keyboard-accessible drag control, confirmed that only the moved thread received a persisted order, and verified the same order after a full reload.
Verification
Related to #698.
Built with GPT-5 Codex in the Codex desktop harness.
Note
Medium Risk
Cross-cutting orchestration, persistence, and multi-client ordering with multi-thread compaction sequences; rollback limits transient inconsistency if a request fails mid-compaction.
Overview
Pinned threads can now be manually ordered and that order is stored on the server so it syncs across connected clients, instead of being fixed by creation time.
The stack adds
PinnedThreadOrder(bounded rational strings),thread.pin.reorder/thread.pin-reordered, apinned_orderDB column (migration 037), and a separatethreadPinReorderingcapability so older pinning servers are not sent reorder commands. Pinned lists usesortPinnedThreadswith creation-time fallback when no order exists; moves usually update one thread via a mediant between neighbors, with full-list compaction when gaps are exhausted.Web gets dnd-kit drag handles on pinned rows, context-menu move up/down, optimistic pending orders, and rollback on failure. Mobile (home + thread sidebar) exposes Move up / Move down in row menus with the same sequential apply/rollback pattern; reorder is disabled when the full pinned set is not visible (filters/shelves). User docs cover organizing threads in the sidebar.
Reviewed by Cursor Bugbot for commit 70e50e6. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add synced pinned thread reordering via drag-and-drop and context menu
PinnedThreadOrderrational number type (e.g.3/7) stored on threads to represent manual sort position; threads without an order fall back to creation-time ordering via a stable FNV-1a hash.thread.pin.reordercommand andthread.pin-reorderedevent through the full stack: contracts, server decider/projector, DB migration (037_ProjectionThreadsPinnedOrder), snapshot queries, and client-runtime reducer.threadPinReorderingserver capability; mixed-capability environments (e.g. older servers) show an alert/toast instead of partially applying changes.Macroscope summarized 70e50e6.