BEFORE — commit 95cb068c10a6cf0b33eed0a0cab3b298763fe852 Environment: Linux x64; Node 26.13.1; real T3 server + CLI; codex-cli 0.167.2. Fresh isolated HOME and T3 base directory; no copied database; no provider credentials. All paths below refer to synthetic fixtures, normalized as $SCRATCH; host identifier normalized as $HOST. Seed: instance codex, setupMode=existing, homePath="", shadowHomePath=$SCRATCH/shadow, instance environment CODEX_HOME=$SCRATCH/custom-codex; initially disabled. Default and custom config files differ only in local endpoint (/default versus /custom). Seeded usage: default 111 input + 10 output; custom 22222 input + 10 output. 1. Start real server: node apps/server/src/bin.ts serve --base-dir $SCRATCH/t3 --port 39856 --host 127.0.0.1 Filesystem readlink after startup: { "sqlite": "$SCRATCH/home/.codex/sqlite", "config.toml": "$SCRATCH/home/.codex/config.toml", "shell_snapshots": "$SCRATCH/home/.codex/shell_snapshots", "cache": "$SCRATCH/home/.codex/cache", "logs": "$SCRATCH/home/.codex/logs", "mcp-oauth-locks": "$SCRATCH/home/.codex/mcp-oauth-locks", "worktrees": "$SCRATCH/home/.codex/worktrees", "thread-writer-locks": "$SCRATCH/home/.codex/thread-writer-locks", "plugins": "$SCRATCH/home/.codex/plugins", "sessions": "$SCRATCH/home/.codex/sessions", "archived_sessions": "$SCRATCH/home/.codex/archived_sessions", "skills": "$SCRATCH/home/.codex/skills" } 2. Authenticated real WebSocket RPC server.getConfig (snapshot captured again after the turn): { "instanceId": "codex", "continuation": { "groupKey": "codex:home:$SCRATCH/home/.codex" } } 3. Authenticated real WebSocket RPC server.getUsageSummary with awaitRefresh=true: { "sinceDay": "2026-11-13", "untilDay": "2026-11-13", "timeZone": "UTC", "buckets": [ { "day": "2026-11-13", "provider": "codex", "model": "gpt-6.1-sol", "sourcePath": "$SCRATCH/home/.codex/sessions", "totals": { "uncachedInputTokens": 111, "cachedInputTokens": 0, "cacheCreationTokens": 0, "outputTokens": 10, "reasoningTokens": 0 }, "costUsd": 0.000322, "cacheSavingsUsd": 0, "categoryCostUsd": { "input": 0.000222, "cacheRead": 0, "cacheWrite": 0, "output": 0.0001 }, "costSource": "modelPriced", "records": 1, "unpricedRecords": 0, "unpricedTokens": 0, "sessions": 1 } ], "sources": [ { "fingerprint": { "hostId": "$HOST", "provider": "codex", "resolvedHomePath": "$SCRATCH/home/.codex/sessions", "volumeId": "64769:1469680" }, "status": "ok", "scannedFiles": 1, "skippedFiles": 0, "malformedRecords": 0, "distinctSessions": 1, "message": null } ] } 4. Enable same instance via server.updateSettings; refresh provider; add fresh project through CLI. node apps/server/src/bin.ts thread start $SCRATCH/project "Say hello." --provider codex --model gpt-6.1-sol --json --wait --base-dir $SCRATCH/t3 Logging wrapper execs /usr/local/bin/codex unchanged. Subprocess launches: [ { "args": [ "app-server", "-c", "thread_unload_delay_secs=0" ], "CODEX_HOME": "$SCRATCH/shadow", "sessions": "$SCRATCH/home/.codex/sessions", "config": "model_provider = \"evidence\"\nmodel = \"gpt-6.1-sol\"\n[model_providers.evidence]\nname = \"Synthetic evidence endpoint\"\nbase_url = \"http://127.0.0.1:39958/default\"\nwire_api = \"responses\"\nrequires_openai_auth = false\n", "thread": null }, { "args": [ "app-server", "-c", "thread_unload_delay_secs=0" ], "CODEX_HOME": "$SCRATCH/shadow", "sessions": "$SCRATCH/home/.codex/sessions", "config": "model_provider = \"evidence\"\nmodel = \"gpt-6.1-sol\"\n[model_providers.evidence]\nname = \"Synthetic evidence endpoint\"\nbase_url = \"http://127.0.0.1:39958/default\"\nwire_api = \"responses\"\nrequires_openai_auth = false\n", "thread": null }, { "args": [ "app-server", "-c", "thread_unload_delay_secs=0" ], "CODEX_HOME": "$SCRATCH/shadow", "sessions": "$SCRATCH/home/.codex/sessions", "config": "model_provider = \"evidence\"\nmodel = \"gpt-6.1-sol\"\n[model_providers.evidence]\nname = \"Synthetic evidence endpoint\"\nbase_url = \"http://127.0.0.1:39958/default\"\nwire_api = \"responses\"\nrequires_openai_auth = false\n", "thread": null } ] Observed local HTTP request during this turn: [ { "method": "POST", "path": "/default/responses", "model": "gpt-6.1-sol" } ] Actual CLI result (exit 1; intentional HTTP 400 from local endpoint, on both commits): {"threadId":"mcp:acf30100-e53f-49b3-a0df-94b9faff40c4","runId":"run:thread:mcp%3Aacf30100-e53f-49b3-a0df-94b9faff40c4:ordinal:1","status":"failed","reply":null,"error":"{\"error\": {\"message\": \"Evidence endpoint reached; no paid model request is made.\", \"type\": \"invalid_request_error\", \"code\": \"evidence_capture\"}}"} Thread mcp:acf30100-e53f-49b3-a0df-94b9faff40c4 stopped with status failed: {"error": {"message": "Evidence endpoint reached; no paid model request is made.", "type": "invalid_request_error", "code": "evidence_capture"}} Interpretation: endpoint path identifies the config actually consumed by real Codex after the T3 adapter opens a session and starts a turn. This is not a completed inference or an OAuth/renewal check.