You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Codex App: add manual refresh button (or auto-sync) for archived and cross-surface conversations #11907
Related: programmatically managing threads via MCP or codex app-server (thread/start, turn/start) also requires a restart before Codex.app (or other sources) will show/bump the thread, even if filters match.
Codex.app ships (and runs) its own codex binary, but this is definitely something to synchronize between surfaces for every $CODEX_HOME/config.toml universe.
Minimally switching to a thread in the app itself should trigger an attempt to reload if thread is changed later than the last change the app sees.
Idealy app should be able to track background executions and show spinning icon when the tread is working in the background. This would let us have a smooth looking automation workflow. Right now an orchestrator thread dispatching background threads doesnt let us see what the background threads are doing in real time. And that is the real automation powerhouse.
Adding a current reproduction where this is more than a missing refresh action: the same conversation has persistently different visible turn history across the desktop client and VS Code extension.
The same conversation can show different history in the desktop client and the VS Code extension.
Missing synchronization can happen in both directions.
The more common direction is VS Code extension -> desktop: the desktop client is missing the latest several turns that are visible in the extension.
Quitting and restarting the desktop client does not restore those missing turns.
The VS Code restart/recovery direction has not yet been tested reliably.
This appears to be persistent cross-surface thread hydration/state divergence, not only a delayed conversation-list refresh.
Impact
Users cannot determine which surface contains the authoritative transcript. Continuing from the stale surface can cause requests to be repeated, omit recent decisions, or make the user act on an outdated understanding of what Codex already executed. For an agent that can edit files and run commands, the same thread must have a trustworthy and auditable history on every supported surface.
Expected behavior
A conversation ID should resolve to the same ordered and complete set of persisted turns in both surfaces.
Reopening either surface should rehydrate the canonical thread state and repair missed events.
If synchronization cannot be completed, the UI should show a clear stale/out-of-sync warning rather than silently presenting an incomplete transcript.
A manual refresh action is useful as a fallback, but durable canonical rehydration is required.
Please treat this as a correctness/reliability bug rather than only an enhancement request.
I can also reproduce this specifically with CLI → ChatGPT Desktop archive sync. But as the original bug states, I think this is just one example of the greater issue of sync.
In the already-open ChatGPT Desktop app, the thread still appears active in the sidebar.
Clicking it gives:
Failed to resume chat
session ... is archived
Restarting ChatGPT Desktop fixes the sidebar state.
So the archive succeeds, but Desktop does not refresh/reconcile the thread list after an external CLI archive. This looks like the CLI → Desktop version of the cross-surface refresh bug.
We found a working workaround (but please fix this 🙏🏾) in verified with the Desktop-bundled Codex runtime 0.147.0-alpha.6.5.
After a private app-server successfully archives or unarchives a thread, we publish the same lifecycle broadcast used by Desktop over ~/.codex/ipc/ipc.sock:
thread-archived v2 with hostId, conversationId, and cwd
thread-unarchived v1 with hostId and conversationId
Desktop then refreshes immediately without restarting. When a shared app-server daemon is available, routing the mutation through that instance also propagates the update.
This is an undocumented, best-effort workaround and only covers events observed while connected. A supported cross-client lifecycle invalidation—or simply refreshing thread/list when history/archive opens—would remove the need for it.
CLI exits 0 and prints: Unarchived session <title> ().
The running desktop still does not show the task in its project/sidebar.
Repeating the CLI command exits 1 with: Error: failed to unarchive session. It does not refresh the desktop.
Independent app-server reproduction and positive control
A separate official app-server's thread/unarchive also successfully restores the original task.
thread/resume on the same ID and a read-only pwd turn succeed; original cwd/history remain available.
After that process exits, the desktop's read tool can read the completed turn, but opening the task page still shows it as archived.
Desktop unarchive then fails with: no archived rollout found for thread id .
The user reproduced the stale state twice and confirmed restarting the desktop restores visibility.
Positive control: archive AND unarchive both through the desktop's built-in task tools return success and immediately restore visible sidebar state without restarting. The user confirmed this separately.
Expected behavior and impact
The desktop should reconcile a successful external CLI/app-server unarchive with canonical task state without requiring a full app restart. Opening the task or archived list should recover missed lifecycle changes, or a supported refresh/invalidation API should be available.
This blocks reliable same-task handoff to an event-driven local integration while allowing the user to keep the desktop open for other tasks. No new/forked task was used as a substitute, and the minimal CLI reproduction does not depend on our integration or a model call.
This looks related to #33860's stale UI symptoms, but our initial independent unarchive returns success, not the initial failed-to-read-unarchived-thread error. We have not established the internal root cause and have not injected private IPC notifications or modified the client database.
No real task IDs, task titles, repository paths, credentials, or transcripts are included in this report.
Activity
nilswx commentedon Feb 16, 2026
Related: programmatically managing threads via MCP or
codex app-server(thread/start,turn/start) also requires a restart before Codex.app (or other sources) will show/bump the thread, even if filters match.Codex.app ships (and runs) its own
codexbinary, but this is definitely something to synchronize between surfaces for every$CODEX_HOME/config.tomluniverse.slobodanmargetic988 commentedon Feb 23, 2026
Minimally switching to a thread in the app itself should trigger an attempt to reload if thread is changed later than the last change the app sees.
Idealy app should be able to track background executions and show spinning icon when the tread is working in the background. This would let us have a smooth looking automation workflow. Right now an orchestrator thread dispatching background threads doesnt let us see what the background threads are doing in real time. And that is the real automation powerhouse.
cixiangtao commentedon Aug 6, 2026
Adding a current reproduction where this is more than a missing refresh action: the same conversation has persistently different visible turn history across the desktop client and VS Code extension.
Environment
26.730.61639(com.openai.codex, build 6234)1.131.0(arm64)openai.chatgpt@26.727.40816Observed behavior
This appears to be persistent cross-surface thread hydration/state divergence, not only a delayed conversation-list refresh.
Impact
Users cannot determine which surface contains the authoritative transcript. Continuing from the stale surface can cause requests to be repeated, omit recent decisions, or make the user act on an outdated understanding of what Codex already executed. For an agent that can edit files and run commands, the same thread must have a trustworthy and auditable history on every supported surface.
Expected behavior
Please treat this as a correctness/reliability bug rather than only an enhancement request.
mikejurka commentedon Aug 11, 2026
I can also reproduce this specifically with CLI → ChatGPT Desktop archive sync. But as the original bug states, I think this is just one example of the greater issue of sync.
Restarting ChatGPT Desktop fixes the sidebar state.
So the archive succeeds, but Desktop does not refresh/reconcile the thread list after an external CLI archive. This looks like the CLI → Desktop version of the cross-surface refresh bug.
anandx commentedon Aug 18, 2026
We found a working workaround (but please fix this 🙏🏾) in verified with the Desktop-bundled Codex runtime
0.147.0-alpha.6.5.After a private app-server successfully archives or unarchives a thread, we publish the same lifecycle broadcast used by Desktop over
~/.codex/ipc/ipc.sock:thread-archivedv2 withhostId,conversationId, andcwdthread-unarchivedv1 withhostIdandconversationIdDesktop then refreshes immediately without restarting. When a shared app-server daemon is available, routing the mutation through that instance also propagates the update.
This is an undocumented, best-effort workaround and only covers events observed while connected. A supported cross-client lifecycle invalidation—or simply refreshing
thread/listwhen history/archive opens—would remove the need for it.newjoy commentedon Sep 13, 2026
Reproduced the unarchive direction of this cross-surface synchronization issue on September 13, 2026.
Environment
Minimal reproduction
Keep the desktop app running and use an existing, idle local task.
Archive that task through the desktop's built-in task tool.
In a separate process, run the bundled official CLI:
CLI exits 0 and prints: Unarchived session <title> ().
The running desktop still does not show the task in its project/sidebar.
Repeating the CLI command exits 1 with: Error: failed to unarchive session. It does not refresh the desktop.
Independent app-server reproduction and positive control
Expected behavior and impact
The desktop should reconcile a successful external CLI/app-server unarchive with canonical task state without requiring a full app restart. Opening the task or archived list should recover missed lifecycle changes, or a supported refresh/invalidation API should be available.
This blocks reliable same-task handoff to an event-driven local integration while allowing the user to keep the desktop open for other tasks. No new/forked task was used as a substitute, and the minimal CLI reproduction does not depend on our integration or a model call.
This looks related to #33860's stale UI symptoms, but our initial independent unarchive returns success, not the initial failed-to-read-unarchived-thread error. We have not established the internal root cause and have not injected private IPC notifications or modified the client database.
No real task IDs, task titles, repository paths, credentials, or transcripts are included in this report.