Skip to content

fix(routing): let image requests wait out a rate-limit storm - #1223

Merged
seonghobae merged 5 commits into
mainfrom
fix/image-request-rate-limit-storm-wait
Sep 27, 2026
Merged

seonghobae merged 5 commits into
mainfrom
fix/image-request-rate-limit-storm-wait

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Current head — 2026-09-27

  • Exact head: 90911687cb1ee49325ddd1f2bdfd29284a526028. A non-destructive merge of #1209 at 84736f4d9840b3d06edb8fdcc7210abddd86175e removed the 69-commit behind count. The current branch is 0 behind/4 ahead and the PR diff remains limited to the original three files. GitHub reports the merge result CLEAN.
  • The five image-storm cases passed on this merge commit under the project interpreter with warnings as errors. The exact same two parent revisions were previously merged in a throwaway worktree and the complete Security and Quality pytest command passed there: 5,075 passed, 5 skipped, 3 warnings, exit 0 in 357.36 s. That is local validation of the same merge inputs, not a hosted verdict.
  • The PR was returned externally to Draft at this exact head on 2026-09-27T04:57Z because the older OpenCode CHANGES_REQUESTED state remains active. Security and Quality run 36290088757 completed cancelled; all four jobs were cancelled with runner_id 0, before runner assignment. There is no live required-check run to poll. The earlier Draft run 36289762531 was skipped and the previous ready-state run 36240841996 was cancelled before its four jobs executed. Two older OpenCode reviews remain CHANGES_REQUESTED from prior heads; neither supplies a source-backed product finding, but the review state remains active. Independent approval and terminal required checks are still missing. fix(ci): repair protected-main security and runtime regressions #1209 remains Draft, and central CodeQL publication remains owned by .github#1929 and .github#2276.

Stacked-base validation — 2026-09-26

This PR now targets #1209 at base 84736f4d9840b3d06edb8fdcc7210abddd86175e. The three-file PR diff is identical to the earlier main comparison; a temporary merge was conflict-free. The image/rate-limit/provider-error subset passed 68/68 under Python 3.14 with warnings as errors. A fresh temporary merge with project-local Python 3.12 and the locked dependencies/native decision extension ran the same full-suite command as the Security and Quality job, uv run --no-sync python -m pytest -q -ra: 5,075 passed, 5 skipped, 3 warnings, exit 0 in 735.81 s. This is complete local full-suite evidence for the combined source tree, while hosted CI and its other gates remain pending. A broader Python 3.14 run was stopped at 11% after 12 failures, 585 passes and one error; it is not full-suite acceptance and is not equivalent to the hosted Python 3.12 gate. A bounded repeat stopped at the first strict-warning failure: test_batch_embeddings.py encountered three unclosed socket warnings during garbage collection after 161 earlier tests. That file passes alone (19/19), and the new image regression file had not run yet. The hosted full-suite command uses Python 3.12 without -W error, so this local warning observation cannot be treated as its verdict. The failed runs described below were produced against the previous main base. Fresh hosted runs against this merge result are required before treating any required check as current-base evidence. #1209 remains Draft and must be approved and merged before this stacked PR can reach protected main.


Structure → Gap (from real Noema logs)

W2 (2026-09-21 11:28Z onward): 11 of 16 review requests ended with a final 429; the median request took 1,050 s. Decomposed by request_id:

  • Where the time goes: each request runs about 15–17 attempts. Most of them are successful NIM conduct steps (gemma-4-31b, llama-3.2-11b-vision, muse-glimmer), plus about 4,600 s of RemoteDisconnected on NIM gemma-4-31b-it across the 11 requests.
  • How it ends: the last step's candidates are only the OpenRouter ling-3.0-flash-{fin,sante}:free models. Both answer 429 within about 0.1 s, and the request fails immediately, discarding the finished work.
  • Why it does not wait (deployed): the pin 767e67f has no storm-wait at all (_invoke_with_rate_limit_recovery / rate_limit_wait_seconds came later). Main has it (default budget 30 s). Picking up main's storm-wait means bumping the .github sidecar pin, which is outside this repo.
  • Why it would still not wait on main for figure reviews (this PR): _invoke falls back to text candidates when no step candidate is vision-capable, but the storm-wait admission recomputed only the vision set. That set was empty, so it concluded "nothing to wait for" and re-raised 429.
