Alignment
Alignment
The PRIZM Checker measures how closely a product follows PRIZM and gives it one alignment score. The score is made of five axes, each measured on its own, so a result also tells you what to fix.
It reads the code
Colours have to come from tokens, not just happen to match. That only shows in source, so the checker reads code rather than screenshots.
Five weighted axes
Tokens, adoption, fidelity, composition, and accessibility. Each axis is scored against the number of chances the code had to get it wrong.
Same input, same score
The scan is a fixed set of rules with fixed weights. Run it twice on the same code and you get the same number and the same findings.
Check your code
Paste a component or scan a GitHub repo for an instant read, right in your browser.
The full five-axis audit — the PRIZM Checker skill
The authoritative, whole-repo audit, run by Claude: tokens, adoption, fidelity, composition, and accessibility (A1–A5) scored deterministically and pinned to a PRIZM version, with per-file findings and a ranked fix list. Contrast is held to PRIZM’s own AA policy on any colour pair resolvable from source. (Contrast on layout-inherited backgrounds still needs a rendered pass; deeper composition still benefits from a reviewer.) Install once; it stays up to date.
Claude Code desktop app (no terminal)
- Open the Code tab and open a project folder.
- Click + next to the prompt → Plugins.
- Add marketplace
prizm-design/prizm, then in Discover find prizm-checker and click Install. - Keep it up to date automatically — add this to the repo’s
.claude/settings.jsonso it installs and updates on open, with no plugin commands (works in cloud sessions too):{ "extraKnownMarketplaces": { "prizm": { "source": { "source": "github", "repo": "prizm-design/prizm" } } }, "enabledPlugins": { "prizm-checker@prizm": true } }
Terminal or IDE
First time — add the marketplace, then install prizm-checker from the plugin manager it opens:
/plugin marketplace add prizm-design/prizmTo update later — paste this:
/plugin update prizm-checker@prizmOffline / air-gapped — download the folder
.claude/skills/ (or ~/.claude/skills/), so you have .claude/skills/audit/SKILL.md. Re-download to update.However you installed it, run it by asking Claude in your product repo (it also triggers automatically when you ask to check alignment):
claude "run the prizm-checker against this repo"What the score is built from
A single percentage is only worth showing if it is built from parts you can measure and fix on their own. The overall score is the weighted mean of the axes that could be measured, renormalised. Axes that could not be measured are marked n/a rather than counted as perfect.
| Axis | Weight | Question it answers | Example violation |
|---|---|---|---|
| A1 Tokens | 30% | Do colours, radii, shadows and type come from PRIZM tokens? | bg-slate-800 instead of bg-surface; a hardcoded #00d3f2; rounded-[5px]. |
| A2 Adoption | 25% | Is a PRIZM component used wherever one exists? | A hand-rolled <div role="button">; a bespoke modal when Dialog ships. |
| A3 Fidelity | 20% | Do copied components still match upstream PRIZM? | A pasted Button whose cva variants have drifted from the pinned SHA. |
| A4 Composition | 15% | Are components composed the way PRIZM intends? | Enterprise tokens inside a C3 surface; data-zone unset. |
| A5 Accessibility | 10% | Does it meet the accessibility floor (WCAG AA)? | An <img> or JavaFX ImageView with no text alternative; an icon-only control with no label; blocked zoom; a colour pair below AA contrast. |
Access tiers
How much can be assessed depends on how much access the checker has. The browser tool above has your source but is a quick, partial read. The authoritative Tier 1 audit comes from running the skill against the repo — deterministic and pinned to a PRIZM version. It covers all five axes (A1–A5) from source — contrast included, held to PRIZM’s AA policy on resolvable colour pairs; only layout-inherited contrast still needs a rendered pass, and holistic composition still benefits from a reviewer. A rendered-only (Tier 2) or screenshot-only (Tier 3) audit sees even less, and should never be read as a Tier 1 one.
| Tier | Input | Axes | Claimed confidence |
|---|---|---|---|
| T1 Full | Repo (optionally a running build) | A1–A5 (contrast needs a rendered pass) | Authoritative — the score can be tracked over time and pinned to a PRIZM SHA. |
| T2 Rendered | Running app / deployed URL, no source | A1 (palette only), A2 (fuzzy), A4, A5 | Surface audit — token provenance unverified; theme-switch risk not assessed. |
| T3 Visual | Screenshots only (air-gapped C3) | A1 (palette), A4 (partial) | Indicative only — scored with a wide band, or not scored. |
Grade bands
The score also maps to a band, so a result reads as a plain verdict instead of a number people over-read by a point or two.
Finding codes
Every finding carries a rule ID like PZ-T01, shaped PZ-<axis><number>. The letter marks the axis — T tokens (A1), C components / adoption (A2), D drift / fidelity (A3), P composition (A4), A accessibility (A5) — and the number is the specific rule. The skill uses the same IDs, so a code means the same thing everywhere.
| Code | Axis | What it flags |
|---|---|---|
| PZ-T01 | A1 · Tokens | Raw Tailwind colour class (e.g. bg-slate-800) instead of a token |
| PZ-T02 | A1 · Tokens | Hardcoded colour literal — #hex, rgb(), or oklch() |
| PZ-T03 | A1 · Tokens | Arbitrary colour value, e.g. bg-[#00d3f2] |
| PZ-T04 | A1 · Tokens | Invented token that isn't in PRIZM's vocabulary |
| PZ-T05 | A1 · Tokens | Off-token corner radius, e.g. rounded-[5px] |
| PZ-C01 | A2 · Adoption | role="button" on a non-button — use Button |
| PZ-C02–C10 | A2 · Adoption | A hand-rolled element where a PRIZM component exists (table, select, dialog, checkbox, radio, slider, progress, accordion, button) |
| PZ-C20 | A2 · Adoption | A native JavaFX control with a Prizm* equivalent |
| PZ-D01 | A3 · Fidelity | A copied PRIZM component that has drifted from the current version |
| PZ-P01 | A4 · Composition | Liquid-glass (a C3-only treatment) used in product code |
| PZ-P06 | A4 · Composition | Conflicting product zones declared in one file |
| PZ-P10 | A4 · Composition | An extension pack used without its activation marker |
| PZ-A01 | A5 · Accessibility | Image with no alt text |
| PZ-A02 | A5 · Accessibility | Viewport blocks zoom |
| PZ-A03 | A5 · Accessibility | A colour pair below WCAG AA contrast (4.5:1), using PRIZM's own contrast policy |
| PZ-A10 | A5 · Accessibility | JavaFX ImageView with no accessible text |
| PZ-A11 | A5 · Accessibility | Icon-only control with no accessible name |
The A4 (PZ-P*) codes are scored by the skill; the browser tool doesn’t check A4. An axis shown as n/a means the input had nothing to measure for it; it never counts for or against the score.
Accessibility & WCAG. A5 checks the source-visible parts of the WCAG 2.1 AA floor. Contrast (PZ-A03) uses PRIZM’s own policy — the one its tokens are CI-verified against: 4.5:1 for text, 3:1 for non-text. A clean source A5 result is not a full AA pass, though: contrast on layout-inherited backgrounds, keyboard, focus order, ARIA, and heading structure only exist once the page renders.
For real WCAG, add a rendered pass. The skill accepts an axe-core report (--rendered-a11y report.json) and folds it into A5 as real WCAG findings, each tagged with its success criterion. It stays air-gapped: run axe on your app in the browser you already have (the offline axe DevTools extension, @axe-core/cli, or a vendored axe snippet), export the JSON, and pass it in. Even then, automated tools catch only part of WCAG — reading order, meaningful alt text, and keyboard flow still need a human.