Skip to content

[Windows Desktop 26.901.6511.0] Five tasks stall; control RPCs take 15–27 minutes and shared request queue saturates #43525

Open

Description

@HailiangLoo

What version of the Codex App are you using?

  • Windows package: 26.901.6511.0.
  • Bundled backend executable: codex-cli 0.153.4, verified with that executable's --version.
  • Local desktop-to-app-server transport: stdio.
  • Configured default model: gpt-6-astra, reasoning effort ultra; individual task overrides were not exhaustively audited.

What subscription do you have?

ChatGPT Pro. At the post-incident check, the Codex usage window was 52% used and did not report a rate-limit restriction.

What platform is your computer?

Windows 11 Pro x64, version 10.0.26100, build 26100, approximately 64 GB RAM.

Five user-visible tasks were active across multiple local projects. The installation also had MCP/extensions, collaboration activity and scheduled heartbeat activity. The exact number of descendant tasks and all feature interactions have not been isolated.

Network environment: FlClash system proxy on localhost and a TUN/virtual network adapter. The user reported that the selected node appeared healthy. No contemporaneous proxy connection log or controlled direct-connection comparison was available. The proxy must therefore remain an environmental variable, not a proven cause or a proven non-factor.

What issue are you seeing?

Five active tasks appeared stuck for roughly an hour. Retained logs show intermittent progress and repeated shared control-path stalls, rather than proving that every task executed nothing for the entire hour.

The strongest evidence is that ordinary desktop control RPCs took 15–27 minutes to return, the shared client request pool reached six in-flight requests, and a queue snapshot contained 54 additional queued requests. Follow-up/steering submissions failed with:

App server request expired while queued

An app restart at approximately 2026-09-07 16:55 UTC / 2026-09-08 00:55 UTC+8 was followed by actual new task output. One task completed its current turn at 16:59:22 UTC; the other four produced fresh progress/tool results around 17:01 UTC.

This report concerns the shared control-request lifecycle and recovery behavior. The investigation found a concrete saturation mechanism in the installed client, but did not identify the first internal operation that started waiting or establish a full end-to-end root cause.

Actual impact

  • Several independent tasks became difficult to observe or control at the same time.
  • Task, account and configuration operations returned extremely late or expired in the queue.
  • Critical turn/steer requests failed to submit.
  • Task status could still be active/inProgress without a surfaced error; that status alone did not establish useful progress.
  • Application restart was followed by recovery without a configuration change performed by the investigator.

No task data loss was established. No in-app diagnostic feedback upload has been submitted as part of this report.

Measured control-request delays

These are the literal durationMs and queueWaitMs fields from desktop response_routed records, not estimates from a spinner. All response timestamps below are 2026-09-07 UTC.

Response time Method durationMs Approx. duration queueWaitMs
16:40:50.416 getAuthStatus 1,619,480 27.0 min 0
16:40:50.430 account/read 1,617,618 27.0 min 516
16:40:50.415 config/read 1,431,253 23.9 min 21,286
16:39:25.990 config/read 1,346,868 22.4 min 21,246
16:33:55.903 turn/start 1,046,790 17.4 min 0
16:29:25.819 mcpServerStatus/list 936,514 15.6 min 0
16:29:25.819 account/read 934,883 15.6 min 0

These latencies concern control operations, so model reasoning effort alone does not explain them. The early backend TRACE records were no longer available for request/response pairing; these measurements do not, by themselves, distinguish time inside backend handlers from delayed response delivery.

Incident timeline

All timestamps in this table are 2026-09-07 UTC. Add eight hours for local time on September 8.

