Skip to content

[Bug][Windows] Continuation spill failures accumulate behind healthy readiness after #3011 (observed on 2.39.0) #3522

Description

@stephen-drew

Diagnostic follow-up landed; runtime recovery remains open

#3790 (c2b4dc0696) distinguishes fresh retry timeouts from remembered timeout refusals. The reported long-lived Windows process recovery failure is not declared fixed. The remaining acceptance is same-process evidence and a justified recovery remedy.

Verified against dev 5759d9ea2f1e7281cdc01eb9628f2e0a123fb59c. Original report by @stephen-drew. The attribution record was added in #3811.

Client or integration

Codex App through the local OpenCodex proxy.

Area

Windows response-state persistence, failure diagnostics and recovery.

Summary

During normal concurrent Codex App use on 1 September, an official OpenCodex 2.39.0 process stopped successfully publishing continuation spills while continuing to report healthy/ready. The successful spill count remained at 1,988 and the failure count eventually reached 11,365 in the same process.

This follows the asynchronous Windows spill work in #3011, #3018 and #3044. The new evidence concerns sustained persistence degradation after those changes. The saved measurements do not identify the exact exception thrown inside the affected process.

Reproduction

The incident was intermittent, under concurrent Codex App traffic. A deterministic production trigger has not been established.

  1. Run the official 2.39.0 Windows package with multiple concurrent Codex tasks.
  2. Compare successive supported ocx memory --json and health/readiness observations.
  3. Observe a successful spill count that stops advancing while spill failures continue increasing for hours.
  4. In a separate diagnostic process, verify that the same release's durable spill writer can publish, read back and clean up an isolated disposable spill.

Step 4 succeeded in the captured incident, making a persistent process-local failure a useful investigation direction.

Logs or error output

Saved incident evidence:

Installed/live version: 2.39.0
Official package parity: 923 / 923 files identical
Same process throughout incident: yes
Health/readiness: healthy
Successful spill publications: fixed at 1,988
Spill write failures: 1,582 -> 1,763 -> 3,439 -> 3,599 -> 3,714 -> 11,365
Spill read failures: 0
Earlier degraded-state snapshot: 946 tombstones, 0 spill stubs
Final sampled RSS: approximately 578 MB
Free disk space: approximately 229 GB
Final active turns: 7
Final draining state: false

The resident-memory budget was not exceeded. The spill directory retained a protected owner-only ACL. No ACL timeout override was found in the inspected service or environment configuration.

Separate-process checks of the exact release passed:

Single durable publication, read-back and cleanup: 305 ms
Five sequential publications: 232, 88, 92, 87, 85 ms
Leftover diagnostic files: 0

Source tests also demonstrated the bounded ACL-timeout recovery path and its exhausted-recovery error. This makes exhausted ACL recovery a hypothesis supported by the source and isolated tests. The live incident exposed aggregate counters only, so EACLRETRYEXHAUSTED is not claimed as a captured live exception.

Expected behaviour

Preserve required ACL checks and bounded waits. Sustained failure to persist continuations should be observable as a specific degraded capability, including a privacy-safe cause and an actionable recovery route.

A healthy routing endpoint can coexist with a persistence failure, but operators need to be able to distinguish those states without inferring the cause from thousands of failed saves.

Suggested investigation

  • Expose a bounded, sanitised last spill error code, timestamp and failure streak alongside the existing counters.
  • Distinguish an isolated failed response from a persistence path that can no longer publish successfully.
  • Test an exhausted Windows ACL recovery followed by a healthy ACL runner, and document when publication can resume in the same process.
  • If the failure requires a restart, expose that requirement explicitly and preserve the active-turn/drain boundary.
  • Preserve fail-closed ACL behaviour, publication ordering and protection against automatic replay of side-effecting tool calls.

Version

Observed live: OpenCodex 2.39.0, official source commit af6113a0381d6fff2e4dce587652825c7eeb6423.

Installed package when reviewing this report on 4 September: 2.42.0. The incident has not been reproduced on 2.42.0. At the 4 September review snapshot, the process had approximately 19 minutes of uptime and reported zero successful spills and zero spill failures, so it had not exercised the relevant path.

Operating system

Windows, x64. The current review host reports 25H2, build 26200.9168.

Provider and model

The suspected failure is in local continuation persistence. No provider-specific root cause is claimed.

Screenshots and supporting files

Evidence was recovered from the saved incident report, package-parity checks, successive runtime snapshots and isolated diagnostic results. Private prompts, conversation contents, usernames, paths and credentials are omitted.

Redacted configuration

{
  "client": "Codex App",
  "platform": "Windows x64",
  "serviceBackend": "Task Scheduler",
  "proxyBinding": "local loopback"
}

Checks

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingplatformOS/service/tray/ACL (Windows-heavy, not Windows-only)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions