plugins/testing-agent-skills/skills/testing-agent-skills/SKILL.md
Tests the customization assets themselves - skills, prompts, custom agents, instructions - the way a product is tested: activation cases that check an asset fires when it should and stays quiet when it should not, output-contract cases, safety cases, collision cases between assets competing for the same trigger, a weighted rubric scored blind, and a baseline-versus-candidate gate before an edit ships. Use when a skill is edited and nobody knows whether behaviour changed, when two skills fight over the same request, when a description is being tuned for discoverability, when a collection has grown past manual spot-checking, or when the request mentions skill evals, prompt regression, or "does this skill actually work".
npx skillsauth add jaktestowac/awesome-copilot-for-testers testing-agent-skillsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when a customization asset is treated as done because it reads well.
A SKILL.md is a behavioural contract executed by a model. Nothing about it is verified by frontmatter linting, a markdown check, or a careful read. Every claim in a skill description - "use when X", "always applies", "never invents a root cause" - is a testable assertion, and until someone tests it the asset is untested code shipped to every user of the collection.
This skill treats the collection as the system under test. testing-llm-features covers the same discipline pointed at a product feature; the difference is what fails. A product eval failure ships a wrong answer to a customer. A skill eval failure ships a wrong process to every future task.
A full suite is 10 to 20 cases with baselines and blind scoring. Nobody starts there. Six cases in an afternoon catch most of what is actually broken, and they establish whether the criteria are scorable at all - which is the thing you cannot learn by planning.
Start with exactly these six, in this order:
Run each three times, with the asset and without it, and score the twelve responses in one sitting. Two hours, and the result is usually one of three things: the asset works, the asset changes nothing the model was not already doing, or a criterion turned out to be unscorable. All three are worth the afternoon.
Grow the suite from failures after that, not from a plan. Every real defect found in use becomes a case, and the suite ends up shaped like the asset's actual weaknesses.
Say this out loud before writing cases, because the most common failure here is a suite that proves the wrong thing.
An eval can prove:
An eval cannot prove:
Write the limits into the report. A skill eval that claims general improvement from six cases and one trial is the same failure as a test suite claiming coverage from a green run.
A usable suite covers seven categories. Most suites only write the first, which is why most suites pass.
| Category | The question | Fails when | | --- | --- | --- | | Activation-positive | Does it fire on a request it claims? | The description reads well but shares no vocabulary with real requests | | Activation-negative | Does it stay quiet on adjacent requests it does not claim? | The description is so broad the asset fires on everything | | Collision | Between two competing assets, does the right one win? | Two skills claim the same trigger and selection is effectively random | | Contract | Does the output have the parts the asset promises? | The workflow is followed loosely and required sections go missing | | Behavioural | Does it change what the model does, not just what it says? | The asset is quoted back as a summary and then ignored | | Safety | Are confirmations, authorization gates, and refusals preserved? | A brevity or speed rule quietly deletes a confirmation step | | Persistence | Does an always-apply asset still apply at turn ten? | The rules survive two turns and lapse when the topic changes |
Activation-negative and collision cases are where a mature collection earns its keep. In a collection with fifty skills, a new asset's real risk is not that it fails to fire - it is that it fires instead of something better.
Category definitions, worked cases, and the case file schema are in ./resources/case-file-schema.md.
The seven categories apply to every asset type, but what they mean changes. Test what the asset type can actually get wrong.
Custom agents. The tool grant is the contract, and exceeding it is the failure class no skill has. A read-only reviewer that edits a file has failed regardless of how good its findings were. Write one negative case per boundary the agent declares - one for each "does NOT do" in its own prose, and one attempting an action outside its granted tools. Also test the handoff: when the agent hits work it declares out of scope, does it hand off to the named target or do it anyway?
Prompt files. Activation is not the question - a prompt is invoked deliberately. What breaks instead is routing and inputs: does it reach the agent it declares, does it collect the inputs it needs before starting, and does it degrade sensibly when an optional input is missing? Six to ten cases, weighted toward missing and malformed inputs.
Instruction files. The risk is scope. An applyTo glob wider than the rules it carries applies domain-specific advice to unrelated files, and nothing about that looks wrong in review. Weight the suite toward activation-negative: files just outside the glob, and files inside it where the rules do not fit. One case per rule, checking the rule is actually followed rather than merely present.
Hooks. Mostly deterministic, so most of the suite is not a model eval at all: feed it real payload shapes and assert on exit codes and output. What still needs a behavioural case is the response to a hook that fires - does the agent act on a denial reason or route around it? A hook that denies and gets circumvented is worse than no hook.
Orchestration packs. Test the seams, not the agents. Does each handoff carry the packet the next role needs, and does a role stop at its boundary instead of finishing the next one's work? One case per handoff.
Write one sentence: what does this asset make the model do that it would not do otherwise?
If that sentence is hard to write, the asset has no testable claim yet, and that is the finding. Stop and fix the asset first.
Then list the claims already written into its frontmatter. Every "use when" clause is an activation-positive case. Every scope boundary ("this skill does not…") is an activation-negative case. Every "always" is a persistence case.
Aim for 10 to 20 cases for a single asset. Coverage across the seven categories beats volume in one.
Per case, write:
Use the schema in ./resources/case-file-schema.md. Keep the file next to the asset or under evals/ in the collection.
Bad prompt: "Use the communicating-quality-findings skill to summarize these findings." - names the asset and reuses its vocabulary, so it tests nothing but obedience.
Good prompt: "I've got 22 review comments and my lead just says 'so what do I actually do'. Turn this into something he'll read." - the words a user types, sharing no vocabulary with the description.
Bad criterion: "Response includes a severity ranking." - passes on a ranking that is wrong.
Good criterion: "Ranks the swallowed 402 above the fixture duplication." - a substantive judgement a second scorer would agree on.
Run every case with the asset disabled or absent. Save the responses verbatim.
This is the step that gets skipped and it invalidates everything downstream. Without a baseline you cannot tell an asset that improves behaviour from an asset that describes behaviour the model already had. Plenty of skills are the latter.
For an edit to an existing asset, the baseline is the current published version, not the absence of it.
Same cases, same model, same settings, asset enabled. Multiple trials per case - three is a workable floor, and one trial is not a result. Record every trial, including the ones that disagree with each other.
Note the model and version in the run record. A suite scored against one model says nothing about another.
Label the responses A and B without exposing which is baseline and which is candidate, then score each against the rubric in ./resources/rubric-and-gate.md.
Scoring your own change while knowing which is yours produces the result you expected. If a second person is available, have them score. If a model is the judge, keep the labels blind for it too, and spot-check its scores by hand.
The candidate ships only when it clears the release gate in ./resources/rubric-and-gate.md: no blocking findings, safety and correctness not regressed, weighted score above baseline.
A candidate that wins on concision and loses on correctness does not ship. That trade is the most common regression in style and brevity assets, and it is exactly what the weighting exists to catch.
Commit the case file, the rubric, the baseline responses, and the run record. Re-run before the next edit to the asset, and when the default model changes.
An eval suite that ran once is a screenshot. The value is in the second run.
Specific to collections large enough for assets to overlap. Run this whenever an asset is added or a description is rewritten.
Ordered by cost. The first four produce a suite that reports success while proving nothing, which is worse than having no suite at all - a green eval is quoted in a release decision.
./resources/case-file-schema.md - the case file format, field by field, with worked cases for each of the seven categories./resources/rubric-and-gate.md - the weighted scoring rubric, blocking-finding definitions, and the release gate./resources/running-evals.md - how to actually run a suite: the manual blind protocol, scripted runs, judge prompts, and CI wiringtesting-llm-features - the same discipline aimed at a product feature's prompts and RAG, where the eval gates a release rather than a collectioncreating-skills - authors the asset this skill then tests; its quality checklist is a static check, not a behavioural onecreating-prompts, creating-custom-agents, creating-instructions - the other asset types in scope herecreating-plugins - packaging, where an untested asset becomes an installed oneunslop-answers - applies to the eval report itself; a skill eval is exactly the kind of result that gets reported as verified without a runanalyzing-quality-metrics - denominators and windows for the numbers an eval report quotestracking-quality-trends - turning repeated eval runs into a direction rather than a series of snapshotscreating-orchestration-packs and creating-hooks - the two asset types whose failures live in the seams rather than in the prosecommunicating-quality-findings - for the eval report itself, where the decision is ship or do not ship this candidateAn asset is tested when:
development
Shapes QA output for the person who has to act on it: result and blocker in the first two lines, one decision per report, findings ordered by what they cost, the long artifact in a file and the decisions in the message, and magnitude stated in units the reader can count. Use when a report is accurate but nobody acts on it, when a finding set is too long to read under time pressure, when the same findings must be retold for a developer, a release manager, and an on-call engineer, or when the request mentions "too long", "make this readable", "just tell me what to do", "so what", or "summarize this for stakeholders". Pairs with unslop-answers, which makes the same report honest.
testing
Verifies that the lines and branches a change actually touched are executed by tests, using LCOV or Cobertura diff coverage instead of whole-repo percentages, and escalates uncovered high-risk changes into a blocking finding. Use when a pull request needs a coverage gate that unrelated tests cannot satisfy, when total coverage looks healthy but the diff is untested, when wiring diff coverage into CI, or when someone claims a change is covered because the suite is green.
development
Cuts AI tells from test code: tests that pass without proving anything, tautological assertions, mock-only tests, hardcoded waits, coverage theater, vague names, swallowed errors, retries used as fixes. Use whenever test code is written, changed, or reviewed, including tests produced as a side effect of a feature task, and when the request mentions "review these tests", "are these tests any good", "this test always passes", "this suite is flaky", or "clean up these tests". Must always apply to test code.
development
Cuts AI tells from what the agent says about its own work: completion claimed without a run, invented file paths and API names, terminal output that was never produced, findings with no location, percentages with no denominator, absence claimed from one grep, effort narration instead of results, hedge stacking, buried blockers, puffery in a bug title. Use whenever reporting a result, a fix, a review finding, a test outcome, a coverage or flake number, a root cause, or a release recommendation, and when the request mentions "prove it", "did you actually run it", "be specific", "no fluff", "stop hedging", or "is this real". Must always apply to answers about your own work.