skills/communicating-quality-findings/SKILL.md
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.
npx skillsauth add jaktestowac/awesome-copilot-for-testers communicating-quality-findingsInstall 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 QA finding set is already true and still useless, because the person who has to act on it cannot get to the action.
There are two ways a report fails and they need different fixes. A dishonest report says the suite passed when it did not - that is unslop-answers. An unactionable report says everything correctly and gets skimmed, filed, and forgotten. That is this skill. The second failure is quieter and more common, because nothing in the report looks wrong.
This is not "be brief". A one-line report that omits the blocker is worse than the wall of text it replaced.
Most output is routine and does not need the full workflow. Four checks, in this order, before sending anything:
.qa/ and keep the five.For a report, a review, a release call, or anything a stakeholder reads, run the full workflow below and the nine-check gate in ./resources/pre-send-gate.md.
Five facts about how QA output is actually read. Every rule below traces to one of them.
Line one is what is true now. Line two is the thing that stops the reader, if there is one. Method, scope, and process come later or not at all.
Bad: "I reviewed the checkout suite across three packages, looking at fixtures first, then the specs, and there are a number of observations worth discussing."
Good: "Checkout suite: 3 real failures, 1 blocker. Blocker: payment.spec.ts cannot run in CI - the Stripe test key is missing from the workflow secrets."
Name the decision in the first line and answer only that. A second decision becomes a second message.
Bad: a release recommendation that also proposes a fixture refactor, flags a flaky suite, and asks about next quarter's coverage target.
Good: "Recommendation: hold. One blocker, below. Separately, the fixture refactor and the flake list are worth a session this week - want either as its own write-up?"
The order files were opened is not information. Rank by what each finding costs if ignored, and say what the cost is.
Bad: findings numbered 1 to 12 in the order the reviewer walked the diff, with severity noted in the last column.
Good: three sections - blocks release, fix this sprint, noted - ordered inside each by user impact, with the cost stated per finding.
A matrix, a charter set, a gap table, and a bug queue are artifacts: they are complete by design and they do not shrink. Write them to .qa/ and keep the message to what this reader must decide - at most five items.
This is the rule that stops rule 3 from destroying evidence. Never truncate the matrix to make the message short.
Bad: a 40-row traceability matrix pasted into chat, or the same matrix cut to "the top few rows" so it fits.
Good: "Full matrix: .qa/rtm-checkout.md (41 requirements, 12 uncovered). Three uncovered ones touch payment and need a decision this week: REQ-14, REQ-22, REQ-31."
Give quantities you actually have: files, tests, endpoints, runs, rows, days of history. A wall-clock estimate is a guess dressed as a measurement unless something measured backs it.
Bad: "This will take a while to stabilize." Also bad: "About two hours" with nothing behind it.
Good: "9 specs to update, all in tests/checkout/, the same fixture change in each. The last comparable change touched 7 files and took one working day."
One action, precise enough to start without a follow-up question, small enough to start now.
Bad: "Error handling should be improved in the payment flow."
Good: "src/pay/submit.ts:48 swallows the 402 and returns success. First step: rethrow, then add the 402 case to submit.test.ts next to the existing 500 case."
Across a multi-turn session the reader cannot hold the queue. Restate position, not narrative.
Bad: "Done. Ready for the next one?"
Good: "3 of 7 findings fixed (F1, F2, F5). Next: F3, the flaky retry in login.spec.ts. Blocked findings: none."
No alarm, no apology, no drama in a title. Cause, location, effect.
Bad: "Unfortunately there is a serious problem critically undermining the reliability of the checkout experience."
Good: "Checkout submits twice on double-click. CheckoutButton.tsx:31 has no disabled state during submit. Duplicate orders in staging: 4 in the last 200 runs."
Cutting words is allowed. Cutting the difference between "I ran it" and "I read it" is not. If a claim did not reach a real run, it says so, however short the report is.
Bad: "Fixed."
Good: "Fixed, verified: npx playwright test checkout - 12 passed. The retry path is changed but not exercised; no test covers it yet."
The channel changes the shape, because it changes what the reader can see at once and what they can do from there.
| Channel | What is visible | What to do differently | | --- | --- | --- | | Chat with the person doing the work | Everything, but only until the next message scrolls it away | State the queue position every turn (rule 7). The artifact goes to a file, because chat is not storage | | PR comment | The diff is right there | Anchor every finding to a line in the diff. Drop restated context the reviewer can see. Blocking versus non-blocking must be unambiguous | | Ticket or issue body | Read once, months later, by someone with no context | Self-contained: build, environment, reproduction, evidence. No "as discussed". This is the one channel where the artifact belongs inline | | Team channel | One or two lines before the reader decides to expand | The first line must survive alone. Put the decision and the ask in it; thread the detail | | Stand-up or status update | Spoken or skimmed in fifteen seconds | State changed-since-last-time and blocked-on. No finding detail at all - point at where it lives | | Release sign-off or audit record | Read adversarially, later, by someone checking you | Compression off. Evidence, dates, and gaps in full - precedence rule 2 |
Two rules survive every channel unchanged: the blocker goes first, and no claim loses its evidence rung.
When something outranks these rules, the rule loses and the shape stays.
unslop-answers wins every conflict. A shorter report that drops a denominator, a rung, or a "not done" line is a worse report.When a reader asks for this shaping, it applies to every response for the rest of the session, not only the next one. It does not lapse when the topic changes, and it survives a switch from writing a report to writing code.
Stop when the reader says "stop shaping", "normal reporting", or names a house format that conflicts. Confirm in one line, then return to the default style.
Before shaping anything, fix two things in one sentence each:
If the answer is "several readers with several decisions", that is several messages. See ./resources/audience-renderings.md for one finding set rendered for four readers.
Sort the material into two piles:
.qa/, complete.For each decision item, state what it costs if ignored: who is affected, how often, how badly. Sort by that, not by severity labels alone. A "high" with no stated impact ranks below a "medium" that duplicates customer orders.
Write the message: result, blocker, ranked decisions, pointer to the artifact, one next step. Then run ./resources/pre-send-gate.md against the draft. The gate is nine checks and takes under a minute.
Ordered by cost. The first three make the report actively misleading; the rest make it ignored.
unslop-answers outranks everything here.unslop-answers, not a formatting choice../resources/audience-renderings.md - one finding set rendered for the developer, the release manager, the on-call engineer, and the auditor./resources/before-after-reports.md - worked before and after pairs for each of the nine rules, in real QA output shapes./resources/pre-send-gate.md - the nine-check gate to run against a draft before sendingunslop-answers - the honesty half of the pair. It wins every conflict with this skill; run it first, then shapereporting-bugs - the bug report format these rules apply insideassessing-release-readiness - the go/no-go call, the highest-stakes single-decision reportanalyzing-quality-metrics - where the denominators and windows for rule 5 come fromtracking-quality-trends - trend reporting, where "which way is this going" is the one decisiondocumenting-test-suites - the long-form counterpart, exempt from compression by precedence rule 4testing-agent-skills - use it to check that this shaping actually survives to turn ten, and that it never deletes a confirmation stepThis output is ready when:
.qa/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.