@event4u/agent-config 14.15.0 → 14.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +84 -153
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/inbox.md +172 -6
- package/dist/agent-src/commands/fix/commit-messages.md +336 -0
- package/dist/agent-src/commands/fix.md +5 -3
- package/dist/agent-src/rules/commit-conventions.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +7 -5
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +20 -2
- package/dist/agent-src/skills/aws-infrastructure/SKILL.md +41 -0
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +234 -4
- package/dist/agent-src/skills/design-intelligence/data/ux-guidelines.csv +99 -99
- package/dist/agent-src/skills/fe-design/SKILL.md +6 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +28 -0
- package/dist/agent-src/skills/iconography/SKILL.md +37 -6
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +29 -0
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +1 -0
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +1 -0
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +5 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/cli-delegate/cmd_conformance.js +158 -33
- package/dist/cli-delegate/cmd_explain.js +24 -112
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +47 -21
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +6 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +5 -4
- package/dist/hooks/dispatch.js +169 -41
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +160 -35
- package/dist/router.json +1 -1
- package/docs/guidelines/design-antipatterns.md +10 -2
- package/package.json +1 -1
- package/src/config/gate-violation-baselines.json +2 -2
- package/src/config/web-launch-readiness.json +1 -1
- package/src/scripts/_cli/explain_last/index.ts +1 -1
- package/src/scripts/_cli/explain_last/memory.ts +8 -104
- package/src/scripts/check_artefact_count_messaging.ts +9 -0
- package/src/scripts/check_release_highlights.ts +77 -4
- package/src/scripts/check_web_launch_readiness.ts +295 -15
- package/src/scripts/design_slop_rules.ts +19 -9
- package/src/scripts/git_authorization_hook.ts +257 -35
- package/src/scripts/hooks/block_unauthorized_git.ts +16 -4
- package/src/scripts/hooks/merge_impact.ts +68 -0
- package/src/scripts/measure_release_mix.ts +384 -0
- package/src/scripts/release.ts +4 -17
- package/src/scripts/release_drill.ts +154 -1
- package/src/scripts/release_mix_taxonomy.json +172 -0
- package/src/scripts/release_publication.ts +91 -0
- package/src/scripts/attest_artifact.ts +0 -193
|
@@ -99,6 +99,24 @@ Decoration is the only case where removal is the answer, which is why
|
|
|
99
99
|
per block: *if the motion never plays, is the content still there and
|
|
100
100
|
still understandable?* Record the answer, not the query.
|
|
101
101
|
|
|
102
|
+
**WCAG 2.2 additions — the six criteria 2.1 did not have.** An AA claim is
|
|
103
|
+
cumulative: AA conformance means every level-**A** criterion *and* every
|
|
104
|
+
level-AA one, so the two level-A rows below sit inside the claim, not beneath
|
|
105
|
+
it. Each is audited on its own; a surface that skips one is not AA under 2.2.
|
|
106
|
+
|
|
107
|
+
| SC | Level | Testable condition | Failure |
|
|
108
|
+
|---|---|---|---|
|
|
109
|
+
| 2.4.11 Focus Not Obscured (Min.) | AA | `Tab` through every focusable element with sticky headers / footers / cookie bars present — the focused element stays at least partially visible, never fully covered | A sticky bar hides the focused row; the keyboard user cannot see where they are |
|
|
110
|
+
| 2.5.7 Dragging Movements | AA | Every drag interaction (reorder, slider, map pan, kanban) has a single-pointer alternative that is not a drag — buttons, a menu, or arrow keys | Reorder is drag-only, so a user who cannot drag cannot reorder |
|
|
111
|
+
| 2.5.8 Target Size (Min.) | AA | Every pointer target is ≥ 24×24 CSS px, **or** carries ≥ 24 px spacing to its neighbours, **or** is one of the stated exceptions (inline text, user-agent-controlled, essential) | 16 px icon buttons packed edge-to-edge in a toolbar |
|
|
112
|
+
| 3.3.8 Accessible Authentication (Min.) | AA | No login step requires a cognitive function test (remembering, transcribing, puzzle-solving) without an alternative — a password manager can paste, and paste is not blocked | An OTP field that blocks paste, or "type the 3rd character of your memorable word" |
|
|
113
|
+
| 3.2.6 Consistent Help | A | Where a help mechanism (contact link, chat, self-help) repeats across pages, it appears in the same relative order on each | Support link in the header on one page, buried in the footer on the next |
|
|
114
|
+
| 3.3.7 Redundant Entry | A | Information already entered in the same process is auto-populated or selectable, unless re-entry is essential (confirming a password is essential) | A 4-step checkout asking for the same address twice |
|
|
115
|
+
|
|
116
|
+
Outside an AA claim, and stated here rather than left silent: **2.4.12 Focus Not
|
|
117
|
+
Obscured (Enhanced)** and **2.4.13 Focus Appearance** are level **AAA**. Audit
|
|
118
|
+
them on request; their absence is not an AA failure.
|
|
119
|
+
|
|
102
120
|
### 3. Run the keyboard pass
|
|
103
121
|
|
|
104
122
|
`Tab` from page start: every interactive element receives focus,
|
|
@@ -191,8 +209,8 @@ values.
|
|
|
191
209
|
|
|
192
210
|
WCAG 2.2 AA compliance is non-negotiable detail — each success criterion
|
|
193
211
|
has a specific testable condition, failure mode, and remediation path.
|
|
194
|
-
The skill carries the
|
|
195
|
-
procedures (not just "check contrast"), keyboard-navigation patterns
|
|
212
|
+
The skill carries the WCAG 2.2 additions with concrete test
|
|
213
|
+
procedures per criterion (not just "check contrast"), keyboard-navigation patterns
|
|
196
214
|
(roving tabindex, trap management, escape-key handling), ARIA role/
|
|
197
215
|
property/state tables, and screen-reader-specific edge cases per
|
|
198
216
|
assistive technology. Condensing to "check contrast and add aria-labels"
|
|
@@ -127,6 +127,47 @@ are typically managed via **Terraform + Terragrunt** in a separate infrastructur
|
|
|
127
127
|
|
|
128
128
|
See the `terraform` and `terragrunt` skills for general IaC conventions.
|
|
129
129
|
|
|
130
|
+
### Least privilege and permissive defaults
|
|
131
|
+
|
|
132
|
+
The conventions above describe how this project deploys. This section is the
|
|
133
|
+
floor underneath them, and it holds whether or not a given resource is managed
|
|
134
|
+
here or in the infrastructure repo.
|
|
135
|
+
|
|
136
|
+
- **Least-privilege IAM, always.** A task role, an OIDC role, or an execution
|
|
137
|
+
role enumerates its actions and its resource ARNs. `Action: *` and
|
|
138
|
+
`Resource: *` are not shorthand for "we will scope it later" - one
|
|
139
|
+
compromised task credential then reaches every service and object in the
|
|
140
|
+
account. A wildcard needs a named, reviewed exception written beside it.
|
|
141
|
+
- **Least-privilege networking.** A security group opens a port to the
|
|
142
|
+
narrowest source that works: another security group id, a prefix list, a
|
|
143
|
+
known CIDR. An internet-wide source belongs to a public listener and nothing
|
|
144
|
+
else.
|
|
145
|
+
- **Permissive defaults are decisions.** A bucket with no public-access block,
|
|
146
|
+
a database with `publicly_accessible` left true, a volume or snapshot with no
|
|
147
|
+
encryption block - each of these works either way, which is why it survives
|
|
148
|
+
review. Treat an absent security block as a finding, not as a silence.
|
|
149
|
+
- **Credentials come from Secrets Manager, never from a vars file.** A literal
|
|
150
|
+
password, token, or key in a `.vars.yaml` or a task-definition template is
|
|
151
|
+
the same defect as one in `.tf`, and the state and template files are as
|
|
152
|
+
readable as the code.
|
|
153
|
+
|
|
154
|
+
Do not restate the mitigation here. The abuse case, the required controls, and
|
|
155
|
+
the negative test for each of the four live in the `infrastructure` surface
|
|
156
|
+
class of [`threat-modeling`](../threat-modeling/SKILL.md)'s corpus, which is
|
|
157
|
+
their single authority. Ask that skill's grounded-corpus step for the
|
|
158
|
+
`infrastructure` surface class - it carries the invocation - describing the
|
|
159
|
+
change, e.g. *iam role with a wildcard action*.
|
|
160
|
+
|
|
161
|
+
Those rows carry a `Decided by:` clause naming the check that actually decides
|
|
162
|
+
each one. For the IAM, networking, storage, and encryption rows it reads NO
|
|
163
|
+
CHECK IN THIS REPOSITORY; only the credential-in-a-file row names a real gate.
|
|
164
|
+
Nothing here parses IAM policy documents or cloud config, so the discipline
|
|
165
|
+
above is the enforcement, and saying otherwise would claim coverage this
|
|
166
|
+
package does not have.
|
|
167
|
+
|
|
168
|
+
See also the `terraform` skill's *Permissive defaults and missing security
|
|
169
|
+
blocks* section for the backstop greps over a `.tf` tree.
|
|
170
|
+
|
|
130
171
|
## Output format
|
|
131
172
|
|
|
132
173
|
1. Modified infrastructure config/template files
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: medium
|
|
3
3
|
name: conventional-commits-writing
|
|
4
|
-
description: "When writing commit
|
|
4
|
+
description: "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'."
|
|
5
5
|
domain: process
|
|
6
6
|
scope:
|
|
7
7
|
write: []
|
|
@@ -22,6 +22,8 @@ packs:
|
|
|
22
22
|
|
|
23
23
|
Use this skill when:
|
|
24
24
|
|
|
25
|
+
- Committing in a repository whose conventions you have not established this
|
|
26
|
+
session — run `## Procedure: Establish the house convention` first
|
|
25
27
|
- Generating a commit message from staged changes
|
|
26
28
|
- Generating a squash merge title from a PR
|
|
27
29
|
- Deciding the correct Conventional Commit type for a change
|
|
@@ -34,6 +36,217 @@ Do NOT use when:
|
|
|
34
36
|
- The message is already correct and does not need review
|
|
35
37
|
- Following the Git workflow (use `git-workflow` skill)
|
|
36
38
|
|
|
39
|
+
## Procedure: Establish the house convention (run FIRST, before any message)
|
|
40
|
+
|
|
41
|
+
Conventional Commits is this suite's **fallback**, not a universal truth. A
|
|
42
|
+
repository that has demonstrably converged on another grammar gets that grammar;
|
|
43
|
+
imposing the shipped default there produces commits that read as foreign in
|
|
44
|
+
`git log` and in review. The precedence, highest first:
|
|
45
|
+
|
|
46
|
+
| Tier | Source | Binding? |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| **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 |
|
|
49
|
+
| **2 — measured + approved** | the consensus pass below, after the user says yes | yes, for this repository |
|
|
50
|
+
| **3 — measured, unapproved** | the same pass before the user answers | **no — advisory**; report the mismatch, write Conventional |
|
|
51
|
+
| **4 — default** | Conventional Commits | yes |
|
|
52
|
+
|
|
53
|
+
Release automation is the trap that makes tier 1 outrank tier 2 even when the
|
|
54
|
+
history disagrees: a repo whose `git log` is 85 % `[JIRA-123] Fix thing` but
|
|
55
|
+
whose manifest (`package.json`, `composer.json`, `pyproject.toml`, `Cargo.toml`)
|
|
56
|
+
runs `semantic-release` or its ecosystem equivalent is a repo **migrating toward**
|
|
57
|
+
Conventional Commits, and the measurement is reading its past, not its intent.
|
|
58
|
+
Check for the parser before you trust the prevalence.
|
|
59
|
+
|
|
60
|
+
### 1. Look for tier 1 before measuring anything
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
ls commitlint.config.* .commitlintrc* .gitmessage .czrc 2>/dev/null
|
|
64
|
+
git config --get commit.template
|
|
65
|
+
ls .husky/commit-msg .git/hooks/commit-msg 2>/dev/null
|
|
66
|
+
grep -rniE 'semantic-release|git-cliff|conventional-changelog|release-please|commitlint' \
|
|
67
|
+
package.json composer.json pyproject.toml Cargo.toml .github/workflows/ .gitlab-ci.yml \
|
|
68
|
+
2>/dev/null | head
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Every one of these produces candidates, not verdicts — open the file before
|
|
72
|
+
you act on the hit.** A `commit.template` proves a template exists, not that it
|
|
73
|
+
constrains the subject: a `.gitmessage` carrying only a body checklist ends
|
|
74
|
+
nothing. `CONTRIBUTING.md` is prose and cannot be grepped for a convention —
|
|
75
|
+
`grep -i commit` matches "please commit early and often" — so read its commits
|
|
76
|
+
section if it has one and take the grammar from the sentences, not from the
|
|
77
|
+
match. Only a **confirmed** source ends the procedure, and when it does, say
|
|
78
|
+
which file answered.
|
|
79
|
+
|
|
80
|
+
`changesets` is deliberately not in the parser list: it reads `.changeset/*.md`
|
|
81
|
+
files and never parses a commit subject, so its presence says nothing about the
|
|
82
|
+
convention. The four that do parse subjects — semantic-release, git-cliff,
|
|
83
|
+
conventional-changelog, release-please — count only when the hit is a real
|
|
84
|
+
dependency or a wired job, not a mention in a comment.
|
|
85
|
+
|
|
86
|
+
The tier table above calls a confirmed hit Class A. That is exact for a machine
|
|
87
|
+
-readable config and loose for `CONTRIBUTING.md`, which carries no digest and is
|
|
88
|
+
read by a human judgement — treat a prose source as tier 1 in **precedence** and
|
|
89
|
+
as a quoted sentence in the report, so the next reader can check it.
|
|
90
|
+
|
|
91
|
+
### 2. Sample the history — native source per dimension
|
|
92
|
+
|
|
93
|
+
Only **commit subjects** are reliably measurable from a clone. Branch names,
|
|
94
|
+
PR titles and commit granularity have different native sources, and `unknown`
|
|
95
|
+
is a valid, honest result for each:
|
|
96
|
+
|
|
97
|
+
| Dimension | Native source | Measurable from a clone? |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| Subject grammar | `git log` | yes |
|
|
100
|
+
| Branch naming | forge refs / `git branch -r` | partially — merged branches are often deleted |
|
|
101
|
+
| PR title shape | forge API (`gh pr list`) | only with forge access |
|
|
102
|
+
| Granularity (atomic vs batched) | per-commit diff stat | **no** where the repo squash-merges — the evidence was destroyed at merge |
|
|
103
|
+
|
|
104
|
+
Resolve the trunk explicitly. `origin/HEAD` is set by `git clone` and is absent
|
|
105
|
+
in a `git init` + `git remote add` checkout, in many CI checkouts and in
|
|
106
|
+
worktrees, where the sample command would die rather than return nothing:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
TRUNK=$(git symbolic-ref -q --short refs/remotes/origin/HEAD)
|
|
110
|
+
[ -n "$TRUNK" ] || TRUNK=$(git rev-parse -q --verify origin/main >/dev/null && echo origin/main)
|
|
111
|
+
[ -n "$TRUNK" ] || TRUNK=$(git rev-parse -q --verify origin/master >/dev/null && echo origin/master)
|
|
112
|
+
[ -n "$TRUNK" ] || TRUNK=HEAD # no remote at all: this checkout is the trunk
|
|
113
|
+
git log "$TRUNK" --no-merges -n 200 --since='24 months ago' \
|
|
114
|
+
--pretty=format:'%H%x09%aN%x09%aE%x09%s'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**`--first-parent` is deliberately absent.** On a merge-commit workflow the
|
|
118
|
+
trunk's first-parent chain is merge commits, which `--no-merges` then drops —
|
|
119
|
+
the two together leave only what was committed straight to the trunk, which on
|
|
120
|
+
a PR-based repo is nearly nothing. The convention lives in the feature commits,
|
|
121
|
+
so walk the whole reachable history and exclude merges alone.
|
|
122
|
+
|
|
123
|
+
The terminal `HEAD` matters as much as the first line: a chain that ends with an
|
|
124
|
+
unset `TRUNK` hands `git log` an empty argument, which walks `HEAD` anyway —
|
|
125
|
+
silently doing the right thing on a local repo while hiding that the resolution
|
|
126
|
+
failed on one where it should not have.
|
|
127
|
+
|
|
128
|
+
`%H` leads the format because two of the exclusions below need the commit, not
|
|
129
|
+
just its subject. Drop, from the sample:
|
|
130
|
+
|
|
131
|
+
- **bot authors** — `[bot]`, `dependabot`, `renovate`, `github-actions`,
|
|
132
|
+
`semantic-release`, `release-please`;
|
|
133
|
+
- **automation subjects** — `^Revert `, `^Merge `, `chore(release)`,
|
|
134
|
+
`^Bump `, a bare `v?\d+\.\d+\.\d+`;
|
|
135
|
+
- **bulk imports** — resolve with the hash the format carries:
|
|
136
|
+
`git show --stat --oneline <sha> | tail -1` and drop anything over 500 files.
|
|
137
|
+
Check this only for the handful of subjects that read like an import; running
|
|
138
|
+
it per commit costs 200 subprocesses to remove two rows.
|
|
139
|
+
|
|
140
|
+
### 3. Classify each surviving subject
|
|
141
|
+
|
|
142
|
+
Match in order, first hit wins. These are POSIX extended regular expressions,
|
|
143
|
+
given outside a table because a markdown cell would need the alternation pipes
|
|
144
|
+
escaped and `\|` in ERE is a literal pipe, not an alternation:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
conventional ^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([^)]+\))?!?:
|
|
148
|
+
ticket-prefix ^\[[A-Z][A-Z0-9]+-[0-9]+\][: ]|^[A-Z][A-Z0-9]+-[0-9]+[: ]
|
|
149
|
+
gitmoji ^:[a-z0-9_+-]+:[[:space:]]|^[^[:ascii:][:space:]]
|
|
150
|
+
imperative-plain ^[A-Z][a-z]+[[:space:]].*[^.]$
|
|
151
|
+
other everything else
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
`imperative-plain` is deliberately mechanical — capitalised first word, no
|
|
155
|
+
trailing period — and does **not** test for the imperative mood. Mood needs a
|
|
156
|
+
verb lexicon this procedure does not ship, and `Update` versus `Updated` is
|
|
157
|
+
exactly the pair a lexicon-free test cannot separate. That is a stated limit of
|
|
158
|
+
the classifier, not a gap to fill by guessing: a repo whose only distinction
|
|
159
|
+
from Conventional is mood will read as `imperative-plain` either way, and the
|
|
160
|
+
mood question belongs in the ask at step 6.
|
|
161
|
+
|
|
162
|
+
`classifier_version` in step 7 names the revision of THIS section — the five
|
|
163
|
+
patterns above plus the exclusions in step 2. It is a provenance stamp so a
|
|
164
|
+
later measurement can be compared against a like one; it does not claim an
|
|
165
|
+
executable classifier ships anywhere in the tree.
|
|
166
|
+
|
|
167
|
+
Record the runner-up family too — a near-tie is itself the finding.
|
|
168
|
+
|
|
169
|
+
### 4. Aggregate, capped per author, per half
|
|
170
|
+
|
|
171
|
+
Raw commit counts let one prolific author or an unfiltered bot define the house
|
|
172
|
+
style; one-vote-per-author lets a drive-by contributor with two commits veto it.
|
|
173
|
+
Cap instead: split the sample into a newer and an older half by position first,
|
|
174
|
+
then let **each author contribute at most 20 commits to each half**. Capping the
|
|
175
|
+
sample as a whole would let one author's newest 20 fill their entire quota and
|
|
176
|
+
empty the older half, which is precisely where step 5's coherence check has to
|
|
177
|
+
look.
|
|
178
|
+
|
|
179
|
+
Compute the dominant family's share over the **capped** total, and report that
|
|
180
|
+
total — a percentage quoted against the raw eligible count describes a statistic
|
|
181
|
+
nobody computed.
|
|
182
|
+
|
|
183
|
+
With fewer than three authors the cap is **off**: there is no dominance to guard
|
|
184
|
+
against, and a cap of 20 would put the single-maintainer bar's own `n ≥ 30`
|
|
185
|
+
out of reach of its denominator.
|
|
186
|
+
|
|
187
|
+
### 5. The evidence bar
|
|
188
|
+
|
|
189
|
+
A measured convention is eligible to be proposed only when **all** hold:
|
|
190
|
+
|
|
191
|
+
- **n ≥ 30** eligible commits after exclusions;
|
|
192
|
+
- **≥ 80 %** capped-weighted share for the dominant family, over **≥ 3 human
|
|
193
|
+
authors** — or, with **one or two** authors, an uncapped **≥ 90 %** share over
|
|
194
|
+
n ≥ 30. Two authors take the stricter branch rather than falling between the
|
|
195
|
+
two: a two-person repo is a small-team repo, and leaving it unreachable by
|
|
196
|
+
both branches would make the measurement permanently advisory there;
|
|
197
|
+
- **temporal coherence** — the same family is dominant in the newer half of
|
|
198
|
+
the sample *and* in the older half. If the halves disagree materially the
|
|
199
|
+
repository is **migrating**: abstain, name the change point, and use the
|
|
200
|
+
newer half's family only if it independently clears the bar.
|
|
201
|
+
|
|
202
|
+
> The 80 % figure is the stricter of two council positions (2026-09-04,
|
|
203
|
+
> anthropic + openai, 2/2 quorum: 70 % vs 80 % + a two-thirds-of-authors
|
|
204
|
+
> clause). The per-author cap is why the separate author-share clause was not
|
|
205
|
+
> also adopted — it already answers the dominance concern the clause existed
|
|
206
|
+
> for. These are policy heuristics, not statistically derived thresholds.
|
|
207
|
+
> **Revisit-if:** a labelled corpus of repositories shows a false-positive or
|
|
208
|
+
> false-negative rate that a different bar would fix.
|
|
209
|
+
|
|
210
|
+
### 6. Ask — never adopt silently
|
|
211
|
+
|
|
212
|
+
Below the bar, or on a migrating repo: use Conventional Commits and say so
|
|
213
|
+
**once**, in one line, when a commit is actually requested. Do not ask.
|
|
214
|
+
|
|
215
|
+
At or above the bar, ask once, as numbered options (per `user-interaction`):
|
|
216
|
+
name the family, the share **and the capped total it was computed over**, the
|
|
217
|
+
author count, and — if a tier-1 parser exists — the tooling that would stop
|
|
218
|
+
parsing.
|
|
219
|
+
|
|
220
|
+
### 7. Persist the answer where the next session finds it
|
|
221
|
+
|
|
222
|
+
Write the measurement as a Class-B convention card under
|
|
223
|
+
`agents/memory/curated/conventions/quarantine/commit-subject.md`; the user's
|
|
224
|
+
approval is what moves it to `approved/`. Carry `observed_n`,
|
|
225
|
+
`dominant_share`, `author_count`, `sample_window`, `classifier_version`, and
|
|
226
|
+
`confirm_against` — aggregates only, never per-author identities. Re-measure
|
|
227
|
+
and re-review when the share falls below **70 %**, when a tier-1 source
|
|
228
|
+
appears, or when the newer half's family changes.
|
|
229
|
+
|
|
230
|
+
## What a measurement may never lower
|
|
231
|
+
|
|
232
|
+
Prevalence answers *what happened*, never *what the agent is permitted to do* —
|
|
233
|
+
so a house convention can change how a commit reads, and can never change what
|
|
234
|
+
the agent is allowed to commit. Three override policies:
|
|
235
|
+
|
|
236
|
+
| Policy | Applies to | Examples |
|
|
237
|
+
|---|---|---|
|
|
238
|
+
| `never` | authorization · security · integrity · destructive history · agent provenance | [`commit-policy`](../../rules/commit-policy.md) · [`secret-vcs-guard`](../../rules/secret-vcs-guard.md) · [`git-history-discipline`](../../rules/git-history-discipline.md) · [`non-destructive-by-default`](../../rules/non-destructive-by-default.md) · [`no-attribution-footers`](../../rules/no-attribution-footers.md) |
|
|
239
|
+
| `explicit-only` | governance preferences a maintainer may lift deliberately, that history may not | [`no-decorative-emojis-in-git-surfaces`](../../rules/no-decorative-emojis-in-git-surfaces.md) |
|
|
240
|
+
| `approved-observation` | representation — subject grammar, ticket prefixes, type vocabulary, capitalisation, mood, subject length, body wrapping | this procedure |
|
|
241
|
+
|
|
242
|
+
So a repository whose history is 70 % emoji subjects does **not** license emoji
|
|
243
|
+
subjects: that rule is `explicit-only`, and the lift is the maintainer's word,
|
|
244
|
+
not the log's. A repository whose history is 60 % attribution trailers licenses
|
|
245
|
+
nothing at all. The council split here (one member argued subject-line emoji is
|
|
246
|
+
a defect and absolute, the other that it is governance taste) resolves to
|
|
247
|
+
`explicit-only` because both positions agree on the operative half — **history
|
|
248
|
+
may not lift it**.
|
|
249
|
+
|
|
37
250
|
## Procedure: Generate commit message
|
|
38
251
|
|
|
39
252
|
### 1. Identify the actual intent
|
|
@@ -110,9 +323,12 @@ Or add `BREAKING CHANGE:` in the commit body/footer.
|
|
|
110
323
|
|
|
111
324
|
## Output format
|
|
112
325
|
|
|
113
|
-
1.
|
|
114
|
-
|
|
115
|
-
|
|
326
|
+
1. The convention in force and the tier that established it — `configured
|
|
327
|
+
(commitlint.config.js)`, `approved (ticket-prefix, 84% of 137)`, or
|
|
328
|
+
`default (Conventional Commits)`
|
|
329
|
+
2. Recommended commit message(s)
|
|
330
|
+
3. Brief rationale for type choice
|
|
331
|
+
4. Split suggestion if the change should be multiple commits
|
|
116
332
|
|
|
117
333
|
## Gotcha
|
|
118
334
|
|
|
@@ -120,6 +336,10 @@ Or add `BREAKING CHANGE:` in the commit body/footer.
|
|
|
120
336
|
- File type alone does not determine commit type (e.g. a `.md` change can be `feat` if it's a new feature doc)
|
|
121
337
|
- Squash merge titles should describe the net effect, not every internal detail
|
|
122
338
|
- `refactor` means NO behavior change — if behavior changes, use `feat` or `fix`
|
|
339
|
+
- A high dominant share over a long window can hide a format change six months
|
|
340
|
+
ago — the temporal-coherence check, not the share, is what catches it
|
|
341
|
+
- Squash-merging destroys commit-granularity evidence; report granularity as
|
|
342
|
+
`unknown` there rather than inferring it from the trunk
|
|
123
343
|
|
|
124
344
|
## Frugality Standards
|
|
125
345
|
|
|
@@ -146,6 +366,11 @@ to every commit message you author.
|
|
|
146
366
|
|
|
147
367
|
## Do NOT
|
|
148
368
|
|
|
369
|
+
- Do NOT impose Conventional Commits on a repository that has a configured or
|
|
370
|
+
approved convention of its own
|
|
371
|
+
- Do NOT adopt a measured convention without asking — below tier 2 it is
|
|
372
|
+
advisory, and silence is not approval
|
|
373
|
+
- Do NOT let prevalence lift a `never` or `explicit-only` floor
|
|
149
374
|
- Do NOT use vague messages: `update stuff`, `fix bug`, `changes`
|
|
150
375
|
- Do NOT use `refactor` for bug fixes
|
|
151
376
|
- Do NOT use `chore` for meaningful behavior changes
|
|
@@ -157,3 +382,8 @@ to every commit message you author.
|
|
|
157
382
|
- Rule: `commit-conventions` — base format, types, scope, examples
|
|
158
383
|
- Guideline: `docs/guidelines/php/git.md` — type selection rules, anti-patterns, decision checklist
|
|
159
384
|
- Command: `/commit` — uses this skill for message generation
|
|
385
|
+
- Command: `/fix commit-messages` — retro-fits past subjects to the convention
|
|
386
|
+
this procedure establishes
|
|
387
|
+
- Context: `contexts/execution/project-intelligence.md` — the Class-B
|
|
388
|
+
consensus-pass, quarantine→approved gate and deviation-staleness mechanism
|
|
389
|
+
this procedure instantiates for commit subjects
|
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
No,Category,Issue,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
|
|
2
|
-
1,Navigation,Smooth Scroll,Web,Anchor links should scroll smoothly to target section,Use scroll-behavior: smooth on html element,Jump directly without transition,html { scroll-behavior: smooth; },<a href='#section'> without CSS,High
|
|
3
|
-
2,Navigation,Sticky Navigation,Web,Fixed nav should not obscure content,Add padding-top to body equal to nav height,Let nav overlap first section content,pt-20 (if nav is h-20),No padding compensation,Medium
|
|
4
|
-
3,Navigation,Active State,All,Current page/section should be visually indicated,Highlight active nav item with color/underline,No visual feedback on current location,text-primary border-b-2,All links same style,Medium
|
|
5
|
-
4,Navigation,Back Button,Mobile,Users expect back to work predictably,Preserve navigation history properly,Break browser/app back button behavior,history.pushState(),location.replace(),High
|
|
6
|
-
5,Navigation,Deep Linking,All,URLs should reflect current state for sharing,Update URL on state/view changes,Static URLs for dynamic content,Use query params or hash,Single URL for all states,Medium
|
|
7
|
-
6,Navigation,Breadcrumbs,Web,Show user location in site hierarchy,Use for sites with 3+ levels of depth,Use for flat single-level sites,Home > Category > Product,Only on deep nested pages,Low
|
|
8
|
-
7,Animation,Excessive Motion,All,Too many animations cause distraction and motion sickness,Animate 1-2 key elements per view maximum,Animate everything that moves,Single hero animation,animate-bounce on 5+ elements,High
|
|
9
|
-
8,Animation,Duration Timing,All,Animations should feel responsive not sluggish,Use 150-300ms for micro-interactions,Use animations longer than 500ms for UI,transition-
|
|
10
|
-
9,Animation,Reduced Motion,All,Respect user's motion preferences,Check prefers-reduced-motion media query,Ignore accessibility motion settings,@media (prefers-reduced-motion: reduce),No motion query check,High
|
|
11
|
-
10,Animation,Loading States,All,Show feedback during async operations,Use skeleton screens or spinners,Leave UI frozen with no feedback,animate-pulse skeleton,Blank screen while loading,High
|
|
12
|
-
11,Animation,Hover vs Tap,All,Hover effects don't work on touch devices,Use click/tap for primary interactions,Rely only on hover for important actions,onClick handler,onMouseEnter only,High
|
|
13
|
-
12,Animation,Continuous Animation,All,Infinite animations are distracting,Use for loading indicators only,Use for decorative elements,animate-spin on loader,animate-bounce on icons,Medium
|
|
14
|
-
13,Animation,Transform Performance,Web,Some CSS properties trigger expensive repaints,Use transform and opacity for animations,Animate width/height/top/left properties,transform: translateY(),top: 10px animation,Medium
|
|
15
|
-
14,Animation,Easing Functions,All,Linear motion feels robotic,Use ease-out for entering ease-in for exiting,Use linear for UI transitions,ease-out,linear,Low
|
|
16
|
-
15,Layout,Z-Index Management,Web,Stacking context conflicts cause hidden elements,Define z-index scale system (10 20 30 50),Use arbitrary large z-index values,z-10 z-20 z-50,z-[9999],High
|
|
17
|
-
16,Layout,Overflow Hidden,Web,Hidden overflow can clip important content,Test all content fits within containers,Blindly apply overflow-hidden,overflow-auto with scroll,overflow-hidden truncating content,Medium
|
|
18
|
-
17,Layout,Fixed Positioning,Web,Fixed elements can overlap or be inaccessible,Account for safe areas and other fixed elements,Stack multiple fixed elements carelessly,Fixed nav + fixed bottom with gap,Multiple overlapping fixed elements,Medium
|
|
19
|
-
18,Layout,Stacking Context,Web,New stacking contexts reset z-index,Understand what creates new stacking context,Expect z-index to work across contexts,Parent with z-index isolates children,z-index: 9999 not working,Medium
|
|
20
|
-
19,Layout,Content Jumping,Web,Layout shift when content loads is jarring,Reserve space for async content,Let images/content push layout around,aspect-ratio or fixed height,No dimensions on images,High
|
|
21
|
-
20,Layout,Viewport Units,Web,100vh can be problematic on mobile browsers,Use dvh or account for mobile browser chrome,Use 100vh for full-screen mobile layouts,min-h-dvh or min-h-screen,h-screen on mobile,Medium
|
|
22
|
-
21,Layout,Container Width,Web,Content too wide is hard to read,Limit max-width for text content (65-75ch),Let text span full viewport width,max-w-prose or max-w-3xl,Full width paragraphs,Medium
|
|
23
|
-
22,Touch,Touch Target Size,Mobile,Small buttons are hard to tap accurately,Minimum 44x44px touch targets,Tiny clickable areas,min-h-[44px] min-w-[44px],w-6 h-6 buttons,High
|
|
24
|
-
23,Touch,Touch Spacing,Mobile,Adjacent touch targets need adequate spacing,Minimum 8px gap between touch targets,Tightly packed clickable elements,gap-2 between buttons,gap-0 or gap-1,Medium
|
|
25
|
-
24,Touch,Gesture Conflicts,Mobile,Custom gestures can conflict with system,Avoid horizontal swipe on main content,Override system gestures,Vertical scroll primary,Horizontal swipe carousel only,Medium
|
|
26
|
-
25,Touch,Tap Delay,Mobile,300ms tap delay feels laggy,Use touch-action CSS or fastclick,Default mobile tap handling,touch-action: manipulation,No touch optimization,Medium
|
|
27
|
-
26,Touch,Pull to Refresh,Mobile,Accidental refresh is frustrating,Disable where not needed,Enable by default everywhere,overscroll-behavior: contain,Default overscroll,Low
|
|
28
|
-
27,Touch,Haptic Feedback,Mobile,Tactile feedback improves interaction feel,Use for confirmations and important actions,Overuse vibration feedback,navigator.vibrate(10),Vibrate on every tap,Low
|
|
29
|
-
28,Interaction,Focus States,All,Keyboard users need visible focus indicators,Use visible focus rings on interactive elements,Remove focus outline without replacement,focus:ring-2 focus:ring-blue-500,outline-none without alternative,High
|
|
30
|
-
29,Interaction,Hover States,Web,Visual feedback on interactive elements,Change cursor and add subtle visual change,No hover feedback on clickable elements,hover:bg-gray-100 cursor-pointer,No hover style,Medium
|
|
31
|
-
30,Interaction,Active States,All,Show immediate feedback on press/click,Add pressed/active state visual change,No feedback during interaction,active:scale-95,No active state,Medium
|
|
32
|
-
31,Interaction,Disabled States,All,Clearly indicate non-interactive elements,Reduce opacity and change cursor,Confuse disabled with normal state,opacity-50 cursor-not-allowed,Same style as enabled,Medium
|
|
33
|
-
32,Interaction,Loading Buttons,All,Prevent double submission during async actions,Disable button and show loading state,Allow multiple clicks during processing,disabled={loading} spinner,Button clickable while loading,High
|
|
34
|
-
33,Interaction,Error Feedback,All,Users need to know when something fails,Show clear error messages near problem,Silent failures with no feedback,Red border + error message,No indication of error,High
|
|
35
|
-
34,Interaction,Success Feedback,All,Confirm successful actions to users,Show success message or visual change,No confirmation of completed action,Toast notification or checkmark,Action completes silently,Medium
|
|
36
|
-
35,Interaction,Confirmation Dialogs,All,Prevent accidental destructive actions,Confirm before delete/irreversible actions,Delete without confirmation,Are you sure modal,Direct delete on click,High
|
|
37
|
-
36,Accessibility,Color Contrast,All,Text must be readable against background,Minimum 4.5:1 ratio for normal text,Low contrast text,#333 on white (7:1),#999 on white (2.8:1),High
|
|
38
|
-
37,Accessibility,Color Only,All,Don't convey information by color alone,Use icons/text in addition to color,Red/green only for error/success,Red text + error icon,Red border only for error,High
|
|
39
|
-
38,Accessibility,Alt Text,All,Images need text alternatives,Descriptive alt text for meaningful images,Empty or missing alt attributes,alt='Dog playing in park',alt='' for content images,High
|
|
40
|
-
39,Accessibility,Heading Hierarchy,Web,Screen readers use headings for navigation,Use sequential heading levels h1-h6,Skip heading levels or misuse for styling,h1 then h2 then h3,h1 then h4,Medium
|
|
41
|
-
40,Accessibility,ARIA Labels,All,Interactive elements need accessible names,Add aria-label for icon-only buttons,Icon buttons without labels,aria-label='Close menu',<button><Icon/></button>,High
|
|
42
|
-
41,Accessibility,Keyboard Navigation,Web,All functionality accessible via keyboard,Tab order matches visual order,Keyboard traps or illogical tab order,tabIndex for custom order,Unreachable elements,High
|
|
43
|
-
42,Accessibility,Screen Reader,All,Content should make sense when read aloud,Use semantic HTML and ARIA properly,Div soup with no semantics,<nav> <main> <article>,<div> for everything,Medium
|
|
44
|
-
43,Accessibility,Form Labels,All,Inputs must have associated labels,Use label with for attribute or wrap input,Placeholder-only inputs,<label for='email'>,placeholder='Email' only,High
|
|
45
|
-
44,Accessibility,Error Messages,All,Error messages must be announced,Use aria-live or role=alert for errors,Visual-only error indication,role='alert',Red border only,High
|
|
46
|
-
45,Accessibility,Skip Links,Web,Allow keyboard users to skip navigation,Provide skip to main content link,No skip link on nav-heavy pages,Skip to main content link,100 tabs to reach content,Medium
|
|
47
|
-
46,Performance,Image Optimization,All,Large images slow page load,Use appropriate size and format (WebP),Unoptimized full-size images,srcset with multiple sizes,4000px image for 400px display,High
|
|
48
|
-
47,Performance,Lazy Loading,All,Load content as needed,Lazy load below-fold images and content,Load everything upfront,loading='lazy',All images eager load,Medium
|
|
49
|
-
48,Performance,Code Splitting,Web,Large bundles slow initial load,Split code by route/feature,Single large bundle,dynamic import(),All code in main bundle,Medium
|
|
50
|
-
49,Performance,Caching,Web,Repeat visits should be fast,Set appropriate cache headers,No caching strategy,Cache-Control headers,Every request hits server,Medium
|
|
51
|
-
50,Performance,Font Loading,Web,Web fonts can block rendering,Use font-display swap or optional,Invisible text during font load,font-display: swap,FOIT (Flash of Invisible Text),Medium
|
|
52
|
-
51,Performance,Third Party Scripts,Web,External scripts can block rendering,Load non-critical scripts async/defer,Synchronous third-party scripts,async or defer attribute,<script src='...'> in head,Medium
|
|
53
|
-
52,Performance,Bundle Size,Web,Large JavaScript slows interaction,Monitor and minimize bundle size,Ignore bundle size growth,Bundle analyzer,No size monitoring,Medium
|
|
54
|
-
53,Performance,Render Blocking,Web,CSS/JS can block first paint,Inline critical CSS defer non-critical,Large blocking CSS files,Critical CSS inline,All CSS in head,Medium
|
|
55
|
-
54,Forms,Input Labels,All,Every input needs a visible label,Always show label above or beside input,Placeholder as only label,<label>Email</label><input>,placeholder='Email' only,High
|
|
56
|
-
55,Forms,Error Placement,All,Errors should appear near the problem,Show error below related input,Single error message at top of form,Error under each field,All errors at form top,Medium
|
|
57
|
-
56,Forms,Inline Validation,All,Validate as user types or on blur,Validate on blur for most fields,Validate only on submit,onBlur validation,Submit-only validation,Medium
|
|
58
|
-
57,Forms,Input Types,All,Use appropriate input types,Use email tel number url etc,Text input for everything,type='email',type='text' for email,Medium
|
|
59
|
-
58,Forms,Autofill Support,Web,Help browsers autofill correctly,Use autocomplete attribute properly,Block or ignore autofill,autocomplete='email',autocomplete='off' everywhere,Medium
|
|
60
|
-
59,Forms,Required Indicators,All,Mark required fields clearly,Use asterisk or (required) text,No indication of required fields,* required indicator,Guess which are required,Medium
|
|
61
|
-
60,Forms,Password Visibility,All,Let users see password while typing,Toggle to show/hide password,No visibility toggle,Show/hide password button,Password always hidden,Medium
|
|
62
|
-
61,Forms,Submit Feedback,All,Confirm form submission status,Show loading then success/error state,No feedback after submit,Loading -> Success message,Button click with no response,High
|
|
63
|
-
62,Forms,Input Affordance,All,Inputs should look interactive,Use distinct input styling,Inputs that look like plain text,Border/background on inputs,Borderless inputs,Medium
|
|
64
|
-
63,Forms,Mobile Keyboards,Mobile,Show appropriate keyboard for input type,Use inputmode attribute,Default keyboard for all inputs,inputmode='numeric',Text keyboard for numbers,Medium
|
|
65
|
-
64,Responsive,Mobile First,Web,Design for mobile then enhance for larger,Start with mobile styles then add breakpoints,Desktop-first causing mobile issues,Default mobile + md: lg: xl:,Desktop default + max-width queries,Medium
|
|
66
|
-
65,Responsive,Breakpoint Testing,Web,Test at all common screen sizes,Test at 320 375 414 768 1024 1440,Only test on your device,Multiple device testing,Single device development,Medium
|
|
67
|
-
66,Responsive,Touch Friendly,Web,Mobile layouts need touch-sized targets,Increase touch targets on mobile,Same tiny buttons on mobile,Larger buttons on mobile,Desktop-sized targets on mobile,High
|
|
68
|
-
67,Responsive,Readable Font Size,All,Text must be readable on all devices,Minimum 16px body text on mobile,Tiny text on mobile,text-base or larger,text-xs for body text,High
|
|
69
|
-
68,Responsive,Viewport Meta,Web,Set viewport for mobile devices,Use width=device-width initial-scale=1,Missing or incorrect viewport,<meta name='viewport'...>,No viewport meta tag,High
|
|
70
|
-
69,Responsive,Horizontal Scroll,Web,Avoid horizontal scrolling,Ensure content fits viewport width,Content wider than viewport,max-w-full overflow-x-hidden,Horizontal scrollbar on mobile,High
|
|
71
|
-
70,Responsive,Image Scaling,Web,Images should scale with container,Use max-width: 100% on images,Fixed width images overflow,max-w-full h-auto,width='800' fixed,Medium
|
|
72
|
-
71,Responsive,Table Handling,Web,Tables can overflow on mobile,Use horizontal scroll or card layout,Wide tables breaking layout,overflow-x-auto wrapper,Table overflows viewport,Medium
|
|
73
|
-
72,Typography,Line Height,All,Adequate line height improves readability,Use 1.5-1.75 for body text,Cramped or excessive line height,leading-relaxed (1.625),leading-none (1),Medium
|
|
74
|
-
73,Typography,Line Length,Web,Long lines are hard to read,Limit to 65-75 characters per line,Full-width text on large screens,max-w-prose,Full viewport width text,Medium
|
|
75
|
-
74,Typography,Font Size Scale,All,Consistent type hierarchy aids scanning,Use consistent modular scale,Random font sizes,Type scale (12 14 16 18 24 32),Arbitrary sizes,Medium
|
|
76
|
-
75,Typography,Font Loading,Web,Fonts should load without layout shift,Reserve space with fallback font,Layout shift when fonts load,font-display: swap + similar fallback,No fallback font,Medium
|
|
77
|
-
76,Typography,Contrast Readability,All,Body text needs good contrast,Use darker text on light backgrounds,Gray text on gray background,text-gray-900 on white,text-gray-400 on gray-100,High
|
|
78
|
-
77,Typography,Heading Clarity,All,Headings should stand out from body,Clear size/weight difference,Headings similar to body text,Bold + larger size,Same size as body,Medium
|
|
79
|
-
78,Feedback,Loading Indicators,All,Show system status during waits,Show spinner/skeleton for operations > 300ms,No feedback during loading,Skeleton or spinner,Frozen UI,High
|
|
80
|
-
79,Feedback,Empty States,All,Guide users when no content exists,Show helpful message and action,Blank empty screens,No items yet. Create one!,Empty white space,Medium
|
|
81
|
-
80,Feedback,Error Recovery,All,Help users recover from errors,Provide clear next steps,Error without recovery path,Try again button + help link,Error message only,Medium
|
|
82
|
-
81,Feedback,Progress Indicators,All,Show progress for multi-step processes,Step indicators or progress bar,No indication of progress,Step 2 of 4 indicator,No step information,Medium
|
|
83
|
-
82,Feedback,Toast Notifications,All,Transient messages for non-critical info,Auto-dismiss after 3-5 seconds,Toasts that never disappear,Auto-dismiss toast,Persistent toast,Medium
|
|
84
|
-
83,Feedback,Confirmation Messages,All,Confirm successful actions,Brief success message,Silent success,Saved successfully toast,No confirmation,Medium
|
|
85
|
-
84,Content,Truncation,All,Handle long content gracefully,Truncate with ellipsis and expand option,Overflow or broken layout,line-clamp-2 with expand,Overflow or cut off,Medium
|
|
86
|
-
85,Content,Date Formatting,All,Use locale-appropriate date formats,Use relative or locale-aware dates,Ambiguous date formats,2 hours ago or locale format,01/02/03,Low
|
|
87
|
-
86,Content,Number Formatting,All,Format large numbers for readability,Use thousand separators or abbreviations,Long unformatted numbers,"1.2K or 1,234",1234567,Low
|
|
88
|
-
87,Content,Placeholder Content,All,Show realistic placeholders during dev,Use realistic sample data,Lorem ipsum everywhere,Real sample content,Lorem ipsum,Low
|
|
89
|
-
88,Onboarding,User Freedom,All,Users should be able to skip tutorials,Provide Skip and Back buttons,Force linear unskippable tour,Skip Tutorial button,Locked overlay until finished,Medium
|
|
90
|
-
89,Search,Autocomplete,Web,Help users find results faster,Show predictions as user types,Require full type and enter,Debounced fetch + dropdown,No suggestions,Medium
|
|
91
|
-
90,Search,No Results,Web,Dead ends frustrate users,Show 'No results' with suggestions,Blank screen or '0 results',Try searching for X instead,No results found.,Medium
|
|
92
|
-
91,Data Entry,Bulk Actions,Web,Editing one by one is tedious,Allow multi-select and bulk edit,Single row actions only,Checkbox column + Action bar,Repeated actions per row,Low
|
|
93
|
-
92,AI Interaction,Disclaimer,All,Users need to know they talk to AI,Clearly label AI generated content,Present AI as human,AI Assistant label,Fake human name without label,High
|
|
94
|
-
93,AI Interaction,Streaming,All,Waiting for full text is slow,Stream text response token by token,Show loading spinner for 10s+,Typewriter effect,Spinner until 100% complete,Medium
|
|
95
|
-
94,Spatial UI,Gaze Hover,VisionOS,Elements should respond to eye tracking before pinch,Scale/highlight element on look,Static element until pinch,hoverEffect(),onTap only,High
|
|
96
|
-
95,Spatial UI,Depth Layering,VisionOS,UI needs Z-depth to separate content from environment,Use glass material and z-offset,Flat opaque panels blocking view,.glassBackgroundEffect(),bg-white,Medium
|
|
97
|
-
96,Sustainability,Auto-Play Video,Web,Video consumes massive data and energy,Click-to-play or pause when off-screen,Auto-play high-res video loops,playsInline muted preload='none',autoplay loop,Medium
|
|
98
|
-
97,Sustainability,Asset Weight,Web,Heavy 3D/Image assets increase carbon footprint,Compress and lazy load 3D models,Load 50MB textures,Draco compression,Raw .obj files,Medium
|
|
99
|
-
98,AI Interaction,Feedback Loop,All,AI needs user feedback to improve,Thumps up/down or 'Regenerate',Static output only,Feedback component,Read-only text,Low
|
|
1
|
+
No,Category,Issue,Platform,Description,Do,Don't,Code Example Good,Code Example Bad,Severity
|
|
2
|
+
1,Navigation,Smooth Scroll,Web,Anchor links should scroll smoothly to target section,Use scroll-behavior: smooth on html element,Jump directly without transition,html { scroll-behavior: smooth; },<a href='#section'> without CSS,High
|
|
3
|
+
2,Navigation,Sticky Navigation,Web,Fixed nav should not obscure content,Add padding-top to body equal to nav height,Let nav overlap first section content,pt-20 (if nav is h-20),No padding compensation,Medium
|
|
4
|
+
3,Navigation,Active State,All,Current page/section should be visually indicated,Highlight active nav item with color/underline,No visual feedback on current location,text-primary border-b-2,All links same style,Medium
|
|
5
|
+
4,Navigation,Back Button,Mobile,Users expect back to work predictably,Preserve navigation history properly,Break browser/app back button behavior,history.pushState(),location.replace(),High
|
|
6
|
+
5,Navigation,Deep Linking,All,URLs should reflect current state for sharing,Update URL on state/view changes,Static URLs for dynamic content,Use query params or hash,Single URL for all states,Medium
|
|
7
|
+
6,Navigation,Breadcrumbs,Web,Show user location in site hierarchy,Use for sites with 3+ levels of depth,Use for flat single-level sites,Home > Category > Product,Only on deep nested pages,Low
|
|
8
|
+
7,Animation,Excessive Motion,All,Too many animations cause distraction and motion sickness,Animate 1-2 key elements per view maximum,Animate everything that moves,Single hero animation,animate-bounce on 5+ elements,High
|
|
9
|
+
8,Animation,Duration Timing,All,Animations should feel responsive not sluggish,Use 150-300ms for micro-interactions,Use animations longer than 500ms for UI,transition-colors duration-200,transition-all duration-1000,Medium
|
|
10
|
+
9,Animation,Reduced Motion,All,Respect user's motion preferences,Check prefers-reduced-motion media query,Ignore accessibility motion settings,@media (prefers-reduced-motion: reduce),No motion query check,High
|
|
11
|
+
10,Animation,Loading States,All,Show feedback during async operations,Use skeleton screens or spinners,Leave UI frozen with no feedback,animate-pulse skeleton,Blank screen while loading,High
|
|
12
|
+
11,Animation,Hover vs Tap,All,Hover effects don't work on touch devices,Use click/tap for primary interactions,Rely only on hover for important actions,onClick handler,onMouseEnter only,High
|
|
13
|
+
12,Animation,Continuous Animation,All,Infinite animations are distracting,Use for loading indicators only,Use for decorative elements,animate-spin on loader,animate-bounce on icons,Medium
|
|
14
|
+
13,Animation,Transform Performance,Web,Some CSS properties trigger expensive repaints,Use transform and opacity for animations,Animate width/height/top/left properties,transform: translateY(),top: 10px animation,Medium
|
|
15
|
+
14,Animation,Easing Functions,All,Linear motion feels robotic,Use ease-out for entering ease-in for exiting,Use linear for UI transitions,ease-out,linear,Low
|
|
16
|
+
15,Layout,Z-Index Management,Web,Stacking context conflicts cause hidden elements,Define z-index scale system (10 20 30 50),Use arbitrary large z-index values,z-10 z-20 z-50,z-[9999],High
|
|
17
|
+
16,Layout,Overflow Hidden,Web,Hidden overflow can clip important content,Test all content fits within containers,Blindly apply overflow-hidden,overflow-auto with scroll,overflow-hidden truncating content,Medium
|
|
18
|
+
17,Layout,Fixed Positioning,Web,Fixed elements can overlap or be inaccessible,Account for safe areas and other fixed elements,Stack multiple fixed elements carelessly,Fixed nav + fixed bottom with gap,Multiple overlapping fixed elements,Medium
|
|
19
|
+
18,Layout,Stacking Context,Web,New stacking contexts reset z-index,Understand what creates new stacking context,Expect z-index to work across contexts,Parent with z-index isolates children,z-index: 9999 not working,Medium
|
|
20
|
+
19,Layout,Content Jumping,Web,Layout shift when content loads is jarring,Reserve space for async content,Let images/content push layout around,aspect-ratio or fixed height,No dimensions on images,High
|
|
21
|
+
20,Layout,Viewport Units,Web,100vh can be problematic on mobile browsers,Use dvh or account for mobile browser chrome,Use 100vh for full-screen mobile layouts,min-h-dvh or min-h-screen,h-screen on mobile,Medium
|
|
22
|
+
21,Layout,Container Width,Web,Content too wide is hard to read,Limit max-width for text content (65-75ch),Let text span full viewport width,max-w-prose or max-w-3xl,Full width paragraphs,Medium
|
|
23
|
+
22,Touch,Touch Target Size,Mobile,Small buttons are hard to tap accurately,Minimum 44x44px touch targets,Tiny clickable areas,min-h-[44px] min-w-[44px],w-6 h-6 buttons,High
|
|
24
|
+
23,Touch,Touch Spacing,Mobile,Adjacent touch targets need adequate spacing,Minimum 8px gap between touch targets,Tightly packed clickable elements,gap-2 between buttons,gap-0 or gap-1,Medium
|
|
25
|
+
24,Touch,Gesture Conflicts,Mobile,Custom gestures can conflict with system,Avoid horizontal swipe on main content,Override system gestures,Vertical scroll primary,Horizontal swipe carousel only,Medium
|
|
26
|
+
25,Touch,Tap Delay,Mobile,300ms tap delay feels laggy,Use touch-action CSS or fastclick,Default mobile tap handling,touch-action: manipulation,No touch optimization,Medium
|
|
27
|
+
26,Touch,Pull to Refresh,Mobile,Accidental refresh is frustrating,Disable where not needed,Enable by default everywhere,overscroll-behavior: contain,Default overscroll,Low
|
|
28
|
+
27,Touch,Haptic Feedback,Mobile,Tactile feedback improves interaction feel,Use for confirmations and important actions,Overuse vibration feedback,navigator.vibrate(10),Vibrate on every tap,Low
|
|
29
|
+
28,Interaction,Focus States,All,Keyboard users need visible focus indicators,Use visible focus rings on interactive elements,Remove focus outline without replacement,focus:ring-2 focus:ring-blue-500,outline-none without alternative,High
|
|
30
|
+
29,Interaction,Hover States,Web,Visual feedback on interactive elements,Change cursor and add subtle visual change,No hover feedback on clickable elements,hover:bg-gray-100 cursor-pointer,No hover style,Medium
|
|
31
|
+
30,Interaction,Active States,All,Show immediate feedback on press/click,Add pressed/active state visual change,No feedback during interaction,active:scale-95,No active state,Medium
|
|
32
|
+
31,Interaction,Disabled States,All,Clearly indicate non-interactive elements,Reduce opacity and change cursor,Confuse disabled with normal state,opacity-50 cursor-not-allowed,Same style as enabled,Medium
|
|
33
|
+
32,Interaction,Loading Buttons,All,Prevent double submission during async actions,Disable button and show loading state,Allow multiple clicks during processing,disabled={loading} spinner,Button clickable while loading,High
|
|
34
|
+
33,Interaction,Error Feedback,All,Users need to know when something fails,Show clear error messages near problem,Silent failures with no feedback,Red border + error message,No indication of error,High
|
|
35
|
+
34,Interaction,Success Feedback,All,Confirm successful actions to users,Show success message or visual change,No confirmation of completed action,Toast notification or checkmark,Action completes silently,Medium
|
|
36
|
+
35,Interaction,Confirmation Dialogs,All,Prevent accidental destructive actions,Confirm before delete/irreversible actions,Delete without confirmation,Are you sure modal,Direct delete on click,High
|
|
37
|
+
36,Accessibility,Color Contrast,All,Text must be readable against background,Minimum 4.5:1 ratio for normal text,Low contrast text,#333 on white (7:1),#999 on white (2.8:1),High
|
|
38
|
+
37,Accessibility,Color Only,All,Don't convey information by color alone,Use icons/text in addition to color,Red/green only for error/success,Red text + error icon,Red border only for error,High
|
|
39
|
+
38,Accessibility,Alt Text,All,Images need text alternatives,Descriptive alt text for meaningful images,Empty or missing alt attributes,alt='Dog playing in park',alt='' for content images,High
|
|
40
|
+
39,Accessibility,Heading Hierarchy,Web,Screen readers use headings for navigation,Use sequential heading levels h1-h6,Skip heading levels or misuse for styling,h1 then h2 then h3,h1 then h4,Medium
|
|
41
|
+
40,Accessibility,ARIA Labels,All,Interactive elements need accessible names,Add aria-label for icon-only buttons,Icon buttons without labels,aria-label='Close menu',<button><Icon/></button>,High
|
|
42
|
+
41,Accessibility,Keyboard Navigation,Web,All functionality accessible via keyboard,Tab order matches visual order,Keyboard traps or illogical tab order,tabIndex for custom order,Unreachable elements,High
|
|
43
|
+
42,Accessibility,Screen Reader,All,Content should make sense when read aloud,Use semantic HTML and ARIA properly,Div soup with no semantics,<nav> <main> <article>,<div> for everything,Medium
|
|
44
|
+
43,Accessibility,Form Labels,All,Inputs must have associated labels,Use label with for attribute or wrap input,Placeholder-only inputs,<label for='email'>,placeholder='Email' only,High
|
|
45
|
+
44,Accessibility,Error Messages,All,Error messages must be announced,Use aria-live or role=alert for errors,Visual-only error indication,role='alert',Red border only,High
|
|
46
|
+
45,Accessibility,Skip Links,Web,Allow keyboard users to skip navigation,Provide skip to main content link,No skip link on nav-heavy pages,Skip to main content link,100 tabs to reach content,Medium
|
|
47
|
+
46,Performance,Image Optimization,All,Large images slow page load,Use appropriate size and format (WebP),Unoptimized full-size images,srcset with multiple sizes,4000px image for 400px display,High
|
|
48
|
+
47,Performance,Lazy Loading,All,Load content as needed,Lazy load below-fold images and content,Load everything upfront,loading='lazy',All images eager load,Medium
|
|
49
|
+
48,Performance,Code Splitting,Web,Large bundles slow initial load,Split code by route/feature,Single large bundle,dynamic import(),All code in main bundle,Medium
|
|
50
|
+
49,Performance,Caching,Web,Repeat visits should be fast,Set appropriate cache headers,No caching strategy,Cache-Control headers,Every request hits server,Medium
|
|
51
|
+
50,Performance,Font Loading,Web,Web fonts can block rendering,Use font-display swap or optional,Invisible text during font load,font-display: swap,FOIT (Flash of Invisible Text),Medium
|
|
52
|
+
51,Performance,Third Party Scripts,Web,External scripts can block rendering,Load non-critical scripts async/defer,Synchronous third-party scripts,async or defer attribute,<script src='...'> in head,Medium
|
|
53
|
+
52,Performance,Bundle Size,Web,Large JavaScript slows interaction,Monitor and minimize bundle size,Ignore bundle size growth,Bundle analyzer,No size monitoring,Medium
|
|
54
|
+
53,Performance,Render Blocking,Web,CSS/JS can block first paint,Inline critical CSS defer non-critical,Large blocking CSS files,Critical CSS inline,All CSS in head,Medium
|
|
55
|
+
54,Forms,Input Labels,All,Every input needs a visible label,Always show label above or beside input,Placeholder as only label,<label>Email</label><input>,placeholder='Email' only,High
|
|
56
|
+
55,Forms,Error Placement,All,Errors should appear near the problem,Show error below related input,Single error message at top of form,Error under each field,All errors at form top,Medium
|
|
57
|
+
56,Forms,Inline Validation,All,Validate as user types or on blur,Validate on blur for most fields,Validate only on submit,onBlur validation,Submit-only validation,Medium
|
|
58
|
+
57,Forms,Input Types,All,Use appropriate input types,Use email tel number url etc,Text input for everything,type='email',type='text' for email,Medium
|
|
59
|
+
58,Forms,Autofill Support,Web,Help browsers autofill correctly,Use autocomplete attribute properly,Block or ignore autofill,autocomplete='email',autocomplete='off' everywhere,Medium
|
|
60
|
+
59,Forms,Required Indicators,All,Mark required fields clearly,Use asterisk or (required) text,No indication of required fields,* required indicator,Guess which are required,Medium
|
|
61
|
+
60,Forms,Password Visibility,All,Let users see password while typing,Toggle to show/hide password,No visibility toggle,Show/hide password button,Password always hidden,Medium
|
|
62
|
+
61,Forms,Submit Feedback,All,Confirm form submission status,Show loading then success/error state,No feedback after submit,Loading -> Success message,Button click with no response,High
|
|
63
|
+
62,Forms,Input Affordance,All,Inputs should look interactive,Use distinct input styling,Inputs that look like plain text,Border/background on inputs,Borderless inputs,Medium
|
|
64
|
+
63,Forms,Mobile Keyboards,Mobile,Show appropriate keyboard for input type,Use inputmode attribute,Default keyboard for all inputs,inputmode='numeric',Text keyboard for numbers,Medium
|
|
65
|
+
64,Responsive,Mobile First,Web,Design for mobile then enhance for larger,Start with mobile styles then add breakpoints,Desktop-first causing mobile issues,Default mobile + md: lg: xl:,Desktop default + max-width queries,Medium
|
|
66
|
+
65,Responsive,Breakpoint Testing,Web,Test at all common screen sizes,Test at 320 375 414 768 1024 1440,Only test on your device,Multiple device testing,Single device development,Medium
|
|
67
|
+
66,Responsive,Touch Friendly,Web,Mobile layouts need touch-sized targets,Increase touch targets on mobile,Same tiny buttons on mobile,Larger buttons on mobile,Desktop-sized targets on mobile,High
|
|
68
|
+
67,Responsive,Readable Font Size,All,Text must be readable on all devices,Minimum 16px body text on mobile,Tiny text on mobile,text-base or larger,text-xs for body text,High
|
|
69
|
+
68,Responsive,Viewport Meta,Web,Set viewport for mobile devices,Use width=device-width initial-scale=1,Missing or incorrect viewport,<meta name='viewport'...>,No viewport meta tag,High
|
|
70
|
+
69,Responsive,Horizontal Scroll,Web,Avoid horizontal scrolling,Ensure content fits viewport width,Content wider than viewport,max-w-full overflow-x-hidden,Horizontal scrollbar on mobile,High
|
|
71
|
+
70,Responsive,Image Scaling,Web,Images should scale with container,Use max-width: 100% on images,Fixed width images overflow,max-w-full h-auto,width='800' fixed,Medium
|
|
72
|
+
71,Responsive,Table Handling,Web,Tables can overflow on mobile,Use horizontal scroll or card layout,Wide tables breaking layout,overflow-x-auto wrapper,Table overflows viewport,Medium
|
|
73
|
+
72,Typography,Line Height,All,Adequate line height improves readability,Use 1.5-1.75 for body text,Cramped or excessive line height,leading-relaxed (1.625),leading-none (1),Medium
|
|
74
|
+
73,Typography,Line Length,Web,Long lines are hard to read,Limit to 65-75 characters per line,Full-width text on large screens,max-w-prose,Full viewport width text,Medium
|
|
75
|
+
74,Typography,Font Size Scale,All,Consistent type hierarchy aids scanning,Use consistent modular scale,Random font sizes,Type scale (12 14 16 18 24 32),Arbitrary sizes,Medium
|
|
76
|
+
75,Typography,Font Loading,Web,Fonts should load without layout shift,Reserve space with fallback font,Layout shift when fonts load,font-display: swap + similar fallback,No fallback font,Medium
|
|
77
|
+
76,Typography,Contrast Readability,All,Body text needs good contrast,Use darker text on light backgrounds,Gray text on gray background,text-gray-900 on white,text-gray-400 on gray-100,High
|
|
78
|
+
77,Typography,Heading Clarity,All,Headings should stand out from body,Clear size/weight difference,Headings similar to body text,Bold + larger size,Same size as body,Medium
|
|
79
|
+
78,Feedback,Loading Indicators,All,Show system status during waits,Show spinner/skeleton for operations > 300ms,No feedback during loading,Skeleton or spinner,Frozen UI,High
|
|
80
|
+
79,Feedback,Empty States,All,Guide users when no content exists,Show helpful message and action,Blank empty screens,No items yet. Create one!,Empty white space,Medium
|
|
81
|
+
80,Feedback,Error Recovery,All,Help users recover from errors,Provide clear next steps,Error without recovery path,Try again button + help link,Error message only,Medium
|
|
82
|
+
81,Feedback,Progress Indicators,All,Show progress for multi-step processes,Step indicators or progress bar,No indication of progress,Step 2 of 4 indicator,No step information,Medium
|
|
83
|
+
82,Feedback,Toast Notifications,All,Transient messages for non-critical info,Auto-dismiss after 3-5 seconds,Toasts that never disappear,Auto-dismiss toast,Persistent toast,Medium
|
|
84
|
+
83,Feedback,Confirmation Messages,All,Confirm successful actions,Brief success message,Silent success,Saved successfully toast,No confirmation,Medium
|
|
85
|
+
84,Content,Truncation,All,Handle long content gracefully,Truncate with ellipsis and expand option,Overflow or broken layout,line-clamp-2 with expand,Overflow or cut off,Medium
|
|
86
|
+
85,Content,Date Formatting,All,Use locale-appropriate date formats,Use relative or locale-aware dates,Ambiguous date formats,2 hours ago or locale format,01/02/03,Low
|
|
87
|
+
86,Content,Number Formatting,All,Format large numbers for readability,Use thousand separators or abbreviations,Long unformatted numbers,"1.2K or 1,234",1234567,Low
|
|
88
|
+
87,Content,Placeholder Content,All,Show realistic placeholders during dev,Use realistic sample data,Lorem ipsum everywhere,Real sample content,Lorem ipsum,Low
|
|
89
|
+
88,Onboarding,User Freedom,All,Users should be able to skip tutorials,Provide Skip and Back buttons,Force linear unskippable tour,Skip Tutorial button,Locked overlay until finished,Medium
|
|
90
|
+
89,Search,Autocomplete,Web,Help users find results faster,Show predictions as user types,Require full type and enter,Debounced fetch + dropdown,No suggestions,Medium
|
|
91
|
+
90,Search,No Results,Web,Dead ends frustrate users,Show 'No results' with suggestions,Blank screen or '0 results',Try searching for X instead,No results found.,Medium
|
|
92
|
+
91,Data Entry,Bulk Actions,Web,Editing one by one is tedious,Allow multi-select and bulk edit,Single row actions only,Checkbox column + Action bar,Repeated actions per row,Low
|
|
93
|
+
92,AI Interaction,Disclaimer,All,Users need to know they talk to AI,Clearly label AI generated content,Present AI as human,AI Assistant label,Fake human name without label,High
|
|
94
|
+
93,AI Interaction,Streaming,All,Waiting for full text is slow,Stream text response token by token,Show loading spinner for 10s+,Typewriter effect,Spinner until 100% complete,Medium
|
|
95
|
+
94,Spatial UI,Gaze Hover,VisionOS,Elements should respond to eye tracking before pinch,Scale/highlight element on look,Static element until pinch,hoverEffect(),onTap only,High
|
|
96
|
+
95,Spatial UI,Depth Layering,VisionOS,UI needs Z-depth to separate content from environment,Use glass material and z-offset,Flat opaque panels blocking view,.glassBackgroundEffect(),bg-white,Medium
|
|
97
|
+
96,Sustainability,Auto-Play Video,Web,Video consumes massive data and energy,Click-to-play or pause when off-screen,Auto-play high-res video loops,playsInline muted preload='none',autoplay loop,Medium
|
|
98
|
+
97,Sustainability,Asset Weight,Web,Heavy 3D/Image assets increase carbon footprint,Compress and lazy load 3D models,Load 50MB textures,Draco compression,Raw .obj files,Medium
|
|
99
|
+
98,AI Interaction,Feedback Loop,All,AI needs user feedback to improve,Thumps up/down or 'Regenerate',Static output only,Feedback component,Read-only text,Low
|
|
100
100
|
99,Accessibility,Motion Sensitivity,All,Parallax/Scroll-jacking causes nausea,Respect prefers-reduced-motion,Force scroll effects,@media (prefers-reduced-motion),ScrollTrigger.create(),High
|
|
@@ -246,10 +246,13 @@ provenance belongs to `road-to-frontend-fidelity-calibration` Phases 0 and 2.
|
|
|
246
246
|
|
|
247
247
|
## Anti-slop discipline
|
|
248
248
|
|
|
249
|
-
Before proposing a direction, scan the Visual (V1–
|
|
250
|
-
sections of [`design-antipatterns`](../../../docs/guidelines/design-antipatterns.md)
|
|
249
|
+
Before proposing a direction, scan the Visual (V1–V8) and Layout (L1–L10)
|
|
250
|
+
sections of [`design-antipatterns`](../../../docs/guidelines/design-antipatterns.md),
|
|
251
|
+
plus Motion (M1–M8) for the interaction layer.
|
|
251
252
|
On a match, choose differently or invoke the entry's own override condition in
|
|
252
|
-
the brief — every entry has one
|
|
253
|
+
the brief — every entry has one. Two of them, T7 and T8, are additionally
|
|
254
|
+
*register-scoped*: the brand and product registers admit different answers, and
|
|
255
|
+
neither admits an undeclared pick. The Q* floors are
|
|
253
256
|
in [`references/craft-floor.md`](references/craft-floor.md) instead of here, so
|
|
254
257
|
they arrive at the write rather than at skill load.
|
|
255
258
|
|