Skip to content

fix(cargo-anvil): propagate impact scope failures - #189

Open
martinhavelka (wukchung) wants to merge 4 commits into
mainfrom
u/mhavelka/impact-exit-propagation
Open

martinhavelka (wukchung) wants to merge 4 commits into
mainfrom
u/mhavelka/impact-exit-propagation

Conversation

@wukchung

@wukchung martinhavelka (wukchung) commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

🤖 A scoped check resolves its package scope by calling _anvil-impact-include <tier>. That resolver can fail: a missing cache under ANVIL_IMPACT=consume, an unreadable include file, an unrecognized ANVIL_IMPACT value. $ErrorActionPreference = 'Stop' does not fail a recipe on a native command's nonzero exit, so the failure was swallowed, $include stayed empty, and the check silently widened to its unscoped default and passed. That is the same silent-widening failure anvil-impact already refuses in consume mode, so reading the cache it asserts should refuse it too.

Changes

  • capture and propagate the resolver's exit code in every scoped check template, adopting the guard msrv-test already used
  • add a template contract test over every resolver call site in every check file
  • verify at runtime that a failed lookup stops anvil-fmt before cargo runs
  • document the guard and its rationale in helpers.just and checks.md, and refresh the full-tree snapshots the generated-content change invalidated

Validation

  • cargo test -p cargo-anvil — 494 lib tests and all integration suites pass
  • just anvil-pr-fast — pass
  • regression proof: with the guard removed from fmt.just, scoped_check_propagates_missing_consumed_impact_cache fails; with it restored, it passes

The runtime test originally asserted nothing: its fixture omitted anvil-fmt's dependency recipes, so just failed to load the justfile and the recipe never ran, leaving the test green with the guard removed. It now supplies the full dependency set and asserts the resolver's own cache-missing error reaches stderr, which only the in-recipe propagation path can produce.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: de5be740-9c27-4201-9ca8-19180fed8871
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: de5be740-9c27-4201-9ca8-19180fed8871
@github-actions

github-actions Bot commented Sep 17, 2026

Copy link
Copy Markdown

⚠️ SemVer check advisory

Inconclusive comparisons

cargo semver-checks could not complete the following comparisons. These failures are informational because an unbuildable baseline is not evidence of a breaking API change.

cargo-aprz-lib (exit 101)

     Cloning 1910173d2c5eb596341960371a2ca25957292c4d
    Building cargo-aprz-lib v1.1.2 (current)
