Skip to content

ci(cache): bound the Dylint families with evict = "lru" (CACHE-029) - #421

Merged
zackees merged 1 commit into
mainfrom
ci/cache-eviction
Oct 5, 2026
Merged

zackees merged 1 commit into
mainfrom
ci/cache-eviction

Conversation

@zackees

@zackees zackees commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Measured before and after

ci-lint cache audit on this repository, 2026-10-04:

dylint        2 entries    1089 MB   (declared max 600MB)
dylint-out   11 entries    6957 MB   (declared max 700MB)
toolchain     8 entries    1522 MB
budget: 10083189912B / 10200547328B   (98.8%)

Ten superseded entries across the two Dylint families. GitHub was already refusing new saves at 98.8% of the 10 GB cap, so pull requests were running on cold caches — the failure the cache budget exists to prevent, reached via the mechanism meant to help.

Why max couldn't stop it

max declares the size of one entry, not the family's footprint. per declares the writer shape, not the entry count — and every family here already says per = "none", which is exactly why the count grew. evict = "lru" is the only thing that bounds it: ci-lint cache janitor then keeps each family at max × cardinality instead of letting it accumulate.

Both families now declare evict = "lru", and ci_lint.rules.cache_static.check_cache_029 (zackees/ci.yml#323) keeps them honest.

Already reclaimed

ci-lint cache janitor run against this repository:

family before after
dylint 2 entries, 1089 MB 1, 544 MB
dylint-out 11 entries, 6957 MB 1, 648 MB
uv 22 entries, 2.3 MB 6, 0.8 MB

9.39 GiB → 3.01 GiB, from 98.8% to roughly 31% of budget. New saves can succeed again.

Verification

  • ci_lint precheck --local: 915 violations before, 915 after — zero new (the 915 are pre-existing on this repository)
  • check_cache_029 on the new ci.toml: no findings

Refs zackees/ci.yml#153, #323

🤖 Generated with Claude Code

Measured 2026-10-04: 13 live `dylint` entries (7.6 GB) and 11 `dylint-out`
(7.0 GB), together 87% of this repository's cache as superseded entries, at
**98.8% of the 10 GB budget**. GitHub was refusing new saves and pull
requests were running on cold caches.

`max` sizes ONE entry and cannot bound the family. `per` declares the
writer shape, not the entry count -- every family here already says
`per = "none"`, which is exactly why the count grew. `evict = "lru"` is
the only thing that does: `ci-lint cache janitor` then keeps each family
at `max x cardinality` instead of letting it accumulate.

Reclaims 6.5 GB here (22 superseded + 5 base-layer entries written on a
merge ref), taking the repository from 98.8% to roughly 28% of budget.

precheck: 915 violations before and after.

Refs zackees/ci.yml#153, #323

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Local-Gate: v1 tree=f12f7a3d9087e2759a339f45139cdba5a650de0b secs=488 lanes=linux-minimal:run,dylint-minimal:run
Ci-Attestation: {"at":1791163277,"gate":"general/all/ci-guards","host":"linux-x86_64","key":"e97e7d80c6d49acf22378574d57fc939a6bad0509f6c6a7ff80abc8713c193f6","lane":"linux-minimal","parents":["e72e0daf6f73eb92db59c167806f8ce661fa9f6a"],"secs":280,"stamp":"26cde30d3bd830ea1a14e4a10afea038","tree":"f12f7a3d9087e2759a339f45139cdba5a650de0b","v":1,"via":"run"}
Ci-Attestation: {"at":1791163277,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-clippy","host":"linux-x86_64","key":"e97e7d80c6d49acf22378574d57fc939a6bad0509f6c6a7ff80abc8713c193f6","lane":"linux-minimal","parents":["e72e0daf6f73eb92db59c167806f8ce661fa9f6a"],"secs":280,"stamp":"86b841b5c595ce52ce2e68ffbfa6745b","tree":"f12f7a3d9087e2759a339f45139cdba5a650de0b","v":1,"via":"run"}
Ci-Attestation: {"at":1791163277,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-test","host":"linux-x86_64","key":"e97e7d80c6d49acf22378574d57fc939a6bad0509f6c6a7ff80abc8713c193f6","lane":"linux-minimal","parents":["e72e0daf6f73eb92db59c167806f8ce661fa9f6a"],"secs":280,"stamp":"b8dec187a3b354882f06cfc6c98b65d8","tree":"f12f7a3d9087e2759a339f45139cdba5a650de0b","v":1,"via":"run"}
Ci-Attestation: {"at":1791163277,"gate":"rust/x86_64-unknown-linux-gnu/desktop-status-test","host":"linux-x86_64","key":"e97e7d80c6d49acf22378574d57fc939a6bad0509f6c6a7ff80abc8713c193f6","lane":"linux-minimal","parents":["e72e0daf6f73eb92db59c167806f8ce661fa9f6a"],"secs":280,"stamp":"ddded2e24f57d858e7718e73b5ab2697","tree":"f12f7a3d9087e2759a339f45139cdba5a650de0b","v":1,"via":"run"}
Ci-Attestation: {"at":1791163277,"gate":"rust/x86_64-unknown-linux-gnu/dylint-all-features-all-targets","host":"linux-x86_64","key":"83dd6331b437add12bd0b024f6e37cdd340bbef2e5501522b73ee1ac965b24aa","lane":"dylint-minimal","parents":["e72e0daf6f73eb92db59c167806f8ce661fa9f6a"],"secs":208,"stamp":"c99a9f22187dd9ae992e0612eac2729e","tree":"f12f7a3d9087e2759a339f45139cdba5a650de0b","v":1,"via":"run"}
@zackees
zackees force-pushed the ci/cache-eviction branch from 234c1c2 to 0f5b449 Compare October 5, 2026 01:22
@zackees
zackees merged commit d5e66b0 into main Oct 5, 2026
7 checks passed
zackees added a commit that referenced this pull request Oct 5, 2026
zackees/ci.yml#335 standardizes promotion on setup-soldr's ancestor encoding
(shortest parent-edge distance from a live git DAG walk) rather than a
first-parent ordinal, which inverts on wide merges: a 50-commit branch tip
reports ordinal 53 while the merge commit containing it reports 4, so a cache
saved at the merge looks OLDER than one saved 50 commits before it. #335 keeps
the `m<n>` label for offline audit only.

dylint (600MB) and dylint-out (700MB) are the two families at or above
CACHE-031's 256MB floor, and they are what held this repository's budget --
87% of its entries were superseded before the janitor work. The other five
families sit at or below 210MB and stay unopted: a small family's entry count
is noise, not a budget threat. Both families now also carry evict = "lru"
(#421), so CACHE-029 is clean.

A declaration only: setup-soldr#566 is merged but unreleased (no tag contains
it; v0.9.85 predates it; the sanctioned v0 float trails main), so CACHE-030
and CACHE-032 report `needs_review` and the opt-in is inert until a release
carries it.

Validated against the merged rules: schema clean, CACHE-029 clean,
CACHE-031 clean (and it fires for exactly these two families when the opt-in
is removed), CACHE-030/032 `needs_review` as expected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
zackees added a commit that referenced this pull request Oct 5, 2026
zackees/ci.yml#335 standardizes promotion on setup-soldr's ancestor encoding
(shortest parent-edge distance from a live git DAG walk) rather than a
first-parent ordinal, which inverts on wide merges: a 50-commit branch tip
reports ordinal 53 while the merge commit containing it reports 4, so a cache
saved at the merge looks OLDER than one saved 50 commits before it. #335 keeps
the `m<n>` label for offline audit only.

dylint (600MB) and dylint-out (700MB) are the two families at or above
CACHE-031's 256MB floor, and they are what held this repository's budget --
87% of its entries were superseded before the janitor work. The other five
families sit at or below 210MB and stay unopted: a small family's entry count
is noise, not a budget threat. Both families now also carry evict = "lru"
(#421), so CACHE-029 is clean.

A declaration only: setup-soldr#566 is merged but unreleased (no tag contains
it; v0.9.85 predates it; the sanctioned v0 float trails main), so CACHE-030
and CACHE-032 report `needs_review` and the opt-in is inert until a release
carries it.

Validated against the merged rules: schema clean, CACHE-029 clean,
CACHE-031 clean (and it fires for exactly these two families when the opt-in
is removed), CACHE-030/032 `needs_review` as expected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Local-Gate: v1 tree=51c622f181d9a3eb1735a2b528a06a8ea73c3c9e secs=794 lanes=linux-minimal:run,dylint-minimal:run
Ci-Attestation: {"at":1791168159,"gate":"general/all/ci-guards","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"e4be5d15cb58b396f9cd8877b7cf8c9a","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-clippy","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"6de01abf2a62725daef5c66b6361c929","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-test","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"ec2c89460937515e87bdc712e134ab74","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/desktop-status-test","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"9bc2fb172dbdc571d2e5c5da787a3407","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/dylint-all-features-all-targets","host":"linux-x86_64","key":"47939ce85da57bea5dd277f4db1980721a2ff73648eb03e90a9460b64967789a","lane":"dylint-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":492,"stamp":"ffc3ed5502e7a89db8e3ff03d78ec5e1","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
zackees added a commit that referenced this pull request Oct 5, 2026
#422)

zackees/ci.yml#335 standardizes promotion on setup-soldr's ancestor encoding
(shortest parent-edge distance from a live git DAG walk) rather than a
first-parent ordinal, which inverts on wide merges: a 50-commit branch tip
reports ordinal 53 while the merge commit containing it reports 4, so a cache
saved at the merge looks OLDER than one saved 50 commits before it. #335 keeps
the `m<n>` label for offline audit only.

dylint (600MB) and dylint-out (700MB) are the two families at or above
CACHE-031's 256MB floor, and they are what held this repository's budget --
87% of its entries were superseded before the janitor work. The other five
families sit at or below 210MB and stay unopted: a small family's entry count
is noise, not a budget threat. Both families now also carry evict = "lru"
(#421), so CACHE-029 is clean.

A declaration only: setup-soldr#566 is merged but unreleased (no tag contains
it; v0.9.85 predates it; the sanctioned v0 float trails main), so CACHE-030
and CACHE-032 report `needs_review` and the opt-in is inert until a release
carries it.

Validated against the merged rules: schema clean, CACHE-029 clean,
CACHE-031 clean (and it fires for exactly these two families when the opt-in
is removed), CACHE-030/032 `needs_review` as expected.


Local-Gate: v1 tree=51c622f181d9a3eb1735a2b528a06a8ea73c3c9e secs=794 lanes=linux-minimal:run,dylint-minimal:run
Ci-Attestation: {"at":1791168159,"gate":"general/all/ci-guards","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"e4be5d15cb58b396f9cd8877b7cf8c9a","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-clippy","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"6de01abf2a62725daef5c66b6361c929","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/default-facade-test","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"ec2c89460937515e87bdc712e134ab74","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/desktop-status-test","host":"linux-x86_64","key":"38f79479d0d8128012ebe7e9432b03395fa814b16e0610d4812c902473338141","lane":"linux-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":302,"stamp":"9bc2fb172dbdc571d2e5c5da787a3407","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}
Ci-Attestation: {"at":1791168159,"gate":"rust/x86_64-unknown-linux-gnu/dylint-all-features-all-targets","host":"linux-x86_64","key":"47939ce85da57bea5dd277f4db1980721a2ff73648eb03e90a9460b64967789a","lane":"dylint-minimal","parents":["d5e66b030b89cd788d2fca26321a10521a644778"],"secs":492,"stamp":"ffc3ed5502e7a89db8e3ff03d78ec5e1","tree":"51c622f181d9a3eb1735a2b528a06a8ea73c3c9e","v":1,"via":"run"}

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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