plugins/recording-change-intent/skills/recording-change-intent/SKILL.md
Requires an externalised rationale for high-risk changes - new public exports, new endpoints, auth edits, migrations, removed guards - recorded as an Intent commit trailer, an ADR reference, or a module intent register, and reports high-risk changes that carry none. Use when agent-generated or AI-assisted changes ship without a recorded why, when reviewers cannot tell what a diff was for, when a codebase is losing its decision history, or when setting up an intent gate alongside test and coverage gates.
npx skillsauth add jaktestowac/awesome-copilot-for-testers recording-change-intentInstall 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 change carries risk and the reason for it exists only in someone's head, a chat thread, or a ticket nobody will find again.
Tests prove a change works. Coverage proves it was executed. Neither records why it was made, which constraint forced the odd shape, or what was considered and rejected. That is intent debt, and it is the one debt an agent structurally cannot pay down: a coding agent can write the implementation, the tests, and the docs, but it cannot supply the human reason the work was commissioned. As AI-assisted output grows, intent debt grows with it while every other quality signal keeps looking healthy.
The fix is small and unfashionable: on high-risk changes, require the rationale to be written down somewhere durable and linked to the change.
refactor: extract computeRefund is a restated diff, not a rationale.Take the tags from scoping-change-relevance, or apply the rules in ./resources/high-risk-surface-rules.md directly. High-risk surface is:
critical-pathEverything else: no rationale required. Say so explicitly, so the gate is visibly proportionate rather than universally nagging.
Any one of these covers the change:
| Mechanism | Looks like | Best for |
| --- | --- | --- |
| Intent: trailer | free-text rationale in the commit message trailer block | the normal case |
| Intent-Ref: trailer | ADR-0042, QA-431, or a URL | a decision already written down elsewhere |
| ADR | a document in docs/adr/ that this change implements | architectural decisions with alternatives |
| Module intent register | an entry in .qa/intent.md covering these paths | stable module-level "why this exists" |
| Intent waiver | a path-scoped register entry | genuinely mechanical high-risk changes (bulk renames, codegen) |
git log <base>..HEAD --format='%H%n%B' # read the whole message, trailers included
git log <base>..HEAD --format='%(trailers:key=Intent,valueonly)'
git log <base>..HEAD --format='%(trailers:key=Intent-Ref,valueonly)'
Trailers are the standard Key: value block at the end of a commit message - the same mechanism as Signed-off-by:. No tooling, no external service, and they survive rebase and squash if written into the final message. See ./resources/intent-trailer-spec.md.
| Status | Meaning | Action | | --- | --- | --- | | Covered | a valid rationale covers this surface | nothing | | Undeclared | high-risk surface, no rationale anywhere | write one | | Malformed | a trailer exists but fails its rule - too short, unresolvable ref, wrong key | fix it, and quote the exact problem | | Restated diff | a rationale that only says what the diff says | rewrite it; this is the most common failure | | Waived | covered by a path-scoped intent waiver | cite the waiver and its expiry |
"Restated diff" deserves the separate row. Intent: added the refund endpoint passes any mechanical check and carries no information. A human reviewing intent records should reject it as they would reject an assertion-free test.
Where a rationale is missing, draft one from the evidence available - the diff, the linked ticket, the branch name, the surrounding code, the conversation. Then hand it to the author with the draft clearly marked as a draft, because a rationale the author has not confirmed is not a rationale.
A good record answers three questions in a few lines:
feat(billing): allow partial refunds on settled orders
Support desk cannot resolve disputes on settled orders without a full
reversal, which breaks the monthly reconciliation report.
Intent: Partial refunds must be idempotent because the provider retries
webhooks up to 5 times; we key on (orderId, providerRefundId) rather
than generating our own id, so a retry cannot double-refund. Rejected
a queue-based approach - it would have needed a new consumer and the
reconciliation window is 15 minutes, not seconds.
Intent-Ref: ADR-0042
More examples, including bad ones and why they fail, in ./resources/intent-trailer-spec.md.
critical-regulated: undeclared MUST surface is a blocker. standard: a warning. prototype-internal: informational.Layer 1 - commit-msg hook (advisory, bypassable). Warns when an Intent: trailer is too short or an Intent-Ref: looks malformed. Never blocks. Its job is to catch the typo while the author still has context.
Layer 2 - pre-push or CI (enforcing). Parses trailers on the commits in the range, resolves high-risk surface from the diff, and fails when MUST-level surface has no valid rationale. Wired into required checks. Hook snippets and a CI job are in ./resources/intent-trailer-spec.md.
Roll it out warn-first, like any gate: report for one iteration, then warn, then block on the escalated surface only (auth, migrations, endpoints), then everywhere the contract says MUST.
Intent: fix within a week.Intent-Ref: JIRA-1234 with no accessible ticket is a dead link with extra steps. Reference something durable, or write the reason inline.--no-verify'd - see governing-quality-waivers../resources/intent-trailer-spec.md - the trailer grammar, validation rules, good and bad examples, the commit-msg hook and the CI job./resources/high-risk-surface-rules.md - what counts as high-risk surface, per-profile severity, and the module intent register formatscoping-change-relevance - supplies the tags that identify high-risk surface in a diffgoverning-quality-waivers - the sibling record: why a check is off, versus why a change was madeassessing-comprehension-debt - an Intent: record is an input to the comprehension risk bandcode-review-advanced - where a human judges whether a rationale is real or restatedderiving-a-quality-contract - where intent-rationale is set to MUST, SHOULD, or COULD for this projectreporting-bugs - the same discipline applied to defects: evidence and reasoning, written down once, findable laterThis 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.