0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPT Windowsアプリ起動時の Failed to load cloud config bundle (workspace-managed policies) 解消記録

0
Last updated at Posted at 2026-09-25

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 の認証状態を確認してみても良いと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?