Typography Audit
78 rules in 10 categories for web typography. Every finding names file, rule, and fix.
- IS: typography only: font loading, sizing, punctuation, spacing, hierarchy, text layout, OpenType features, typeface pairing, brand type, display type.
- IS NOT: broad UI review (accessibility, forms, navigation: use
ui-design Audit mode), or a redesign (new typefaces, scales: use ui-design Direction mode).
Audit Workflow
Track this checklist:
Audit progress:
- [ ] Step 1: Scope. List changed files (or full sweep), map signals to categories
- [ ] Step 2: Run CRITICAL rules in scope (font-, size-, punct-)
- [ ] Step 3: Run HIGH rules in scope (spacing-)
- [ ] Step 4: Run remaining in-scope categories by descending priority
- [ ] Step 5: Report per the contract; every finding has file:line, rule ID, fix
- Scope to changed files unless a full sweep is requested. For a PR, use the diff against its actual base merge-base, including committed changes, filtered to
.css, .scss, .html, .tsx/.jsx, and template files.
- Map code to categories via the signal table; skip categories with no signal.
- Load rule files by prefix (
rules/font-*.md, etc.), only for the categories the signals selected.
- Run categories in priority order so CRITICAL findings surface even if the audit is cut short.
- After fixes, re-run only the rules that produced findings, then finalize the report.
Scoping Signals → Categories
| Signal in code |
Categories to load |
@font-face, font-family, font files, variable fonts, font-stretch, transform: scaleX on text |
font- |
font-size, clamp(), media-query type changes, max-width on text, <em>/<strong>, text-decoration |
size- |
| Copy in HTML/JSX (headings, paragraphs, labels) |
punct- |
line-height, letter-spacing, word-spacing, margin on text, text-transform: uppercase |
spacing- |
Heading elements, type scale tokens, --text-* properties |
hierarchy- |
text-align, lists, blockquotes, multi-column text |
layout- |
font-feature-settings, font-variant-*, figures/fractions in copy |
opentype- |
| Logo/wordmark styles, brand tokens, text color tokens, license comments |
brand- |
Two or more distinct font-family values |
pairing- |
Hero/display sizes, drop caps, initial-letter |
display- |
Rule Categories by Priority
| Priority |
Category |
Impact |
Prefix |
Rules |
| 1 |
Font Selection & Weights |
CRITICAL |
font- |
11 |
| 2 |
Sizing & Measure |
CRITICAL |
size- |
6 |
| 3 |
Punctuation & Special Characters |
CRITICAL |
punct- |
12 |
| 4 |
Spacing & Rhythm |
HIGH |
spacing- |
8 |
| 5 |
Hierarchy & Scale |
MEDIUM-HIGH |
hierarchy- |
8 |
| 6 |
Alignment & Layout |
MEDIUM |
layout- |
6 |
| 7 |
OpenType Features |
MEDIUM |
opentype- |
7 |
| 8 |
Brand & Identity |
MEDIUM |
brand- |
8 |
| 9 |
Typeface Pairing |
MEDIUM |
pairing- |
5 |
| 10 |
Display & Headlines |
LOW-MEDIUM |
display- |
7 |
Category map and impact rationale: rules/_sections.md. Each rule file gives why it matters plus an incorrect and a correct example. Category impact reflects the category's worst-case rules; report findings with the rule's own frontmatter impact, which frequently differs (e.g. brand-color is HIGH inside the MEDIUM brand- category because it holds the WCAG contrast floor).
Review Output Contract
Report findings as:
## Typography Audit Findings
### path/to/file.css
- [CRITICAL] `punct-smart-quotes` (file.css:42): Straight quotes in heading copy.
- Fix: Replace `"` with `“`/`”` (or UTF-8 curly quotes).
- [CRITICAL] `size-line-height` (file.css:18): `line-height: 20px`, a fixed value the 48px `h1` inherits, so its lines overlap.
- Fix: Use unitless `line-height: 1.5`.
### path/to/clean-file.css
- ✓ pass
- Group by file; order by impact within file.
- Every finding: impact tag, rule ID,
file:line, one-line issue, fix.
- Include clean files as
✓ pass so coverage is visible.
- End with a summary: counts per impact level.
Gotchas
- Don't preload every rule file. Load only the prefixes the signal table selects; a full load spends the budget on categories with no signal in scope.
- Report the rule's frontmatter
impact, never the category's. Two rules get misreported most: brand-color is HIGH (an accessibility floor, not a brand nicety) and punct-daggers is LOW-MEDIUM (decoration, despite sitting in a CRITICAL category).
- Punctuation rules apply to rendered copy only. Flagging straight quotes or
-- inside <code>, <pre>, or JS/TS string literals is a false positive; "fixing" them breaks the code.
- Confirm the rendered font and computed styles through
ui-verification when a finding depends on them. A CSS declaration alone does not prove which face loaded.
- Don't flag missing OpenType features without confirming the loaded font ships them. Browsers silently ignore unsupported
font-feature-settings tags, so the fix does nothing.
- Every finding needs
file:line and a concrete fix; an unactionable finding forces a redo.
- An audit is not a redesign. Proposing new pairings or scales turns a 10-minute review into a design project; flag the issue and route redesign asks to
ui-design.
- Don't equalize priorities. A LOW-MEDIUM
display- nit above a CRITICAL faux-bold finding buries what actually looks broken.
Related Skills
ui-design Audit mode: broad frontend quality (accessibility, forms, navigation, motion); its typography coverage is shallower.
ui-design Direction mode: choosing typefaces, scales, and visual direction from scratch; run when a finding becomes a redesign request.
copywriting: heading and label wording. This skill governs only the casing of that copy (punct-case-rules).
Maintenance only: evals/evals.json contains regression scenarios for changes to this skill; it does not load during a user task.
1---2name: typography-audit3description: Audits font loading, type scales, measure, spacing, OpenType, and rendered punctuation with 78 scoped rules. Use when asked to "audit typography", "fix the fonts", or "review my type system". For a new visual direction use ui-design Direction; for general UI defects use ui-design Audit.4---5
6# Typography Audit
7
878 rules in 10 categories for web typography. Every finding names file, rule, and fix.
9
10- **IS:** typography only: font loading, sizing, punctuation, spacing, hierarchy, text layout, OpenType features, typeface pairing, brand type, display type.
11- **IS NOT:** broad UI review (accessibility, forms, navigation: use `ui-design` Audit mode), or a redesign (new typefaces, scales: use `ui-design` Direction mode).
12
13## Audit Workflow
14
15Track this checklist:
16
17```text
18Audit progress:
19- [ ] Step 1: Scope. List changed files (or full sweep), map signals to categories
20- [ ] Step 2: Run CRITICAL rules in scope (font-, size-, punct-)
21- [ ] Step 3: Run HIGH rules in scope (spacing-)
22- [ ] Step 4: Run remaining in-scope categories by descending priority
23- [ ] Step 5: Report per the contract; every finding has file:line, rule ID, fix
24```
25
261. Scope to changed files unless a full sweep is requested. For a PR, use the diff against its actual base merge-base, including committed changes, filtered to `.css`, `.scss`, `.html`, `.tsx`/`.jsx`, and template files.
272. Map code to categories via the signal table; skip categories with no signal.
283. Load rule files by prefix (`rules/font-*.md`, etc.), only for the categories the signals selected.
294. Run categories in priority order so CRITICAL findings surface even if the audit is cut short.
305. After fixes, re-run only the rules that produced findings, then finalize the report.
31
32## Scoping Signals → Categories
33
34| Signal in code | Categories to load |
35|--------------------|--------------------|
36| `@font-face`, `font-family`, font files, variable fonts, `font-stretch`, `transform: scaleX` on text | `font-` |
37| `font-size`, `clamp()`, media-query type changes, `max-width` on text, `<em>`/`<strong>`, `text-decoration` | `size-` |
38| Copy in HTML/JSX (headings, paragraphs, labels) | `punct-` |
39| `line-height`, `letter-spacing`, `word-spacing`, `margin` on text, `text-transform: uppercase` | `spacing-` |
40| Heading elements, type scale tokens, `--text-*` properties | `hierarchy-` |
41| `text-align`, lists, blockquotes, multi-column text | `layout-` |
42| `font-feature-settings`, `font-variant-*`, figures/fractions in copy | `opentype-` |
43| Logo/wordmark styles, brand tokens, text color tokens, license comments | `brand-` |
44| Two or more distinct `font-family` values | `pairing-` |
45| Hero/display sizes, drop caps, `initial-letter` | `display-` |
46
47## Rule Categories by Priority
48
49| Priority | Category | Impact | Prefix | Rules |
50|----------|----------|--------|--------|-------|
51| 1 | Font Selection & Weights | CRITICAL | `font-` | 11 |
52| 2 | Sizing & Measure | CRITICAL | `size-` | 6 |
53| 3 | Punctuation & Special Characters | CRITICAL | `punct-` | 12 |
54| 4 | Spacing & Rhythm | HIGH | `spacing-` | 8 |
55| 5 | Hierarchy & Scale | MEDIUM-HIGH | `hierarchy-` | 8 |
56| 6 | Alignment & Layout | MEDIUM | `layout-` | 6 |
57| 7 | OpenType Features | MEDIUM | `opentype-` | 7 |
58| 8 | Brand & Identity | MEDIUM | `brand-` | 8 |
59| 9 | Typeface Pairing | MEDIUM | `pairing-` | 5 |
60| 10 | Display & Headlines | LOW-MEDIUM | `display-` | 7 |
61
62Category map and impact rationale: `rules/_sections.md`. Each rule file gives why it matters plus an incorrect and a correct example. Category impact reflects the category's worst-case rules; report findings with the rule's own frontmatter `impact`, which frequently differs (e.g. `brand-color` is HIGH inside the MEDIUM `brand-` category because it holds the WCAG contrast floor).
63
64## Review Output Contract
65
66Report findings as:
67
68```markdown
69## Typography Audit Findings
70
71### path/to/file.css
72- [CRITICAL] `punct-smart-quotes` (file.css:42): Straight quotes in heading copy.
73 - Fix: Replace `"` with `“`/`”` (or UTF-8 curly quotes).
74- [CRITICAL] `size-line-height` (file.css:18): `line-height: 20px`, a fixed value the 48px `h1` inherits, so its lines overlap.
75 - Fix: Use unitless `line-height: 1.5`.
76
77### path/to/clean-file.css
78- ✓ pass
79```
80
81- Group by file; order by impact within file.
82- Every finding: impact tag, rule ID, `file:line`, one-line issue, fix.
83- Include clean files as `✓ pass` so coverage is visible.
84- End with a summary: counts per impact level.
85
86## Gotchas
87
88- Don't preload every rule file. Load only the prefixes the signal table selects; a full load spends the budget on categories with no signal in scope.
89- Report the rule's frontmatter `impact`, never the category's. Two rules get misreported most: `brand-color` is HIGH (an accessibility floor, not a brand nicety) and `punct-daggers` is LOW-MEDIUM (decoration, despite sitting in a CRITICAL category).
90- Punctuation rules apply to rendered copy only. Flagging straight quotes or `--` inside `<code>`, `<pre>`, or JS/TS string literals is a false positive; "fixing" them breaks the code.
91- Confirm the rendered font and computed styles through `ui-verification` when a finding depends on them. A CSS declaration alone does not prove which face loaded.
92- Don't flag missing OpenType features without confirming the loaded font ships them. Browsers silently ignore unsupported `font-feature-settings` tags, so the fix does nothing.
93- Every finding needs `file:line` and a concrete fix; an unactionable finding forces a redo.
94- An audit is not a redesign. Proposing new pairings or scales turns a 10-minute review into a design project; flag the issue and route redesign asks to `ui-design`.
95- Don't equalize priorities. A LOW-MEDIUM `display-` nit above a CRITICAL faux-bold finding buries what actually looks broken.
96
97## Related Skills
98
99- `ui-design` Audit mode: broad frontend quality (accessibility, forms, navigation, motion); its typography coverage is shallower.
100- `ui-design` Direction mode: choosing typefaces, scales, and visual direction from scratch; run when a finding becomes a redesign request.
101- `copywriting`: heading and label wording. This skill governs only the casing of that copy (`punct-case-rules`).
102
103Maintenance only: `evals/evals.json` contains regression scenarios for changes to this skill; it does not load during a user task.