Time Observed event
16:01:14 Earliest queue rejection in the inspected retained desktop segment; six in-flight requests.
16:07:10–16:07:12 Five main task streams reported TLS disconnects. Successful reconnects followed within roughly 1–6 seconds.
16:17:30–16:26:25 Two task transcripts showed the same approximately 8.9-minute event gap. This is not proof of total backend inactivity.
16:29–16:40 Several very late control RPC responses arrived, including the 15–27-minute entries above.
16:42:50.416 / 16:45:50.446 Backend received two configRequirements/read requests; matching desktop responses followed approximately 95.648 / 185.706 seconds later.
16:44:52 / 16:54:32 Model refresh logged a child-process timeout.
16:54:16.351 Queue snapshot: 6 in-flight, 14 background queued, 9 critical queued, 31 interactive queued.
16:54:20.746 A steering submission failed because its request expired while queued.
16:55:05 Old app-server transport stopped; fresh app/backend processes started immediately afterward.
16:59:22–17:01:33 One current turn completed; all four other tasks had new actual output.

Sanitized desktop-log excerpts

Only relevant fields are retained; request IDs, conversation IDs, project paths and unrelated fields are omitted. These are field-preserving excerpts, not complete raw lines.

2026-09-07T16:01:14.209Z warning [AppServerConnection]
  app_server_client_request_queue_rejected
  inFlightRequestCount=6 method=model/list priority=critical
  queueWaitMs=3956 reason=queue-expired source=models

2026-09-07T16:40:50.416Z info [AppServerConnection] response_routed
  durationMs=1619480 method=getAuthStatus queueWaitMs=0 errorCode=null

2026-09-07T16:40:50.430Z info [AppServerConnection] response_routed
  durationMs=1617618 method=account/read queueWaitMs=516 errorCode=null

2026-09-07T16:54:16.351Z warning [AppServerConnection]
  app_server_client_request_queue_rejected
  inFlightRequestCount=6 method=config/read priority=background
  queuedBackgroundRequestCount=14 queuedCriticalRequestCount=9
  queuedInteractiveRequestCount=31 queueWaitMs=30008
  reason=queue-expired source=config

2026-09-07T16:54:20.746Z error [electron-message-handler]
  Error submitting steering turn for conversation
  errorMessage="App server request expired while queued"

2026-09-07T16:55:05.568Z info [AppServerConnection]
  Stopping app-server transport connectionId=1 transport=stdio

Additional backend signals

Earlier read-only inspection captured:

stream disconnected before completion:
IO error: peer closed connection without sending TLS close_notify

failed to refresh available models:
timeout waiting for child process to exit

The model-refresh timeout was reported at models-manager/src/manager.rs:349. The log did not identify the child command, child PID or wait stack. It is a local investigation lead, not proof that model discovery caused all the stalls.

After restart, there were also history-projection ordinal warnings and seven Custom tool call output is missing errors for one task between 16:55:23 and 17:00:10 UTC. That task subsequently produced actual progress. These are possible recovery/state-consistency symptoms; their causal relationship to the queue incident is unconfirmed.

What steps can reproduce the bug?

Original application incident: intermittent, initial trigger unknown

  1. Run several normal tasks across local projects in this Windows desktop build.
  2. Continue working while the app performs normal metadata, history and scheduled-task activity.
  3. In the affected session, control operations became very slow, all six shared in-flight slots were occupied, and queued requests began expiring.
  4. Attempt to steer an active task; the submission expires while queued.
  5. Restart the desktop app; actual task output subsequently resumes.

This is an observed incident sequence, not a deterministic minimal application reproduction. Opening Plugins, a particular prompt, a node switch, or a particular task history has not been shown to be the trigger.

Installed-client code inspection

Read-only inspection of app.asar/.vite/build/src-VqXTPopo.js in this exact build found:

  • AppServerConnection owns a shared requestScheduler.
  • The scheduler class is minified as RK; SK=6 is the total in-flight limit, and CK=5 limits non-critical work. This is an RPC limit, not a supported-task-count limit.
  • markSentToTransport marks a dispatched request as sent.
  • dropUnsentRequest returns false for sent requests.
  • In the ordinary already-dispatched branch of abandonDestination, abandoning/timing out the caller does not itself call the scheduler's complete. The slot can remain occupied until the response arrives. There are special paths for plugin/list and unknown-outcome handling.
  • getNextRequestIndex first stops dispatch when total in-flight requests reach six; that check also affects newly queued critical work.

