plugins/planning-exploratory-testing/skills/planning-exploratory-testing/SKILL.md
Runs session-based exploratory testing: writes charters, timeboxes sessions, applies coverage heuristics and tours, captures notes as evidence, debriefs, and converts findings into bug reports and automation candidates. Use when a feature needs testing before requirements settle, when scripted cases keep passing while users hit problems, when a release needs a risk sweep with limited time, or when the request mentions charters or exploratory sessions.
npx skillsauth add jaktestowac/awesome-copilot-for-testers planning-exploratory-testingInstall 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 the useful question is "what do we not know about this yet", and a list of pre-written test cases cannot ask it.
Exploratory testing is not unscripted clicking. It is simultaneous learning, test design, and execution, made accountable by three things: a charter that says what the session is for, a timebox that makes coverage measurable, and notes that make the session reviewable by someone who was not there. Without those three it is indistinguishable from a demo, which is why it gets dismissed.
Establish before any charter is written:
If the area is a diff or a release candidate, take the blast radius from analyzing-regression-scope rather than re-deriving it.
The house format, from ./resources/charter-templates.md:
Explore [target] With [resources: roles, data, tools, devices] To discover [information: risks, behaviours, inconsistencies]
Charter quality rules:
Split charters into three buckets: must run, run if time, and backlog. Say which bucket each is in.
Pick the lenses for each charter from ./resources/heuristics-cheatsheet.md rather than improvising in the moment. The usual starting set:
Name the heuristics in the charter. It makes the session repeatable by someone else and reviewable afterwards.
Timebox strictly. During the session:
./resources/session-notes-template.mdTrack the session's time split as you go, roughly: test design and execution, bug investigation and reporting, setup and environment. The split is the most useful number in the debrief.
Every session ends with a debrief, using ./resources/debrief-checklist.md. Cover, in order:
The last one is not a soft extra. "I do not trust the refund path and I cannot say why yet" is a valid, actionable finding, and it is the one a status report loses.
A session produces four kinds of output. Route each:
| Output | Goes to |
| --- | --- |
| Reproducible defect | reporting-bugs |
| Non-reproducible observation | Logged with evidence and a repro attempt count; do not discard |
| Repeatable high-value scenario | Automation candidate list, then designing-functional-tests |
| Requirement gap or ambiguity | Back to the requirement owner; feeds verifying-acceptance-criteria |
| Area still unknown | The next charter |
Automation candidates need a stated reason: it is high risk, it is expensive to check by hand, it will regress. Not everything found by exploring deserves a permanent test.
Report in sessions and charters, not in feelings. The coverage summary in ./resources/session-notes-template.md gives:
That last line is what makes an exploratory report usable in a release decision. Hand it to assessing-release-readiness.
./resources/charter-templates.md - charter format, worked examples per context, and charter smells./resources/heuristics-cheatsheet.md - SFDIPOT, CRUSSPIC STMPL, tours, and input, state, and data heuristics./resources/session-notes-template.md - during-session note format, coverage summary, and a worked example./resources/debrief-checklist.md - the PROOF debrief, questions to ask, and the routing decision per findingdesigning-functional-tests - when exploratory findings should become structured cases or a regression sliceanalyzing-regression-scope - when the area to explore should be derived from a diffreporting-bugs - when a session finding becomes a defect reportdesigning-test-data - when a charter needs deliberate inputs prepared in advanceverifying-acceptance-criteria - when exploration exposes a gap between built and specified behaviourassessing-release-readiness - when session coverage feeds a go/no-go decisiontesting-application-security - when a charter targets authorization or input handlingThis skill is complete when:
testing
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".
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.