error: running cargo-doc on crate 'cargo-aprz-lib' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling unicode-ident v1.0.26
   Compiling libc v0.2.189
    Checking memchr v2.8.3
    Checking cfg-if v1.0.5
    Checking smallvec v1.16.1
    Checking bytes v1.12.1
    Checking once_cell v1.21.4
    Checking regex-syntax v0.8.11
   Compiling thiserror v2.0.20
   Compiling syn v3.0.6
    Checking stable_deref_trait v1.2.1
   Compiling crc32fast v1.5.2
   Compiling crossbeam-utils v0.8.23
    Checking scopeguard v1.2.0
    Checking regex-automata v0.4.18
   Compiling getrandom v0.4.3
    Checking zlib-rs v0.6.8
   Compiling parking_lot_core v0.9.12
    Checking fastrand v2.5.0
    Checking bitflags v2.13.2
    Checking gix-trace v0.1.21
    Checking lock_api v0.4.14
    Checking tinyvec v1.13.3
   Compiling serde_core v1.0.229
    Checking unicode-normalization v0.1.25
    Checking bstr v1.13.1
    Checking parking_lot v0.12.5
    Checking itoa v1.0.18
    Checking gix-utils v0.3.6
    Checking gix-validate v0.11.4
    Checking crossbeam-channel v0.5.17
    Checking same-file v1.0.6
    Checking walkdir v2.5.0
   Compiling find-msvc-tools v0.1.12
    Checking equivalent v1.0.2
   Compiling shlex v2.0.1
    Checking foldhash v0.2.0
    Checking allocator-api2 v0.2.21
    Checking byteorder v1.5.0
    Checking prodash v31.0.0
   Compiling jobserver v0.1.35
    Checking gix-error v0.2.5
   Compiling cc v1.4.6
   Compiling pkg-config v0.3.34
   Compiling version_check v0.9.5
   Compiling generic-array v0.14.7
    Checking hashbrown v0.17.1
    Checking typenum v1.20.1
   Compiling thiserror-impl v2.0.20
   Compiling heapless v0.8.0
    Checking hash32 v0.3.1
    Checking cpufeatures v0.2.17
   Compiling serde v1.0.229
    Checking faster-hex v0.10.0
   Compiling serde_derive v1.0.229
    Checking crypto-common v0.1.7
    Checking block-buffer v0.10.4
    Checking jiff-core v0.1.1
    Checking digest v0.10.7
    Checking sha1 v0.10.7
    Checking pin-project-lite v0.2.17
    Checking sha1-checked v0.10.0
    Checking gix-path v0.12.6
   Compiling synstructure v0.14.0
    Checking gix-features v0.48.1
   Compiling rustix v1.1.5
    Checking jiff v0.2.37
    Checking gix-hash v0.25.1
    Checking linux-raw-sys v0.12.1
   Compiling zerofrom-derive v0.1.8
    Checking zerofrom v0.1.8
   Compiling yoke-derive v0.8.3
    Checking gix-date v0.15.6
   Compiling autocfg v1.5.1
    Checking gix-actor v0.41.2
    Checking gix-hashtable v0.15.2
    Checking futures-core v0.3.34
    Checking gix-object v0.61.0
    Checking yoke v0.8.3
   Compiling zerovec-derive v0.11.6
    Checking errno v0.3.14
   Compiling displaydoc v0.2.7
    Checking signal-hook-registry v1.4.8
   Compiling tokio-macros v2.7.2
    Checking memmap2 v0.9.11
    Checking socket2 v0.6.5
    Checking mio v1.2.3
   Compiling cmake v0.1.58
   Compiling dunce v1.0.5
    Checking tokio v1.53.1
   Compiling rustversion v1.0.23
    Checking zerovec v0.11.8
   Compiling fs_extra v1.3.0
    Checking futures-sink v0.3.34
   Compiling aws-lc-sys v0.45.0
    Checking tinystr v0.8.4
    Checking tempfile v3.27.0
    Checking gix-fs v0.21.2
    Checking gix-chunk v0.7.3
    Checking litemap v0.8.3
    Checking percent-encoding v2.3.2
    Checking writeable v0.6.4
   Compiling vcpkg v0.2.15
    Checking icu_locale_core v2.3.0
   Compiling libz-sys v1.1.29
    Checking gix-tempfile v23.0.2
    Checking potential_utf v0.1.6
    Checking zerotrie v0.2.5
    Checking gix-quote v0.7.2
    Checking tracing-core v0.1.36
    Checking nonempty v0.12.0
   Compiling aws-lc-rs v1.18.1
    Checking zeroize v1.9.0
   Compiling icu_normalizer_data v2.3.0
    Checking simd-adler32 v0.3.10
    Checking utf8_iter v1.0.4
    Checking slab v0.4.12
   Compiling icu_properties_data v2.3.0
    Checking icu_collections v2.3.0
    Checking tracing v0.1.44
    Checking icu_provider v2.3.1
    Checking http v1.5.0
    Checking fnv v1.0.7
    Checking adler2 v2.0.1
    Checking miniz_oxide v0.9.1
    Checking rustls-pki-types v1.15.1
    Checking gix-commitgraph v0.37.1
    Checking gix-glob v0.26.1
    Checking indexmap v2.14.2
    Checking log v0.4.34
    Checking futures-task v0.3.34
    Checking futures-io v0.3.34
    Checking tokio-util v0.7.19
    Checking futures-util v0.3.34
    Checking gix-revwalk v0.32.0
    Checking icu_properties v2.3.0
    Checking icu_normalizer v2.3.0
    Checking flate2 v1.1.10
    Checking http-body v1.1.0
    Checking gix-lock v23.0.1
   Compiling num-traits v0.2.19
   Compiling syn v2.0.119
   Compiling zmij v1.0.23
   Compiling httparse v1.10.1
   Compiling rustls v0.23.45
    Checking untrusted v0.9.0
    Checking idna_adapter v1.2.2
   Compiling encoding_rs v0.8.41
    Checking futures-channel v0.3.34
    Checking unicode-bom v2.0.3
    Checking static_assertions v1.1.0
    Checking atomic-waker v1.1.2
    Checking try-lock v0.2.5
    Checking tower-layer v0.3.3
    Checking tower-service v0.3.3
    Checking subtle v2.6.1
    Checking want v0.3.1
    Checking h2 v0.4.19
    Checking idna v1.1.0
    Checking form_urlencoded v1.2.2
    Checking gix-config-value v0.18.1
    Checking core_detect v1.0.0
    Checking compression-core v0.4.33
   Compiling serde_json v1.0.151
   Compiling multiversion_no_op v1.0.0
    Checking simdutf8 v0.1.5
    Checking shell-words v1.1.1
    Checking gix-command v0.9.2
    Checking hyper v1.11.1
    Checking compression-codecs v0.4.43
    Checking url v2.5.8
    Checking kstring v2.0.4
    Checking sync_wrapper v1.0.2
    Checking gix-sec v0.14.2
    Checking ipnet v2.12.2
    Checking base64 v0.22.1
    Checking openssl-probe v0.2.1
    Checking tower v0.5.3
    Checking rustls-native-certs v0.8.4
    Checking gix-attributes v0.33.2
    Checking hyper-util v0.1.20
    Checking async-compression v0.4.48
    Checking http-body-util v0.1.5
   Compiling heck v0.5.0
   Compiling crossbeam-epoch v0.9.21
    Checking tower-http v0.6.11
    Checking gix-ref v0.64.0
    Checking gix-url v0.36.2
    Checking gix-packetline v0.21.5
    Checking filetime v0.2.29
   Compiling crossbeam-deque v0.8.8
    Checking base64 v0.23.1
    Checking mime v0.3.17
    Checking either v1.18.0
    Checking gix-prompt v0.15.1
    Checking gix-revision v0.46.0
    Checking gix-traverse v0.58.0
   Compiling zstd-sys v2.1.0+zstd.1.5.7
    Checking gix-bitmap v0.3.3
    Checking hashbrown v0.16.1
    Checking fast_time v0.1.32
    Checking arrayvec v0.7.8
   Compiling rayon-core v1.13.0
   Compiling camino v1.2.6
    Checking uluru v3.1.0
    Checking nm_impl v0.1.50
    Checking gix-refspec v0.42.0
    Checking gix-index v0.52.0
    Checking clru v0.6.3
    Checking gix-credentials v0.38.2
    Checking gix-ignore v0.21.1
   Compiling memoffset v0.9.1
    Checking semver v1.0.28
    Checking winnow v1.0.4
   Compiling cfg_aliases v0.2.2
    Checking utf8parse v0.2.2
   Compiling thiserror v1.0.69
    Checking toml_parser v1.1.3+spec-1.1.0
    Checking anstyle-parse v1.0.0
   Compiling nix v0.30.1
    Checking gix-worktree v0.53.0
    Checking gix-pack v0.71.0
    Checking nm v0.1.50
    Checking gix-config v0.57.0
    Checking gix-filter v0.31.0
    Checking gix-pathspec v0.18.1
   Compiling maybe-async v0.2.11
   Compiling thiserror-impl v1.0.69
    Checking gix-shallow v0.12.1
    Checking gix-negotiate v0.32.0
    Checking arc-swap v1.9.2
   Compiling fs-err v3.3.1
    Checking toml_datetime v1.1.1+spec-1.1.0
    Checking smol_str v0.3.6
    Checking serde_spanned v1.1.1
    Checking io-close v0.3.7
   Compiling typeid v1.0.3
    Checking colorchoice v1.0.5
   Compiling zstd-safe v8.0.0
    Checking bit-vec v0.8.0
    Checking anstyle-query v1.1.5
   Compiling portable-atomic v1.15.0
    Checking bumpalo v3.20.3
    Checking anstyle v1.0.14
    Checking toml_writer v1.1.2+spec-1.1.0
    Checking unicode-properties v0.1.4
    Checking is_terminal_polyfill v1.70.2
    Checking anstream v1.0.0
    Checking toml v1.1.6+spec-1.1.0
    Checking ra-ap-rustc_lexer v0.160.0
