SKILL.md
Target
$ARGUMENTS
Audit Rust code quality. Report issues in organized format, then offer to fix.
Audit Categories
1. Clippy Violations
- All clippy warnings must be addressed, not silenced
- Use
#[expect(...)]with comment if truly necessary, never bare#[allow(...)] - Check for missing workspace lint config in Cargo.toml
2. Borrowing & Cloning
Red flags:
.clone()inside loops - use.cloned()or.copied()on iterator.clone()on large types (Vec<T>,HashMap<K,V>)- Clone when borrow would work -
fn process(s: String)vsfn process(s: &str) &Vec<T>instead of&[T]&Stringinstead of&str- Cloning reference args when caller should pass ownership
Prefer:
- Borrow over clone
&stroverStringin params&[T]over&Vec<T>in paramsimpl AsRef<T>for flexible APIs
3. Option/Result Handling
Red flags:
.unwrap()or.expect()in non-test codematchfor simple Ok/Err -> Some/None conversions (use.ok(),.ok_or())- Manual match that could be
let Ok(x) = expr else { return } if let Some(x) = ... { x } else { default }instead of.unwrap_or()
Prefer:
?for error propagationlet Ok(x) = expr else { return Err(...) }for early returns.okorelse()/.maporelse()when allocation neededthiserrorfor library errors,anyhowonly for binaries
4. Iterator Patterns
Red flags:
- Collecting just to iterate again -
.collect::<Vec<_>>()thenfor x in vec - Manual loops that could be
.filter().map().collect() .fold()for simple sums (use.sum())- Missing
.iter()vs.into_iter()awareness (prefer.iter()forCopytypes)
Prefer:
- Pass iterators directly when possible
- Lazy evaluation - don't collect until needed
.enumerate()over manual index tracking
5. Error Handling
Red flags:
panic!in library code (useResult)Box<dyn Error>in library APIs (usethiserror)- Missing
# Errorsdoc section on fallible functions anyhowin library code
Prefer:
thiserrorwith descriptive error variants- Error hierarchies with
#[from]for wrapping ?over verbose match chainsinspect_err()for logging
6. Performance Anti-patterns
Red flags:
- Unnecessary heap allocation (
Boxwhen stack works) #[inline]without benchmark proof- Large stack allocations (arrays > 64KB)
Box<dyn Trait>whenimpl Traitworks- Early allocation in
or,mapor,unwrapor(use_elsevariants)
Prefer:
impl Trait(static dispatch) overdyn Traitwhen possibleCow<'_, str>for maybe-owned data- Benchmark before optimizing
7. Comments & Documentation
Red flags:
- Comments explaining "what" not "why"
// TODOwithout issue link- Stale/misleading comments
- Missing
///docs on public items - Missing
# Examples,# Errors,# Panicssections
Prefer:
- Let code speak - extract functions over comments
- Link to ADRs/issues for context
- Doc tests as living examples
8. Type System
Red flags:
- Runtime state checks that could be compile-time (type state pattern)
Option<T>fields for required builder params- Missing
#[non_exhaustive]on public enums dyn TraitwithoutSend + Syncin async contexts
Prefer:
- Type state pattern for state machines
- Compile-time guarantees over runtime checks
PhantomDatafor zero-cost type markers
9. Rust Slop (AI/verbose cruft)
Red flags:
- Defensive code for impossible cases
- Over-engineered abstractions for one-time use
- Verbose intermediate variables adding nothing
- Interfaces with single implementations
- Factory patterns for simple construction
Output Format
# Rust Quality Audit: [path]
## Critical (must fix)
- [file:line] Category: Description
## Warnings (should fix)
- [file:line] Category: Description
## Suggestions (consider)
- [file:line] Category: Description
## Summary
- X critical, Y warnings, Z suggestions
- Key patterns to address: ...
After reporting, ask: "Fix issues? (all / critical only / skip)"