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 property-testing-fit-assessmentgit 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/property-testing-fit-assessment)<a href="https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/property-testing-fit-assessment"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/property-testing-fit-assessment/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/property-testing-fit-assessment"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/property-testing-fit-assessment.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.00062 | $0.01642 |
| Opus 5 | $0.00031 | $0.00821 |
| Sonnet 5 | $0.00012 | $0.00328 |
| Haiku 4.5 | $0.00006 | $0.00164 |
Grade A, and why
property-testing-fit-assessment scanned grade A with 0 findings 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 8d 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.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 44 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Property testing fit assessment
Contract
| Field | Bound contract |
|---|---|
| Trigger | The user asks whether property-based testing fits a code path, which property and library to choose, or whether an existing design exposes a meaningful property. |
| Authority | Read-only: inspect source, tests, and manifests. Never edit files, change VCS state, install dependencies, or perform package-manager or network mutations. |
| Side effect | Chat output only: one fit assessment. Dependency adoption and any production refactor remain the user's decisions; offer them at most once and never carry them out. |
| Done | The response names a grounded property, domain, strategy seam, and existing-or-proposed library with consent boundaries, or explains why example tests are the better method. |
Inputs
- The code path in question (required). Without it there is nothing to assess.
- Tests covering that path (expected; their absence is assessment evidence, not a blocker).
- The dependency manifest and test files of the enclosing project (required for the library verdict; they reveal an existing PBT library).
- Optional: the target language or stack when not evident from the code, and any written invariants or specifications the user wants honored.
Procedure
- Bound the assessment to the named code path and its direct tests. Read the implementation and every test that exercises it. Assess additional paths only when the user names them; never sweep the module. Done when: the assessment is bounded to the named path and its direct tests are read.
- Detect an existing PBT library before proposing anything. Search tests and manifests for
hypothesis,fast-check,proptest,quickcheck,pgregory.net/rapid,net.jqwik,ScalaCheck,FsCheck,StreamData,test.check,PropCheck,Kotest,RapidCheck,SwiftCheck,echidna_, andinvariant_. A hit names the recommendation and forbids proposing a second library. Done when: an existing PBT library is detected or confirmed absent. - Read the algebraic shape of the code against the catalog: roundtrip
decode(encode(x)) == x; inversef(g(x)) == x; oraclenew(x) == reference(x); idempotencef(f(x)) == f(x); invariant holding before and after a transformation; easy-to-verifyis_sorted(sort(x)); commutativityf(a, b) == f(b, a); associativityf(f(a, b), c) == f(a, f(b, c)); identityf(x, e) == x. Done when: the algebraic shape is read against the catalog. - Select the strongest property the code supports on the ordering
no crash → type preservation → invariant → idempotence → roundtrip / oracle. "No crash" alone does not justify a library. Before settling for it, decide whether the shape is missing or merely buried: a calculation wrapped in I/O, a string built by concatenation, an in-place mutation, and a value read from a global or the environment each hold a property with no seam to assert it through. In the buried case, name exactly one rearrangement — extract the pure core, add the inverse, split a structured value from its renderer, return a value instead of mutating, or inject the bound as a parameter — state the property it unlocks, and mark it as the user's production-code decision. Never propose refactoring as part of the assessment. Done when: the strongest property is selected, or the shape is identified as buried with one rearrangement named as the user's decision. - Vacuity-check the candidate before naming it. Reject a tautology that restates the implementation (
add(a, b) == a + b); no bug it shares with the code can fail it.f(x) == f(x)is a genuine determinism property only when purity is not obvious — serializers over unordered containers, hashing, anything reading the clock. Reject anassume()filter that discards nearly every generated input or is self-contradictory; the valid domain must be produced by the strategy itself, and the verdict must name that strategy as the domain. For Solidity: type bounds are compiler guarantees, not properties (uint256is never negative;address(this).balance >= 0is always true); a property over state no call sequence can reach is vacuous until coverage output shows otherwise. Done when: the candidate passes vacuity-check or is rejected with the specific reason. - Name the library. An existing one from step 2 wins outright. Otherwise use the language default: Python Hypothesis; TypeScript or JavaScript fast-check; Rust proptest; Go rapid; Java jqwik; Scala ScalaCheck; C# FsCheck; Elixir StreamData; Haskell QuickCheck; Clojure test.check; Ruby PropCheck; Kotlin Kotest; C++ RapidCheck; Swift SwiftCheck only after checking it is still maintained. For EVM contracts: Echidna by default, Medusa when parallel or coverage-guided execution matters; state whether the property is property mode (a
boolfunction that must never become false) or assertion mode (anassertinside a fuzzer-callable function), chosen by where the property lives. Done when: the library is named (existing or language default). - Deliver the verdict. Recommend PBT when steps 3–6 produced a non-vacuous property stronger than "no crash": state the property, domain, strategy seam, and library; when a new dependency or the step-4 refactor is needed, offer it once bound to that specific property and accept either answer as final. Decline when the only reachable property is "no crash" after the buried-shape check, or the code has no computable relation to constrain: example tests are the better method, and saying so plainly is a correct outcome. Never implement either path. Done when: the verdict is delivered (recommend with property/domain/seam/library, or decline with reason).
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.
- 8d ago First seen · 44 lines · 62 tokens per session scan A 1f8bbaa09d0c
property-testing-fit-assessment is a skill published in the GitHub repository OutlineDriven/odin-claude-plugin (36 stars, last pushed 3d ago), licensed Apache-2.0. It adds 62 tokens to every session and 1,642 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-04.
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…
chat-pet-sprite-creation
Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.
cpu-profile-analysis
Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…
insight-error-page
Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…