Download

When Codex refused to resume a session’s saved thread (for example because its transcript was gone), the turn was recorded as uncertain and every later turn tried the same dead thread and failed the same way.

The turn now fails clearly as protocol/thread_unavailable, which is not retryable, and the session forgets that thread. Your next message starts a fresh Codex thread and runs. The failed turn is deliberately not retried on a new thread by itself, so you can see the context was lost.

Changes

  • runtime/failure.ts adds THREAD_UNAVAILABLE; runtime/codex.ts ends the turn as failed when thread/resume or thread/fork is refused.
  • NativeSessionStore.forget() clears only that provider’s nativeThreadId.

Evidence

No screenshot: Backend change; the app shows its existing protocol-failure text.