Retaining accounting for an operation with an unknown outcome may be intentional. The concern is whether long-lived sent requests have a bounded recovery path that preserves host responsiveness. Blindly freeing slots or replaying mutating requests would not necessarily be a safe fix.

Deterministic scheduler-only experiment

An isolated harness loaded the original scheduler code from the installed bundle. It used three background metadata requests, one background history request, one interactive account request, and one critical start request, all marked as sent and given no responses.

Results:

  1. All six occupied in-flight slots.
  2. All six dropUnsentRequest attempts returned false.
  3. A new critical turn/interrupt probe expired in the queue; the original six slots remained occupied.
  4. After simulating one old response with complete, a new critical probe dispatched immediately.
{"releaseAttempts":[false,false,false,false,false,false],"afterProbeTimeout":{"inFlightRequestCount":6,"queuedBackgroundRequestCount":0,"queuedCriticalRequestCount":0,"queuedInteractiveRequestCount":0},"events":["queue-expired"]}
{"afterOneOldResponse":["queue-expired","recovery dispatched"],"passed":true}

Bundle file SHA-256: 8d056524ea3f5714e5e0a254afd88f018d58465bc6ea026adee3c80ff7799e29.

The experiment verifies scheduler behavior under simulated non-response. It does not execute the full bridge timeout path, reproduce the initial backend delay, demonstrate a deployed end-to-end fix, or prove that the original six requests were exactly these synthetic methods.

Runnable, build-specific scheduler-only harness (Python 3 + Node.js)

Save as scheduler_repro.py and run python scheduler_repro.py "C:\path\to\app.asar". It reads the bundle and runs its scheduler in a separate Node process; it does not modify Codex, access tasks or make network requests.

"""Scheduler-only reproduction for Codex Desktop 26.901.6511.0.
Reads the installed ASAR without modifying it. Requires Python 3 and Node.js.
No network calls, credentials, task content, or running Codex processes are used.
Usage: python scheduler_repro.py "C:\path\to\app.asar"
This reproduces saturation behavior, not the original unknown backend trigger.
"""
import argparse
import hashlib
import json
from pathlib import Path
import struct
import subprocess
import sys

parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("asar", type=Path)
args = parser.parse_args()
with args.asar.open("rb") as stream:
    sizes = struct.unpack("<4I", stream.read(16))
    if sizes[0] != 4 or sizes[3] > 20_000_000:
        raise SystemExit("Unsupported ASAR header")
    header = json.loads(stream.read(sizes[3]))
    entry = header["files"][".vite"]["files"]["build"]["files"]["src-VqXTPopo.js"]
    stream.seek(8 + sizes[1] + int(entry["offset"]))
    source_bytes = stream.read(entry["size"])
