Type — typography router
Routes typographic work to the smallest sufficient set of focused skills. Do not
answer typography questions from memory when a skill below covers them: the skills
carry the decision procedures, the ranges, and the source conflicts that "looks
right" misses.
Core principle
Books teach judgment. Current standards teach implementation.
Never emit a bare universal constant. Encode the decision and its inputs.
❌ "Body text should always be 16px."
✅ Determine body-text size from the typeface's apparent size, x-height, target
device, reading distance, content density, user needs, and available line length.
Treat 16px as a common browser-oriented starting point, not a universal optimum.
Validate readability, zoom behavior, line length, and hierarchy in the rendered
context.
1. When to invoke
- The user types
/type (or $type).
- Any task that sets, chooses, scales, spaces, loads, tokenizes, audits, or
critiques type.
- A screen "looks off", "feels cheap", or "looks AI-generated" and the cause may be
typographic.
- You are about to answer a typography question from memory.
Do not invoke for non-typographic layout — that belongs to the general design
skills. Two topics are split rather than excluded: type that moves is
motion-typography (general interface motion is not this pack's), and type that
carries colour or is made of glyphs is color-and-icon-fonts (general colour systems
and iconography are not). If the request is
really about information architecture or copy content rather than its setting, say
so and route elsewhere.
2. Required context
Before routing, establish:
- What is actually changing — a value, a system, a file, or a judgment.
- Medium and platform — web, native, print, or cross-platform.
- Whether an artifact exists to inspect, or this is greenfield.
- Whether accessibility or i18n is in scope (they usually are, whether stated or
not).
If the request is one line and ambiguous, route on the most likely reading and
state the assumption — don't stall.
3. Invariant principles
- Load 2–4 skills maximum per pass. More is context waste and dilutes attention.
- Route by what changes, not by vocabulary used. Someone saying "kerning" often
means tracking, and someone saying "font" usually means typeface.
- Always resolve conflicts with the hierarchy below, and say which rule won.
- Never claim typography is accessible after a contrast check alone — 1.4.3,
1.4.4, and 1.4.12 fail independently.
- State what was not verified in a rendered context.
4. Context-dependent heuristics — conflict resolution and routing
Conflict hierarchy — read before deciding anything
Full list in references/source-hierarchy.md. Highest first:
- Accessibility standards and browser behavior
- User and product context
- Thinking with Type → 4. Web Typography → 5. Flexible Typesetting →
- Detail in Typography → 7. Typographic Systems
- The supporting books
- Style trends and subjective convention
This exists so the agent never applies a print-era rule to a responsive
application, and never lets a trend override an accessibility floor.
Routing table
| Signal in the request |
Load |
| "what is leading / em / baseline", vocabulary, first principles |
type-foundations |
| naming letterform parts, reading a specimen, apertures/terminals/counters |
typeface-anatomy |
| "which font should I use", evaluating or replacing a typeface |
typeface-selection |
| combining two or more typefaces |
typeface-pairing |
| type scale, heading levels, size ramp, "hierarchy is unclear" |
hierarchy-and-scale |
| body copy, long-form reading, measure, line-height, paragraphs |
body-text-and-reading |
| fluid type, clamp(), breakpoints, "text breaks on mobile" |
responsive-typography |
| buttons, labels, inputs, tables, nav, dense product UI |
ui-component-typography |
| articles, marketing pages, art-directed layouts, drop caps, pull quotes |
editorial-web-typography |
| composition, grid, spatial arrangement, "layout feels arbitrary" |
typography-layout-systems |
| kerning, tracking, word spacing, hyphenation, punctuation, orphans/widows |
microtypography |
variable fonts, weight/width/optical-size axes, font-variation-settings |
variable-fonts |
| animated or kinetic type, text transitions, scroll effects, streaming text |
motion-typography |
colour fonts, layer fonts, font-palette, icon fonts vs SVG, emoji |
color-and-icon-fonts |
webfont performance, FOUT/FOIT, CLS, subsetting, font-display |
font-loading-and-performance |
| contrast, zoom, Dynamic Type, dyslexia, screen readers, WCAG |
typography-accessibility |
| Arabic, Hebrew, CJK, Indic, bidi, vertical text, localization |
international-typography |
| exporting type as design tokens, Style Dictionary, theme config |
design-token-generation |
| "check this", systematic review against criteria, pass/fail |
typography-audit |
| "is this good", taste, expressive judgment, art direction |
typography-critique |
Reference tables (load directly, no skill needed)
| Question |
File |
| "which OpenType tag / CSS property does X?" |
references/opentype-features.md |
| "is there a principle covering X?" |
references/universal-principles-index.md (all 100, routed) |
| "the books disagree — which wins?" |
references/source-hierarchy.md |
| "what do the books actually disagree about?" |
references/corpus-conflicts.md |
Always co-load
- Anything rendering body text → also
typography-accessibility.
- Anything shipping webfonts → also
font-loading-and-performance.
- Anything for a non-English or multi-script product → also
international-typography.
Shortcuts
- "Make this look better", no specifics →
typography-critique +
hierarchy-and-scale + microtypography.
- "Build a type system" →
hierarchy-and-scale + responsive-typography +
design-token-generation.
- "Why does this feel cheap / generic / AI-generated" →
typography-critique +
microtypography. The tell is almost always spacing detail, not font choice.
- "Audit our typography" →
typography-audit, which pulls others as needed.
5. Failure patterns
| Pattern |
Cause |
Fix |
| Answered from memory; emitted a constant |
Router skipped |
Load the skill; encode the procedure |
| Loaded all twenty-one skills |
Routing by topic, not by change |
2–4 max |
| Routed "kerning" to letterform spacing |
Took the word literally |
Usually tracking → microtypography |
| Font swap recommended for a spacing problem |
Skipped typography-critique §4 |
Diagnose before prescribing |
| Body text set with no accessibility check |
Co-load rule ignored |
Always add typography-accessibility |
| Emitted 2017 font-loading advice |
Corpus treated as current |
Rule 1 outranks the books |
| Gave taste feedback when criteria existed |
Critique/audit conflated |
Criteria → audit |
| Claimed "accessible" after contrast only |
Criteria treated as one |
Check 1.4.4 and 1.4.12 too |
6. Evaluation procedure
- Identify what the task actually changes.
- Pick 2–4 skills from the table. Apply co-load rules.
- Read them before answering — not after drafting.
- If two skills conflict, resolve with the hierarchy and name the winning rule.
- Before answering, check: did I emit any bare constant? Replace it with its
decision procedure.
- Check whether the claim needs a rendered artifact. If you didn't render it, say so.
- If the answer touches CSS, browser support, or font loading, verify against MDN —
the corpus is 2007–2024.
7. Output format
Routed to: <skill>, <skill> [+ <co-loaded skill> because <rule>]
Assumption: <if the request was ambiguous>
<the answer, in the loaded skill's own output format>
Conflicts resolved: <which rule won>
Unverified: <what was not checked in a rendered context>
8. Examples
"Our dashboard numbers look wobbly."
Routes to ui-component-typography (tabular figures own this) plus
typeface-anatomy (to confirm the face actually ships a tnum set). Two skills,
not five. The word "wobbly" is a rendering symptom, so the answer requires looking
at the rendered table — flag that if you can't.
"Set up typography for our new marketing site."
Greenfield and broad, so route in sequence rather than loading everything at once:
typeface-selection → hierarchy-and-scale → responsive-typography, co-loading
typography-accessibility (body text) and font-loading-and-performance
(webfonts). Answer each stage before moving on; don't try to produce a whole
system in one pass.
9. Counterexamples
- ❌ Answering "what line-height should I use?" directly. — That's
body-text-and-reading, and the answer depends on measure, size, and face.
- ❌ Loading all twenty-one skills for "pick a font."
- ❌ Routing "the text looks bad on mobile" to
typeface-selection. — Almost always
responsive-typography + body-text-and-reading.
- ❌ Treating
typography-audit and typography-critique as interchangeable. —
Criteria exist → audit. Taste → critique.
- ❌ Skipping
international-typography because "we're English-only for now." — If
the product will localise, the layout decisions are being made now.
- ❌ Quoting a book on
font-display behavior. — Rule 1 outranks rule 4.
10. Source citations
Corpus: Lupton Thinking with Type 3e (2024); Rutter Web Typography (2017);
Brown Flexible Typesetting (2018); Elam Typographic Systems (2007); Hochuli
Detail in Typography (2008); Coles The Anatomy of Type (2012); Lupton (ed.)
Type on Screen (2014); Latin Better Web Typography (2017); Santa Maria On Web
Typography (2014); Stocks Universal Principles of Typography (2024).
Living sources, which outrank the books on implementation:
MDN CSS Fonts ·
WCAG 2.2 ·
web.dev fonts ·
W3C Internationalization
See also references/source-hierarchy.md and references/corpus-conflicts.md.
1---2name: type3description: Use when the user invokes /type, or when any task involves setting, choosing, scaling, spacing, loading, tokenizing, auditing, or critiquing type — a font choice, a type scale, body copy, headings, a data table, a UI label, responsive text, webfont performance, or non-Latin script. Also use when a screen "looks off" and the cause may be typographic. Dispatcher that routes to the focused typography-* skills.4---56# Type — typography router78Routes typographic work to the smallest sufficient set of focused skills. Do not9answer typography questions from memory when a skill below covers them: the skills10carry the decision procedures, the ranges, and the source conflicts that "looks11right" misses.1213## Core principle1415**Books teach judgment. Current standards teach implementation.**1617Never emit a bare universal constant. Encode the decision and its inputs.1819> ❌ "Body text should always be 16px."20> ✅ Determine body-text size from the typeface's apparent size, x-height, target21> device, reading distance, content density, user needs, and available line length.22> Treat 16px as a common browser-oriented starting point, not a universal optimum.23> Validate readability, zoom behavior, line length, and hierarchy in the rendered24> context.2526## 1. When to invoke2728- The user types `/type` (or `$type`).29- Any task that sets, chooses, scales, spaces, loads, tokenizes, audits, or30 critiques type.31- A screen "looks off", "feels cheap", or "looks AI-generated" and the cause may be32 typographic.33- You are about to answer a typography question from memory.3435**Do not** invoke for non-typographic layout — that belongs to the general design36skills. Two topics are split rather than excluded: *type* that moves is37`motion-typography` (general interface motion is not this pack's), and *type* that38carries colour or is made of glyphs is `color-and-icon-fonts` (general colour systems39and iconography are not). If the request is40really about information architecture or copy *content* rather than its setting, say41so and route elsewhere.4243## 2. Required context4445Before routing, establish:4647- **What is actually changing** — a value, a system, a file, or a judgment.48- **Medium and platform** — web, native, print, or cross-platform.49- **Whether an artifact exists** to inspect, or this is greenfield.50- **Whether accessibility or i18n is in scope** (they usually are, whether stated or51 not).5253If the request is one line and ambiguous, route on the most likely reading and54state the assumption — don't stall.5556## 3. Invariant principles5758- **Load 2–4 skills maximum per pass.** More is context waste and dilutes attention.59- **Route by what changes, not by vocabulary used.** Someone saying "kerning" often60 means tracking, and someone saying "font" usually means typeface.61- **Always resolve conflicts with the hierarchy below**, and say which rule won.62- **Never claim typography is accessible after a contrast check alone** — 1.4.3,63 1.4.4, and 1.4.12 fail independently.64- **State what was not verified in a rendered context.**6566## 4. Context-dependent heuristics — conflict resolution and routing6768### Conflict hierarchy — read before deciding anything6970Full list in `references/source-hierarchy.md`. Highest first:71721. Accessibility standards and browser behavior732. User and product context743. *Thinking with Type* → 4. *Web Typography* → 5. *Flexible Typesetting* →75 6. *Detail in Typography* → 7. *Typographic Systems*768. The supporting books779. Style trends and subjective convention7879This exists so the agent never applies a print-era rule to a responsive80application, and never lets a trend override an accessibility floor.8182### Routing table8384| Signal in the request | Load |85|---|---|86| "what is leading / em / baseline", vocabulary, first principles | `type-foundations` |87| naming letterform parts, reading a specimen, apertures/terminals/counters | `typeface-anatomy` |88| "which font should I use", evaluating or replacing a typeface | `typeface-selection` |89| combining two or more typefaces | `typeface-pairing` |90| type scale, heading levels, size ramp, "hierarchy is unclear" | `hierarchy-and-scale` |91| body copy, long-form reading, measure, line-height, paragraphs | `body-text-and-reading` |92| fluid type, clamp(), breakpoints, "text breaks on mobile" | `responsive-typography` |93| buttons, labels, inputs, tables, nav, dense product UI | `ui-component-typography` |94| articles, marketing pages, art-directed layouts, drop caps, pull quotes | `editorial-web-typography` |95| composition, grid, spatial arrangement, "layout feels arbitrary" | `typography-layout-systems` |96| kerning, tracking, word spacing, hyphenation, punctuation, orphans/widows | `microtypography` |97| variable fonts, weight/width/optical-size axes, `font-variation-settings` | `variable-fonts` |98| animated or kinetic type, text transitions, scroll effects, streaming text | `motion-typography` |99| colour fonts, layer fonts, `font-palette`, icon fonts vs SVG, emoji | `color-and-icon-fonts` |100| webfont performance, FOUT/FOIT, CLS, subsetting, `font-display` | `font-loading-and-performance` |101| contrast, zoom, Dynamic Type, dyslexia, screen readers, WCAG | `typography-accessibility` |102| Arabic, Hebrew, CJK, Indic, bidi, vertical text, localization | `international-typography` |103| exporting type as design tokens, Style Dictionary, theme config | `design-token-generation` |104| "check this", systematic review against criteria, pass/fail | `typography-audit` |105| "is this good", taste, expressive judgment, art direction | `typography-critique` |106107### Reference tables (load directly, no skill needed)108109| Question | File |110|---|---|111| "which OpenType tag / CSS property does X?" | `references/opentype-features.md` |112| "is there a principle covering X?" | `references/universal-principles-index.md` (all 100, routed) |113| "the books disagree — which wins?" | `references/source-hierarchy.md` |114| "what do the books actually disagree about?" | `references/corpus-conflicts.md` |115116### Always co-load117118- Anything rendering **body text** → also `typography-accessibility`.119- Anything shipping **webfonts** → also `font-loading-and-performance`.120- Anything for a **non-English or multi-script** product → also121 `international-typography`.122123### Shortcuts124125- "Make this look better", no specifics → `typography-critique` +126 `hierarchy-and-scale` + `microtypography`.127- "Build a type system" → `hierarchy-and-scale` + `responsive-typography` +128 `design-token-generation`.129- "Why does this feel cheap / generic / AI-generated" → `typography-critique` +130 `microtypography`. The tell is almost always spacing detail, not font choice.131- "Audit our typography" → `typography-audit`, which pulls others as needed.132133## 5. Failure patterns134135| Pattern | Cause | Fix |136|---|---|---|137| Answered from memory; emitted a constant | Router skipped | Load the skill; encode the procedure |138| Loaded all twenty-one skills | Routing by topic, not by change | 2–4 max |139| Routed "kerning" to letterform spacing | Took the word literally | Usually tracking → `microtypography` |140| Font swap recommended for a spacing problem | Skipped `typography-critique` §4 | Diagnose before prescribing |141| Body text set with no accessibility check | Co-load rule ignored | Always add `typography-accessibility` |142| Emitted 2017 font-loading advice | Corpus treated as current | Rule 1 outranks the books |143| Gave taste feedback when criteria existed | Critique/audit conflated | Criteria → audit |144| Claimed "accessible" after contrast only | Criteria treated as one | Check 1.4.4 and 1.4.12 too |145146## 6. Evaluation procedure1471481. Identify what the task actually changes.1492. Pick 2–4 skills from the table. Apply co-load rules.1503. Read them before answering — not after drafting.1514. If two skills conflict, resolve with the hierarchy and name the winning rule.1525. Before answering, check: did I emit any bare constant? Replace it with its153 decision procedure.1546. Check whether the claim needs a rendered artifact. If you didn't render it, say so.1557. If the answer touches CSS, browser support, or font loading, verify against MDN —156 the corpus is 2007–2024.157158## 7. Output format159160```161Routed to: <skill>, <skill> [+ <co-loaded skill> because <rule>]162Assumption: <if the request was ambiguous>163<the answer, in the loaded skill's own output format>164Conflicts resolved: <which rule won>165Unverified: <what was not checked in a rendered context>166```167168## 8. Examples169170**"Our dashboard numbers look wobbly."**171172> Routes to `ui-component-typography` (tabular figures own this) plus173> `typeface-anatomy` (to confirm the face actually ships a `tnum` set). Two skills,174> not five. The word "wobbly" is a rendering symptom, so the answer requires looking175> at the rendered table — flag that if you can't.176177**"Set up typography for our new marketing site."**178179> Greenfield and broad, so route in sequence rather than loading everything at once:180> `typeface-selection` → `hierarchy-and-scale` → `responsive-typography`, co-loading181> `typography-accessibility` (body text) and `font-loading-and-performance`182> (webfonts). Answer each stage before moving on; don't try to produce a whole183> system in one pass.184185## 9. Counterexamples186187- ❌ Answering "what line-height should I use?" directly. — That's188 `body-text-and-reading`, and the answer depends on measure, size, and face.189- ❌ Loading all twenty-one skills for "pick a font."190- ❌ Routing "the text looks bad on mobile" to `typeface-selection`. — Almost always191 `responsive-typography` + `body-text-and-reading`.192- ❌ Treating `typography-audit` and `typography-critique` as interchangeable. —193 Criteria exist → audit. Taste → critique.194- ❌ Skipping `international-typography` because "we're English-only for now." — If195 the product will localise, the layout decisions are being made now.196- ❌ Quoting a book on `font-display` behavior. — Rule 1 outranks rule 4.197198## 10. Source citations199200Corpus: Lupton *Thinking with Type* 3e (2024); Rutter *Web Typography* (2017);201Brown *Flexible Typesetting* (2018); Elam *Typographic Systems* (2007); Hochuli202*Detail in Typography* (2008); Coles *The Anatomy of Type* (2012); Lupton (ed.)203*Type on Screen* (2014); Latin *Better Web Typography* (2017); Santa Maria *On Web204Typography* (2014); Stocks *Universal Principles of Typography* (2024).205206Living sources, which outrank the books on implementation:207[MDN CSS Fonts](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_fonts) ·208[WCAG 2.2](https://www.w3.org/TR/WCAG22/) ·209[web.dev fonts](https://web.dev/learn/performance/optimize-web-fonts) ·210[W3C Internationalization](https://www.w3.org/International/)211212See also `references/source-hierarchy.md` and `references/corpus-conflicts.md`.