fix(deps): chacha20 0.10.1 is yanked, so deny refuses every branch (CLOUD-1074) - #716
Conversation
CLOUD-1074 `bisync` 0.3.0 and 0.3.1 are both yanked, so `cargo update` cannot resolve `gix-protocol`'s `^0.3.0` — `semver` exits 101 on every branch and CI is red repo-wide
What was measured
Every published Reproduced on the committed tree with Why it is repo-wide rather than one branch's
It first surfaced on Refinement — Ready
What is deliberately not proposedSuppressing or skipping CLOUD-1077 `chacha20` 0.10.1 is yanked, so `deny` refuses every branch — and `main` is red on a gate CI never re-asks
Why
**It blocks every branch. ** How CI grades a SHA once, on its PR.
Not a duplicate of CLOUD-1074, and the board is what settled it CLOUD-1074 is the Refinement — Ready Refinement gate: Definition of Ready & Done. This body carries only specializations.
Done
The recurrence is a separate row and is deliberately not this one This is the third instance of one class: That change is not in this row's scope because it changes what a required check MEANS, and the DoR wants a deny gate's firing rate replayed over |
|
Important Review skippedReview was skipped due to path filters ⛔ Files ignored due to path filters (1)
CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
`mise run deny` fails `advisories` on the committed lockfile:
error[yanked]: detected yanked crate (try `cargo update -p chacha20`)
chacha20 0.10.1 registry+https://github.com/rust-lang/crates.io-index
`chacha20` 0.10.0 and 0.10.1 are both yanked; **0.10.2 is published and is not**.
It arrives transitively via `rand`, and 0.10.2 satisfies the existing
requirement, so this is one relocked package, `Cargo.lock` only, no manifest
change and no API surface. After it: `advisories ok, bans ok, licenses ok,
sources ok`.
WHY THIS BLOCKS EVERYONE. `ci.yml` carries no `paths:` filter and `[tasks.ci]` is
`depends = ["hooks", "deny"]`, so `deny` runs in the `ci` job on every non-draft
PR, and `ci` is in `CI_REQUIRED_CHECKS`. Reproduced on a detached worktree at
untouched `origin/main`: identical failure.
HOW `main` WENT RED WITH CI GREEN, because that is the part worth writing down
rather than the bump. CI grades a SHA once, on its PR; `main` then advances only
by fast-forward to that exact SHA, and there is deliberately no push-to-`main`
trigger — `ci.yml` says re-running would be "pure waste" and AGENTS.md forbids it.
That is airtight for a gate whose verdict is a property of the COMMIT. It is false
for one whose verdict is a property of the WORLD: `cargo deny check advisories`
reads live yank data, `chacha20 0.10.1` was not yanked when these SHAs were
graded, and nothing re-asks. The only `ci.yml` runs on `main` are four from
2026-08-05, so "main is green" is a statement about the past.
Third instance of that class: `lock-check` (mise releases, already split into
`lock-complete` plus `lock-currency.yml`), `semver` (CLOUD-1074, `bisync` yanked,
fixed by the `gix` floor bump), and this. `.claude/rules/toolchain.md` carries the
rule from the first one's post-mortem — "a property of the commit belongs in the
gate, a property of the world belongs on a clock" — and `deny`'s advisory half is
on the wrong side of it. Splitting it is filed rather than done here: it changes
what a required check means, and the DoR wants a deny gate's firing rate replayed
before its severity is chosen.
SERVES CLOUD-1077 AND NOT CLOUD-1074, corrected after `claim-not-raced` refused
the first spelling. CLOUD-1074's §7 Done clause reads "and `mise run deny` stays
green over the changed dependency closure", so serving it looked arguable — but
`claim-check` answered `not-todo (in In Progress)`, assigned, with PR #714 already
attached, and a row that is claimed and carries a PR cannot be a second PR's
closing key. That is exactly what `claim-not-raced` then reported on this branch.
Different crate, different gate, different work.
Refs: CLOUD-1077, CLOUD-1074
4f96da6 to
441fac8
Compare
|
❌ The last analysis has failed. |
|
/fast-forward |
Closes CLOUD-1077
What is broken
mise run denyfailsadvisorieson the committed lockfile, on every branch:chacha200.10.0 and 0.10.1 are both yanked; 0.10.2 is published and is not. It arrives transitively viarand, and 0.10.2 satisfies the existing requirement — so this is one relocked package,Cargo.lockonly, no manifest change and no API surface.After:
advisories ok, bans ok, licenses ok, sources ok.Why it blocks everyone, not one branch
ci.ymlcarries nopaths:filter and[tasks.ci]isdepends = ["hooks", "deny"], sodenyruns in thecijob on every non-draft PR — andciis inCI_REQUIRED_CHECKS. Reproduced on a detached worktree at untouchedorigin/main: identical failure.mainitself is red on this gate right now.How
mainwent red while CI is greenThis is the part worth keeping, and it is not a criticism of CI.
CI grades a SHA once, on its PR.
mainthen advances only by fast-forward to that exact SHA, and there is deliberately no push-to-maintrigger —ci.ymlsays re-running would be "pure waste" and AGENTS.md forbids it. That reasoning is airtight for a gate whose verdict is a property of the commit.It is false for one whose verdict is a property of the world.
cargo deny check advisoriesreads live yank data.chacha20 0.10.1was not yanked when these SHAs were graded; it is now. Nothing re-asks — the onlyci.ymlruns onmainare four, all from 2026-08-05, and of the 15 scheduled workflows in this repository, none runscargo-deny.So "main is green" is a statement about the past. CI's scheduling is correct; the gate's placement is what is wrong.
Third instance of one class
lock-checklock-complete(commit bytes) pluslock-currency.yml(a clock)semverbisync0.3.x yankedgix 0.87floor bump, now onmaindenychacha200.10.1 yanked.claude/rules/toolchain.mdalready carries the rule from the first one's post-mortem: "a property of the commit belongs in the gate, a property of the world belongs on a clock."deny's advisory half is on the wrong side of that line.Splitting it is deliberately not in this PR. It changes what a required check means, and the Definition of Ready wants a deny gate's firing rate replayed over
git rev-list origin/mainbefore its severity is chosen. Deciding that inside a lockfile bump would be shipping a retuned required check with its severity picked instead of measured. It neighbours CLOUD-1070, whose exit-3 abstention shape is the same question one layer over.Why this does NOT close CLOUD-1074 — the gates caught me
I first wrote this PR to close CLOUD-1074, reasoning from its §7 Done clause:
The
gix 0.87bump satisfied the first clause and is onmain, so the second looked like this PR's to satisfy. Two gates refused that, and both were right.mise run claim-checkansweredCLOUD-1074 not-todo (in In Progress)— assigned, with PR #714 already attached. A row that is claimed and carries a PR cannot be a second PR's closing key; that isclaim-not-raced's whole concern, and closing it here would have stranded #714's claim on it.I then filed CLOUD-1077 for this work but left the body closing CLOUD-1074, and
batten-checkreported exactly that on the branch:Both had one root cause — the wrong closing key — and both clear with this correction, since
filed-over-own-diffexempts a row the PR closes.CLOUD-1074 stays open and is cited rather than served. Different crate, different gate, different work.
Verification
mise exec -- cargo deny check advisories— exit 1 before, exit 0 aftermise run deny—advisories ok, bans ok, licenses ok, sources okchacha20 v0.10.1 -> v0.10.2;git diff --statisCargo.lock | 4 ++--