Repository navigation
Ignore runner callback HTTP and JSON blips in the curation breaker - #866
Merged
Merged
Conversation
Remote runner failed (HTTPError|JSONDecodeError) only comes from the runner's own bootstrap/context/complete callbacks, never from an apply, which runs inside Codex. On 2026-11-03 two JSONDecodeErrors and one HTTPError (no failing responses in nginx) paused scheduled dispatch for four hours. Systemic rejections still trip runner_transport_failures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NielsRogge
deleted the
claude/curation-breaker-transient-runner-errors
branch
November 3, 2026 09:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
On 2026-11-03 at 04:31 UTC the scheduled-curation breaker paused dispatch with "Three consecutive scheduled apply or verification stages failed". It had counted:
Remote runner failed (JSONDecodeError).(resolve-model-paper at 03:58, enrich 131752 at 04:31)Remote runner failed (HTTPError).(enrich 131754 at 04:30; its retry completed at 04:39)[awaiting_markdown] …(enrich 131750, already uncounted)nginx logged only 200s for these jobs. Dispatch stayed paused until a manual
--enable-dispatchat about 08:40.Where these errors come from
Remote runner failed (<ExceptionName>).is produced only by the outerexceptinjobs/run_paper_curation.py. Inside that block,HTTPErrorandJSONDecodeErrorcan only come from_send, the runner's own callbacks to our API (bootstrap,context,complete). The preflight runs as a subprocess, so its failures surface asCalledProcessError. Applies run inside Codex throughjobs/curation_api.py, which turns an HTTP rejection into aRuntimeErrorfor the agent. A rejected apply therefore shows up as an apply/verification error orCodex exited…, never as one of these two names.For a job whose
completelater succeeded, an HTTPError or non-JSON body on these callbacks is almost always the edge (a Cloudflare 5xx or an HTML/empty body), and that matches the clean nginx log. The server-side 4xx cases are a 404 for a disabled feature or a missing paper, and a 409 for a bootstrap bundle that doesn't match the release. A missing paper is a per-paper failure that shouldn't pause the queue. A disabled feature or release mismatch fails every job, and the existingrunner_transport_failurescondition (more than 50% of the last 25) still pauses for that.Telling 5xx apart from 4xx at the runner would mean adding the status code to the error string. That edits
jobs/run_paper_curation.pyand needs a new pinned jobs image, so it's out of scope here.Change
HTTPErrorandJSONDecodeErrorto_TRANSPORT_FAILURE.apply_or_verification_failures.CalledProcessError.Validation
uv run pytest backend/tests/curation -q: 755 passed, 14 skipped🤖 Generated with Claude Code
Note
Medium Risk
Changes scheduled-dispatch auto-pause heuristics; misclassification could hide real apply failures or fail to pause on systemic outages, though bulk transport pauses still use the >50% callback-failure rule.
Overview
Fixes scheduled curation dispatch pausing on transient runner→API callback failures that are not apply/verification problems.
HTTPErrorandJSONDecodeErrorinRemote runner failed (...)are now classified like other transport blips in_TRANSPORT_FAILURE, so they no longer increment the three-strikeconsecutive_apply_failurescounter or the 25-stage terminal failure rate. Comments clarify these exceptions come from the runner’s bootstrap/context/complete callbacks (often edge 5xx or non-JSON bodies), not from Codex apply rejections.Adds a regression test replaying the 2026-11-03 production sequence (JSON/HTTP errors plus
[awaiting_markdown]) and asserts dispatch stays unpaused; the “non-transport runner errors still count” test now usesCalledProcessError.docs/operations.mddocuments the expanded transport-failure list.Reviewed by Cursor Bugbot for commit 94428e1. Bugbot is set up for automated code reviews on this repo. Configure here.