Windows Desktop + WSL needs an end-to-end release gate across config, state, plugins, exec, and recovery

Open 💬 9 comments Opened May 30, 2026 by MisterRound
💡 Likely answer: A maintainer (github-actions[bot], contributor) responded on this thread — see the highlighted reply below.

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 ~/.codex instead of the Windows Codex home, causing split-brain config behavior.
  • #22185: Windows Desktop + WSL workspace with unified_exec=true tries to CreateProcess /bin/bash and fails with ENOENT.

Plugin/path bridge

  • #22760: Recommended skills refresh can create malformed literal Windows-path directories under vendor_imports in 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: /goal can 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.5 xhigh 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/c filesystem 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/c paths.
  • 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

  1. 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
  1. Centralize Windows<->WSL path conversion and forbid manual string concatenation such as C: + /mnt/c/....
  1. 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
  1. 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
  1. 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
  1. 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.

View original on GitHub ↗

9 Comments

github-actions[bot] contributor · 1 month ago

Potential duplicates detected. Please review them and close your issue if it is a duplicate.

  • #24268
  • #23777
  • #24364
  • #24101
  • #25215

Powered by Codex Action

MisterRound · 1 month ago

Additional related issue that should stay separate from this umbrella:

  • #21761 tracks the Desktop crash/restart diagnostic problem where the UI reports an incidental WARN as "Most recent error" while the app-server is actually failing during thread resume / goal recovery / tool enumeration paths.

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_tools and plugin icon warnings while the actionable failure was app-server unavailability during large-thread /goal recovery.

MisterRound · 1 month ago

Additional existing issue to include in the release-gate map:

  • #24065 tracks Settings writes failing with configVersionConflict after plugin/marketplace refresh updates config.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.

MisterRound · 1 month ago

Added a focused issue for the Computer Use / WSL compatibility gap:

  • #25301: Computer Use is unavailable in Windows Desktop when app-server runs in WSL (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-disabled and Windows Computer Use helper paths are unavailable.

MisterRound · 1 month ago

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=true workaround is no longer enough. In the current 26.527.3686.0 Desktop build family, with unified_exec=false in 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 deleted CODEX_HOME/tmp/arg0/codex-arg0* helper directory.

The strongest current evidence:

PATH points at a missing /mnt/c/Users/<user>/.codex/tmp/arg0/codex-arg0* directory
/proc/<app-server-pid>/fd/3 still points at that deleted helper dir's .lock path
fdinfo shows a POSIX advisory write lock owned by the live WSL app-server pid
newer helper dirs can appear later, but the active thread remains pinned to the deleted helper path

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.

T-Higgins · 1 month ago

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.

MisterRound · 1 month ago

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:

[features].computer_use=true
browser_use=false
browser_use_external=false
CODEX_ELECTRON_ENABLE_WINDOWS_COMPUTER_USE=1
CODEX_NODE_REPL_PATH=%USERPROFILE%\.codex\node_repl_wsl.sh

Runtime requirements:

  • computer-use@openai-bundled installed/enabled and computer-use-client.mjs present;
  • live \\.\pipe\codex-computer-use-<uuid> exists;
  • the callable Windows node_repl runtime uses isolated CODEX_HOME=%USERPROFILE%\.codex\chrome-runtime-home;
  • SKY_CUA_NATIVE_PIPE_DIRECTORY is visible inside that runtime;
  • shared %USERPROFILE%\.codex\tmp\arg0 remains WSL/Linux-only;
  • no bare/shared-home 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;
  • a 12-second hold-open smoke stayed responsive and closed cleanly;
  • Calculator coordinate click verified display change;
  • Phone Link iPhone QR flow was completed after fixing a local Windows Bluetooth service dependency;
  • Photoshop 2026 clean-document UI-only stress passed using CUA UI controls only, no scripts/shell/app-native automation/imported images.

This suggests the Windows+WSL release gate should not stop at:

  • app-server starts;
  • CUA pipe exists;
  • list_apps() returns;
  • Chrome extension is installed.

It should also assert:

  • product-generated native sidecars do not use shared WSL Desktop CODEX_HOME;
  • arg0 remains runtime-family safe;
  • CUA/browser-use sidecars receive native-pipe env while using an isolated runtime home;
  • generated bundled marketplace includes all expected bundled entries, not just a subset;
  • Chrome native host manifests use real Windows paths and a real versioned/latest plugin target;
  • action-level CUA tests use fresh get_window_state + same-turn coordinate/key input and clean sky.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.

MisterRound · 1 month ago

Adding the latest 26.609.4994.0 WSL-mode launch regression as another release-gate data point:

Why this belongs in the Windows Desktop + WSL release-gate matrix:

Codex Windows Store package: OpenAI.Codex_26.609.4994.0_x64__2p2nqsd0c76g0
Mode: WSL app-server enabled
User-visible failure: Desktop cannot start
Error: Unable to locate the Codex CLI binary

The installed MSIX package contains the native Windows resource binaries:

app\resources\codex.exe   exists
app\resources\rg.exe      exists

But the WSL-mode launch path logged an attempt to relocate Linux/WSL-style resources from the same package root:

sourcePath=C:\Program Files\WindowsApps\OpenAI.Codex_26.609.4994.0_x64__2p2nqsd0c76g0\app\resources\codex
destinationPath=C:\Users\<WindowsUser>\.codex\bin\wsl\codex
operation=stat_source
errorCode=ENOENT

Those resource names are missing from the shipped package:

app\resources\codex       missing
app\resources\rg          missing

A process/user CODEX_CLI_PATH override 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 #25216 is 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:

Install final MSIX/Store artifact
Preserve or set runCodexInWindowsSubsystemForLinux=true
Launch Desktop from the installed package, not from dev sources
Assert WSL app-server initialization succeeds without CODEX_CLI_PATH
Assert any package resources Desktop tries to relocate for WSL mode are present
Assert fallback to an existing cached WSL CLI works if package resources are missing
skrawnytheman · 1 month ago

I encountered the same issue when switching Codex to WSL mode. The app couldn’t find the CLI binary.