You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Rename:ci-pre.yml is the canonical name. GEN-014 flags a ci-precheck.yml file, a uses: of one, or an [allow].workflows key naming it. The example, every fixture (CT-004, GEN-008, CACHE-009, _e2e and the rest) and the docs are renamed.
Concurrency:
GEN-015 flags a workflow-level concurrency in ci-pre.yml. WF-002 now exempts that file.
GEN-016 flags a job other than cache-janitor that has concurrency or needs: cache-janitor.
GEN-017 flags a janitor that lacks { group: cache-janitor, cancel-in-progress: false }.
Installs:GEN-018 flags an install step in ci-pre.yml.
PR cache keys:CACHE-013 flags a PR-reachable cache save without a delimited pr-<N> key component. The planner has a new --github-output key, cache_key_pr, which holds pr-<N> on a PR and is empty elsewhere.
Classifier: it recognizes a delimited pr-<N> anywhere in a key, still accepts the legacy delta-v1-pr<N> form, and treats a refs/pull/<N>/merge ref as belonging to PR N.
Janitor:
Deletes every entry of a closed or merged PR. A failed lookup keeps them.
Evicts least-recently-used entries in families marked with the new evict = "lru" key.
Keeps the newest entry per key prefix for other families.
Never deletes the newest entry a required job restores.
Never deletes an entry younger than 10 minutes.
ci-lint cache budget:
PR context: warn-only, except for the PR's own pr-<N> entries.
Default branch, schedule and dispatch: a hard fail when over budget.
Rule IDs are GEN-014..018 and CACHE-013 because GEN-012, GEN-013 and CACHE-010..012 were taken by #57, #61 and #62 while this was in flight.
Validation: there is no CI in ci.yml, so the selftest pair is the validation (435 tests):
uv run --no-project --with pyyaml python3 -m ci_lint selftest: OK
python3 -S -m ci_lint selftest (PyYAML not importable): OK (skipped=63)
The RED/GREEN output for every rule is in the PR body.
Not done here:
the zackees/soldr reference implementation and its ≤ 30 s measurement;
Activity
zackees commentedon Sep 29, 2026
Implemented by #60, squash-merged as af6d22d.
ci-lint side of #23:
ci-pre.ymlis the canonical name.GEN-014flags aci-precheck.ymlfile, auses:of one, or an[allow].workflowskey naming it. The example, every fixture (CT-004, GEN-008, CACHE-009, _e2e and the rest) and the docs are renamed.GEN-015flags a workflow-levelconcurrencyinci-pre.yml.WF-002now exempts that file.GEN-016flags a job other thancache-janitorthat hasconcurrencyorneeds: cache-janitor.GEN-017flags a janitor that lacks{ group: cache-janitor, cancel-in-progress: false }.GEN-018flags an install step inci-pre.yml.CACHE-013flags a PR-reachable cache save without a delimitedpr-<N>key component. The planner has a new--github-outputkey,cache_key_pr, which holdspr-<N>on a PR and is empty elsewhere.pr-<N>anywhere in a key, still accepts the legacydelta-v1-pr<N>form, and treats arefs/pull/<N>/mergeref as belonging to PR N.evict = "lru"key.ci-lint cache budget:pr-<N>entries.Rule IDs are GEN-014..018 and CACHE-013 because GEN-012, GEN-013 and CACHE-010..012 were taken by #57, #61 and #62 while this was in flight.
Validation: there is no CI in ci.yml, so the selftest pair is the validation (435 tests):
uv run --no-project --with pyyaml python3 -m ci_lint selftest: OKpython3 -S -m ci_lint selftest(PyYAML not importable): OK (skipped=63)The RED/GREEN output for every rule is in the PR body.
Not done here:
precheckcaller job id and theci_lint prechecksubcommand.