Windows Desktop + WSL needs an end-to-end release gate across config, state, plugins, exec, and recovery
Summary
Windows Desktop + WSL appears to have a systemic integration gap. Several independent Codex Desktop subsystems cross the Windows/WSL boundary with different assumptions about paths, config homes, runtime platform, plugin cache roots, SQLite state, browser/computer-use helpers, and session recovery.
This is not one isolated bug. It is a pattern across multiple user-visible failures where each component works in one environment model, but the combined Windows Desktop + WSL product path breaks because there is no single authoritative environment contract.
This issue is intended as an umbrella / release-gate issue. The concrete bugs should remain in their individual issues, but they likely need a common Windows+WSL validation matrix rather than one-off fixes.
Current status
Remote control itself worked in the latest tested setup. The user was able to enable/use remote control after the update.
The failures were concentrated in the WSL-backed Desktop integration path:
- local SQLite migration compatibility after update
- WSL vs Windows config/home selection
- Windows/WSL path normalization
- bundled plugin cache reconciliation
- Chrome/browser-use bridge setup
- computer-use native helper availability
- unified exec process launch routing
- long-running goal/session recovery from Windows-hosted rollout files
Affected environment shape
Sanitized representative setup:
Product: Codex Desktop Windows Store app
Windows package family: OpenAI.Codex_*_x64__2p2nqsd0c76g0
Mode: run Codex in Windows Subsystem for Linux enabled
Codex home: Windows profile path, visible to WSL as /mnt/c/Users/<user>/.codex
Workspace: WSL/Linux project path or /mnt/c-backed project path
App-server: Linux/WSL Codex runtime launched by the Windows Desktop app
This hybrid mode is not equivalent to either pure Windows-native or pure Linux-native Codex. It needs dedicated coverage.
Concrete failures already filed
Config and runtime identity
- #22759: Windows Desktop + WSL app-server can read WSL
~/.codexinstead of the Windows Codex home, causing split-brain config behavior. - #22185: Windows Desktop + WSL workspace with
unified_exec=truetries toCreateProcess/bin/bashand fails withENOENT.
Plugin/path bridge
- #22760: Recommended skills refresh can create malformed literal Windows-path directories under
vendor_importsin WSL mode. - #21971: Chrome plugin Node REPL bootstrap fails from WSL due to Windows path/trust mismatch.
- #24268: Bundled plugin cache path is synthesized as invalid
C:\mnt\c\Users\...instead of a real Windows or WSL path.
Current-build data point for #24268:
Codex Desktop package: OpenAI.Codex_26.527.3686.0_x64__2p2nqsd0c76g0
Desktop release string in logs: 26.527.31326
bundled_plugins_marketplace_install_failed ... C:\mnt\c\Users\<user>\.codex\plugins\cache\openai-bundled\chrome\26.527.31326
State and update safety
- #23777: Windows Desktop WSL app-server fails to launch due to CRLF/LF SQLx migration checksum mismatch after update.
- #23053: Desktop update prompt should show target versions, component diff, and environment impact.
Session/history scalability and recovery
- #25215:
/goalcan make Desktop threads unrecoverable by growing rollout JSONL beyond resume/list limits. - #24263: Renderer reload left turn state out of sync and spammed
Item not found in turn state. - #24260:
gpt-5.5xhigh turn stalled before first output; WSL Desktop logs lacked durable diagnostics to distinguish queueing/retry/reconnect/backend state. - #24262: Performance trace upload timeout did not retain local trace artifact, reducing debuggability.
Project-location ergonomics
- #22532: Desktop should avoid OneDrive-backed Documents as the default Windows project location. This is amplified in WSL because
/mnt/cfilesystem costs and sync-layer churn stack together.
Additional current-build computer-use evidence
In the latest tested Windows Store build family, remote control worked but computer-use/native-helper setup did not in WSL-backed mode.
Sanitized log lines:
remoteControl/status/read ... errorCode=null
browser_use_availability_resolved available=false browserPane=true platform=Windows reason=wsl-disabled release=26.527.31326
[computer-use-native-pipe] computer-use native pipe startup failed errorMessage="Windows Computer Use helper paths are unavailable"
A Settings > Computer use plugin toggle also failed once with:
Failed to update plugin enabled state
Configuration was modified since last read. Fetch latest version and retry.
This suggests remote pairing and computer-use helper availability should be validated independently in the Windows+WSL matrix.
Root cause hypothesis
The recurring root cause is not one bad path conversion call. It looks like there is no single environment contract shared by Desktop, app-server, plugins, exec, state, and helper processes.
Different subsystems appear to infer environment state independently:
- Some paths are treated as Windows paths.
- Some paths are treated as WSL
/mnt/cpaths. - Some Windows APIs receive WSL/Linux absolute paths like
/bin/bash. - Some WSL-side/plugin operations receive Windows drive-letter paths.
- Some native Desktop code synthesizes invalid mixed paths like
C:\mnt\c\.... - SQLite migrations are shared across Windows and WSL runtimes even though migration bytes/checksums differed by line endings.
- The app update flow does not appear to preflight active WSL-backed state, long-running goals, or large rollout recovery risk.
Expected behavior
Windows Desktop + WSL should be a first-class supported mode with a stable contract:
- one authoritative Codex home/config/state decision per launched app-server;
- explicit Windows path and WSL path forms available where needed;
- no subsystem should concatenate/convert paths ad hoc;
- plugin and helper processes should know whether they run Windows-native, WSL-native, or cross-boundary;
- update should preflight WSL-specific risks before replacing the runtime;
- if computer use is unavailable in WSL mode, the UI should say that clearly and avoid offering a broken toggle path;
- long-running sessions/goals should survive app updates and be recoverable even when local rollout files are large.
Suggested product fixes
- Define a single launch-time environment contract object for Desktop-launched app-servers, including:
codex_home_windows
codex_home_wsl
workspace_windows
workspace_wsl
runtime_platform
host_platform
shell_platform
feature_capabilities
plugin_cache_root_windows
plugin_cache_root_wsl
- Centralize Windows<->WSL path conversion and forbid manual string concatenation such as
C:+/mnt/c/....
- Add integration tests for at least these modes:
Windows-native Desktop, Windows home
Windows Desktop + WSL app-server, Windows home via /mnt/c
Windows Desktop + WSL app-server, WSL-native home
Windows Desktop + WSL workspace on /home/<user>
Windows Desktop + WSL workspace on /mnt/c
OneDrive-backed Windows Documents workspace
- Add release-gate smoke tests for:
app-server startup after update
SQLite state/log DB compatibility
thread/list and thread/resume
long rollout / latest-compaction recovery
unified exec / shell command startup
skills/recommended-skills refresh
bundled plugin reconcile
Chrome/browser-use bootstrap
computer-use availability/toggle
remote control status/read and pairing
- Make update UX WSL-aware. Before accepting an update, Desktop should warn when:
WSL mode is enabled
active goals exist
rollout files exceed a safe threshold
state DB is shared across Windows/WSL runtimes
bundled plugin cache is in a mixed Windows/WSL path mode
- Improve diagnostics so user-facing crash dialogs and logs show the actual failing subsystem, not just the most recent stderr warning.
Why this matters
The Windows+WSL path is likely the natural path for many Windows developers using Codex Desktop. When this mode breaks, it can affect startup, config, shell tools, plugins, browser/computer-use, update safety, and recovery of long-running agent work.
The latest incident chain was especially expensive: the user paused a useful long-running /goal to update to a build with remote control/computer-use features, hit Windows+WSL startup/state problems, then could not resume the large goal rollout and had to recover via backups and a hand-built continuation handoff.
Privacy note
All paths, user names, thread IDs where unnecessary, and project details are redacted. Raw .codex state, rollouts, and logs are not attached because they contain private conversation and local project data.
9 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Additional related issue that should stay separate from this umbrella:
I added current 26.527 Windows Desktop + WSL evidence there rather than opening a duplicate. This belongs in the WSL release-gate matrix because misleading fatal diagnostics made the recent update incident much harder to triage: the UI pointed at
thread_toolsand plugin icon warnings while the actionable failure was app-server unavailability during large-thread/goalrecovery.Additional existing issue to include in the release-gate map:
configVersionConflictafter plugin/marketplace refresh updatesconfig.toml.I added the current Windows Desktop + WSL Computer use plugin toggle failure there. In the recent incident, a user-facing plugin enable/disable action failed with
Configuration was modified since last read. Fetch latest version and retry.while bundled plugin reconciliation was active. That is another example of Desktop subsystems crossing through the same config file without a coordinated update contract.Added a focused issue for the Computer Use / WSL compatibility gap:
reason=wsl-disabled).That issue separates the exact product behavior from the broader umbrella: Remote Control worked in the WSL-backed Desktop profile, but Computer Use / Browser Use was explicitly unavailable with
browser_use_availability_resolved available=false ... reason=wsl-disabledandWindows Computer Use helper paths are unavailable.Adding a new Windows Desktop + WSL regression to the release-gate list:
https://github.com/openai/codex/issues/25317
Short version: the earlier
unified_exec=trueworkaround is no longer enough. In the current26.527.3686.0Desktop build family, withunified_exec=falsein both Windows and WSL configs and after multiple full reboots, a fresh WSL-backed Desktop session can still end up with shell/tool calls pinned to a deletedCODEX_HOME/tmp/arg0/codex-arg0*helper directory.The strongest current evidence:
This should be part of the Windows Desktop + WSL release gate because it crosses config, state/cache, WSL app-server launch, and shell/tool execution. It is related to #16970 / #17570, but the important regression is that reboot/relaunch is no longer a reliable recovery once the workaround from #22185 (
unified_exec=false) is already in place.Adding to this that the thread_tools issue that people are creating Mac issues for is also present on Windows. I have had to stop using the Desktop app completely.
Updated release-gate data point for the Windows Desktop + WSL matrix.
The current local acceptance gate that finally made CUA usable and kept shell execution healthy has these checks:
Runtime requirements:
computer-use@openai-bundledinstalled/enabled andcomputer-use-client.mjspresent;\\.\pipe\codex-computer-use-<uuid>exists;node_replruntime uses isolatedCODEX_HOME=%USERPROFILE%\.codex\chrome-runtime-home;SKY_CUA_NATIVE_PIPE_DIRECTORYis visible inside that runtime;%USERPROFILE%\.codex\tmp\arg0remains WSL/Linux-only;node_repl.exe -> codex.exe app-server --listen stdio://chains are present.Recent action-level proof beyond bootstrap:
sky.list_apps()passed and closed cleanly;This suggests the Windows+WSL release gate should not stop at:
list_apps()returns;It should also assert:
CODEX_HOME;arg0remains runtime-family safe;get_window_state+ same-turn coordinate/key input and cleansky.close().Current local status: runtime is clean and supported CUA operations are usable. Remaining limitation is an API-surface gap, not a runtime failure: the live Windows CUA object exposed here does not provide public
move, full-desktop screenshot, or a held-pointer/non-left drag primitive.Adding the latest
26.609.4994.0WSL-mode launch regression as another release-gate data point:Why this belongs in the Windows Desktop + WSL release-gate matrix:
The installed MSIX package contains the native Windows resource binaries:
But the WSL-mode launch path logged an attempt to relocate Linux/WSL-style resources from the same package root:
Those resource names are missing from the shipped package:
A process/user
CODEX_CLI_PATHoverride to an already-cached WSL CLI allowed Desktop to start and complete app-server initialization, which strongly suggests the failure is not the CLI itself but the Desktop/package contract for WSL-mode startup after update.This is exactly the kind of thing
#25216is trying to prevent: a Windows-native package/update path passed well enough to ship, but there does not appear to have been an end-to-end release gate for “existing Windows Desktop user has WSL mode enabled, updates through the Store package, then relaunches Desktop and initializes the WSL app-server.”Suggested additional gate:
I encountered the same issue when switching Codex to WSL mode. The app couldn’t find the CLI binary.