Skip to content

dependabot: close three config gaps this sweep exposed - #1046

Merged
nikhilunni merged 4 commits into
mainfrom
deps/dependabot-config-gaps
Aug 6, 2026
Merged

nikhilunni merged 4 commits into
mainfrom
deps/dependabot-config-gaps

Conversation

@engrams-agent

@engrams-agent engrams-agent Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Three separate config gaps, each of which let a Dependabot bump arrive in a
shape that could not land. Found while working the queue today; fixing the
config rather than re-fixing the symptom every sweep.

1. Composite actions were never scanned

package-ecosystem: github-actions with directory: "/" scans only
.github/workflows/*. Composite actions under .github/actions/** are a
separate directory as far as Dependabot is concerned
(dependabot-core #4178,
#6704,
#7495).

So while #1026 moves the workflows to setup-oras@v2 and actions/cache@v6,
.github/actions/fc-setup/action.yml would have stayed on @v1 and @v4
permanently. That file is used by all four Firecracker lanes
(ci.yml:830, :898, :940, :1067), and it shares the oras pull path
with bake-images.yml — so the skew would leave the FC lanes pulling the
forked Firecracker with oras CLI 1.3.0 while the bake pushed it with 1.3.1.
Functionally harmless today; a silent split-brain in exactly one shared code
path is not a thing to leave lying around.

Switched to directories: with / and /.github/actions/*, and bumped the
two stale pins in the same change.

The oras CLI also gets an explicit version: 1.3.0 pin. setup-oras v2
changed its default CLI from 1.3.0 to 1.3.1, and every call site in this repo
is a bare uses: with no with: block — so the action bump silently swaps the
oras binary under every push/tag/pull/login, including the GHCR
eventual-consistency retry loops added after the 2026-08-01 red-main incident.
Pinning keeps the tool moving on purpose. If you would rather track the
action's default, drop the with: block — but then it should be a deliberate
choice, not a side effect.

Note .github/actions/ is in CI_SELF_PATHS, so this PR forces all lanes,
which means setup-oras@v2 actually gets exercised here. It gets zero
coverage on #1026 (the image lanes are skipped there and bake-images.yml
does not run from a PR at all).

2. sha2 and hmac are version-locked and were arriving separately

This is the one with teeth. Both crates sit on a shared digest /
crypto-common generation:

digest crypto-common
sha2 0.10.9 / hmac 0.12.1 0.10.7 0.1.7
sha2 0.11.0 / hmac 0.13.0 0.11.3 0.2.2

Hmac::<Sha256> requires its Sha256 to implement the same digest crate's
traits, so a mixed pair does not compile. Verified both directions locally
against crates/engram-coordinator/src/oauth_redirect.rs:314:

sha2 0.11 + hmac 0.12:
  error[E0599]: the associated function `new_from_slice` exists for struct
  `CoreWrapper<HmacCore<Sha256>>`, but its trait bounds were not satisfied
      note: `CoreWrapper<HmacCore<Sha256>>: hmac::digest::Update`
            which is required by `CoreWrapper<HmacCore<Sha256>>: hmac::Mac`

and with the pair moved together, that error is replaced by a single
mechanical one (use hmac::KeyInit; — v0.13 no longer surfaces
new_from_slice through Mac), after which the crate compiles.

So neither #10 (sha2 0.11) nor #1031 (hmac 0.13) can ever go green alone.
The pair is the smallest buildable review unit — precisely the situation the
existing grpc group already documents for tonic/prost:

Individual major PRs for these crates can NEVER go green — so "one crate at
a time" is not a reviewable unit here, it is an unbuildable one.

Same exception, same reasoning, new family. They are also added to
cargo-minor-patch's exclude-patterns, because that group is declared first
and Dependabot uses first-match ordering — without the exclude, a lone sha2
patch would land there and split the pair again.

3. Node odd majors were being proposed

#130 was offered node:25-alpine. Node 25:

  • is a Current-only line — only even majors become LTS;
  • was already EOL (2026-06-01) on the day the PR opened;
  • is the release that stopped distributing corepack
    (nodejs/node#57617), which is
    what web.Dockerfile used to install pnpm.

So it was unbuildable and the wrong line to adopt. Ignoring odd majors; the
even ones (26, 28, …) still arrive normally. #1045 moves CI to 24, the newest
active LTS.

Verification

Config-only plus two action pins — no runtime surface to drive. Both files
re-parsed with a real YAML parser after editing:

dependabot.yml parses OK, updates: 4
 - github-actions ["/","/.github/actions/*"] groups: actions
 - cargo "/" groups: cargo-minor-patch,grpc,rustcrypto-digest
 - npm "/web" groups: web-minor-patch
 - docker "/docker" groups: docker-base ignore: 1
fc-setup action.yml parses OK, steps: 15

What a reviewer should look at closely

  • The versions: list for Node is enumerated, not a rule. Dependabot has
    no "LTS only" predicate, so odd majors are listed literally through 33.x.
    Someone will need to extend it eventually. Alternatives were an
    update-types: [version-update:semver-major] ignore (too broad — blocks the
    even LTS majors too) or nothing (which is how we got a proposal for an EOL
    runtime).
  • Grouping sha2+hmac makes their next PR a major group, which the
    auto-merge gate correctly leaves for a human. That is intended.
  • I did not touch the two now-stale comments in bake-images.yml:170 and
    ci.yml:1721 that name actions/cache@v4 / upload-artifact@v4, to avoid
    conflicting with chore(deps): bump the actions group across 1 directory with 12 updates #1026 which is in the merge queue. Follow-up once it lands.

Each of these let a bump arrive in a shape that could not land.

1. Composite actions were never scanned. `directory: "/"` on the
   github-actions ecosystem covers only `.github/workflows/*`, so
   `.github/actions/fc-setup/action.yml` kept setup-oras@v1 and
   actions/cache@v4 while #1026 moved the workflows to v2/v6. That is a
   silent split-brain in the `oras pull` path fc-setup shares with
   bake-images.yml. Switch to `directories:` and add
   `/.github/actions/*`, then bump the two stale pins.

   The oras CLI gets an explicit `version: 1.3.0` pin at the same time:
   setup-oras v2 changed its default from 1.3.0 to 1.3.1, and every
   call site in the repo is a bare `uses:`. A tool that feeds the GHCR
   retry loops should move deliberately, not as a side effect.

2. sha2 and hmac are version-locked and were arriving separately.
   They share a `digest`/`crypto-common` generation: sha2 0.11 and hmac
   0.13 both need digest 0.11; sha2 0.10 and hmac 0.12 both need digest
   0.10. `Hmac<Sha256>` needs its Sha256 to implement the same digest
   crate's traits, so a mixed pair does not compile:

     sha2 0.11 + hmac 0.12 -> error[E0599] `new_from_slice` exists for
     `CoreWrapper<HmacCore<Sha256>>` but its trait bounds were not
     satisfied, at crates/engram-coordinator/src/oauth_redirect.rs:314

   That makes #10 (sha2 0.11) and #1031 (hmac 0.13) individually
   unbuildable — the same situation the `grpc` group already documents
   for tonic/prost. Group them, and add them to cargo-minor-patch's
   `exclude-patterns` so a lone sha2 patch cannot split the pair via
   first-match ordering.

3. Node odd majors were being proposed. #130 got `node:25-alpine`: a
   Current-only line already EOL (2026-06-01) when the PR opened, and
   the release that stopped shipping corepack (nodejs/node#57617) —
   which is what web.Dockerfile used to install pnpm, so it could not
   build. Only even Node majors become LTS; ignore the odd ones.
@engrams-agent

engrams-agent Bot commented Aug 6, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ engrams review — complete. 0 findings posted. · View details

@github-actions

github-actions Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

The latest Buf updates on your PR. Results from workflow CI / buf (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed⏩ skipped⏩ skipped✅ passedAug 6, 2026, 1:12 PM

@engrams-agent engrams-agent Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Engrams review

Verdict: No findings.
Severity: Critical 0 · High 0 · Medium 0 · Low 0

View the full engrams review

`workspace-hack/Cargo.toml` is output of `cargo hakari generate`, but it is
also a workspace member, so the cargo ecosystem scans it and Dependabot
opens PRs for crates declared only there.

#1032 is the live example: it moves axum-core 0.4 -> 0.5, and
`grep -rn axum-core --include=Cargo.toml` finds exactly one declaration —
the hakari-generated line. That bump can never land. The next
`just hakari` overwrites it, and axum-core's version is not independently
choosable: axum 0.7 requires axum-core 0.4, axum 0.8 requires 0.5. It
moves when `axum` moves, as part of that upgrade.

Ignore axum-core so it stops arriving as its own PR.
@engrams-agent

engrams-agent Bot commented Aug 6, 2026 •

Copy link
Copy Markdown
Contributor Author

⚠️ engrams review — the run failed. It will retry on the next push or @mention.

@engrams-agent

engrams-agent Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

Pushed a fourth gap of the same kind, found while triaging the rest of the queue.

#1032 (axum-core 0.4 → 0.5) bumps a generated file. workspace-hack/Cargo.toml is cargo hakari generate output, but it is also a workspace member, so the cargo ecosystem scans it and Dependabot proposes bumps for crates declared only there:

$ grep -rn 'axum-core' --include=Cargo.toml .
./workspace-hack/Cargo.toml:19:axum-core = { version = "0.4", default-features = false, features = ["tracing"] }

That is the only declaration in the repo. The bump cannot land for two independent reasons: the next just hakari overwrites it, and axum-core's version is not independently choosable — axum 0.7 needs axum-core 0.4, axum 0.8 needs 0.5. It moves when axum moves.

Added an ignore for axum-core. I scoped it to that one crate rather than trying to exclude the whole workspace-hack member, because Dependabot has no way to exclude a single workspace member from the cargo ecosystem, and a broad ignore would hide real bumps. If more hakari-only crates start showing up, the entry is the place to extend.

@engrams-agent

engrams-agent Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

Pushed a fourth gap of the same kind, found while triaging the rest of the queue.

#1032 (axum-core 0.4 → 0.5) bumps a generated file. workspace-hack/Cargo.toml is cargo hakari generate output, but it is also a workspace member, so the cargo ecosystem scans it and Dependabot proposes bumps for crates declared only there:

$ grep -rn 'axum-core' --include=Cargo.toml .
./workspace-hack/Cargo.toml:19:axum-core = { version = "0.4", default-features = false, features = ["tracing"] }

That is the only declaration in the repo. The bump cannot land for two independent reasons: the next just hakari overwrites it, and axum-core's version is not independently choosable — axum 0.7 needs axum-core 0.4, axum 0.8 needs 0.5. It moves when axum moves.

Added an ignore for axum-core. I scoped it to that one crate rather than excluding the whole workspace-hack member, because Dependabot has no way to exclude a single workspace member from the cargo ecosystem, and a broad ignore would hide real bumps. If more hakari-only crates show up, that entry is the place to extend it.

Third family with the same structural lock as tonic/prost and sha2/hmac.
The OTel Rust crates ship as one release set: the SDK and exporter crates
depend on an exact `opentelemetry` core minor, and tracing-opentelemetry
runs one minor ahead of the core it targets (0.29 -> core 0.28, 0.33 ->
core 0.32).

So a single-crate bump puts two cores in the graph at once. #446 bumps
opentelemetry_sdk 0.28 -> 0.32.1 on its own; that release requires
`opentelemetry 0.32.0`, while the workspace still declares
opentelemetry and opentelemetry-otlp at 0.28. Its lockfile ends up
carrying opentelemetry 0.28.0 AND 0.32.0, so the SDK being configured
speaks a different API than the exporter consuming it — which is why that
PR fails clippy, check, tests and the musl cross lane together rather
than failing one of them.

#1033 (tracing-opentelemetry 0.29 -> 0.33) is the mirror image.

Group them at every update level, and add the patterns to
cargo-minor-patch's exclude list so first-match ordering cannot peel one
crate off the set.
@engrams-agent

engrams-agent Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

👀 engrams review — acknowledged, queued.

Fourth version-locked family in this repo's cargo graph. Every kube API
type is generic over k8s-openapi's generated resource types, so kube pins
an exact k8s-openapi minor.

#1030 bumps kube 0.99 -> 4.2 on its own. kube 4.2.0 requires
`k8s-openapi 0.28.0`, while the workspace declares k8s-openapi 0.24, so
the PR's lockfile carries 0.24.0 AND 0.28.0 — the operator's Pod/Node
types no longer unify with the client that fetches them. Grouping makes
the pair one PR, which is the only shape that can build.
@engrams-agent

engrams-agent Bot commented Aug 6, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ engrams review — complete. 0 findings posted. · View details

@engrams-agent engrams-agent Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Engrams review

Verdict: No findings.
Severity: Critical 0 · High 0 · Medium 0 · Low 0

View the full engrams review

@nikhilunni
nikhilunni added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 277f1d9 Aug 6, 2026
29 checks passed
@nikhilunni
nikhilunni deleted the deps/dependabot-config-gaps branch August 6, 2026 22:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant