Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add OutlineDriven/odin-claude-plugin --skill rust-formal-verificationgit clone --depth 1 https://github.com/OutlineDriven/odin-claude-pluginWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/rust-formal-verification)<a href="https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/rust-formal-verification"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/rust-formal-verification/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/rust-formal-verification"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/rust-formal-verification.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00051 | $0.02195 |
| Opus 5 | $0.00026 | $0.01097 |
| Sonnet 5 | $0.00010 | $0.00439 |
| Haiku 4.5 | $0.00005 | $0.00219 |
Grade A, and why
rust-formal-verification scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
The crate, the functions in scope, and the properties: absence of panics and overflow, memory safety of `unsafe` blocks, or functional pre- and postconditions. Tool pins from the grounded set: Kani kani-0.67.0 (`cargo in How it starts
The opening of the file, as written. The whole thing — 38 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Rust formal verification
Contract
| Field | Bound contract |
|---|---|
| Trigger | A Rust function or module needs bounded model checking (Kani) or deductive verification (Verus, Creusot) against explicit properties, or an existing harness fails and its counterexample must be read. |
| Authority | Reversible local: writes proof harnesses, contract attributes, and spec functions inside the crate, plus a Cargo.toml dev-dependency or feature for the verifier; rollback is reverting those files. No remote mutation. |
| Side effect | Harness and annotation source in the crate, the verifier's build artifacts under target/, and for Kani concrete-playback unit tests when requested. |
| Done | Every named property has a harness or contract that the chosen tool reports as passing under a recorded bound, or a counterexample mapped to a code defect and a fix. |
Inputs
The crate, the functions in scope, and the properties: absence of panics and overflow, memory safety of unsafe blocks, or functional pre- and postconditions. Tool pins from the grounded set: Kani kani-0.67.0 (cargo install --locked kani-verifier && cargo kani setup; Kani tracks a pinned Rust nightly, not stable), Verus rolling release release/0.2026.08.30.b432e82 (download the release zip from GitHub Releases and run ./verus, which installs its pinned toolchain through rustup when missing), Creusot v0.13.0 (git clone the repo and run ./INSTALL, which needs cargo, opam, and curl, and installs why3 and why3find provers). Optional: an unwind bound per loop, and a solver choice.
Procedure
- Pick the tool by the property. Kani answers "does this code panic, overflow, or violate memory safety for any input up to a bound" and needs no specification language, so it is the default. Verus answers "does this function meet its
requiresandensuresfor all inputs" and needs the code written inside theverus!macro withspec fnandproof fnalongsideexec fn. Creusot answers the same question for ordinary Rust with#[requires]and#[ensures]attributes and discharges obligations through Why3. Prusti is a deprioritized fallback: its last release isv-2024-03-26-1504(2024-03-26), so reach for it only when a codebase already carries Prusti annotations. Done when: one tool is named with the property class that chose it. - Write a Kani harness. Add
kanias a conditional import and write, next to the code under test,#[kani::proof] fn check_name() { let x: u32 = kani::any(); kani::assume(x < 1000); let r = f(x); assert!(r <= x); }.kani::any()yields every value of the type;kani::assumenarrows the domain and is the harness precondition;assert!is the property. Add#[kani::unwind(N)]on a harness whose code loops, with N large enough that the unwinding assertion passes; Kani then reports whether the bound covers every iteration the inputs allow. Usekani::cover!(cond, "msg")to confirm a branch is reachable, so anassumehas not emptied the input space. For a function expected to panic, mark the harness#[kani::should_panic]. Done when: the harness compiles undercargo kani --harness check_nameand at least onecoverisSATISFIED. - Run Kani and read the result.
cargo kaniruns every harness;--harness NAMEruns one;--default-unwind Nsets a global loop bound;--output-format terseshortens the report. The report listsCheck N: <harness>.<class>.<n>blocks, each withStatus: SUCCESS|FAILURE|UNREACHABLE|UNDETERMINED, aDescription, and aLocation, then aSUMMARYand the final lineVERIFICATION:- SUCCESSFULorVERIFICATION:- FAILED. AFAILUREwhose description is an unwinding assertion means the bound is too small, not that the code is wrong; raiseunwindand rerun. AFAILUREon an assertion, overflow, or pointer check at a source location is a defect candidate. Turn it into a test withcargo kani --harness NAME -Z concrete-playback --concrete-playback=print, which prints a Rust unit test with the concrete inputs;inplacewrites it next to the harness. Run that test under plaincargo testto confirm the failure is real. Done when: every check isSUCCESSor its failure is reproduced by a concrete test. - Add Kani contracts when the bound does not scale. With
-Z function-contracts, annotate the callee with#[kani::requires(...)]and#[kani::ensures(|result| ...)], verify the contract with a#[kani::proof_for_contract(f)]harness, and let callers use#[kani::stub_verified(f)]so their harnesses see the contract instead of the body. With-Z loop-contracts, write#[kani::loop_invariant(cond)]above a loop to replace unwinding with an inductive argument. Done when: the caller's harness passes without an unwind bound on the stubbed callee. - Write and run Verus. Wrap the module in
verus! { ... }. Give eachexec fnitsrequiresandensuresclauses; write the pure logic asspec fnwithintandnat, and give every recursivespec fnadecreasesclause. Move helper reasoning intoproof fnlemmas and call them from the code. Useassert(P) by { ... }to scope a local sub-proof so onlyPsurvives into the context. Runverus file.rs; add--verify-module mor--verify-function fto narrow the run,--expand-errorsto have Verus split a failing postcondition into the conjunct that fails,--rlimit Nto change the SMT resource limit (default 10), and--timeto see where verification time goes. Success printsverification results:: N verified, 0 errors; a failure is a rustc-styleerror: ... failedwith a source span. Exit code is 0 on success and 1 on any verification or compile error. Done when: the module reports zero errors, or the failing conjunct is named by--expand-errorsand traced to code or spec. - Write and run Creusot. Annotate with
#[requires(...)],#[ensures(...)], loop#[invariant(...)], and#[variant(...)]for termination;#[trusted]skips a body and is a stated assumption, so list every use in the output. Inside Pearlite specs,@views a Rust value as its mathematical model (x@for an integer),^is the final value of a mutable borrow, and==>is implication. Runcargo creusotto compile the crate to Coma and run the provers;--only=comaskips proving and--only=proveskips compilation. On an unproved goal, open the Why3 IDE withcargo creusot -i(or--ide-always) and step through the goal to find the missing invariant or lemma. Done when: every goal is proved, or the unproved goal is named with the invariant that is missing. - Record the result. For Kani, write the unwind bound and the solver beside each harness; a pass at
unwind(8)is a proof for inputs within that bound, and nothing beyond. For Verus and Creusot, list every#[trusted]body and every assumption the tool admitted without proof; each one is an obligation the reader must accept. Done when: the output names the bound and the trust set for each property.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 38 lines · 51 tokens per session scan A bc27807c29c2
rust-formal-verification is a skill published in the GitHub repository OutlineDriven/odin-claude-plugin (35 stars, last pushed yesterday), licensed Apache-2.0. It adds 51 tokens to every session and 2,195 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-06.
Other skills, from other repositories
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
next-cache-components-optimizer
Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components / PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next/playwright instant() e2e and work it to green, one verified route at a time; the shipped test then…
next-partial-prefetching-adoption
Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the partialPrefetching flag, opt routes in with export const prefetch = 'partial', audit Link prefetch={true} behavior, preserve existing prefetched UI with…
chronicle
Analyze Copilot session history for standup reports, usage tips, session search, and session reindexing. Use when the user asks for a standup, daily summary, usage tips, workflow recommendations, wants to search or find past sessions by keyword/file/PR, wants to reindex their session store, or asks about deleting…