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 testing-handbook-generatorgit 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/testing-handbook-generator)<a href="https://agentmods.dev/skills/outlinedriven/odin-claude-plugin/testing-handbook-generator"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/testing-handbook-generator/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/testing-handbook-generator"><img src="https://agentmods.dev/badge/skills/outlinedriven/odin-claude-plugin/testing-handbook-generator.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.00044 | $0.01886 |
| Opus 5 | $0.00022 | $0.00943 |
| Sonnet 5 | $0.00009 | $0.00377 |
| Haiku 4.5 | $0.00004 | $0.00189 |
Grade A, and why
testing-handbook-generator 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 5d 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 — 66 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Testing handbook skill generator
Contract
| Field | Bound contract |
|---|---|
| Trigger | User wants to discover, generate, refresh, or validate skills from the Trail of Bits Testing Handbook or appsec.guide. |
| Authority | Reversible-local: write only to generated skill directories and their cross-references under the configured output path. Rollback by deleting generated directories; no other state is affected. |
| Side effect | Local write: generated skill directories (each containing SKILL.md) and cross-reference links between them. No mutation of the handbook source, other plugins, or remote state. |
| Done | Approved handbook sections produce type-appropriate skills whose references resolve and whose activation and validation checks pass. |
Inputs
- Handbook path (required): local path to the Testing Handbook repository. The
content/docs/directory must exist. If not supplied, check./testing-handbook,../testing-handbook,~/testing-handbook; then ask the user; then offer to shallow-clonehttps://github.com/trailofbits/testing-handbookas a last resort. - Output directory (required): local path where generated skill directories are written. Defaults to the skill's sibling directory.
- Scope (optional): a specific handbook section path to generate from, skipping full discovery. When omitted, the skill runs full discovery across all handbook sections.
Invocation policy is model+human: the model executes discovery, classification, and generation; the human approves the plan before any skill is written.
Refusals
- Will not proceed to generation without explicit user approval of the plan.
- Will not deliver a file over 500 lines: split into sibling files.
- Will not claim the done predicate holds when validation has not passed for a generated skill.
- Will not mutate the handbook source, other plugins, or remote state.
Procedure
- Locate the handbook. Check
./testing-handbook,../testing-handbook,~/testing-handbookfor acontent/docs/directory. If not found, ask the user for the path. If the user does not know, offer to clonehttps://github.com/trailofbits/testing-handbookwith depth 1. Stop if the handbook cannot be located orcontent/docs/is missing. Done when: the handbook is located with acontent/docs/directory. - Scan directory structure. Walk
{handbook_path}/content/docs/and enumerate every directory. For each markdown file, parse YAML frontmatter fortitle,summary,weight,bookCollapseSection, anddraft. Done when: every directory and markdown file is enumerated with its frontmatter. - Classify candidates. For each directory, apply the first matching rule:
/static-analysis/[name]/with numbered files (00-, 10-): tool skill;/fuzzing/[lang]/[name]/withindex.mdor numbered files: fuzzer skill;/fuzzing/techniques/[name]/with any.mdfiles: technique skill;/crypto/[name]/with any.mdfiles: domain skill;/web/[name]/with numbered files or_index.md: tool skill (check exclusions first);_index.mdwithbookCollapseSection: true: container, scan children, create no skill for the container; any other directory with only_index.md: skip (insufficient content). Most specific (deepest) path wins. When multiple types match, prefer Tool > Fuzzer > Technique > Domain. Done when: every directory is classified or skipped. - Apply exclusions. Skip a section if:
draft: trueappears in frontmatter, the directory is empty, the file is a template or placeholder, or the tool is GUI-only (e.g.,web/burp/: Burp Suite requires visual interaction and cannot be operated headlessly). Done when: exclusions are applied and skipped sections are recorded. - Build candidate list. For each candidate, record: name (slugified from
title), type, source section path, summary from frontmatter, weight, whether a resources file (99-resources.mdor91-resources.md) exists, and related sections. Done when: the candidate list is built with all fields. - Prioritize candidates. Order by weight field (lower first), then content depth (more numbered files first), then presence of resources file, then core section status (fuzzing, static-analysis first). Done when: the candidate list is ordered.
- Present plan to user. Output a plan table: skill name, source section, type, related sections. List skipped sections with reasons. List external resources to fetch. Wait for explicit user approval before proceeding. Accept modifications: remove skills, change types, rename, add custom related sections. Done when: the user approves the plan.
- Prepare generation context. For each approved skill, collect: primary section content (
_index.mdorindex.md), numbered files, related sections, and resources. Fetch non-video URLs with a 30-second timeout; skip on timeout and note in warnings. Extract video URLs as title and link only. Verify each candidate's primary content is non-empty, frontmatter has title and summary, and the template for its type exists. Done when: generation context is prepared for every approved skill. - Pass 1: content generation (parallel). For each approved skill, generate a SKILL.md with all sections except Related Skills. Apply the type-appropriate section structure and Hugo shortcode conversion rules per
references/type-templates.md. Preserve code blocks exactly. Leave a Related Skills placeholder. If content exceeds 450 lines, extract large sections into sibling files and add a decision tree to SKILL.md. Hard limit: 500 lines per file. Done when: every approved skill has a SKILL.md written with its type-appropriate sections. - Pass 2: cross-reference population (sequential). After all Pass 1 skills are written, list generated skill names. For each skill, determine related skills per the rules in
references/type-templates.md. Replace each placeholder with a Related Skills table. Validate that every referenced skill directory exists. Done when: every placeholder is replaced and all cross-references validate. - Validate. For each generated skill, verify: YAML frontmatter parses;
namematches^[a-z0-9-]{1,64}$;descriptionis non-empty and at most 1024 characters; required sections for the skill type are present; line count is under 500; no Hugo shortcodes remain; no escaped backtick sequences remain; all internal links resolve; and all cross-referenced skills exist. Done when: every generated skill passes validation. - Finalize. Update the repository README with a table of generated skills (author:
testing-handbook-generator). Update the Skills Cross-Reference graph from each skill's Related Skills section. Note any template, discovery, or content extraction issues encountered for future improvement. Done when: the README and cross-reference graph are updated.
What ships with it
2 files 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.
- 5d ago First seen · 66 lines · 44 tokens per session scan A 33c3037bcbe5
testing-handbook-generator is a skill published in the GitHub repository OutlineDriven/odin-claude-plugin (35 stars, last pushed yesterday), licensed Apache-2.0. It adds 44 tokens to every session and 1,886 once invoked, about $0.0002 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…
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…