1. 概要 (ここだけ読めばOK)
ChatGPT Windowsアプリを起動すると、突然こんなエラーが出るようになりました。
failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies).
Windowsアプリの「修復」「リセット」、再インストールまで試しましたが直りませんでした。
調べていくと、WindowsアプリがWSL上で起動しているCodex app-serverから、最終的にこんなエラーが見つかりました。
401 Unauthorized
Encountered invalidated oauth token for user, failing request
code: token_revoked
要するに、Windowsアプリ用のCodexには「ログイン済み」の情報が残っているものの、保存されていたOAuth tokenはサーバー側ですでに無効になっていたようです。
対応は、Windowsアプリが使っているCodex環境を指定して一度ログアウトし、ChatGPT Windowsアプリからログインし直すだけでした。
まずChatGPT Windowsアプリを起動し、エラー画面を閉じずにWSLで以下を実行します。
PID="$(pgrep -f '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex.*app-server' | head -n 1)"
DESKTOP_CODEX="$(tr '\0' '\n' < "/proc/${PID}/cmdline" | head -n 1)"
WINDOWS_USER="$(printf '%s\n' "$DESKTOP_CODEX" | sed -n 's#^/mnt/c/Users/\([^/]*\)/.*#\1#p')"
WSL_USER="$USER"
DESKTOP_CODEX_HASH="$(basename "$(dirname "$DESKTOP_CODEX")")"
DESKTOP_HOME="/mnt/c/Users/${WINDOWS_USER}/.codex"
DESKTOP_SQLITE_HOME="/home/${WSL_USER}/.codex/sqlite"
printf 'PID=%s\n' "$PID"
printf 'WINDOWS_USER=%s\n' "$WINDOWS_USER"
printf 'WSL_USER=%s\n' "$WSL_USER"
printf 'DESKTOP_CODEX_HASH=%s\n' "$DESKTOP_CODEX_HASH"
printf 'DESKTOP_CODEX=%s\n' "$DESKTOP_CODEX"
printf 'DESKTOP_HOME=%s\n' "$DESKTOP_HOME"
printf 'DESKTOP_SQLITE_HOME=%s\n' "$DESKTOP_SQLITE_HOME"
値が取れたらChatGPT Windowsアプリを完全に終了し、そのまま同じWSLセッションで以下を実行します。
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" logout
成功するとこうなります。
Successfully logged out
この後ChatGPT Windowsアプリを起動し、アプリからいつものChatGPTアカウントへログインし直したところ、正常に起動するようになりました。
今回の原因と同じなら、ここまでで直ると思います。
2. 今回の切り分け結果
先に調査結果をまとめておきます。
| 切り分け候補 | 結果 |
|---|---|
| Windowsアプリの単純な破損 | 再インストールしても変わらず |
| WindowsアプリのPackage Cache破損 | Windowsの「リセット」を実行しても変わらず |
ChatGPTアプリ 26.917.8451.0 固有の問題 |
26.917.9434.0 でも再現 |
Desktop同梱Codex 0.155.x 固有の問題 |
切り分け用に導入したCodex CLI 0.156.1 でも再現 |
| WSLでCodexが起動できない | app-serverの初期化まで正常に完了 |
| Desktop同梱Codexバイナリの破損 |
initialize まで正常に完了 |
| PC全体のインターネット障害 | Chrome、Windowsの curl.exe、WSL上のCodexから通信可能 |
| OpenAI全体への到達不能 | Windowsの curl.exe でOpenAIのmanifestを取得可能 |
| Windows TLS全体の障害 | Schannel/CAPI2に今回の障害を直接示すイベントなし |
HTTP_PROXY 等の誤設定 |
Desktop app-serverでは空 |
| ローカル上で未ログイン |
codex login status は Logged in using ChatGPT
|
| 実際のOAuth token | APIアクセス時に 401 Unauthorized / token_revoked
|
| Desktop用認証をlogoutして再ログイン |
config/read 成功、Windowsアプリも正常起動 |
最終的にはこういう流れだったと考えています。
ChatGPT Windowsアプリ
↓
WSL上のDesktop同梱Codex app-serverを起動
↓
Windows側の .codex を CODEX_HOME として利用
↓
config/read
↓
Enterpriseの workspace-managed policies を取得
↓
保存されているOAuth tokenがサーバー側で失効
↓
401 Unauthorized / token_revoked
↓
cloud config bundleの取得失敗
↓
ChatGPT Windowsアプリの起動失敗
後述しますが、codex login status は普通に成功していました。
ここがちょっと厄介でした。
3. 環境
今回の環境は以下です。
- Windows 11 25H2
- OS Build 26200.9448
- 組織管理端末
- インターネット通信は常時Zscaler経由
- Microsoft Store版ChatGPT
- WSL2 + Ubuntu24.04
- ChatGPT Enterpriseを利用
- Codexのエージェント環境とシェルはWSL
- 切り分け用としてWSLへCodex CLIを追加
Codex CLIのインストール手順はこの記事では割愛します。
障害発生時のChatGPT Windowsアプリは以下でした。
26.917.8451.0 (2026.9.23)
調査途中で以下へ更新しています。
26.917.9434.0 (2026.9.24)
Windowsアプリのパッケージ名は、GUIだと ChatGPT ですが、ターミナルとかで指定するときはOpenAI.Codexでした。
WindowsアプリはWSLの中にCodex CLIを自動展開します。調査中に確認したバージョンは以下です。
ChatGPT 26.917.8451.0
-> codex-cli 0.155.0-alpha.16.3
ChatGPT 26.917.9434.0
-> codex-cli 0.155.0-alpha.16.4
また、今回の切り分け用として別途WSLへ入れたCodex CLIは以下です。
codex-cli 0.156.1
4. 解決手順
ここからは実際に直った手順です。
4.1 ChatGPT Windowsアプリを起動する
まずChatGPT Windowsアプリを起動し、問題のエラーを出します。
failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies).
OKボタンを押すとWindowsアプリが終了してしまいます。
アプリが起動したWSL側のCodex app-serverを調べたいので、そのままにしておきます。
4.2 Windowsアプリが起動したCodexを特定する
WSLで以下を実行します。
PID="$(pgrep -f '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex.*app-server' | head -n 1)"
DESKTOP_CODEX="$(tr '\0' '\n' < "/proc/${PID}/cmdline" | head -n 1)"
WINDOWS_USER="$(printf '%s\n' "$DESKTOP_CODEX" | sed -n 's#^/mnt/c/Users/\([^/]*\)/.*#\1#p')"
WSL_USER="$USER"
DESKTOP_CODEX_HASH="$(basename "$(dirname "$DESKTOP_CODEX")")"
DESKTOP_HOME="/mnt/c/Users/${WINDOWS_USER}/.codex"
DESKTOP_SQLITE_HOME="/home/${WSL_USER}/.codex/sqlite"
printf 'PID=%s\n' "$PID"
printf 'WINDOWS_USER=%s\n' "$WINDOWS_USER"
printf 'WSL_USER=%s\n' "$WSL_USER"
printf 'DESKTOP_CODEX_HASH=%s\n' "$DESKTOP_CODEX_HASH"
printf 'DESKTOP_CODEX=%s\n' "$DESKTOP_CODEX"
printf 'DESKTOP_HOME=%s\n' "$DESKTOP_HOME"
printf 'DESKTOP_SQLITE_HOME=%s\n' "$DESKTOP_SQLITE_HOME"
今回の環境では、Desktop用Codexはだいたいこんな場所にいました。
C:\Users\<Windowsユーザー>\.codex\bin\wsl\<識別子>\codex
WSL側から見るとこうです。
/mnt/c/Users/<Windowsユーザー>/.codex/bin/wsl/<識別子>/codex
バージョンも確認しておきます。
"$DESKTOP_CODEX" --version
4.3 ChatGPT Windowsアプリを完全終了する
必要な変数を取得したので、ここでChatGPT Windowsアプリを完全に終了します。
確認は以下です。WSLで実行します。
pgrep -af 'codex.*app-server'
ChatGPT Windowsアプリから起動されたapp-serverが消えていればOKです。
4.4 Desktop用の認証をログアウトする
先ほど取得した変数をそのまま使います。
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" logout
今回は以下になりました。
Successfully logged out
WindowsアプリのCODEX_HOMEはWSL側の、
/home/<WSLユーザー>/.codex
ではなく、
/mnt/c/Users/<Windowsユーザー>/.codex
を使います。
何も指定せずに codex logout すると、WSL上でインストールしたcodex-cliの認証情報を消すだけで、意味ない可能性があります。
4.5 Windowsアプリからログインし直す
ログアウトしたらChatGPT Windowsアプリをもう一度起動します。
ログイン画面が出るので、いつも使っているChatGPT Enterpriseアカウントでログインしました。
今回やったのは、
WSLからDesktop用認証をログアウト
↓
ChatGPT Windowsアプリを起動
↓
Windowsアプリからログイン
という流れです。
CLIから codex login はしていません。
これでWindowsアプリが正常に起動するようになりました。
5. 解決しなかった対応
いきなり認証を疑ったわけではないので、その前にいくつか試しています。
ただし同じ症状が出た場合、今回の結果を踏まえるとこの辺を全部やる必要はないと思います。
Windowsの「終了」
これ自体は復旧のつもりではないですが、この後の修復のために必要です。
タスクマネージャー
> サービス
> CodexSandboxService.OpenAI.Codex ※これじゃなかった気もするが、とにかくCodexのサンドボックスのサービスを停める必要がある。説明が「ChatGPT」のやつ
> 停止
設定
> アプリ
> インストールされているアプリ
> ChatGPT
> 詳細オプション
> 終了
Windowsの「修復」
以下を実施しました。
設定
> アプリ
> インストールされているアプリ
> ChatGPT
> 詳細オプション
> 修復
ただし症状は変わりませんでした。
Windowsの「リセット」
同じ画面から「リセット」も実施しました。
これも変わりませんでした。
Windowsアプリが使うCodexのデータは、MSIXの領域だけでなく、
C:\Users\<Windowsユーザー>\.codex
にもあります。
今回はこの辺に残っていた認証状態が問題だったので、アプリ側のリセットでは直らなかったようです。
アプリの再インストール
Microsoft Store版ChatGPTをアンインストールして入れ直し、PCも再起動しました。
これも変わりませんでした。
同じ理由で、アプリを消してもWindowsユーザー側の .codex はそのまま残っていたようです。
Web版ChatGPTからCodex関連セッションをログアウト
ChromeのChatGPT WebからCodex関連セッションもログアウトしてみました。
これも変わりませんでした。
サーバ側が失効するだけで、Windows Desktopが使っている .codex 側の認証情報は残るようです。
そもそもトークン失効してるので、これで消えるならどうやって同期してるんだってなりますが、この辺から認証疑ってたので、ワンチャンこれで再認証始まらないかな、と。
6. ChatGPTアプリを最新版へ更新
障害発生時のバージョンは以下でした。
26.917.8451.0
調査中にOpenAIのWindows Store更新manifestを確認しました。
以下は 2026年9月24日時点 で使われていたURLです。
将来変わる可能性があります。
curl.exe -fsS https://persistent.oaistatic.com/codex-app-prod/windows-store-update.json
当時は以下が返りました。
{
"schemaVersion": 1,
"buildVersion": "26.917.9434.0",
"storeProductId": "9PLM9XGG6VKS",
"packageIdentity": "OpenAI.Codex"
}
Windowsアプリを 26.917.9434.0 まで更新しましたが、同じエラーになりました。
なので、26.917.8451.0固有のバグという線は薄くなりました。(調査中に公開された新バージョンだったので期待したのですが⋯)
7. Windows Updateも少し疑った
今回このエラーに気付いたのが、月例Windows Updateを適用した後の初回起動でした。
さらに同じ社内環境の別PCではChatGPT Windowsアプリが動いていて、そのPCにはまだ当月のWindows Updateが入っていませんでした。
この月のWindows Updateでは、Claude CoworkやWSLにも影響する不具合もありました。
なので最初はWindows Updateも疑いました。
ただ、最終的に実APIから、
401 Unauthorized
token_revoked
まで取れたので、Windows Updateが原因ではなかったようです。
なお、Windows Updateのアンインストールまではしていません。
8. Zscalerも少し疑った
このPCはインターネット通信が常時Zscaler経由です。
Chrome版ChatGPTは普通に使えていたので、
ブラウザは通るけど、WindowsアプリだけTLSやProxyまわりで失敗している?
という可能性も疑いました。
結論関係なかったです。
9. Windowsアプリのパッケージを確認
PowerShellで以下を実行します。
Get-AppxPackage OpenAI.Codex |
Select-Object `
Name,
PackageFullName,
PackageFamilyName,
Version,
InstallLocation
調査時にはこんな情報が取れました。
Name : OpenAI.Codex
Version : 26.917.9434.0
PackageFullName : OpenAI.Codex_26.917.9434.0_x64__...
PackageFamilyName : OpenAI.Codex_...
WindowsのGUIのアプリ一覧等ではChatGPTですが、Windowsパッケージとしては OpenAI.Codex になっています。
ChatGPT.exeの実体も確認できます。
Get-Process ChatGPT -ErrorAction SilentlyContinue |
Select-Object `
Id,
ProcessName,
Path
だいたい以下のような場所です。
C:\Program Files\WindowsApps\
OpenAI.Codex_<VERSION>_x64__<PACKAGE_FAMILY_SUFFIX>\
app\ChatGPT.exe
10. Desktopログを確認
アプリのログはMSIXのユーザーデータ側にありました。
まずログディレクトリを取得します。
$PackageFamilyName = (
Get-AppxPackage OpenAI.Codex
).PackageFamilyName
$logdir = Join-Path `
$env:LOCALAPPDATA `
"Packages\$PackageFamilyName\LocalCache\Local\Codex\Logs"
$logdir
直近のログを見ます。
Get-ChildItem $logdir -Recurse -File |
Sort-Object LastWriteTime -Descending |
Select-Object -First 10 `
LastWriteTime,
Length,
FullName
一番新しい0バイトではないログを変数に入れます。
$log = Get-ChildItem $logdir -Recurse -File |
Where-Object {
$_.Length -gt 0
} |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
$log.FullName
全文を見るならこれです。
Get-Content $log.FullName
エラーっぽいところだけ見るならこの辺です。
Get-Content $log.FullName |
Select-String `
-Pattern 'error|fail|cloud|config|policy|workspace|network|tls|certificate|auth' `
-CaseSensitive:$false
今回のログを見ると、
ChatGPT.exe
↓
WSL Ubuntuを検出
↓
Desktop同梱Codexを起動
↓
initialize成功
↓
Codex CLI initialized
↓
config/read
↓
Failed to load cloud config bundle
というところまでは進んでいました。
エラーは以下です。
Application network requirements prevented startup
failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies).
11. Windows側のTLSエラーも確認
一応、WindowsのTLSや証明書まわりも確認しました。
Schannel
Get-WinEvent -FilterHashtable @{
LogName = 'System'
ProviderName = 'Schannel'
StartTime = (Get-Date).AddMinutes(-10)
} -ErrorAction SilentlyContinue |
Select-Object `
TimeCreated,
Id,
LevelDisplayName,
Message |
Format-List
今回の障害を直接示すものは見つかりませんでした。
CAPI2
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-CAPI2/Operational'
StartTime = (Get-Date).AddMinutes(-10)
} -ErrorAction SilentlyContinue |
Select-Object `
TimeCreated,
Id,
LevelDisplayName,
Message |
Format-List
CAPI2ログ自体が有効か見るならこちらです。
Get-WinEvent -ListLog 'Microsoft-Windows-CAPI2/Operational' |
Select-Object `
LogName,
IsEnabled,
RecordCount
こちらにも今回の障害を直接示すイベントはありませんでした。
12. OpenAIへの基本的な通信を確認
WindowsからOpenAIの更新manifestへアクセスしてみます。
以下は 2026年9月24日時点 のURLです。
curl.exe -fsS https://persistent.oaistatic.com/codex-app-prod/windows-store-update.json
普通にJSONが返りました。
なので少なくとも、
このPCからOpenAIへまったく通信できない
という話ではなさそうです。
13. Windowsアプリが起動しているCodexを調べる
ここからかなり原因に近づきました。
ChatGPT Windowsアプリを起動して、例のエラー画面を出したままWSLで以下を実行します。
pgrep -af '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex'
今回の環境ではこんなプロセスが見つかりました。
<PID> /mnt/c/Users/.../.codex/bin/wsl/.../codex \
-c features.code_mode_host=true \
app-server \
--analytics-default-enabled \
-c plugins.codex-app-tools@openai-bundled.mcp_servers.codex_app.enabled=true
Windows版ChatGPTは、WSLの中でCodexの app-server を起動していたわけです。
14. app-serverの環境変数を確認
必要な値を一度まとめて取得します。
PID="$(pgrep -f '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex.*app-server' | head -n 1)"
DESKTOP_CODEX="$(tr '\0' '\n' < "/proc/${PID}/cmdline" | head -n 1)"
WINDOWS_USER="$(printf '%s\n' "$DESKTOP_CODEX" | sed -n 's#^/mnt/c/Users/\([^/]*\)/.*#\1#p')"
WSL_USER="$USER"
DESKTOP_CODEX_HASH="$(basename "$(dirname "$DESKTOP_CODEX")")"
DESKTOP_HOME="/mnt/c/Users/${WINDOWS_USER}/.codex"
DESKTOP_SQLITE_HOME="/home/${WSL_USER}/.codex/sqlite"
DESKTOP_CWD="$(tr '\0' '\n' < "/proc/${PID}/environ" | sed -n 's/^PWD=//p')"
export PID
export WINDOWS_USER
export WSL_USER
export DESKTOP_CODEX_HASH
export DESKTOP_CODEX
export DESKTOP_HOME
export DESKTOP_SQLITE_HOME
export DESKTOP_CWD
主要な環境変数を確認します。
tr '\0' '\n' < "/proc/${PID}/environ" |
grep -E '^(CODEX_HOME|CODEX_SQLITE_HOME|HOME|PWD|WSLENV|HTTP_PROXY|HTTPS_PROXY|NO_PROXY|SSL_CERT_FILE|SSL_CERT_DIR)='
ここで重要だったのがこれです。
CODEX_HOME=/mnt/c/Users/<Windowsユーザー>/.codex
CODEX_SQLITE_HOME=/home/<WSLユーザー>/.codex/sqlite
HOME=/home/<WSLユーザー>
HTTP_PROXY=
HTTPS_PROXY=
NO_PROXY=
Windowsアプリから起動されたCodexは、
/home/<WSLユーザー>/.codex
ではなく、
C:\Users\<Windowsユーザー>\.codex
相当を CODEX_HOME にしていました。
これで、
Windowsアプリをリセットしても再インストールしても、.codex側の状態が残っているのが原因では?
という方向が濃厚になってきました。
一応OAuth endpointを独自URLへ向けているような設定がないか下記を確認しましたが、そういうのはなさそうでした。
tr '\0' '\n' < "/proc/${PID}/environ" |
grep -E '^(CODEX_APP_SERVER_LOGIN_ISSUER|CODEX_APP_SERVER_LOGIN_CLIENT_ID|CODEX_REFRESH_TOKEN_URL_OVERRIDE|CODEX_REVOKE_TOKEN_URL_OVERRIDE|CODEX_INTERNAL_ORIGINATOR_OVERRIDE|NODE_TLS_REJECT_UNAUTHORIZED|RUST_LOG|LOG_FORMAT)='
15. Desktopと同じCODEX_HOMEで認証を確認
Desktop用Codexの実体が分かったので、同じ環境で認証状態を確認しました。
env \
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
HTTP_PROXY= \
HTTPS_PROXY= \
NO_PROXY= \
"$DESKTOP_CODEX" login status
すると、
Logged in using ChatGPT
と出ました。
一見すると正常です。
さらに、
env \
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
HTTP_PROXY= \
HTTPS_PROXY= \
NO_PROXY= \
"$DESKTOP_CODEX" debug models
も通りました。
ここで一度、
認証は正常そうだから別の問題かな
と思ったのですが、後でこれは当てにならないことが分かりました。
16. config/read を直接実行してみる
Desktopログを見る限り、起動時に失敗しているのは config/read です。
なのでChatGPT.exeを介さず、Desktopとほぼ同じ条件でapp-serverを起動して、
initialize
↓
initialized
↓
config/read
を直接投げてみました。
まず、ChatGPT Windowsアプリが起動している間に以下を実行して変数を取っておきます。
PID="$(pgrep -f '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex.*app-server' | head -n 1)"
DESKTOP_CODEX="$(tr '\0' '\n' < "/proc/${PID}/cmdline" | head -n 1)"
WINDOWS_USER="$(printf '%s\n' "$DESKTOP_CODEX" | sed -n 's#^/mnt/c/Users/\([^/]*\)/.*#\1#p')"
WSL_USER="$USER"
DESKTOP_HOME="/mnt/c/Users/${WINDOWS_USER}/.codex"
DESKTOP_SQLITE_HOME="/home/${WSL_USER}/.codex/sqlite"
DESKTOP_CWD="$(tr '\0' '\n' < "/proc/${PID}/environ" | sed -n 's/^PWD=//p')"
export DESKTOP_CODEX
export DESKTOP_HOME
export DESKTOP_SQLITE_HOME
export DESKTOP_CWD
次にテスト用スクリプトを作ります。
cat > desktop.py <<'PY'
import json
import os
import select
import subprocess
import time
desktop_codex = os.environ["DESKTOP_CODEX"]
desktop_home = os.environ["DESKTOP_HOME"]
desktop_sqlite_home = os.environ["DESKTOP_SQLITE_HOME"]
desktop_cwd = os.environ["DESKTOP_CWD"]
env = os.environ.copy()
env.update(
{
"CODEX_HOME": desktop_home,
"CODEX_SQLITE_HOME": desktop_sqlite_home,
"HTTP_PROXY": "",
"HTTPS_PROXY": "",
"NO_PROXY": "",
"NODE_TLS_REJECT_UNAUTHORIZED": "",
"CODEX_APP_SERVER_LOGIN_CLIENT_ID": "",
"CODEX_APP_SERVER_LOGIN_ISSUER": "",
"CODEX_REVOKE_TOKEN_URL_OVERRIDE": "",
"CODEX_REFRESH_TOKEN_URL_OVERRIDE": "",
"CODEX_INTERNAL_ORIGINATOR_OVERRIDE": "Codex Desktop",
"LOG_FORMAT": "json",
"RUST_LOG": "warn",
}
)
cmd = [
desktop_codex,
"-c",
"features.code_mode_host=true",
"app-server",
"--analytics-default-enabled",
"-c",
"plugins.codex-app-tools@openai-bundled.mcp_servers.codex_app.enabled=true",
]
p = subprocess.Popen(
cmd,
cwd=desktop_cwd,
env=env,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=None,
text=True,
bufsize=1,
)
def send(obj):
p.stdin.write(json.dumps(obj) + "\n")
p.stdin.flush()
def wait_for_id(target_id, timeout=30):
end = time.time() + timeout
while time.time() < end:
ready, _, _ = select.select(
[p.stdout],
[],
[],
1,
)
if not ready:
continue
line = p.stdout.readline()
if not line:
break
try:
msg = json.loads(line)
except json.JSONDecodeError:
continue
if msg.get("id") == target_id:
return msg
return None
send(
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"clientInfo": {
"name": "Codex Desktop",
"title": "Codex Desktop",
"version": "diagnostic",
},
"capabilities": {},
},
}
)
init = wait_for_id(1)
print(
"initialize:",
"OK" if init and "result" in init else init,
)
send(
{
"jsonrpc": "2.0",
"method": "initialized",
}
)
send(
{
"jsonrpc": "2.0",
"id": 2,
"method": "config/read",
"params": {},
}
)
cfg = wait_for_id(2)
if cfg is None:
print("config/read: TIMEOUT")
elif "error" in cfg:
print("config/read: ERROR")
print(
json.dumps(
cfg["error"],
ensure_ascii=False,
indent=2,
)
)
else:
print("config/read: OK")
print(
"result returned:",
"result" in cfg,
)
p.terminate()
PY
実行します。
python3 desktop.py
結果はこれでした。
initialize: OK
config/read: ERROR
{
"code": -32603,
"message": "failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies)."
}
ChatGPT.exeを通さなくても同じエラーになりました。
ということで、
ChatGPT.exe
Electron
Windowsアプリの画面部分
あたりではなく、Codex app-server自身の config/read で失敗しているところまで絞れました。
17. 切り分け用に入れたCodex CLIでも試す
次に、
Windowsアプリ内蔵のCodexが古いから壊れているのでは?
を切り分けます。
今回この調査のためにWSLへ別途Codex CLIを入れていました。
バージョンは以下です。
codex --version
codex-cli 0.156.1
インストール手順は割愛します。
desktop.py をコピーします。
cp desktop.py wsl.py
CodexバイナリだけPATH上のものを使うように変更します。
python3 - <<'PY'
from pathlib import Path
p = Path("wsl.py")
s = p.read_text()
s = s.replace(
'desktop_codex = os.environ["DESKTOP_CODEX"]',
'import shutil\n'
'desktop_codex = shutil.which("codex")\n'
'if desktop_codex is None:\n'
' raise RuntimeError("codex command was not found in PATH")'
)
p.write_text(s)
PY
実行します。
python3 wsl.py
こちらも同じでした。
initialize: OK
config/read: ERROR
{
"code": -32603,
"message": "failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies)."
}
切り分け用に入れた 0.156.1 でも同じエラーになります。
ということで、Desktopに入っている 0.155.x だけの問題ではなさそうです。
18. やっと token_revoked が出てきた
ここまで来て、app-serverのstderrにかなり有用な情報が出ました。
Desktop同梱版では、
Invalid configuration; using defaults.
Failed to load cloud config bundle (workspace-managed policies).
に続いて、
Failed to refresh token: builder error
が出ていました。
さらに、切り分け用のCodex CLI 0.156.1 では、
Failed to refresh token:
OAuth token request failed: builder error
に加えて、ChatGPT Backend APIからこんなレスポンスが返りました。
401 Unauthorized
中身はこれです。
{
"error": {
"message": "Encountered invalidated oauth token for user, failing request",
"type": null,
"code": "token_revoked",
"param": null
},
"status": 401
}
他のAPIでも同じ状態でした。
<https://chatgpt.com/backend-api/ps/plugins/installed>
<https://chatgpt.com/backend-api/ps/plugins/suggested/codex>
<https://chatgpt.com/backend-api/plugins/featured>
ここでようやく、
ローカルにはログイン情報が残っているけど、
そのOAuth tokenはサーバー側ですでに無効になっている
ということが分かりました。
19. ログアウトしてアプリからログインし直す
原因が分かったので、Desktop用の認証だけログアウトします。
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" logout
結果はこうでした。
Successfully logged out
その後ChatGPT Windowsアプリを起動し、アプリからログインし直しました。
再度テストします。
python3 desktop.py
今度は成功しました。
initialize: OK
config/read: OK
result returned: True
そしてChatGPT Windowsアプリも普通に起動しました。
解決です。
20. login status が罠だった
今回ややこしかったポイントです。
問題が起きている状態でも、
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" login status
は普通に成功していました。
Logged in using ChatGPT
さらに debug models も動きました。
env \
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
HTTP_PROXY= \
HTTPS_PROXY= \
NO_PROXY= \
"$DESKTOP_CODEX" debug models
それでも実際のBackend APIでは、
401 Unauthorized
token_revoked
になっています。
今回の結果だけを見ると、
login status
↓
ローカルにログイン情報が存在する
実APIアクセス
↓
そのtokenがサーバー側で現在も有効か確認される
という違いがあるように見えます。
なので同じ症状を調べる場合、
Logged in using ChatGPT
だけを見て「認証は問題なし」と判断しない方が良さそうです。
21. CODEX_HOME に注意
もう1つ注意点です。
Windowsアプリから起動されたCodexは今回、
/mnt/c/Users/<Windowsユーザー>/.codex
を使っていました。
WSLで普通にCodexを起動した場合とは、参照する認証情報が変わる可能性があります。
なので今回の修正では、
codex logout
とはせず、
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" logout
としています。
別のCodex環境を使っている人は、関係ない認証情報を消さないように注意してください。
22. 解決後もPlugin関連warningは少し残った
ログインし直した後も、こんなwarningが残りました。
failed to refresh cached remote plugin catalog
remote installed plugin bundle sync failed
error sending request for url
https://chatgpt.com/backend-api/ps/plugins/list
ただし、起動を止めていた、
Failed to load cloud config bundle (workspace-managed policies).
は消えています。
config/read も、
initialize: OK
config/read: OK
result returned: True
になり、Windowsアプリも正常に使えるようになりました。
なので、このPlugin関連warningは今回の起動障害とは別問題として棚上げしています。
23. 再発時にやること
同じエラーが出た場合は、まずエラーメッセージを確認します。
failed to read configuration layers: Failed to load cloud config bundle (workspace-managed policies).
同じなら、ChatGPT Windowsアプリを起動した状態でWSLから以下を実行します。
PID="$(pgrep -f '/mnt/c/Users/.*/\.codex/bin/wsl/.*/codex.*app-server' | head -n 1)"
DESKTOP_CODEX="$(tr '\0' '\n' < "/proc/${PID}/cmdline" | head -n 1)"
WINDOWS_USER="$(printf '%s\n' "$DESKTOP_CODEX" | sed -n 's#^/mnt/c/Users/\([^/]*\)/.*#\1#p')"
WSL_USER="$USER"
DESKTOP_CODEX_HASH="$(basename "$(dirname "$DESKTOP_CODEX")")"
DESKTOP_HOME="/mnt/c/Users/${WINDOWS_USER}/.codex"
DESKTOP_SQLITE_HOME="/home/${WSL_USER}/.codex/sqlite"
ここまで取れたらChatGPT Windowsアプリを終了します。
その後、
CODEX_HOME="$DESKTOP_HOME" \
CODEX_SQLITE_HOME="$DESKTOP_SQLITE_HOME" \
"$DESKTOP_CODEX" logout
を実行します。
Successfully logged out
になったら、ChatGPT Windowsアプリを起動してログインし直します。
今回と同じ原因なら、これで直ると思います。
24. 同じ原因か確認してからログアウトしたい場合
いきなりログアウトするのが嫌な場合は、Desktopログやapp-serverのstderrで今回と同じエラーがあるか探します。
Desktopログの場所は下記で取得可能です。
$PackageFamilyName = (
Get-AppxPackage OpenAI.Codex
).PackageFamilyName
$logdir = Join-Path `
$env:LOCALAPPDATA `
"Packages\$PackageFamilyName\LocalCache\Local\Codex\Logs"
$logdir
探すエラーは下記です。
Failed to load cloud config bundle (workspace-managed policies)
さらに、
Failed to refresh token
401 Unauthorized
あたりが出ていれば認証系が怪しいです。
特に、
Encountered invalidated oauth token for user
code: token_revoked
が出ていれば、今回とかなり近い状況だと思います。
その場合はDesktop用の CODEX_HOME を指定してログアウトし、Windowsアプリからログインし直せば解決する可能性があると思います。
25. まとめ
今回の障害は、最終的にはこういう状態でした。
ChatGPT Windowsアプリ
↓
WSL上のCodex app-serverを起動
↓
Windows側の .codex を CODEX_HOME として利用
↓
config/read
↓
workspace-managed policiesを取得
↓
保存されていたOAuth tokenが失効済み
↓
401 Unauthorized
token_revoked
↓
cloud config bundleを取得できない
↓
Windowsアプリが起動できない
Windowsの「修復」「リセット」、アプリ再インストールまでやって直らなかったので、最初は結構面倒な問題に見えました。
実際の修正自体は、
Desktop用CODEX_HOMEを特定
↓
そのCODEX_HOMEを指定してlogout
↓
ChatGPT Windowsアプリからログインし直す
だけです。
修正前は、
initialize: OK
config/read: ERROR
Failed to load cloud config bundle
でした。
修正後は、
initialize: OK
config/read: OK
result returned: True
になり、Windowsアプリも正常に起動しました。
個人的には、codex login status が Logged in using ChatGPT なのに、実際のAPIでは token_revoked だったところが一番ハマったポイントでした。
同じエラーが出た人は、アプリを再インストールする前にWindows側の .codex の認証状態を確認してみても良いと思います。