@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
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Machine tells ledger
|
|
3
|
+
description: Sources for claude/skills/design-taste/references/tells.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Machine tells ledger
|
|
7
|
+
|
|
8
|
+
The field is what language models draw when nothing states a direction, which no design authority studies. Nearly every row is therefore a catalog observation from a community prompt skill, recording model output and never cited as an authority. The few authority rows quote MDN, Practical Typography, or Wikipedia.
|
|
9
|
+
|
|
10
|
+
The main catalog is Taste-Skill's v2 experimental skill, which its author moved to the classics repository on 2026-10-19. Each count in the countable limits is a House choice even where a catalog states the same number, since the toolkit adopted it so the tell can be counted.
|
|
11
|
+
|
|
12
|
+
## Where current AI design clusters
|
|
13
|
+
|
|
14
|
+
| Bullet | Source | Read |
|
|
15
|
+
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
16
|
+
| The warm paper page | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "a warm cream background (near #F4F1EA) with a high-contrast serif display and a terracotta or warm-clay accent" | 2026-10-24 |
|
|
17
|
+
| Black with one accent | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "a near-black background with a single bright acid-green or vermilion accent" | 2026-10-24 |
|
|
18
|
+
| The newspaper imitation | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "a broadsheet-style layout with hairline rules, zero border-radius, and dense newspaper-like columns" | 2026-10-24 |
|
|
19
|
+
| The card kit | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "content chopped into identical rounded cards", under "the same soft grey shadow", with "gradient washes as decoration" | 2026-10-24 |
|
|
20
|
+
| Template chrome | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "a tracked-out ALL-CAPS eyebrow label above every heading", "meta strings joined with middle dots", and "a monospace face for small data labels" | 2026-10-24 |
|
|
21
|
+
|
|
22
|
+
## Composition
|
|
23
|
+
|
|
24
|
+
| Bullet | Source | Read |
|
|
25
|
+
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
26
|
+
| The three equal cards | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md): "Three equal card columns as feature row. This is the most generic AI layout." | 2026-10-24 |
|
|
27
|
+
| One section shape repeated | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "Every section the same layout family" is a structural tell, reached past with "Different composition per section" | 2026-10-24 |
|
|
28
|
+
| The centered hero | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "Centred headline, subtitle, two buttons, screenshot below" | 2026-10-24 |
|
|
29
|
+
| Decoration as structure | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "NO crosshair / hairline grid lines as decoration", kept "only when they organize real content" | 2026-10-24 |
|
|
30
|
+
| The corner floater | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "a small explainer paragraph floating with no clear alignment to anything else. That floater is the Tell." | 2026-10-24 |
|
|
31
|
+
|
|
32
|
+
## Content and labels
|
|
33
|
+
|
|
34
|
+
| Bullet | Source | Read |
|
|
35
|
+
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
36
|
+
| Enumerated eyebrows | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): generic step labels are banned, since "The actual step content is the label" | 2026-10-24 |
|
|
37
|
+
| Poetic section labels | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Field notes" and "On our desks" style labels read "as performative-craftsman. Use plain functional labels" | 2026-10-24 |
|
|
38
|
+
| Atmospheric strips | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "NO weather / locale strips" and "NO version footers on marketing pages" | 2026-10-24 |
|
|
39
|
+
| Scroll cues | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Scroll cues are banned." Readers "know what scroll is." | 2026-10-24 |
|
|
40
|
+
| Decorative status dots | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): a dot is "Only acceptable when conveying real semantic state" and "limited to one per page section" | 2026-10-24 |
|
|
41
|
+
| Filler verbs | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md): "Never use 'Elevate', 'Seamless', 'Unleash', 'Next-Gen'", and "Write plain, specific language." | 2026-10-24 |
|
|
42
|
+
| Placeholder as placeholder | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md): "Generic names like 'John Doe'" and "Placeholder company names like 'Acme Corp'" | 2026-10-24 |
|
|
43
|
+
| Invented precision | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Fake-precise numbers are flagged", passing only when they "Come from real data" or "Are explicitly labeled as mock" | 2026-10-24 |
|
|
44
|
+
| The fake screenshot | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "NO div-based fake product UI in the hero", which it ranks first among the tells | 2026-10-24 |
|
|
45
|
+
| Copy nobody re-read | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "re-read every visible string on the page", since "AI-generated cute copy is worse than boring copy" | 2026-10-24 |
|
|
46
|
+
| What the re-read rewrites | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): the re-read flags a string that is "Grammatically broken", "Has unclear referents", or carries "cute-but-wrong wordplay" | 2026-10-24 |
|
|
47
|
+
|
|
48
|
+
## Surface and palette
|
|
49
|
+
|
|
50
|
+
| Bullet | Source | Read |
|
|
51
|
+
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
52
|
+
| Glow as depth | Catalog observation, [Impeccable craft floor](https://github.com/pbakaus/impeccable/blob/main/skill/reference/craft-floor.md): "shadows carry an offset and a soft blur. A zero-offset colored halo is decoration." | 2026-10-24 |
|
|
53
|
+
| Pure black and pure white | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md), for the black half: a pure black background is a tell, to "Replace with off-black, dark charcoal, or tinted dark". The white half is a House choice: a full-brightness ground glares beside every tinted neutral on it | 2026-10-24 |
|
|
54
|
+
| Saturation everywhere | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md): "Oversaturated accent colors. Keep saturation below 80%." | 2026-10-24 |
|
|
55
|
+
| The gradient as a substitute | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "Gradient-filled headline text" and a "Glowing or gradient" button are banned, reached past with "Solid ink" and a "Flat button" | 2026-10-24 |
|
|
56
|
+
| Uniform radius and elevation | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "One medium border radius (12–16px) on everything" and a "Soft grey drop shadow under every card" | 2026-10-24 |
|
|
57
|
+
|
|
58
|
+
## Platform surfaces
|
|
59
|
+
|
|
60
|
+
| Bullet | Source | Read |
|
|
61
|
+
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
62
|
+
| An unstyled platform control | [color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme): it adapts "The default colors of form controls" | 2026-10-24 |
|
|
63
|
+
| No checkerboard | [Wikipedia, Transparency](https://en.wikipedia.org/wiki/Transparency_%28graphic%29): an editor "shows transparency by a special pattern, e.g. a checkerboard pattern" | 2026-10-24 |
|
|
64
|
+
|
|
65
|
+
## Typography
|
|
66
|
+
|
|
67
|
+
| Bullet | Source | Read |
|
|
68
|
+
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
69
|
+
| Scale as the only hierarchy | [Practical Typography, Headings](https://practicaltypography.com/headings.html): "It's fine to make the point size bigger, but just a little." | 2026-10-24 |
|
|
70
|
+
| One family doing every job | Catalog observation, [Redesign skill](https://github.com/nxpatterns/claude-taste-skill/blob/main/skills/redesign-skill/SKILL.md): "Browser default fonts or Inter everywhere", reached past by pairing "a serif header with a sans-serif body" | 2026-10-24 |
|
|
71
|
+
| Unbounded measure | [Practical Typography, Line length](https://practicaltypography.com/line-length.html): "Aim for an average line length of 45–90 characters, including spaces." | 2026-10-24 |
|
|
72
|
+
| Caps and tracking as texture | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "Tiny uppercase letter-spaced captions scattered around the viewport" | 2026-10-24 |
|
|
73
|
+
|
|
74
|
+
## Motion
|
|
75
|
+
|
|
76
|
+
| Bullet | Source | Read |
|
|
77
|
+
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
78
|
+
| Motion nobody can justify | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Before adding any animation, ask: 'what does this animation communicate?'" | 2026-10-24 |
|
|
79
|
+
| The permanent loop | Catalog observation, [Taste-Skill tells](https://github.com/leonxlnx/taste-skill/blob/main/skills/taste-skill/references/tells.md): "infinite loops that mean nothing" are a motion tell | 2026-10-24 |
|
|
80
|
+
| Motion on arrival | Catalog observation, [frontend-design](https://github.com/anthropics/skills/blob/main/skills/frontend-design/SKILL.md): "fade-and-slide-up entrances on each section and hover transitions on every card are the generic default and read as AI-generated" | 2026-10-24 |
|
|
81
|
+
| Motion claimed but absent | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Motion claimed, motion shown." A static page claiming motion "is broken" | 2026-10-24 |
|
|
82
|
+
| Motion that ignores the preference | [prefers-reduced-motion](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion): it detects a setting "to minimize the amount of non-essential motion", the source the `ui-craft` motion ledger records for the rule this bullet points at | 2026-10-24 |
|
|
83
|
+
|
|
84
|
+
## The countable limits
|
|
85
|
+
|
|
86
|
+
| Bullet | Source | Read |
|
|
87
|
+
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
88
|
+
| A layout family once | House choice: a repeated shape becomes a count a reviewer can check. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "A landing page with 8 sections must use at least 4 different layout families." | 2026-10-24 |
|
|
89
|
+
| Two consecutive splits | House choice: a third alternation is where the pattern reads as filler. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Max 2 sections in a row with this image+text-split pattern." | 2026-10-24 |
|
|
90
|
+
| One label per three | House choice, recorded in the `ui-craft` copy ledger. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Maximum 1 eyebrow per 3 sections." | 2026-10-24 |
|
|
91
|
+
| One marquee | House choice: a second sliding strip is where the device reads as filler. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Two or more marquees on the same page reads as lazy filler." | 2026-10-24 |
|
|
92
|
+
| Cells equal items | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "A bento grid has EXACTLY as many cells as you have content for." | 2026-10-24 |
|
|
93
|
+
| Over five items | House choice: a long run becomes a count a reviewer can check. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "If you have > 5 items, reach for one of these instead" | 2026-10-24 |
|
|
94
|
+
|
|
95
|
+
## The first screen
|
|
96
|
+
|
|
97
|
+
| Bullet | Source | Read |
|
|
98
|
+
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
99
|
+
| It fits | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "Hero MUST fit in the initial viewport", with "CTAs visible without scroll" | 2026-10-24 |
|
|
100
|
+
| At most four text elements | House choice: a label, a headline, a supporting line, and the actions, so a fifth is countable. The catalog states the cap, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "max 4 text elements" | 2026-10-24 |
|
|
101
|
+
| Everything else moves down | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): the tagline, trust strip, pricing teaser, feature list, and avatar row "move to dedicated sections directly below the hero" | 2026-10-24 |
|
|
102
|
+
| Scale planned with the asset | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): "A 4-line hero headline is always a font-size error, never a copy-length error." | 2026-10-24 |
|
|
103
|
+
| Logos go under it | Catalog observation, [Taste-Skill v2 experimental](https://github.com/Leonxlnx/taste-skill-classics/blob/main/skills/taste-skill-v2-experimental/SKILL.md): the logo wall "belongs UNDER the hero, never inside it" | 2026-10-24 |
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Accessibility
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Accessibility reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/a11y.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Accessibility
|
|
6
|
+
# Accessibility reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authority is the W3C, through WCAG 2.2 and its Understanding documents, the WAI tutorials, and the ARIA notes. The keyboard and focus half of the old rule moved to `keyboard.md`, whose ledger records those bullets.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Surface capture
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Surface capture reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/capture.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Surface capture
|
|
6
|
+
# Surface capture reference ledger
|
|
7
7
|
|
|
8
8
|
The rule states canon's own evidence procedure for a rendered change, so most rows are house choices naming the bug the bullet prevents. The 320 floor rests on WCAG 2.2, and each explanation the old rule carried moved into a row here.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: UX controls
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: UX controls reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/controls.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# UX controls
|
|
6
|
+
# UX controls reference ledger
|
|
7
7
|
|
|
8
8
|
The field is interaction design, and the authorities are the Nielsen Norman Group, WCAG 2.2, Primer, Cloudscape, MDN, and web.dev. These bullets were split from `ux-completeness.md`.
|
|
9
9
|
|
|
@@ -16,11 +16,16 @@ The field is interaction design, and the authorities are the Nielsen Norman Grou
|
|
|
16
16
|
|
|
17
17
|
## Element states
|
|
18
18
|
|
|
19
|
+
| Bullet | Source | Read |
|
|
20
|
+
| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
21
|
+
| Distinct interaction states | [Visibility of system status](https://www.nngroup.com/articles/visibility-system-status/): "Did the system actually catch that button press", and an element with no pressed or hover response leaves the person unable to tell | 2026-10-18 |
|
|
22
|
+
| Say why a control is disabled | [Cloudscape, Disabled and read-only states](https://cloudscape.design/patterns/general/disabled-and-read-only-states/): "Use disabled reasons where adequate context is not provided through disabled button or label text", and `aria-disabled="true"` is used "so that it will remain focusable" | 2026-10-23 |
|
|
23
|
+
| Declare `color-scheme` | [MDN, color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme): the user agent adapts "The default colors of scrollbars and other interaction UI" and "The default colors of form controls", and the page opts in by declaring it on the `:root` element | 2026-10-23 |
|
|
24
|
+
| No intermediate flash | [Cumulative Layout Shift](https://web.dev/articles/cls): "Unexpected layout shifts can disrupt the user experience", caused by content "dynamically added to the page before existing content" | 2026-10-18 |
|
|
25
|
+
|
|
26
|
+
## Hover and focus effects
|
|
27
|
+
|
|
19
28
|
| Bullet | Source | Read |
|
|
20
29
|
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
|
|
21
|
-
| Distinct interaction states | [Visibility of system status](https://www.nngroup.com/articles/visibility-system-status/): "Did the system actually catch that button press", and an element with no pressed or hover response leaves the person unable to tell | 2026-10-18 |
|
|
22
|
-
| Say why a control is disabled | [Cloudscape, Disabled and read-only states](https://cloudscape.design/patterns/general/disabled-and-read-only-states/): "Use disabled reasons where adequate context is not provided through disabled button or label text", and `aria-disabled="true"` is used "so that it will remain focusable" | 2026-10-23 |
|
|
23
|
-
| Declare `color-scheme` | [MDN, color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme): the user agent adapts "The default colors of scrollbars and other interaction UI" and "The default colors of form controls", and the page opts in by declaring it on the `:root` element | 2026-10-23 |
|
|
24
30
|
| Hover and focus content | [Understanding Content on Hover or Focus](https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html): additional content is "Dismissible" without moving hover or focus, "Hoverable" so the pointer can move over it, and "Persistent" until "the hover or focus trigger is removed, the user dismisses it, or its information is no longer valid" | 2026-10-23, WCAG 2.2 |
|
|
25
31
|
| No change of context on focus or input | [Understanding On Focus](https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html): "When any user interface component receives focus, it does not initiate a change of context". [Understanding On Input](https://www.w3.org/WAI/WCAG22/Understanding/on-input.html): changing a setting does not cause one "unless the user has been advised of the behavior before using the component" | 2026-10-23, WCAG 2.2 |
|
|
26
|
-
| No intermediate flash | [Cumulative Layout Shift](https://web.dev/articles/cls): "Unexpected layout shifts can disrupt the user experience", caused by content "dynamically added to the page before existing content" | 2026-10-18 |
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: UI copy reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/copy.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI copy reference ledger
|
|
7
|
+
|
|
8
|
+
The reference joins three rules, and its sections keep their order, so each source below covers a run of them.
|
|
9
|
+
|
|
10
|
+
Content design governs the first four sections, where the authority for researched interface copy is the GOV.UK Design System and its style guide.
|
|
11
|
+
|
|
12
|
+
The four casing sections rest on the GOV.UK style guide, which sets sentence case for every heading and title, and canon set the label count and the scope bullets itself. The two link sections are interaction design, sourced from the Nielsen Norman Group's research on new windows and tabs.
|
|
13
|
+
|
|
14
|
+
## Punctuation
|
|
15
|
+
|
|
16
|
+
| Bullet | Source | Read |
|
|
17
|
+
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
18
|
+
| 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 |
|
|
19
|
+
| 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 |
|
|
20
|
+
|
|
21
|
+
## Button copy
|
|
22
|
+
|
|
23
|
+
| Bullet | Source | Read |
|
|
24
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
25
|
+
| 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 |
|
|
26
|
+
|
|
27
|
+
## Error messages
|
|
28
|
+
|
|
29
|
+
| Bullet | Source | Read |
|
|
30
|
+
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
31
|
+
| 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 |
|
|
32
|
+
| 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 |
|
|
33
|
+
|
|
34
|
+
## Placeholder text
|
|
35
|
+
|
|
36
|
+
| Bullet | Source | Read |
|
|
37
|
+
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
38
|
+
| 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 |
|
|
39
|
+
|
|
40
|
+
## Sentence case
|
|
41
|
+
|
|
42
|
+
| Bullet | Source | Read |
|
|
43
|
+
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
44
|
+
| 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 |
|
|
45
|
+
| 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 |
|
|
46
|
+
|
|
47
|
+
## Uppercase labels
|
|
48
|
+
|
|
49
|
+
| Bullet | Source | Read |
|
|
50
|
+
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
51
|
+
| 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 |
|
|
52
|
+
|
|
53
|
+
## Where it applies
|
|
54
|
+
|
|
55
|
+
| Bullet | Source | Read |
|
|
56
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
57
|
+
| 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 |
|
|
58
|
+
|
|
59
|
+
## Overriding
|
|
60
|
+
|
|
61
|
+
| Bullet | Source | Read |
|
|
62
|
+
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
63
|
+
| 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 |
|
|
64
|
+
|
|
65
|
+
## Default target
|
|
66
|
+
|
|
67
|
+
| Bullet | Source | Read |
|
|
68
|
+
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- |
|
|
69
|
+
| 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 |
|
|
70
|
+
| 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 |
|
|
71
|
+
|
|
72
|
+
## mailto: links
|
|
73
|
+
|
|
74
|
+
| Bullet | Source | Read |
|
|
75
|
+
| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
76
|
+
| `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 |
|
|
77
|
+
|
|
78
|
+
## Declined
|
|
79
|
+
|
|
80
|
+
Every bullet the rewrite removed or reshaped, grouped by why.
|
|
81
|
+
|
|
82
|
+
### Contradicted by the source
|
|
83
|
+
|
|
84
|
+
- 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".
|
|
85
|
+
- Cut "reserve instructions for labels or helper text", which the new placeholder bullet now carries.
|
|
86
|
+
|
|
87
|
+
### Merged or reworded
|
|
88
|
+
|
|
89
|
+
- 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".
|
|
90
|
+
- Merged "keep messages short and actionable" and "one sentence maximum" into the plain language bullet.
|
|
91
|
+
- Reworded the error example to `Enter an email address`, the instruction form GOV.UK prefers over a description.
|
|
92
|
+
- Folded "treat title case on every heading as a template tell" into the sentence case bullet as its reason.
|
|
93
|
+
- Shortened the uppercase label bullet under 200 characters, keeping the `ceil(sections / 3)` count and the delete remedy.
|
|
94
|
+
- Reworded the scope bullet from a statement of what the rule covers to the directive a session can act on.
|
|
95
|
+
|
|
96
|
+
### Cut without a check
|
|
97
|
+
|
|
98
|
+
- Cut "treat the count as a judgment, since a glob cannot check it", which tells a session nothing it can verify against a line.
|
|
99
|
+
|
|
100
|
+
### Rewritten to what the source says
|
|
101
|
+
|
|
102
|
+
- 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,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Forms
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Forms reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/forms.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Forms
|
|
6
|
+
# Forms reference ledger
|
|
7
7
|
|
|
8
8
|
The field is form design inside interaction design, and the authority for researched form patterns is the GOV.UK Design System, with WCAG 2.2 for the two authentication criteria. NN/g was read beside it and disagrees on validation timing, recorded under `## Declined`.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Keyboard
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Keyboard reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/keyboard.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Keyboard
|
|
6
|
+
# Keyboard reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, MDN for CSS behavior, and the platform guidelines from Apple and Android for native targets. Every bullet here was split from `a11y.md`.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Motion
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Motion reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/motion.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Motion
|
|
6
|
+
# Motion reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, and MDN for the media feature.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Pointer
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: Pointer reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/pointer.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Pointer
|
|
6
|
+
# Pointer reference ledger
|
|
7
7
|
|
|
8
8
|
The field is web accessibility, and the authorities are the W3C, through WCAG 2.2 and the ARIA Authoring Practices Guide, MDN for popover behavior, and the platform guidelines from Apple and Android for native targets. These bullets were split from `keyboard.md`.
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: UX completeness
|
|
3
|
-
description: Sources for
|
|
2
|
+
title: UX completeness reference ledger
|
|
3
|
+
description: Sources for claude/skills/ui-craft/references/states.md, one row per bullet
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# UX completeness
|
|
6
|
+
# UX completeness reference ledger
|
|
7
7
|
|
|
8
8
|
The field is interaction design, and the authorities are the Nielsen Norman Group's research articles, WCAG 2.2 for timing, MDN for the `title` attribute and CSS truncation, and web.dev for layout shift.
|
|
9
9
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: UI craft rule ledger
|
|
3
|
+
description: Sources for governance/rules/ui/craft.md, one row per bullet
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# UI craft rule ledger
|
|
7
|
+
|
|
8
|
+
The rule is a pointer to the `ui-craft` and `design-taste` skills, which carry their 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 skills | House choice: a rendered edit made without the behavior floor or the layer order reaches for a model's defaults, and a second copy of either in the rule drifts from the skill that owns it | 2026-10-24 |
|
|
15
|
+
| Report an unresolved skill | House choice: the rule ships with the CLI and the skills with the plugin, so a project holding governance alone would otherwise proceed silently without them | 2026-10-18 |
|
|
16
|
+
|
|
17
|
+
## Declined
|
|
18
|
+
|
|
19
|
+
The fold kept both bullets and widened the first to name `ui-craft` beside `design-taste`, since the practice rules it replaced now live in that skill.
|
package/governance/renames.toml
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
# so `canon gov sync` replaces a held old file with the rule under its new name
|
|
4
4
|
# rather than only deleting it.
|
|
5
5
|
#
|
|
6
|
-
# An entry declares one-to-one identity
|
|
7
|
-
#
|
|
8
|
-
#
|
|
6
|
+
# An entry declares one-to-one identity, or a fold onto a pointer rule that
|
|
7
|
+
# now routes to the skill carrying the folded rules, so a target holding any
|
|
8
|
+
# of them lands on the pointer rather than losing the practice with nothing in
|
|
9
|
+
# its place. Any other fold of several rules into one, or a split of one into
|
|
10
|
+
# several, is a retirement plus an addition and takes no entry here. Add the entry in the same change as the
|
|
9
11
|
# rename or renumber. Prune an entry only once its target rule is retired and
|
|
10
12
|
# the retire path covers it, since a chain ending on a rule nothing ships
|
|
11
13
|
# resolves to nothing and a sync deletes the held file instead. Otherwise leave
|
|
@@ -73,3 +75,15 @@
|
|
|
73
75
|
"460-design-taste" = "design-taste"
|
|
74
76
|
"465-interface-casing" = "interface-casing"
|
|
75
77
|
"470-motion" = "motion"
|
|
78
|
+
"design-taste" = "craft"
|
|
79
|
+
"a11y" = "craft"
|
|
80
|
+
"keyboard" = "craft"
|
|
81
|
+
"pointer" = "craft"
|
|
82
|
+
"forms" = "craft"
|
|
83
|
+
"motion" = "craft"
|
|
84
|
+
"ux-controls" = "craft"
|
|
85
|
+
"ux-completeness" = "craft"
|
|
86
|
+
"surface-capture" = "craft"
|
|
87
|
+
"copy" = "craft"
|
|
88
|
+
"interface-casing" = "craft"
|
|
89
|
+
"link-behavior" = "craft"
|
|
@@ -20,5 +20,5 @@ paths:
|
|
|
20
20
|
|
|
21
21
|
- Answer a question about the running page with a script against the dev server rather than with the suite.
|
|
22
22
|
- Do not enable `fullyParallel` in the Playwright config.
|
|
23
|
-
- Follow
|
|
23
|
+
- Follow the `canon:ui-craft` skill's capture reference for capture scope, reporting it when the skill does not resolve.
|
|
24
24
|
- Follow `.claude/rules/canon/lib/e2e-reliability.md` for waits and guards.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Route edits to a rendered surface to the ui-craft skill for how it behaves and to the design-taste skill for how it looks
|
|
3
|
+
paths:
|
|
4
|
+
- '**/*.tsx'
|
|
5
|
+
- '**/*.jsx'
|
|
6
|
+
- '**/*.vue'
|
|
7
|
+
- '**/*.svelte'
|
|
8
|
+
- '**/*.astro'
|
|
9
|
+
- '**/*.html'
|
|
10
|
+
- '**/*.mdx'
|
|
11
|
+
- '**/*.css'
|
|
12
|
+
- '**/*.scss'
|
|
13
|
+
- '**/content/**/*.ts'
|
|
14
|
+
- 'canon/DESIGN.md'
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# UI craft standards
|
|
18
|
+
|
|
19
|
+
## Authority
|
|
20
|
+
|
|
21
|
+
- Load the `canon:ui-craft` skill for how a surface behaves and the `canon:design-taste` skill for how it looks. Each is the single source for its half.
|
|
22
|
+
- Report it rather than proceeding silently when either skill does not resolve. Both ship with the plugin and this rule ships with the CLI, so governance alone carries neither.
|
package/governance/splits.toml
CHANGED
package/package.json
CHANGED
package/src/audits/catalog.ts
CHANGED
|
@@ -2,7 +2,6 @@ import type { SkillsAuditRefusal } from '@/claude/skills-audit'
|
|
|
2
2
|
import type { RankRefusal } from '@/claude/skills-rank'
|
|
3
3
|
import type { ReachRefusal } from '@/claude/skills-reach'
|
|
4
4
|
import type { ContextAuditRefusal } from '@/context/audit'
|
|
5
|
-
import type { SweepVerdict } from '@/context/classify/patterns'
|
|
6
5
|
import type { AuditRefusal } from '@/deps/audit'
|
|
7
6
|
import type { RuleAuditRefusal } from '@/gov/audit'
|
|
8
7
|
import type { RestatedRefusal } from '@/gov/restated'
|
|
@@ -161,45 +160,6 @@ function requirementsCounts(
|
|
|
161
160
|
return { requirementsOverWords: record.words > record.wordCap ? 1 : 0 }
|
|
162
161
|
}
|
|
163
162
|
|
|
164
|
-
/**
|
|
165
|
-
* The retained key for each verdict the sweep can return. A record rather than
|
|
166
|
-
* a list, so the compiler fails here when the classifier gains a verdict,
|
|
167
|
-
* instead of that verdict's sections dropping out of the tally.
|
|
168
|
-
*/
|
|
169
|
-
const PLACEMENT_KEYS: Record<SweepVerdict, string> = {
|
|
170
|
-
KEEP: 'keep',
|
|
171
|
-
REWRITE: 'rewrite',
|
|
172
|
-
MOVE: 'move',
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function isPlacementVerdict(value: unknown): value is SweepVerdict {
|
|
176
|
-
return typeof value === 'string' && Object.hasOwn(PLACEMENT_KEYS, value)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Tallies the sweep's findings by verdict, with a zero for a verdict nothing
|
|
181
|
-
* returned, so a baseline reads the same three keys on every run.
|
|
182
|
-
*
|
|
183
|
-
* `KEEP` is retained beside the two that ask for a change. It moves when a
|
|
184
|
-
* section is added or split, which is what tells a falling `rewrite` count
|
|
185
|
-
* from a corpus that shrank.
|
|
186
|
-
*/
|
|
187
|
-
function placementCounts(record: unknown): Record<string, number> | undefined {
|
|
188
|
-
const findings = asObject(record)?.findings
|
|
189
|
-
if (!Array.isArray(findings)) return undefined
|
|
190
|
-
|
|
191
|
-
const counts: Record<string, number> = Object.fromEntries(
|
|
192
|
-
Object.values(PLACEMENT_KEYS).map((key) => [key, 0]),
|
|
193
|
-
)
|
|
194
|
-
for (const finding of findings) {
|
|
195
|
-
const verdict = asObject(finding)?.verdict
|
|
196
|
-
if (!isPlacementVerdict(verdict)) return undefined
|
|
197
|
-
counts[PLACEMENT_KEYS[verdict]] += 1
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return counts
|
|
201
|
-
}
|
|
202
|
-
|
|
203
163
|
function contextCounts(record: unknown): Record<string, number> | undefined {
|
|
204
164
|
const root = asObject(record)
|
|
205
165
|
if (root === undefined) return undefined
|
|
@@ -526,18 +486,6 @@ export const AUDITS: readonly AuditSpec[] = [
|
|
|
526
486
|
absentReasons: ['no-folders'] satisfies ContextAuditRefusal[],
|
|
527
487
|
counts: contextCounts,
|
|
528
488
|
},
|
|
529
|
-
{
|
|
530
|
-
id: 'placement',
|
|
531
|
-
label: 'Context placement',
|
|
532
|
-
// Pinned to the regex layer rather than the resolved classifier setting.
|
|
533
|
-
// A count that moves with whichever model a machine runs is not
|
|
534
|
-
// comparable across clones, and the model layer turns a sub-second read
|
|
535
|
-
// into a multi-minute one. `document-health` is where the model reads.
|
|
536
|
-
argv: ['context', 'classify', 'sweep', '--backend', 'off', '--json'],
|
|
537
|
-
gatingExits: [],
|
|
538
|
-
corpus: 'tracked',
|
|
539
|
-
counts: placementCounts,
|
|
540
|
-
},
|
|
541
489
|
{
|
|
542
490
|
id: 'markdown',
|
|
543
491
|
label: 'Markdown corpus',
|
package/src/claude/cases/misc.ts
CHANGED
|
@@ -17,6 +17,11 @@ export const MISC_CASES: readonly SkillCase[] = [
|
|
|
17
17
|
'Which layer of this landing page should I settle first, and what has to stay constant across it?',
|
|
18
18
|
expect: 'design-taste',
|
|
19
19
|
},
|
|
20
|
+
{
|
|
21
|
+
prompt:
|
|
22
|
+
'This settings form needs validation and an empty state, so what does it owe for keyboard users and error messages before I build it?',
|
|
23
|
+
expect: 'ui-craft',
|
|
24
|
+
},
|
|
20
25
|
{
|
|
21
26
|
prompt:
|
|
22
27
|
'This project has no logo yet. Draft one and give me a social card to go with it.',
|