plugins/scoping-change-relevance/skills/scoping-change-relevance/SKILL.md
Classifies a diff into file tags and hunk tags - new public export, new endpoint, modified auth, SQL string, migration, added dependency, touched prompt - then maps each tag to the quality practices it makes relevant, producing a defensible per-change check scope instead of running everything or guessing. Use when deciding what to test for a specific pull request, when a full regression run is too slow to gate on, when a pre-push or PR gate needs a scope someone can argue with, or when asked "which checks does this change actually need".
npx skillsauth add jaktestowac/awesome-copilot-for-testers scoping-change-relevanceInstall 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 to decide, from the diff alone, which quality practices a specific change makes relevant - and to be able to defend the answer.
Running every check on every commit is slow, so teams stop gating on it. Running whatever the author felt like is fast and arbitrary. The middle path is a tag grammar: derive tags mechanically from the diff, map tags to practices with a fixed recipe table, and the scope becomes reproducible. Two people scoping the same diff should land on the same list.
new-public-export is evidence.+ lines. Removed lines matter for deletions of tests and guards, and nothing else here.auth/ is auth-relevant; a file elsewhere that verifies a token is too. Read the hunk.git diff --name-status <base>...HEAD # three-dot: compares against the merge base
git diff <base>...HEAD -- <path> # per-file hunks
git log <base>..HEAD --oneline
Use main...HEAD for a branch, HEAD for uncommitted work. Confirm the base ref resolves and the diff is non-empty before going further - a bad ref silently produces an empty scope, which reads as "nothing to check".
Exclude non-source noise from tagging, but list what you excluded: lockfiles are excluded from hunk tagging yet are themselves a added-dependency signal; snapshots, generated clients, and build output are excluded; docs are excluded unless they are the deliverable.
Apply the path rules in ./resources/tag-rules.md to every changed path. File tags describe where the change landed: source, test, config, infra, public-api, schema, auth, critical-path, db-migration, ai, secret-suspect, generated.
A path can carry several tags. A path that looks like both test and source is a test.
For each changed source file, read the added lines and apply the content rules in ./resources/tag-rules.md. Hunk tags describe what changed: new-public-export, new-endpoint, modified-auth, secret-like-string, sql-string, exec-call, db-migration, modified-error-handling, modified-request-schema, added-dependency, modified-prompt, removed-test, loosened-type, new-external-call.
Do this by reading, not only by pattern matching. The patterns are a floor: they catch the common shapes and miss anything expressed unusually. If a hunk introduces a new public capability by any route, it is new-public-export.
Apply ./resources/relevance-recipes.md. Each practice declares the tags that make it relevant; a practice is in scope if any of its declared tags is present. Record, per practice, which tag triggered it - that is what makes the scope reviewable.
Then subtract: a practice not in the project's quality contract is not in scope. If a contract exists (see deriving-a-quality-contract), intersect with it and note practices that would have been triggered but are not contracted. That list is useful evidence next time the contract is reviewed.
Use ./resources/change-scope-template.md. Rank by escalation:
| Rank | Trigger |
| --- | --- |
| Escalated | modified-auth, secret-like-string, sql-string, exec-call, db-migration, critical-path, new-endpoint |
| Standard | new-public-export, modified-error-handling, modified-request-schema, added-dependency, ai |
| Light | test-only, config-only, docs, formatting |
State the blind spots explicitly: what the tags cannot see. A pure-rename diff that changes behaviour through a config default, a change whose risk lives in the data rather than the code, a removal whose consequence is elsewhere in the system. The tag grammar is mechanical and therefore blind in known ways - name them rather than implying coverage.
git diff main...HEAD --name-status
M src/routes/orders.ts
M src/auth/session.ts
A src/lib/pricing.ts
M package.json
M prompts/summarize.md
D src/routes/orders.test.ts
File tags: src/routes/orders.ts → public-api, source · src/auth/session.ts → auth, source · src/lib/pricing.ts → source, critical-path (pricing) · package.json → config · prompts/summarize.md → ai · src/routes/orders.test.ts → test
Hunk tags: new-endpoint (app.post('/orders/:id/refund')) · modified-auth (session TTL and role check) · new-public-export (export function computeRefund) · added-dependency (stripe) · modified-prompt · removed-test
Scope:
| Rank | Practice | Triggered by |
| --- | --- | --- |
| Escalated | api-testing | new-endpoint, public-api |
| Escalated | sast | modified-auth |
| Escalated | integration-testing | new-endpoint, auth, critical-path |
| Escalated | intent-rationale | new-endpoint, new-public-export on a critical path |
| Standard | unit-testing | new-public-export, removed-test |
| Standard | contract-testing | new-endpoint + wire-schema present in the repo |
| Standard | dependency-audit | added-dependency |
| Standard | llm-eval-suite | modified-prompt |
| Standard | e2e-testing | public-api + critical-path reachable from the UI |
| Light | linting, type-safety | any source |
Flagged: removed-test on the file covering the endpoint being changed. A deleted test is not a neutral edit - require the replacement or a reason.
Blind spots: the stripe integration's failure behaviour is not visible in the diff; whether the refund path is reachable from the UI needs a human to confirm; the prompt change's blast radius depends on which chains consume it.
new-endpoint in a file that already existed. Hunk tags are where the risk is.+ lines. Deleted tests and removed validation are risk-increasing and invisible if you skip removals.package.json change is still a dependency change../resources/tag-rules.md - the file-path and hunk-content rules, with the patterns and the intent behind each tag./resources/relevance-recipes.md - practice → triggering tags, the mapping that turns tags into a check scope./resources/change-scope-template.md - output structure for the scope reportanalyzing-regression-scope - when the question is blast radius and what to retest, reasoned rather than derived from tagsderiving-a-quality-contract - when the set of practices that could be in scope has not been agreed yetverifying-change-coverage - when the scope is known and the question is whether the changed lines are actually executedrecording-change-intent - when the tags mark the change as high-risk surface needing a recorded rationalecode-review-advanced - when the tagged risks should drive a code-level reviewgenerating-quality-gate-workflows - when this scope should drive which CI jobs runThis 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.