Repository navigation
ci: every Dependabot PR touching plugins/** fails the changelog-parity bump gate, because Dependabot cannot bump a manifest or write a changelog entry #4144
Description
Recurring, fully reproducible friction found while draining the Dependabot queue on 2026-09-12. It cost a manual commit on 7 of the 12 open Dependabot PRs, and it will recur on every future one that touches plugins/**.
The mechanic
scripts/check-changelog-parity.sh --check-bump origin/main requires a plugin manifest version bump plus a matching ## [<version>] entry whenever a change set modifies files under plugins/<name>/. Dependabot writes only package.json / package-lock.json, so every such PR fails:
PUBLISHED VERSION REUSE: miro still carries 0.4.0 while this change set modifies files under
plugins/miro/ -- bump the manifest and add a new '## [0.4.0]' release entry instead of editing in place.
The failure surfaces as a red lint job and a red ci-status, so the PR is unmergeable until a human (or an agent) pushes a second commit. The gate is correct and worth keeping; the gap is that nothing supplies the bump for the one author that structurally cannot.
Evidence from the 2026-09-12 drain
Every one of these needed a hand-written chore(<plugin>): bump to <version> commit carrying a manifest bump and a CHANGELOG entry before it could merge:
| PR | Plugin | Version it had to claim |
|---|---|---|
| #4101 | miro | 0.4.2 |
| #4102 | miro | 0.4.3 |
| #4104 | miro | 0.4.4 |
| #4085 | ai-briefing | 0.7.30 |
| #4061 | knowledge | 0.13.52 |
| #4031 | knowledge | 0.13.53 |
(#4100, #4032 and #4021 were exempt: they touch .github/ and the root manifest, not plugins/**.)
Two costs beyond the extra commit
1. It serializes the queue per plugin. Two Dependabot PRs touching the same plugin cannot both claim the same version, so they must be landed one at a time, each re-based and re-numbered after the previous merges. Three miro PRs meant three sequential CI cycles that could otherwise have been concurrent.
2. Version numbers are raced by ordinary PRs. Mid-drain, #4097 merged and consumed the exact three numbers already staged on these branches (miro 0.4.1, knowledge 0.13.51, ai-briefing 0.7.29), turning all three green branches into version-reuse failures and forcing a renumber-and-repush of each. Any manual-bump approach has this race; the wider the queue, the likelier it fires.
Options, roughly cheapest first
- Extend the existing auto-commit precedent.
.github/workflows/dependabot-miro-bundle.ymlalready detects a Dependabot PR, rebuilds a derived artifact, and pushes the result back to the branch. The same shape could compute the next patch version for each touched plugin and write the manifest bump plus a templated CHANGELOG entry. It inherits that workflow's known constraint: aGITHUB_TOKENpush does not retrigger workflows, which is why build(deps): bump the npm-minor-patch group in /plugins/miro/server with 3 updates #4102 and build(deps): bump the npm-minor-patch group in /plugins/miro with 3 updates #4022 sat with a single check run after the bundle bot pushed. Whatever lands here has to solve the re-trigger, or accept a manual nudge. - Treat the lockfile-only case as non-shipping. A bump that changes only
package-lock.jsonfor a dev dependency arguably does not change what a consumer receives. If the gate exempted that class, several of the six above would not have needed a bump at all. This is a policy call about what the version number is promising, and it is the gate's own semantics, so it needs a deliberate decision rather than a patch. - Document the manual step. Cheapest, fixes nothing, but at least stops each person rediscovering it. Worth doing only if 1 and 2 are both rejected.
Notes
- Do not "fix" this by exempting Dependabot from the gate wholesale. A dependency bump can genuinely change what a consumer receives (build(deps): bump the npm-minor-patch group in /plugins/miro/server with 3 updates #4102 bumped
zod, a bundled runtime dependency, and did regeneratedist/index.min.js), so the version bump is the right outcome for at least some of these. - The entry text matters less than its presence, but the existing convention is worth matching: see the
## [0.4.4]entry onplugins/miro/CHANGELOG.mdfor the shape a dependency bump has been getting, including the arrow form4.1.11→5.0.0rather than an em dash, since several plugin changelogs are inscripts/em-dash-purged-paths.txt.
Activity
kyle-sexton commentedon Sep 23, 2026
This was generated by AI during triage.
Human-gated. Open decision: which of the issue's 3 options (extend the dependabot-miro-bundle.yml auto-commit precedent to all plugins; exempt lockfile-only bumps; or document only) — recommend option 1, generalizing the existing auto-commit workflow
ci: point workflow comments at their trackers instead of restating pi…
kyle-sexton commentedon Sep 29, 2026
Not reopened (option 1 is on main and works for the bump);
needs-humanstays. Decision packet from the 2026-09-29 audit of the Cursor agent run.What happened
This was a human-gated three-option decision. The AI triage comment only recommended option 1, which is a recommendation, not an owner decision. #4617 then implemented option 1 with no recorded owner choice. The issue required option 1 to solve the re-trigger or to accept a manual nudge; #4617 accepted the nudge without stating it, and cited this repo's #4355 history as verification although #4355's commits show a manual bump.
Fixed in PR #5316 (
Refs #4144): the workflow comment now cites GitHub's docs for the token behavior (token-triggered events create no runs except dispatch events; token-created or token-updatedpull_requestruns wait in an approval-required state) and states the consequence: CI on the release-bump commit needs a maintainer approval or re-trigger.Question for the owner
Which option stands?
Recommendation (a recommendation, not a decision)
A now, B if the nudge cost shows up in the queue.
Basis: the issue's own evidence that 7 of 12 drained PRs needed a manual bump commit, which the workflow removes; the nudge is one approval click and needs no credential; GitHub's docs name the App-token route as the way to remove it.
Unblocks
Clearing
needs-humanon #4144, and whether the workflow comment can drop its "until #4144 decides" wording.ci: re-pin gitleaks composite, extend the Windows lane, wire unwired …
fix(scripts): note a rebuilt bundle the Dependabot release has not co…
docs(agents): hold a PR with the do-not-merge label, not body prose (#…
fix(scripts): harden audit-flagged gates and the eval-coverage scanner (
fix(ci): sign the Dependabot release bump commit (#5705)