Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audits Rust code for unsafe blocks, ownership issues, and Cargo dependency risks. Use when reviewing Rust code or before merging Rust changes.
.claude/skills/athola-rust-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 200% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 95% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 101% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 97% | 0% |
| case-09 | ✓→✓ | = Same ✓ | 155% | 0% |
Expert-level Rust code audits with focus on safety, correctness, and idiomatic patterns.
bash/rust-review
Verification: Run the command with --help flag to verify availability.
rust-review:ownership-analysisrust-review:error-handlingrust-review:concurrencyrust-review:unsafe-auditrust-review:cargo-depsrust-review:native-modelingrust-review:idiomatic-elisionrust-review:coercion-paramsrust-review:conversion-traitsrust-review:numeric-cast-safetyrust-review:mutable-static-auditrust-review:match-wildcardrust-review:transmute-auditrust-review:float-equalityrust-review:mem-forget-auditrust-review:repr-packed-auditrust-review:evidence-logrust-review:findings-verifiedLoad modules as needed based on review scope:
Quick Review (ownership and errors):
modules/ownership-analysis.md for borrowing and lifetime analysismodules/error-handling.md for Result/Option patternsConcurrency Focus:
modules/concurrency-patterns.md for async and sync primitivesSafety Audit:
modules/unsafe-audit.md for unsafe block documentationmodules/mutable-static-audit.md for static mut globals andtheir thread-safe replacements
modules/numeric-cast-safety.md for truncating andprecision-losing as casts
modules/match-wildcard.md for catch-all arms that defeat enumexhaustiveness
modules/transmute-audit.md for mem::transmute/transmute_copycalls that reinterpret bytes with no layout check
modules/repr-packed-audit.md for #[repr(packed)] layouts whosefield borrows become unaligned references
Correctness Audit:
modules/float-equality.md for ==/!= against float literalsmodules/mem-forget-audit.md for mem::forget leaks and no-opdrop(&x) reference drops
Dependency Review:
modules/cargo-dependencies.md for vulnerability scanningIdiomatic Patterns:
modules/builtin-preference.md for conversion traits and builtin preferencemodules/native-type-modeling.md for enums-over-primitives,newtype, type-state, and derived ordering
modules/idiomatic-elision.md for lifetime elision,expression-oriented returns, and explicit -> () unit returns
modules/coercion-params.md for &String/&Vec<T>/&PathBufparameters that defeat deref coercion (prefer &str/&[T]/&Path)
modules/conversion-traits.md for impl Into that should beimpl From, and discarded try_into().unwrap() conversion errors
static mut globals; shared state uses OnceLock/LazyLock,atomics, or a Mutex/RwLock
mem::transmute/transmute_copy; bytes converted withfrom_le_bytes/from_bits/bytemuck or pointers with .cast()
#[repr(packed)] fields copied out before borrowing (no unalignedreferences)
mem::forget leaks (use ManuallyDrop/scope) and no no-opdrop(&x) reference drops
mlock/munlock calls: RLIMIT verified, page-aligned,ENOMEM handled
as casts (length truncation, as u8/i8, as f32)replaced with TryFrom/From
_ => unreachable!()/panic!/{}catch-alls
==/!= against afloat literal
validating constructor) or type-state where warranted
'_ in pathsreturn dropped in favor of the tail expression-> () unit returns dropped (default is elided)&str/&[T]/&Path, not &String/&Vec<T>/&PathBuf (deref coercion accepts both, so the slice is more general)
From/TryFrom, not Into/TryInto; afallible conversion's error is propagated, not unwrap()ped
markdown## Summary Rust audit findings ## Ownership Analysis [borrowing and lifetime issues] ## Error Handling [error patterns and issues] ## Concurrency [async and sync patterns] ## Unsafe Audit ### [U1] file:line - Invariants: [documented] - Anchor: `verbatim source text at file:line` - Risk: [assessment] - Recommendation: [action] ## Native Type Modeling [stringly-typed comparisons, boolean blindness, newtype/type-state notes] ## Idiomatic Elision [needless lifetimes, trailing returns, explicit `-> ()` unit returns] ## Coercion Params [`&String`/`&Vec<T>`/`&PathBuf` params that should be borrowed slices] ## Conversion Traits [`impl Into` over `impl From`; discarded `try_into().unwrap()` errors] ## Numeric Cast Safety [length-truncating, byte-narrowing, and f32 precision-losing `as` casts] ## Mutable Static Audit [`static mut` globals and their thread-safe replacements] ## Match Wildcard [catch-all `_ =>` arms that defeat enum exhaustiveness] ## Transmute Audit [`mem::transmute`/`transmute_copy` calls and their typed replacements] ## Float Equality [exact `==`/`!=` comparisons against float literals] ## Mem Forget Audit [`mem::forget` leaks and no-op `drop(&x)` reference drops] ## Repr Packed Audit [`#[repr(packed)]` layouts whose field borrows become unaligned] ## Dependencies [cargo audit results] ## Recommendation Approve / Approve with actions / Block
Verification: Run the command with --help flag to verify availability.
rust-review:findings-verified)Write findings to .review/findings.json and run the citation verifier as Skill(imbue:review-core) Step 5 describes. Only findings the verifier passes enter the report. Drop or label UNVERIFIED the rest.
Location + verbatim Anchor confirmed by citation_verifier.py (exit 0), or unverified findings were dropped or labeled UNVERIFIED| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | fail→fail | 34,298 | 32,436 | -5% | 1 | 1 | 0% | 6,229 | 8,592 | +38% | 0 | 0 | — |
case-01 | fail→fail | 35,032 | 5,970 | -83% | 1 | 1 | 0% | 6,235 | 2,565 | -59% | 0 | 0 | — |
case-03 | fail→fail | 35,633 | 6,026 | -83% | 1 | 1 | 0% | 6,253 | 2,579 | -59% | 0 | 0 | — |
case-04 | fail→pass | 9,011 | 11,345 | +26% | 1 | 1 | 0% | 1,377 | 4,128 | +200% | 0 | 0 | — |
case-05 | fail→fail | 8,420 | 7,174 | -15% | 1 | 1 | 0% | 1,333 | 3,398 | +155% | 0 | 0 | — |
case-06 | fail→fail | 9,173 | 4,520 | -51% | 1 | 1 | 0% | 1,571 | 2,990 | +90% | 0 | 0 | — |
case-07 | pass→pass | 10,507 | 7,590 | -28% | 1 | 1 | 0% | 1,807 | 3,627 | +101% | 0 | 0 | — |
case-08 | pass→pass | 10,613 | 8,567 | -19% | 1 | 1 | 0% | 1,839 | 3,617 | +97% | 0 | 0 | — |
case-09 | pass→pass | 7,904 | 6,832 | -14% | 1 | 1 | 0% | 1,393 | 3,549 | +155% | 0 | 0 | — |
case-10 | pass→pass | 8,410 | 7,280 | -13% | 1 | 1 | 0% | 1,377 | 3,517 | +155% | 0 | 0 | — |
case-11 | pass→pass | 10,971 | 9,128 | -17% | 1 | 1 | 0% | 2,053 | 3,948 | +92% | 0 | 0 | — |
case-12 | pass→pass | 11,082 | 7,968 | -28% | 1 | 1 | 0% | 2,021 | 3,704 | +83% | 0 | 0 | — |
case-13 | pass→pass | 8,724 | 7,831 | -10% | 1 | 1 | 0% | 1,444 | 3,590 | +149% | 0 | 0 | — |
case-14 | fail→pass | 15,016 | 13,559 | -10% | 1 | 1 | 0% | 2,511 | 4,909 | +95% | 0 | 0 | — |
case-15 | pass→pass | 8,983 | 14,462 | +61% | 1 | 1 | 0% | 1,544 | 3,598 | +133% | 0 | 0 | — |
case-16 | pass→pass | 12,148 | 9,205 | -24% | 1 | 1 | 0% | 2,222 | 3,950 | +78% | 0 | 0 | — |
case-17 | pass→pass | 8,976 | 5,334 | -41% | 1 | 1 | 0% | 1,615 | 3,190 | +98% | 0 | 0 | — |
case-18 | pass→pass | 13,067 | 12,379 | -5% | 1 | 1 | 0% | 2,434 | 4,530 | +86% | 0 | 0 | — |
case-19 | pass→pass | 12,930 | 11,736 | -9% | 1 | 1 | 0% | 2,215 | 4,249 | +92% | 0 | 0 | — |
case-20 | pass→pass | 13,188 | 7,723 | -41% | 1 | 1 | 0% | 2,381 | 3,665 | +54% | 0 | 0 | — |
case-21 | pass→pass | 5,299 | 4,666 | -12% | 1 | 1 | 0% | 900 | 3,173 | +253% | 0 | 0 | — |
case-22 | pass→pass | 13,317 | 8,704 | -35% | 1 | 1 | 0% | 2,295 | 3,818 | +66% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +9 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.