Repository navigation
[macOS Desktop] Orbit catalog treats access-denied hydration as retryable and repeatedly reloads 65 chats #53677
Description
Summary
Codex Desktop on macOS repeatedly requests metadata for the same 65 cloud chats and receives -32003: thread access denied. A full restart does not stop the requests. Read-only inspection of this shipped build identifies the cloud “Your dot”/Orbit catalog refresh as a concrete retry path: a terminal permission failure is wrapped without an HTTP-style status, treated as retryable, and the catalog refresh can repeat every minute.
This report adds a specific caller/error-classification lead to #53178. Please consolidate if appropriate.
Environment
- Codex Desktop:
26.1007.30912, build20156, production channel. - Desktop build commit:
a993bdbe5bb9503cb84de1e67d5635cf186a959f. - Bundled app-server:
0.162.0-alpha.17.2. - macOS
26.6.2(25G83), Apple Silicon. - Observation date: October 13, 2026.
- A second Mac's connected app-server reports the same bundled version. Direct inspection of that Mac was unavailable; the user also reports similar warnings there.
Observed behavior and measurements
Existing-profile observation, not a clean-install reproducer:
- Leave the desktop app open with existing cloud “Your dot” chats.
- Observe repeated background metadata reads failing with the fields below.
- Fully quit and reopen Desktop.
- The denied-read traffic returns.
From 00:17:30.411 through 13:53:03.813 UTC on October 13:
- 14,637 distinct failed request IDs across 65 distinct chat IDs, observed across three renderer IDs.
- Errors consistently include:
method=thread/read source=thread_hydration priority=background error.code=-32003 error.message="thread access denied" - The same IDs recur in batches. Later minute buckets contained 260 failed reads per minute; multiple renderers and retry attempts mean this is not claimed to be exactly one request per chat per minute.
- A persisted cloud sidebar catalog contains 46 of the denied IDs as thread records. Other denied IDs appear in output-related cached references.
- The cached catalog's account/user identifiers match the local authentication claims; a simple stale-account mismatch was not found. This does not establish that every cloud authorization context is correct.
In the inspected October 13 logs up to the same cutoff, there were also 103 distinct queue-full rejections: 94 account/read, 3 thread/read, 2 thread/items/list, and one each for config/read, mcpServerStatus/list, thread/turns/list, and fs/readFile. Queue snapshots show four requests in flight and 64 queued interactive requests. The most recent rejection in this window was at 13:42:15.056 UTC, shortly after app startup.
The user reports intermittent general app slowdown. The denied-read loop is unnecessary background work, but these observations do not prove it directly caused all queue-full events or all slowdown. In particular, most queue rejections concern account reads and warrant separate investigation.
Shipped-code investigation lead
Read-only inspection of webview/assets/app-shared-8bd9d0399038.js found:
- The
cloud-aeon-sidebar-threadsquery fetches Orbit profile/thread attachments, combines them with previously cached thread references, and callshydratePinnedThreads(ids, {throwOnReadError: true}). - Hydration uses at most two concurrent reads per batch. It collects failures and throws the first error after processing the batch.
- The query wraps that error in a catalog error class (
_4). Itsstatuscomes only from an existing numericerror.status; it does not map JSON-RPC-32003 / thread access deniedto a terminal authorization state. - The generic retry predicate (
Bq) retries errors with no numeric status, up to three retries. Numeric 401/403/404 statuses would be non-retryable. - The catalog sets
refetchIntervalto one minute when that same predicate says its error is retryable. It also refetches on mount, focus, and reconnect. - The general cloud read cache retains normalized
thread_not_founderrors, but not access denial. Explicit shared reads bypass that terminal-error cache. - A failed catalog refresh does not commit a reconciled catalog, allowing old cached references to remain candidates for later refreshes.
These branches explain how a permanent access denial can become a recurring batch refresh. The actual failing wire payloads and backend authorization decisions were not captured, and this is not proof that the catalog is the only caller responsible for every logged request.
Expected behavior / requested fix
- Represent access denial as a terminal unavailable state until identity/access changes or the user explicitly retries.
- Handle inaccessible entries independently so one denial does not repeatedly fail and reload the entire catalog.
- Reconcile stale catalog references while preserving original chats and server authorization boundaries.
- Coordinate/deduplicate background reads across renderers.
- Investigate the separate startup
account/readfan-out and queue-full rejections. - Provide a supported recovery path that preserves chats and active work.
Related reports
- [macOS Desktop] Persistent access-denied background hydration retries alongside high renderer CPU; restart does not resolve #53178: macOS access-denied hydration retries, CPU observations, and recurrence after restart.
- [macOS Desktop] Cloud tasks disappear from sidebar after restart; Dots lists them and direct reads restore individual entries #51675: macOS cloud sidebar/direct-read contrast.
- [Windows Desktop] Background hydration repeatedly reads access-denied conversations after restart #51572: Windows repeated access-denied hydration.
Privacy and interventions
No application bundle, signature, credential store, chat database, cloud chat, or access policy was modified. No patched app was installed. The investigation used read-only app/log/cache inspection and a short-lived diagnostic app-server to read effective configuration layers; that server was shut down.
No private chat/request/account IDs, titles, conversation contents, local paths, credentials, raw logs, or screenshots are attached. Prepared and submitted by Codex with the user's authorization.
Activity
github-actions commentedon Oct 13, 2026
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
photosamurai commentedon Oct 15, 2026
Additional evidence from macOS Desktop 26.1007.71326, build 20398, observed October 15, 2026. The configured updater reports
up_to_date. Platform: Apple Silicon, macOS 27.0 (26A428).Same retry pattern in this build
A bounded review of retained main-process logs from 2026-10-15 00:00:57.655 through 13:18:03.956 UTC found 9,357 distinct failed request IDs across 22 chat IDs. Counted entries have:
Failures occur across three window IDs. All 19 thread records in the persisted cloud sidebar catalog are among the 22 denied IDs. This is an existing-profile observation, not a clean-install reproducer.
Direct access succeeds, background access still fails
Using the supported
read_thread(hostId="durable")tool, two affected chats successfully returned their existing history. Correspondingthread/readresponses haderrorCode=nullat 13:18:06.831 and 13:18:08.363 UTC, followed by successful turn/item reads.After those successful reads, each same chat produced four further denied background hydration requests, with the latest at 13:19:18.169 and 13:19:18.466 UTC. Direct reads therefore demonstrate access through that path but do not stop background retries. They do not establish which request parameter, transport, or server context differs.
Current-build source confirmation
Read-only inspection of the installed
app-shared-8340f229c2b3.jsconfirms that the catalog mechanism described in this issue remains present in build 20398:cloud-aeon-sidebar-threadsmerges cached thread references into the hydration candidates and callshydratePinnedThreads(g,{throwOnReadError:!0})._4) copies an existing numericstatus; it does not itself map JSON-RPC-32003to a terminal HTTP-style authorization status.Bqallows up to three retries for errors without a numeric status. The catalog'srefetchIntervalreturns one minute when the query is in error andBq(0,error)permits retry; it also refetches on mount, focus, and reconnect.thread_not_founderrors, while durable shared reads bypass the memoized read path. Access denial is not suppressed equivalently.Concurrent window-input freeze; causal link not established
The user reports intermittent freezes requiring force quit in previous occurrences. During this occurrence, one window stopped accepting clicks and typing while the native macOS menu bar remained usable. A newly opened window works and was used for this investigation. This overlaps the symptom in #53707.
Evidence limits:
Reload Windowis present behindallowWindowReloadin the shipped menu implementation, but the user confirms it is absent from View and Command+Control+R has no effect in this installation. It is not an available recovery here.Please investigate the authorization/access-context contrast and terminal-error retry handling described above, provide a supported mitigation that preserves original chats, and investigate window input/focus recovery separately unless a causal connection is demonstrated.
No installed app files, signatures, credentials, access policies, chat databases, or original chats were modified. No raw logs, private chat/request/account IDs, titles, conversation contents, screenshots, or personal filesystem paths are included. Prepared and submitted by Codex with the user's authorization.
honghaoaa1230 commentedon Oct 15, 2026
Additional affected macOS profile on ChatGPT/Codex Desktop 26.1007.71326, build 20398 (bundle ID
com.openai.codex), observed October 15–16, 2026, UTC+8. Platform: Apple Silicon, macOS 27.0.1 (26A434); Codex Framework 155.0.8059.40.Bounded measurements
Across the retained main-process log segments for one app run, from 2026-10-15 03:49:02.526 to 16:10:52.495 UTC:
method=thread/read,source=thread_hydration, anderror.code=-32003 / error.message="thread access denied".cloud-aeon-sidebar-cache-v1for hostdurable.refreshStartedAtMsstill corresponds to 2026-10-08 12:04:40 UTC+8, a week before this capture. Cached profiles associate the six records with the same active root thread.Source confirmation / recovery concern
Read-only inspection of this installed build's
app-shared-8340f229c2b3.jsconfirms the issue's concrete retry path:hydratePinnedThreads(..., {throwOnReadError:true}).statusif present. The logs showOrbit catalog task metadata could not be loaded ... status=undefinedalongside these denials.This corroborates the source path reported above; it is not a wire capture proving which caller accounts for every request. The backend reason for the access denial remains unknown.
CPU observations and limits
During short local measurements the main renderer ranged from approximately 10–24% CPU, with one earlier two-second sample at 85.8%, and approximately 2.1 GiB physical footprint. Percentages are per logical core. These observations do not quantify the retry loop's CPU contribution. A separately identified Safari WebKit process was also consuming significant CPU; all system load and fan activity must not be attributed to Codex.
Please provide a supported way to stop this denied-background-read loop without deleting original chats, modifying app bundles or credentials, weakening authorization, or interrupting active local work/deployments. In particular, handle access-denied entries independently, stop retrying terminal denial until relevant access/identity changes or explicit retry, and allow stale catalog state to reconcile.
No app bundle, credential store, chat database, access policy, original cloud chat, or running task was changed during this capture. This is an existing-profile observation, not a clean-install reproducer. No raw logs, screenshots, private chat/account/request IDs, chat titles/content, or personal filesystem paths are included.
Prepared and submitted by Codex on the user's explicit request to report this bug to OpenAI.
ciwei0600 commentedon Oct 16, 2026
Additional evidence on macOS 26.5 (25F71), Desktop 26.1007.71326, build 20398. Observed October 16, 2026, UTC+8. The configured updater reports
up_to_date.The repeated background denial remains reproducible in this existing profile. Eleven remaining cloud targets each produced 29 distinct failed requests in a bounded ten-minute baseline. A later two-minute check still contained failures for all eleven targets. Relevant fields are:
A fresh supported
read_thread(hostId="durable")successfully retrieved an existing turn and idle status for one of the same targets; background hydration for it continued to fail. Opening a durable deep link, both with and without an explicit shared parameter, did not restore UI loading. A previous app restart also did not resolve the loop.Read-only inspection of this installed build confirms the catalog path described in this issue: retained cached IDs re-enter hydration,
hydratePinnedThreadsis called withthrowOnReadError:true, the error wrapper copies only an existing numeric status, and an unclassified denial remains eligible for three retries plus the catalog's one-minute periodic refresh. A failed refresh does not reach the final reconciled-cache write.An offline check evaluated the actual extracted
readThreadmethod, error classifier, and retry predicate against a fake transport, with no live app or network access:This isolates the retry-classification gap. It does not prove the backend cause of the first denial, identify the caller of every observed request, or quantify its contribution to overall slowness. Failing wire payloads and backend authorization decisions were not captured.
Please provide a signed client/service fix or a supported live recovery that preserves existing chats and active work. In particular: reconcile owned/shared access correctly, classify explicit denial per entry, allow other catalog records to update, and coordinate denial suppression across windows without blocking explicit foreground retry or active turns.
No installed app files, signatures, credentials, databases, caches, access policies, or original chats were modified in this follow-up. No active task was interrupted. This draft contains no private chat/request/account IDs, titles, project names, conversation contents, personal paths, screenshots, credentials, raw logs, or installed source excerpts.
Prepared and submitted by Codex with the affected user's explicit authorization.
0xdevalias commentedon Oct 17, 2026
Independent build-20398 confirmation and clarification of retry cardinality.
The actual
Bqretry predicate returns true at failure counts 0,1,2 and false at 3 for{code:-32003,message:"thread access denied"}: initial attempt plus three retries = up to four attempts per failed query batch. A batch can read multiple threads; multiple renderers and minute-based catalog refreshes multiply totals. Numeric HTTP 403 is terminal, but this JSON-RPC error has no numeric HTTPstatusfor the wrapper/predicate. This does not establish token expiry.Across the examined interval, 30 thread IDs were denied; 15 occurred in cached/pinned/order/reference state and six also existed in the local thread database unarchived. Local presence does not grant access on the durable service; cached local references can still be offered to remote hydration. The server's generic denial omits its specific authorization decision, so these observations do not distinguish obsolete host/reference/account scope or other backend policy reasons. It is not evidence of a macOS filesystem lock.
The actual durable
readThreadmethod repeated five transport requests in five synthetic access-denied cycles, including explicit shared access; a normalized thread-not-found control made only one call because it was retained terminally. Live denials had median queue wait 0 ms, maximum 5 ms, median response about 49 ms: unnecessary recurring traffic, but not proof of continuously saturated queues or the initiating cause of a separate local send stall.A different UI banner,
This is open in another app, usesAUsinapp-initial-1ab6fbe93c4f.js, matchingalready has an active writeroralready has a live local writer; the resume hook marks writer conflict. Please keep that single-writer conflict distinct from catalog read authorization and frontend owner/follower stream roles.Suggested fix: classify this access-denied code terminally for the affected host/account/thread/access scope, stop rehydrating it until meaningful identity/access change or explicit retry, reconcile stale references without deleting original conversations, and expose a sanitized denial reason. Do not change authorization scope merely to bypass the failure. Source and actual-code retry/read probes are included in #53197 (comment); the shared host scheduler problem is related load, not a proven common cause.
Verified 2026-10-17: Codex Desktop macOS arm64 26.1007.71326, build 20398, macOS 26.6 (25G72). Installed archive
Contents/Resources/app.asarSHA-2562f231a64e6dd30111bcd09e03c149cd06c8679b25914842772423251c4608ded.Build-specific source provenance:
webview/assets/app-shared-8340f229c2b3.js: SHA-2563b4cabc382e71f0da7398393a619d7c62d13dfae598a5fe2e9880ab8d31d1bf5..vite/build/main-CwxgTOle.js: SHA-25687d52265eb13608a380fabcac47ecf13a39b981115c0960c18af563ea6d32d51..vite/build/src-DCNiwad_.js: SHA-25686fb2066bbc2f7428864b76b46ef570b09eb1e92e81e9d6f089f5b048a66df25.Source observations below are version-specific. Offline probes evaluate extracted shipped methods in a Node VM with synthetic dependencies; they do not establish an unlogged live race. No app patch/restart, queue edit, direct send, or SQLite mutation was performed. Private text, annotations, account identifiers, task IDs, and raw logs are excluded.
dandelionxuan123-netizen commentedon Oct 17, 2026
Windows 当前版本仍反复读取访问被拒的聊天;同一台机器此前已累计三万多次
这是本问题在 Windows 当前客户端上的补充证据。用户报告该问题已持续数日;当前新启动窗口中的数百次失败不能代表此前长期运行时的严重程度。
当前环境与观察
同一台机器的历史严重程度
本次重新读回同一台 Windows 机器保存的历史诊断回执,确认以下记录。时间统一为 UTC+08:00:
旧回执的计数定义仅包含完整 Request failed、method=thread/read、source=thread_hydration、code=-32003、message=thread access denied;没有把 response_routed 再计一次。10 月 14 日的旧计数未在本轮重新逐请求 ID 去重,因此按历史完整拒绝事件报告,不冒称已重做全量独立去重。10 月 17 日较早窗口另有两次 app-server unavailable,它们不包含在 10,368 次访问拒绝中。
这些快照和不同会话窗口不相加成一个总数;聊天集合可能跨会话重叠。记录支持“至少在 10 月 14 日与 17 日均存在,单个旧会话曾累计三万多次”,不证明中间每一分钟持续请求,也没有流量字节测量。旧会话的精确运行包版本未随本表重新核定,不能把当前版本追溯套用于全部历史记录。
当前版本的本机对应证据
只读核查当前安装包,发现:
之前修复的短名称仍保持,原正文未变;多条被拒记录原本也有短名称。补名称没有消除这个访问拒绝与重复读取问题。
请求的修复或正式恢复办法
请提供适用于 Windows 当前签名客户端或服务端的修复:
当前仍未知:服务端首次拒绝的具体授权规则;每条失败请求的完整 wire 参数;每次刷新具体由哪个调度事件触发。
隐私与操作边界
本次补充经用户明确同意,只发送脱敏文字。未包含私人聊天/请求/账号 ID、用户名、项目名、本机路径、正文、凭据、原始日志或截图。未修改客户端、数据库、缓存或安全策略;未删除或归档聊天。用户对新开窗口的时间确认与实际日志核对过。这里的隐私范围不包括任何另行由反馈界面自动附带的诊断内容。
jrsarnold commentedon Oct 17, 2026
Windows follow-up: the cloud-history retry problem remains after a targeted cache refresh and an alternate-network test on October 17, 2026.
Environment: Windows 11 Pro 10.0.26300; desktop app 26.1013.31256, build 20586; MSIX 26.1013.3656.0; bundled CLI 0.163.0-alpha.10.2. The configured updater reported up_to_date earlier in this investigation.
These are bounded observations of an existing profile, not a clean-install reproducer:
The counted failures are complete Request failed records for thread/read, source=thread_hydration, priority=background, code=-32003, message="thread access denied". Corresponding response_routed records are not counted again.
The one cache intervention removed only electron-persisted-atom-state.cloud-aeon-sidebar-cache-v1 from the two global-state files while the app was closed. Backups, parsed-state preservation, and file ACLs were checked. The cache stayed absent but denied reads returned. On the phone hotspot, Ethernet was disconnected and the laptop's active route used Wi-Fi with a different gateway. The same denied IDs still recurred.
An affected original cloud chat was missing from sidebar/search while list_threads and read_thread(hostId="durable") could retrieve it. The built-in thread-ID-only navigation selected hostId=local and failed with "no rollout found". A registered app link explicitly specifying hostId=durable then completed thread/read, turns/items reads, and resume; the user confirmed the original messages were visible. No further denials for that chat were observed in the following three-minute check; 87 others continued. That is a limited opening workaround, not a repair of the catalog.
Current-build read-only source inspection found the same path described here: cloud-aeon-sidebar-threads calls hydratePinnedThreads with throwOnReadError; BGn preserves only an existing numeric status; retry predicate dv accepts errors without a numeric status; the failed query can refetch every minute. The real catalog warning at 16:00:30.695Z logged status=undefined. An offline probe of the installed pure retry functions accepted a synthetic -32003 error at failure counts 0, 1, and 2, rejected it at 3, and rejected numeric HTTP 403 immediately. This establishes retry classification, not the server's reason for the first denial or the caller of every request.
Transport errors remain a separate question. The app logged ERR_SSL_BAD_RECORD_MAC_ALERT after restart, before the hotspot test. Ten public HTTPS downloads succeeded on each network; no new TLS/remote-offline/unknown-stream error was observed in the five-minute hotspot window. A read-only request through the desktop connection also succeeded. The user has avoided normal laptop-desktop integration because of the failures, so this is not a sustained workload or reliability validation.
Please provide a current Windows fix or supported recovery procedure that preserves original chats and active work, and investigate catalog host/access propagation and retry classification. This report does not establish that the denial loop causes all disconnects.
Only text observations, versions, counts, and sanitized error messages are included. No private thread/request/account IDs, chat titles or contents, personal paths, credentials, raw logs, screenshots, or app-state backups are attached.
aiyouwei-laoshu commentedon Oct 18, 2026
Additional macOS confirmation on 2026-10-18: supported cloud reads succeed while background hydration continues to report access denied.
Environment: desktop version 26.1013.40934, build 20770, production channel. The configured updater reported up_to_date during this diagnostic pass. This is an existing-profile observation, not a clean-install reproduction.
Observed results:
No incorrect local host/ownership mapping was found for the sampled targets. That does not establish which authorization context or request parameter differs between the successful and failing paths. No failing wire payload was captured, and no single owner/shared-access explanation is asserted.
Separate transport disconnections were observed earlier; the cloud connection subsequently recovered and a supported cloud read succeeded. Those transport errors should not be conflated with the continuing background access-denied responses.
This diagnostic pass did not restart the app, clear caches, modify installed code or signatures, change credentials/configuration/authorization policies, or delete/archive chats. Earlier update/cache-refresh attempts on this installation had not resolved the recurring denial; no cache reset or restart was repeated in this pass.
Please investigate the successful direct-read versus failing background-hydration context, bound repeated retries of authorization failures, and provide a supported recovery procedure that preserves original chats, configuration, and active work. Related: #53178 and #51675.
Privacy: this comment contains only sanitized text and aggregate measurements. No files, screenshots, raw logs, conversation contents/titles, private chat/request/account identifiers, credentials, configuration files, or personal filesystem paths are attached or included. Submitted with the user's explicit authorization.