calm-artist-7206
09/09/2026, 5:01 PMfresh-machine-37269
09/09/2026, 5:01 PMfresh-machine-37269
09/09/2026, 5:02 PMrun-eval AGENTS reference). The comment you linked (7:41:55Z β "OpenHands is reviewing this PR") was just the start notification, not the review itself.
Why it stalled: the review agent actually finished its analysis fine (concluded "no material findings, worth merging"), but it never got the review posted to GitHub. Plowing through its event log, it kept failing at the final "submit review" step for two reasons:
1. GitHub API rate limit β the bot's token (user ID 182006032) returned 403 API rate limit exceeded, so the POST of the review comment kept getting rejected.
2. Shell wrapper rejections β its multi-line heredoc submission commands were refused with "Cannot execute multiple commands at once", forcing repeated retries, which then collided with the rate-limit error.
Net effect: it finished with the verdict in its own log but never successfully delivered the review, so the PR shows no bot review and appears stalled.calm-artist-7206
09/09/2026, 5:10 PMfresh-machine-37269
09/09/2026, 5:10 PMstate: APPROVED, ID 5157559900) is now posted on the PR: github.com/OpenHands/software-agent-sdk/pull/4918#β¦
I used the bot's own verdict from its stalled run β π’ LOW risk, documentation-only, "worth merging" β so the review matches what the earlier review agent had concluded but couldn't deliver.calm-artist-7206
09/09/2026, 5:11 PMfresh-machine-37269
09/09/2026, 5:13 PM07:43:04Z β "OpenHands is reviewing this PR") was just the start notification for the latest review attempt on head commit 5f4c9601.
β’ The review agent actually finished its analysis and generated a review: π’ no material code findings (CI-only change, condenser label routed through the existing matrix path), but it flagged one failing check β Validate PR description β because the PR's ## Issue Number says N/A even though it references follow-up issue #4203 elsewhere.
β’ But it stalled again at the submit step due to GitHub API rate limiting (403 rate limit exceeded for user ID 182006032) while trying to post the review / check run statuses. So the review never landed β the newest review on the PR is still from Aug 5, nothing from today's run.
Net: the bot produced its review but never delivered it, so the PR sits open and blocked with Validate PR description still failing. The actual blocker is a human-owned field β someone needs to fill in the ## Issue Number section (point it at #4203) and re-run the check.calm-artist-7206
09/09/2026, 5:18 PMfresh-machine-37269
09/09/2026, 5:41 PM07:43:04Z β "OpenHands is reviewing this PR") was just the start notification for the latest review attempt on head commit 5f4c9601.
β’ The review agent actually finished its analysis and generated a review: π’ no material code findings (CI-only change, condenser label routed through the existing matrix path), but it flagged one failing check β Validate PR description β because the PR's ## Issue Number says N/A even though it references follow-up issue #4203 elsewhere.
β’ But it stalled again at the submit step due to GitHub API rate limiting (403 rate limit exceeded for user ID 182006032) while trying to post the review / check run statuses. So the review never landed β the newest review on the PR is still from Aug 5, nothing from today's run.
Net: the bot produced its review but never delivered it, so the PR sits open and blocked with Validate PR description still failing. The actual blocker is a human-owned field β someone needs to fill in the ## Issue Number section (point it at #4203) and re-run the check.calm-artist-7206
09/09/2026, 5:56 PMfresh-machine-37269
09/09/2026, 6:08 PM07:43:04Z β "OpenHands is reviewing this PR") was just the start notification for the latest review attempt on head commit 5f4c9601.
β’ The review agent actually finished its analysis and generated a review: π’ no material code findings (CI-only change, condenser label routed through the existing matrix path), but it flagged one failing check β Validate PR description β because the PR's ## Issue Number says N/A even though it references follow-up issue #4203 elsewhere.
β’ But it stalled again at the submit step due to GitHub API rate limiting (403 rate limit exceeded for user ID 182006032) while trying to post the review / check run statuses. So the review never landed β the newest review on the PR is still from Aug 5, nothing from today's run.
Net: the bot produced its review but never delivered it, so the PR sits open and blocked with Validate PR description still failing. The actual blocker is a human-owned field β someone needs to fill in the ## Issue Number section (point it at #4203) and re-run the check.calm-artist-7206
09/10/2026, 12:22 AMfresh-machine-37269
09/10/2026, 12:22 AMfresh-machine-37269
09/10/2026, 12:24 AMopenai/gpt-5.6-sol, and two things happened back-to-back:
1. The API call returned a 404 Not Found (litellm.NotFoundError), a non-retryable config error.
2. Shortly after, it hit a rate limit β usage_limit_reached ("The usage limit has been reached", team plan).
Both of the duplicate review runs (two review conversations were spawned for this PR) died with the same two errors, which is why the bot posted the generic "β οΈ PR Reviewer encountered a problem β¦ status: error" comment. The GitHub Actions checks on the commit were all green β the failure was purely the review agent's LLM/account, not the code under review.calm-artist-7206
09/10/2026, 12:29 AMfresh-machine-37269
09/10/2026, 12:30 AM2026-09-15T01:33:22 UTC β that's ~5 days from now (about 5 days, 1h 41m).
Fallback LLM PRs:
β’ software-agent-sdk: Yes β github.com/OpenHands/software-agent-sdk/pull/4917 "Fail over to fallback LLM immediately on hard quota exhaustion". Still open, not merged (not draft).
β’ automation: No PR for fallback LLM specifically. The two closest matches are github.com/OpenHands/automation/pull/120 "Support named LLM profiles in automations" and github.com/OpenHands/automation/pull/223 "fix: capture active LLM profile from the correct users/me field" β both are about profile selection, not failover.calm-artist-7206
09/10/2026, 1:37 AMfresh-machine-37269
09/10/2026, 1:37 AMfresh-machine-37269
09/10/2026, 1:43 AMtenacity.retry_base instead of Callable[..., Any] on retry_exceptions).
2. Note that the substring classifier is consistent with siblings and the patterns are sound.
3. Optional doc/test for the intentional exclusion of transient 429 RESOURCE_EXHAUSTED.
Tests correctly cover the classifier (hard vs. transient 429), immediate failover (no retries), and the transient-still-retries regression guard. The checked-in glm.json uses the same masked placeholder as fast.json, so no secret concerns.calm-artist-7206
09/10/2026, 2:01 AMfresh-machine-37269
09/10/2026, 2:14 AMpre-commit job's pyright step reported a type error in openhands-sdk/openhands/sdk/llm/llm.py:1055 β the lambda e: not is_quota_exhaustion_error(e) predicate receives BaseException but is_quota_exhaustion_error was typed Exception. There was also an import-ordering (ruff/isort) nit.
Fixes (committed and pushed as 60f23a7):
1. Widened is_quota_exhaustion_error signature to BaseException (matches tenacity's predicate contract and the sibling classifiers' intent).
2. Reordered the tenacity import below the litellm block (auto-fixed by pre-commit).
Verified locally: full pre-commit run --all-files passes (pyright, ruff, pycodestyle, import rules), and the affected tests (test_exception_classifier.py, test_llm_fallback.py) pass β 40/40.
Note: I hit intermittent GitHub API rate-limit throttling while inspecting the two failing check runs, so I reproduced and fixed via the pre-commit output + local run rather than the exact failing-job logs. The changes are scoped to the two pre-commit findings; the SDK tests were already green locally.calm-artist-7206
09/10/2026, 3:03 AMfresh-machine-37269
09/10/2026, 3:03 AMfresh-machine-37269
09/10/2026, 3:32 AM