vois-patterns — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vois-patterns (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 the structure of pages and containers for a design system. This skill defines the architectural decisions that come before implementation (tokens, components, styling).
Read this skill first. After you determine structure here, read vois-tokens for implementation details (spacing, typography, components, tokens).
This skill routes to righter skill for all microcopy (button labels, error messages, field descriptions, helper text). Don't guess at words—follow the righter skill.
Tool: vois_record_pattern_choice
Arguments:
skillVersion: <this skill's version, from SKILL.md frontmatter>
pathId: <one of the path IDs listed in the decision tree below, e.g. "PATH-A" or "PATH-C-MEDIUM">
userGoal: <plain-English description of the user goal this path addresses>
thresholdInputs: <key decision inputs used to walk the tree, e.g. { "sectionCount": 3, "reversible": false }>
microcopyUsed: <optional array of contextKeys for any righter microcopy consulted while applying this pattern>There is no confidence argument on the real tool — decide fit using the thresholds in the decision tree itself. If no path fits well and a vois_report_pattern_gap tool is available, call it instead of forcing a match:
Tool: vois_report_pattern_gap
Arguments:
skillVersion: <this skill's version, from SKILL.md frontmatter>
userGoal: <plain-English description of the goal that didn't fit>
attemptedFallback: <closest path ID used as a fallback, even though it doesn't fit>
reasoning: <why the available decision tree didn't fit this goal>If neither tool is available, just proceed with your best-fit path and note the low confidence in your own output.
righter skill. See references/microcopy-routing.md for the full list of what counts as copy.vois-tokens for implementation (tokens, spacing, components).START: What is the user trying to accomplish?
├─ PATH A: Manage settings or account preferences
│ └─ → read references/settings-pages.md, then references/settings-interactions.md
│ ├─ IF: 2–3 sections only → [PATH-A-DEPTH-SHALLOW]
│ └─ IF: 4+ sections → [PATH-A-DEPTH-DEEP]
│
├─ PATH B: View, filter, and act on a list of items
│ └─ → read references/table-list.md, then references/table-interactions.md [PATH-B]
│
├─ PATH C: Create a new item OR edit an existing item
│ └─ → read references/forms.md, then references/form-field-groups.md
│ ├─ IF: 1–6 fields → [PATH-C-SIMPLE]
│ ├─ IF: 7–15 fields → [PATH-C-MEDIUM]
│ └─ IF: 15+ fields / complex → [PATH-C-COMPLEX]
│
├─ PATH D: Quick input, confirmation, or selection
│ └─ → read references/dialogs-and-action-sheets.md [PATH-D]
│
├─ PATH E: View details of a single item (read-only or view state)
│ └─ → read references/detail-pages.md [PATH-E]
│
├─ PATH F: Show what it costs and help someone choose a plan
│ └─ → read references/pricing-pages.md
│ ├─ IF: flat, one plan → [PATH-F-FLAT-1]
│ ├─ IF: seat-based, 1 / 2-3 / 4 plans → [PATH-F-SEAT-1] / [PATH-F-SEAT-3] / [PATH-F-SEAT-4]
│ ├─ IF: usage-based, 1 plan / tiered / PAYG → [PATH-F-USAGE-1] / [PATH-F-USAGE-TIERED] / [PATH-F-USAGE-PAYG]
│ ├─ IF: seat fee + included usage → [PATH-F-HYBRID]
│ └─ IF: consumer subscription → [PATH-F-CONSUMER-WEB] / [PATH-F-CONSUMER-PAYWALL]
│
└─ PATH G: Show what a product or business offers to people not yet using it (landing page, homepage)
└─ → read references/marketing-pages.md [PATH-G]Read the reference file for the path you picked. Paths A and C each have a companion file. Read the companion when the work involves it.
If the brief doesn't name a container type directly (it names a product-specific feature instead — "approval queue," "impersonate a user," "bulk edit"), read references/composition.md before assuming it needs new structure. Most of those translate to a direct fit or a combination of two existing paths.
Structured lookup: data/patterns-rules.json holds every tagged [PATH-X]/[PATH-X-Y] node from the tree above as { id, condition, outcome, source_file } (nodes may also carry optional pattern_name, builds_on, basis, basis_note, and evidence) — useful for a quick condition/outcome check by pathId without reading a whole file. It doesn't replace the reference files: worked examples, righter-routing call-outs, and untagged conditional branches (e.g. table-list.md's table-or-list choice) only exist in the .md files.
Source of truth: data/patterns-rules.json is canonical for a path's condition/outcome. references/*.md may restate a path for readability and carries the worked examples JSON doesn't — but if the two ever disagree, the JSON wins. scripts/check-rule-sync.mjs (repo root) checks in CI that every [PATH-*] tag cited in references/*.md resolves to a real entry in patterns-rules.json and vice versa.
| File | Covers | Path ID(s) |
|---|---|---|
references/settings-pages.md | Profile, workspace, billing, notifications, members sections; view/edit state | [PATH-A] |
references/settings-interactions.md | Save model, notifications, members, integrations, removal, danger zone, email change with one-time code | rules for settings interactions (see data/patterns-rules.json) |
references/table-list.md | Table or list, simple vs complex, row open (drawer, full page, dialog), where editing happens, pagination, narrow layout | [PATH-B] [PATH-B-SIMPLE] [PATH-B-COMPLEX] [PATH-B-ROW-OPEN] [PATH-B-EDIT] [PATH-B-ROW-ACTIONS] [PATH-B-ROW-ACTIONS-REVEAL] [PATH-B-NARROW] |
references/table-interactions.md | Selection and bulk actions, sort, filters, columns, density, saved views, URL state, keyboard, inline edit and save model, loading, empty and error states, partial failures | PATH-TABLE-* rules (see data/patterns-rules.json) |
references/forms.md | Create/edit forms by complexity tier, validation, save behavior | [PATH-C] |
references/form-field-groups.md | Field widths, columns, spacing, name, address, phone, email, one-time code, auto-growing textareas, AI chat input | rules for form field groups (see data/patterns-rules.json) |
references/dialogs-and-action-sheets.md | Modal vs action sheet by breakpoint, confirmation/selection dialogs | [PATH-D] [PATH-D-SIZE] |
references/detail-pages.md | Read-only single-record views | [PATH-E] |
references/pricing-pages.md | Pricing pages by billing model (flat, seat, usage, hybrid, consumer) and tier count (1 to 4), calculators, comparison tables, trial timelines | [PATH-F] [PATH-PRICE-U1] to [PATH-PRICE-C11] |
references/marketing-pages.md | Landing pages and homepages: one idea per section, three blocks max, detail behind a link, image tiles, no dividers, one primary button. Taste rules for marketing surfaces only | [PATH-G] [PATH-G-*] |
references/permissions-and-conditional-logic.md | Hide vs disable by role, personal data (mask, reveal, keep out of URLs), parent/child input dependencies, accordions | [PATH-PERM-*] [PATH-COND-*] (cross-cutting) |
references/composition.md | A brief doesn't name a container type directly, or seems to need more than one at once | [PATH-COMPOSITION-*] (cross-cutting) |
references/motion.md | A state change should move: status button, collapse to indicator, label morph, shared element, icon morph, number ticker, typed input, directional, tray, grow-from-trigger, reorder and regroup, chart range change, small state changes. Decision test, morph types, worked examples, frequency and delight tiers, accessibility, anti-patterns, remove-the-motion review. Timing values are in vois-tokens/references/animation.md | — (cross-cutting; rules in vois-tokens [DS-MOTION-*] and [DS-ANIMATION-*]) |
references/content-density.md | Deciding how much breathing room a screen should have — admin grid vs. everyday form vs. onboarding/confirmation moment | [PATH-DENSITY-*] (cross-cutting) |
references/microcopy-routing.md | Full list of what counts as UI copy and must route to righter | — (cross-cutting) |
These are implemented via vois-tokens; listed here for context.
For exact class/style syntax (Tailwind or StyleX) and token values, see vois-tokens.
references/composition.md for a fit or combination before designing new structurereferences/content-density.md, not defaulted to whatever the mid-range spacing tokens producevois_record_pattern_choice called with skillVersion, pathId, userGoal, and thresholdInputs, if that tool is availablereferences/permissions-and-conditional-logic.md)This skill ↔ vois-tokens:
This skill ↔ vois-components:
vois_record_component_choice tool is available, call it after selecting; if not, this step is optional telemetryThis skill ↔ vois-dataviz:
This skill ↔ conversion-patterns:
This skill ↔ righter skill:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.