kz-tob 3deb39e7b3 testing-handbook-skills: make 15 descriptions routable (#276)
* testing-handbook-skills: make 15 descriptions routable

Every description was a tool-encyclopedia blurb averaging 125 chars —
the first half defined the tool, the second half restated it as a
trigger. "Coverage-guided fuzzer built into LLVM for C/C++ projects.
Use for fuzzing C/C++ code that can be compiled with Clang." Fifteen
skills competing on wording like that lose to each other and to
siblings elsewhere in the marketplace.

Each is now three parts: what it does for the reader, task first, since
the name field already carries the tool name; what it covers, in
concrete flags and symbols; then two to four situations in the words a
user would type. The anchors are the point —  LLVMFuzzerTestOneInput,
fuzz_target!, FuzzedDataProvider, afl-clang-fast, ASAN_OPTIONS,
project.yaml, an ASan stack trace, a campaign that finds nothing.

Fix the generator too, or the next skill it emits is thin again. All
four templates prescribed the shape being removed, and their worked
examples were these same descriptions. agent-prompt.md now says why the
existing rule is not enough: "MUST include Use when" is satisfied by
"Use for fuzzing C/C++ code", which is how these got written.

Put descriptions on one quoted line rather than a folded block. Eight of
these skills already fail the plugin's own 500-line limit, and folded
blocks added 4-5 lines to each; one quoted line removes 1-2 instead.
It is also what the rest of the repo uses at this length and is exempt
from the validator's plain-scalar rule.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* testing-handbook-skills: ground three descriptions, gate placeholders

Three descriptions advertised anchors that appear nowhere in the skill
they route to — the worst failure for a change about routing, since the
description wins the query and the skill then has nothing to say.

harness-writing claimed "C/C++, Rust, Python, and Ruby". Grepping it for
ruby, gem, or .rb returns only that line; Python appears once, as a
Related Skills row. It would have taken "harness for my Ruby gem" from
ruzzy and delivered a file with no Ruby in it. Now C/C++ and Rust, which
is what the 12 LLVMFuzzerTestOneInput and 16 fuzz_target! sites cover.

constant-time-testing named ctgrind, whose only occurrence in the whole
plugin was that description. Replaced with Timecop and Valgrind, at 20
and 10 hits. Also leads with measuring a running implementation and adds
a "Not for" line, restoring the boundary constant-time-analysis already
documents in its own When NOT to Use.

cargo-fuzz claimed "cargo fuzz init and add"; only init, run, coverage,
and crash exist. Dropped add, added the nightly requirement and
cargo fuzz coverage, both of which the body does cover.

Gate the class rather than just these three. A description shipped with
a {placeholder} still in it passed every check, because the shortcode
pattern needs double braces — and this branch widened the templates'
slots, so the surface grew. validate-skills.py now rejects it, and
test_validate_skills.py holds each description check to a known-bad
fixture plus a positive control. Stdlib only, since CI runs these with
--no-project --with pytest, an environment without pyyaml.

Fix the pointer to a section that does not exist, drop the two-part
"what AND when" bar from testing.md's checklist since the old thin
descriptions satisfied it, correct the README's skill inventory, and
take the version to MINOR — this changes what the generator emits.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Drop semgrep and codeql from the cross-reference graph

The prose and the summary table were updated to 14 skills, but the graph
still declared a Tools subgraph with semgrep and codeql and drew both
edges between them. Neither skill exists under skills/, so the graph
rendered 16 nodes beneath a sentence claiming 14 and promising that only
generated skills are shown.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Fail validation on frontmatter that carries no fields

extract_frontmatter returned (None, None) for an empty block, because
yaml.safe_load("") is None and that is not a parse error. validate_skill
branches on the error, so every frontmatter check was skipped and a skill
with no name and no description printed a clean tick. A bare scalar took
the same path and died on .get with an uncaught AttributeError.

Extraction now pairs both cases with an error, and validate_frontmatter
reports rather than returning silently when handed a non-mapping. Four
tests cover it, stubbing the parser so they run in CI's pyyaml-free
environment; they fail against the previous code and nothing else does.

Ground the atheris description's two API anchors in the body: rename the
harness entry point to TestOneInput, matching upstream Atheris and its
error messages, and add a FuzzedDataProvider section covering the typed
draws and the fixed-order rule. Both were advertised in the description
and appeared nowhere else in the file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Split atheris, and fix the FuzzedDataProvider method table

The structured-input section pushed atheris from 519 lines to 552, making
a file already over the plugin's 500-line error limit worse — the opposite
of what the PR body claimed. Both it and the two worked harnesses move to
sibling files, the split this plugin's own agent-prompt.md prescribes for
the band. SKILL.md is now 482 lines and passes the line-count check it has
failed since it was generated.

Three errors in the method table, all mine, corrected in the moved copy:

- remaining_bytes() returns a count and consumes nothing; it was listed as
  the way to get the remaining input. Following it hands the target an int
  where bytes is expected. The idiom is ConsumeBytes(fdp.remaining_bytes()).
- ConsumeIntList takes (count, bytes) and was shown with no arguments.
- ConsumeUnicode permits lone surrogates, not surrogate pairs. The pairs
  gloss suggests valid text; unpaired surrogates raise UnicodeEncodeError
  the moment a target encodes them, so the campaign reports its own input
  handling rather than the target's.

Every method is checked against the pybind registration in atheris.cc,
which exposes remaining_bytes despite the upstream README omitting it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-26 10:18:41 -04:00

Trail of Bits Skills Marketplace

A Claude Code plugin marketplace from Trail of Bits providing skills to enhance AI-assisted security analysis, testing, and development workflows. Codex can load this marketplace through its Claude marketplace compatibility.

Also see: claude-code-config · codex-config · skills-curated · claude-code-devcontainer · dropkit · coop

Installation

Claude Code Marketplace

/plugin marketplace add trailofbits/skills

Browse and Install Plugins

/plugin menu

Codex

Codex supports Claude plugin marketplaces directly, so this repository does not need Codex-specific sidecar metadata.

Install the marketplace with:

codex plugin marketplace add trailofbits/skills
codex plugin list
codex plugin add <plugin-name>@trailofbits

Local Development

To add the marketplace locally (e.g., for testing or development), navigate to the parent directory of this repository:

cd /path/to/parent  # e.g., if repo is at ~/projects/skills, be in ~/projects
/plugins marketplace add ./skills

Available Plugins

Smart Contract Security

Plugin Description
building-secure-contracts Smart contract security toolkit with vulnerability scanners for 6 blockchains and 5 development guideline assistants
entry-point-analyzer Identify state-changing entry points in smart contracts for security auditing

Code Auditing

Plugin Description
agentic-actions-auditor Audit GitHub Actions workflows for AI agent security vulnerabilities
audit-context-building Understand a codebase before looking for bugs in it, one function at a time
burpsuite-project-parser Search and extract data from Burp Suite project files
c-review Comprehensive C/C++ security code review, with coverage verified against a parse of the source
differential-review Security-focused differential review of code changes with git history analysis
dimensional-analysis Annotate codebases with dimensional analysis comments to detect unit mismatches and formula bugs
fp-check Systematic false positive verification for security bug analysis with mandatory gate reviews
insecure-defaults Parallel audit workflow for fail-open insecure defaults, with a refuting verifier per candidate file
rust-review Comprehensive Rust security review covering safe/unsafe boundary, memory safety, concurrency, panic-DoS, FFI, and async runtime with SARIF output
semgrep-rule-creator Create and refine Semgrep rules for custom vulnerability detection
semgrep-rule-variant-creator Port existing Semgrep rules to new target languages with test-driven validation
sharp-edges Identify error-prone APIs, dangerous configurations, and footgun designs
static-analysis Static analysis toolkit with CodeQL, Semgrep, and SARIF parsing
supply-chain-risk-auditor Audit npm, PyPI, and Go dependencies for version-matched advisories, abandoned upstreams, publisher concentration, and install scripts
testing-handbook-skills Skills from the Testing Handbook: fuzzers, static analysis, sanitizers, coverage
trailmark Code graph analysis, bounded subagent context slicing, Mermaid diagrams, mutation testing triage, and protocol verification
variant-analysis Find similar vulnerabilities across codebases using pattern-based analysis
vulnerability-triage-brocards Triage vulnerability reports using 7 brocards to accept, dismiss, or request more info before deeper analysis

Malware Analysis

Plugin Description
yara-authoring YARA detection rule authoring with linting, atom analysis, and best practices

Verification

Plugin Description
constant-time-analysis Detect compiler-induced timing side-channels in cryptographic code
mutation-testing Configure mewt/muton mutation testing campaigns — scope targets, tune timeouts, optimize long runs
property-based-testing Write, review, and triage property-based tests — Hypothesis, fast-check, proptest, and Echidna or Medusa for Solidity invariants
spec-to-code-compliance Check code against the documentation that specifies it, across contracts, C/C++, services, and firmware
writing-lean-proofs Write structured Lean 4 proofs and design Lean libraries following Mathlib conventions
zeroize-audit Detect missing or compiler-eliminated zeroization of secrets in C/C++ and Rust

Reverse Engineering

Plugin Description
dwarf-expert Analyze DWARF debug info: parse and search DIEs, verify integrity, write DWARF parsing code

Mobile Security

Plugin Description
firebase-apk-scanner Scan Android APKs for Firebase security misconfigurations

Development

Plugin Description
code-improver Autonomous review-and-fix workflow over skills, plugins, or a branch, with a pluggable reviewer, findings ledger, escalation, and scope guard
devcontainer-setup Create pre-configured devcontainers with Claude Code and language-specific tooling
gh-cli Intercept GitHub URL fetches — WebFetch, MCP fetch tools, and curl/wget — and redirect to the authenticated gh CLI
git-cleanup Safely clean up git worktrees and local branches: a dynamic workflow gathers merge evidence and tries to refute its own delete recommendations, behind gated confirmation
goal-prompt Draft /goal commands for goal mode in Claude Code and Codex — verifiable completion conditions formatted to a copy-ready single line
github-triage Triage open GitHub issues and PRs: merge ready bot/approved PRs, review unreviewed ones via subagents, close resolved issues with cited comments, cross-link pending fixes, and score the rest with local-only priority and change-size estimates
let-fate-decide Draw Tarot cards using cryptographic randomness to add entropy to vague planning
modern-cpp Modern C++ best practices (C++20/23/26) with compiler hardening and safe idioms
modern-python Modern Python tooling and best practices with uv, ruff, and pytest
open-sourcing Prepare a repository for public release: secrets hygiene, licensing, CI readiness, and release automation
second-opinion Run code reviews using external LLM CLIs (OpenAI Codex, Google Gemini) on changes, diffs, or commits. Bundles Codex's built-in MCP server.

Team Management

Plugin Description
culture-index Interpret Culture Index survey results for individuals and teams

Tooling

Plugin Description
claude-in-chrome-troubleshooting Diagnose and fix Claude in Chrome MCP extension connectivity issues

Trophy Case

Bugs discovered using Trail of Bits Skills. Found something? Let us know!

When reporting bugs you've found, feel free to mention:

Found using Trail of Bits Skills

Skill Bug
constant-time-analysis Timing side-channel in ML-DSA signing

Contributing

We welcome contributions! See AGENTS.md for skill authoring guidelines, and run make check before you push — it runs most of CI locally (see AGENTS.md for what it does not cover).

License

This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Made by Trail of Bits.

S
Description
semgrep: Runs a Semgrep security scan over a codebase: detects languages, selects rulesets, presents the plan for explicit approval, then runs every approved ruleset…; modern-python: Configures Python projects with modern tooling (uv, ruff, ty). Use when creating projects, writing standalone scripts, or migrating from pip/Poetry/mypy/black.; codeql: Scans a codebase for security vulnerabilities using CodeQL's interprocedural data flow and taint tracking analysis. Triggers on "run codeql", "code…
Readme CC-BY-SA-4.0 14 MiB
Languages
Python 64.6%
JavaScript 18.8%
Shell 12.6%
YARA 0.6%
C 0.5%
Other 2.6%