Skip to content

ci: the lint gate cannot pass — Cargo.toml is a tracked public-benchmark input, so every merge train invalidates it (red on main; merged PRs are red too) #10799

Description

@proggeramlug

Summary

lint is red on untouched main, and it is red for a reason that cannot be cleared: Cargo.toml is a tracked input of the public benchmark baseline, and every merge train's release commit bumps the version in it.

Verified on a clean checkout of main 1a4fa6507 (v0.5.1617), no local modifications:

$ python3 benchmarks/ci_public_baseline_check.py
public baseline error: public artifact benchmark inputs changed; regenerate it with ./benchmarks/run_public_baseline.sh
$ echo $?
2

Root cause

benchmarks/public_baseline.py:34:

SOURCE_PATHS = (
    "Cargo.toml",
    "benchmarks/suite/*.ts",
    ...
)

validate_public compares freshness.source_fingerprint recorded in benchmarks/results/public-node-bun-v1.json against tracked_fingerprint(SOURCE_PATHS).

That artifact was generated 2026-09-01. Since then, of the tracked inputs:

tracked path commits since artifact newest
Cargo.toml 122 1a4fa6507 chore: release merge train 238 as v0.5.1617
benchmarks/suite/*.ts 1 e3bd92bf6 fix(bench): reject zero-time benchmark false greens (#9405)
benchmarks/polyglot/bench.* 1 e3bd92bf6 (same commit)

The workspace version lives in Cargo.toml, so every release commit changes the fingerprint. Regenerating costs a ~2-hour quiet-host run (policy.quiet_host plus pinned per-runtime versions), and the very next merge train invalidates it again. There is no state in which this gate is green for more than one train.

Why this matters more than one red check

lint is red on every open PR, and — the part that makes it corrosive — it is equally red on PRs that merged. #10789, #10785 and #10781 all show the same triple lint, e2e-scoped, pr-gate and all three are in main. The train merges straight through.

So three checks are permanently red, carry no signal, and train everyone to ignore them as a block. Anything they would legitimately catch is now invisible. (I lost time myself concluding a PR was blocked by this before checking whether merged PRs showed the same failures — they do.)

Several lanes have already hit it and worked around it in their own evidence rather than fixing it: benchmarks/native_property_get/evidence/base-gate-comparison.json literally records the string under a key named public_freshness_base, and there are *fingerprint* / *public-freshness* artifacts in at least four benchmark trees.

Suggested fix

Cargo.toml is in SOURCE_PATHS to catch dependency/profile changes that could alter what is measured — but the version field cannot. Options, cheapest first:

  1. Fingerprint Cargo.toml with the version field normalised out (or hash only [profile.*], [workspace.dependencies] and feature tables). Keeps the real signal, drops the one field that changes every release.
  2. Move the version bump out of the fingerprinted file.
  3. Drop Cargo.toml from SOURCE_PATHS and rely on HARNESS_PATHS + the recorded toolchain versions.

(1) matches the precedent already in the file: #7282 narrowed HARNESS_PATHS for exactly this reason — "the large shell/Python drivers are plumbing … must not demand a two-hour rerun" — and added an explicit digest migration so the bookkeeping change did not itself force a regeneration. The same migration mechanism (_SOURCE_FINGERPRINT_MIGRATION) can carry this one.

Separately: the e2e-scoped red

That one is perry-codegen --test manifest_consistency: "Add the missing rows to crates/perry-api-manifest/src/entries.rs". Another lane already characterised it as base drift with api_manifest_source_identical: true and an api_docs_drift note ("generated docs add bun-pty from unchanged manifest"). Filing here only as a pointer — it wants its own issue if it is not already tracked.

Activity

  1. proggeramlug commented on Sep 23, 2026

    @proggeramlug
    ContributorAuthor

    Fixed on main. lint passes: train 258's CI on the tree that became main e27f0a068a was 22 jobs green, zero failures, including the public-baseline freshness step — the first fully green train run since this issue was filed.

    Two things resolved it, and one correction to the root cause stated here:

    The stated cause is not quite right. Cargo.toml is in SOURCE_PATHS, but it was never hashed whole: _cargo_profile_tables (#7282) reduced it to its [profile.*] tables before hashing, so a release bump did not invalidate the artifact. Trains were not the cause. The real divergence was e3bd92bf65 (2026-09-01), which edited benchmarks/suite/*.ts and polyglot/bench.* — genuine benchmark-source changes that left the committed artifact three weeks stale.

    What actually fixed it:

    1. fix(benchmarks): hash Cargo inputs except workspace release version #10977 replaced the profile-only extraction with whole-manifest hashing that normalises the [workspace.package].version value, so a release bump is explicitly exempt while dependency, feature, member and edition changes correctly invalidate.
    2. The artifact was regenerated (2f854511e9) at b77aba6343, in one uninterrupted run on a quiet host with the pinned toolchain (node v22.23.1, bun 1.3.14), 50 workloads and 1,443 samples. It had to wait for turnloop: replace tokio as Perry's event loop (P0–P8) #10354, which edits the root Cargo.toml — inside the fingerprint under the new scheme — so any earlier regeneration would have been stale on arrival.

    Verified before landing: the artifact's recorded fingerprints equal what main computes (source 9c87723d…, harness 513dba8f…).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions