programming-rust — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited programming-rust (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Write Rust with explicit ownership, meaningful errors, and small APIs. As of 2026-10: stable Rust is 1.99 (2026-10-01) and the current edition is 2024. Read rust-toolchain.toml, Cargo edition, rust-version (minimum supported Rust version, MSRV), features, and CI targets before choosing syntax or dependencies. Recheck official releases when updating; a newer compiler does not authorize raising the project's MSRV or changing its edition.
Make invalid states difficult to construct and make each resource's owner visible. Borrow for temporary access; own data when it must outlive the call. Choose the simplest representation that expresses the lifecycle, including a straightforward clone when independent ownership is needed.
cargo fix --edition) and review generated changes separately from feature work.if let / while let chains (if let Some(x) = a && x > 0, 1.88+); use them to flatten nested matches. Async closures (async || {}, 1.85+) replace closures returning async blocks when the future borrows captured state.resolver = "3", the default for edition 2024) prefers dependency versions compatible with rust-version; keep rust-version accurate so lockfile updates don't silently require a newer compiler.format_into with NumBuffer, useful for measured formatting hotspots. Its floating-point algebraic_* methods permit reassociation and nondeterministic results; ordinary arithmetic remains appropriate when reproducibility matters. Rust 1.99 stabilizes defining C-variadic functions and Vec::into_parts/from_parts; prefer Box::into_non_null/into_raw over Box::leak when the memory will later be freed.&str, &[T], and &Path for borrowed reads; accept owned values when the function retains or transfers them. Borrowed struct fields are useful for views with clear lifetimes, but owned fields simplify independently stored records.pub(crate) or pub deliberately. Split crates for independent reuse, dependency boundaries, or deployment needs, not by default.dyn Trait for runtime heterogeneity; neither is universally superior.Rc/Arc for shared ownership and a suitable synchronization primitive for mutation. Reference counting alone does not make shared mutation safe. Use Cow when mixed borrowing/ownership materially simplifies an API.Result for recoverable failures and Option for expected absence. Propagate with ?; don't convert failed parsing, I/O, or configuration into an empty collection or default value unless that behavior is the documented contract.Error::source; existing thiserror or application context libraries can reduce boilerplate, but a new dependency is not mandatory.expect for proven invariants and explain why they hold; external input is not an invariant. Use #[non_exhaustive] on public enums intended to grow, understanding that it requires downstream wildcard handling.unsafe localized behind a safe interface, with explicit safety arguments covering aliasing, validity, lifetime, and synchronization. A passing compiler is not an unsafe-code proof..await; use an async mutex when holding a lock across awaits is required. Actors fit asynchronously managed resources, not every shared value.select!, losing branch futures owned by the expression are dropped; borrowing an externally retained future does not drop its underlying operation. Check cancellation safety and retain partial protocol state outside cancellable futures when needed.Reject zero and malformed values instead of silently substituting a worker count:
use std::num::{NonZeroUsize, ParseIntError};
fn parse_workers(input: &str) -> Result<NonZeroUsize, ParseIntError> {
input.parse()
}~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.