Skip to content

ci(anvil): update to cargo-anvil 0.7.0 - #728

Open
Evgenii (Vaiz) wants to merge 6 commits into
mainfrom
u/vaiz/2026/09/04/anvil-0-7-0
Open

ci(anvil): update to cargo-anvil 0.7.0#728
Evgenii (Vaiz) wants to merge 6 commits into
mainfrom
u/vaiz/2026/09/04/anvil-0-7-0

Conversation

@Vaiz

@Vaiz Evgenii (Vaiz) commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

🤖 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-check has been non-functional repo-wide. Every library crate aborts with:

error: unsupported rustdoc format v60 for file: .../target/doc/anyspawn_azure.json
(supported formats are v55, v56, v57)

The recipe installs the pin from justfiles/anvil/versions.just, which was cargo-semver-checks 0.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.just is 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 anvil from cargo-anvil 0.7.0 (2026-09-03; previously 0.3.0, #596, 2026-07-24). The 0.7.0 catalog pins cargo-semver-checks 0.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.

Problem on #718 (0.6.0) State on 0.7.0
cargo anvil appended an anvil-lints region 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. Fixed. The generator adopts the existing table into the managed region. The diff in those 20 crates is now just the # >>> anvil-managed fences (and, where the table sat mid-file, a move to the end). No manual edit.
The new pr-msrv group ran cargo test --all-targets, and --all-targets implies --benches, so cargo test executed the Callgrind bench harnesses. Those are harness = false and hand off to gungraun-runner, which the group never installs — anvil-msrv-test failed on linux and linux-arm. Fixed. msrv-test.just now uses --tests, with a comment stating exactly this reason. Benches/examples stay compile-only under anvil-bench / anvil-examples.

Compatibility

rustdoc JSON format_version against the toolchains in play:

toolchain rustdoc JSON read by 0.50.0
1.95 (RUST_MSRV) v57 yes
1.96.1 (RUST_LATEST) v57 yes
1.98 (runner stable) v60 yes
nightly-2026-05-30 v57 yes

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

  • Impact analysis moves to an artifact, and scoping moves into the recipe tree. ANVIL_INCLUDE_MODIFIED / ANVIL_INCLUDE_AFFECTED / ANVIL_INCLUDE_REQUIRED are gone as job outputs threaded into every group. The impact jobs upload an anvil-impact-<os> artifact; each group job downloads it into target/anvil/impact, and every scoped check reads its own scope through the new justfiles/anvil/impact.just helper _anvil-impact-include <tier> — the same cache a local run reads.
  • One generic group runner. The eight per-group composite actions (anvil-pr-fast, anvil-pr-test, …) are replaced by a single anvil-run-group plus anvil-report-status, and anvil-setup gains a just-problem-matcher.json so just errors annotate the diff.
  • New MSRV check and group: justfiles/anvil/checks/msrv-test.just plus a pr-msrv group, wired into anvil-pr-impl.yml across the four legs.
  • Container artifacts. A generated .anvil/container/Dockerfile + .dockerignore and justfiles/anvil/container.just, imported with import? so the documented without_artifact opt-out cannot break Justfile parsing.
  • Stable-toolchain resolution. versions.just gains _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.
  • Tool pins bumped: cargo-aprz 1.0.0 → 1.1.0, cargo-careful 0.4.9 → 0.4.10, cargo-deny 0.19.0 → 0.20.2, cargo-doc2readme 0.6.4 → 0.7.3, cargo-hack 0.6.41 → 0.6.45, cargo-llvm-cov 0.8.4 → 0.9.0, cargo-mutants 26.1.2 → 27.1.0, cargo-nextest 0.9.122 → 0.9.143, cargo-semver-checks 0.46.0 → 0.50.0, cargo-sort 2.0.2 → 2.1.4, cargo-spellcheck 0.15.1 → 0.15.7, cargo-udeps 0.1.60 → 0.1.61, plus a new cargo-each pin.
  • .gitattributes gains *.sh text eol=lf.

Custom configuration retired

cargo-anvil refuses to overwrite an artifact an adopter has edited; it writes a .anvil-proposed sidecar 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" with allow-wildcard-paths = true. The adopter comment justified warn by "internal workspace crates use wildcard version requirements" — those are path dependencies, which allow-wildcard-paths permits, so the stricter setting costs nothing and now catches a registry wildcard. just anvil-deny reports advisories 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_VERSION in constants.env follows the anvil pin to 0.20.2 so both consumers of the now-generated deny.toml use the same tool.

That leaves five customized artifacts, down from eight. (Cargo.toml [anvil-workspace-lints], deny.toml [anvil-deny-advisories] / [anvil-deny-licenses] and clippy.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 runs cargo {{_anvil_stable_toolchain_args}} each --workspace -- cargo +<nightly> fmt --manifest-path '{manifest}' --check. This repository has no rust-toolchain.toml, so the bootstrap falls through to the root MSRV and the outer cargo +1.95 exports RUSTUP_TOOLCHAIN=1.95 into the inner nightly cargo fmt. Measured locally: 2 300 lines of

Warning: can't set `imports_granularity = Module`, unstable features are only available in nightly channel.
Warning: can't set `group_imports = StdExternalCrate`, unstable features are only available in nightly channel.

and 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 same cargo each … -- cargo +<nightly> fmt line by hand, without the outer toolchain argument, is silent. The repository recipe (cargo +<nightly> fmt --package $p --check per package) is kept, rewired to the new impact helper. Worth an upstream issue against microsoft/ox-tools.

The four miri recipes. Adopting the templates would drop two deliberate things:

  • the parallel artifact runner from perf(ci): parallelize scheduled Miri and reduce resource outliers #706 — compile once, then run the Miri test artifacts across all cores. Miri is on the PR critical path;
  • [package.metadata.anvil.miri] exclude = true, honoured by _anvil-miri-test and set by 8 *_macros_impl crates. 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_impl crate 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-level trip_wire_patterns. Adopting the managed region would narrow impact scoping: the managed list is Cargo.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.env follows 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_VERSION 0.48.0 → 0.50.0, so the main.yml semver job and scripts/release-packages.ps1 install what the recipes install. That path pins RUST_LATEST=1.96.1, which emits v57, so it was never broken — but 0.48.0 reads only v55/v56/v57, so a developer running release-packages.ps1 on current stable would hit the identical error locally.
  • CARGO_DOC2README_VERSION 0.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's static-analysis job and anvil-readme-check both check the same READMEs, and only one generator can be right for a single file.
  • CARGO_DENY_VERSION 0.19.8 → 0.20.2, as above.

READMEs regenerated with the pinned 0.7.3 and the workspace crates/README.j2 template. The diff is limited to the embedded dependency-info blob and, in seatbelt, http_extensions and rest_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, and anvil-fmt would never have seen its --skip short-circuit. Each now takes an anvil-impact dependency 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.env and versions.just still 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.0 versions.just pinned 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 while constants.env still says 0.15.1 — if anvil-spellcheck reports em-dash findings that main.yml does not, that is why.

Verification

  • cargo anvil --dry-run after 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 --locked succeeds, so the 20 regenerated [lints] regions parse.
  • just --list parses the regenerated recipe tree (265 recipes).
  • just anvil-fmt passes and is silent, exercising the new anvil-impact_anvil-impact-include path end to end on a retained recipe.
  • just anvil-readme-check passes over the whole workspace with the pinned 0.7.3.
  • just anvil-deny passes with the adopted [bans] region and cargo-deny 0.20.2.
  • No .rs files are touched, so formatting and lint output cannot change.

The workflow restructure — the impact artifact hand-off, the generic anvil-run-group action and the new pr-msrv group — can only really be validated by CI on this PR.

Follow-up: cachet_memory tokio macros feature

PR Job / Check Group: Runtime Analysis failed on linux and linux-arm inside anvil-bolero, on cargo test --target x86_64-unknown-linux-gnu --profile release --package cachet_memory --no-run, with 30x error[E0433]: cannot find 'test' in 'tokio'.

This is a pre-existing latent manifest defect, not a regression from this upgrade. 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 — every single-package build of the crate has been broken. It reproduces with no bolero involved at all: cargo test --no-run -p cachet_memory fails identically.

The 0.7.0 anvil-bolero template surfaces it because it discovers fuzz targets with a per-package cargo 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.lock unchanged. cachet_memory is the only crate in the workspace with this defect — every other crate using #[tokio::test] already declares macros. Re-customizing bolero.just to 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-aprz moves from the PR tier to the scheduled tier

Flagged in review and confirmed against main. Under cargo-anvil 0.3.0 the anvil-pr-fast group ended with anvil-aprz; under 0.7.0 it does not, and anvil-aprz now runs only in anvil-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.just and justfiles/anvil/groups/scheduled-advisories.just are both anvil-generated, and this PR takes the 0.7.0 templates verbatim. Restoring anvil-aprz to 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.env pins now aligned

The PR originally bumped only three pins in constants.envCARGO_SEMVER_CHECKS_VERSION, CARGO_DOC2README_VERSION and CARGO_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.env feeds the pre-anvil main.yml workflow and justfiles/anvil/versions.just feeds 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:

Pin Was Now
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; the only entries left without a counterpart are ones that exist in just one file (cargo-machete and cargo-workspaces in constants.env; cargo-aprz, cargo-audit, cargo-coverage-gate and cargo-each in versions.just).

constants.env is not anvil-managed, so this is a repository edit and not a generated-file change. cargo anvil --dry-run still reports zero pending writes, and just --list still parses — the root justfile loads this file through set dotenv-path, so a malformed edit would break every recipe.

Adopted: the generated anvil-delta trip-wire patterns

The repository-level trip_wire_patterns key in .delta.toml is removed, so cargo anvil now populates the managed anvil-delta region 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/**, Justfile and justfiles/**, and it uses recursive ** where the repository used single-level * for .ado, .cargo, .github and scripts. 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-run reports zero pending writes afterwards.

@codecov

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.0%. Comparing base (a312e8b) to head (db4814b).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #728   +/-   ##
=======================================
  Coverage   100.0%   100.0%           
=======================================
  Files         583      583           
  Lines       62930    62930           
=======================================
  Hits        62930    62930           
Flag Coverage Δ
linux 100.0% <ø> (?)
linux-arm 100.0% <ø> (?)
windows 99.9% <ø> (?)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 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-impact artifact + _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.

Comment thread .anvil/container/Dockerfile
Evgenii (Vaiz) and others added 3 commits September 4, 2026 15:05
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>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 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.0 pins by tag rather than an immutable commit SHA. For supply-chain integrity, prefer pinning to the exact commit (keeping the # v7.0.0 comment) so the referenced code can’t change without a diff here.
    .github/workflows/anvil-scheduled-impl.yml:77
  • Using codecov/codecov-action@v7.0.0 pins by tag rather than an immutable commit SHA. For supply-chain integrity, prefer pinning to the exact commit (keeping the # v7.0.0 comment) so the referenced code can’t change without a diff here.
    justfiles/anvil/checks/udeps.just:33
  • _anvil-impact-include can exit non-zero (e.g. exit 2 when ANVIL_IMPACT is misconfigured in impact.just), but this recipe ignores $LASTEXITCODE and 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 no rust-toolchain* files in the repository (glob found none). Since the anvil recipe tree now uses _anvil_stable_toolchain_args as a fallback when no toolchain file exists, the container build needs some other MSRV/bootstrap input (typically Cargo.toml) and the corresponding .dockerignore allowlist 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>
Copilot AI review requested due to automatic review settings September 4, 2026 14:15
@Vaiz
Evgenii (Vaiz) force-pushed the u/vaiz/2026/09/04/anvil-0-7-0 branch from 0a43d9a to ebb967e Compare September 4, 2026 14:15
@Vaiz
Evgenii (Vaiz) enabled auto-merge (squash) September 4, 2026 14:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 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 no rust-toolchain* file, so the image cannot be built as-written. Also, the Anvil stable-toolchain bootstrap in versions.just falls back to parsing the repo-root Cargo.toml when no toolchain file exists, so the container build context should include Cargo.toml instead.
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

Comment thread .anvil/container/Dockerfile.dockerignore
Comment thread justfiles/anvil/groups/pr-fast.just
Comment thread constants.env
`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>
Copilot AI review requested due to automatic review settings September 4, 2026 14:38
Comment thread .delta.toml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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.

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.

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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 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-include can exit non-zero (e.g. exit 2 for an unrecognized ANVIL_IMPACT value). This recipe assigns its stdout to $include but never checks $LASTEXITCODE, so a misconfigured scope mode would silently fall back to --workspace instead 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>
Copilot AI review requested due to automatic review settings September 4, 2026 15:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 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-action by 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.0 comment) to make the workflow content-addressed.
  • Files reviewed: 133/134 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

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.

5 participants