Skip to content

gc-ratchet has measured nothing since 2026-08-05: harness validation fails before the probes run (12_large_live_set spread 6768) #7554

Description

@proggeramlug

The GC ratchet has measured nothing since 2026-08-05

gc-ratchet fails on main in test_pinned_artifact_retention_is_deterministic:

AssertionError: 6768 != 0 : 12_large_live_set.heap_used_bytes was not
deterministic when pinned; it must not be in a gating family

That assertion lives in the "Harness unit tests and artifact validation" step, which runs before the measurement step. So the probes themselves — all twelve — have not executed on any branch since this broke. The job is red, and the thing it exists to measure is not running at all. That is CLAUDE.md's fourth failure mode ("the gate runs but its subject never did") in its most expensive form, compounded by gc-ratchet not being a required context, so the red blocks nothing either.

It has failed on every completed main run since 2026-08-05T15:07Z, which is the window in which #7446 re-pinned the artifact.

The assertion is right; the artifact is unfit

This is not an over-strict test. benchmarks/gc_ratchet/tolerances.json justifies gating heap_used_bytes on exactly this basis:

"Observed spread 0.000% over 21 runs on all 8 probes: bit-identical. The band is therefore pure anti-brittleness margin … not a noise allowance."

The pinned artifact contradicts its own premise. Every other probe still holds it:

probe heap_used_bytes spread
01_nursery_churn11_collect_at_depth (11 probes) 0
12_large_live_set 6768

and the samples show it is a single outlier, not noise:

[59943824, 59943824, 59950592, 59943824, 59943824, 59943824, 59943824]
                     ^^^^^^^^ one run, +6768 bytes

heap_total_bytes on the same probe is spread 0 across all seven.

Two possible causes, and they need different fixes

  1. The re-pin captured a bad sample. gc-ratchet: re-pin baseline on the dedicated bench host (ratchets #7443's retention win) #7446 ran on the dedicated bench host; one run in seven landing 6,768 bytes high could be incidental (a lazily-created runtime global, an interned string) rather than a property of the probe. Fix: re-pin 12_large_live_set, ideally with more repeats.
  2. 12_large_live_set genuinely became non-deterministic. 6,768 bytes on a 60 MB heap is 0.011% — small, but the gating premise is bit-identical, and the other eleven probes still are. If retention on the largest live set is now sample-dependent, that is a real finding about the collector and worth knowing on its own.

Distinguishing them is cheap: re-run that probe ~21× on a quiet host and see whether the outlier recurs.

Why this matters right now

Roughly fifteen GC-affecting changes landed today — layout installation at allocation (#7532), the shape-install memo (#7535), write-barrier gating (#7536), the tape leaving the old generation (#7553), plus a spill-path rooting fix (#7546). None of them were checked by the ratchet, because it has not measured anything since before they were written. Several carried their own PERRY_GC_DIAG A/Bs, which is why I merged them, but that is per-PR diligence rather than a standing gate.

Suggested acceptance

  • 12_large_live_set.heap_used_bytes deterministic across ≥21 runs on the pinned host, or the probe explicitly moved out of the gating family with the reason recorded next to it (the mechanism the assertion's own message points at).
  • The ratchet's measurement step observed green on main at least once, so we know the probes run.
  • Consider promoting gc-ratchet to a required context after that first green — a new gate has never been green, and promoting it while red would block every open PR.

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