Skip to content

Dependabot cannot propose tauri, and no configuration can change that #497

Description

@PathGao

Cargo.lock pins tauri at 2.10.2. 2.11.5 has been published since
2026-07-01. No Dependabot pull request has ever offered it — not #478 in July,
which was unrestricted enough to cross notify 6→8 and zip 2→4, and not #489
or #491 under the current config.

This is not a backlog item. It is a hole in the reporting, it is permanent, and
the two configuration changes that landed today (#484, #490) do not touch it.
I am not asking for an upgrade — I have no benefit case for 2.11.5 and did
not go looking for one. I am reporting that the mechanism we just built cannot
see the framework this app runs on.

Why

Two independent rules multiply.

Dependabot's cargo resolver runs exactly one command. From
dependabot-core/cargo/.../version_resolver.rb: cargo update -p <dep> -vv
against a manifest whose requirement has been loosened to >= <locked>. One
-p, no --precise.

tauri 2.11.5 raises its floor on four siblings that release in lockstep with
it
, and all four moves are within the same semver line:

2.10.2 requires 2.11.5 requires locked at
tauri-runtime ^2.10.0 ^2.11.3 2.10.0
tauri-runtime-wry ^2.10.0 ^2.11.4 2.10.0
tauri-utils ^2.8.2 ^2.9.3 2.8.2
tauri-macros ^2.5.4 ^2.6.3 2.5.4

Cargo cannot hold two 2.x copies of one crate, so those four have to be replaced
in place — and cargo update may not touch a package it was not named. So it
declines, and says so:

Unchanged tauri v2.10.2 (available: v2.11.5)

Reproduced against master's lockfile, naming different sets:

named result
-p tauri nothing moves
-p tauri -p tauri-runtime nothing moves
-p tauri -p tauri-runtime -p tauri-runtime-wry -p tauri-utils -p tauri-macros tauri → 2.11.5
-p tauri-build (control) 2.6.3, works — its cascade only adds copies on a different line

And the four unblockers are transitive. allowed_updates is unset, so the
default dependency-type: direct applies (job.rb#allowed_update?), and
Dependabot will never propose them on their own either.

One rule means it can only ever name tauri. The other means it can never name
the four crates that would let tauri move. There is no allow: or groups:
entry that resolves this, because the constraint is in how the resolver is
invoked, not in what it is allowed to consider.

How wide the hole is

Narrower than it first looks, and worth stating precisely so this is not read as
a general indictment.

The obvious hypothesis — that every bare-caret requirement like
tauri = { version = "2" } is invisible — is false. serde, regex and
three tauri-plugin-* crates are all declared exactly that way and were all
updated lockfile-only in #489.

The class is lockstep crate families: it bites only where a crate raises its
floor on siblings that version in step with it. Running the resolver emulation
over all 24 direct dependencies, seven are already current and tauri is the
only one that is both behind and unproposable.

That is the uncomfortable part. One dependency out of 24, and it is the one
everything else sits on.

What this does to today's work

#472, #484 and #490 built a mechanism whose whole promise is that drift becomes
visible — a scheduled pull request, a bounded ignore list, a written record of
what is held and why. A dependency that can sit two minors behind and appear in
none of it is a hole in that promise, and nobody would notice it from the
outside: the bot looks like it is working, because for the other 23 it is.

The same shape as the Node 20 deprecation earlier today. That warning was printed
in every release build for months and nobody read it, because nothing ever asked
anyone to decide about it. This is worse in one respect — there is no warning to
miss.

#490 is not the cause. #478 predates it and also omits tauri;
exclude-patterns is npm-only and the ignore entries name only windows and
webview2-com. (Confirmed while checking: tauri 2.11.5 still requires
windows ^0.61 and webview2-com ^0.38, so those two entries stay correct
against the newer core.)

What I think should happen

Not an upgrade — a way to be told. The options I can see, worst to best:

  1. Nothing. Remember to check by hand. This is the option that already failed
    once today.
  2. A comment next to tauri in Cargo.toml saying the bot cannot see this
    line. Cheap, and about as effective as any comment nobody has a reason to open.
  3. A check at release time. build.yml runs when someone is watching and is
    already the place where release-shaped facts surface. A step that compares the
    locked tauri against the index and fails loudly would turn an invisible state
    into a red build at the one moment a human is present.

I would do 3, and I am happy to open it — but it is your call whether a release
should be blockable by an upstream version number, so I would rather ask than
ship it.

If tauri 2.11.5 is ever wanted, it is mechanically clean:
cargo update -p tauri -p tauri-runtime -p tauri-runtime-wry -p tauri-utils -p tauri-macros
resolves in one step (32 packages) and cargo test gives 125/125, identical to
master. That is a compile-and-unit-test result on macOS only — it says nothing
about runtime behaviour, and the Windows-gated code was not built.

Not established

  • Dependabot's own job logs. There is no public API for them; everything above is
    reproduction of its documented resolver plus reading dependabot-core, not the
    bot's record of what it decided.
  • Whether any runtime behaviour differs on 2.11.5.
  • Why chrono appears in chore(deps): bump the cargo group in /src-tauri with 17 updates #478's table. Consistent with moving as a byproduct of
    another bump rather than being proposed on its own, but not proven.

Metadata

Metadata

Assignees

No one assigned

    Labels

    awaiting decisionNeeds a product-direction call from the maintainer before work can start

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions