A test-readiness console for the five Claude Code extension types — skills, subagents, hooks, plugins, MCP servers. Each one sits at a different point on a determinism gradient, and the gradient decides what kind of test you're even allowed to write.
Three lanes. The further right, the less a single green run means — and the more of the risk lives outside your own diff.
description against the prompt to decide whether to fire [4]. The description is the test.description field — does it trigger?skill-used assertions [2] · skill-creator eval loop [6]Use Skill() explicitly [7]."Does my skill trigger?" and "does the parent route to my subagent?" are the same test [5] — positive prompts that must hit, plus near-miss prompts that must route to a sibling instead.
Promptfoo expresses this directly with skill-used / not-skill-used assertions [2]. Anthropic's skill-creator upgrade (shipped 3 March 2026) treats triggering as a false-positive / false-negative classifier and auto-tunes the description against sample prompts [6].
Opposite failures, opposite defenses. Conflating them is how teams test the one they can see and miss the one that ships the breach.
Your tool's contract shifts between versions. Caught by snapshotting tools/list and failing CI on a schema diff.
postmark-mcp behaved identically for 15 releases, then shipped a BCC email-harvesting backdoor in v1.0.16 [11].
sha256 digest (pinner-mcp [13]). Provenance is no silver bullet — 633 malicious npm versions passed Sigstore with stolen certs in May 2026 [14].What a small team can actually gate on every pull request. The first three steps need zero model calls; the fourth is one cheap headless run; the fifth has no per-PR answer at all.
claude plugin validate --strict — warnings become errors [15]Each extension type gets its own deep-dive. Start with hooks (the easy win) and the per-PR floor; escalate into the MCP/plugin expedition for the supply-chain surface.