Root cause and a deterministic repro, in case it helps triage.
Repro (main @ eb6e7fa2f6): run a turn on a Claude thread, stop the server, delete that session's ~/.claude/projects/*/<nativeId>.jsonl, start the server, send a message → No conversation found with session ID: <nativeId> on every send. Same thing happens when the transcript is lost in a backup restore that captured the T3 database but not ~/.claude/projects.
Cause: ClaudeAdapterV2.resumeThread checks the transcript on disk, but when no copy exists it returns success and leaves the resume to the CLI. Because the thread already ran, startTurn launches the CLI with --resume, which fails. ProviderTurnStartService already has the right recovery (fresh native session + context handoff, native ref replaced), but it only runs when resumeThread fails, so it never kicks in. #19637 fixed the neighboring case (a transcript that contains only metadata) by failing resumeThread; the case where no transcript exists at all wasn't covered.
Fix: have resumeThread also fail when no transcript copy exists and the provider thread has already run (lastRunOrdinal !== null). Unreadable transcripts and never-used session ids keep the current behavior. The diff is about 10 lines in the adapter, plus an added case in the existing ClaudeAdapterV2 resumeThread test. Two test harnesses also need CLAUDE_CONFIG_DIR pointed at a temp dir, because they currently read the real ~/.claude/projects on whatever machine runs them.
Codex isn't affected: its resumeThread calls thread/resume directly, so a missing rollout already fails and falls back.
Happy to open a PR if this direction looks right.
(The bypass-permissions warning in the original report looks unrelated.)