What it does
Catches the async-specific failure modes that synchronous tests miss:
- Futures that never complete
- Tasks that get dropped without cleanup
- Shutdown sequences that hang
- Blocking calls inside async paths
- Unbounded task growth
All output flows through dev-report so AI agents and CI gates can act
on it without parsing logs.
Quick start
[]
= "0.9"
= { = "1", = ["macros", "rt-multi-thread"] }
Opt-in features:
[]
= { = "0.9", = ["block-detect"] }
use ;
use Duration;
async
The returned CheckResult carries the async tag, plus
timeout/task_panicked/regression tags on failure paths, plus
numeric Evidence for timeout_ms and (on Pass) elapsed_ms.
Deadlock detection
use try_mutex_lock_with_timeout;
use Arc;
use Duration;
use Mutex;
# async
Task leak detection
use TrackedTaskGroup;
use Duration;
# async
Graceful shutdown
use ;
use Duration;
# async
Blocking-call detection (opt-in)
use detect_blocking;
use Duration;
# async
The detector flags Warn with a blocking_suspected tag if any
single poll exceeds the threshold. Heuristic: a long pure-CPU
section also looks like blocking from this detector's perspective.
Producer trait
dev-report::Producer is sync. For async harnesses, this crate
provides the AsyncProducer trait and a BlockingAsyncProducer
adapter that satisfies Producer by calling block_on from a
sync context.
use ;
use ;
use Duration;
let rt = new.unwrap;
let handle = rt.handle.clone;
let producer = new;
let _report = producer.produce;
Status
v0.9.x is the pre-1.0 stabilization line. APIs are expected to be
near-final; minor adjustments may still happen ahead of 1.0. The
timeout / cancellation contract (REPS § 4-5) will not change.
Minimum supported Rust version
1.85 — pinned in Cargo.toml via rust-version and verified by
the MSRV job in CI. (Bumped from 1.75 to align with the suite's
shared MSRV after sibling crates picked up dependencies that require
edition2024.)
License
Apache-2.0. See LICENSE.