Skip to content

[macOS Desktop] Persistent access-denied background hydration retries alongside high renderer CPU; restart does not resolve #53178

Open

Description

@arrhen

Environment

Observed October 11, 2026 on macOS 27.0.1 (26A434), Apple Silicon.

  • Codex Framework: 155.0.8059.40
  • Desktop build: 20156
  • Build commit: a993bdbe5bb9503cb84de1e67d5635cf186a959f

The version above was obtained from a process sample and desktop logs, rather than the About dialog.

Issue

While investigating a lightly used Mac running warm, Codex's renderer was observed using 59–100% CPU (one logical core). Desktop logs show persistent background thread/read requests failing with -32003: thread access denied, repeatedly targeting the same chats.

A full app restart reduced immediate renderer CPU but did not stop the denied-read loop.

Observed sequence

This is an existing-profile observation, not a clean-install reproducer:

  1. With Desktop open under light user interaction, inspect process CPU and app logs.
  2. Observe repeated failures with:
    method=thread/read
    source=thread_hydration
    priority=background
    error.code=-32003
    error.message="thread access denied"
    failureReason=null
    
  3. Fully quit and restart the desktop app.
  4. Observe the same denied background reads return immediately.
  5. Use the supported set_thread_read_state(hostId="durable", read=true) tool for one affected chat. Its associated thread/read succeeds (errorCode=null), but background hydration reads for the same ID continue failing. Marking the chat read does not stop those retries.

Measurements

  • 2,007 failed background hydration requests across 96 chat IDs in a 14-minute window (10:55–11:09 AM Pacific).
  • 35,374 denied hydration error rows across the inspected previous-run logs, spanning approximately 18 hours. This is a log-row count; unique request IDs across the entire run were not independently recounted.
  • Repeated failures for one example target occurred about every five seconds.
  • 496 denied hydration errors within the first 25 seconds of the restarted run.
  • Renderer CPU samples before restart: 59% and 100.2%. A later sample fell to 11%.
  • Renderer CPU shortly after restart: 6.7%, while denied reads continued.
  • macOS reported no recorded thermal or performance warning.

These observations establish unnecessary repeated requests and CPU spikes in the same app run. They do not prove the retry loop causes every spike, sustained CPU saturation, or thermal throttling. Another cloud chat was actively running during diagnosis.

Read-only inspection lead — not a confirmed root cause

Inspection of shipped JavaScript found:

  • hydratePinnedThreads explicitly supplies threadAccess: "shared" for the durable host.
  • The general hydration path obtains access mode from an already-loaded conversation. An unloaded conversation can therefore reach a read without that explicit mode.
  • readThread retains terminal cached errors for normalized thread_not_found, but not access denial.
  • The memoized hydration read removes its entry in finally, including rejected reads.

An access-mode/transport mismatch and insufficient suppression or backoff are plausible leads. Actual wire payloads and backend authorization decisions were not captured; the exact caller initiating the five-second refresh has not been identified.

Expected behavior

  • Preserve the correct authorized access mode for shared cloud chats during background loading.
  • Treat authorization denial as a bounded unavailable state rather than retrying indefinitely without an access/identity change or explicit user retry.
  • Coordinate retries across renderers and provide a supported recovery that preserves chats and active work.
  • Preserve server authorization boundaries.

Related reports

Please consolidate if appropriate. This report adds observations from build 20156, measured CPU spikes, long-running retry volume, and immediate recurrence after restart.

Uploaded feedback session

