Skip to content

chore(deps): bump smoltcp to 0.14.0 across all three dependency graphs - #926

Merged
forkwright merged 1 commit into
mainfrom
chore/smoltcp-0.14-consolidated
Aug 24, 2026
Merged

chore(deps): bump smoltcp to 0.14.0 across all three dependency graphs#926
forkwright merged 1 commit into
mainfrom
chore/smoltcp-0.14-consolidated

Conversation

@forkwright

@forkwright forkwright commented Aug 24, 2026

Copy link
Copy Markdown
Owner

Consolidates #925, #924, and #923, which cannot land individually.

Why three PRs could not work

This repository carries three independent lockfilesCargo.lock, crates/thumos/Cargo.lock, fuzz/Cargo.lock — and declares smoltcp in two manifests. Dependabot saw one shared version-range change in the root Cargo.toml and opened three PRs, each regenerating exactly one lockfile:

PR regenerates leaves stale
#925 root Cargo.lock crates/thumos pin + lock, fuzz/Cargo.lock
#924 crates/thumos/Cargo.lock root Cargo.lock, fuzz/Cargo.lock
#923 fuzz/Cargo.lock root Cargo.lock, crates/thumos pin

Each therefore failed the repo's own drift gates, with two distinct signatures:

PIN DRIFT ... crates/thumos/Cargo.toml: smoltcp = "0.13" but workspace declares "0.14"
error: cannot update the lock file ... because --locked was passed

No single PR could pass, and merging any one would have left the others' graphs disagreeing with the manifest they resolve from. This is a structural property of the repo's multi-graph layout, not a dependabot defect — dependabot has no way to express one change spanning three resolution roots.

What this does

  • Both manifests → 0.14. crates/aither needs no change: it inherits via workspace = true.
  • All three lockfiles regenerated.
  • Drops the RUSTSEC-2026-0173 suppression from deny.toml, .cargo/audit.toml, and osv-scanner.toml.

That last one deserves a sentence. The advisory covers proc-macro-error2, which reached these graphs only through smoltcp's optional defmt feature. 0.14 drops that edge — defmt v0.3.100 disappears from crates/thumos/Cargo.lock on the update, and proc-macro-error2 is now absent from all three lockfiles. The suppression's stated reason had already gone stale, describing "smoltcp 0.12" while the manifests were on 0.13. A suppression asserting the presence of a crate that is in no graph is a false claim the next reader has to disprove before they can act on it, so it goes with the bump that made it untrue rather than waiting to be noticed.

Verification, run before pushing

  • cargo metadata --locked resolves in all three graphs — the exact failure that killed all three original PRs.
  • check-pin-parity.sh and check-lockfile-manifest.sh both pass — the two gates they tripped.
  • check-external-lockfile-versions.sh passes against each of the three lockfiles individually.
  • All five edited TOML files parse.

Full CI is the real verdict; the above is what could be established locally.

After this merges

Supersedes #925, #924 and #923. They need closing by hand once this lands: a closing keyword
would not close them in any case, since those keywords act on issues rather than pull requests.

This repository carries three independent lockfiles -- root, crates/thumos,
and fuzz -- and declares smoltcp in two manifests, so a version bump is not
one edit. Dependabot opened it as three PRs (#923, #924, #925), each
regenerating exactly one lockfile and leaving the other two stale against a
shared root Cargo.toml change. Every one of them failed the repo's own drift
gates, and none could have passed alone: merging any single PR would have left
the others' graphs disagreeing with the manifest they resolve from.

Consolidated here. Both manifests move to 0.14, all three lockfiles are
regenerated, and crates/aither needs no change because it inherits through
workspace = true.

Also drops the RUSTSEC-2026-0173 suppression from deny.toml, .cargo/audit.toml
and osv-scanner.toml. That advisory covers proc-macro-error2, which reached
these graphs only through smoltcp's optional defmt feature; 0.14 drops that
edge and the crate is now absent from all three lockfiles. Its stated reason
had already gone stale -- it described "smoltcp 0.12" while the manifests were
on 0.13 -- and a suppression asserting the presence of a crate no longer in any
graph is a false claim the next reader has to disprove before they can act.

Verified before pushing: all three graphs resolve under --locked, which is the
failure that killed all three original PRs; check-pin-parity and
check-lockfile-manifest both pass, which are the two gates they tripped; and
check-external-lockfile-versions passes against each lockfile individually.
@forkwright
forkwright merged commit 4a6bbb2 into main Aug 24, 2026
13 checks passed
@forkwright
forkwright deleted the chore/smoltcp-0.14-consolidated branch August 24, 2026 14:52
forkwright added a commit that referenced this pull request Aug 24, 2026
The three `package-ecosystem: cargo` entries in this repo's dependabot
config are why the smoltcp 0.14 bump arrived as three PRs that could not
land.

## The mechanism

thumos carries three independent dependency graphs with their own
lockfiles — `/`, `/crates/thumos` (excluded from the workspace so it
cross-compiles bare-metal to `armv7a-none-eabi`), and `/fuzz` (own empty
`[workspace]`, cargo-fuzz needs nightly).

A version bump declared in the **root manifest** spans all three. But
three separate entries each regenerate only their own lockfile:

| PR | regenerated | left stale |
|---|---|---|
| #925 | root `Cargo.lock` | `crates/thumos` pin + lock,
`fuzz/Cargo.lock` |
| #924 | `crates/thumos/Cargo.lock` | root `Cargo.lock`,
`fuzz/Cargo.lock` |
| #923 | `fuzz/Cargo.lock` | root `Cargo.lock`, `crates/thumos` pin |

Each failed this repo's own drift gates — `PIN DRIFT` from `rustfmt`,
and `error: cannot update the lock file ... because --locked was passed`
from the workspace and kernel jobs. **None could pass alone**, and
merging any one would have left the others' graphs disagreeing with the
manifest they resolve from. They were consolidated by hand into #926.

This will recur on the next bump that touches a shared dependency. It is
a config property, not bad luck.

## The fix, and why I trust it

`directories` (plural) watches the same three graphs from a single
entry, and groups span them.

Verified empirically rather than from documentation — aletheia already
uses this form, and its dependabot PR #6897 is titled *"bump the
patch-updates group across 2 directories"* with `Cargo.lock` **and**
`fuzz/Cargo.lock` in one diff. That is exactly the shape thumos could
not produce.

## What is preserved

The previous comment's coverage rationale, verbatim in substance. It was
right, and it was learned expensively: watching only `/` is how
`fuzz/Cargo.lock` drifted nine releases with two path-dependencies
missing entirely, invisible to `cargo audit` and `cargo deny` the whole
time (#768).

That fix was correct about *which* graphs to watch. This changes how
that coverage is expressed, not how much of it there is — same three
directories, one entry instead of three.

## Scope

Config only. No dependency versions change here.

Co-authored-by: forkwright <cody@forkwright.com>
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