same 1.5 s text-pool 429 storm (Retry-After 2) main 5665b0a this PR
text conduct request 200 after the wait 200 after the wait
image conduct request 429 at 0.5 s, no wait 200 after the wait (≈2.5 s)

Change (13 lines)

Apply _invoke's own no-vision fallback in _invoke_with_rate_limit_recovery, so the storm is judged on the candidates actually called. Unchanged: wait budget, pinned-model fail-fast, Retry-After/unknown cooldown, breaker/429 accounting, ZDR and allowlists. No conflict with #1222 (_invoke final error) or .github#2339 (preflight).

Tests

  • tests/test_image_request_rate_limit_storm_wait.py sends a real HTTP conduct request through a fake transport at ModelClient._open_provider, with no network.
    • RED on main: [image] fails in 3 of 3 runs; [text] passes.
    • GREEN: 2 passed in 5 of 5 runs (-W error).
  • Related suites (rate_limit_aware_admission, provider_error_taxonomy, passthrough failover, tool_execution_fallback, provider_reliability): 314 passed. The 4 provider_reliability failures are pre-existing locally on base.
  • Full local suite vs main: failure sets are identical, with 2 more passes.

Current-head review follow-up (0aad119)

  • The fake transport records each text candidate's monotonic call time and returns 429 on that candidate's first conduct attempt. The test asserts one 429 per candidate and no retry before its effective cooldown; this rejects a fast retry that happens to succeed.
  • The image/text pair runs with Retry-After: 1 and with no cooldown header. A zero wait budget returns 429 without replay. Existing test_explicit_concrete_model_single_candidate_storm_fails_fast_without_waiting keeps the pinned-model control.
  • RED on main 5665b0ad: the two image cases fail with 429 while text cases pass. GREEN on 0aad1190: python3 -m pytest tests/test_image_request_rate_limit_storm_wait.py tests/test_rate_limit_aware_admission.py tests/test_provider_error_taxonomy.py -q -W error --tb=short passed 54 tests locally. Hosted checks failed on this head; the current OpenCode review requests changes because coverage admission failed.

OpenCode coverage root cause — 2026-09-27

The older CHANGES_REQUESTED coverage receipt is an infrastructure failure, not a measured CO coverage deficit. In the canonical .github run 36081670283, coverage job 107989271158, Docker build failed at line 89: /requirements-noema-document-ci-hashes.txt: not found. It failed before any target PR test execution. The trusted workflow copied only the OpenCode requirements into its isolated build directory, while its Dockerfile required both OpenCode and Noema document locks.

The causal source repair is already owned by ContextualWisdomLab/.github#2286 and carried in the ordinary convergence head of ContextualWisdomLab/.github#2385, exact 372f5b8bb1ae1bb32ab29e9afbe363d81aed81e3. Current source inspection confirms that this head checks the document lock is a regular non-symlink file and copies it into the Docker build context, retaining hash-only installation. The same owner also carries the CodeQL credential-path and AnyIO security repairs. Its current-head checks are queued, so delivery is not yet proved. Do not create duplicate CO source changes or dismiss the reviews as a substitute for a fresh authoritative verdict. After protected delivery of that owner, validate a fresh exact CO head/base coverage receipt and independent review.

Current-head CI triage (2026-09-26)

The exact 0aad1190 Security and Quality run failed before it could assess this PR's full suite. Its tests job stops during collection because test_provider_embedding_batch_backend.py imports a constant absent from cost_router.py; the same error reproduces on unmodified main@5665b0ad. The fuzzing and CodeQL/SBOM jobs reject the unhashable fast-mlsirm Git requirement under --require-hashes. The Rust job lacks rustfmt in pinned toolchain 1.97.1.

