Skip to content

docs(thread_aware): add ThreadAware anti-pattern catalogue + reviewer checklist (AB#7947139) - #806

Merged
Pato Sandaña (psandana) merged 4 commits into
mainfrom
u/psandana/thread-aware-antipattern-catalogue
Oct 14, 2026
Merged

Pato Sandaña (psandana) merged 4 commits into
mainfrom
u/psandana/thread-aware-antipattern-catalogue

Conversation

@psandana

@psandana Pato Sandaña (psandana) commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Adds a "Nominally thread-aware, actually shared-locked" anti-pattern entry to the thread_aware authoring guide, plus a reviewer checklist for manual ThreadAware impls and #[thread_aware(skip)] fields.

This implements AB#7947139 and folds the lesson from the removed thread-aware-view.md into the canonical authoring guide.

Scope: docs only. An earlier revision also added an AI/Copilot audit prompt; that was extracted to live in the shared rust-dev tooling plugin instead, since the anti-pattern it detects manifests in downstream consumer repos rather than in this library.

Validation

  • RUSTDOCFLAGS="-D warnings" cargo doc -p thread_aware --no-deps --all-features
  • RUSTDOCFLAGS="-D warnings" cargo doc -p thread_aware --no-deps --no-default-features --features derive (fails only on the known pre-existing std::thread::spawn broken intra-doc link in crates/thread_aware/src/lib.rs:87; no new warnings)
  • cargo doc2readme --template ../README.j2 --check from crates/thread_aware

Document the shared-lock ThreadAware anti-pattern in the authoring guide,
including reviewer checks for manual impls and skipped fields.

Add a Copilot prompt for auditing PRs or the codebase for the same
manual-impl/no-op-relocate/shared-lock signature.

AB#7947139

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5e0d5396-3a32-40ed-8870-241cd4929082
Copilot AI balanced review requested due to automatic review settings October 9, 2026 17:25

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 guidance mischaracterizes PerNuma and contains conflicting rules for inert skipped fields.

3 open findings
What changed in this PR

Adds guidance and an audit prompt for identifying ineffective ThreadAware relocation implementations.

Changes:

  • Documents the shared-lock anti-pattern and reviewer checklist.
  • Adds a reusable Copilot audit prompt.
File Description
crates/​thread_aware/​src/​documentation/​mod.rs Adds anti-pattern guidance and review checks.
.github/​prompts/​thread-aware-antipattern-audit.prompt.md Adds automated audit instructions.

🧠 Review effort: Balanced


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

Comment thread .github/prompts/thread-aware-antipattern-audit.prompt.md Outdated
Comment thread .github/prompts/thread-aware-antipattern-audit.prompt.md Outdated
Comment thread crates/thread_aware/src/documentation/mod.rs Outdated
Comment thread crates/thread_aware/src/documentation/mod.rs Outdated
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

⚠️ SemVer check advisory

Potential breaking changes

cargo semver-checks flagged the following on this PR. This is informational -- breaking changes between commits are expected; the major-version bump happens at release time, not on every PR.

rallocator

     Cloning cb3ef36dc0942dc93017df934a3fcacfc7f451ad
    Building rallocator v0.2.0 (current)
       Built [   1.555s] (current)
     Parsing rallocator v0.2.0 (current)
      Parsed [   0.004s] (current)
    Building rallocator v0.2.0 (baseline)
       Built [   3.437s] (baseline)
     Parsing rallocator v0.2.0 (baseline)
      Parsed [   0.011s] (baseline)
    Checking rallocator v0.2.0 -> v0.2.0 (no change; assume minor)
     Checked [   0.014s] 196 checks: 190 pass, 6 fail, 0 warn, 58 skip

--- failure feature_missing: package feature removed or renamed ---

Description:
A feature has been removed from this package's Cargo.toml. This will break downstream crates which enable that feature.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#cargo-feature-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/feature_missing.ron

Failed in:
  feature loom in the package's Cargo.toml
  feature tuning-telemetry in the package's Cargo.toml
  feature caller-symbolization in the package's Cargo.toml

--- failure inherent_method_missing: pub method removed or renamed ---

Description:
A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/inherent_method_missing.ron

Failed in:
  Rallocator::new, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/allocator.rs:966

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/module_missing.ron

Failed in:
  mod rallocator::config, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/mod.rs:4
  mod rallocator::tuning_telemetry, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/tuning_telemetry.rs:4

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/struct_missing.ron

Failed in:
  struct rallocator::tuning_telemetry::MediumTuningTelemetry, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/tuning_telemetry.rs:299
  struct rallocator::tuning_telemetry::TuningTelemetryObservation, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/tuning_telemetry.rs:154
  struct rallocator::tuning_telemetry::TuningTelemetry, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/tuning_telemetry.rs:54
  struct rallocator::tuning_telemetry::ClassTuningTelemetry, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/tuning_telemetry.rs:264
  struct rallocator::config::Standard, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/mod.rs:17
  struct rallocator::config::StandardSizeClasses, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/tunables.rs:71

--- failure trait_missing: pub trait removed or renamed ---

Description:
A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/trait_missing.ron

Failed in:

     Summary semver requires new major version: 6 major and 0 minor checks failed
    Finished [   5.438s] rallocator
  trait rallocator::config::Tunables, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/tunables.rs:55
  trait rallocator::config::SizeClassLayout, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/tunables.rs:13
  trait rallocator::config::Config, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/rallocator/src/config/mod.rs:12

--- failure type_allows_fewer_generic_type_params: type now allows fewer generic type parameters ---

Description:
A type now allows fewer generic type parameters than it used to. Uses of this type that supplied all previously-supported generic types will be broken.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#trait-new-parameter-no-default
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/type_allows_fewer_generic_type_params.ron

Failed in:
  Struct Rallocator allows 1 -> 0 generic types in /home/runner/work/oxidizer/oxidizer/crates/rallocator/src/lib.rs:192

seismograph_rallocator

     Cloning cb3ef36dc0942dc93017df934a3fcacfc7f451ad
    Building seismograph_rallocator v0.2.0 (current)
       Built [   1.374s] (current)
     Parsing seismograph_rallocator v0.2.0 (current)
      Parsed [   0.003s] (current)
    Building seismograph_rallocator v0.2.0 (baseline)
       Built [   1.415s] (baseline)
     Parsing seismograph_rallocator v0.2.0 (baseline)
      Parsed [   0.005s] (baseline)
    Checking seismograph_rallocator v0.2.0 -> v0.2.0 (no change; assume minor)
     Checked [   0.017s] 196 checks: 192 pass, 4 fail, 0 warn, 58 skip

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/enum_missing.ron

Failed in:
  enum seismograph_rallocator::snapshot::PeakLiveBytesScope, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:72
  enum seismograph_rallocator::topology::SliceKind, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/topology.rs:8
  enum seismograph_rallocator::WireErrorKind, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/wire/mod.rs:25

--- failure enum_variant_missing: pub enum variant removed or renamed ---

Description:
A publicly-visible enum has at least one variant that is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/enum_variant_missing.ron

Failed in:
  variant ErrorKind::OutputTooSmall, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:143
  variant ErrorKind::OutputLengthMismatch, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:145
  variant ErrorKind::Wire, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:147
  variant ErrorKind::MissingSection, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:151
  variant ErrorKind::DuplicateSection, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:153
  variant ErrorKind::MalformedSection, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:155
  variant ErrorKind::IntegerOverflow, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:157
  variant ErrorKind::InvalidUtf8, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:159
  variant ErrorKind::UnknownEventKind, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:161
  variant ErrorKind::UnknownSliceKind, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:163
  variant ErrorKind::UnknownRuntimeEventKind, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/lib.rs:165

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/module_missing.ron

Failed in:
  mod seismograph_rallocator::snapshot, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:4
  mod seismograph_rallocator::topology, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/topology.rs:4

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/struct_missing.ron

Failed in:
  struct seismograph_rallocator::snapshot::SizeClass, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:229
  struct seismograph_rallocator::snapshot::Region, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:276
  struct seismograph_rallocator::snapshot::Histograms, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:395
  struct seismograph_rallocator::snapshot::Domain, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:318
  struct seismograph_rallocator::topology::Slice, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/topology.rs:77
  struct seismograph_rallocator::snapshot::Snapshot, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:467
  struct seismograph_rallocator::topology::Segment, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/topology.rs:25
  struct seismograph_rallocator::snapshot::SkippedSection, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:441
  struct seismograph_rallocator::topology::TopologyRegion, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/topology.rs:134
  struct seismograph_rallocator::snapshot::Estimate, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:32
  struct seismograph_rallocator::snapshot::Stats, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:104
  struct seismograph_rallocator::WireError, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/wire/mod.rs:18
  struct seismograph_rallocator::snapshot::Version, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:12
  struct seismograph_rallocator::snapshot::Metadata, previously in file /home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/seismograph_rallocator/src/snapshot.rs:421

     Summary semver requires new major version: 4 major and 0 minor checks failed
    Finished [   3.153s] seismograph_rallocator

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.

metabench (exit 101)

     Cloning cb3ef36dc0942dc93017df934a3fcacfc7f451ad
    Building metabench v0.1.1 (current)
       Built [  19.727s] (current)
     Parsing metabench v0.1.1 (current)
      Parsed [   0.015s] (current)
    Building metabench v0.1.1 (baseline)
error: running cargo-doc on crate 'metabench' failed with output:
-----
   Compiling proc-macro2 v1.0.107
   Compiling quote v1.0.47
   Compiling unicode-ident v1.0.27
   Compiling serde_core v1.0.229
   Compiling zmij v1.0.23
   Compiling serde v1.0.229
   Compiling serde_json v1.0.154
    Checking cfg-if v1.0.5
   Compiling libc v0.2.190
    Checking memchr v2.8.3
   Compiling syn v3.0.9
   Compiling syn v2.0.119
    Checking itoa v1.0.18
   Compiling zerocopy v0.8.62
    Checking bitflags v2.13.2
   Compiling winnow v1.0.4
   Compiling hashbrown v0.17.1
   Compiling find-msvc-tools v0.1.14
   Compiling rustversion v1.0.23
   Compiling semver v1.0.28
   Compiling equivalent v1.0.2
   Compiling shlex v2.0.1
   Compiling indexmap v2.14.2
   Compiling cc v1.8.0
   Compiling serde_derive v1.0.229
   Compiling rustc_version v0.4.1
   Compiling toml_parser v1.1.5+spec-1.1.0
   Compiling zerocopy-derive v0.8.62
   Compiling derive_more-impl v2.1.1
   Compiling rustix v1.1.5
   Compiling autocfg v1.5.1
   Compiling toml_datetime v1.1.2+spec-1.1.0
   Compiling toml_edit v0.25.17+spec-1.1.0
    Checking either-or-both v0.3.1
   Compiling num-traits v0.2.19
   Compiling alloca v0.4.0
   Compiling gungraun-macros v0.9.1
   Compiling proc-macro-error-attr3 v3.1.1
    Checking either v1.19.0
    Checking linux-raw-sys v0.12.1
   Compiling thiserror v2.0.21
   Compiling cfg_aliases v0.2.2
    Checking regex-syntax v0.8.11
    Checking clap_lex v1.1.1
    Checking ciborium-io v0.2.2
    Checking anstyle v1.0.14
   Compiling bincode-next v3.1.1
   Compiling getrandom v0.4.3
    Checking regex-automata v0.4.18
    Checking clap_builder v4.6.7
    Checking half v2.7.1
   Compiling nix v0.31.3
    Checking ciborium-ll v0.2.2
    Checking itertools v0.13.0
    Checking rapidhash v4.5.1
   Compiling proc-macro-error3 v3.1.1
   Compiling proc-macro-crate v3.5.0
   Compiling derive_more v2.1.1
   Compiling thiserror-impl v2.0.21
    Checking unty-next v0.1.2
    Checking same-file v1.0.6
   Compiling pastey v0.2.3
   Compiling gungraun v0.19.4
    Checking cast v0.3.0
    Checking walkdir v2.5.0
    Checking criterion-plot v0.8.2
   Compiling metabench_macros_impl v0.1.1 (/home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/metabench_macros_impl)
    Checking clap v4.6.7
    Checking ciborium v0.2.2
    Checking regex v1.13.1
    Checking gungraun-runner v0.20.0
    Checking gungraun-runner v0.19.4
    Checking folo_utils v0.1.14
    Checking tinytemplate v1.2.1
    Checking nix v0.27.1
    Checking page_size v0.6.0
    Checking fastrand v2.5.0
   Compiling metabench v0.1.1 (/home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/metabench)
    Checking anes v0.1.6
    Checking once_cell v1.21.4
    Checking oorandom v11.1.5
    Checking jiff-core v0.1.1
    Checking criterion v0.8.2
    Checking command-group v5.0.1
    Checking tempfile v3.27.0
   Compiling metabench_macros v0.1.1 (/home/runner/work/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/metabench_macros)
    Checking jiff v0.2.38
    Checking gungraun-summary v6.0.0
error[E0432]: unresolved import `gungraun_runner::api::ValgrindTool`
  --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/gungraun-summary-6.0.0/src/v6.rs:10:59
   |
10 |     CachegrindMetric, DhatMetric, ErrorMetric, EventKind, ValgrindTool,
   |                                                           ^^^^^^^^^^^^ no `ValgrindTool` in `api`

error[E0432]: unresolved imports `gungraun_runner::metrics::model::MetricsDiff`, `gungraun_runner::metrics::model::MetricsSummary`
  --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/gungraun-summary-6.0.0/src/v6.rs:12:63
   |
12 | pub use gungraun_runner::metrics::model::{Metric, MetricKind, MetricsDiff, MetricsSummary};
   |                                                               ^^^^^^^^^^^  ^^^^^^^^^^^^^^ no `MetricsSummary` in `metrics::model`
   |                                                               |
   |                                                               no `MetricsDiff` in `metrics::model`

error[E0432]: unresolved imports `gungraun_runner::summary::model::Diffs`, `gungraun_runner::summary::model::FlamegraphSummary`, `gungraun_runner::summary::model::ProfileInfo`, `gungraun_runner::summary::model::SummaryFormat`, `gungraun_runner::summary::model::SummaryOutput`, `gungraun_runner::summary::model::ToolMetricSummary`
  --> /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/gungraun-summary-6.0.0/src/v6.rs:14:38
   |
14 |     BenchmarkKind, BenchmarkSummary, Diffs, FlamegraphSummary, Profile, ProfileData, ProfileInfo,
   |                                      ^^^^^  ^^^^^^^^^^^^^^^^^                        ^^^^^^^^^^^ no `ProfileInfo` in `summary::model`
   |                                      |      |
   |                                      |      no `FlamegraphSummary` in `summary::model`
   |                                      no `Diffs` in `summary::model`
15 |     ProfilePart, ProfileTotal, Profiles, SCHEMA_VERSION, SummaryFormat, SummaryOutput,
   |                                                          ^^^^^^^^^^^^^  ^^^^^^^^^^^^^ no `SummaryOutput` in `summary::model`
   |                                                          |
   |                                                          no `SummaryFormat` in `summary::model`
16 |     ToolMetricSummary, ToolRegression,
   |     ^^^^^^^^^^^^^^^^^ no `ToolMetricSummary` in `summary::model`

    Checking alloc_tracker v0.7.12
For more information about this error, try `rustc --explain E0432`.
error: could not compile `gungraun-summary` (lib) due to 3 previous errors
warning: build failed, waiting for other jobs to finish...

-----

error: failed to build rustdoc for crate metabench v0.1.1
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/oxidizer/oxidizer/target/semver-checks/git-cb3ef36dc0942dc93017df934a3fcacfc7f451ad/5e0aa86380776f0db5a91dc7d93ae494706f69b9/crates/metabench &&
          cargo check &&
          cargo doc

error: aborting due to failure to build rustdoc for crate metabench v0.1.1

@codecov

codecov Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.0%. Comparing base (cb3ef36) to head (bdd6753).
⚠️ Report is 4 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #806      +/-   ##
==========================================
  Coverage   100.0%   100.0%              
==========================================
  Files         798      624     -174     
  Lines      119402    63305   -56097     
==========================================
- Hits       119402    63305   -56097     
Flag Coverage Δ
linux 100.0% <ø> (ø)
linux-arm 100.0% <ø> (ø)
scheduled ?
windows 100.0% <ø> (ø)

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.

- Distinguish PerThread (one instance per worker) from PerNuma (one per
  NUMA node, shared by workers on that node) in both the guide and the
  audit prompt; do not describe PerNuma as per-worker isolation.
- Refine the skip-audit rule to avoid false positives: only flag a
  #[thread_aware(skip)] that drops needed affinity. Exempt inert fields
  whose ThreadAware impl is an intentional no-op (primitives, String, fn
  pointers) and documented intentional process-wide shares
  (e.g. Arc<_, PerProcess>), which are recorded author decisions.
- Align the reviewer checklist with the refined skip rule (real affinity
  / meaningful relocate, not an inert no-op).
- Drop the docs.rs-rendered provenance note (AB#7982033, oxidizer_config)
  from the published module; the entry stands on its own and those refs
  are unresolvable to public crate readers.
Copilot AI balanced review requested due to automatic review settings October 13, 2026 13:39

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

Intentional documented sharing is inconsistently exempted, causing valid manual implementations to be reported as anti-patterns.

0 open findings

3 resolved since last review
Previously missed (2)

In code that hasn't changed since last review

Low severity Allow documented intentional sharing in manual implementations

.github/​prompts/​thread-aware-antipattern-audit.prompt.md:41

This exemption is currently limited to #[thread_aware(skip)], so the audit still reports a manual no-op implementation around a documented, intentionally shared lock. The authoring guide's reviewer checklist explicitly accepts intentional sharing when its contention is documented (crates/thread_aware/src/documentation/mod.rs:245-247). Extend the exemption to manual implementations as well to keep the prompt aligned with the guide.

Low severity Require intentionality before flagging shared-lock anti-patterns

crates/​thread_aware/​src/​documentation/​mod.rs:174

The three-sign test also classifies deliberately shared locks as this anti-pattern. That conflicts with the checklist below, which accepts intentional, documented cross-worker sharing (lines 245–247), and with the trait contract allowing usable slower state to be retained (crates/thread_aware_core/src/thread_aware.rs:61-64). Add intentionality as a fourth criterion so this section does not reject designs the checklist permits.

🧠 Review effort: Balanced

Comment thread .github/prompts/thread-aware-antipattern-audit.prompt.md Outdated
Extract the AI audit skill prompt from this PR. The anti-pattern it
detects is a *usage* concern that manifests in downstream consumer repos
(the known instance, oxidizer_config's View, lives in ox-sdk), so the
reusable audit skill is better hosted in the shared rust-dev tooling
plugin than in this library repo, where it would only surface for
oxidizer contributors. This PR now scopes to the authoring-guide
anti-pattern catalogue entry and reviewer checklist, which are
thread_aware's own documentation and belong here.

Refs AB#7947139.
Copilot AI balanced review requested due to automatic review settings October 13, 2026 15:24
@psandana Pato Sandaña (psandana) changed the title docs(thread_aware): add ThreadAware anti-pattern catalogue + reviewer checklist + audit skill (AB#7947139) docs(thread_aware): add ThreadAware anti-pattern catalogue + reviewer checklist (AB#7947139) Oct 13, 2026
@psandana

Copy link
Copy Markdown
Contributor Author

Heads-up for reviewers: I've extracted the AI audit prompt (.github/prompts/thread-aware-antipattern-audit.prompt.md) from this PR (commit 5059de1). The anti-pattern it detects manifests in downstream consumer repos (the known instance, oxidizer_config's View, is in ox-sdk), so the reusable audit skill is better hosted in the shared rust-dev tooling plugin than in this library repo. This PR now scopes to the authoring-guide anti-pattern catalogue entry + reviewer checklist, which are thread_aware's own docs. The earlier prompt-file review threads are therefore moot here; the prompt content is preserved for relocation.

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 anti-pattern criteria incorrectly include valid, intentionally process-wide shared state without first checking intent.

1 open finding

🧠 Review effort: Balanced

Comment thread crates/thread_aware/src/documentation/mod.rs
…B#7947139)

Address review on the anti-pattern catalogue: the three "nominally thread-aware,
actually shared-locked" signs could read as a verdict, but the ThreadAware
contract permits a no-op relocate when nothing is location-dependent and some
state is process-wide by design. Add a paragraph clarifying the signs mark a
suspect, not a defect, and that a documented, intentional process-wide share
(e.g. Arc<_, PerProcess> or a relocate whose comment records the decision) is
the reviewer-checklist exemption, not an anti-pattern. Aligns the catalogue with
the checklist's existing intent question.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5e0d5396-3a32-40ed-8870-241cd4929082
Copilot AI balanced review requested due to automatic review settings October 13, 2026 19:05

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

The documentation is consistent with the trait contract and correctly distinguishes intentional sharing from problematic contention.

0 open findings

1 resolved since last review

🧠 Review effort: Balanced

@sgalkin Sergey Galkin (sgalkin) 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.

Reviewed with no blocking concerns.

🤖 Co-authored with Copilot.

@psandana
Pato Sandaña (psandana) merged commit d1585d9 into main Oct 14, 2026
40 checks passed
@psandana
Pato Sandaña (psandana) deleted the u/psandana/thread-aware-antipattern-catalogue branch October 14, 2026 12:20
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.

6 participants