RUST DIAGNOSTICS LIFECYCLE FRAMEWORK // v0.8
Make every failure legible.
diagprint defines a diagnostic once, then carries it through the terminal, compiler tooling, editors, CI, code scanning, guarded remediation, verification, telemetry and forensic history. One structure, every surface.
01 / LIFECYCLE
Not a red line.
A lifecycle.
Most error libraries stop at printing. diagprint keeps the same structured diagnostic alive from the moment you define it to the day you ask why it came back.
02 / DIAGNOSTIC LAB
Break this config.
Watch it explain itself.
Edit the file. A browser-side model of diagprint's pipeline scans it, renders the same diagnostics to six surfaces, and runs guarded fixes, including rejecting a stale one. The real work happens in Rust; this lab is a faithful sketch you can poke.
Only machine_applicable edits are applied. Everything else stays a suggestion.
03 / SURFACES
Render once.
Land everywhere.
The same diagnostic data renders to humans, machines, pipelines and editors. Primary and secondary labels stay structurally distinct all the way through.
04 / SAFETY MODEL
Explain freely.
Mutate under guard.
Diagnostics may explain and propose. Mutation must be explicit, structured, validated, and reject uncertainty.
Suggested shell commands are never executed. Verification is declarative, and replay never re-applies edits.
Stale edits are rejected, not guessed. Revision-aware rendering fails closed when source identity no longer matches.
No crash-atomic claims. Multi-file plans validate, keep recovery state and roll back observed failures, and say so plainly.
05 / DIAGNOSTIC FORENSICS
Not just what broke.
What it has been doing.
Scan history is hash-chained. Each run seals the one before it, so a case file can prove its own evidence. The chain below is hashed live in your browser with SHA-256. Edit any run and watch verification catch it.
06 / ECOSYSTEM
Speaks every
error dialect.
A workspace of focused crates, plus structured bridges to the libraries your code already uses. Bridges keep relationships intact instead of flattening them into strings.
07 / QUICK START
Ten lines to
your first diagnostic.
Rust 2024, MSRV 1.85. Every optional feature is off by default. Tick the ones you want and the manifest writes itself.
use diagprint::{Reporter, Severity};
fn main() -> std::io::Result<()> {
let reporter = Reporter::builder()
.application("myapp")
.min_severity(Severity::Info)
.build()?;
let diagnostic = reporter
.error("Network initialization failed")
.code("NET-001")
.cause("failed to open network interface")
.note("fallback networking is unavailable")
.help("check interface permissions and driver state");
reporter.emit(&diagnostic)?;
Ok(())
}
FEATURE FLAGS click to toggle