#1209 carries repairs for all three baseline classes but remains Draft with review changes requested. #1266 repairs collection and Rust only; its current fuzz and CodeQL/SBOM jobs are failing. A throwaway merge of #1223 into exact #1209 head 84736f4d was conflict-free, and the image/rate-limit/provider-error suites passed 68/68 with warnings as errors. This is local integration evidence, not hosted acceptance or approval.

The separate CodeQL PR run 36022489108 also has three failed compatibility shards. Their exact logs report VERDICT_STATE=pending after dispatch. The head has no published codeql-dispatch/<language> commit statuses, so a terminal CodeQL verdict and the promised exact-job wake are still missing. The same state appears on #1209's current head; rerunning pending shards without an authenticated terminal verdict would fail by design. The central owner paths are .github#1929 for terminal status publication and .github#2276 for Code Scanning analysis-read permission; the proposed credential selector #2275 is still Draft. The selected App installation currently lacks the required analysis-read and commit-status-write permissions according to the owner audit. Unblock only after the trusted handler proves both permissions on an unchanged target head, publishes an authenticated terminal verdict, and settles these exact jobs. This is distinct from this PR's failing CodeQL/SBOM job above.

The current OpenCode review requests changes because coverage admission failed. The separate Noema review job ended with a gateway 504 after 1,562 s; it does not prove this source change failed or that deployed image 429 recovery works. A protected CO head, independent approval, an immutable consumer pin, and a success-inclusive post-deploy measurement remain required.

Evidence boundary

  • This is a synthetic reproduction, not production data. Deployed behavior changes only after the sidecar pin moves past 767e67f.
  • Sanitized logs carry neither role nor the provider reset header, so the real 429 recovery rate after a wait is unknown. OpenRouter free quotas may be per-day, in which case waiting cannot help.
  • The post-deploy measurement should compare final-429 share and request latency on image-bearing reviews, using .github#2326's success-inclusive artifacts.

🤖 Generated with Claude Code

https://claude.ai/code/session_012ABB9sb4szFEteww67UYZy

Summary by CodeRabbit

  • 버그 수정

    • 이미지 요청에 적합한 후보가 없을 때 사용 가능한 텍스트 후보로 자동 전환됩니다.
    • 요청 제한(429) 오류가 집중되는 동안 실제 사용 후보를 기준으로 대기해, 불필요한 즉시 재시도를 방지합니다.
    • 텍스트 및 이미지 요청 모두 제한 초과 상황에서 안정적으로 재시도되며, 기존 대기 시간 예산과 Retry-After 처리는 유지됩니다.
  • 테스트

    • 429 오류 집중 상황에서 자동 전환과 대기 동작을 검증하는 회귀 테스트가 추가되었습니다.

_invoke falls back to the text candidates when no candidate for a step is
vision-capable, but the storm-wait admission recomputed only the
vision-required set. It saw an empty set, found nothing to wait for and
re-raised 429 at once. A figure-bearing conduct review therefore failed in
under a second on a text-pool 429 storm that a text request waits out.

Apply the same fallback in _invoke_with_rate_limit_recovery so the storm
is judged on the candidates actually called. The wait budget, the pinned
fail-fast, and breaker accounting are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012ABB9sb4szFEteww67UYZy
@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Warning

Review limit reached

Next included review available in 58 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 252abcaa-56cc-411f-a094-5c0894e96bb7

📥 Commits

Reviewing files that changed from the base of the PR and between fe413e0 and e5a2d94.

📒 Files selected for processing (3)
  • CHANGELOG.d/image-request-rate-limit-storm-wait.md
  • contextual_orchestrator/orchestrator.py
  • tests/test_image_request_rate_limit_storm_wait.py

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 245e3455-51a1-43ab-b562-f46939339e44

📥 Commits

Reviewing files that changed from the base of the PR and between 5665b0a and fe413e0.

📒 Files selected for processing (3)
  • CHANGELOG.d/image-request-rate-limit-storm-wait.md
  • contextual_orchestrator/orchestrator.py
  • tests/test_image_request_rate_limit_storm_wait.py

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

