Repository navigation
fix(benchmarks): make an unpublishable smoke generation loud instead of green - #1013
Merged
Merged
Conversation
…of green (#1012) Benchmark history published nothing between 2026-08-12 and 2026-08-31 while the producer workflow reported success on nearly every push. The publication gate refused correctly throughout; what was missing was any signal that it had. Add a tokenless cohort reachability gate that runs before Modal spend, so a dependency that is not anonymously cloneable fails in seconds naming the URL rather than after a four-hour run that ends unpublishable. Add the first scheduled freshness monitor and an opt-in `eval history --max-age-days`, so a history that stops advancing is detectable at all. Annotate both silent publication no-ops without changing any readiness verdict. Carry the failing command's reason into the collected artifact through the existing eval-failure-diagnostics channel, and close two paths where one collector-illegal log line discarded a pair's whole artifact set. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…is job #1005 wired `external-static-analysis` into `release-validation.needs` and `release-gates.needs` but left the assertions in ci-config.test.ts expecting the previous two- and three-element arrays, so `main` is red on "runs the release validation lanes the policy script selects, on pull requests too". Both assertions live in one test, so the first failure masked the second. Unrelated to the rest of this branch; needed for its CI to be readable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
aviggiano
force-pushed
the
fix/1012-benchmark-history-publication-relay
branch
from
August 31, 2026 18:14
03cfea1 to
464cb3b
Compare
Closed
4 of 5 tasks
aviggiano
marked this pull request as ready for review
August 31, 2026 19:33
Two independent classes of failure, both surfaced by gates that landed after this branch was written. Strict lint (ours). `eslint-plugin-diff` scopes the strict ruleset to changed lines, so new code gets rules existing code is grandfathered against. Replace console with process.stdout/stderr.write, remove non-null assertions in favour of guards that name what was missing, split two over-long functions, and move the new recency tests into their own file so history.test.ts returns to being untouched rather than dragging its pre-existing 2131 lines into max-lines. Workflow linters (inherited). Super-Linter lints only changed files but lints each in full, and the repo carried no linter config, so stock yamllint defaults applied to lines nobody wrote: eval-benchmarks.yml alone has 146 lines over 80 columns. Any workflow edit by anyone was failing. Add a config that relaxes only what prettier already owns or GitHub mandates. Suppress zizmor's dangerous-triggers on the publication workflow's workflow_run, whose trust model rejects non-default-branch and fork producers before anything executes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 31, 2026
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.
Closes the observability half of #1012.
Benchmark history published nothing for 19 days while the producer workflow reported success on nearly every push to
main. The publication honesty gate was refusing correctly the whole time —cleanup_incomplete_runran in 29 of 29 green push runs since 08-13, i.e. a 100% failure rate reported as 100% success. Nothing in the repo measured whether history was advancing.The dependency that caused the final phase is already resolved out-of-band, at the same commit, so no cohort re-pin and no
cohort_fingerprintchange. This PR is about making the next occurrence impossible to miss.What is here
1. Pre-compute cohort reachability gate —
scripts/ci/verify-cohort-reachability.mjs(new), wired intoeval-benchmarks.ymlbefore any Modal image build or sandbox launch.Proves every pinned target and every
.gitmodulesentry at that pinned revision is reachable anonymously, which is exactly what the sandbox can do. Deliberately given no token: an authenticated probe reads a private dependency successfully and reports the cohort healthy, defeating the gate. Exit 1 is a named anonymous denial and blocks; exit 2 is the gate's own "proved nothing" verdict (resolver blip, 403 throttle) and warns without blocking, so a DNS hiccup cannot be published as a private dependency.Against the broken cohort it produced, in 2 s:
It now exits 0 on both lanes (smoke: 16 probes; full: 40 targets / 137 probes, 7 s). Uses
raw.githubusercontent.com+codeloadrather than the REST API, because the anonymous API ceiling is 60 req/hr/IP and the full lane needs ~137 lookups — and raising that ceiling requires the token that would defeat the check.2. Scheduled freshness monitor —
scripts/ci/assert-benchmark-history-freshness.mjs+.github/workflows/benchmark-history-freshness.yml(new). The repo previously contained zerocron:triggers. Imports the canonical parser frompackages/evals/distrather than re-deriving the rule or hand-copying schema constants. Opens/updates a single tracking issue instead of filing a duplicate daily.3.
eval history --max-age-days— opt-in recency assertion.--checkpreviously validated integrity and chart byte-equality but had no recency check at all, exiting 0 on 19.5-day-old data. Default behaviour is byte-identical, so the existingbenchmark:history:checkgate onmainis untouched. A future-dated observation fails rather than silently passing, so one bad producer clock cannot blind the monitor permanently.4. Both silent no-ops now annotate —
::warning::plus$GITHUB_STEP_SUMMARYfrom the classifier and fromqualify. No ready/eligible verdict changes, and tests now pin that so a future change cannot quietly weaken the gate. Loud, not red: a legitimate operational soft-fail still must not turnmainred — escalation is the freshness monitor's job.5. Worker diagnostics — the worker built
git exited 1: fatal: Authentication failed for '…'and dropped it at the serialization boundary, soresult.jsoncarried onlydiagnostic_code. It now reaches the collected artifact through the existingeval-failure-diagnosticschannel; the log grammar is deliberately not extended, becauseassertSanitizedModalCollectedFilesasserts before staging and one illegal line discards the pair's entire artifact set. Two latent instances of exactly that were closed: a sanitizer that could emit 1002 bytes against the collector's 1000-byte cap, andreportCorroborationFailurewriting a line matching neither production.Verification
Rebased onto
ab3c03f4(#1005, "adopt external static-analysis gates"), which landed while this was being written and touchespublic-worker.ts— its change there was dead-export removal, so no semantic conflict. All gates below were run on the rebased tree, including the three gates #1005 introduced that this branch had never been checked against.bun test scripts/ci/*.test.tspackages/modalvitestpackages/evalsvitestpnpm -w lintpnpm -w lint:strict(--max-warnings 0)pnpm -w knip(--treat-config-hints-as-errors)pnpm -w format:checkrunner.*in any job-levelenv:End-to-end on the real history:
eval history --checkstill exits 0;--max-age-days 7exits 1 naming the 19.59-day age. The sandbox's exact anonymous recursive clone now reproduces green (SUBMODULE-UPDATE-RC=0,lib/console3→401bd220…).New tests were mutation-checked rather than trusted — reverting the truncation fix fails the new bound tests, and a degenerate "drop everything" implementation also fails, so content survival is pinned too.
Second commit is unrelated, and
mainis currently red without itmainfailsci-config.test.ts > runs the release validation lanes the policy script selects, on pull requests too. I verified this on pristineorigin/mainwith none of this branch's files present: #1005 wiredexternal-static-analysisintorelease-validation.needsandrelease-gates.needsbut left the assertions expecting the previous two- and three-element arrays. Both live in one test, so the first failure masked the second.ci.ymlis the intentional side; the assertions were stale. Fixed in a separate commit so it can be cherry-picked or split out — without it this PR's CI is unreadable.Draft, because
WORKFLOW_SUBMISSION_FAILED: workflow run link event does not match its journal entryhas not been exercised since 08-27 because the lane died earlier in preparation. Expect it on the first run reaching the eval stage.public-results.json.🤖 Generated with Claude Code
Greptile Summary
This PR makes silent benchmark-publication failures observable while preserving the existing publication eligibility policy.
Confidence Score: 5/5
The PR appears safe to merge because no blocking failure remains in the eligible follow-up review scope.
No blocking failure remains.
Important Files Changed
Flowchart
%%{init: {'theme': 'neutral'}}%% flowchart TD Push[Push or manual benchmark run] --> Reachability[Anonymous cohort reachability gate] Reachability -->|Denied| Block[Fail before sandbox launch] Reachability -->|Reachable or inconclusive| Generate[Generate benchmark results] Generate --> Qualify[Qualification and publication readiness] Qualify -->|Ready| Publish[Advance benchmark history] Qualify -->|Refused| Annotate[Keep operational soft-fail green and annotate] Publish --> Freshness[Scheduled freshness monitor] Annotate --> Freshness Freshness -->|Fresh| Healthy[Monitor succeeds] Freshness -->|Stale or unevaluable| Issue[Open or update tracking issue]Reviews (2): Last reviewed commit: "fix(ci): satisfy the static-analysis gat..." | Re-trigger Greptile