vois-tokens — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vois-tokens (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You are building UI for a design system that uses shadcn/ui, Tailwind v4, and Motion. This skill defines the rules, constraints, and patterns you must follow. Deviation from these rules produces inconsistent, unmaintainable UI.
This SKILL.md is the entry point. Detailed rules for each topic live in references/ — read only the file(s) relevant to what you're building, not all of them every time.
Automated checks: a deterministic detector (scripts/detect.mjs) covers the mechanically-verifiable subset of the Pre-Submit Checklist below and can run as a per-edit hook in Claude Code, Cursor, or Codex. See references/hooks.md for setup and which rules are covered.
vois_record_rule_usage with the rule IDs you applied. This feeds the self-improving design system. If you violated a rule or found a rule unclear, include it with violated: true or ambiguous: true.Read the file(s) that match what you're building. Each file is self-contained — you don't need to read the others to use one.
| File | Read this when you're working on... | Rule prefix |
|---|---|---|
references/spacing.md | Any padding, margin, or gap value | [DS-SPACING] |
references/typography.md | Headings, body text, type scale, fonts, copy punctuation | [DS-TYPOGRAPHY] |
references/color.md | Color tokens, OKLCH, dark mode, light-dark() | [DS-COLOR] |
references/components.md | Component variants, cva, modals/dialogs, accordions | [DS-COMPONENT] [DS-MODAL] |
references/surfaces.md | Border radius, optical alignment, shadows vs. borders, image outlines, enter/exit choreography, icon transitions | [DS-SURFACE] |
references/layout-and-responsive.md | Viewport height units, content-visibility, breakpoints | [DS-LAYOUT] [DS-RESPONSIVE] |
references/tailwind-v4.md | Tailwind v3→v4 migration, container queries, arbitrary values | [DS-TAILWIND] |
references/animation.md | Timing, easing, reduced motion, Motion library usage | [DS-ANIMATION] |
references/accessibility.md | Touch targets, focus states, contrast, semantic HTML | [DS-A11Y] |
references/css-architecture.md | @theme setup, selector specificity, media queries | [DS-CSS] |
references/hooks.md | Setting up the automated per-edit checker, managing ignores | [DS-HOOKS] |
Scoped loading: if you only need one or two rules (e.g. vois-router sent you here for a single component decision), read only the matching reference file plus this SKILL.md. You don't need the full set for a scoped task.
Run this regardless of which reference files you read — it's the universal gate before calling anything done.
Spacing
[DS-SPACING-001][DS-SPACING-003][DS-SPACING-004]Typography
[DS-TYPOGRAPHY-001][DS-TYPOGRAPHY-002]tabular-nums [DS-TYPOGRAPHY-003]text-wrap: balance [DS-TYPOGRAPHY-006]text-wrap: pretty [DS-TYPOGRAPHY-007]max-width: 65ch [DS-TYPOGRAPHY-008]… not ... [DS-TYPOGRAPHY-009][DS-TYPOGRAPHY-010]Color
[DS-COLOR-001][DS-COLOR-002][DS-COLOR-007][DS-COLOR-003]aria-hidden="true" [DS-COLOR-005]Components
[DS-COMPONENT-001][DS-COMPONENT-006][DS-COMPONENT-002]inert on background content [DS-MODAL-001]overscroll-behavior: contain [DS-MODAL-002]scrollbar-gutter: stable on html [DS-MODAL-003]Surfaces
outer = inner + padding) [DS-SURFACE-001][DS-SURFACE-003][DS-SURFACE-007][DS-SURFACE-010][DS-SURFACE-011][DS-SURFACE-013][DS-SURFACE-014]Animation
[DS-ANIMATION-001] [DS-ANIMATION-002][DS-ANIMATION-003]transform-origin set to trigger point, not center [DS-ANIMATION-006]scale(0) [DS-ANIMATION-005]prefers-reduced-motion handled [DS-ANIMATION-004]transition: all [DS-TAILWIND-005][DS-ANIMATION-007]will-change only set when stutter is actually observed, only on transform/opacity/filter [DS-ANIMATION-009]Accessibility
:focus-visible styles [DS-A11Y-002]outline: none without a replacement [DS-A11Y-003][DS-A11Y-001][DS-A11Y-004]div or span as interactive elements without ARIA [DS-A11Y-005]alt [DS-A11Y-010]<fieldset> and <legend> used for radio/checkbox groups [DS-A11Y-016]<br> not used for spacing [DS-A11Y-012]<ul>/<ol> used for lists, not stacked divs [DS-A11Y-011]loading="lazy" on below-the-fold images [DS-A11Y-013]Layout
svh/lvh/dvh not vh for viewport-height layouts [DS-LAYOUT-001]content-visibility: auto on off-screen sections [DS-LAYOUT-002][DS-RESPONSIVE-002]padding-bottom/margin-top used to space siblings — use gap on parent [DS-LAYOUT-COMP-001][DS-LAYOUT-COMP-002]min-width: 0 on flex children containing text or overflow-prone content [DS-LAYOUT-COMP-003]object-fit [DS-LAYOUT-COMP-006]aspect-ratio used instead of padding-top percentage hack [DS-LAYOUT-COMP-005]CSS
#id selectors used for styling [DS-CSS-002][DS-CSS-003]@media queries use em not px [DS-CSS-007]| Situation | What to do | Full detail |
|---|---|---|
| Need a component | Check manifest first | references/components.md |
| Nesting rounded elements | outerRadius = innerRadius + padding | references/surfaces.md |
| Icon or button looks off-center | Align optically, not geometrically | references/surfaces.md |
| Card/container needs depth | Layered box-shadow, not a border | references/surfaces.md |
| Image needs a subtle edge | 1px outline, pure black/white at 0.1 opacity | references/surfaces.md |
| Page or section entering | Split into chunks, stagger ~100ms | references/surfaces.md |
| Icon swapping state (play/pause, like) | scale 0.25→1 + opacity + blur, exact values | references/surfaces.md |
| Need a color value | Check token list first | references/color.md |
| Need a spacing value | Round to nearest 4 or 8 | references/spacing.md |
| Need a font size | Use the type scale | references/typography.md |
| Need full-screen height | svh not vh | references/layout-and-responsive.md |
| Text container width | max-width: 65ch | references/typography.md |
| Two colors switching with theme | light-dark() | references/color.md |
| Animating accordion height | interpolate-size: allow-keywords | references/components.md |
| Building a modal | inert + overscroll-behavior + scrollbar-gutter | references/components.md |
| Value doesn't exist in tokens | Flag it, don't invent it | — |
| Animation feels off | Check transform-origin and slow it down | references/animation.md |
| Hover on mobile | Guard with @media (hover: hover) and (pointer: fine) | references/animation.md |
| Unsure about contrast | Measure it. 4.5:1 minimum for normal text | references/accessibility.md |
| Space between two adjacent elements | gap on the parent, not padding-bottom on the first child | references/layout-and-responsive.md |
| Flex child text overflowing or not truncating | Add min-width: 0 to the flex child | references/layout-and-responsive.md |
| Fixed-size image looks stretched | Add object-fit: cover or object-fit: contain | references/layout-and-responsive.md |
| 16:9 or other ratio container | aspect-ratio: 16 / 9, not padding-top hack | references/layout-and-responsive.md |
| Group of radio or checkbox inputs | Wrap in <fieldset> with <legend> | references/accessibility.md |
| Date or time in content | <time datetime="..."> | references/accessibility.md |
| Hand-authoring a media query | Use em not px for the breakpoint value | references/css-architecture.md |
| Selector getting hard to override | You've gone too deep — add a class instead | references/css-architecture.md |
| Done with UI work | Call vois_record_rule_usage with rule IDs applied | — |
This section applies only when the task is reviewing, auditing, or polishing existing code against this design system — not when building something new from scratch. If you're asked to "review this component," "make this feel better," or "audit this screen for design system alignment," follow this output format.
Present every change as a markdown table with Before and After columns, grouped under a heading per rule or category. Don't list findings as loose "Before:" / "After:" prose lines outside a table — they're harder to scan and easy to skim past.
#### Concentric border radius `[DS-SURFACE-001]`
| Before | After |
| --- | --- |
| `rounded-xl` on card + `rounded-xl` on inner button (`p-2`) | `rounded-2xl` on card (`12 + 8`), `rounded-lg` on inner button |
#### Tabular numbers `[DS-TYPOGRAPHY-003]`
| Before | After |
| --- | --- |
| `<span>{count}</span>` on animated counter | `<span className="tabular-nums">{count}</span>` |
#### Scale on press `[DS-ANIMATION-008]`
| Before | After |
| --- | --- |
| `scale(0.9)` on button press | Raised to `scale(0.96)` — below `0.95` reads as exaggerated |Run this for any review/audit task, regardless of which reference files the underlying build touched:
inert, overscroll-behavior: contain, scrollbar-gutter: stabletransition: all; will-change only where stutter was actually observedtext-wrap: balance; body copy uses text-wrap: prettytabular-numsThis checklist is deliberately a cross-section of the full pre-submit checklist above — it's what's most likely to be wrong in code that predates this design system, not an exhaustive re-walk of every rule. For a from-scratch build, use the full pre-submit checklist instead.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.