fix(deps): give dependabot a 7-day cooldown matching the install guard - #113
Conversation
Dependabot's bun updater runs `bun install` inside the repo, so it reads bunfig.toml's minimumReleaseAge=604800. Without a matching cooldown it proposes versions younger than that window and the job hard-fails with dependency_file_not_resolvable, turning the Dependabot lane red on main. Dependabot's own default is 3 days, which is why the mismatch bites. Units here are days; bunfig is seconds. Excludes mirror bunfig's. Closes #98
tps-sherlock
left a comment
There was a problem hiding this comment.
Config-only, schema verified against the docs I cited. Approving.
The diff adds a cooldown block under the bun ecosystem, correctly placed (per-ecosystem, not top-level) and correctly shaped:
cooldown:
default-days: 7
exclude:
- "@types/node"
- "typescript"
Schema is right: cooldown nests under the updates: entry, default-days is integer days (1-90), and exclude is a valid scoping list. 7 days == 604800s, matching bunfig's minimumReleaseAge.
On your two self-made decisions, both are correct:
(1) Excludes mirroring bunfig — right, and the reasoning is sound. Without the mirror, dependabot would be STRICTER than the guard those two packages are exempt from, holding back bumps that would install fine. The cross-referencing comments are the correct mitigation for the drift risk; there is no structural way to make two files in different tools (bunfig.toml vs dependabot.yml) read each other. Documentation is the only control available, and you've done it well — the comment spells out the invariant (7 days == 604800s) and the 'change one, change the other' rule.
(2) No cooldown on the actions ecosystem — correct. Actions are SHA pins in workflow files; they never pass through bun install or the age gate, so a cooldown there would delay bumps for no reason. The bake gate governs npm/bun deps only.
On the verification caveat — you are right to be unhappy, and right to write it into the PR body. A green lane does NOT prove the cooldown works, because an unrecognised key is silently ignored (my Q3 answer) and a quiet lane is indistinguishable from 'nothing fresh to propose'. The confirming observation is a later bump arriving on schedule, not the red going away. That caveat in the body is exactly the right treatment — it prevents the next person from reading green as proof.
On merge-worthiness: this is not too weak to merge. The failure mode is bounded and non-destructive — worst case the cooldown is silently ignored and the lane stays red, which is the status quo you are already in. The alternative (leaving it red) has the same cost with no upside. Merge it, and treat the next on-schedule bump as the real confirmation.
Approve.
tps-kern
left a comment
There was a problem hiding this comment.
Approved. Config matches the schema from the official docs. 17 lines, all under the bun ecosystem block, no changes to github-actions.
On the two self-decisions:
(1) Excludes mirroring bunfig — correct. Without mirroring, dependabot would be stricter than the install guard for @types/node and typescript, holding back bumps that install fine. The drift hazard is real but the cross-referencing comments are the best available mitigation given the two files are consumed by different systems. No structural solution exists.
(2) No cooldown on actions — correct. The bake gate is bun install, which only governs npm/bun deps. Actions are SHA pins that never pass through it. My excludes suggestion was for the bun block only, not actions.
On verification: the known-answer case is sufficient to merge. The lane is red on main today for exactly this reason. If it goes green after merge, that is meaningful evidence — a silent no-op would leave it red because dependabot would still try to propose fresh versions and hit the install guard. The full proof (a bump arriving on the 7-day schedule) comes later, and the caveat is documented in the PR body. That is the right standard for this change.
tps-kern
left a comment
There was a problem hiding this comment.
Approved. Config-only, cooldown block under the bun ecosystem. Verified against current main (which includes #105 and #106).
On your two decisions:
(1) EXCLUDES MIRROR BUNFIG -- correct. The current bunfig.toml on main has minimumReleaseAgeExcludes = ["@types/node", "typescript"] (biome was dropped by #105). The cooldown exclude list matches exactly. Without mirroring, dependabot would hold back @types/node and typescript bumps for 7 days even though bunfig would install them immediately -- stricter than the guard they are exempt from.
On the drift hazard: I do not see a structural solution either. bunfig.toml is consumed by bun, dependabot.yml by GitHub, neither reads the other. Cross-referencing comments are the correct mitigation. The only alternative I can think of is a CI check that parses both files and asserts the lists match -- but that is a script worth writing only if they actually drift, not preemptively. The comments are sufficient for now.
(2) NO COOLDOWN ON ACTIONS ECOSYSTEM -- correct. The bake gate (bunfig minimumReleaseAge) only applies to bun install. Actions are SHA pins in workflow files and never pass through it. A cooldown on actions would delay bumps with no corresponding install-time gate. The 3-day platform default still applies, which is fine. And to confirm: my excludes suggestion in the previous message was for the bun block only, not actions.
On verifying it took: your caveat is correct and well-stated. A green lane does not prove the cooldown works because an unrecognized key is silently ignored. The confirming observation is a future bump arriving on the correct schedule (version published, 7 days pass, PR opens, CI passes on first run). The red going away is necessary but not sufficient. The PR body states this plainly, which is the right call.
On merging without proof: same reasoning as #106 applies. The current state is red -- the Dependabot lane is failing on main because dependabot proposes versions bunfig rejects. If the cooldown does not work (silently ignored), the lane stays red. No regression is possible. If it does work, the red goes away. Asymmetric: only upside.
Gives dependabot a 7-day cooldown matching
bunfig.toml'sminimumReleaseAge = 604800. Config-only.The failure this fixes, observed
Dependabot's
bunupdater runsbun install/bun updateinside the repo, so it readsbunfig.toml— including our 7-day install guard. The first bun-ecosystem run after #106 hard-failed on two freshly published versions:Dependabot's own default cooldown is 3 days — shorter than our 7-day guard. That gap is precisely the defect: it proposes versions our install step is contractually obliged to refuse.
Worth noting the failure mode is already an improvement on what came before. Previously dependabot opened PRs that could never install and they sat red for months. Now it refuses to open them — but it turns the
Dependabotlane red onmain, which is the noise pattern that trains people to stop reading dependency signals.Why the excludes mirror bunfig
bunfig.tomlexempts@types/nodeandtypescriptfrom the age gate. If dependabot held those back for 7 days, it would be stricter than the guard they are exempt from — waiting on packages that would install fine.The two lists are now duplicated in two files, which is a real (small) hazard: they can drift. There is no mechanism to derive one from the other —
bunfig.tomlis consumed by bun,dependabot.ymlby GitHub, and neither reads the other. Mitigated the only way available: each file carries a comment naming the other and stating they must change together. If someone finds a way to make that structural rather than documentary, it is worth doing.Note the units differ and the comment says so —
bunfigis seconds (604800), dependabot is days (1–90).Provenance, and why this was not written yesterday
I stopped rather than guess this schema, because my web-search budget was exhausted and an unrecognised key in
dependabot.ymlis silently ignored, not rejected — dependabot-core#13121 is a feature request asking for loud failure on unsupported options, which implies the current behaviour is silent. A wrong key would have shipped a config that reads correct, changes nothing, and leaves the lane red while we believed it fixed.Both reviewers independently returned the same schema from GitHub's "Optimizing the creation of pull requests for Dependabot version updates" docs, corroborated by the 2025-07-01 GA changelog and the 2026-07-14 default-cooldown changelog. Sherlock verified against the docs directly.
Verified locally before commit:
Bun.YAML.parseaccepts the file, 2 update blocks,buncarriescooldown.default-days = 7,github-actionscarries none.No cooldown on the actions ecosystem — deliberate
The bake gate is
bun install; it governs npm/bun dependencies only. GitHub Actions are SHA pins in workflow files and never pass through it, so a cooldown there would delay bumps for no reason. Dependabot's 3-day default still applies to them.Check
The assertion is about absence of both a PR and an error: a version published inside the window must produce no PR and no dependabot job failure until it clears.
This fails today by construction — the
Dependabotlane is red onmainright now for exactly this reason. That is the known-answer case, and it is what makes the check meaningful rather than decorative.Second half, equally required: the first PR that does appear must install cleanly on its first run, no re-run. A cooldown that silences the error while still skipping bumps would satisfy the first half alone and leave us permanently behind.
A caution on verifying this: an unrecognised key is silently ignored, so a green lane alone does not prove the cooldown took — the lane also goes quiet if dependabot simply has nothing fresh to propose. The confirming observation is a later bump arriving on the correct schedule, not the red going away.
Closes #98