required_tags가 있고 vision 후보가 없으면 text 후보를 failover 후보로 사용합니다. 429 storm 대기는 실제 호출 후보를 기준으로 적용합니다. text 및 이미지 요청에 대한 회귀 테스트가 추가되었습니다.

Changes

이미지 요청 rate-limit 처리

Layer / File(s) Summary
후보 fallback 및 storm 대기 회귀 검증
contextual_orchestrator/orchestrator.py, tests/test_image_request_rate_limit_storm_wait.py, CHANGELOG.d/...
vision 후보가 없고 required_tags가 설정되면 text 후보를 동일한 호출 조건으로 생성합니다. text 및 이미지 요청은 실제 사용 후보에서 발생한 429 storm 동안 대기한 뒤 200 응답을 반환하는지 검증합니다. 대기 예산, pinned-model fail-fast, Retry-After 처리 및 breaker accounting은 변경하지 않습니다.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 1 files. (2 skipped: 1… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 이미지 요청이 rate-limit storm 동안 대기하도록 수정한 주요 변경 사항을 정확하고 간결하게 설명합니다.
Full details: Docstring Coverage

Explanation

Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 1 files. (2 skipped: 1 unsupported, 1 too large.)

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

exact-head review @ fe413e01b956bdc36086c4db137c52bca03c2dbb

실제 호출 후보 집합과 storm-admission 후보 집합을 맞추는 13-line causal fix 방향은 타당합니다. 다만 현재 GREEN이 이 PR이 해결한다고 주장하는 rate-limit wait invariant를 충분히 증명하지 않습니다.

현재 fixture는 provider가 _STORM_SECONDS = 1.5가 지나면 자동으로 200을 반환하고, 모든 429에 Retry-After: 2를 붙입니다. acceptance는 status == 200과 elapsed >= 1.5뿐입니다. 이 조합은 향후 구현이 provider를 짧은 간격으로 반복 호출하다가 1.5초가 지나 우연히 200을 받는 방식으로 회귀해도 통과할 수 있습니다. 즉 “429 storm을 기다렸다”와 “storm 동안 hammering하다가 끝났다”를 구분하지 못합니다.

그리고 PR 본문의 production evidence는 17/17 all-429 preflight에 retry_after_s가 없었다고 적고 있는데, 새 regression은 정반대로 Retry-After가 항상 있는 경로만 실행합니다. 실제 motivating incident에서 필요한 unknown-cooldown 경로가 executable acceptance에 없습니다.

RED/GREEN을 다음처럼 좁혀 주십시오.

  • fake transport가 각 agent 호출의 monotonic timestamp와 attempt count를 기록하게 하고, Retry-After: 2 fixture에서는 다음 provider attempt가 effective cooldown 이전에 발생하지 않음을 검증합니다. 단순 wall-clock lower-bound만 보지 마십시오.
  • 동일 image/text pair에 Retry-After header 없음 fixture를 추가하여 현재 unknown-cooldown policy가 bounded wait 후 재평가되는지 검증합니다. 이게 이번 production evidence와 직접 대응합니다.
  • wait budget을 넘기는 cooldown은 기존 fail-fast/budget contract를 보존하는지, pinned-model 경로가 여전히 기다리지 않는지도 negative control로 고정합니다.
  • 가능하면 real 2초 sleep 대신 injectable clock/sleeper로 deterministic하게 만들어 Actions 부하/스케줄링 지연이 acceptance를 좌우하지 않게 하십시오.

consumer acceptance도 중요합니다. 본문이 명시하듯 deployed sidecar는 아직 767e67f라서 이 source PR 자체로 buyer-visible incident가 고쳐지지 않습니다. GREEN chain은 CO exact protected head → immutable release/client/schema evidence → .github sidecar pin ordinary version bump → success-inclusive Noema artifact에서 image-bearing final-429 share/latency 재측정까지 이어져야 하며 mutable sibling head를 소비하면 안 됩니다.

판정: candidate-set causal fix VALID / explicit Retry-After behavior PARTIAL / observed no-header path UNTESTED / anti-hammering invariant UNPROVEN / consumer release acceptance PENDING.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • CHANGELOG.d/image-request-rate-limit-storm-wait.md — repository behavior
  • contextual_orchestrator/orchestrator.py — Python module behavior
  • tests/test_image_request_rate_limit_storm_wait.py — regression suite

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: image-request-rate-limit-storm-wait.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: image-request-rate-limit-storm-wait.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: orchestrator.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: orchestrator.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_image_request_rate_limit_storm_wait.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_image_request_rate_limit_storm_wait.py"]
  R3 --> V3["targeted test run"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: fe413e01b956bdc36086c4db137c52bca03c2dbb
  • Workflow run: 35694810468
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: image-request-rate-limit-storm-wait.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: image-request-rate-limit-storm-wait.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: orchestrator.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: orchestrator.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_image_request_rate_limit_storm_wait.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_image_request_rate_limit_storm_wait.py"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

OpenCode reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • CHANGELOG.d/image-request-rate-limit-storm-wait.md — repository behavior
  • contextual_orchestrator/orchestrator.py — Python module behavior
  • tests/test_image_request_rate_limit_storm_wait.py — regression suite

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: image-request-rate-limit-storm-wait.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: image-request-rate-limit-storm-wait.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: orchestrator.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: orchestrator.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_image_request_rate_limit_storm_wait.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_image_request_rate_limit_storm_wait.py"]
  R3 --> V3["targeted test run"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: 0aad1190d6104f61867234e7089ff9618d96fea7
  • Workflow run: 36081670283
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: image-request-rate-limit-storm-wait.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: image-request-rate-limit-storm-wait.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: orchestrator.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: orchestrator.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_image_request_rate_limit_storm_wait.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_image_request_rate_limit_storm_wait.py"]
  R3 --> V3["targeted test run"]
Loading

@seonghobae
seonghobae changed the base branch from main to fix/protected-main-ci-regressions-20260920 September 26, 2026 11:33
@seonghobae
seonghobae marked this pull request as draft September 26, 2026 11:34
@seonghobae
seonghobae marked this pull request as ready for review September 26, 2026 11:34
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-27T03:01:17.345759Z 9091168 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0aad1190d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread tests/test_image_request_rate_limit_storm_wait.py Outdated

Copy link
Copy Markdown
Contributor Author

Admission correction — exact current head e1079e235f5556476d6c2f3470cfdabc2410463c was re-fetched immediately before this transition. The PR remains Open and its branch, commits, reviews, and valid delta are preserved, but it is not merge-admissible: live base보다 69 commit 뒤처짐; 활성 CHANGES_REQUESTED 2개. Moving it to Draft/Proposed records the live blocker without retiring or closing the work. Return it to Ready only after the same exact head (or a non-destructive reconciled successor) is mergeable, has no substantive unresolved review state, and has terminal required Checks.

@seonghobae
seonghobae marked this pull request as draft September 26, 2026 15:24
…s-20260920' into fix/image-request-rate-limit-storm-wait-2
@seonghobae
seonghobae marked this pull request as ready for review September 27, 2026 02:59

Copy link
Copy Markdown
Contributor Author

Exact-head Ready-admission repair

Audited head 90911687cb1ee49325ddd1f2bdfd29284a526028 against base 84736f4d9840b3d06edb8fdcc7210abddd86175e (4 ahead / 0 behind).

Current substantive blocker evidence:

  • active CHANGES_REQUESTED: opencode-agent

Queued/pending/in-progress Checks are not blockers and were not treated as failures. This PR is being returned to Draft/Proposed so review admission does not imply readiness while the recorded blocker remains. Preserve the branch and complete the causal source/review/topology repair on a new non-force commit; then re-fetch this exact head's Checks and reviews before restoring Ready.

No merge, close, bypass, review dismissal, synthetic status/approval, manual rerun, force push, or destructive rebase is authorized by this receipt.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant