Skip to content

ci: check the evaluation pipeline accepts the pinned toolchain - #661

Merged
kim-em merged 5 commits into
mainfrom
pipeline-toolchain-contract
Oct 7, 2026
Merged

kim-em merged 5 commits into
mainfrom
pipeline-toolchain-contract

Conversation

@kim-em

@kim-em kim-em commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

This PR adds scripts/check_pipeline_toolchain_contract.py and runs it in the classify job. The benchmark owns lean-toolchain, but lean-eval-submissions, the Worker and State each validate the toolchain string against their own contracts; the bump to v4.35.0-rc3 on 2026-09-28 broke every server-dispatched evaluation from 2026-09-30 until the contracts were widened on 2026-10-07, while this repository's CI stayed green. The check fetches the evaluation-completion and replay-queue schemas and the shared toolchain acceptance vectors from lean-eval-submissions main (leanprover/lean-eval-submissions#2000; State is private and binds its own contracts to the same vectors in its CI) and fails when the pin is rejected by any of them. Offline tests drive it over a file:// tree. CI on this PR passes only once #2000 has merged.

🤖 Prepared with Claude Code

The benchmark owns lean-toolchain, but lean-eval-submissions, the Worker
and State each validate the toolchain string against their own
contracts. Bumping to v4.35.0-rc3 on 2026-09-28 broke every
server-dispatched evaluation from 2026-09-30 until the contracts were
widened on 2026-10-07, while this repository's CI stayed green. The new
check fetches the live contracts from the protected main branches and
the shared acceptance vectors in State, and fails the classify job when
the pin is rejected by any of them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
kim-em and others added 4 commits October 7, 2026 10:24
lean-eval-state is private, so its schemas cannot be fetched from a
public CI job; its own CI binds them to the same vectors, which now
live in lean-eval-submissions.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ctors

Only trailing newlines are dropped from lean-toolchain, matching the
pipeline's shell substitution. The two schemas are read at their known
toolchain locations and must be anchored patterns Python's re reads the
same way; anything else fails closed. Each pattern is also checked
against every shared accepted and rejected vector, so a drifted schema
is reported even when the pin itself passes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Python's $ also matches before a trailing newline, so the shared
rejected vector with a trailing newline was reported as accepted by
every schema.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@kim-em
kim-em merged commit 7bf1f3f into main Oct 7, 2026
13 checks passed
@kim-em
kim-em deleted the pipeline-toolchain-contract branch October 7, 2026 11:45
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