Conversation
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
✅ Deterministic PR hygiene checks passed. |
리뷰 · 우선순위 61 / 80이 PR은 Devin 같은 쪽에서 온 타입이 있는 HTTP 429 거절을 Codex가 제대로 기다리게 고칩니다. 지금은 라인 - 메인테이너의 판단이 필요한 지점 메시지-only 경로도 앞에 붙이도록 맞출지, 이번 PR 범위는 typed 경로만으로 둘지. 또 아주 긴 힌트(예: 900초)를 Codex 네이티브 재연결에 그대로 맡기는 운영이 팀 기본값으로 괜찮은지. 너의 추천 범위가 작고 원인·수정·테스트가 잘 맞습니다. draft 해제 전 CI 초록을 보고, 가능하면 이 댓글은 grok-bot이 작성했습니다 |
|
Addressed the actionable points in the review in
Current focused regressions: 124 pass / 0 fail; file-size guard: 9 pass / 0 fail. Typecheck, structure/privacy checks and the 537-page docs build passed. New-head CI is pending; the earlier 15-minute native-runtime protocol result remains evidence for the same canonical error contract, not a visual Desktop or restart-recovery test. |
|
Follow-up pushed in fb19e19.
Validation scope is explicit in the PR body: the exact new pure-function cases passed in an isolated Node/TypeScript execution (8 pass / 26 assertions), and changed-file whitespace/targeted privacy checks passed. Bun, full repository typecheck, structure/privacy/file-size gates and the documentation build were not run locally for this follow-up. Earlier passing results remain attributed to their earlier revision. Post-push inspection found Cross-platform CI still in progress; the PR stays draft, with no claim that all exact-head checks or actual UI recovery have passed. |
Summary
Typed Devin refusals currently reach the Responses client as
resource_exhaustedwithretry after ~Ns. Codex treats that code as a generic retryable disconnect and does not parse its stated delay: an installed-runtime fixture advised 2 seconds but retried after 0.232 and 0.408 seconds. Changing only the code or only the wording did not fix the delay.Normalize known typed HTTP 429
rate_limit_errorcodes (resource_exhausted,rate_limit_exceeded,slow_down) to the Codex rate-limit contract only when a valid delay exists. Typed errors without usable timing retain their original code. A shared formatter puts the longest valid provider delay first asPlease try again in Ns.for both typed and message-only rate-limit failures. Competing original hints are retained under an explicitProvider detail:label. This fixes both the typed path losing the hint and the message-only path leaving a shorter hint first. Other explicit verdicts, including authentication, quota and local send-budget failures, are unchanged.The existing default of no Devin proxy-owned wait lets Codex own its bounded native retry. Delivery of retry advice does not guarantee a reconnect notification, visible Desktop text, or a successful next provider response. This PR creates no synthetic reasoning/tool/history items, changes no retry counts or live settings, and preserves account/combo failover, Grok HTTP 429 handling and opted-in proxy waits. A positive proxy wait still delays the client-visible failure and may multiply attempts with client retries; this is documented rather than silently reconfigured.
This is an interoperability follow-up to #5041, #5152 and #5933 (integrated by #5987), not a replacement for their same-request controls. Each client retry is a new HTTP request and does not inherit a previous proxy request's send counter or cumulative wait allowance. Cross-request workflow limits depend on their existing configuration and identity. Selecting a different retry owner is an operational decision outside this patch.
The follow-up commit adds long-advice regressions and Codex retry diagnostics; it makes no additional runtime change. In the public Codex
rust-v0.158.0-alpha.2.1stream retry handler, a release build can suppress the first notification when the internal WebSocket-enabled predicate is true. The predicate does not test delay length, and waiting occurs outside the notification block. This is a concrete possible explanation for a silent long wait, not proof that the observed request took that branch. Subscription/renderer availability is not event-delivery evidence. Changing that engine-side notification policy belongs in Codex; this proxy must not shorten the delay, manufacture history, force another request or silently reconfigure transport to make a row appear.Verification
Current follow-up:
fb19e19704f3bf05c578cecf7e630e0c27103c1ftests/server/retry-delay-hardening.test.ts: preserve 120/900/1800/2460/3600-second advice, keep a longer hint before a competing 1-second hint, retain formatting idempotence, and keep an intervening untimed socket error and a later 120-second refusal independent of the earlier 2460-second hint. These are parser/formatter checks, not elapsed-time, notification-predicate, HTTP classification or Desktop tests.describeblock, transpiled with TypeScript and using Node strict assertions for the two Bun matchers it uses. The real, unchangedsrc/lib/retry-delay.tswas compiled withtsc src/lib/retry-delay.ts --target ES2022 --module commonjs --strict --outDir <scratch>. This is deliberately not represented as a Bun run or repository-wide typecheck.git diff --cached --checkpassed for the two follow-up files. Targeted checks of those files found no raw identifiers, private paths, credentials or observation timestamps; this is not the repositoryprivacy:scangate.26cb4f7681861668bf0a0eb8f1466ea67804e499; the follow-up only adds the diagnostic page and extends an existing test file. No new test-file layout registration is needed.bun test tests/server/retry-delay-hardening.test.ts, full suite, repositorybun run typecheck,bun run structure:check,bun run privacy:scan, file-size gate, andcd docs-site && bun install --frozen-lockfile && bun run buildwere not run for this follow-up. The earlier results below do not validate the new documentation or test registration. Keep this PR in draft pending normal exact-head validation and review; do not mark these missing checks as passed.Earlier recorded local evidence:
26cb4f7681861668bf0a0eb8f1466ea67804e499adapter-error-inline,errors-adapter-failure,retry-delay-hardening,retry-after-429, andresponses-grok-devin-preflight— 124 pass, 0 fail, 301 assertions. Covers typed/message-only parity, no-delay code preservation, invalid delays, longest-hint precedence, idempotent formatting, redaction, exclusions, SSE/buffered parity, Codex SSE, Grok HTTP 429, account/combo failover and cancellation.b96a41560f: 34 Devin adapter/reset-retry/hardening tests, 97 direct encoder parity tests, and the 56-test bridge/server/file-size run passed. Retry scheduling and encoder implementations are unchanged by the review follow-up; these earlier runs are not represented as full-suite validation of the new revision.tsc --noEmit,scripts/structure-ssot.ts,scripts/privacy-scan.ts, andgit diff --checkpassed for the earlier revision.bun run buildpassed; 537 pages and 73,657 internal links checked. This build predates the new diagnostic page.0.158.0-alpha.2.1on Windows, isolated CODEX_HOME and loopback mock provider: normalized 2-second hints retried after 2.064 / 2.027 seconds; a real-clock 900-second hint retried once after 900.095 seconds, then completed. The following turn completed without the status text in model input and without reasoning items. Separate probes verified cancellation during a wait and retry-count exhaustion. These are native-runtime protocol tests, not a visual Desktop test or real Devin call.--changed=devpicked an unrelated local comparison ref, so it was corrected to--changed=origin/dev. Bun then spent over five minutes selecting the import graph without emitting a test run; that exact owned child was stopped. Focused regressions were the local scope exception; full cross-platform coverage remains for CI. No passing or cancelled upstream CI was rerun.Live observation supplied by the local reviewer, 2026-09-29
The observer tested a runtime-only backport of the three files from
26cb4f7681861668bf0a0eb8f1466ea67804e499onto the existing2.70.0-compat.6079bundle, not a full build of the current PR head. The observer reports a correlated automatic request 2460.067 seconds after the initial normalized-429 response ended, against advice of 2460 seconds. That request later failed with a socket-close 502 /upstream_server_errorafter about 19.8 seconds; the next attempt received a normalized 429 with 120-second advice. The work turn remained in progress.This confirms a real approximately 41-minute automatic retransmission, not final Devin recovery. A first reconnect row was not visible in the user's screenshot. The observer found an enabled error subscription and a
willRetrytostream-errortoReconnectingrendering path, with detail text collapsed by default, but did not capture actual notification generation or delivery. The upstream first-notification condition above remains a hypothesis for that specific missing row. This editing session did not independently re-read the local logs, restart the app/service, change settings, or send input to the test turn.Only validation scope and aggregate timing/outcomes are published here. Raw logs, account information, private paths, exact observation timestamps and conversation/thread/request/trace identifiers are intentionally omitted.
Still unverified: final successful live-provider completion, actual notification generation/delivery and Desktop display for the affected retry, a real 60-minute wait, and app-restart recovery. The native label remains Codex's
Reconnecting..., not a custom cooldown countdown. The PR remains a draft pending exact-head CI and review.A previously recorded read-only local retained-log audit found 96 failed Devin request records: 92
resource_exhaustedfailures (21 with parseable timing, 71 without), two client cancellations and two upstream failures. This supports the no-delay and unrelated-error exclusions. These are retained final-request records, not every provider attempt or an all-history sample; no raw prompts, account identifiers or error bodies are published.Checklist