Repository navigation
Conversation
Both writer flows ([flow.main] and [flow.nightly]) declared `pre-prune = true`, but no workflow in this repository ever runs `ci-lint cache preprune`. ci_lint's CACHE-004 arithmetic honours the declaration by dropping the lockfile-change peak from the worst-case footprint, so the modelled footprint was understated by 9,542,041,600 B for free. Option (A), adding a `ci-lint cache preprune --lockfile-changed` step to a writer flow, is not expressible here: the push:main writer flows fan out across five independently-triggered workflows (ci.yml, dependency-check.yml, proto-breaking.yml, security-audit.yml, security-fuzz.yml), and GitHub Actions has no cross-workflow barrier to order a prune ahead of all of them. cache-budget.yml is the only job that can see the whole account, and it already runs *after* the writers (it `needs:` the platform lanes), which is a post-hoc trim. So the waiver is removed and the peak is counted honestly. CACHE-004 was ALREADY a violation before this change (steady total 11,036,262,400 B alone exceeds the 9,663,676,416 B budget), so this does not newly break a green check -- it corrects an understated number. The worst case is now 20,578,304,000 B. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
CACHE-034 is now merged — zackees/ci.yml#352 (docs #353). It fires on this repository's
So the remediation in this PR is now a rule ci-lint enforces, not just a review finding. Verified against merged Two things I confirmed independentlyCACHE-004 was already a VIOLATION before this change — 11,036,262,400 B against a 9,663,676,416 B budget, with the waiver applied. The waiver was not keeping the check green; the check was already red. This PR corrects an understated number on a failing check rather than breaking a passing one, which is the right order to do things in. The choice of (B) over (A) is correct here. The real blocker underneath
Held as a draft deliberately: it needs an owner decision on the family sizes before it can go green, and no |
|
One correction to my earlier recommendation: I said option (A) — adding the pre-prune step — was preferred. For running-process that option is not currently expressible, which your own analysis established and I should not have talked past.
Filed the shared prerequisite as zackees/ci.yml#354, covering soldr, bosn and running-process, which all hit the same wall for structural reasons rather than by omission. This does not change the recommendation to land it. running-process's honest worst case (19.19 GiB) is over budget, but so is its steady state (11.04 GB) — the waiver was not what made CACHE-004 fail. This PR makes the real number visible; the cardinality decision that follows is the actual work. |
Problem
ci.tomldeclaredpre-prune = trueon both writer flows ([flow.main]and[flow.nightly]), but no workflow in this repository ever runsci-lint cache preprune. The declaration was an unhonoured waiver:ci_lint's CACHE-004 arithmetic honours it by dropping the lockfile-change peak from the worst-case footprint, so running-process's modelled cache footprint was understated by exactly that peak term, for free.This is the finding from ci.yml PR #352 / rule CACHE-034.
Why option (A) — adding the pre-prune step — was not chosen
The instructions preferred (A) "if a writer workflow is a normal place to add the step AND it would actually run before saves." It is not, here:
push:mainwriter flows are not one workflow. A single push fans out across five independently-triggered workflows, each saving its own setup-soldr cache:ci.yml(viaci-preflight.yml/ci-preflight-rust.yml/coverage.yml)dependency-check.yml,proto-breaking.ymlsecurity-audit.yml(save-cacheon main, line 72)security-fuzz.yml(save-cacheon main, line 108)compile,dylint-out) — those are exactly the ones whose writes create the peak.cache-budget.ymlis the only job that can see the whole account, and it already runs after the writers — itneeds:the platform lanes. That is a post-hoc trim, not a pre-prune.This is a capability gap, not a workaround I chose to skip: until ci-lint/GitHub Actions has a way to order a prune ahead of independently-triggered writers,
pre-prune = truecannot be truthfully declared by a repository in this shape. Filing that as a note here rather than working around it.Change
Removed
pre-prune = truefrom[flow.main]and[flow.nightly], with a comment recording why and why it cannot simply be re-added.[cache].budgetis unchanged at 9GB. No numbers were invented.CACHE-004 arithmetic — before and after
Both flows resolve via
resolve_flowtocache = "write"; verifiedpre_prunewasTrueformainandnightlybefore the change (so the waiver did apply to every writer flow and the peak was being waived).pre-prune = true)[cache.pr].budgetworst = steady + [cache.pr].budget(every writer flow pre-prunes: lockfile peak waived)worst = steady + lockfile-change peak + [cache.pr].budget(not every writer flow pre-prunes)[cache].budget)The CACHE-004 violation, honestly
CACHE-004 was already a VIOLATION before this change. The steady total alone (11,036,262,400 B) exceeds the 9GB budget (9,663,676,416 B). The waiver was not what kept this check green — it was already red. So this PR does not turn a passing check red; it corrects an understated number on an already-failing check.
After the change CACHE-004 reports:
I have deliberately not lowered family
maxsizes to force this to pass. The real question this surfaces is upstream of CACHE-004: running-process's declared family shape (compileat 1400MB x 6 platforms = 8.8 GB steady) does not fit a 9 GB budget no matter what the peak does. That is a cardinality/maxdecision for the repository owner, not something to paper over in a waiver-removal PR.Verification
CACHE-004: VIOLATION before and after (see above).CACHE-034: not reported by this ci.yml revision — the rule is still being landed under ci.yml PR ci: parallelize release fuzz evidence runs #352. This PR is the remediation it asks for.Unresolved
precheckin this repository are untouched by this PR and out of scope.local-gate.toml; noLocal-Gate:trailer is attached to this commit. If the gate requires one, this PR will need a re-run ofpython3 -m ci_lint local-gate runon the branch. Not fabricated.🤖 Generated with Claude Code