Remote Control created-thread card loses source host and opens child task on controller-local host
Summary
A task running on an enrolled Remote Control host can create a child task in a project local to that host. The creation succeeds and the child runs normally, but the created-thread card shown on the controller loses the source host and routes the child thread ID to the controller's local app-server.
This is not task loss or an Iris execution failure. Cross-host task listing later resolves the same thread ID to the Iris Remote Control environment, and an explicit read through that host succeeds.
Environment
- Controller: macOS 27.0 (26A5388g)
- Codex Desktop: 26.727.51351, build 6119
- Codex runtime: 150.0.7871.182
- Producer: Iris, native Windows, enrolled through Remote Control
- Affected child thread:
019fce28-1fc8-77a0-8872-6a28efd8c28c
Reproduction
- Open a Codex task running on a Remote Control host.
- From that task, invoke
create_threadfor a project local to the remote host. - Observe the successful result from the producer:
``json``
{
"threadId": "019fce28-1fc8-77a0-8872-6a28efd8c28c",
"hostId": "local"
}
Here, local correctly means local to Iris.
- On the Mac controller, click the resulting created-thread card.
- The child fails to load / is looked up on the controller-local app-server.
- List tasks across connected hosts.
- The same thread is returned with an owner equivalent to:
``text``
remote-control:<iris-environment-id>
- Reading the thread through that resolved host succeeds. The child executed and persisted normally on Iris.
Actual behavior
The producer-relative host alias local crosses the Remote Control boundary without being rebased to the controller-visible Iris host. The created-thread card then navigates using only the bare thread ID and treats it as controller-local.
Expected behavior
A child task created on a Remote Control host should open immediately from the controller.
Codex should either:
- translate producer-relative
localto the producer's controller-visibleremote-control:<environment-id>identity and preserve it through the card/navigation path; or - resolve the globally unique thread ID across connected hosts, using the source task's host as the primary context, before navigation.
Another host's literal local must never be interpreted as controller-local.
Diagnostic evidence
Inspection of the installed Desktop bundle indicates two compounding seams:
- The
create_threadadapter appends its process-relative destination host to the result. No producer-to-controller rebase occurs when the producer is a Remote Control Desktop instance. - The created-thread directive/card schema retains
threadIdorclientThreadId, but nothostId. Card navigation then uses a local route based only on the thread ID.
By contrast, the later cross-host list/read path enumerates connected app-server managers and resolves the canonical Remote Control host, which explains why the same task becomes readable after discovery/hydration.
The relevant Desktop adapter/card implementation does not appear to be present in the public repository. The public app-server code exposes Remote Control environmentId, but controller host association is a Desktop-layer concern.
Suggested regression test
From a controller:
- Execute
create_threadon a Remote Control host using a project local to that host. - Return the result to the controller.
- Before any later catalog synchronization, click the created-thread card.
- Assert that the returned/associated host is the canonical Remote Control environment and that the child opens successfully.
- Assert that the producer's
localalias is never routed to the controller-local app-server.
Related issues
- #33359 — closest known mechanism: remote thread IDs are hydrated against the local app-server until cross-host lookup provides the correct host
- #32524 — selected remote host routed as
hostId=local - #36748 — one Remote Control task surfaces with inconsistent
remote-controlandlocalbindings - #25092 — remote conversations disappear locally while remaining intact remotely
1 Comment
Additional reproduction on macOS (observed 2026-08-16):
list_projectsas a selectable registered remote project.create_threadroute had no explicit destination-host selector and returned the producer-relativehostId: "local". From the controller, the result did not preserve a clear Mac-mini host identity and the workflow appeared to fail / route ambiguously.This is confusing because the parent task is visibly executing on the remote Mac mini, so a user reasonably expects a child commissioned by that task either to remain on the same host or to offer an explicit host/project selector. The controller should not reinterpret another host's
local, and the created-task card/result should retain the canonical remote host identity.This also overlaps #32775's missing explicit destination-host route. The Intel architecture appears incidental; this looks like Desktop host identity/routing rather than a CPU-specific failure. No private repository names, paths, or source material are included here.