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
Because update-types is unset, the group takes majors, minors and patches together. So one breaking major poisons every other bump in that ecosystem, and open-pull-requests-limit: 1 means Dependabot cannot open a second PR for the safe remainder while the poisoned one is open. The ecosystem is then stuck until a human resolves the major.
That is not hypothetical — it is the current state of two ecosystems:
chore(deps): npm: bump the all-npm group across 4 directories with 47 updates #860 (all-npm, 47 updates, open since 2026-09-05) fails build (agentcore) on two majors: typescript^6.0.3 → ^7.0.2, which @typescript-eslint 8 rejects outright (typescript-eslint does not support TS 7.0), and cdk-nag^2.38.2 → ^3.0.2, which no longer exports NagSuppressions (error TS2305 across nearly every file in cdk/src/constructs/). The other 45 updates are routine and cannot be separated out.
Adopting TypeScript 7, cdk-nag 3 and mcp 2 each needs its own migration — AGENTS.md still documents the stack as TypeScript 6.x — so these majors will sit for a while, and every minor and patch in those two ecosystems is blocked behind them for as long as they do.
Second defect: a documented cross-ecosystem lockstep has no guard
agent/pyproject.toml:19 records an invariant:
"claude-agent-sdk==0.2.110", # ... (bundles claude CLI 2.1.191;
# kept in lockstep with the npm CLI
# pin in the Dockerfile, #215)
and agent/Dockerfile:90 is the other half:
npm install -g @anthropic-ai/claude-code@2.1.191
#859 bumps the SDK to 0.2.148 and touches only agent/pyproject.toml and agent/uv.lock. The Dockerfile pin stays at 2.1.191, so the bundled CLI and the installed CLI diverge, and the inline comment asserting 2.1.191 becomes false in the same commit. Dependabot cannot see this: the two halves live in different ecosystems (uv and docker/npm), and no CI check compares them.
The config already handles exactly this shape for the Cedar engines — reciprocal ignore entries for cedarpy and @cedar-policy/cedar-wasm at lines 48 and 71, each with a comment pointing at the decision. claude-agent-sdk ⊥ the Dockerfile CLI pin is the same class of coupling and is unprotected.
Third: runtime interpreter bumps arrive as digest refreshes
#827 is titled as a 3-update docker group. Two entries are a jdxcode/mise digest refresh and golang1.26.4 → 1.27.1 in a build-only stage. The third moves the agent's runtime interpreter:
build (agentcore) is green, so this builds — but three other places still say 3.13: agent/mise.toml:4 (python = "3.13", so local dev and the container would run different minors), agent/pyproject.toml:184 (python-version = "3.13", the ty/ruff target, so type-checking would stop describing the runtime), and the CVE-patching comment at agent/Dockerfile:44, which names the python:3.13-slim tag explicitly. A runtime minor bump for a C-extension-heavy dependency set deserves its own PR landing together with those pins.
Expected behavior
A breaking major in one dependency delays only that dependency. Minors and patches keep flowing on the weekly schedule. Dependencies with a documented cross-ecosystem lockstep are not bumped unilaterally.
Proposed solution
(Revised — the original wording here proposed a second <eco>-majors group per ecosystem. That raises the open-PR ceiling from 4 to 8, and there is a subtler problem with it: see below. #872 takes the approach in this revision.)
Exclude majors from the grouped PR — ignoreversion-update:semver-major for * in each ecosystem, leaving the groups untouched. The steady state stays at one grouped PR per ecosystem, the same count as today, but nothing can wedge it.
Note why the obvious alternative is wrong: restricting the group to update-types: ["minor", "patch"] leaves majors ungrouped, and an ungrouped update gets its own PR — so that would produce one PR per major dependency, strictly worse than today. The ignore is what holds the count down.
Raise open-pull-requests-limit to 2 — one grouped PR plus a slot of headroom so a lone ungrouped or security PR cannot starve the group.
Add an ignore for python major/minor on the docker ecosystem, referencing chore(agent): upgrade Python 3.13 → 3.14 #105, so the interpreter bump is always a deliberate change while digest and patch refreshes keep flowing.
Accepted trade-off: a major that fixes an advisory will not arrive as a PR. Detection is unaffected — //:security:deps fails the build on any advisory regardless of Dependabot — but the upgrade is driven by hand, and majors are tracked as issues instead. Today's config does not avoid that work; it hides it behind a PR that cannot merge while still costing a weekly rebase and a full CI run.
Once (1)–(2) land, closing #859 and #860 lets Dependabot regenerate one grouped PR per ecosystem carrying only routine updates, recovering the 45 npm and 6 python bumps currently blocked.
Other information
The cooldown: default-days: 7 and commit-message.prefix settings are working as intended and are unchanged by the above.
Component: tooling (
.github/dependabot.yml)Describe the bug
Every ecosystem in
.github/dependabot.ymlfunnels all updates into a single catch-all group and allows only one open PR:Because
update-typesis unset, the group takes majors, minors and patches together. So one breaking major poisons every other bump in that ecosystem, andopen-pull-requests-limit: 1means Dependabot cannot open a second PR for the safe remainder while the poisoned one is open. The ecosystem is then stuck until a human resolves the major.That is not hypothetical — it is the current state of two ecosystems:
all-npm, 47 updates, open since 2026-09-05) failsbuild (agentcore)on two majors:typescript^6.0.3→^7.0.2, which@typescript-eslint8 rejects outright (typescript-eslint does not support TS 7.0), andcdk-nag^2.38.2→^3.0.2, which no longer exportsNagSuppressions(error TS2305across nearly every file incdk/src/constructs/). The other 45 updates are routine and cannot be separated out.all-python, 10 updates, open since 2026-09-05) fails//agent:typecheckonmcp1.28.1→2.1.1, which movedstreamablehttp_clientout ofmcp.client.streamable_httpandMcpErrorout ofmcp.shared.exceptions. The other 6 updates are routine.Adopting TypeScript 7, cdk-nag 3 and mcp 2 each needs its own migration — AGENTS.md still documents the stack as TypeScript 6.x — so these majors will sit for a while, and every minor and patch in those two ecosystems is blocked behind them for as long as they do.
Second defect: a documented cross-ecosystem lockstep has no guard
agent/pyproject.toml:19records an invariant:and
agent/Dockerfile:90is the other half:#859 bumps the SDK to
0.2.148and touches onlyagent/pyproject.tomlandagent/uv.lock. The Dockerfile pin stays at 2.1.191, so the bundled CLI and the installed CLI diverge, and the inline comment asserting 2.1.191 becomes false in the same commit. Dependabot cannot see this: the two halves live in different ecosystems (uvanddocker/npm), and no CI check compares them.The config already handles exactly this shape for the Cedar engines — reciprocal
ignoreentries forcedarpyand@cedar-policy/cedar-wasmat lines 48 and 71, each with a comment pointing at the decision.claude-agent-sdk⊥ the Dockerfile CLI pin is the same class of coupling and is unprotected.Third: runtime interpreter bumps arrive as digest refreshes
#827 is titled as a 3-update docker group. Two entries are a
jdxcode/misedigest refresh andgolang1.26.4→1.27.1in a build-only stage. The third moves the agent's runtime interpreter:build (agentcore)is green, so this builds — but three other places still say 3.13:agent/mise.toml:4(python = "3.13", so local dev and the container would run different minors),agent/pyproject.toml:184(python-version = "3.13", the ty/ruff target, so type-checking would stop describing the runtime), and the CVE-patching comment atagent/Dockerfile:44, which names thepython:3.13-slimtag explicitly. A runtime minor bump for a C-extension-heavy dependency set deserves its own PR landing together with those pins.Expected behavior
A breaking major in one dependency delays only that dependency. Minors and patches keep flowing on the weekly schedule. Dependencies with a documented cross-ecosystem lockstep are not bumped unilaterally.
Proposed solution
(Revised — the original wording here proposed a second
<eco>-majorsgroup per ecosystem. That raises the open-PR ceiling from 4 to 8, and there is a subtler problem with it: see below. #872 takes the approach in this revision.)Exclude majors from the grouped PR —
ignoreversion-update:semver-majorfor*in each ecosystem, leaving the groups untouched. The steady state stays at one grouped PR per ecosystem, the same count as today, but nothing can wedge it.Note why the obvious alternative is wrong: restricting the group to
update-types: ["minor", "patch"]leaves majors ungrouped, and an ungrouped update gets its own PR — so that would produce one PR per major dependency, strictly worse than today. Theignoreis what holds the count down.Raise
open-pull-requests-limitto 2 — one grouped PR plus a slot of headroom so a lone ungrouped or security PR cannot starve the group.Add an
ignoreforclaude-agent-sdkmirroring thecedarpytreatment, with a comment naming the Dockerfile pin and feat: Bedrock cost attribution — session tags, request metadata, and operator FinOps guidance #215.Add an
ignoreforpythonmajor/minor on the docker ecosystem, referencing chore(agent): upgrade Python 3.13 → 3.14 #105, so the interpreter bump is always a deliberate change while digest and patch refreshes keep flowing.Accepted trade-off: a major that fixes an advisory will not arrive as a PR. Detection is unaffected —
//:security:depsfails the build on any advisory regardless of Dependabot — but the upgrade is driven by hand, and majors are tracked as issues instead. Today's config does not avoid that work; it hides it behind a PR that cannot merge while still costing a weekly rebase and a full CI run.Once (1)–(2) land, closing #859 and #860 lets Dependabot regenerate one grouped PR per ecosystem carrying only routine updates, recovering the 45 npm and 6 python bumps currently blocked.
Other information
The
cooldown: default-days: 7andcommit-message.prefixsettings are working as intended and are unchanged by the above.