error[E0080]: evaluation panicked: unicode-properties and unicode-ident must use the same Unicode version, `unicode_properties::UNICODE_VERSION` and `unicode_ident::UNICODE_VERSION` are different.
  --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ra-ap-rustc_lexer-0.160.0/src/lib.rs:47:9
   |
47 | /         panic!(
48 | |             "unicode-properties and unicode-ident must use the same Unicode version, \
49 | |             `unicode_properties::UNICODE_VERSION` and `unicode_ident::UNICODE_VERSION` are \
50 | |             different."
51 | |         );
   | |_________^ evaluation of `_` failed here

For more information about this error, try `rustc --explain E0080`.
error: could not compile `ra-ap-rustc_lexer` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...

-----

error: failed to build rustdoc for crate cargo-aprz-lib v1.1.2
note: this is usually due to a compilation error in the crate,
      and is unlikely to be a bug in cargo-semver-checks
note: the following command can be used to reproduce the error:
      cargo new --lib example &&
          cd example &&
          echo '[workspace]' >> Cargo.toml &&
          cargo add --path /home/runner/work/ox-tools/ox-tools/crates/cargo-aprz-lib --features internals &&
          cargo check &&
          cargo doc

error: aborting due to failure to build rustdoc for crate cargo-aprz-lib v1.1.2

