git-commits-and-reporting

Installation
SKILL.md

Git commits and reporting

Every change reaches the reviewer twice: as a commit history anyone can search, and as a short plain-language message they actually read before the code. This skill makes both exact: Conventional Commits with the right trailers, a commit-msg hook and a checker that share one rule set, monotonic release tags, an evidence report whose numbers come from named files, and one clear question when something needs a person. Three scripts check the messages, the tags and the reports before anything is committed or sent.

Rules that must hold

  1. Headers are Conventional Commits: <type>(<scope>): <subject>, at most 72 characters, imperative, lowercase start, no trailing period. The scope is a folder under src/features/ or src/ (tasks, ui, data), a fixed scope (repo, deps, docs, ci, tooling, e2e, release, skills) or an extraScopes entry of contracts/commits.json; when multi-package, a workspace folder. ! only for a change that breaks persisted data or a public contract. The history is searched by scope, and the commit-msg hook rejects anything else.
  2. One behaviour per commit, its tests and code together, with a body that says why. When contracts/commits.json sets requirementRef, a feat or fix outside the exempt scopes also names the requirement it serves (TASK-12, #31, spec 4.2). The history is the proof that each behaviour was built test-first.
  3. Trailers sit in the last paragraph, and Gate-Change: is exact. Gate-Change: <reason> appears exactly when a changed file matches gatedPaths in quality-gates.json (gate configs only after the reviewer agreed; goldens, baselines, vectors and frozen fixtures only on purpose), and never otherwise. Spec-Change: <requirement> <what changed> only when a test expectation changed because the requirement changed, never for "the test was wrong". Reasons are at least 10 characters. Keep any Co-Authored-By: line the session asks for. Git reads trailers only there, and git log --grep '^Gate-Change:' must list every gate change and nothing else.
  4. Commit the checked file, with comments stripped: git commit --cleanup=strip -F reports/commit-message.txt after check-commits.mjs passes. Plain -F stores the template's # hint lines in the history.
  5. The hook and the checker are one rule set. scripts/git/commit-message-rules.ts (the commit-msg hook) and check-commits.mjs give the same 18 rule ids, and both test suites run scripts/git/commit-message-samples.json. A rule changes in both and in the sample list in one commit, so a message the hook accepts never fails the checker later.
  6. Never bypass or rewrite: no --no-verify, no LEFTHOOK=0, no amend, rebase or force-push of pushed commits. A failing hook means the commit is not ready.
  7. Nothing outward-facing without the developer's word in this session: no push, no tag push, no store upload (eas submit, Transporter, the Play API), no App Store Connect or Play Console change, no submission for review, no OTA update to a production channel. These cannot be taken back.
  8. Tags come only from the release step, after a successful upload, and are annotated (git tag -a v1.4.0+ios.14 -m "App Store build 14", so the tag check can read when each was made): vX.Y.Z+ios.<n> and vX.Y.Z+android.<n> on both lanes (EAS and local; an app that already tags a shared vX.Y.Z+<build> keeps it), then vX.Y.Z when the reviewer says "ship". Never move, delete or reuse a tag; build numbers only go up (Play refuses a lower versionCode, App Store Connect a reused build number). When multi-package, tags start with the app's folder: <app>/vX.Y.Z+ios.<n>.
  9. Every finished slice and release ends with the evidence report: the outcome first in users' words (at most 240 characters and 2 sentences), an Evidence: line, numbers copied from named files (never from memory), at most one request with its default, at most five things to look at, an honest "Not tested or not verified" list, technical detail last. The reviewer reads this before any code.
  10. Changes that are easy to miss get their own block; human checks are listed, never waited for. Goldens and baselines changed on purpose name the file and their Gate-Change commit; texts changed name every locale of the app and which drafts go to a native-language review. On-device checks and language reviews go under "Human checks (not blocking)". A rehearsal, a dry run or a placeholder FAIL is never cited as evidence.
  11. Stop and ask in the listed situations (references/stop-and-ask.md): one message, one request answerable in a word, how long it takes, the default that applies meanwhile; then keep working on anything else. Release stops (signing, agreements, 401/403, a missing app record, a failed processing state) are never retried.
  12. Never read, print, copy or commit a secret: store API keys (.p8, a Play service-account JSON), keystores and certificates, provisioning profiles, tokens, .env files, passwords. If a task seems to need one, ask.
Installs
5
GitHub Stars
12
First Seen
13 days ago