Regression in 0.142.5: SSH remote projects opened through symlinks show “No chats”
Environment
- Windows 11 Enterprise 24H2 (build 26100.8655)
- Codex Desktop
26.623.11225.0 - Local and remote Codex app-server
0.142.5 - Linux SSH remote with a Lustre-backed repository
Issue
A remote project saved with a stable symlink path shows No chats after the recent update:
saved project: /home/<user>/source/<repo>
resolved path: /lustre/fs1/.../<user>/source/<repo>
The remote thread database still contains all conversations, but their cwd is the resolved /lustre/fs1/... path. In my case, 13 active and 2 archived user threads remained intact and were still discoverable through cross-host thread search.
Reproduction
- Add an SSH remote project using a path containing a symlink.
- Create or retain threads for that project.
- Update the remote app-server from
0.141.0to0.142.5and Desktop from26.623.9142to26.623.11225. - Restart Desktop.
- The symlink-path project shows No chats.
- Add a second remote-project entry for the resolved canonical path and restart. The missing chats appear under that project.
All app-server handshakes and thread/list requests succeeded; this is project grouping, not data loss. I did not perform a rollback, so the exact introducing version is not proven.
Expected behavior
Symlink and resolved paths that identify the same remote repository should not split or hide thread history. Preferably, threads should retain a stable remote-project ID or logical path rather than deriving project membership solely from canonical cwd.
The symlink is intentional: it keeps the project path stable if the backing filesystem changes from, for example, fs1 to fs3.
Possibly related: #15448 and #18483. This report adds a current Windows Desktop + Linux SSH remote reproduction observed after the 0.142.5 update.
10 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Thanks — I reviewed all five suggestions:
cwdalready matches the saved path.I don't believe any is an exact duplicate. In this reproduction the Linux SSH host was fully connected, app-server handshakes and
thread/listsucceeded, and two project entries on the same host behaved differently at the same time:The first path is a symlink to the second. Changing only the saved remote-project path, then restarting, restored the chats. This isolates the failure to symlink-versus-canonical-path project matching rather than reconnect state, WSL conversion, Git worktree identity, or general sidebar hydration.
This is related to the broader path-normalization family (#15448, #18483), but adds a current
0.142.5Windows Desktop + Linux SSH remote reproduction.Adding another reproduction that looks like the same underlying bug, from #31600.
Environment:
26.623.141536(CFBundleVersion4753)0.143.0Remote host layout:
Additional behavior observed:
/home/$USER, because that is the remote passwd /$HOMEpath.cwdunder the resolved realpath, e.g./data00/home/$USER/repos/project./home/$USER/repos/project), the project can appear empty / incomplete./data00/home/$USER/repos/project), the conversations appear.So in this reproduction, the default remote-project creation flow itself steers users toward the symlink spelling that does not match thread
cwdrealpaths. A fix should ideally canonicalize saved remote project paths and threadcwdconsistently, or store both display path and canonical path and use the canonical path for matching.Additional datapoint from iOS: the same remote host can show duplicate project groups on the mobile app as well.
On the remote app-server state DB, there are no threads whose
cwdstarts with/home/:All real remote thread
cwdvalues are under the resolved realpath, e.g.:However, the iOS app still displays separate project groups for the same remote directories using both spellings, for example:
So this is not only a local Desktop catalog issue. It looks like mobile/project-summary state can also retain or render the symlink spelling separately from the canonical realpath, even when the remote app-server's current thread metadata contains only
/data00/...paths.Feature request follow-up: configurable default remote project root
In addition to fixing symlink/canonical-path project matching, it would be helpful to make the New remote project picker configurable per SSH host.
A generic layout is:
The reliable workaround is to manually paste the resolved path each time a remote project is added. Trusting the real path in
config.tomldoes not affect the picker's starting directory, and there does not appear to be a documented per-host default-root setting.Requested UX:
realpath, while keeping a friendly display path if needed.A generic configuration could look conceptually like:
This would not replace canonical path matching—the app should still treat symlink and realpath equivalents as one project—but it would prevent the default picker flow from repeatedly steering users toward the problematic symlink path and remove the need to paste the real path for every new remote project.
Seems this is still not fixed in the latest ChatGPT App?
Additional regression: remote thread deep links are now local-only
This issue has become more critical because the external deep-link workaround for accessing the hidden remote threads no longer works after another Desktop update.
Environment:
26.715.8383.0I used a small external launcher as a workaround: it enumerates the intact remote threads and opens a selected one with:
After the update:
Inspection of the installed Desktop bundle shows that
codex://threads/<id>is classified as alocalConversationand is read only through the local app-server connection. The current URL parser does not preserve a remotehostId, so adding a query parameter or another path component cannot route the request to the SSH host.As a control test, I opened Codex's built-in chat switcher with
Ctrl+K, searched for the same remote task by title, and selected it. That succeeded. The logs then showed a host-aware resume with:This confirms that:
This removes a useful workaround for the symlink/canonical-path sidebar bug reported here. When the sidebar shows no chats, users can now access remote tasks only through title-based global search; searching by the UUID does not return the task, and duplicate titles are ambiguous.
A robust fix would be for
codex://threads/<uuid>to resolve the UUID through the combined host-aware task catalog, or for the URI to accept and retain an explicit host identifier, for example:I could not find a public CLI command or another documented host-aware navigation endpoint that an external launcher could use.
It's become worse now. Cannot even open such a thread any more since last update. It renders remote agents useless now :(
Could a maintainer please apply the
regressionlabel and assess severity? The behavior worked before the cited updates, remains reproducible in current Desktop builds, affects multiple platforms/users, and the latest update also removed the remote-thread deep-link workaround.I can reproduce this with two mount aliases on a shared Linux cluster, rather than a conventional symlink.
Environment
26.721.410590.145.0ilysenko/codex-desktop-linuxfrom the upstream DMG, with no optional Linux features enabledReproduction
The same remote repository is available through:
readlink -fresolves both to the second path./workspaces/...alias and restartDesktop. The project shows no tasks.
/import/...alias. The tasks appear./workspaces/...can make that loaded task remain visiblefor the current session, but the association is lost after a restart.
Evidence
The remote database contains two active tasks that are intact, unarchived, and store the
/import/...cwd.Desktop simultaneously reports:
Inspection of the installed renderer shows that remote project membership uses the host ID plus a lexical comparison between the saved project path and task cwd. Its normalizer handles separators and trailing slashes but does not resolve remote filesystem aliases. Project setup also persists the user-entered path verbatim.
Once a task is loaded, it is excluded from the paginated project query and must be grouped again through the same path matcher. This is consistent with the click-time disappearance also reported (maybe #22438 and/or #27284?)