source = source_bytes.decode("utf-8")
start = source.index("SK=6,CK=5,")
end = source.index("var VK=", start)
scheduler_source = "var " + source[start:end]
print(json.dumps({
    "scope": "scheduler-only; original backend hang not reproduced",
    "bundle_file": ".vite/build/src-VqXTPopo.js",
    "bundle_sha256": hashlib.sha256(source_bytes).hexdigest(),
    "scheduler_start_character": start,
    "scheduler_end_character": end,
}), flush=True)
harness = r"""
const assert = require("node:assert/strict");
const scheduler = new RK();
const events = [];
const oldRequests = [
  {method:"config/read", priority:"background", source:"config"},
  {method:"model/list", priority:"background", source:"models"},
  {method:"permissionProfile/list", priority:"background", source:"permissions"},
  {method:"thread/read", priority:"background", source:"tail_history"},
  {method:"getAuthStatus", priority:"interactive", source:"account"},
  {method:"turn/start", priority:"critical", source:"turn"}
];
oldRequests.forEach((r, i) => {
  const requestId = "old-" + i;
  scheduler.enqueue({
    requestId, method:r.method, params:{testOnly:i},
    scheduling:{priority:r.priority, source:r.source},
    dispatch:() => scheduler.markSentToTransport(requestId),
    reject:result => { throw Error("Unexpected initial rejection: " + result.reason); }
  });
});
assert.equal(scheduler.getQueueState().inFlightRequestCount, 6);
const releaseAttempts = oldRequests.map((_,i) => scheduler.dropUnsentRequest("old-"+i));
assert.deepEqual(releaseAttempts, [false,false,false,false,false,false]);
scheduler.enqueue({
  requestId:"interrupt-probe", method:"turn/interrupt",
  scheduling:{priority:"critical", timeoutMs:40},
  dispatch:() => events.push("interrupt dispatched"),
  reject:result => events.push(result.reason)
});
setTimeout(() => {
  try {
    assert.deepEqual(events, ["queue-expired"]);
    assert.equal(scheduler.getQueueState().inFlightRequestCount, 6);
    console.log(JSON.stringify({
      releaseAttempts, afterProbeTimeout:scheduler.getQueueState(), events:[...events]
    }));
    // Simulate receiving one old request's response.
    scheduler.complete("old-0");
    scheduler.enqueue({
      requestId:"recovery-probe", method:"turn/interrupt",
      scheduling:{priority:"critical"},
      dispatch:() => events.push("recovery dispatched"),
      reject:result => events.push(result.reason)
    });
    assert.deepEqual(events, ["queue-expired", "recovery dispatched"]);
    console.log(JSON.stringify({afterOneOldResponse:events, passed:true}));
  } catch (error) {
    console.error(error.message);
    process.exitCode = 1;
  } finally { scheduler.clear(); }
}, 120);
"""
result = subprocess.run(
    ["node", "-"], input=scheduler_source + harness,
    text=True, capture_output=True, timeout=10,
)
print(result.stdout, end="")
if result.stderr:
    print(result.stderr, file=sys.stderr, end="")
raise SystemExit(result.returncode)

What is the expected behavior?

  • Slow discovery, account, configuration or history operations should not leave all tasks on the same local host unresponsive for tens of minutes.
  • Cancellation/recovery controls should remain usable or provide a bounded, explicit recovery action when the shared pool is saturated.
  • Timeouts should distinguish “not sent” from “sent, outcome unknown,” with safe reconciliation instead of blind mutation retries.
  • Background polling should be bounded/coalesced during saturation.
  • Task state should expose when useful progress/control has stalled instead of relying only on active/inProgress.
  • Recovery should preserve task history/tool-result consistency and should not ordinarily require restarting the entire desktop app.

Additional information

Is this caused by FlClash or the network?

The available evidence does not establish that FlClash caused this incident, and it also does not completely exonerate the network:

  • The queue had already started rejecting requests before the observed 16:07 TLS burst.
  • The observed WebSocket reconnects succeeded within seconds.
  • Model-list HTTP requests continued to return 200 at several points during the affected period.
  • Between 16:42 and 16:54 the backend continued receiving some requests and completing some HTTP calls; this was not demonstrated to be a complete process deadlock or a continuous network outage.
  • A healthy node indicator is not a trace of every long-lived connection. No controlled proxy/direct-connection A/B test was performed.
  • FlClash processes had been running since well before the incident. No contemporaneous proxy error log was available.
  • Windows logs reviewed for the incident window contained no corresponding sleep/resume, application-hang/crash or resource-exhaustion event. Absence of those records does not rule out shorter stalls.
  • Post-incident memory/disk availability was ample, but no continuous resource trace exists for the failure window.

The strongest current hypothesis is prolonged control-request non-completion, amplified by shared-slot retention and insufficient recovery/isolation. The initiating delay may be in a backend handler, child process, IPC/delivery path, or an interaction with network recovery. Please investigate both the first slow operation and the propagation across tasks.

