@erclx/canon 5.62.0 → 5.64.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/CHANGELOG.md +26 -0
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/api-design/references/adopted.md +1 -1
- package/claude/skills/context-fold/REQUIREMENT.md +2 -3
- package/claude/skills/context-fold/SKILL.md +1 -11
- package/claude/skills/context-fold/references/completion-report.md +8 -9
- package/claude/skills/create-skill/references/skill-practice.md +17 -1
- package/claude/skills/design-record/references/design.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +2 -1
- package/claude/skills/design-taste/SKILL.md +6 -5
- package/claude/skills/design-taste/references/adopted.md +56 -8
- package/claude/skills/design-taste/references/craft.md +1 -1
- package/claude/skills/design-taste/references/kinds.md +8 -2
- package/claude/skills/design-taste/references/preflight.md +3 -3
- package/claude/skills/design-taste/references/tells.md +26 -5
- package/claude/skills/document-health/REQUIREMENT.md +1 -1
- package/claude/skills/document-health/SKILL.md +3 -14
- package/claude/skills/document-health/references/axes.md +14 -16
- package/claude/skills/plan-feature/SKILL.md +2 -2
- package/claude/skills/plan-feature/references/plan.md +24 -3
- package/claude/skills/review-craft/SKILL.md +1 -1
- package/claude/skills/role-worker/SKILL.md +2 -1
- package/claude/skills/ui-checklist/SKILL.md +1 -1
- package/claude/skills/ui-craft/REQUIREMENT.md +29 -0
- package/claude/skills/ui-craft/SKILL.md +44 -0
- package/{governance/rules/ui → claude/skills/ui-craft/references}/a11y.md +0 -10
- package/claude/skills/ui-craft/references/adopted.md +27 -0
- package/{governance/rules/ui/surface-capture.md → claude/skills/ui-craft/references/capture.md} +0 -10
- package/{governance/rules/ui/ux-controls.md → claude/skills/ui-craft/references/controls.md} +3 -10
- package/claude/skills/ui-craft/references/copy.md +45 -0
- package/{governance/rules/ui → claude/skills/ui-craft/references}/forms.md +0 -9
- package/{governance/rules/ui → claude/skills/ui-craft/references}/keyboard.md +0 -10
- package/{governance/rules/ui → claude/skills/ui-craft/references}/motion.md +0 -10
- package/{governance/rules/ui → claude/skills/ui-craft/references}/pointer.md +0 -10
- package/{governance/rules/ui/ux-completeness.md → claude/skills/ui-craft/references/states.md} +0 -10
- package/claude/skills/ux-audit/SKILL.md +1 -1
- package/claude/skills/write-human/references/adopted.md +4 -1
- package/docs/agents/audits.md +2 -6
- package/docs/agents/context-audit.md +1 -1
- package/docs/agents/install-and-sync.md +2 -2
- package/docs/target/migrations.md +3 -3
- package/docs/target/sync.md +3 -2
- package/docs/workflow/skill-map.md +1 -0
- package/docs/workflow/visual-design-workflow.md +2 -2
- package/governance/detect.toml +1 -45
- package/governance/ledger/lib/test-scope.md +1 -1
- package/governance/ledger/skills/api-design/SKILL.md +62 -0
- package/governance/ledger/skills/code-craft/SKILL.md +53 -0
- package/governance/ledger/skills/deprecation-migration/SKILL.md +68 -0
- package/governance/ledger/skills/design-taste/SKILL.md +64 -0
- package/governance/ledger/skills/design-taste/craft.md +66 -0
- package/governance/ledger/skills/design-taste/kinds.md +58 -0
- package/governance/ledger/skills/design-taste/systems.md +42 -0
- package/governance/ledger/skills/design-taste/tells.md +103 -0
- package/governance/ledger/{ui → skills/ui-craft}/a11y.md +3 -3
- package/governance/ledger/{ui/surface-capture.md → skills/ui-craft/capture.md} +3 -3
- package/governance/ledger/{ui/ux-controls.md → skills/ui-craft/controls.md} +12 -7
- package/governance/ledger/skills/ui-craft/copy.md +102 -0
- package/governance/ledger/{ui → skills/ui-craft}/forms.md +3 -3
- package/governance/ledger/{ui → skills/ui-craft}/keyboard.md +3 -3
- package/governance/ledger/{ui → skills/ui-craft}/motion.md +3 -3
- package/governance/ledger/{ui → skills/ui-craft}/pointer.md +3 -3
- package/governance/ledger/{ui/ux-completeness.md → skills/ui-craft/states.md} +3 -3
- package/governance/ledger/ui/craft.md +19 -0
- package/governance/renames.toml +17 -3
- package/governance/rules/lib/test-scope.md +1 -1
- package/governance/rules/ui/craft.md +22 -0
- package/governance/splits.toml +0 -2
- package/package.json +1 -1
- package/src/audits/catalog.ts +0 -52
- package/src/claude/cases/misc.ts +5 -0
- package/src/claude/skills-audit.ts +226 -12
- package/src/cli/retired.ts +8 -0
- package/src/commands/claude.ts +15 -1
- package/src/commands/context.ts +0 -425
- package/src/commands/tooling.ts +4 -1
- package/src/context/citations.ts +9 -3
- package/src/gate/measures.ts +4 -3
- package/src/git/files.ts +8 -3
- package/src/gov/audit.ts +6 -1
- package/src/inventory/subjects.ts +1 -1
- package/src/markdown/gated.ts +1 -1
- package/src/markdown/scope.ts +0 -1
- package/src/tooling/package.ts +22 -13
- package/tooling/web/reference.md +3 -1
- package/claude/skills/context-fold/references/classify.md +0 -87
- package/governance/ledger/ui/copy.md +0 -49
- package/governance/ledger/ui/design-taste.md +0 -19
- package/governance/ledger/ui/interface-casing.md +0 -47
- package/governance/ledger/ui/link-behavior.md +0 -29
- package/governance/rules/ui/copy.md +0 -28
- package/governance/rules/ui/design-taste.md +0 -18
- package/governance/rules/ui/interface-casing.md +0 -29
- package/governance/rules/ui/link-behavior.md +0 -19
- package/src/context/classify/extract.ts +0 -443
- package/src/context/classify/ollama.ts +0 -172
- package/src/context/classify/patterns.ts +0 -75
- package/src/context/classify/prompts.ts +0 -74
- package/src/context/classify/run.ts +0 -348
- package/src/context/classify/settings.ts +0 -196
- /package/tooling/web/{configs → seeds}/e2e/home.spec.ts +0 -0
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Classify the fold's diff baseline
|
|
3
|
-
description: The classify diff invocation, the record fields to read, applying a finding, the one-line keep reason, the unreachable and missing-subcommand lines, and the report shape
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Classify the fold's diff baseline
|
|
7
|
-
|
|
8
|
-
Mechanics for the classify half of Step 4 of `context-fold`. The body owns the skip condition and the shared baseline, and this file owns the invocation, what the record carries, and what applying a finding does.
|
|
9
|
-
|
|
10
|
-
## Invocation
|
|
11
|
-
|
|
12
|
-
Call the verb rather than reimplementing its pattern or prompt in this skill:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
canon context classify diff --base <base> --json
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Never substitute a different verb for it, such as `canon docs <name>` (a documentation lookup, not a classification).
|
|
19
|
-
|
|
20
|
-
Reuse the base the Diff baseline section already resolved for Steps 2 and 5 rather than resolving a second time. Never pick or configure a backend here. The project setting decides it, and this step reports `modelLayer` as the record returns it.
|
|
21
|
-
|
|
22
|
-
## Reading the record
|
|
23
|
-
|
|
24
|
-
Branch on the record's `decision` field, never on the exit code, which a shell function wrapping `canon` can flatten to zero.
|
|
25
|
-
|
|
26
|
-
- `decision: 'refused'`: a bad range or a file the verb could not read. Report the record's `message` and continue. See "When the verb is absent or refused" below.
|
|
27
|
-
- `decision: 'ok'`: the record carries `modelLayer` (`'off'`, `'ran'`, `'skipped-no-model'`, or `'skipped-unreachable'`) and `findings`.
|
|
28
|
-
|
|
29
|
-
Each finding carries `file`, a `verdict` of `KEEP`, `REPLACE`, `HISTORY`, or `MOVE`, and `decidedBy` (`'regex'` or `'model'`) naming which layer's reading won. Take the `quote` and `reason` from whichever of the finding's `regex` or `model` fields `decidedBy` names. Skip every `KEEP` finding: nothing decided against that text.
|
|
30
|
-
|
|
31
|
-
## Scope
|
|
32
|
-
|
|
33
|
-
Answer every non-`KEEP` finding the verb returns, not only the files Step 3 wrote this run, since a branch carrying a prior session's commits has doc edits the fold is equally responsible for.
|
|
34
|
-
|
|
35
|
-
The verb's own extraction already scopes to canonical doc types and reports nothing when the range carries none, so there is no narrower check to add here.
|
|
36
|
-
|
|
37
|
-
## Applying a finding
|
|
38
|
-
|
|
39
|
-
Locate the finding by its `quote` in the file's current content. The quote is often a narrow fragment rather than the whole clause it sits in, since the regex layer's own match is a short pattern hit, so the edit below targets the sentence or bullet the quote sits in rather than the literal substring alone.
|
|
40
|
-
|
|
41
|
-
- **Found exactly once.** Apply the verdict under its heading below.
|
|
42
|
-
- **Found more than once, or not found at all.** Report it as not located rather than guessing an occurrence or silently rewriting nothing. A model paraphrasing its quote is the usual cause.
|
|
43
|
-
|
|
44
|
-
Run the classifier once per fold. Do not re-run it after applying a finding to check the edit, since a second pass over what this step wrote is the loop the verb's own reference already warns against.
|
|
45
|
-
|
|
46
|
-
### REPLACE
|
|
47
|
-
|
|
48
|
-
Rewrite the sentence or bullet carrying the quote in place with the fact that now stands, per Step 3's rewrite-in-place rule. State what is current and drop what the quote restated, in the one edit.
|
|
49
|
-
|
|
50
|
-
### HISTORY
|
|
51
|
-
|
|
52
|
-
Rewrite the sentence or bullet carrying the quote to drop the narration and keep any current fact the same clause states. The quote narrates how the fact arrived rather than stating the fact, which a canonical doc excludes regardless of what wrote it.
|
|
53
|
-
|
|
54
|
-
A literal cut of the fragment alone would leave the rest of the clause grammatically stranded.
|
|
55
|
-
|
|
56
|
-
### MOVE
|
|
57
|
-
|
|
58
|
-
Do not cut. The verdict means correct content sits on the wrong surface, such as a rule written into a context entry that belongs in a path-scoped rule, and only the model layer returns it.
|
|
59
|
-
|
|
60
|
-
Report the finding instead, naming the surface the `reason` names as where the content belongs, and leave the file unedited. Cutting would delete content a fold with no model configured would never have flagged at all.
|
|
61
|
-
|
|
62
|
-
## Keeping a finding
|
|
63
|
-
|
|
64
|
-
Keep a non-`KEEP` finding without applying it only when the quote is itself the alternative a nearby decision states and lost, or the file already carries the current fact elsewhere. State the reason in one line in the report. A keep costs one line, where an incorrect apply costs a rewrite of prose nobody asked to change.
|
|
65
|
-
|
|
66
|
-
## When the verb is absent or refused
|
|
67
|
-
|
|
68
|
-
The verb ships with the CLI and this skill ships with the plugin, so a target holding an older installed binary carries no `context classify` subcommand. Never read a missing subcommand as a clean pass, which would report a run that never checked anything as one that found nothing.
|
|
69
|
-
|
|
70
|
-
| Case | Report, then continue |
|
|
71
|
-
| ------------------ | ------------------------------------------------------------------------------------ |
|
|
72
|
-
| Subcommand missing | `⚠ Classify: canon context classify not available on the installed binary. Skipped.` |
|
|
73
|
-
| Range refused | `⚠ Classify: <message>`, naming the verb's own message |
|
|
74
|
-
|
|
75
|
-
Neither case stops the fold. This step checks what the fold wrote, and a check that cannot run is not a reason to leave the fold's own output unshipped.
|
|
76
|
-
|
|
77
|
-
## Report
|
|
78
|
-
|
|
79
|
-
Print one line naming what ran, `✅ Classify: <n> findings, regex ran, model <modelLayer>`, then one line per non-`KEEP` finding:
|
|
80
|
-
|
|
81
|
-
- `✏ Rewrote: <file>, "<quote>" (<reason>)`
|
|
82
|
-
- `✂ Cut: <file>, "<quote>" (<reason>)`
|
|
83
|
-
- `➡ Move needed: <file>, "<quote>" (<reason>)`, for a `MOVE` this step reported rather than cut
|
|
84
|
-
- `⏭ Kept: <file>, "<quote>", <reason for keeping>`
|
|
85
|
-
- `⚠ Not located: <file>, "<quote>" not found or found more than once`
|
|
86
|
-
|
|
87
|
-
When every finding reads `KEEP`, output `✅ Classify: <n> findings, all KEEP` and nothing further.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: UI copy rule ledger
|
|
3
|
-
description: Sources for governance/rules/ui/copy.md, one row per bullet
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# UI copy rule ledger
|
|
7
|
-
|
|
8
|
-
The field is content design, and the authority for researched interface copy is the GOV.UK Design System and its style guide.
|
|
9
|
-
|
|
10
|
-
## Punctuation
|
|
11
|
-
|
|
12
|
-
| Bullet | Source | Read |
|
|
13
|
-
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
14
|
-
| No em dash or semicolon | House choice: both read as generated copy in an interface, and a comma, a period, or a split sentence carries the same meaning in a shorter line | 2026-10-18 |
|
|
15
|
-
| No trailing label punctuation | [Button](https://design-system.service.gov.uk/components/button/): every example label, such as "Start now", "Sign in", and "Continue", carries no trailing punctuation | 2026-10-18 |
|
|
16
|
-
|
|
17
|
-
## Button copy
|
|
18
|
-
|
|
19
|
-
| Bullet | Source | Read |
|
|
20
|
-
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
21
|
-
| The action's verb | [Button](https://design-system.service.gov.uk/components/button/): "Write button text in sentence case, describing the action it performs" | 2026-10-18 |
|
|
22
|
-
|
|
23
|
-
## Error messages
|
|
24
|
-
|
|
25
|
-
| Bullet | Source | Read |
|
|
26
|
-
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
27
|
-
| Say how to fix it | [Error message](https://design-system.service.gov.uk/components/error-message/): "Describe what has happened and tell them how to fix it", and "'Enter your first name' is clearer, more direct and natural than 'First name must have an entry'" | 2026-10-18 |
|
|
28
|
-
| Short and plain | [Error message](https://design-system.service.gov.uk/components/error-message/): "The message must be in plain English, use positive language and get to the point", with no "technical jargon like 'form post error'" | 2026-10-18 |
|
|
29
|
-
|
|
30
|
-
## Placeholder text
|
|
31
|
-
|
|
32
|
-
| Bullet | Source | Read |
|
|
33
|
-
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
34
|
-
| No placeholder, a hint instead | [Text input](https://design-system.service.gov.uk/components/text-input/): "Do not use placeholder text in place of a label, or for hints or examples", since "it vanishes when the user starts typing" and "not all screen readers read it out" | 2026-10-18 |
|
|
35
|
-
|
|
36
|
-
## Declined
|
|
37
|
-
|
|
38
|
-
Every bullet the rewrite removed or reshaped, grouped by why.
|
|
39
|
-
|
|
40
|
-
### Contradicted by the source
|
|
41
|
-
|
|
42
|
-
- Replaced "show format examples over instructions in placeholder text" with the hint text bullet, since GOV.UK says not to use a placeholder "for hints or examples".
|
|
43
|
-
- Cut "reserve instructions for labels or helper text", which the new placeholder bullet now carries.
|
|
44
|
-
|
|
45
|
-
### Merged or reworded
|
|
46
|
-
|
|
47
|
-
- Merged the imperative verb and padded phrasing bullets. The `Save` over `Save changes` example went, since GOV.UK adds words "to better describe the action".
|
|
48
|
-
- Merged "keep messages short and actionable" and "one sentence maximum" into the plain language bullet.
|
|
49
|
-
- Reworded the error example to `Enter an email address`, the instruction form GOV.UK prefers over a description.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Design taste rule ledger
|
|
3
|
-
description: Sources for governance/rules/ui/design-taste.md, one row per bullet
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Design taste rule ledger
|
|
7
|
-
|
|
8
|
-
The rule is a pointer to the `design-taste` skill, which carries its own sources, so both rows are house choices naming the bug the pointer prevents.
|
|
9
|
-
|
|
10
|
-
## Authority
|
|
11
|
-
|
|
12
|
-
| Bullet | Source | Read |
|
|
13
|
-
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
14
|
-
| Load the skill | House choice: a style edit made without the layer order or the coherence locks reaches for a model's defaults, and a second copy of them in the rule drifts from the skill | 2026-10-18 |
|
|
15
|
-
| Report an unresolved skill | House choice: the rule ships with the CLI and the skill with the plugin, so a project holding governance alone would otherwise proceed silently without it | 2026-10-18 |
|
|
16
|
-
|
|
17
|
-
## Declined
|
|
18
|
-
|
|
19
|
-
The rewrite kept both bullets unchanged.
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Interface casing rule ledger
|
|
3
|
-
description: Sources for governance/rules/ui/interface-casing.md, one row per bullet
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Interface casing rule ledger
|
|
7
|
-
|
|
8
|
-
The field is content design, and the authority is the GOV.UK style guide, which sets sentence case for every heading and title. The label count and the scope bullets are canon's own.
|
|
9
|
-
|
|
10
|
-
## Sentence case
|
|
11
|
-
|
|
12
|
-
| Bullet | Source | Read |
|
|
13
|
-
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
14
|
-
| Sentence case | [A to Z of GOV.UK style](https://www.gov.uk/guidance/style-guide/a-to-z-of-gov-uk-style): "Always use sentence case, even in page titles and service names" | 2026-10-18 |
|
|
15
|
-
| Proper nouns keep casing | [A to Z of GOV.UK style](https://www.gov.uk/guidance/style-guide/a-to-z-of-gov-uk-style): "The exceptions to this are proper nouns" | 2026-10-18 |
|
|
16
|
-
|
|
17
|
-
## Uppercase labels
|
|
18
|
-
|
|
19
|
-
| Bullet | Source | Read |
|
|
20
|
-
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
21
|
-
| Label count | House choice: an uppercase eyebrow over every section is the template tell `design-taste` reaches past, and the count makes the cap checkable against a page | 2026-10-18 |
|
|
22
|
-
|
|
23
|
-
## Where it applies
|
|
24
|
-
|
|
25
|
-
| Bullet | Source | Read |
|
|
26
|
-
| ---------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
27
|
-
| Copy outside the globs | House choice: a locale file holds the same rendered strings, so title case there ships with no rule firing on it | 2026-10-18 |
|
|
28
|
-
|
|
29
|
-
## Overriding
|
|
30
|
-
|
|
31
|
-
| Bullet | Source | Read |
|
|
32
|
-
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
33
|
-
| Depart where needed | House choice: an acronym or brand mark lowered to sentence case misnames it, the same reason GOV.UK keeps "proper nouns" as its one exception | 2026-10-18 |
|
|
34
|
-
|
|
35
|
-
## Declined
|
|
36
|
-
|
|
37
|
-
Every bullet the rewrite removed or reshaped, grouped by why.
|
|
38
|
-
|
|
39
|
-
### Cut without a check
|
|
40
|
-
|
|
41
|
-
- Cut "treat the count as a judgment, since a glob cannot check it", which tells a session nothing it can verify against a line.
|
|
42
|
-
|
|
43
|
-
### Merged or reworded
|
|
44
|
-
|
|
45
|
-
- Folded "treat title case on every heading as a template tell" into the sentence case bullet as its reason.
|
|
46
|
-
- Shortened the uppercase label bullet under 200 characters, keeping the `ceil(sections / 3)` count and the delete remedy.
|
|
47
|
-
- Reworded the scope bullet from a statement of what the rule covers to the directive a session can act on.
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Link behavior rule ledger
|
|
3
|
-
description: Sources for governance/rules/ui/link-behavior.md, one row per bullet
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Link behavior rule ledger
|
|
7
|
-
|
|
8
|
-
The field is interaction design, and the authority is the Nielsen Norman Group's research on new windows and tabs.
|
|
9
|
-
|
|
10
|
-
## Default target
|
|
11
|
-
|
|
12
|
-
| Bullet | Source | Read |
|
|
13
|
-
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
14
|
-
| Same tab, new tab by task | [Opening links in new browser windows and tabs](https://www.nngroup.com/articles/new-browser-windows-and-tabs/): "There is generally one good reason to open a page in a new window, and that is that the user will need to refer to that content in order to complete a task in another window" | 2026-10-18 |
|
|
15
|
-
| No blanket external new tab | [Opening links in new browser windows and tabs](https://www.nngroup.com/articles/new-browser-windows-and-tabs/): "New windows or tabs prevent the use of the Back button" and "can cause disorientation" | 2026-10-18 |
|
|
16
|
-
|
|
17
|
-
## mailto: links
|
|
18
|
-
|
|
19
|
-
| Bullet | Source | Read |
|
|
20
|
-
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
21
|
-
| `mailto:` same tab | House choice: the link opens the mail client and leaves the page in place, so `target="_blank"` only adds an empty tab the person must close | 2026-10-18 |
|
|
22
|
-
|
|
23
|
-
## Declined
|
|
24
|
-
|
|
25
|
-
Every bullet the rewrite removed or reshaped, grouped by why.
|
|
26
|
-
|
|
27
|
-
### Rewritten to what the source says
|
|
28
|
-
|
|
29
|
-
- Reworded the new tab exception from "a destination that would discard in-progress work" to a page the person must consult while finishing a task, the one reason NN/g names.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce UI copy and text standards for rendered strings in components
|
|
3
|
-
paths:
|
|
4
|
-
- '**/*.tsx'
|
|
5
|
-
- '**/*.jsx'
|
|
6
|
-
- '**/*.astro'
|
|
7
|
-
- '**/*.html'
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# UI copy standards
|
|
11
|
-
|
|
12
|
-
## Punctuation
|
|
13
|
-
|
|
14
|
-
- Write no em dash (`—`) or semicolon in rendered copy. Use a comma or a period, or restructure the sentence.
|
|
15
|
-
- Add no trailing punctuation to a button label or a short action string.
|
|
16
|
-
|
|
17
|
-
## Button copy
|
|
18
|
-
|
|
19
|
-
- Label a button with the verb of the action it performs, such as `Save` or `Delete`, never with filler such as `Click to delete`.
|
|
20
|
-
|
|
21
|
-
## Error messages
|
|
22
|
-
|
|
23
|
-
- Tell the person how to fix the error, such as `Enter an email address` over `Email is invalid`.
|
|
24
|
-
- Keep an error message to one short sentence in plain language, with no technical jargon or error codes.
|
|
25
|
-
|
|
26
|
-
## Placeholder text
|
|
27
|
-
|
|
28
|
-
- Never use placeholder text as a label, a hint, or an example. Put a format example such as `name@example.com` in hint text under the label.
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Route edits that decide how a surface looks to the design-taste skill for the layer ordering, the coherence locks, and the defaults a model reaches for
|
|
3
|
-
paths:
|
|
4
|
-
- '**/*.tsx'
|
|
5
|
-
- '**/*.jsx'
|
|
6
|
-
- '**/*.astro'
|
|
7
|
-
- '**/*.html'
|
|
8
|
-
- '**/*.css'
|
|
9
|
-
- '**/*.scss'
|
|
10
|
-
- 'canon/DESIGN.md'
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Design taste standards
|
|
14
|
-
|
|
15
|
-
## Authority
|
|
16
|
-
|
|
17
|
-
- Load the `canon:design-taste` skill for which design decision settles first, what must stay constant across a surface, and the defaults to reach past. It is the single source for all three.
|
|
18
|
-
- Report it rather than proceeding silently when the skill does not resolve. It ships with the plugin and this rule ships with the CLI, so a project that installed governance alone does not have it.
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce casing for interface text in markup, MDX, and content modules, where copy lives in a content folder
|
|
3
|
-
paths:
|
|
4
|
-
- '**/*.tsx'
|
|
5
|
-
- '**/*.jsx'
|
|
6
|
-
- '**/*.astro'
|
|
7
|
-
- '**/*.html'
|
|
8
|
-
- '**/*.mdx'
|
|
9
|
-
- '**/content/**/*.ts'
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Interface casing standards
|
|
13
|
-
|
|
14
|
-
## Sentence case
|
|
15
|
-
|
|
16
|
-
- Use sentence case for rendered headings, labels, nav items, tab titles, and dialog titles, since title case on every heading reads as a template default.
|
|
17
|
-
- Keep the original casing of a proper noun or product name, such as `GitHub`, `macOS`, or `TypeScript`.
|
|
18
|
-
|
|
19
|
-
## Uppercase labels
|
|
20
|
-
|
|
21
|
-
- Keep small uppercase labels above headings to `ceil(sections / 3)`, the first screen counting as one. Delete the extra labels, since position already names a section.
|
|
22
|
-
|
|
23
|
-
## Where it applies
|
|
24
|
-
|
|
25
|
-
- Apply the same casing to interface copy kept outside the globs, such as a locale file, which this rule never fires on.
|
|
26
|
-
|
|
27
|
-
## Overriding
|
|
28
|
-
|
|
29
|
-
- Depart from sentence case only where the case needs it, such as an acronym, a brand mark, or a set-in-caps identity the design chose on purpose.
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Enforce the same-tab default for an outbound link and for a mail link
|
|
3
|
-
paths:
|
|
4
|
-
- '**/*.tsx'
|
|
5
|
-
- '**/*.jsx'
|
|
6
|
-
- '**/*.astro'
|
|
7
|
-
- '**/*.html'
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Link behavior standards
|
|
11
|
-
|
|
12
|
-
## Default target
|
|
13
|
-
|
|
14
|
-
- Open a link in the same tab. Reserve `target="_blank"` for a page the person must consult while finishing a task in the current one.
|
|
15
|
-
- Never add `target="_blank"` as a default for every external link.
|
|
16
|
-
|
|
17
|
-
## mailto: links
|
|
18
|
-
|
|
19
|
-
- Open a `mailto:` link in the same tab. It hands off to the mail client rather than replacing the page, so a new tab leaves an empty tab behind.
|