utils/dep_freshness
Krzysztof kuhy Rudnicki 98213cbc40
Some checks are pending
dependency freshness / dependencies on newest stable (push) Waiting to run
file length / file-length (push) Waiting to run
md-naming / markdown naming convention (push) Waiting to run
palette drift / palette (push) Waiting to run
shared gate tests / gate unit tests (push) Waiting to run
Check the toolchain versions CI actually installs, not just the ones declared
`.fvmrc` is a declaration nothing in this fleet reads. `subosito/flutter-action`
takes its own `flutter-version:`, and that pin is what the runner installs, so
the two drift in silence and the failure mode is the worst kind: green
locally, red in CI, with no diff to explain it.

kuhylog is the live case. Its runner is on Flutter **3.44.9**, which predates
the `@awaitNotRequired` annotation, so `unawaited(Navigator.push(...))` is
`unnecessary_unawaited` on 3.47.2 here and `discarded_futures` there -- the two
SDKs demand opposite code and CI went red on a commit that is clean locally.
The fleet is spread across 3.44.6, 3.44.8, 3.47.0 and 3.47.1 with no one
tracking it.

So a workflow's `flutter-version:` / `node-version:` is now a dependency like
any other, judged against the same latest stable. That needs no separate
"these must agree" rule: two values both required to equal latest already
agree. A channel name and a `${{ }}` expression are skipped -- one is not a
version, the other resolves at run time and guessing is worse than silence.

Found real drift on its first run: both TypeScript workflows here pinned
`node-version: 24`, a floating major that lets two runs of the same commit
install different Node. Now 24.20.0.

321 tests, 100% branch coverage on every production module.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRykabMwPgDzFHcARoqpaK
2026-08-28 15:04:00 +02:00
..
parsers Check the toolchain versions CI actually installs, not just the ones declared 2026-08-28 15:04:00 +02:00
registries Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
templates Check the toolchain versions CI actually installs, not just the ones declared 2026-08-28 15:04:00 +02:00
tests Check the toolchain versions CI actually installs, not just the ones declared 2026-08-28 15:04:00 +02:00
__init__.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
__main__.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
_tables.py Make the allowlist inheritable, and cache the quarantine lookups 2026-08-28 13:58:44 +02:00
allowlist.py Make the allowlist inheritable, and cache the quarantine lookups 2026-08-28 13:58:44 +02:00
cache.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
check.py Don't judge allowlist rot from a file-scoped run; cut two library versions 2026-08-28 14:07:09 +02:00
constraints.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
discover.py Check the toolchain versions CI actually installs, not just the ones declared 2026-08-28 15:04:00 +02:00
evaluate.py Judge peer dependencies by range, and check the packageManager pin 2026-08-28 13:38:40 +02:00
install_cli.py Script the gate rollout instead of hand-copying it into sixteen repos 2026-08-28 14:12:00 +02:00
install_main.py Script the gate rollout instead of hand-copying it into sixteen repos 2026-08-28 14:12:00 +02:00
install.py Put the hook in the last repo: local block, not at end of file 2026-08-28 14:21:31 +02:00
models.py Judge peer dependencies by range, and check the packageManager pin 2026-08-28 13:38:40 +02:00
quarantine.py Make the allowlist inheritable, and cache the quarantine lookups 2026-08-28 13:58:44 +02:00
report.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
resolve.py Add the shared dependency-freshness gate 2026-08-28 13:00:35 +02:00
versions.py Accept exact pins with more than three version components 2026-08-28 13:37:12 +02:00