ci(anvil): update to cargo-anvil 0.7.0 - #728
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #728 +/- ##
=======================================
Coverage 100.0% 100.0%
=======================================
Files 583 583
Lines 62930 62930
=======================================
Hits 62930 62930
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
🟡 Changes recommended
The generated container Dockerfile references rust-toolchain.toml, but no rust-toolchain* file exists in the repository, so container builds will fail.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Updates the repository’s Anvil-managed CI/Just infrastructure to cargo-anvil 0.7.0 to restore functional workspace-wide SemVer checking on newer rustdoc JSON formats, while adopting newer Anvil templates (impact scoping via artifacts, generic group runner, and a new MSRV test group).
Changes:
- Regenerates the Anvil Just recipe tree to use the new impact-cache model (
anvil-impactartifact +_anvil-impact-include) and standardizes PowerShell invocation with-NoProfile. - Restructures GitHub Actions Anvil workflows to run groups via a generic runner action and adds a new PR MSRV test group.
- Bumps pinned tool versions (notably
cargo-semver-checks,cargo-deny,cargo-doc2readme) and regenerates crate READMEs / adds managed lint fences across multiple crates.
File summaries
| File | Description |
|---|---|
| justfiles/anvil/versions.just | Updates tool pins and adds stable-toolchain argument bootstrap helper. |
| justfiles/anvil/tiers.just | Routes scheduled/full tiers through an unscoped wrapper and updates setup notes for cargo-delta. |
| justfiles/anvil/mod.just | Imports new impact + MSRV check/group modules; standardizes pwsh -NoProfile; optional container import. |
| justfiles/anvil/groups/scheduled-test.just | Wraps scheduled group via _anvil-unscoped for full-workspace backstop behavior. |
| justfiles/anvil/groups/scheduled-runtime-analysis.just | Same scheduled unscoped wrapper pattern for runtime analysis group. |
| justfiles/anvil/groups/scheduled-exhaustive.just | Same scheduled unscoped wrapper pattern for exhaustive group. |
| justfiles/anvil/groups/scheduled-advisories.just | Same scheduled unscoped wrapper pattern for advisories group. |
| justfiles/anvil/groups/pr-test.just | Ensures cargo-delta prereqs are installed/validated for impact-scoped groups. |
| justfiles/anvil/groups/pr-slow.just | Reframes PR slow checks as independent groups; adds pr-msrv into umbrella. |
| justfiles/anvil/groups/pr-runtime-analysis.just | Adds cargo-delta prereqs; adopts impact-scoped dependency model. |
| justfiles/anvil/groups/pr-mutants.just | Adds cargo-delta prereqs to mutation testing group setup/validation. |
| justfiles/anvil/groups/pr-msrv.just | New PR group wiring for MSRV tests. |
| justfiles/anvil/groups/pr-fast.just | Updates fast group membership and adds cargo-delta prereqs / validation. |
| justfiles/anvil/checks/udeps.just | Switches scoping to _anvil-impact-include with anvil-impact dependency. |
| justfiles/anvil/checks/spellcheck.just | Makes spellcheck explicitly unscoped; runs via resolved stable toolchain args. |
| justfiles/anvil/checks/pr-title.just | Improves PR title validation diagnostics and formalizes accepted patterns. |
| justfiles/anvil/checks/mutants-full.just | Uses stable-toolchain args; adds Windows ARM64 skip guard. |
| justfiles/anvil/checks/mutants-diff.just | Consumes impact scope; diffs base vs working tree; uses stable-toolchain args. |
| justfiles/anvil/checks/msrv-test.just | New check to run affected-package tests under declared MSRV without benches. |
| justfiles/anvil/checks/miri.just | Converts affected scoping to _anvil-impact-include + anvil-impact dependency. |
| justfiles/anvil/checks/miri-tree-borrows.just | Same impact scoping model for Tree Borrows profile. |
| justfiles/anvil/checks/miri-strict-provenance.just | Same impact scoping model for strict provenance profile. |
| justfiles/anvil/checks/miri-race-coverage.just | Same impact scoping model for race coverage profile. |
| justfiles/anvil/checks/loom.just | Adds impact scoping and stable-toolchain args usage for cargo operations. |
| justfiles/anvil/checks/llvm-cov.just | Uses impact scoping; separates test-only (coverage-opted-out) packages; uses stable-toolchain args for gate. |
| justfiles/anvil/checks/license-headers.just | Adds impact scoping skip logic; uses stable-toolchain args. |
| justfiles/anvil/checks/fmt.just | Adds impact scoping skip logic for modified tier; standardizes pwsh -NoProfile. |
| justfiles/anvil/checks/external-types.just | Adds impact scoping and stable-toolchain args for metadata parsing + improved failure diagnostic. |
| justfiles/anvil/checks/examples.just | Adds impact scoping and stable-toolchain args; standardizes pwsh -NoProfile. |
| justfiles/anvil/checks/ensure-no-default-features.just | Adds impact scoping skip logic and stable-toolchain args. |
| justfiles/anvil/checks/ensure-no-cyclic-deps.just | Adds impact scoping skip logic and stable-toolchain args. |
| justfiles/anvil/checks/doc-test.just | Adds impact scoping and stable-toolchain args for doc tests. |
| justfiles/anvil/checks/doc-build.just | Adds impact scoping and stable-toolchain args for doc build. |
| justfiles/anvil/checks/deny.just | Runs via stable-toolchain args and standardizes pwsh -NoProfile. |
| justfiles/anvil/checks/clippy.just | Adds impact scoping and stable-toolchain args for clippy invocations. |
| justfiles/anvil/checks/cargo-sort.just | Adds impact scoping skip logic and stable-toolchain args. |
| justfiles/anvil/checks/cargo-hack.just | Adds impact scoping and stable-toolchain args. |
| justfiles/anvil/checks/careful.just | Adds impact scoping; refines careful sysroot identity tracking using executable hash. |
| justfiles/anvil/checks/bolero.just | Adds impact scoping and improves target discovery (per-package) with release profile. |
| justfiles/anvil/checks/bench.just | Adds impact scoping and stable-toolchain args for compile-only benches. |
| justfiles/anvil/checks/audit.just | Runs via stable-toolchain args and standardizes pwsh -NoProfile. |
| justfiles/anvil/checks/aprz.just | Runs via stable-toolchain args; clarifies unauthenticated API behavior; standardizes pwsh -NoProfile. |
| deny.toml | Tightens bans wildcard policy (wildcards = "deny") while allowing wildcard path deps. |
| constants.env | Aligns selected tool pins (deny/doc2readme/semver-checks) with anvil catalog. |
| .github/workflows/anvil-scheduled.yml | Adjusts caller permissions to allow issue publishing by the scheduled failure publisher. |
| .github/workflows/anvil-scheduled-impl.yml | Migrates scheduled jobs to anvil-run-group, adds failure-issue publisher, adds env CARGO_INCREMENTAL=0. |
| .github/workflows/anvil-pr.yml | Renames workflow display name and splits PR vs merge-queue invocation with appropriate permissions. |
| .github/skills/code-review/SKILL.md | Updates/expands repository review guidance (generated by cargo-anvil). |
| .github/actions/anvil-setup/just-problem-matcher.json | Adds a Just problem matcher for annotating recipe failures. |
| .github/actions/anvil-run-group/action.yml | New generic action to run a group with optional impact-mode and status reporting. |
| .github/actions/anvil-report-status/action.yml | New action to publish supplemental commit statuses for group failures. |
| .github/actions/anvil-impact/action.yml | Switches from output-threaded include lists to uploading the impact cache artifact. |
| .gitattributes | Forces LF line endings for *.sh. |
| .delta.toml | Moves anvil-managed fences; retains adopter-owned trip-wire patterns behavior. |
| .anvil/container/Dockerfile.dockerignore | Adds Dockerfile-scoped ignore rules for the exec-image build context. |
| .anvil/container/Dockerfile | Adds generated exec-image Dockerfile for running Anvil in a container. |
| crates/uniflight/README.md | Regenerated README dependency-info blob. |
| crates/tick/README.md | Regenerated README dependency-info blob. |
| crates/thread_aware/README.md | Regenerated README dependency-info blob. |
| crates/thread_aware_core/README.md | Regenerated README dependency-info blob. |
| crates/templated_uri/README.md | Regenerated README dependency-info blob. |
| crates/seatbelt/README.md | Regenerated README blob and updates docs.rs URL for tower-service. |
| crates/seatbelt_http/README.md | Regenerated README dependency-info blob. |
| crates/routerama/README.md | Regenerated README dependency-info blob. |
| crates/routerama/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/routerama_macros/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/routerama_build/README.md | Regenerated README dependency-info blob. |
| crates/routerama_build/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/rest_over_grpc/README.md | Regenerated README blob and updates docs.rs URL for tower-service. |
| crates/rest_over_grpc/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/rest_over_grpc_tests/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/rest_over_grpc_examples/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/recoverable/README.md | Regenerated README dependency-info blob. |
| crates/rallocator/README.md | Regenerated README dependency-info blob. |
| crates/rallocator/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/rallocator_wire/README.md | Regenerated README dependency-info blob. |
| crates/rallocator_wire/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/rallocator_telemetry/README.md | Regenerated README dependency-info blob. |
| crates/rallocator_telemetry/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/rallocator_cli/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/plurality/README.md | Regenerated README dependency-info blob. |
| crates/ohno/README.md | Regenerated README dependency-info blob. |
| crates/observed/README.md | Regenerated README dependency-info blob. |
| crates/observed/Cargo.toml | Moves [lints] into anvil-managed fenced region. |
| crates/observed_utils/README.md | Regenerated README dependency-info blob. |
| crates/observed_utils/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/observed_testing/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/observed_macros/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/observed_macros_impl/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/multitude/README.md | Regenerated README dependency-info blob. |
| crates/msvc_spectre_libs_build/README.md | Regenerated README dependency-info blob. |
| crates/layered/README.md | Regenerated README dependency-info blob. |
| crates/internity/README.md | Regenerated README dependency-info blob. |
| crates/internity/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/internity_macros/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/http_path_template/README.md | Regenerated README dependency-info blob. |
| crates/http_extensions/README.md | Regenerated README blob and updates docs.rs URL for http-body. |
| crates/fetch/README.md | Regenerated README dependency-info blob. |
| crates/fetch_winhttp/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/fetch_winhttp_impl/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
| crates/fetch_tls/README.md | Regenerated README dependency-info blob. |
| crates/fetch_hyper/README.md | Regenerated README dependency-info blob. |
| crates/fetch_azure/README.md | Regenerated README dependency-info blob. |
| crates/data_privacy/README.md | Regenerated README dependency-info blob. |
| crates/data_privacy_core/README.md | Regenerated README dependency-info blob. |
| crates/cachet/README.md | Regenerated README dependency-info blob. |
| crates/cachet_tier/README.md | Regenerated README dependency-info blob. |
| crates/cachet_service/README.md | Regenerated README dependency-info blob. |
| crates/cachet_memory/README.md | Regenerated README dependency-info blob. |
| crates/bytesbuf/README.md | Regenerated README dependency-info blob. |
| crates/bytesbuf_io/README.md | Regenerated README dependency-info blob. |
| crates/arty_executor/README.md | Regenerated README dependency-info blob. |
| crates/anyspawn/README.md | Regenerated README dependency-info blob. |
| crates/anyspawn_azure/README.md | Regenerated README dependency-info blob. |
| crates/allocation_hints/README.md | Regenerated README dependency-info blob. |
| crates/allocation_hints/Cargo.toml | Wraps [lints] in anvil-managed fenced region. |
Review details
- Files reviewed: 132/133 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Regenerate the anvil-managed tree with cargo-anvil 0.7.0 (previously 0.3.0). Fixes AB#7802687: the 0.7.0 catalog pins cargo-semver-checks 0.50.0, which reads rustdoc JSON v57/v60/v61, so anvil-semver-check stops aborting on the v60 output of the runner's current stable. Manual follow-ups that regeneration cannot do: * constants.env is not anvil-managed. CARGO_SEMVER_CHECKS_VERSION and CARGO_DOC2README_VERSION are bumped by hand to 0.50.0 and 0.7.3 so the pre-anvil main.yml jobs use the same tools the anvil recipes do. * READMEs are regenerated with cargo-doc2readme 0.7.3, which builds docs.rs URLs from a dependency's package name instead of its lib name. * The six repository-customized recipes (fmt, bolero and the four miri profiles) are rewired from the removed ANVIL_INCLUDE_* environment variables to the new `_anvil-impact-include` helper, so they keep their impact scoping. Their repository-specific logic is retained. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…eview Reduce the repository-specific surface cargo-anvil has to work around. Three of the eight customized artifacts are replaced by the 0.7.0 templates verbatim: * justfiles/anvil/checks/bolero.just — the template discovers targets per package, raises discovery failures as errors instead of swallowing them as "no targets", and builds with --profile release. * deny.toml [anvil-deny-bans] — wildcards = "deny" with allow-wildcard-paths = true, which still permits the path wildcards the workspace uses. `just anvil-deny` reports bans ok. * .github/skills/code-review/SKILL.md — the template is a superset of the repository copy. CARGO_DENY_VERSION in constants.env follows the anvil pin to 0.20.2, so the pre-anvil main.yml job and the anvil recipe read the now-generated deny.toml with the same tool. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`crates/cachet_memory` uses `#[tokio::test]` 30 times but declared its tokio dev-dependency as `features = ["rt", "rt-multi-thread"]`. The workspace tokio is `default-features = false`, so `macros` was only ever supplied by workspace-wide feature unification from the 18 sibling crates that do declare it. Any single-package build of this crate therefore failed with `error[E0433]: cannot find 'test' in 'tokio'`. The defect is pre-existing and unrelated to the cargo-anvil upgrade, but the 0.7.0 `anvil-bolero` recipe surfaces it: it discovers fuzz targets with a per-package `cargo bolero list --package <name>`, which is a single-package build. The previous repository recipe swallowed a discovery failure as "no targets" and exited 0, so this has been latent rather than absent. Declaring `macros` is the correct fix; `Cargo.lock` is unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🔵 Needs a closer look
It introduces at least one concrete CI/container inconsistency (missing rust-toolchain* file referenced by the generated container Dockerfile) plus a supply-chain hardening regression (Codecov action pinned by tag instead of commit SHA).
Review details
Suppressed comments (4)
Previously missed (3) — in code that hasn't changed since the last review.
.github/workflows/anvil-pr-impl.yml:220
- Using
codecov/codecov-action@v7.0.0pins by tag rather than an immutable commit SHA. For supply-chain integrity, prefer pinning to the exact commit (keeping the# v7.0.0comment) so the referenced code can’t change without a diff here.
.github/workflows/anvil-scheduled-impl.yml:77 - Using
codecov/codecov-action@v7.0.0pins by tag rather than an immutable commit SHA. For supply-chain integrity, prefer pinning to the exact commit (keeping the# v7.0.0comment) so the referenced code can’t change without a diff here.
justfiles/anvil/checks/udeps.just:33 _anvil-impact-includecan exit non-zero (e.g. exit 2 when ANVIL_IMPACT is misconfigured in impact.just), but this recipe ignores$LASTEXITCODEand will silently fall back to--workspace. Capture and propagate the helper’s exit code so configuration errors fail loud instead of widening scope unexpectedly.
.anvil/container/Dockerfile:97
- This Dockerfile copies
rust-toolchain.toml, but there are norust-toolchain*files in the repository (glob found none). Since the anvil recipe tree now uses_anvil_stable_toolchain_argsas a fallback when no toolchain file exists, the container build needs some other MSRV/bootstrap input (typicallyCargo.toml) and the corresponding.dockerignoreallowlist update.
WORKDIR /opt/anvil
COPY justfiles ./justfiles
COPY rust-toolchain.toml ./
RUN printf "import 'justfiles/anvil/mod.just'\n" > Justfile \
- Files reviewed: 133/134 changed files
- Comments generated: 0 new
- Review effort level: Lite
The rebase onto main brought in doc-comment changes to `crates/observed` and `crates/rest_over_grpc`, which conflicted with this branch in the generated `__cargo_doc2readme_dependencies_info` blob of each README. Generated files are not hand-merged. The conflicts were resolved by regenerating both READMEs with `just readme`, so the blob carries the 0.7.3 format written by this branch and the content hash of main's updated documentation. `just anvil-readme-check` now passes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
0a43d9a to
ebb967e
Compare
There was a problem hiding this comment.
🟡 Changes recommended
The generated container Dockerfile/build-context references rust-toolchain.toml even though the repo has no rust-toolchain* file, so the container artifacts need a small correction (and anvil-aprz’s removal from PR-tier checks should be explicitly confirmed/justified).
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (1)
.anvil/container/Dockerfile:97
- The container Dockerfile copies
rust-toolchain.toml, but this repository has norust-toolchain*file, so the image cannot be built as-written. Also, the Anvil stable-toolchain bootstrap inversions.justfalls back to parsing the repo-rootCargo.tomlwhen no toolchain file exists, so the container build context should includeCargo.tomlinstead.
WORKDIR /opt/anvil
COPY justfiles ./justfiles
COPY rust-toolchain.toml ./
RUN printf "import 'justfiles/anvil/mod.just'\n" > Justfile \
- Files reviewed: 133/134 changed files
- Comments generated: 2
- Review effort level: Lite
`constants.env` and `justfiles/anvil/versions.just` pin the same tools for two different consumers: the pre-anvil `main.yml` workflow reads the former, the anvil recipes read the latter. Four pins had drifted apart, so the two paths installed different versions of the same tool: CARGO_LLVM_COV_VERSION 0.8.7 -> 0.9.0 CARGO_MUTANTS_VERSION 27.0.0 -> 27.1.0 CARGO_NEXTEST_VERSION 0.9.137 -> 0.9.143 CARGO_SPELLCHECK_VERSION 0.15.1 -> 0.15.7 Every tool pinned in both files now carries the same version. Requested in review by st-dev-gh. `constants.env` is not anvil-managed, so this is a repository edit rather than a generated-file change. `cargo anvil --dry-run` still reports zero pending writes, and `just --list` still parses -- the root justfile loads this file via `set dotenv-path`, so a malformed edit would break every recipe. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
On trip_wire_patterns (line 23): could we adopt cargo-anvil 0.7.0’s generated list instead of retaining this repository copy? The upstream list is a superset: it additionally covers .pipelines/**, Justfile, and justfiles/**, and uses recursive ** patterns for .ado, .cargo, .github, and scripts. Keeping the template-owned list would provide the broader coverage and allow future cargo-anvil updates to maintain it automatically.
There was a problem hiding this comment.
You are right, and I was wrong to keep the repository list — thanks for pushing on it.
I checked the 0.7.0 template (templates/regions/delta.toml) against what is here. The generated list is a strict superset: it keeps all 18 repository entries and adds .pipelines/**, Justfile and justfiles/**, and it uses recursive ** where the repository used single-level * for .ado, .cargo, .github and scripts. That last part is the one that actually bites: the repository's .github/* does not match .github/workflows/anvil-pr.yml, while .github/** does. So the repository list was scoping less conservatively than the template, on paths this very PR touches.
The earlier "keep it" call was made against the pre-0.7.0 region shape and never revisited after the upgrade. Adopted in db4814be: the repository-level trip_wire_patterns key is gone, cargo anvil populates the managed anvil-delta region, cargo anvil --dry-run is back to zero pending writes, and cargo delta snapshot parses the new config. Rationale recorded in the PR description.
There was a problem hiding this comment.
🔵 Needs a closer look
There are at least two concrete correctness/security issues (missing handling of non-zero _anvil-impact-include exit codes in a rewired check, and a regression from SHA-pinned to tag-pinned GitHub Action usage) that should be addressed before merging.
Review details
Suppressed comments (2)
Previously missed (2) — in code that hasn't changed since the last review.
.github/workflows/anvil-scheduled-impl.yml:76
- This switches Codecov to a tag reference (
codecov/codecov-action@v7.0.0). Tags are mutable and weaken supply-chain integrity compared to pinning by commit SHA (which the file previously did for this action).
justfiles/anvil/checks/udeps.just:33 _anvil-impact-includecan exit non-zero (e.g. exit 2 for an unrecognized ANVIL_IMPACT value). This recipe assigns its stdout to$includebut never checks$LASTEXITCODE, so a misconfigured scope mode would silently fall back to--workspaceinstead of failing fast.
- Files reviewed: 133/134 changed files
- Comments generated: 0 new
- Review effort level: Lite
The repository-level `trip_wire_patterns` key is removed so `cargo anvil` populates the managed `anvil-delta` region instead. The 0.7.0 template list is a strict superset of the repository list: it keeps all 18 repository entries and adds `.pipelines/**`, `Justfile` and `justfiles/**`, and it uses recursive `**` where the repository used single-level `*` for `.ado`, `.cargo`, `.github` and `scripts`. That last difference matters here -- the repository's `.github/*` does not match `.github/workflows/anvil-pr.yml`, while `.github/**` does, so the generated list scopes strictly more conservatively rather than less. `cargo anvil --dry-run` reports zero pending writes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🔵 Needs a closer look
It introduces a supply-chain regression by switching Codecov from a commit-SHA pin to a mutable tag pin in .github/workflows/anvil-scheduled-impl.yml.
Review details
Suppressed comments (1)
Previously missed (1) — in code that hasn't changed since the last review.
.github/workflows/anvil-scheduled-impl.yml:76
- Pinning
codecov/codecov-actionby tag (@v7.0.0) is not immutable: Git tags can be moved, which weakens the supply-chain integrity of this workflow compared to the prior commit-SHA pin. Prefer the commit SHA pin (you can keep the human-readable# v7.0.0comment) to make the workflow content-addressed.
- Files reviewed: 133/134 changed files
- Comments generated: 0 new
- Review effort level: Lite
🤖 Clawpilot here! Posted automatically by Clawpilot (an AI agent), not by a human. Please verify before acting.
Fixes AB#7802687. Replaces #718, which adopted cargo-anvil 0.6.0 and is superseded by this one.
Problem
anvil-semver-checkhas been non-functional repo-wide. Every library crate aborts with:The recipe installs the pin from
justfiles/anvil/versions.just, which wascargo-semver-checks0.46.0 (rustdoc JSON v55/v56/v57). The recipe does not pin a toolchain for doc building, so it uses the runner default stable — now Rust 1.98, whose rustdoc emits v60. The tool aborts while parsing the JSON it just produced.Because the recipe is advisory, the crash was never surfaced as a failure. Each tool error was collected as a finding and posted as a sticky ":warning: Potential breaking changes detected" comment listing ~21 crates. Net effect: SemVer checking has been off across the workspace since the runner rolled to 1.98, and every PR carried a misleading breaking-change warning.
#709 fixed this by editing the pin directly and was closed unmerged, because
versions.justis anvil-generated and a repository-local edit stops it receiving automatic updates. This PR takes the sanctioned route instead.Change
Regenerate the anvil-managed tree with
cargo anvilfrom cargo-anvil 0.7.0 (2026-09-03; previously 0.3.0, #596, 2026-07-24). The 0.7.0 catalog pinscargo-semver-checks0.50.0, which reads rustdoc JSON v57, v60 and v61.A second goal of this PR is to shrink the repository-specific surface and let the anvil templates own as much of the tree as they can. Three artifacts that were customized before this PR are now the template verbatim; see "Custom configuration retired" below.
Why 0.7.0 rather than 0.6.0
#718 adopted 0.6.0 and hit two problems that had to be worked around or left open. 0.7.0 fixes both upstream, which is why that PR is closed in favour of this one.
cargo anvilappended ananvil-lintsregion without noticing an existing unmanaged[lints]table, producing two[lints]tables in 20 crates and a workspace cargo rejects outright. #718 had to delete the pre-existing block by hand in every one.# >>> anvil-managedfences (and, where the table sat mid-file, a move to the end). No manual edit.pr-msrvgroup rancargo test --all-targets, and--all-targetsimplies--benches, socargo testexecuted the Callgrind bench harnesses. Those areharness = falseand hand off togungraun-runner, which the group never installs —anvil-msrv-testfailed on linux and linux-arm.msrv-test.justnow uses--tests, with a comment stating exactly this reason. Benches/examples stay compile-only underanvil-bench/anvil-examples.Compatibility
rustdoc JSON
format_versionagainst the toolchains in play:RUST_MSRV)RUST_LATEST)0.50.0 drops v55 and v56, both of which correspond to a rustc below the MSRV. Its install MSRV is Rust 1.93, below this repo's 1.95.
What else the 0.7.0 catalog brings
ANVIL_INCLUDE_MODIFIED/ANVIL_INCLUDE_AFFECTED/ANVIL_INCLUDE_REQUIREDare gone as job outputs threaded into every group. The impact jobs upload ananvil-impact-<os>artifact; each group job downloads it intotarget/anvil/impact, and every scoped check reads its own scope through the newjustfiles/anvil/impact.justhelper_anvil-impact-include <tier>— the same cache a local run reads.anvil-pr-fast,anvil-pr-test, …) are replaced by a singleanvil-run-groupplusanvil-report-status, andanvil-setupgains ajust-problem-matcher.jsonsojusterrors annotate the diff.justfiles/anvil/checks/msrv-test.justplus apr-msrvgroup, wired intoanvil-pr-impl.ymlacross the four legs..anvil/container/Dockerfile+.dockerignoreandjustfiles/anvil/container.just, imported withimport?so the documentedwithout_artifactopt-out cannot break Justfile parsing.versions.justgains_anvil_stable_toolchain_args, a bootstrap that resolves the repository toolchain file (or, absent one, the root MSRV) before cargo is available to parse the manifest.cargo-eachpin..gitattributesgains*.sh text eol=lf.Custom configuration retired
cargo-anvil refuses to overwrite an artifact an adopter has edited; it writes a
.anvil-proposedsidecar instead (not committed). Eight artifacts were in that state after regeneration. Three are now the template verbatim, so anvil owns them again and they will pick up future catalog updates automatically:justfiles/anvil/checks/bolero.just. The template discovers targets per package rather than in one call, raises a discovery failure as an error instead of swallowing it as "no targets", and builds with--profile release. Strictly better than the repository copy.deny.toml [anvil-deny-bans].wildcards = "warn"→wildcards = "deny"withallow-wildcard-paths = true. The adopter comment justifiedwarnby "internal workspace crates use wildcard version requirements" — those are path dependencies, whichallow-wildcard-pathspermits, so the stricter setting costs nothing and now catches a registry wildcard.just anvil-denyreportsadvisories ok, bans ok, licenses ok, sources ok..github/skills/code-review/SKILL.md. The template is a superset of the repository copy: same rules, plus the evidence rule and seven worked failure cases.CARGO_DENY_VERSIONinconstants.envfollows the anvil pin to 0.20.2 so both consumers of the now-generateddeny.tomluse the same tool.That leaves five customized artifacts, down from eight. (
Cargo.toml [anvil-workspace-lints],deny.toml [anvil-deny-advisories]/[anvil-deny-licenses]andclippy.toml [anvil-clippy]also appear as "leave alone" in the dry run, but those are adopter-owned by design — anvil never overwrites them.)Custom configuration retained, with reasons
justfiles/anvil/checks/fmt.just— the template silently disables the check in this repository. The proposed recipe runscargo {{_anvil_stable_toolchain_args}} each --workspace -- cargo +<nightly> fmt --manifest-path '{manifest}' --check. This repository has norust-toolchain.toml, so the bootstrap falls through to the root MSRV and the outercargo +1.95exportsRUSTUP_TOOLCHAIN=1.95into the inner nightlycargo fmt. Measured locally: 2 300 lines ofand exit 0 — rustfmt runs on stable, ignores every unstable option in
rustfmt.toml, and the check passes without enforcing what it exists to enforce. Running the samecargo each … -- cargo +<nightly> fmtline by hand, without the outer toolchain argument, is silent. The repository recipe (cargo +<nightly> fmt --package $p --checkper package) is kept, rewired to the new impact helper. Worth an upstream issue againstmicrosoft/ox-tools.The four
mirirecipes. Adopting the templates would drop two deliberate things:[package.metadata.anvil.miri] exclude = true, honoured by_anvil-miri-testand set by 8*_macros_implcrates. The template ignores the key, so Miri would start running on all of them. The code-review skill adopted in this PR describes that list as "a Miri exclusion list that intentionally covers every*_macros_implcrate as a cost policy".They are kept as-is and rewired to the new impact helper (see below).
.delta.toml. cargo-anvil reports it left the managed region empty because the repository defines top-leveltrip_wire_patterns. Adopting the managed region would narrow impact scoping: the managed list isCargo.lock/Cargo.toml/rust-toolchain.toml, while the repository list also trips on.github/*,*.just,deny.toml,scripts/*and more — including the paths this very PR touches. Not equivalent, so the repository key stays.Other manual changes regeneration cannot make
constants.envfollows three anvil pins. The file is not anvil-managed, and these tools check the same checked-in artifacts the anvil recipes check, so they cannot disagree:CARGO_SEMVER_CHECKS_VERSION0.48.0 → 0.50.0, so themain.ymlsemverjob andscripts/release-packages.ps1install what the recipes install. That path pinsRUST_LATEST=1.96.1, which emits v57, so it was never broken — but 0.48.0 reads only v55/v56/v57, so a developer runningrelease-packages.ps1on current stable would hit the identical error locally.CARGO_DOC2README_VERSION0.7.2 → 0.7.3. 0.7.3 builds docs.rs URLs from a dependency's package name rather than its lib name.main.yml'sstatic-analysisjob andanvil-readme-checkboth check the same READMEs, and only one generator can be right for a single file.CARGO_DENY_VERSION0.19.8 → 0.20.2, as above.READMEs regenerated with the pinned 0.7.3 and the workspace
crates/README.j2template. The diff is limited to the embedded dependency-info blob and, inseatbelt,http_extensionsandrest_over_grpc, the docs.rs URLs of the three dependencies whose package and lib names differ (tower-service,http-body).The five retained recipes rewired to the new impact helper. Left untouched they would have read the now-removed
ANVIL_INCLUDE_*variables, silently fallen back to--workspace, andanvil-fmtwould never have seen its--skipshort-circuit. Each now takes ananvil-impactdependency and calls_anvil-impact-include, and each moves to[script("pwsh", "-NoProfile")]so all script recipes in the tree are consistent and none load the invoking user's PowerShell profile.constants.envandversions.juststill disagree on cargo-llvm-cov (0.8.7 vs 0.9.0), cargo-mutants (27.0.0 vs 27.1.0), cargo-nextest (0.9.137 vs 0.9.143) and cargo-spellcheck (0.15.1 vs 0.15.7). None of those pairs of consumers check a shared checked-in artifact, so they are left alone here rather than bumped speculatively. cargo-spellcheck is the one to watch: the 0.3.0versions.justpinned 0.15.1 with a comment calling 0.15.7 an em-dash regression, and the 0.7.0 catalog now pins 0.15.7 whileconstants.envstill says 0.15.1 — ifanvil-spellcheckreports em-dash findings thatmain.ymldoes not, that is why.Verification
cargo anvil --dry-runafter the change reports 136 unchanged items and zero pending writes — the tree is fully in sync with the 0.7.0 catalog, and the customized surface is down from 12 reported items to 9 (of which 4 are adopter-owned by design).cargo metadata --no-deps --lockedsucceeds, so the 20 regenerated[lints]regions parse.just --listparses the regenerated recipe tree (265 recipes).just anvil-fmtpasses and is silent, exercising the newanvil-impact→_anvil-impact-includepath end to end on a retained recipe.just anvil-readme-checkpasses over the whole workspace with the pinned 0.7.3.just anvil-denypasses with the adopted[bans]region and cargo-deny 0.20.2..rsfiles are touched, so formatting and lint output cannot change.The workflow restructure — the impact artifact hand-off, the generic
anvil-run-groupaction and the newpr-msrvgroup — can only really be validated by CI on this PR.Follow-up:
cachet_memorytokiomacrosfeaturePR Job / Check Group: Runtime Analysisfailed on linux and linux-arm insideanvil-bolero, oncargo test --target x86_64-unknown-linux-gnu --profile release --package cachet_memory --no-run, with 30xerror[E0433]: cannot find 'test' in 'tokio'.This is a pre-existing latent manifest defect, not a regression from this upgrade.
crates/cachet_memoryuses#[tokio::test]30 times but declared its tokio dev-dependency asfeatures = ["rt", "rt-multi-thread"]. The workspace tokio isdefault-features = false, somacroswas only ever supplied by workspace-wide feature unification from the 18 sibling crates that do declare it — every single-package build of the crate has been broken. It reproduces with no bolero involved at all:cargo test --no-run -p cachet_memoryfails identically.The 0.7.0
anvil-bolerotemplate surfaces it because it discovers fuzz targets with a per-packagecargo bolero list --package <name>. The previous repository recipe swallowed a discovery failure as "no targets" and exited 0, which is exactly the kind of silent pass the template removes.Fix: declare the missing feature in
crates/cachet_memory/Cargo.toml, one line,Cargo.lockunchanged.cachet_memoryis the only crate in the workspace with this defect — every other crate using#[tokio::test]already declaresmacros. Re-customizingbolero.justto restore the swallow was rejected: it would leave the crate unbuildable standalone and re-add repository-specific surface this PR is removing.Behavioural change:
anvil-aprzmoves from the PR tier to the scheduled tierFlagged in review and confirmed against
main. Under cargo-anvil 0.3.0 theanvil-pr-fastgroup ended withanvil-aprz; under 0.7.0 it does not, andanvil-aprznow runs only inanvil-scheduled-advisories. Dependency feature and version-requirement analysis therefore moves from every pull request to the scheduled run.This is an upstream template decision, not a repository choice.
justfiles/anvil/groups/pr-fast.justandjustfiles/anvil/groups/scheduled-advisories.justare both anvil-generated, and this PR takes the 0.7.0 templates verbatim. Restoringanvil-aprzto the PR group here would mean hand-editing a generated file, which stops automatic updates for that file and is the exact reason PR #709 was closed unmerged. If PR-tier aprz coverage is wanted, the fix belongs in cargo-anvil upstream so every adopter gets it.Recording it here so the change is deliberate and visible rather than an unnoticed side effect of the version bump.
Update: all shared
constants.envpins now alignedThe PR originally bumped only three pins in
constants.env—CARGO_SEMVER_CHECKS_VERSION,CARGO_DOC2README_VERSIONandCARGO_DENY_VERSION— on the reasoning that those are the ones whose two consumers check the same committed artifact, so a mismatch there can produce a conflicting result.Raised in review: that reasoning does not cover the other kind of divergence.
constants.envfeeds the pre-anvilmain.ymlworkflow andjustfiles/anvil/versions.justfeeds the anvil recipes, so any drift means the two paths install different versions of the same tool, whatever they check. The remaining four are now aligned as well:CARGO_LLVM_COV_VERSIONCARGO_MUTANTS_VERSIONCARGO_NEXTEST_VERSIONCARGO_SPELLCHECK_VERSIONEvery tool pinned in both files now carries the same version; the only entries left without a counterpart are ones that exist in just one file (
cargo-macheteandcargo-workspacesinconstants.env;cargo-aprz,cargo-audit,cargo-coverage-gateandcargo-eachinversions.just).constants.envis not anvil-managed, so this is a repository edit and not a generated-file change.cargo anvil --dry-runstill reports zero pending writes, andjust --liststill parses — the root justfile loads this file throughset dotenv-path, so a malformed edit would break every recipe.Adopted: the generated
anvil-deltatrip-wire patternsThe repository-level
trip_wire_patternskey in.delta.tomlis removed, socargo anvilnow populates the managedanvil-deltaregion with the 0.7.0 template list.This reverses an earlier decision in this PR to keep the repository list. That decision was made against the pre-0.7.0
[delta]region shape and was never revisited; re-checking it against the actual 0.7.0 template shows the generated list is a strict superset of the repository list. It keeps all 18 repository entries and adds.pipelines/**,Justfileandjustfiles/**, and it uses recursive**where the repository used single-level*for.ado,.cargo,.githubandscripts. That last difference is not cosmetic: the repository's.github/*does not match.github/workflows/anvil-pr.yml, while.github/**does — so the generated list scopes strictly more conservatively, not less, including on paths this PR touches.Adopting it also removes one more repository-specific customization, which is the stated goal of this change.
cargo anvil --dry-runreports zero pending writes afterwards.