019c0d37-d2b6-74c0-918f-0e64af9b6e14 (ID supplied by the app's prefilled GitHub feedback link).

Privacy and interventions

No raw logs, credentials, account identifiers, private chat IDs/titles, conversation contents, or local paths are attached. No application binaries, credential stores, server ACLs, or chat databases were modified. One affected chat was marked read as the diagnostic test described above.


Attribution: Investigated, drafted, and submitted by Codex, the AI assistant running in the ChatGPT desktop app, on behalf of @arrhen and with their authorization. Measurements came from local process samples and application logs; interpretations and limitations are identified above.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    app-serverIssues involving app server protocol or interfaces
    on Oct 11, 2026
  2. github-actions commented on Oct 11, 2026

    @github-actions
    Contributor
  3. arrhen commented on Oct 11, 2026

    @arrhen
    Author

    Thanks for flagging #52129. The reports may share an underlying cause, but their observed scope differs:

    • [Windows Desktop] Dot-created cloud history remains missing/access-denied after connection recovery; direct reads retrieve original messages #52129 concerns Windows build 13536: cloud chats remain missing or inaccessible in the sidebar after connection recovery, while direct reads retrieve original messages.
    • This report concerns macOS build 20156: persistent access-denied background hydration retries, with 2,007 failures across 96 chats in 14 minutes and 35,374 error rows over approximately 18 hours. A restart produced another 496 failures within 25 seconds.
    • This report also includes renderer CPU samples of 59–100% of one logical core. CPU later fell while retries continued, so we have not established that the loop causes every CPU spike.

    Both reports show a contrast between successful supported direct reads and failing background/UI loading. That is a useful shared investigation lead, but it does not yet establish the same root cause.

    Maintainers: please consolidate these reports if you confirm a shared cause, retaining the macOS/version, retry-volume, restart, and CPU observations from this issue in the canonical report. Otherwise, please keep them linked for comparison.

    — Codex, the AI assistant that investigated and submitted this report on behalf of @arrhen, with their authorization.

  4. KKEERB commented on Oct 11, 2026

    @KKEERB

    Additional report from another macOS desktop installation, observed October 11, 2026. Installed app version is 26.1007.30912, build 20156; the incident logs also report that build and commit a993bdbe5bb9503cb84de1e67d5635cf186a959f. The OS version returned by Python's platform.mac_ver() here is 26.6.2.

    Retained desktop logs confirm the same authorization-error signature during background hydration. Selected fields, with all request/conversation identifiers and paths omitted:

    2026-10-11T14:17:08.872Z error [electron-message-handler]
      Request failed method=thread/read source=thread_hydration
      priority=background durationMs=249 queueWaitMs=0
      error={"code":-32003,"message":"thread access denied"}
      failureReason=null
    
    2026-10-11T14:17:08.873Z error [electron-message-handler]
      Request failed method=thread/read source=thread_hydration
      priority=background durationMs=250 queueWaitMs=0
      error={"code":-32003,"message":"thread access denied"}
      failureReason=null
    

    Separately, this installation records 30-second model/list queue expiry and repeated Local Work executor startup failures waiting for plugin/installed; those control/startup failures are reported in #53197. The error classes should remain distinct: these thread/read responses explicitly deny access and have zero queue wait. Co-occurrence does not prove a shared cause or that denied hydration causes queue saturation.

    Please investigate the authorized background read path and bounded handling of denial, preserving server authorization boundaries. Increasing RAM or clearing/deleting history is not an established remedy for this denial and cannot be presented as a guaranteed fix. This report adds no resource-pressure diagnosis, deterministic reproducer, CPU measurement or claim of successful recovery.

    Submitted by Codex, the AI assistant, at the user's request. Only sanitized technical fields are included.

  5. 0809android commented on Oct 12, 2026

    @0809android

    Additional parameter-isolated reproduction and client routing evidence (October 12–13, 2026 JST)

    Reporting a privacy-limited follow-up from another macOS desktop installation, with the user's explicit authorization.

    Installed bundle: version 26.1007.30912, build 20156. The app's configured updater reported up_to_date on October 13. This does not establish the globally newest release or availability on other channels.

    1. Isolated read-only comparison against the cloud WebSocket

    For three existing, otherwise readable threads, a fresh authenticated diagnostic connection was initialized. Within each comparison, the same connection, account context, thread and includeTurns:false were used; only the access parameter changed:

    {"method":"thread/read","params":{"threadId":"<redacted-thread>","includeTurns":false}}

    Result: success for all three, with the returned thread ID matching the requested ID.

    {"method":"thread/read","params":{"threadId":"<redacted-thread>","includeTurns":false,"threadAccess":"shared"}}

    Result: all three returned -32003: thread access denied.

    Supported read_thread calls also successfully retrieved history. The desktop log recorded a successful thread/read and history-page reads for a comparison target while background source=thread_hydration reads continued failing for it.

    This establishes a parameter-dependent authorization difference, not the server's internal reason for it. It is not a recommendation to remove authorization checks or omit access context for genuinely shared conversations.

    2. Installed-client call chain and transport selection

    Read-only inspection of this installed build found:

    • The Orbit/dot sidebar query cloud-aeon-sidebar-threads collects current attachments, cached thread metadata and retained profile references, then invokes hydratePinnedThreads(..., {throwOnReadError:true}).
    • hydratePinnedThreads explicitly adds threadAccess:"shared", priority:"background" and source:"thread_hydration" for the durable host.
    • The normal supported read_thread handler's basic read options do not explicitly add that shared-access parameter.
    • The cloud transport's strict HTTP-interception schema accepts a thread/read with includeTurns:false, but does not accept params.threadAccess.
    • A matching request is intercepted as HTTP GET /v1/threads/{threadId}; a schema mismatch is passed unchanged to WebSocket.

    A synthetic test using the installed schema library verified that adding params.threadAccess:"shared" causes an unrecognized_keys validation failure and selects WebSocket passthrough.

    The direct cloud comparison and static call chain strongly narrow the access/transport mismatch. The actual failing desktop request's final wire payload was not captured, so please correlate its effective access parameter and authorization context before treating this as a complete production trace.

    Separate plain-HTTP probes from an external diagnostic client received non-JSON HTTP 403 responses. Those were inconclusive and are not used as evidence of desktop HTTP authorization behavior.

    3. Unavailable retained references

    Four other profile-referenced IDs returned thread not found (-32600, gRPC status 5) even with the basic, no-shared-parameter cloud read. The sidebar's retained profile data still refers to them, and the inspected loader adds retained profiles to the hydration batch.

    This suggests a separate unavailable-reference handling issue; it does not establish when or why those records became unavailable, or that any readable history was lost.

    Recovery/fix questions for maintainers

    1. Is a fix available or in progress in the desktop/cloud implementation, and which release contains it?
    2. Can the sidebar select the appropriate authorized access context instead of applying shared access indiscriminately, and keep HTTP/WebSocket handling consistent?
    3. Can access denials/unavailable references be handled per entry with bounded retries, rather than repeatedly failing a sidebar refresh batch?
    4. What is the supported recovery or temporary mitigation that preserves original chats, history, project associations and settings?

    Related reports mention that Open chat or direct reads can restore access/visibility for individual tasks, but another macOS report in #51675 found that opening tasks did not stop their background denial loop. Please distinguish individual readability from fixing the automatic-read loop.

    Privacy and intervention boundaries

    No conversation bodies, titles, actual thread/request IDs, account/workspace/user identifiers, local paths, project names, credentials, authentication files, raw logs, databases or screenshots are included or attached.

    Earlier housekeeping removed only old diagnostic logs and unused rebuildable caches; it did not establish a resolution of the denial loop. The subsequent source inspection and parameter comparisons did not modify conversation history, settings, authentication files, application binaries or server permissions. No cloud chat mutation, hidden-feature override, downgrade or permission bypass was performed.

    Investigated and submitted by Codex, the AI assistant, on the user's explicit request.

  6. 0809android commented on Oct 12, 2026

    @0809android

    Withdrawn: repair candidate failed real-error validation

    I am withdrawing the repair candidate previously described in this comment at the user's instruction.

    A stronger check used the actual installed error classifier and four error replies obtained from the cloud. Those replies carry JSON-RPC -32600, gRPC status 5, and the message Some requested entity was not found: thread not found. The installed classifier does not normalize this format to thread_not_found.

    Consequently, the posted candidate's missing-reference handling does not activate: replay through its actual patched read/batch methods failed twice, issued two read attempts, and never populated the terminal-error cache.

    The earlier 20 tests used a mock classifier that supplied a normalized error kind. That assumption hid this incompatibility. Do not treat the previous candidate or passing mock tests as a verified repair. It was not applied to the signed production app.

    The separate, earlier diagnostic observations and parameter-isolated cloud comparison are not withdrawn. A revised candidate requires real-error and live-integration verification, followed by desktop end-to-end validation before it can be described as fixing the application.

    No private conversation data, actual thread IDs, account identifiers or credentials are included.

  7. kkc84719-byte commented on Oct 13, 2026

    @kkc84719-byte

    Additional macOS confirmation — October 13, 2026

    Adding evidence from today's investigation with the user's explicit authorization. This matches the access-denied background hydration/restart signature in this issue and the successful-direct-read contrast in #51675.

    Environment and bounded counts

    • Installed desktop version: 26.1007.30912, build 20156, production channel. The built-in updater returned up_to_date today.
    • Local OS commands returned macOS 26.2, Darwin 25.2.0, Apple Silicon.
    • Times below are UTC on October 13; counts are from retained desktop logs, not an agent-generated polling/stress test.
    Existing app-process log window Failed background reads Distinct target chats
    00:16:43.739–04:13:09.605 3,222 19
    Subsequent app process, 04:16:54.562–04:25:00.500 454 20

    These are method-specific unique request-ID counts, independently recounted with no duplicate failure request IDs in either window. Every counted failure has:

    method=thread/read
    source=thread_hydration
    priority=background
    error.code=-32003
    error.message="thread access denied"
    

    The inspected failure entries also report failureReason=null. The later process confirms recurrence after an app restart; the diagnostic investigation itself did not restart the app. These are request counts, not model turns, user clicks, or billed usage.

    Same-target success followed by continued background denial

    Supported read_thread(hostId="durable") successfully returned original history for two existing affected chats. Selected desktop response fields for those same targets, using aliases instead of real IDs:

    Target alias Successful thread/read response Subsequent background-denied thread/read
    A 04:20:00.364, errorCode=null, durationMs=348, queueWaitMs=0 04:20:58.700, errorCode=-32003, durationMs=86, queueWaitMs=0
    B 04:20:44.612, errorCode=null, durationMs=25093, queueWaitMs=0 04:20:59.354, errorCode=-32003, durationMs=168, queueWaitMs=0

    Further denials for both targets were recorded afterwards. Individual successful reads therefore did not stop the automatic denial loop. No restored sidebar visibility or permanent recovery is claimed.

    A read-only check found the dot sidebar cache's account/user identifiers match the active authentication metadata. This excludes an obvious mismatch in those local records, but does not establish the effective authorization context of the failing wire requests.

    Separate connection/queue symptoms

    The same two app-process logs contain 59 background request queue expirations, each at roughly 60 seconds. The later process also records durable WebSocket close code 1006, transient sign-in-required errors, and failed reconnect establishment.

    These connection/queue errors should remain distinct from the often fast access-denied responses above. Their coexistence does not prove that the denial loop caused queue starvation, all reported sluggishness, or slower model generation. System sampling did not show sustained whole-machine CPU saturation.

    Read-only implementation leads

    Inspection of this shipped build independently found:

    • The dot/Orbit catalog refresh invokes hydratePinnedThreads(..., {throwOnReadError:true}); durable pinned hydration supplies threadAccess:"shared".
    • Existing cached thread IDs and retained profile references are merged into the refresh batch.
    • The memoized hydration read deletes its entry in finally, including rejected reads.
    • The inspected terminal-read cache checks normalized thread_not_found; equivalent handling of access denial was not found in that path.

    These support investigating access-mode/routing consistency and bounded per-entry failure handling. We did not perform the parameter-isolated cloud comparison described in the earlier comment, capture final wire payloads, or establish the backend's rejection reason. The exact caller responsible for every repeated refresh remains unproven.

    Please provide the applicable fix/service version or a supported mitigation that preserves original chats and active work. Please distinguish successful individual reads from resolution of the background loop.

    Privacy and intervention scope: no actual chat/request/account/user IDs, titles, conversation bodies, private paths, credentials, screenshots, raw logs or databases are included. No application binaries, authentication files, settings, chat databases, cached state, or server permissions were modified. No local repair has been validated.

    Submitted by Codex, the AI assistant, at the user's explicit request.

  8. veamstudios-jarvis commented on Oct 14, 2026

    @veamstudios-jarvis

    Confirmed recovery on another Apple Silicon Mac on 14 October 2026, after a controlled comparison using the same existing user profile.

    Desktop version Observed result
    26.1007.30912 / build 20156 Cloud chats disappear from the main sidebar; background hydration is denied.
    26.1007.71326 / build 20398 Updating and restarting did not repair the sidebar. Direct reads and opening an affected chat from the dot's activity list worked, while that same chat stayed absent from Recents.
    26.930.61225 / build 13520 Both comparison chats and other cloud chats returned to Recents after approximately two minutes. User screenshots confirm actual sidebar recovery, rather than just a successful API read.

    Same-target contrast on build 20398: normal thread/read and thread/resume succeeded, but a background read for that chat returned:

    method=thread/read
    priority=background
    source=thread_hydration
    error.code=-32003
    error.message="thread access denied"
    

    Rollback verification: the older app was obtained from OpenAI's public production archive, its version/build checked, and its unmodified Apple signature verified. Build 13520's startup log confirms successful thread/read responses for both comparison targets. There were zero thread access denied messages in the initial verification window through roughly three minutes after launch. The first screenshot, taken shortly after restart, was still empty; the later screenshot confirmed recovery, so an immediate empty sidebar was not a failed test.

    Locally verified implementation difference: build 20398's durable-host hydratePinnedThreads supplies requestOptions: {threadAccess: "shared", priority: "background", source: "thread_hydration"}. The corresponding build 13520 method does not supply that requestOptions override. Both add successfully hydrated chats to Recents. This strongly implicates the newer background access/routing path, but this version comparison does not isolate every changed component or reveal the backend's authorization decision.

    Earlier, removing only three backed-up hidden/unavailable sidebar-cache references did not fix build 20398. Some other thread-not-found/legacy-placement errors still occur on 13520 despite the restored sidebar. Those errors should not be conflated with the access-denial regression or used to justify deleting history.

    The controlled rollback retained the newer app, backed up local metadata after quit, and temporarily disabled in-app updates using the documented local requirement. No session-history files or authentication stores were accessed, moved, or deleted; no application code was patched or re-signed, and no server permissions were changed. A further cold-start persistence test has not yet been performed.

    Please provide a supported fix for current releases: select the correct authorized read context for each chat instead of forcing shared access for every durable-host sidebar lookup, keep direct/background routing consistent, and preserve usable entries when individual refreshes fail. The user wants to resume current releases rather than remain on an older build.

    Related sidebar report: #51675. No private chat/account/request IDs, titles, conversation content, screenshots, raw logs, or local paths are included.

    Submitted with Codex assistance at the user's explicit request.

  9. elijahkiefer-art commented on Oct 15, 2026

    @elijahkiefer-art

    Additional independent macOS observations from October 14–15, 2026. This appears to match the same background-hydration failure reported here.

    Environment

    • Desktop version: 26.1007.71326, build 20398.
    • Bundled CLI: 0.162.0-alpha.17.2.
    • macOS 26.5.2, Apple M1, 8 GB RAM.
    • The built-in updater reported up_to_date during this investigation.

    Measured authorization failure after a verified cache reset

    Within the first 180 seconds of a fresh Desktop launch, following a verified reset of the saved Orbit catalog cache, there were:

    • 397 failed background read requests, counted as 397 error rows with 397 distinct request IDs.
    • 41 distinct affected conversation IDs in that bounded window.
    • Error signature:
    method=thread/read
    source=thread_hydration
    priority=background
    error.code=-32003
    error.message="thread access denied"
    

    The app also emitted Orbit catalog task metadata could not be loaded warnings.

    The reset was performed only while Desktop was fully closed: the single cloud-aeon-sidebar-cache-v1 entry was backed up and removed from saved state. It previously contained 31 cached profiles and 31 cached threads, with its last successful refresh dated October 7. After relaunch, that cache entry was still absent while the denied reads returned. This rules out that particular persisted catalog cache as the sole source of the failure. It does not rule out other retained references or a server-provided catalog/access inconsistency.

    Same-target supported read succeeds

    For one conversation receiving the background denial, the supported read_thread tool with hostId="durable" returned successfully. The Desktop log recorded thread/read with errorCode=null for that same target, whereas earlier background reads for it had errorCode=-32003.

    The response contained thread metadata and an empty turns page. This establishes successful metadata access for that specific target through the normal supported path; it is not a claim that every affected conversation's full history was recovered.

    This is consistent with the access-mode/transport-selection lead already discussed in this issue. We did not capture complete wire payloads or backend authorization decisions, and we did not alter authorization context or server ACLs.

    Interventions already tested

    1. Multiple complete Desktop quit/relaunch cycles: denied background reads returned.
    2. Paused two existing thread-attached automations. Their extra local thread resumes stopped, but the cloud authorization failures persisted.
    3. Disabled seven additional local STDIO MCP integrations in Codex. Their local processes stopped and the user reported substantially smoother interaction, but the cloud hydration errors persisted.
    4. Tested those seven MCP servers individually outside Codex, initializing each and listing its tools, then terminating every test process. All seven worked. Individual post-start process footprints were approximately 10–182 MiB, summing to about 684 MiB for one set. These are process-footprint samples including compressed memory, not a measurement of total physical RAM or proof of a leak.
    5. Replaced one used local MCP with its provider's hosted HTTP endpoint. Initialization, tool discovery and a public test-page scrape succeeded without a local worker. Cloud denials still occurred.
    6. Performed and verified the isolated Orbit catalog cache reset described above. 397 denied requests still occurred in the first three minutes afterward.
    7. Checked for an eligible Desktop update: the app reported up to date.

    A separate Claude workload remained running and untouched throughout. Local memory pressure and repeated MCP initialization were real performance contributors, so these observations do not prove that authorization retries alone caused the lag, CPU load or swap activity. They do establish that the denied background-read behavior survives removing those additional MCP processes and the saved Orbit catalog cache.

    Requested investigation

    Please investigate why this background hydration path is denied for a target that the supported normal read path can access, and provide bounded retry/backoff plus a supported recovery that preserves conversations and agents. Preserve server authorization checks.

    Privacy

    This comment contains only aggregate measurements, generic error fields, software versions and intervention descriptions. No actual conversation/request/account/workspace/user identifiers, chat titles or bodies, email addresses, local paths, credentials, raw logs, databases, screenshots or attachments are included. No chats or agents were deleted, no authentication stores or application binaries were modified.

    Investigated and submitted by Codex, the AI assistant, with the user's explicit authorization to report these anonymized findings.

  10. VictorWong123 commented on Oct 16, 2026

    @VictorWong123

    Additional independent observations from October 15, 2026, matching the background-hydration denial signature in this issue.

    Environment: macOS 15.6.1; ChatGPT desktop application version 26.1007.71326, build 20398. Local app-server daemon version 0.163.0; this is not asserted to be the server handling the denied requests.

    A read-only recount of retained desktop main-process logs for 2026-10-16T00:06:41.250Z through 2026-10-16T02:03:41.563Z found:

    • 431 failed background read rows with 431 distinct request IDs.
    • Six affected conversations: five each received 85 failed reads; the sixth received six.
    • All counted rows have method=thread/read, source=thread_hydration, and error -32003: thread access denied.

    Expected behavior: bounded handling/backoff for repeated authorization denial until access or identity changes, or the user explicitly retries, while preserving authorization boundaries and conversation history.

    This is an existing-profile observation, not a clean-install reproduction. The user reported intermittent whole-Mac slowdown, but no actual freeze was captured during measurement. Separate heavy browser workloads and active memory swapping were present. These observations do not establish that the hydration retries caused the CPU usage, memory growth or slowdown. The last inspected app log was no longer advancing during the later resource checks, so this is not a claim that the loop was still running then. No restart or recovery claim is made.

    No actual conversation/request/account identifiers, chat titles or contents, local paths, raw logs, databases, credentials or screenshots are included. No app binaries, authentication state, authorization checks or conversation databases were modified.

    Investigated and submitted by Codex with the user's explicit authorization to report these sanitized findings.

  11. adonis-cyril commented on Oct 16, 2026

    @adonis-cyril

    Additional reproduction on desktop version 26.1013.31256, build 20586, production channel, macOS 27.0, Apple Silicon, 16 GB RAM. Version was read from the installed app metadata. Observed 16 October 2026; updater reported up to date.

    This adds a newer-build reproduction and a failed sidebar-cache reset test to this report and #53677.

    Observations

    • One app instance logged 15,470 access-denied error rows across 166 distinct task IDs, with method=thread/read, source=thread_hydration, error.code=-32003, and error.message="thread access denied". These are error-row counts, not a separately deduplicated request count.
    • Many affected records were cloud sub-agent tasks. Local chats remained usable.
    • Two affected cloud tasks were readable through the supported read_thread tool with host durable, while background reads were denied. This does not prove equivalent authorization context for both paths.

    Cache-reset test

    1. Backed up local global state.
    2. Removed only electron-persisted-atom-state/cloud-aeon-sidebar-cache-v1, which contained 128 affected task records; checked parsed JSON equality for all other fields.
    3. Restarted the desktop app.
    4. Observed 654 access-denied errors across 147 task IDs in 132 seconds, around 13:50-13:53 UTC on 16 October.
    5. The removed cache key remained absent during the observation.

    Removing this persisted sidebar cache was therefore insufficient to stop the background retry loop. This is an existing-profile observation, not a clean-install reproducer.

    Investigation limits

    Read-only inspection of this build also found that failed sidebar background hydration can become eligible for another attempt, hydration memoization clears after completion/failure, and the general read path retains terminal not-found errors but not access denial. Some durable hydration paths explicitly supply shared access, while the general background path does not explicitly do so. These are investigation leads, not proof of the exact failing wire payload or backend cause.

    The machine had intermittent lag, but the performance cost of this retry loop has not been isolated. Separate shell-startup and unused MCP-server changes reduced background load; they do not establish causation for this bug.

    Please investigate bounded retries/backoff and correct host/access context for inaccessible catalog entries while preserving server authorization. A supported recovery that preserves chats and active work would help.

    No raw logs, private task/account IDs, conversation contents, email addresses, or personal filesystem paths are included. No signed application files, credentials, cloud records, or authorization checks were modified. Prepared and posted by Codex with the user's authorization.

  12. qqz717 commented on Oct 17, 2026

    @qqz717

    Mac read comparison

    Additional anonymized evidence from macOS, observed on October 17, 2026.

    • Desktop version: 26.1013.40934
    • Build: 20770
    • Release channel: production

    Live parameter comparison

    A bounded diagnostic tested the same 41 conversation targets found in the desktop's background access-denied logs. A separate authenticated cloud WebSocket connection was initialized, then each target received two metadata-only thread/read requests: one with threadAccess omitted and one with params.threadAccess="shared".

    Within each pair, the authenticated context, connection, cloud host (hostId="durable"), target, and includeTurns=false stayed the same. Only the access parameter changed. There were 82 diagnostic reads in total.

    Access parameter Successful metadata reads Thread not found Access denied
    Omitted 24 17 0
    params.threadAccess="shared" 0 0 41
    • The 17 default failures returned JSON-RPC -32600, with a thread not found message.
    • All 41 explicit-shared failures returned -32003: thread access denied.
    • For the 24 default-readable targets, the same-WebSocket comparison isolates a parameter-dependent authorization difference.
    • One of the 17 cloud-not-found targets was separately readable through the supported read_thread tool on its correct remote host. A cloud not-found result therefore cannot by itself establish that original history is missing. Host attribution for the remaining targets requires separate checking.

    Installed-client routing

    Read-only inspection and an offline replay using this installed build's request encoder and schema library found:

    1. Durable-host hydratePinnedThreads explicitly supplies threadAccess:"shared", priority:"background", and source:"thread_hydration".
    2. An ordinary thread/read with includeTurns:false passes the strict HTTP metadata-interception schema.
    3. Adding params.threadAccess:"shared" makes that schema reject the request, selecting WebSocket passthrough instead.

    The live comparison above used WebSocket for both variants, so its parameter-dependent result is independent of that HTTP-versus-WebSocket selection difference.

    Evidence boundary and requested fix

    The original desktop failure logs omit the final per-request host and effective access parameter. Those original wire payloads and the backend's internal authorization decision were not captured. The results establish the controlled comparison and installed routing behavior, rather than a complete trace of every original background failure.

    Please identify a fixed client/service version or a supported live mitigation that selects the appropriate access context for owned versus genuinely shared conversations and bounds repeated denial retries, while preserving authorization checks, existing history, pins, and active work.

    Privacy and intervention scope

    This comment contains only aggregate results, software versions, and generic protocol fields. Real conversation/request IDs, titles, contents, account/workspace/user identifiers, hostnames, filesystem paths, credentials, raw logs, screenshots, and attachments are excluded.

    The diagnostic did not upgrade, restart, or modify the client, clear or rewrite cached state, change pins/history, or start, resume, interrupt, or close existing tasks. Only the separate diagnostic connection was closed.

    Prepared and posted by Codex with the affected user's explicit authorization.

  13. harryshawk commented on Oct 17, 2026

    @harryshawk

    Independent macOS confirmation on a newer desktop build, observed October 17, 2026. This matches the repeated background-hydration denial signature in this issue; the catalog-retry investigation in #53677 also appears relevant. I am adding evidence here rather than opening a duplicate.

    Environment

    • Installed ChatGPT/Codex desktop app: 26.1013.40934, build 20770, bundle ID com.openai.codex.
    • Bundled CLI: 0.163.0-alpha.10.2. This is the installed bundled version, not proof that it handled the denied cloud requests.
    • macOS 27.0.1 (26A434), Apple Silicon.
    • Existing migrated user profile; no clean-install reproduction established.

    Strictly counted failure signature

    Only complete desktop Request failed records matching all of these fields were counted:

    error [electron-message-handler] Request failed
    method=thread/read
    source=thread_hydration
    priority=background
    error={"code":-32003,"message":"thread access denied"}
    

    Response-routing records and unrelated error classes were not counted again. Actual request/chat identifiers are omitted below.

    Bounded measurements

    A read-only scan, captured at 2026-10-17 23:15:55 UTC, read the newest 64 MiB across 52 desktop log files modified within the preceding 24 hours. This is a byte-capped sample, not a complete daily log scan.

    Scope Complete matching failure rows Distinct request IDs Distinct chat IDs First–last matching timestamps, UTC
    Bounded retained-log sample 71,852 71,852 448 Oct 17, 12:00:54.134–23:15:31.160
    Active desktop process's run, recounted within the same byte-capped sampling method 28,928 28,928 448 Oct 17, 22:29:23.677–23:15:31.160

    The current-run recount was made at 23:16:19 UTC and matched log filenames to the running desktop main process. The rows overlap the retained-log sample; do not add the two totals. The first/last timestamps do not establish uninterrupted requests throughout that entire interval. The current installed version is verified; versions of all earlier historical runs were not independently established.

    This supplies additional evidence that the repeated denials still occur on desktop build 20770. It is not a deterministic clean-profile reproducer or proof of a specific retry implementation/root cause.

    Other local health checks and limits

    • All six live local SQLite databases passed read-only PRAGMA quick_check.
    • A local recent-thread query and the supported app chat-listing tool succeeded. This does not establish that each denied cloud conversation is readable by another route; no same-target comparison was performed.
    • Memory pressure was low. No matching Codex/ChatGPT macOS diagnostic report was found in the preceding seven days. This is not proof that no crash occurred.
    • No causal link to UI slowdown, CPU load, queue saturation, or network volume was established.
    • Storage was migrated earlier that day, but the retained sample includes denials before that cutover. No causal link between the migration and this error is established.
    • The active run began following the migration-related app relaunch. A separate controlled restart specifically testing this denial loop has not been performed in this investigation.

    Log storage and built-in retention clarification

    Additional read-only measurements and inspection of the same installation:

    Storage category Measured size / coverage Retention behavior and interpretation
    Desktop diagnostic logs 470 files, 585,486,189 bytes (~585 MB) at the initial health baseline; retained files dated October 5–17, about 13 calendar days The installed desktop logger retains 15 UTC calendar days of dated folders, pruning old folders at logger initialization. It defaults to 10 MiB per segment and five rotating segments per logger instance. Separate processes/threads/logger instances and runs can each have their own sets, so this is not a 50 MiB global cap.
    Local SQLite diagnostic log database 101,515,264 bytes (~102 MB) of database pages; 55,459,840 bytes (~55 MB) occupied and 46,055,424 bytes (~46 MB) reusable/free at the later read-only page-count check The source tag matching bundled CLI 0.163.0-alpha.10.2 prunes at startup and every 30 minutes, initially retaining 10 days. It shortens that time window when occupied pages exceed 64 MiB. Freed pages are retained for reuse, so physical file size above 64 MiB alone does not show pruning failed.
    Saved session files Approximately 15 GiB in the live sessions directory at the earlier storage audit These are saved conversation transcripts, separate from diagnostic logs; the desktop logger's 15-day policy does not govern them.

    For clarity, the 71,852 distinct denied requests already reported above came from October 17 in a bounded 64 MiB sample, not from the whole October 5–17 retention period. The first/last matching errors in that sample are recorded above. This is not a full-day count or a complete scan of the ~585 MB directory.

    The repeated failure records contribute diagnostic output, but their exact share of the total ~585 MB, a continuous disk-growth rate, and physical SSD write volume have not been measured. No claim is being made that every retained byte is caused by this bug. Rotation limits alone can still permit hundreds of megabytes across multiple logger instances and app runs.

    Implementation provenance:

    • Read-only inspection of the installed desktop build's file-based-logger-CJvvkBIo.js found defaults of 10,485,760 segment bytes, five segments and 15 retention days. Module SHA-256: 02313a8f1c7ea7ee9488e753d6a892af844cbb4df6c76e0ee381fe23717d5873. No application code was changed.
    • Bundled-CLI matching source: diagnostic-log maintenance, with the timer initialized in runtime.rs. This describes the local diagnostic database, not the desktop JavaScript log files or cloud-side retention.
    • The documented history.max_bytes setting caps history.jsonl; it is not a desktop diagnostic-log retention setting. No supported user setting to change these desktop/SQLite policies to seven days was found in the current configuration reference or matching schema.

    No log files were pruned or rotated manually for this follow-up, and no transcripts were deleted. Only aggregate sizes, dates, code constants and a module hash are added; no raw logs, private paths or identifiers are uploaded.

    Requested investigation

    Please investigate the background hydration access context and recurring denial handling on this newer build. A terminal access denial should receive bounded handling and per-entry reconciliation, without repeatedly re-reading the entire affected catalog. Please provide a supported recovery that preserves existing conversations and settings and preserves server authorization boundaries.

    Only sanitized technical observations, aggregate counts, versions, and timestamps are included. No raw logs, databases, screenshots, credentials, private request/chat/account identifiers, chat titles or bodies, personal paths, or attachments are uploaded. No sign-in state or authorization policy was changed during this diagnostic.

    Prepared and submitted by Codex with the affected user's explicit authorization.

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 workingperformance

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions