Add doctor thread inventory audit (#24305)

## Why

Users have been reporting missing sessions in the app. The app server
thread listing is backed by the SQLite state DB, but the durable source
of truth for a thread still exists on disk as rollout JSONL. When the
state DB is incomplete, doctor should be able to show the mismatch
directly instead of leaving users with a generic state health result.

## What changed

This adds a `threads` doctor check that compares active and archived
rollout files under `CODEX_HOME` with rows in the SQLite `threads`
table. The check reports missing rollout rows, stale DB rows, archive
flag mismatches, duplicate rollout thread IDs, duplicate DB paths,
source/provider summaries, and bounded samples of affected rollout
paths.

It also adds a read-only state audit helper in `codex-rs/state` so
doctor can inspect thread rows without creating, migrating, or repairing
the database.

## Sample output

```text
  ⚠ threads      rollout files are missing from the state DB
      default model provider   openai
      rollout DB active files  3910
      rollout DB archived files 2037
      rollout DB scan errors   0
      rollout DB malformed file names 0
      rollout DB scan cap reached false
      rollout DB rows          5499
      rollout DB active rows   3462
      rollout DB archived rows 2037
      rollout DB missing active rows 448
      rollout DB missing archived rows 0
      rollout DB stale rows    0
      rollout DB archive mismatches 0
      rollout DB duplicate rollout thread ids 0
      rollout DB duplicate DB paths 0
      rollout DB model providers openai=5359, lmstudio=35, mock_provider=33, lite_llm=26, proxy=26, ollama=15, lms=4, local-usage-limit=1
      rollout DB sources       vscode=2587, cli=1494, subagent:thread_spawn=577, subagent:other=502, exec=281, subagent:memory_consolidation=46, subagent:review=9, unknown=3
      rollout DB missing active sample ~/.codex/sessions/2026/0…857e-a923c712e066.jsonl
      rollout DB missing active sample ~/.codex/sessions/2025/0…877a-766dff25c68d.jsonl
      rollout DB missing active sample ~/.codex/sessions/2025/0…a8b1-7bbadc836f6e.jsonl
      rollout DB missing active sample ~/.codex/sessions/2025/0…a218-e6197f3f62f8.jsonl
      rollout DB missing active sample ~/.codex/sessions/2025/0…9011-7e30784f9932.jsonl
```
This commit is contained in:
Eric Traut authored and GitHub committed 2026-05-25 10:29:06 -07:00
1 parent 613e5149a4
commit a7836744cc
7 files changed
+1013

No files matched your search

+9
View File
@@ -71,6 +71,7 @@ mod output;
mod progress;
mod runtime;
mod system;
mod thread_inventory;
mod title;
mod updates;
@@ -84,6 +85,7 @@ use progress::doctor_progress;
use runtime::runtime_check;
use runtime::search_check;
use system::system_check;
use thread_inventory::thread_inventory_check;
use title::terminal_title_check;
use updates::updates_check;
@@ -362,6 +364,7 @@ async fn build_report(
git_check,
terminal_title_check,
state_check,
thread_inventory_check,
background_server_check,
reachability_check,
) = tokio::join!(
@@ -392,6 +395,11 @@ async fn build_report(
})
},
run_async_check("state", progress.clone(), state_check(config)),
run_async_check(
"thread inventory",
progress.clone(),
thread_inventory_check(config),
),
run_async_check(
"app-server",
progress.clone(),
@@ -415,6 +423,7 @@ async fn build_report(
git_check,
terminal_title_check,
state_check,
thread_inventory_check,
background_server_check,
reachability_check,
]);