Evidence limitations and requested diagnostics

Early backend TRACE rows were dynamically removed during inspection. Some previously read SQLite log row IDs no longer existed on a later query. Thus, the exact original six occupying requests and the initial waiting stack could not be reconstructed reliably. No complete transport trace or process dump was captured.

Useful engineering diagnostics would include:

  • In-flight request method, age, priority, owner and sent/caller-timeout state at each saturation event.
  • Correlated backend receive/start/finish/send timestamps and desktop receive/dispatch timestamps.
  • The model-manager child command/PID and wait stack for the two child-exit timeouts.
  • Whether account/config/history operations share a lock or another long-lived dependency.
  • A bounded fault-injection test that holds backend replies while exercising metadata polling, task steering and cancellation.
  • Tests for late responses, unknown mutation outcomes and history/tool-output consistency after recovery.

Related reports

These may share an underlying issue; I am not claiming a distinct confirmed root cause. Please consolidate if appropriate.

This public report contains selected diagnostic fields and a synthetic harness only. Task contents, full transcripts, local project paths, credentials, proxy subscriptions, and conversation/request identifiers are omitted.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    windows-osIssues related to Codex on Windows systems
    app-serverIssues involving app server protocol or interfaces
    on Sep 7, 2026
  2. github-actions commented on Sep 7, 2026

    @github-actions
    Contributor

    Potential duplicates detected. Please review them and close your issue if it is a duplicate.

    Powered by Codex Action

  3. Kanturna commented on Sep 8, 2026

    @Kanturna

    Additional Windows incident evidence: global model picker/send lockout, September 6–8

    I am seeing the same failure pattern on another Windows installation. The model selector disappears across all tasks, including new chats, and messages cannot be submitted. It sometimes recovers later; restarting the app also restores model-list responses.

    Current verified environment: Windows desktop package 26.901.6511.0, bundled codex-cli 0.153.4, local stdio transport. MCP integrations and concurrent tasks are present. Earlier retained logs below include app sessions before the current restart.

    Local measurements (all timestamps UTC)

    Period / response time Evidence
    September 6, 07:52–08:23 and 15:26–15:45 The same scheduler-rejection pattern was already present, including model/list with six in-flight requests.
    September 7, 20:56–21:21, one app process 476 scheduler rejections, including 33 model/list and four turn/steer; observed queue snapshots reached 103 waiting requests. These are request counts, not independent incidents.
    September 7, 21:15:36 account/read returned after 1,261,504 ms and getAuthStatus after 1,261,517 ms, both with queueWaitMs=0 and errorCode=null.
    September 8, 16:19–16:35 Another episode reached 104 waiting requests; model/configuration requests and three turn/steer requests were rejected.
    September 8, 16:54:00 model/list expired after 30 seconds in the shared queue.
    September 8, 16:58 onward After a new app/backend start, several model/list requests returned successfully within milliseconds.

    Queue totals sum the background, critical, and interactive queued-count fields; the separate priority-count field is not added again.

    Field-preserving excerpts, with identifiers and unrelated fields omitted:

    2026-09-07T21:15:36.150Z response_routed
      method=account/read durationMs=1261504 queueWaitMs=0 errorCode=null
    
    2026-09-07T21:15:36.165Z response_routed
      method=getAuthStatus durationMs=1261517 queueWaitMs=0 errorCode=null
    
    2026-09-08T16:54:00.975Z app_server_client_request_queue_rejected
      method=model/list inFlightRequestCount=6
      queuedBackgroundRequestCount=8 queuedCriticalRequestCount=4
      queuedInteractiveRequestCount=12 queueWaitMs=30010 reason=queue-expired
    

    The backend also logged this at September 8, 16:22:58, 16:27:33, 16:32:08, and 16:55:29 UTC:

    list_models{refresh_strategy=online}:
    failed to refresh available models: timeout waiting for child process to exit
    

    The child command/PID and its wait stack were not captured, so model refresh is an investigation lead, not a proven initiating cause.

    Context-management and account-switching boundaries

    The visible problem was first noticed around account switching within the same app and an attempted burst of roughly 19 tasks. This is an observed workload sequence, not a deterministic reproduction or proof that account switching/concurrency caused the problem; earlier retained logs already show the failure signature.

    [features.context_management] experimental_mode = true was added only on September 8 at approximately 04:43 UTC, after the September 6–7 failures. The pre-change backup parses successfully and lacks that section; the current config parses successfully with it. Thus this particular opt-in cannot explain the original onset. Model-list requests also recovered after restart while the flag remained enabled. This does not rule out a later interaction.

    Read-only inspection of the installed .vite/build/src-VqXTPopo.js produced the same SHA-256 as the original report:
    8d056524ea3f5714e5e0a254afd88f018d58465bc6ea026adee3c80ff7799e29.
    No scheduler patch was applied, and I am not claiming to have reproduced the original backend stall with a synthetic harness.

    The strongest local evidence is shared control-path saturation plus very late replies. There is no process dump or continuous resource/network trace from the stalls, so the first blocking operation remains unresolved. This also resembles #38385.

    Please investigate bounded recovery for already-dispatched control requests and capture the method/age/wait state of the requests occupying the shared slots when model selection and message submission become unavailable.

  4. tao19911024-gif commented on Sep 11, 2026

    @tao19911024-gif

    Additional Windows evidence: shared control-request saturation and retained MCP processes (2026-09-11)

    The following observations extend this report to desktop package 26.903.9818.0, with bundled codex-cli 0.153.4 on Windows x64. The desktop-to-backend transport was local stdio. The evidence supports a shared control-path responsiveness problem; it does not establish the operation that initiated the backend delay.

    Observed incident

    All timestamps below are UTC on September 11, 2026.

    Observation Evidence
    UI request timeout At 05:59:43, a thread/start request reached its 30,000 ms caller timeout.
    Delayed response The matching response arrived at 06:12:02 with durationMs=769177 and queueWaitMs=0, approximately 12 minutes 49 seconds after dispatch.
    Queue saturation The retained log for the affected desktop process contains 117 app_server_client_request_queue_rejected events. This is an event count, not a count of separate incidents.
    Queue delay versus processing Around 06:12:02, configuration/permission reads waited approximately 100 seconds in the queue; subsequent processing took only 10–51 ms.
    Recovery A desktop/backend restart was followed by successful work and no queue-rejection entries in the subsequently inspected desktop log. This establishes recovery during that observation window, not a permanent fix.

    Isolated scheduler reproduction

    A foreground Node harness exercised the original scheduler extracted from the installed desktop bundle. The experiment used simulated requests and responses; it did not contact the running app-server, create real tasks, invoke a model, or modify the installation.

    1. Dispatch six synthetic thread/start requests, mark them as sent, and withhold their responses.
    2. Enqueue a critical turn/interrupt for a different synthetic task and a configuration read.
    3. Verify that neither request dispatches while all six slots remain occupied.
    4. Attempt to drop an already-sent request with dropUnsentRequest; verify that it returns false.
    5. Complete one old request; verify that the interrupt dispatches. Complete another; verify that the configuration read dispatches.

    Recorded results:

    {
      "sixDispatched": 6,
      "otherThreadInterruptQueued": 1,
      "configQueued": 1,
      "cannotDropAlreadySent": true,
      "interruptUnblockedOnlyAfterCompletion": true,
      "configUnblockedAfterAnotherCompletion": true
    }

    Bundle entry: .vite/build/src-B6LqG3ek.js
    Bundle SHA-256: 9a1d9737c526cbba0e18e5ffc3b9371ef055318e7eabb7584b082fbcdb24472e

    This reproduces scheduler behavior under non-completion. It does not exercise the complete caller-timeout path or reproduce the original backend wait. Retaining accounting for a sent operation may be necessary when its outcome is unknown; simply freeing slots or replaying mutations would not be a sufficient fix.

    Post-restart MCP process retention

    At approximately 07:52–07:54 UTC, the replacement backend had 235–236 OS threads. A live process snapshot contained ten groups of six direct children, created between 07:01 and 07:51 at roughly five-minute intervals, in addition to the initial group. Parent identity and process creation times were checked.

    The installed webview contains an mcp-extension-host-thread query with staleTime: Infinity, no descriptor-level gcTime, and an imperative getOrFetch path. This is consistent with the mechanism discussed in #43122, but live observer state and cache-eviction events were not captured.

    The matching backend source also contains the Windows stdio path discussed in #42740. The observed OS thread count is not a measurement of blocking-pool occupancy, and the failed process had already exited before a waiting-stack capture was available. Process retention, historical thread-pool exhaustion, and the initiating delay must therefore remain distinct findings. Network involvement remains unresolved.

    Suggested remediation and acceptance criteria

    These are proposed investigation and design directions, not a validated patch:

    • Preserve control-path responsiveness under saturation. Provide a bounded cancellation/recovery path when ordinary requests stop completing, while retaining correct accounting and reconciliation for sent operations with unknown outcomes.
    • Make extension-host ownership explicit. Reuse or release internal MCP sessions across cache eviction, invalidation, reconnection, and scope disposal. Verify that repeated lookups across several cache-lifetime intervals do not continually increase retained sessions and child processes.
    • Validate the Windows transport independently. Use a small blocking-pool regression test with quiet stdio MCP clients to establish whether unrelated blocking work can still complete. If the reported starvation is confirmed, investigate asynchronous Windows pipe handling rather than increasing concurrency limits.
    • Test recovery semantics. Cover delayed replies, queued interrupt/steering requests, caller timeouts, unknown mutation outcomes, and task-history/tool-result consistency after recovery. Correlated receive/start/finish/send timestamps and in-flight request age/state would help identify the first stalled operation.

    The related merged #43870 addresses stderr-reader cleanup on teardown. Its scope does not establish a fix for still-retained sessions or shared-slot saturation.

    This supplement includes only selected diagnostic fields and synthetic experiment results. Raw transcripts, credentials, cookies, private project paths, process command lines, and conversation/request identifiers have been omitted.

  5. Miles-Cheverton commented on Sep 14, 2026

    @Miles-Cheverton

    Adding a recovery comparison from macOS report #45405. My Desktop logs also reached six in-flight requests, with unrelated configuration/model/thread requests expiring while queued. Local Work could not submit even the first turn of a fresh conversation under a clean CODEX_HOME.

    On my Mac Studio, Allow Connections OFF in ChatGPT Desktop → wait a few seconds → ON restored Local Work after app/runtime restarts and user-MCP disabling had failed. No OS downgrade was needed.

    Environment: ChatGPT 26.908.40834 (8881), bundled Codex 0.154.0-alpha.6.2, macOS 27.0 build 26A428, arm64.

    I have not measured the 15–27-minute delays reported here, reproduced your scheduler experiment, or established what the toggle reset internally. This is a recovery observation for comparison; a shared root cause or Windows remedy remains unproven. Full details: #45405.

  6. 0xdevalias commented on Oct 17, 2026

    @0xdevalias

    Related current macOS build-20398 evidence: #53197 (comment) documents the eight-total-active scheduler, separate queued caps, ten-renderer demand burst, critical rejections, and dispatched read-timeout retention. Includes hashes and tested offline scheduler/retry probes. The original local submission stall occurred outside the measured rejection bursts, so a common initiating cause is not asserted.

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

    appIssues related to the Codex desktop appapp-serverIssues involving app server protocol or interfacesbugSomething isn't workingperformancewindows-osIssues related to Codex on Windows systems

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions