Repository navigation
Add an INFRA verdict for workers that never got to work - #154
Open
Poncho1112 wants to merge 1 commit into
Open
Poncho1112 wants to merge 1 commit into
Poncho1112 wants to merge 1 commit into
Conversation
In one operator's eval log, 747 non-passing attempts ended in under 10 seconds because the worker never started real work: an expired login, spent API credits, a usage or rate limit, a model with no tool-use endpoint, broken WSL interop, or a CLI flag that swallowed the prompt. Ringer reported each as FAIL with "missing expected files", hid the real error in the worker log, retried it (365 wasted retries), counted it against the model on the scoreboard, and kept sending tasks to the dead lane (109 runs died on every attempt). A worker that exits nonzero with a recognised environment signature in the last 20 lines of its output now gets verdict INFRA: - signatures are grouped as auth, billing, rate-limit, model-unavailable, interop and cli; bare status codes (401/402/429/404) only count on exits within 60 s, and a fast exit without a known signature stays FAIL; - INFRA is never retried, whatever max_attempts says; - after two INFRA attempts on one lane (engine + model) the remaining tasks on that lane are skipped without starting a worker; - every non-PASS eval row keeps the last 1,500 characters of the worker's own output, so the cause survives later runs overwriting the log; - the model scoreboard ignores INFRA rows; - the run summary, results page, briefing and Ringside say the worker never got to work instead of "failed its check". Tests: tests/test_infra_verdict.py (12) covers each signature category, the weak-signature time gate, the output window, verdict precedence, the scoreboard exclusion, and an end-to-end run with a dead lane next to a healthy one. Full suite: 296 tests, all passing. Co-Authored-By: Claude Opus 5.5 <[email protected]>
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.
In one operator's eval log, 747 non-passing attempts ended in under 10 seconds because the worker never got to work: an expired login, spent API credits, a usage or rate limit, a model with no tool-use endpoint, broken WSL interop, a CLI flag that swallowed the prompt. Ringer reported each one as
FAILwith "missing expected files", hid the real error in the worker log, retried it (365 wasted retries), counted it against the model on the scoreboard, and kept sending tasks to the dead lane (109 runs died on every attempt). The scoreboard ended up showing account outages as model failures, which breaks "displayed data must be true".This PR adds an
INFRAverdict for that case.What changes
classify_infra()looks for a known environment signature in the last 20 lines of a worker that exited nonzero. Categories: auth, billing, rate-limit, model-unavailable, interop, cli.refresh_token_invalidated,can only afford,No endpoints found,Exec format error,usage limit reached, ...) count at any duration. Bare status codes (401,402,429,404 ... model) only count when the worker exited within 60 s, so a long run that merely mentions a 401 is not misread. A fast exit with no recognised signature staysFAILand keeps its retries (the mock engine'sMOCK_FAILpath is unchanged).ERROR > TIMEOUT > PASS > INFRA > FAIL: a passing check always wins.max_attemptssays.worker_output_last_1500_chars:), so the cause survives a later run overwriting the worker log. PASS rows are unchanged.aggregate_model_log_rowsandaggregate_model_scoreboard_rows.fail, so counts and colours still treat INFRA as a failure, never as passed or waiting.Tests
tests/test_infra_verdict.pyhas 12 tests: each signature category, the weak-signature time gate, rc 0 / timeout / rc None, the 20-line window, ANSI stripping, verdict precedence, the scoreboard exclusion, and an end-to-endringer.py run. That run puts a fake engine printing a 401refresh_token_invalidatedline beside the mock engine and checks: no retry, the third dead-lane task skipped with 0 attempts and no eval row, and the mock lane unaffected.RINGER_NO_SELF_UPDATE=1 python3 -m unittest discover -s testspasses all 296 tests (284 existing + 12 new).node --check dashboard/ringside.jspasses.One feature per the contributing guide. Related changes (structured token counts for the Claude engine, a way to amend mis-scored attempts, a pre-worker check run that builds on
run --baseline, and a few manifest lint rules) will follow as separate PRs if this direction is welcome.🤖 Generated with Claude Code