…e contract

The scoped-check propagation test never exercised the recipe: its fixture
omitted anvil-fmt's dependency recipes, so just failed to load the justfile
and the test passed with the propagation guard removed. Give the fixture the
full dependency set and assert the resolver's own cache-missing error reaches
stderr, so the test fails when the guard is dropped.

Also scan every resolver call site per check file rather than the first, and
document the exit-code contract where the resolver's output is specified.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 71082801-1485-4f7a-a732-6331e761e6bb
@wukchung
martinhavelka (wukchung) marked this pull request as ready for review September 17, 2026 13:51
Copilot AI lite review requested due to automatic review settings September 17, 2026 13:52

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 byte-exact local, GitHub, and ADO snapshots still contain the pre-change recipe bodies.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

This PR makes impact-scoped Anvil checks fail when scope resolution fails instead of silently widening to workspace scope.

Changes:

  • Propagates _anvil-impact-include exit codes across all scoped checks.
  • Adds structural and runtime regression coverage.
  • Updates documentation and generated artifact checksums.
File summaries
File Description
justfiles/anvil/... Generated scoped-check guards
crates/cargo-anvil/templates/justfiles/anvil/... Canonical recipe/template guards
crates/cargo-anvil/tests/recipe_contracts.rs Runtime regression test
crates/cargo-anvil/src/anvil/artifacts/justfile.rs Template contract test
crates/cargo-anvil/docs/design/checks.md Documents failure propagation
.anvil.lock Updates generated artifact checksums
Review details
  • Files reviewed: 45/46 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +60 to +64
# Those three values are only meaningful when the resolver succeeded, so every
# caller captures its exit code and propagates it before reading `$include`:
#
# $impactExit = $LASTEXITCODE
# if ($impactExit -ne 0) { exit $impactExit }
The propagation guard and the helpers.just contract note change generated
content, so the full-tree snapshots no longer matched.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 71082801-1485-4f7a-a732-6331e761e6bb
Copilot AI review requested due to automatic review settings September 17, 2026 14: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.

🟢 Approval recommended

All 21 scoped resolver call sites are guarded, with synchronized templates, generated outputs, snapshots, and regression coverage.

Review details
  • Files reviewed: 48/49 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@codecov-commenter

Codecov Comments Bot (codecov-commenter) commented Sep 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.6%. Comparing base (7127782) to head (0876cb3).
⚠️ Report is 1 commits behind head on main.

❌ Your project status has failed because the head coverage (97.6%) is below the target coverage (100.0%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files
@@          Coverage Diff          @@
##            main    #189   +/-   ##
=====================================
  Coverage   97.6%   97.6%           
=====================================
  Files        304     304           
  Lines      69671   69683   +12     
=====================================
+ Hits       68005   68021   +16     
+ Misses      1666    1662    -4     
Flag Coverage Δ
linux 97.5% <ø> (?)
linux-arm 97.6% <ø> (+<0.1%) ⬆️
scheduled ?
windows 97.7% <ø> (-0.1%) ⬇️

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.

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