skills/tracking-quality-trends/SKILL.md
Turns point-in-time quality readings into a trend: archives each run, diffs against the previous one, and reports direction per metric - practices newly present or regressed, coverage movement, flake rate, waivers expiring, eval scores - using limit/current/goal framing. Use when quality reporting is a series of disconnected snapshots, when a team needs to show improvement over a quarter, when a number is quoted with no baseline, or when a regression in the quality system itself should be visible.
npx skillsauth add jaktestowac/awesome-copilot-for-testers tracking-quality-trendsInstall 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 quality gets reported as a number, and nobody can say whether it is better or worse than last time.
A snapshot is almost useless on its own. "Coverage is 71%" prompts an argument about whether 71 is good. "Coverage on changed lines has moved 62 → 71 over three releases, limit 75, goal 85" prompts a decision. Direction is the finding; the absolute value is context.
The second thing this catches is regression in the quality system - a threshold lowered, a job made non-blocking, a waiver renewed for the fourth time. Those never show up in a snapshot, because a snapshot reports what is measured, not what stopped being measured.
Start from what the contract already implies, and cap it at six to eight. From ./resources/trend-metrics.md:
| Metric | Limit / goal example | Caveat to print | | --- | --- | --- | | Diff coverage | ≥ 75% / ≥ 85% | proves execution, not assertion quality | | Repo coverage direction | must not decrease | a big denominator absorbs new gaps | | Flake rate | < 1% / < 0.3% | only measurable if retries are recorded | | Suite duration (p95) | < 10 min / < 5 min | shortcuts appear when this rises | | Contracted practices PRESENT | - / all MUST | PRESENT means configured and enforced | | Blockers open | 0 / 0 | a MUST practice missing | | Waivers: count, expired, oldest | 0 expired | count alone hides age | | Suppressions total | trending down | includes disables, ignores, skips | | Escaped defects | trending down | depends on consistent triage | | Eval pass rate per capability | no regressions | per capability, never aggregated |
Each metric needs an owner and a stated action at the limit. A metric with neither is a dashboard decoration.
.qa/
quality-contract.md # current
trends.md # the report
history/
2026-05-02/{contract.md,metrics.json}
2026-06-13/{contract.md,metrics.json}
2026-08-21/{contract.md,metrics.json}
Each metrics.json records the value, the date, the commit, and how it was measured - the tool, the version, and the scope. That last field is what lets a future reader tell a real improvement from a method change.
Per metric: previous, current, delta, direction, and position against limit and goal. Then, separately, the structural diff nobody else reports:
A threshold quietly lowered from 75 to 60 will otherwise appear as a coverage improvement. Reading the config diff alongside the metric diff is what catches it, and it is the single highest-value habit in this skill.
Before reporting a movement as a finding, know what movement is normal. Flake rate and suite duration move on their own; coverage moves with the size of the release; eval scores move with model variance.
Rule: a movement inside the noise band is not a finding, and a movement in the same direction three periods running is a finding regardless of size. Slow drift is what a threshold-based alert never catches.
Use ./resources/trend-report-template.md. Written to .qa/trends.md, with:
Then the honest closing paragraph: what this report cannot see. Untracked metrics, unmeasured practices, and anything where the tooling changed.
Tie it to something that already happens - a release, a sprint boundary, a monthly review. A report with no cadence gets written once and admired.
Two rules: re-derive the contract on the same cadence, and read the previous report before writing the new one. A trend report that does not reference its predecessor's findings is a snapshot with a date on it.
./resources/trend-metrics.md - the metric set with limits, goals, how to measure each in a JS/TS repo, caveats, and gaming risks./resources/trend-report-template.md - the report structure, the history layout, the metrics.json shape, and worked findingsanalyzing-quality-metrics - metric definitions, anti-metrics, and how to interpret each honestly; this skill adds history and directionderiving-a-quality-contract - supplies the practice list, the thresholds, and the gap matrix each run diffsgoverning-quality-waivers - waiver count, age and expiry are tracked metrics hereverifying-change-coverage - the source of the diff-coverage readingassessing-comprehension-debt - its band is a trended, advisory metrictesting-llm-features - eval pass rate per capability, trended against a baselineassessing-release-readiness - consumes direction, not just current stateThis 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.