Repository navigation
Remote-created Codex Desktop threads on connected host do not receive automation_update/load_workspace_dependencies #24280
Description
1. Feedback ID
019e4c10-cadb-7e70-8bf8-38245507bc2f
2. Product
Codex Desktop App / Remote Control / app-server thread/start dynamic tool provisioning.
3. Environment
- Host: always-on Mac Mini running Codex Desktop
- Client: MacBook Pro using the Codex remote workflow against the Mac Mini host
- Host project path:
~/Documents/Codex/projects/business-intake-task-system - Codex Desktop app/server version observed in logs:
26.519.41501 - CLI/session version:
codex-cli 0.133.0-alpha.1 - Platform: macOS / Darwin / Apple Silicon
Hostnames, user account paths, raw logs, databases, auth files, and unrelated prompt content are intentionally not included here.
4. Summary
Brand-new Codex Desktop threads created locally on the Mac Mini host receive the expected built-in Codex app dynamic tools:
codex_app.automation_updatecodex_app.read_thread_terminalcodex_app.load_workspace_dependencies
Brand-new threads created from the MacBook Pro remote workflow against the same Mac Mini host and same project receive only:
codex_app.read_thread_terminal
If a thread is created locally on the Mac Mini first and then continued from the MacBook Pro, the full tool set remains available. So remote continuation works, host-local thread creation works, but brand-new remote thread creation appears to persist a reduced dynamic-tool set at thread creation time.
5. Steps to reproduce
- On a Mac Mini host running Codex Desktop, open a new project thread locally for a project path such as
~/Documents/Codex/projects/business-intake-task-system. - Confirm the thread has
codex_app.automation_update,codex_app.read_thread_terminal, andcodex_app.load_workspace_dependencies. - From a MacBook Pro, use the Codex remote workflow to create a brand-new thread on the same Mac Mini host and same project path.
- Inspect the new remote-created thread's dynamic tools.
- Separately, create a thread locally on the Mac Mini first, then continue that same thread from the MacBook Pro.
6. Expected behavior
A brand-new remote-created thread on a connected host should receive the same built-in Codex app dynamic tools as an equivalent host-local thread for the same project.
If remote-created threads are intentionally not automation-capable, Codex should clearly label them as such and provide an action to create or open an automation-capable host-local thread.
7. Actual behavior
Remote-created brand-new threads look like normal user project threads but are persisted with only codex_app.read_thread_terminal. They do not receive codex_app.automation_update or codex_app.load_workspace_dependencies, so they cannot create or update Codex automations.
8. Confirmed PASS cases
Mac Mini direct via deep link
- Session:
019e5690-baaa-7161-8e15-5b3cbe023ffa - Dynamic tools:
codex_app.automation_updatecodex_app.read_thread_terminalcodex_app.load_workspace_dependencies
- App-server indicator:
connection_id=0 - Heartbeat/thread permission state: present in
.codex-global-state.json
Mac Mini direct via normal Codex App UI new thread
- Session:
019e5694-641d-79a3-9447-54f86074e996 - Dynamic tools:
codex_app.automation_updatecodex_app.read_thread_terminalcodex_app.load_workspace_dependencies
- App-server indicator:
connection_id=0 - Heartbeat/thread permission state: present
9. Confirmed FAIL cases
MacBook Pro remote workflow, brand-new thread on the Mac Mini host
- Session:
019e5697-260c-7d73-8941-4db90e80b7e6 - Dynamic tools:
codex_app.read_thread_terminal
- Missing:
codex_app.automation_updatecodex_app.load_workspace_dependencies
- App-server indicator:
connection_id=12 - Heartbeat/thread permission state: absent
Second MacBook Pro remote-created failing-pattern thread
- Session:
019e56fe-b398-7c32-8768-2f3e656d0828 - Dynamic tools:
codex_app.read_thread_terminal
- Missing:
codex_app.automation_updatecodex_app.load_workspace_dependencies
- App-server indicator:
connection_id=23 - Heartbeat/thread permission state: absent
10. Remote continuation result
A Mac Mini-created thread was continued from the MacBook Pro:
- Session:
019e5690-baaa-7161-8e15-5b3cbe023ffa - Dynamic tools remained:
codex_app.automation_updatecodex_app.read_thread_terminalcodex_app.load_workspace_dependencies
This shows the MacBook Pro remote client can continue and use an automation-capable thread. The failure is specific to brand-new remote thread creation.
11. Evidence
state_5.sqlitethread rows are materially identical across pass/fail forcwd,source,thread_source, model, sandbox, approval mode, CLI version, and memory mode.state_5.sqlitethread_dynamic_toolsdiffers:- host-local created threads: 3 tools
- remote-created threads: 1 tool
- Session JSONL
session_meta.dynamic_toolsdiffers on the firstsession_metaline, so the mismatch exists at or before session creation. logs_2.sqliteshows both paths usingrpc.method=thread/startandrpc.transport=stdiowithclient_name=Codex Desktopandclient_version=26.519.41501.- The visible differentiator is app-server connection identity:
- host-local creation:
connection_id=0 - remote new-thread creation: nonzero remote connection IDs such as
connection_id=12andconnection_id=23
- host-local creation:
.codex-global-state.jsonheartbeat-thread-permissions-by-idhas entries for host-created passing threads but not for remote-created failing threads.- No log evidence showed
automation_updatebeing denied or filtered by entitlement, policy, sandbox, or approval settings.
12. Important negative findings
source=vscodeis not causal. Passing and failing threads both reportsource=vscode.- GitHub Copilot Chat appears unrelated.
- No active Codex/OpenAI/ChatGPT VS Code extension or bridge was found during inspection.
- VS Code was not running during inspection.
- Remote continuation does not strip
automation_update.
13. Suspected root cause
The remote thread/start path appears to skip or use a reduced built-in dynamic-tool provisioning branch. It attaches read_thread_terminal but omits automation_update and load_workspace_dependencies, and it does not seed the same heartbeat/thread permission state that host-local thread creation seeds.
14. Workaround
Create the thread locally on the Mac Mini first, using either the Codex App UI or a deep link like:
open 'codex://threads/new?path=/Users/<user>/Documents/Codex/projects/business-intake-task-system'Then continue that same thread from the MacBook Pro. Remote continuation preserves automation_update.
15. Scrubbed local evidence available
I can provide scrubbed excerpts from the relevant thread_dynamic_tools, session_meta.dynamic_tools, and app-server log rows if maintainers want them. I am not attaching raw logs, full JSONL files, auth files, database files, or unrelated prompt content because they may contain sensitive local context.
Activity
github-actions commentedon May 23, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
ax-openai commentedon May 28, 2026
Thanks for all the details. I'm looking into remote automations. I'll keep you posted here!
jmabry commentedon Jun 4, 2026
Confirmed I'm seeing the same bug
davidwiet commentedon Aug 3, 2026
Still reproducible on 2026-08-03 with Codex Desktop release 26.727.40816 / embedded CLI 0.146.0-alpha.9.2.
New affected Remote-created thread:
019fc5db-9e4d-7892-b5b1-e697cd7792c5. Its initialsession_metahas neitherthread_sourcenordynamic_tools. Comparable locally initiated root threads on the same build havethread_source: "user"and thecodex_appbundle containingautomation_update; an automation-started thread hasthread_source: "automation"and the bundle as well.At the affected thread creation time (2026-08-03T04:22:12Z), Desktop logs begin with browser/session route capture and contain no local
thread/start->Conversation created->plugin/listsequence. A same-build locally initiated thread shows that complete sequence. Continuing the affected thread locally and switching models does not re-provision the missing tool bundle.Fresh diagnostics were uploaded through
/feedback:019fc658-2f6e-77e0-8cec-5a4382b2b2b5. The feedback description identifies the affected thread above and the prior working automation thread019f66c5-c39c-7582-81fb-7fba477f3dbe.TheLoroXD commentedon Aug 12, 2026
Independent Linux + iOS Remote reproduction and no-UI workaround
I reproduced this on 2026-08-12 with a Linux Desktop host:
26.803.81509-10.147.0-alpha.6.6Reproduction
session_meta.dynamic_tools.The remote-created thread had normal local shell/project access and these host thread-management tools:
However,
automation_updatewas absent. Opening/resuming the thread directly in Desktop did not add it. The Desktop Scheduled UI could still create schedules, and a fresh local control thread on the same app/account/host did receiveautomation_update.This rules out Linux support, app version, account entitlement, and the host automation subsystem. The capability difference is tied to the thread creation route and remains sticky after resume.
Additional project-routing inconsistency
The affected remote-created thread could call both
list_projectsandcreate_thread, but:list_projectsreturned the saved Linux project as schema v2 withprojectKind: local,hostId: local, and a UUIDprojectId.create_threadwithenvironment: {type: "local"}failed with:This overlaps #37630, although that report uses Realtime Voice/macOS while this reproduction is iOS Remote/Linux.
Confirmed workaround without manually editing automation state
A two-step local bootstrap worked:
create_threadwith aprojectlesstarget and carry the original request plus essential context into its prompt.hostId: local; its initialsession_meta.dynamic_toolsincludesautomation_update.list_projectsand thencreate_threadfor the desired saved project withenvironment: {type: "local"}.hostId: local, and also includesautomation_update.Starting the project thread manually in Desktop and then continuing it from iOS also works, as already described in this issue.
As a temporary guardrail, I added a global
~/.codex/AGENTS.mdinstruction that checks forautomation_updateon the first turn. If it is absent, the agent warns that the thread was probably initiated remotely and offers either to continue without agent-managed automations or create a fresh local thread carrying the request/context. This does not fix capability provisioning; it only prevents users from discovering the limitation halfway through a long-running task.Source-level observation
Current
mainmodels dynamic tools as creation-time input:ThreadStartParams.dynamic_tools:codex/codex-rs/app-server-protocol/src/protocol/v2/thread.rs
Lines 129 to 135 in 130c7c9
ThreadResumeParamshas no corresponding dynamic-tools refresh input:codex/codex-rs/app-server-protocol/src/protocol/v2/thread.rs
Lines 326 to 389 in 130c7c9
codex/codex-rs/core/tests/suite/sqlite_state.rs
Lines 112 to 190 in 130c7c9
That matches the observed behavior: a reduced tool set selected during remote
thread/startis persisted, and later Desktop resume cannot repair it.Expected behavior
A thread created remotely on a connected local host should receive the safe host-owned tools available to an equivalent locally-created thread. If that is intentionally restricted, the app should surface the limitation before starting work and offer a first-class Continue in a new local thread with current tools action that preserves the request and essential context.
Related: #31613 for the iOS-specific symptom and #37630 for the
list_projects/create_threadID mismatch.