40 glyphs · five categories · one stroke · zero emoji
the icon system replaces the inherited·›▾unicode placeholder culture with a hand-curated brand-correct baseline. every glyph is 24×24, 1.5 px stroke, currentColor. geometry lives in one JSON; <Icon name="…"/>is the only legitimate render path. inline SVG and unicode placeholders fail ci:primitive-coverage after the post-ADR-019 migration commit.
catalog · live
search · filter by category · dial size and tone · click any glyph to copy its TSX import line · right-click to copy the raw 24×24 SVG. the catalog is one source — adding a glyph to packages/icons/icons.json lights it up here on the next build.
02 navigation · 8 glyphs
rail · top-bar · breadcrumbs · external links
homesearchsettingsmenuclosechevron-leftchevron-rightexternal-link03 status · 8 glyphs
covenant gates · receipts · refusal posture
checkcrossinfowarndotcircleasteriskalert04 action · 8 glyphs
operator-initiated changes · journal entries
copysharedownloaduploadeditdeleterefreshundo05 finance · 8 glyphs
long/short · candles · oracles · vaults · tiers
longshortcandledepthoraclevaulttierladder06 agentic · 8 glyphs
agents · plans · tools · journals · MCP servers
agentplantooljournalmcpcommandslashhash07 sizes · discrete only
the size prop is a typed union (14 · 16 · 18 · 20 · 24 · 28 · 32). arbitrary px values are a compile-time error. the brand stays on its grid by construction.
1620243208 tones · brand role tokens
tones map to brand role tokens so per-skin overrides cascade automatically. default inherits currentColor; the rest paint via skin variables.
defaultbrand-signalamberwarnsuccesserrorinfo09 worked example · operator action row
10 the contract
| rule | requirement |
|---|---|
| name | kebab-case lowercase · matches /^[a-z][a-z0-9-]*$/ |
| category | exactly one of navigation · status · action · finance · agentic |
| viewBox | fixed at 0 0 24 24 · the consumer chooses size |
| geometry | paths: string[] · SVG path-data only · no <rect> / <circle> |
| color | reach all colour through currentColor · no inline literals |
| uniqueness | name is unique case-insensitive across all categories |
| no emoji | no font characters or emoji code points inside paths |
| CI gate | scripts/check-icons.mjs · runs in ci:all ahead of ci:org |