Codex Desktop: active thread appears at bottom despite newest recency after pin/unpin
Summary
Codex Desktop can render an active, recently updated project thread at the bottom of the sidebar even though local/backend ordering sources place it near the top.
This appears to be a Desktop sidebar ordering/cache bug observed after opening several older threads and pinning/unpinning them. The underlying conversation remains intact and active.
Environment
- Codex Desktop:
26.721.30844(build5813) - Embedded Codex Framework:
150.0.7871.128 - macOS:
26.5.2(25F84) - Architecture:
arm64
Steps to reproduce
- Have an existing project thread with recent or in-progress conversation activity.
- Open several older project threads sequentially.
- Pin those threads, then unpin them so they should return to normal recency sorting.
- Continue the newest thread and confirm that its latest turn is in progress.
- Inspect the Desktop sidebar.
Expected behavior
The active thread should appear near the top according to its latest conversation/recency timestamp. Unpinning should return a thread to normal recency ordering.
Actual behavior
The active thread is displayed at the bottom of the Desktop sidebar. Re-navigating to the thread does not refresh the visible order.
Anonymous local evidence
archived = 0- pinned thread count = 0
- thread status:
active - newest turn status:
inProgress - SQLite
recency_at: current time, rank 3 among visible active threads - SQLite
updated_at: current time list_threadsAPI position: 4- Desktop sidebar position: bottom
- The rollout JSONL exists and is readable
The canonical session, SQLite state, and thread-list API agree that the thread is recent and active; only the visible Desktop sidebar order disagrees.
Additional observations
- The issue initially looked like recent conversations had disappeared, but direct thread reads confirmed no data loss.
- Pinning/unpinning was attempted as a visibility workaround. After unpinning, the Desktop view remained stale even though backend pinned state and recency order were correct.
- Restarting was intentionally not tested while the affected thread was actively running.
Suggested fix direction
- Recompute the unpinned sidebar list from canonical recency state after pin/unpin mutations.
- Invalidate renderer/sidebar caches when pinned state or
recency_atchanges. - Add a consistency check when visible sidebar order disagrees with
list_threadsordering. - Provide a safe user-facing Reload/Reindex conversations action that does not require restarting active work.
Related but not exact duplicates:
- #31836 — project-level Sort by Last updated does not reorder projects
- #25463 — local conversations remain readable but Desktop project views/search become stale
7 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I have a similar problem. Chats are unordered, and new chats seemingly appear in a random position around the top of my chat list under a project. It also incorrectly marks old chats as unread when i restart or update the app.
Additional Windows Desktop reproduction — importantly, this does not require a pin/unpin action.
Reproduction
Expected
A newly created or actively updated unpinned chat should remain first (or near the top according to canonical recency) within its project.
Actual
The visible project list moves the new/active chat below older chats, sometimes behind Show more. This is separate from the pinned area: pinned chats are displayed elsewhere, and the affected project-list ordering is the problem.
Read-only local evidence
That last transition suggests an optimistic-creation / metadata-reconciliation race: the renderer initially inserts the chat correctly, then re-sorts against an incomplete thread record and fails to repair the visible project list after full project/recency metadata arrives.
No session transcripts, private paths, or authentication data are included here.
Suggested regression coverage: create a normal unpinned chat in a project whose visible list is long enough to show Show more, reconcile its title/status/project association asynchronously, and assert that it remains first according to canonical recency without requiring a project switch or app restart.
I am seeing a similar sidebar-ordering problem in the ChatGPT/Codex desktop app on Windows.
Chats/sessions that previously appeared according to how recently they were being worked on no longer have an understandable order. A session that was started or actively worked on recently does not reliably move near the top, and it is unclear whether the current order is based on recency, creation time, priority, manual order, pin state, or stale cached data.
Expected behavior
This appears to be a related reproduction of the stale/incorrect sidebar ordering described in this issue.
Additional local evidence for the sidebar ordering bug. I can reproduce the disorder without changing or deleting any conversations.
Observed
list_threadsresponse returned an older-updated thread before a newer-updated thread:updatedAt=1786329870updatedAt=1786339145updated_at_ms=1786329870704,recency_at_ms=1786328482295updated_at_ms=1786339145266,recency_at_ms=1786328099811recency_at_msvalues, not newestupdated_at_msactivity. The difference is hours, so this is not a timestamp tie.Expected
For the normal unpinned conversation list, newest conversation activity should appear first, with a deterministic ID tie-breaker.
Suggested fix
Confirm the intended semantic owner for sidebar ordering. If “latest” means latest conversation activity, update the recency key whenever that activity changes or order the list by
updated_at_ms DESC, id DESC. Add a regression test whereupdated_at_msandrecency_at_msdiverge, and assert that the visible/list order matches the documented user-facing meaning.No local state was modified; this report is based on read-only SQLite and
list_threadsobservations.Same issue here on last version on MacOs. It totally destroys the work experience.
Hi @caichutian, your report looks related to a local session discovery/inventory gap rather than necessarily a lost rollout. I've released Codex Rescue Alpha5, a local read-only diagnostic tool that performs filesystem-first discovery across active and archived rollouts and cross-references SQLite/index metadata without modifying any state.
If you still have the affected local Codex directory, you can inspect it via:
No raw files or databases are needed. If you choose to share output, please review and sanitize any private repository paths or names first.