[Desktop Remote SSH] inter-task tools stopped before update; 0.148 lacks codex_app MCP replacement
Summary
In Codex Desktop connected to a remote Linux host, previously working first-party inter-task coordination stopped working before the remote Codex runtime was updated. Updating the remote runtime from 0.145.0 to stable 0.148.0 did not restore the capability.
The failure currently has two observable forms:
- A retained Desktop task whose manifest still contains
send_message_to_threadreaches the old dynamic-tool handler, but the handler now rejects the call with a migration message telling the caller to use thecodex_appMCP server. - A fresh Desktop user task on
0.148.0retains read-only task tools (list_threads,read_thread,wait_threads) but omits the effectful inter-task tools (create_thread,send_message_to_thread, andhandoff_thread). No callablecodex_appMCP replacement ortool_searchdiscovery path is present.
This report intentionally does not claim that 0.148.0 caused the initial regression. The first failure was recorded while the remote runtime was still 0.145.0; the update was attempted as a possible fix and did not fix it.
Environment
- Surface: Codex Desktop
- Execution host: remote Linux over Codex Remote SSH (
remote-ssh-discovered:<host>) - Model in both the working and failing retained task:
gpt-5.6-sol - Remote runtime before the manual update:
codex-cli 0.145.0 - Remote runtime after the manual update: stable
codex-cli 0.148.0 - Desktop About-dialog build and Desktop host OS are not exposed inside the remote task
- No user-authored
mcp_servers.codex_appconfiguration is present
Exact task IDs and raw transcripts are intentionally omitted from the public report. They can be supplied through a private support or in-app feedback channel if needed.
Observed timeline (UTC)
All successful and rejected sends below came from the same retained Codex Desktop task, used the same gpt-5.6-sol model, the same remote host projection, and the same destination task.
2026-08-25 15:00:06, runtime0.145.0:send_message_to_threadsucceeded and returned{ "threadId": "<target>" }.2026-08-25 15:38:22, runtime0.145.0: another send succeeded and returned{ "threadId": "<target>" }.2026-08-26 07:11:17, before the runtime update and still on0.145.0: the same tool and destination failed with:
``text``
This app tool is no longer available through dynamic tools. Use the codex_app MCP server. If that server is unavailable on this host, task delegation is unavailable.
2026-08-26 08:14:52, still before the update: the same rejection reproduced.- The remote runtime transition occurred later: Desktop-created task metadata still recorded
0.145.0at08:46:12; newly created task metadata recorded0.148.0starting at09:49:36. 2026-08-26 09:57:37: a fresh Desktop user task on0.148.0was created. Its callablecodex_appcatalog contains:
list_threadslist_archived_threadsread_threadwait_threads- title/pin/archive helpers
But it omits:
create_threadsend_message_to_threadhandoff_thread
There is also no tool_search and no callable mcp__codex_app__* replacement.
- The injected Codex Desktop guidance still instructs the task to search for and use
create_threadandsend_message_to_thread, so the guidance and callable tool catalog disagree.
Reproduction
- Open a Codex Desktop task backed by a remote Linux host.
- From a task that still has the legacy dynamic tool definition, call
send_message_to_threadfor a valid existing task on that same host. - Observe the migration rejection directing the caller to the
codex_appMCP server. - Create a fresh Desktop task on the same remote host.
- Inspect the callable tool inventory.
- Observe that read/list/wait remain available while create/send/handoff are absent, and that the advertised MCP replacement is not available.
Expected behavior
The Desktop task-tool migration should be atomic for Remote SSH hosts:
- If dynamic handlers are disabled, the first-party
codex_appMCP replacement must already be provisioned and callable. - A user-authorized task should be able to create a normal user-owned Desktop task and send a visible message to an existing Desktop task.
- The read and write halves of the task-management surface should not be silently split.
- App guidance must match the callable tool catalog.
- If policy intentionally removes these capabilities, Codex should expose a structured capability diagnostic instead of referring to an unavailable MCP server.
Impact
This breaks established user-owned multi-task orchestration:
- coordinator tasks cannot create worker tasks;
- workers cannot send completion callbacks to the coordinator;
- migration-coordination notifications cannot be delivered;
spawn_agentis not an equivalent replacement because it creates an internal subagent rather than a user-owned Desktop task;codex execis not an equivalent replacement because the resulting backend session is not reliably registered or navigable in the Desktop sidebar.
Causality boundary
The available evidence supports a task-tool routing/provisioning regression, but not a specific triggering release:
- The first failure occurred on
0.145.0before the user updated. - Stable
0.148.0did not restore the bridge. - The exact rejection text indicates an intended migration from dynamic tools to
codex_appMCP, while the replacement is absent on this Remote SSH path.
Related reports:
- #39978 — exact dynamic-tools-to-
codex_app-MCP rejection on a remote devbox; closed without a public resolution - #40852 — fresh report where read/list/wait remain but effectful task tools are omitted
- #33598 — earlier broader loss of the Desktop coordinator control surface
9 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I can confirm the same failure on another Codex Desktop Remote SSH workflow today (2026-08-26 UTC).
Environment visible from the remote task:
codex-cli 0.147.0The read side continued to work throughout:
list_threadsresolved the exact destination and host projectionread_threadreturned its current turn and tool historywait_threadsreturned valid cursors and status transitionsThe caller's deferred tool catalog also advertised
codex_app__send_message_to_threadwith its full schema. However, every invocation returned exactly:There was no callable
mcp__codex_app__send_message_to_threadreplacement. This reproduced multiple times before a network interruption. After the destination Remote SSH host reconnected,list_threadsandread_threadagain resolved the task successfully, butsend_message_to_threadstill returned the same migration rejection. That reconnect result helps rule out destination discovery, destination availability, and user authorization as causes.Operational impact in this case was significant: a coordinator could observe a deployment worker and receive its progress, but could not wake the now-idle worker after the connection recovered. The only safe workaround was asking the human to open the destination task and send the continuation message manually.
handoff_threadwould not be an equivalent workaround because it mutates checkout/worktree placement, and internal subagents are not user-owned Desktop tasks.No task IDs, internal hostnames, credentials, repository names, or deployment endpoints are included here. I can provide a sanitized tool transcript through a private channel if maintainers need it.
Additional sanitized Remote SSH variant where the regression expands beyond the effectful half of the task-tool family.
Environment:
codex-cli 0.147.0Inside the affected remote task, the agent performed a direct
ALL_TOOLSinventory search for:list_threadsread_threadwait_threadssend_message_to_threadNone of those native task tools were present. The only search result was an unrelated Codex Security cancellation tool whose description happened to contain the phrase "Codex thread". The agent therefore correctly reported that the native coordination tools were not exposed and did not use an app-server, rollout, or repository fallback.
As a control, from another Desktop task in the same controller session, exact
read_threadandwait_threadscalls against the affected remote task and host projection succeeded. They resolved the task as idle/completed. This rules out a disconnected host, missing task, or bad host selection as the reason for the target task's reduced tool surface.This extends both variants already documented here:
Expected: first-party task-tool migration and per-task injection should be atomic. A Remote SSH task should not receive Desktop coordination instructions while the entire corresponding native tool family is silently omitted.
No task IDs, hostnames, addresses, repository names, paths, prompts, credentials, or account data are included.
The issue can be solved by downloading the previous Windows build from the OpenAI CDN https://persistent.oaistatic.com/codex-app-prod/releases/26.810.7004.0/ChatGPT-x64.msix and then reinstalling it:
It's a bug in the new app.
Reproduced on local Windows Desktop, not Remote SSH.
Desktop: 26.820.7780.0
App-server: 0.150.0-alpha.8
Existing local task advertises legacy dynamic list_projects,
create_thread, and fork_thread tools. Every invocation returns:
“This app tool is no longer available through dynamic tools.
Use the codex_app MCP server. If that server is unavailable on
this host, task delegation is unavailable.”
Full app restart and Windows reboot did not help. Logs show the
app-server connected, thread_tools enabled, the request reaching
the dynamic renderer, and success=false. The direct codex_app MCP
replacement is not exposed to the task.
This broadens #40865 from Remote SSH to Windows Desktop/local host.
I am seeing this too on Windows Codex Desktop with a managed Remote SSH host. Fresh remote tasks keep
list_threads,read_thread, andwait_threads, but losesend_message_to_thread,create_thread,fork_thread, andhandoff_thread. The same local Desktop task can still send a message to the remote task successfully, so the connection and destination are healthy. This appears to match the missingcodex_appreplacement/injection problem described here.+1 This is a really frustrating regression
Happening on MacOS
Update — 2026-08-27: reproduced in a fresh task on stable 0.150.1 after SSH restart
I tested the remote-runtime update and a full SSH reconnection as possible recovery steps. They did not restore the bridge. This update does not change the causality boundary in the issue body: the initial regression was first observed before the remote runtime was updated.
After updating the remote host and restarting the SSH-backed Desktop connection, I created a brand-new Desktop task on the same Remote SSH project rather than reusing a retained task.
Confirmed from the fresh task:
0.150.10.150.1cli_version: 0.150.1codex queueis availableThe inter-task bridge is still unavailable:
codex_app__create_threadcodex_app__send_message_to_threadcodex_app__handoff_threadcodex_tuinamespace or other callable replacement for these operationsDirect probes returned:
No new task was created, and no callback/message could be delivered.
This rules out the following as sufficient explanations or recovery steps:
0.145.0or0.148.0remote CLIThe evidence continues to point to Desktop-side tool projection/provisioning for the Remote SSH task surface rather than the remote CLI/app-server version. Official OpenAI documentation also still describes Remote as supporting starting new chats and sending follow-up instructions: https://learn.chatgpt.com/docs/remote-connections
I worked around it by explicitly registering the bundled Codex app-tools MCP server in ~/.codex/config.toml:
[mcp_servers.codex_app]
command = "cmd.exe"
args = [
"/d", "/s", "/c", "call",
'C:\Users\<user>\.codex\plugins\cache\openai-bundled\codex-app-tools\<version>\scripts\launch_codex_app_tools_mcp.cmd',
'C:\Users\<user>\.codex\plugins\cache\openai-bundled\codex-app-tools\<version>\server.mjs'
]
enabled = true
default_tools_approval_mode = "approve"
startup_timeout_sec = 10
tool_timeout_sec = 3600
[plugins."codex-app-tools@openai-bundled"]
enabled = true
After restarting Codex, I tested from a newly created task:
One wrinkle remained: an older, long-running task continued resolving create_thread through the retired dynamic-tool shim, apparently because its tool registry was established before the configuration change. Newly created tasks used the MCP server correctly.
For that existing task, I temporarily invoked the configured MCP server through the app-provided CODEX_APP_TOOLS_PIPE_PATH and CODEX_THREAD_ID. That allowed calls to list_projects, create_thread, set_thread_title, and read_thread. This was only a compatibility workaround; the preferred solution is for existing tasks to refresh their tool registry and resolve create_thread through the configured codex_app MCP server automatically.