tokio-async-code-review — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited tokio-async-code-review (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.
full, rt-multi-thread, macros, sync, etc.). Missing features cause confusing compile errors.#[tokio::main] or manual runtime construction used? Multi-thread vs current-thread?std::fs, std::net, std::thread::sleep, CPU-heavy loops in async functions.Complete in order for the review scope. Do not assert Critical or Major until the relevant gate passes.
Cargo.toml that supplies tokio. Pass: Written note of tokio version and enabled features, or explicit statement that there is no direct tokio dependency and where it comes from (workspace/path).#[tokio::main], Runtime::builder, tests, or library with no owned runtime). Pass: One line naming flavor (multi_thread / current_thread / tests-only / none) and where it is defined.std::fs::, std::net:: without async wrappers, std::thread::sleep, heavy CPU loops in async fn). Pass: Each hit listed as path:line (or tool output excerpt), or explicit “no blocking patterns found in reviewed async code” after the search.Report findings as:
[FILE:LINE] ISSUE_TITLE
Severity: Critical | Major | Minor | Informational
Description of the issue and why it matters.| Issue Type | Reference |
|---|---|
| Task spawning, JoinHandle, structured concurrency | references/task-management.md |
| Mutex, RwLock, Semaphore, Notify, Barrier | references/sync-primitives.md |
| mpsc, broadcast, oneshot, watch channel patterns | references/channels.md |
| Pin, cancellation, Future internals, select!, blocking bridge | references/pinning-cancellation.md |
multi_thread for I/O-bound, current_thread for simpler cases)#[tokio::test] used for async tests (not manual runtime construction)spawn return values (JoinHandle) are tracked, not silently droppedspawn_blocking used for CPU-heavy or synchronous I/O operationsCancellationToken, select!, or shutdown channels)JoinError (task panic or cancellation) is handled, not just unwrappedtokio::select! branches are cancellation-safeasync fn in traits used instead of async-trait crate where possible (stable since Rust 1.75)-> impl Future now captures all in-scope lifetimes in edition 2024tokio::sync::Mutex used when lock is held across .await; std::sync::Mutex for short non-async sectionsSemaphore used for limiting concurrent operations (not ad-hoc counters)RwLock used when read-heavy workload (many readers, infrequent writes)Notify used for simple signaling (not channel overhead)std::sync::LazyLock used instead of once_cell::sync::Lazy or lazy_static! for runtime-initialized singletons (stable since Rust 1.80)if let lock guard patterns reviewed for edition 2024 temporary scoping — temporaries drop earlier, may change borrow validitySendError / RecvError handled (indicates other side dropped)Lagged errors handled (receiver fell behind)tokio::time::sleep used instead of std::thread::sleeptokio::time::timeout wraps operations that could hangtokio::time::interval used correctly (.tick().await for periodic work)std::fs::read, std::net::TcpStream) in async context without spawn_blocking.await point (deadlock potential)std::thread::sleep in async function (blocks runtime thread)JoinHandle silently dropped (lost errors, zombie tasks)select! cancellation safety considerationtokio::spawn for trivially small async blocks (overhead > benefit)#[tokio::main] sufficesstd::sync::Mutex where contention is high enough to benefit from tokio's async mutextokio-util utilities (e.g., CancellationToken)JoinSetasync-trait crate to native async fn in traitsonce_cell / lazy_static to std::sync::LazyLock#[expect(lint)] instead of #[allow(lint)] for self-cleaning suppression.await is inside the lockdyn dispatch cases#[allow], warns when suppression is no longer neededAfter Gates, apply the review-verification-protocol skill to every reported issue (evidence and dispositions per that skill).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.