Repository navigation
Conversation
ci.toml declared pre-prune = true on [flow.main], the only writer flow, but no
workflow in this repository runs ci-lint cache preprune. CACHE-004 honours the
declaration by dropping the lockfile-change-peak term, so the modelled footprint
was understated by 8,294,236,160 B for free.
Removed rather than wired. Honest arithmetic does not fit:
steady 8,619,294,720 B + lockfile peak 8,294,236,160 B = 16,913,530,880 B
budget 9.5GB = 10,200,547,328 B -> CACHE-004 VIOLATION
The violation is left visible. ci-lint cache preprune --lockfile-changed --dry-run
run live against the repository's 82 real cache entries forecasts the same
16,913,530,880 B and finds 12 superseded lockfile-keyed entries it would delete,
so the peak is real, not an artefact of the model.
Also corrects this file's header, which claimed the families bound at '~5.0 GiB
steady, leaving headroom'. The steady total is 8.02 GiB -- 85% of budget before
the peak term is added at all.
Local-Gate: v1 tree=71f8eda845a84db1ac770ecdaf8e9c7cbbbc4d38 secs=42 lanes=lint:run
Ci-Attestation: {"at":1791198851,"gate":"python/all/lint","host":"linux-x86_64","key":"564ae20ded085f92f66fa198fb86adac6ba6fb4dba687d7fb87fa05261ac2355","lane":"lint","parents":["19a40294a7358e2b761c7b142deb7654d1c5d519"],"secs":42,"stamp":"bc7ab08bcb936cb77ee4205473c4ceb5","tree":"71f8eda845a84db1ac770ecdaf8e9c7cbbbc4d38","v":1,"via":"run"}
|
Correction to one claim in this PR — there is no ci-lint bug here. The draft reported that Both the janitor and CACHE-004 call that same function, and it sums the per-shape ceilings. The comment above line 215 explains why: an earlier version of the janitor used So The substantive finding standsThe real defect is upstream of the waiver, exactly as identified: Leaving CACHE-004 failing is right: pre-pruning ~124 MB cannot close a 6.7 GB overage, and CACHE-026 records a pre-prune guard turning ~93% of zccache main pushes red. No numbers were adjusted, which is the correct outcome. Two smaller correctionsCACHE-034 is implemented and merged (zackees/ci.yml#352, docs #353). It is not "the next free number in the registry" — it ships in current ci_lint and fires on this repository's Thank you for running the gate for real and stamping a genuine tree-bound trailer rather than fabricating one — that is exactly the right call and it is what makes the attestation worth anything. |
|
Before marking this ready: the green CI here does not mean the policy passes. All 64 checks are green, and this PR deliberately introduces a CACHE-004 violation. Those are not in conflict — because no workflow in this repository runs That is worth being explicit about, because "64/64 green" is exactly the reading that would let this land as though the cache policy were satisfied:
The failure is real and correctly left visible; that was the right call. But it means the underlying decision — 8.02 GiB steady against a 9.5 GiB budget, before the peak term — has to be made deliberately by an owner rather than discovered by CI. Adding a precheck step to a writer flow would close that gap, though it is a separate change from this one. Also worth re-checking before mergeThe Two verifications from the parent side: CACHE-034 is implemented and merged (zackees/ci.yml#352) so this is remediation for an enforced rule, and CT-007 (#355) now covers the dead- |
|
Superseded by merged #606 (ee3623f). Current main already removes the unhonoured pre-prune waiver from the sole writer flow. The honest CACHE-004 budget overage remains separate work, as recorded in #606 and zackees/ci.yml#360; closing this duplicate does not claim that capacity problem is resolved. The earlier correction here also stands: family_footprint already supports shapes, so an upstream shapes implementation is not a prerequisite. |
Found by zackees/ci.yml#352 (rule CACHE-034):
ci.tomldeclaredpre-prune = trueon[flow.main], the only writer flow, but no workflow in this repository runsci-lint cache preprune.ci_lint's CACHE-004 arithmetic honours the declaration by waiving the lockfile-change-peak term, so the modelled footprint was understated by 8,294,236,160 B for free.This PR makes
ci-lint precheckfail CACHE-004, and that is deliberate. The failure is the honest reading of thisci.toml. No number here was adjusted to make it pass.What changed
pre-prune = trueremoved from[flow.main]. Also corrects the[cache]header comment, which claimed the families bound at "~5.0 GiB steady, leaving headroom" -- the steady total is actually 8.02 GiB, already 85% of budget before the peak term is added.No workflow edits, no budget change, no live cache entry touched.
Before / after
[cache.pr].budget[cache].budget)The three families that carry
lockfile = trueand dominate the peak arecook(4,404,019,200 B),solo-toolchain(2,936,012,800 B), andcompile+registry(954,204,160 B).Why the peak is not a modelling artefact
ci-lint cache preprune --lockfile-changed --dry-run, run live against this repository's 82 real cache entries (7,763 MB), forecasts the same 16,913,530,880 B and finds 12 superseded lockfile-keyed entries it would delete (~124 MB ofcompile/registrygenerations). So the coexistence the peak term models is real, and the waiver was suppressing a true cost.The real problem is upstream of the waiver
The honest total does not fit, and it does not fit because the steady term is already 8.02 GiB of a 9.5 GiB budget. That steady term is over-counted, not the peak:
solo-toolchainis declaredper = "platform"(7) x 400 MB = 2,800 MB against a measured live 2,472 MB across 9 entries that key on the runner OS, not the target triple.cookis declaredper = "platform"(7) x 600 MB = 4,200 MB against a measured live 1,580 MB across 10 entries, same over-count.ci.tomlcomment itself saysper = "os"is "the honest cardinality axis for every family below: all of them key on the runner OS, and none of them key on the target triple" -- and then declaresper = "platform". The comment and the value disagree.The
shapesmechanism is the correct fix and is already discussed in this file, but it is blocked onci_lint.cache.ops._lru_evictions(the code the janitor actually runs) ignoringshapesand computingmax x cardinality(per). That is a ci-lint bug, not a mimalloc-pprof one, and this repository should not work around it.I have deliberately not adjusted any
maxorpervalue in this PR. Doing so would require re-measuring every family's live footprint and would be a separate, evidence-backed change -- and picking numbers to make the check green is exactly what this PR exists to stop.Suggested follow-ups (not in this PR)
ci_lint.cache.ops._lru_evictionsto route throughfamily_footprintsoshapesis honoured, per the existingci.tomlnote.per(andmax) where the declared cardinality exceeds the measured one.[cache].budgetcannot go above 10 GB -- the answer would be a pre-prune step for real, plus fixing ci.yml#352's CACHE-026 failure mode (a pre-prune guard that fails the run) before adding one.Verification
cache budget exceeded: worst case 16913530880 B > budget 10200547328 B (worst = steady + lockfile-change peak + [cache.pr].budget (not every writer flow pre-prunes)).[CACHE-034]line to report.ci-lint local-gate run, lint lane 45/45 in 42s,CPATHpointed at the systemtapsys/sdt.haslocal-gate.tomldocuments). HEAD7428a3658e9dcarries a real tree-boundLocal-Gate:trailer. Nothing fabricated.Why (A) wire up a pre-prune step instead
ci-lint cache preprunewould needactions: writeand a slot in the writer flow ahead of the saves. Three reasons against, in order of weight:docs/policy-general.md) records that a pre-prune guard in a build workflow turned ~93% of zccache's main pushes red in Sept-Oct 2026. Adding that failure mode to this repository'smainpush to fix a budget number is the wrong trade.mainpush runs far fewer cache-writing jobs than the flow names suggest -- on the latestmainpush,c-unit,rust-native,windows-bundles, andasanhad every build jobskipped(they are gated onworkflow_dispatchor aci-full/ci-testlabel). The realmain-push cache writers areamalgamation-driftand themacos-bundlesbuild-macosjobs. Any pre-prune step has to be placed against that set, which is a larger change than this fix warrants.🤖 Generated with Claude Code