Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
When writing a commit message, branch name or squash title — measure the repo's own convention first, Conventional Commits as fallback — even on a bare 'commit this'.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Use this skill when:
## Procedure: Establish the house convention firstDo NOT use when:
git-workflow skill)Conventional Commits is this suite's fallback, not a universal truth. A
repository that has demonstrably converged on another grammar gets that grammar;
imposing the shipped default there produces commits that read as foreign in
git log and in review. The precedence, highest first:
| Tier | Source | Binding? |
|---|---|---|
| 1 — configured | commitlint.config.* · .gitmessage · a commit-msg hook (husky / lefthook / .git/hooks) · CONTRIBUTING.md § Commits · a CI job that validates subjects · release automation that PARSES subjects (semantic-release, changesets, git-cliff, conventional-changelog) | yes — Class A, no approval needed |
| 1b — declared | git.commit_format in .git-convention.yml, the team's committed carrier at the repository root (ADR-283), where either value is a declaration — a team that commits ticket-scope chose it. Without the carrier, git.commit_format: ticket-conventional in a developer settings file, where only the non-default value declares anything: ticket-scope is also what a copied template carries, so it proves no choice. agent-config git:convention show --key commit_format names the file and the state; malformed or invalid declares nothing and is reported, never read as the default | yes — the user's own word, so no measurement and no ask |
| 2 — measured + approved | the consensus pass below, after the user says yes | yes, for this repository |
| 3 — measured, unapproved | the same pass before the user answers | no — advisory; report the mismatch, write Conventional |
| 4 — default | Conventional Commits | yes |
agent-config git:convention subject validates against tiers 1b–4 only. A
tier-1 commitlint config or commit-msg hook is named in a note: line as also
running at commit, possibly stricter; the verb never infers what it accepts and
never changes its exit for it.
Release automation is the trap that makes tier 1 outrank tier 2 even when the
history disagrees: a repo whose git log is 85 % [JIRA-123] Fix thing but
whose manifest (package.json, composer.json, pyproject.toml, Cargo.toml)
runs semantic-release or its ecosystem equivalent is a repo migrating toward
Conventional Commits, and the measurement is reading its past, not its intent.
Check for the parser before you trust the prevalence.
agent-config git:convention show --key commit_format # tier 1b: valid from .git-convention.yml (either value), or ticket-conventional from a settings file
ls commitlint.config.* .commitlintrc* .gitmessage .czrc 2>/dev/null
git config --get commit.template
ls .husky/commit-msg .git/hooks/commit-msg 2>/dev/null
grep -rniE 'semantic-release|git-cliff|conventional-changelog|release-please|commitlint' \
package.json composer.json pyproject.toml Cargo.toml .github/workflows/ .gitlab-ci.yml \
2>/dev/null | head
Every one of these produces candidates, not verdicts — open the file before
you act on the hit. A commit.template proves a template exists, not that it
constrains the subject: a .gitmessage carrying only a body checklist ends
nothing. CONTRIBUTING.md is prose and cannot be grepped for a convention —
grep -i commit matches "please commit early and often" — so read its commits
section if it has one and take the grammar from the sentences, not from the
match. Only a confirmed source ends the procedure, and when it does, say
which file answered.
changesets is deliberately not in the parser list: it reads .changeset/*.md
files and never parses a commit subject, so its presence says nothing about the
convention. The four that do parse subjects — semantic-release, git-cliff,
conventional-changelog, release-please — count only when the hit is a real
dependency or a wired job, not a mention in a comment.
The tier table above calls a confirmed hit Class A. That is exact for a machine
-readable config and loose for CONTRIBUTING.md, which carries no digest and is
read by a human judgement — treat a prose source as tier 1 in precedence and
as a quoted sentence in the report, so the next reader can check it.
agent-config git:convention measureThe measurement is code. agent-config git:convention measure [--limit N] [--family F] [--json] samples the history, classifies, caps, aggregates and
judges it, and writes nothing. The sample size, the exclusions and every
threshold it applies are the measure rows of the generated block in
commit-subject § The grammar,
rendered from the module the verb runs — read them there, never from memory.
What the verb reports, and why each choice is the one it makes:
| Dimension | Native source | What measure does with it |
|---|---|---|
| Subject grammar | git log on the trunk | classifies, caps, judges — the only dimension that can be established |
| Branch naming | git for-each-ref refs/remotes, without HEAD and the default branch | proposes a branch_pattern among the shapes the reader accepts, or no clear pattern — merged branches are often deleted, so the sample is thin |
| Update style | merge subjects that bring the default branch into a topic branch | shown, never adopted — update_strategy is a team decision, not a habit to copy |
| PR title shape, granularity | forge API · per-commit diff stat | not measured — granularity is destroyed where the repository squash-merges |
The trunk is origin/HEAD, else origin/main, else origin/master, else
HEAD — origin/HEAD is absent in a git init + git remote add checkout,
in many CI checkouts and in worktrees, and a chain that silently falls through
to an empty argument would hide that the resolution failed.
--first-parent is deliberately absent. On a merge-commit workflow the
trunk's first-parent chain is merge commits, which --no-merges then drops — the
two together leave only what was committed straight to the trunk, which on a
PR-based repo is nearly nothing. The convention lives in the feature commits.
Exclusions — bot authors, automation subjects (reverts, merges, release
chores, version bumps, bare versions) and bulk imports. The verb reads the file
count of every sampled commit in the same git log call, so the bulk check costs
no extra subprocess.
Classification — the family rows of the same block, matched in order,
first hit wins: conventional, ticket-conventional, ticket-prefix,
gitmoji, imperative-plain, else other. ticket-conventional precedes
ticket-prefix, which would otherwise swallow it as "ticket, then free text".
imperative-plain is deliberately mechanical — capitalised first word, no
trailing period — and does not test for the imperative mood: mood needs a
verb lexicon this procedure does not ship, and Update versus Updated is
exactly the pair a lexicon-free test cannot separate. A repo whose only
distinction from Conventional is mood reads as imperative-plain either way,
and the mood question belongs in the ask at step 3. classifier_version in the
verb's output and on the card names the revision of the families and exclusions
(ticket-conventional was added 2026-10-06; re-measure an older card).
Aggregation, capped per author, per half. Raw counts let one prolific author or an unfiltered bot define the house style; one vote per author lets a drive-by contributor with two commits veto it. The verb splits the sample into a newer and an older half by position first, then caps each author within each half — capping the sample as a whole would let one author's newest commits fill the quota and empty the older half, which is exactly where the coherence check has to look. Shares are over the capped total, and the verb reports that total; a percentage quoted against the raw eligible count describes a statistic nobody computed. With fewer than three authors the cap is off and the stricter uncapped bar applies: there is no dominance to guard against, and a cap would put the minimum sample out of reach of its own denominator. Two authors take the stricter branch rather than falling between the two.
Temporal coherence. The same family must lead the newer and the older
half. Halves that disagree mean the repository is migrating: the verb names
both families and establishes the newer half's family only if the newer half
clears the bar on its own (migrating in the output).
Verdict. At or above the bar the verb names the established family; below it, the reasons and the two strongest families with a grammar. Record the runner-up either way — a near-tie is itself the finding.
The share bar is the stricter of two council positions (2026-09-04, anthropic + openai, 2/2 quorum); the per-author cap is why a separate author-share clause was not also adopted — it already answers the dominance concern that clause existed for. These are policy heuristics, not statistically derived thresholds. Revisit-if: a labelled corpus of repositories shows a false-positive or false-negative rate that a different bar would fix.
Only an interactive /commit asks, and only while git:convention show --key commit_format
prints no convention established — no declaration and no approved card. It
asks once, as numbered options (per user-interaction), naming the family, the
share and the capped total it was computed over, the author count, and — if a
tier-1 parser exists — the tooling that would stop parsing:
/commit:in-chunks never asks: it reports the measurement in its summary and
uses the card, or the default. Until the user answers, a measurement is tier 3 —
advisory.
The answer is the approval, so /commit writes the card straight to
agents/memory/curated/conventions/approved/commit-subject.md — also when the
answer is Conventional Commits, so the question is never asked again.
git:convention measure --family <answer> prints the card's content: a Class-B
convention card carrying dominant_family, observed_n, dominant_share,
author_count, sample_window, classifier_version, confirm_against and
ticket_keys — aggregates only, never per-author identities. A measurement the
agent records without an answer goes to quarantine/ instead. ticket_keys
lists the approved project keys (ticket_keys: [DEV, OPS]): it is filled from the
user's answer when /commit meets a key not on it, and a commitlint config's
issuePrefixes are offered as the proposal, never written silently. Re-measure
and re-review when the share falls below 70 %, when a tier-1 source appears,
or when the newer half's family changes.
A card is one developer's memory; .git-convention.yml is the team's
declaration and outranks it (tier 1b). When the chosen family maps to a
git.commit_format value (conventional → ticket-scope, ticket-conventional
→ ticket-conventional) or a branch_pattern was proposed, measure — and
/commit after the answer — prints the file's ready-to-commit content.
update_strategy is never in it. The file is class C: the agent prints it and a
human creates and commits it. The one exception is creation on the user's
explicit yes this turn, through agent-config git:convention init --yes — once,
never over an existing carrier, never update_strategy, never committed by the
verb; the agent never writes or edits the file by hand.
Prevalence answers what happened, never what the agent is permitted to do — so a house convention can change how a commit reads, and can never change what the agent is allowed to commit. Three override policies:
| Policy | Applies to | Examples |
|---|---|---|
never | authorization · security · integrity · destructive history · agent provenance | commit-policy · secret-vcs-guard · git-history-discipline · non-destructive-by-default · no-attribution-footers |
explicit-only | governance preferences a maintainer may lift deliberately, that history may not | no-decorative-emojis-in-git-surfaces |
approved-observation | representation — subject grammar, ticket prefixes, type vocabulary, capitalisation, mood, subject length, body wrapping | this procedure |
So a repository whose history is 70 % emoji subjects does not license emoji
subjects: that rule is explicit-only, and the lift is the maintainer's word,
not the log's. A repository whose history is 60 % attribution trailers licenses
nothing at all. The council split here (one member argued subject-line emoji is
a defect and absolute, the other that it is governance taste) resolves to
explicit-only because both positions agree on the operative half — history
may not lift it.
Determine whether the change is:
featfixrefactordocstestci or buildchoreperfstyleClassify by user-visible or system-relevant intent, not by file type alone.
Check whether the change includes more than one unrelated concern.
If yes:
Read the ticket with agent-config git:convention ticket and place it per commit-subject § Placing the ticket — under ticket-conventional never in the scope.
update stuff, fix things)If compatibility is broken, add ! after type/scope:
feat(api)!: rename invoice status values
Or add BREAKING CHANGE: in the commit body/footer.
Only for a squash merge — rebase-and-merge keeps every commit (/pr:merge § 9 reads the method from the forge).
configured (commitlint.config.js), declared (git.commit_format: ticket-conventional),
approved (family ticket-prefix, 84% of 137), or default (Conventional Commits)chore and refactor — classify by intent, not by effort.md change can be feat if it's a new feature doc)refactor means NO behavior change — if behavior changes, use feat or fixunknown there rather than inferring it from the trunkApply the Frugality Charter to every commit message you author.
Examples in this artifact:
feat vs. chore
numbered choice when the type is decidable from the diff.Pre-save self-check:
no-attribution-footers)?never or explicit-only floorupdate stuff, fix bug, changesgit.commit_format is ticket-conventionalrefactor for bug fixeschore for meaningful behavior changescommit-conventions — base format, types, scope, examplesdocs/guidelines/php/git.md — type selection rules, anti-patterns, decision checklist/commit — uses this skill for message generation/fix commit-messages — retro-fits past subjects to the convention
this procedure establishescontexts/execution/project-intelligence.md — the Class-B
consensus-pass, quarantine→approved gate and deviation-staleness mechanism
this procedure instantiates for commit subjectsまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when reviewing UI for accessibility — WCAG 2.2 AA, keyboard nav, focus, ARIA, contrast, screen-reader semantics — even on 'is this a11y-OK?' or 'mach das barrierefrei'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when defining or auditing the activation event — aha-moment selection, retention correlation, falsifiable definition. Triggers on 'what is our aha moment', 'redefine activation'.
日本語の概要は準備中です。原文の説明を表示しています。
Use when capturing an architectural decision — file naming, next ADR number, Status / Context / Decision / Consequences, index regen; fires even without saying 'ADR'.
日本語の概要は準備中です。原文の説明を表示しています。
Adversarial critique — devil's advocate, stress-test, honest teardown ('poke holes', 'be brutal', 'was hältst du davon'); explicit request only. Routine code or design review → code-review.
日本語の概要は準備中です。原文の説明を表示しています。
Use when reading, creating, or updating agent documentation, module docs, roadmaps, or AGENTS.md. Understands the full .augment/, agents/, and copilot-instructions structure.
日本語の概要は準備中です。原文の説明を表示しています。
Use for an adversarial red-team / blue-team / auditor review of an AI agent's CONFIG + behaviour (rules, skills, MCP, hooks, permissions) — attack-chain → defensive-gap list, not a code audit.
日本語の概要は準備中です。原文の説明を表示しています。