PRIZM 4.0DSTA

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.

This is a quick, partial check. In the browser it scores A1 tokens, A2 adoption, source-only A5 accessibility, and a best-effort A3 fidelity when you scan a repo — but not A4 composition. For the authoritative, whole-repo audit of all five axes (A1–A5), deterministic and pinned to a PRIZM version, install the PRIZM Checker skill below. (Contrast is checked on colour pairs visible in source, held to PRIZM’s AA policy; contrast on layout-inherited backgrounds still needs a rendered pass.)
Component source — TSX / JSX / HTML / CSS / JavaFX
Runs in your browser. Nothing is uploaded.

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)

  1. Open the Code tab and open a project folder.
  2. Click + next to the prompt → Plugins.
  3. Add marketplace prizm-design/prizm, then in Discover find prizm-checker and click Install.
  4. Keep it up to date automatically — add this to the repo’s .claude/settings.json so 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/prizm

To update later — paste this:

/plugin update prizm-checker@prizm

Offline / air-gapped — download the folder

Download skill (v0.6.0)Unzip into .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.

AxisWeightQuestion it answersExample violation
A1 Tokens30%Do colours, radii, shadows and type come from PRIZM tokens?bg-slate-800 instead of bg-surface; a hardcoded #00d3f2; rounded-[5px].
A2 Adoption25%Is a PRIZM component used wherever one exists?A hand-rolled <div role="button">; a bespoke modal when Dialog ships.
A3 Fidelity20%Do copied components still match upstream PRIZM?A pasted Button whose cva variants have drifted from the pinned SHA.
A4 Composition15%Are components composed the way PRIZM intends?Enterprise tokens inside a C3 surface; data-zone unset.
A5 Accessibility10%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.

TierInputAxesClaimed confidence
T1 FullRepo (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 RenderedRunning app / deployed URL, no sourceA1 (palette only), A2 (fuzzy), A4, A5Surface audit — token provenance unverified; theme-switch risk not assessed.
T3 VisualScreenshots 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.

≥ 90
Aligned
75–89
Mostly aligned
50–74
Partial
< 50
Off-system

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.

CodeAxisWhat it flags
PZ-T01A1 · TokensRaw Tailwind colour class (e.g. bg-slate-800) instead of a token
PZ-T02A1 · TokensHardcoded colour literal — #hex, rgb(), or oklch()
PZ-T03A1 · TokensArbitrary colour value, e.g. bg-[#00d3f2]
PZ-T04A1 · TokensInvented token that isn't in PRIZM's vocabulary
PZ-T05A1 · TokensOff-token corner radius, e.g. rounded-[5px]
PZ-C01A2 · Adoptionrole="button" on a non-button — use Button
PZ-C02–C10A2 · AdoptionA hand-rolled element where a PRIZM component exists (table, select, dialog, checkbox, radio, slider, progress, accordion, button)
PZ-C20A2 · AdoptionA native JavaFX control with a Prizm* equivalent
PZ-D01A3 · FidelityA copied PRIZM component that has drifted from the current version
PZ-P01A4 · CompositionLiquid-glass (a C3-only treatment) used in product code
PZ-P06A4 · CompositionConflicting product zones declared in one file
PZ-P10A4 · CompositionAn extension pack used without its activation marker
PZ-A01A5 · AccessibilityImage with no alt text
PZ-A02A5 · AccessibilityViewport blocks zoom
PZ-A03A5 · AccessibilityA colour pair below WCAG AA contrast (4.5:1), using PRIZM's own contrast policy
PZ-A10A5 · AccessibilityJavaFX ImageView with no accessible text
PZ-A11A5 · AccessibilityIcon-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.