1. Design Data Specification
Version: 1.0.0-draft
Status: Draft — normative text and schemas may change before 1.0.0.
This document is the top-level overview for the Design Data Specification: a machine-readable model for Spectrum design tokens, mode sets, platform manifests, and validation.
1.1. Scope
The specification defines:
-
Token format — structured token identity (
name), literalvalueor alias$ref, and lifecycle metadata (Token format). -
Taxonomy — concept categories, token term vocabulary, formatting style, and the distinction between component anatomy and token objects (Taxonomy).
-
Registry — named value collections that supply allowed vocabulary for token name fields and component metadata; three-registry boundary (anatomy-terms, token-objects, categories) and packaging strategy (Registry).
-
Component format — component declaration shape: API options, named content slots, anatomy parts, state model, and cross-reference validation rules (Component format).
-
Anatomy format — anatomy part declaration shape: field constraints, canonical anatomy vocabulary, and cross-reference rules for token
anatomyfield values (Anatomy format). -
State model — state declaration shape: trigger semantics, precedence and resolution algorithm, canonical state vocabulary, and cross-reference rules for token
statefield values (State model).
-
-
Cascade and resolution — layered data (foundation, platform, product), specificity, and how a context picks a winning value (Cascade).
-
Mode Sets — declared modes, defaults, and coverage expectations (Mode Sets).
-
Platform manifest — how a platform repo pins foundation data, filters tokens, and applies typed overrides (Manifest).
-
Semantic diff — change taxonomy, token identity rules, and property-level change tracking for comparing dataset versions (Diff).
-
Query notation — filter syntax for selecting tokens by structured fields (Query).
-
Accessibility — component accessibility vocabulary: semantic role, interaction and keyboard intents, focus behavior, WCAG criteria, and state-level AT fields (Accessibility).
-
Accessibility adapters — informative platform adapter contracts: Web/ARIA, iOS UIAccessibility, Android AccessibilityNodeInfo, and voice/multimodal (Accessibility adapters).
-
-
Document blocks — typed prose blocks attachable to tokens, components, and anatomy parts; makes design guidance machine-readable and agent-queryable (Document blocks).
-
Agent-readable surface — operations and transport contracts (CLI, MCP server, Agent Skill) for AI agents consuming spec-conformant design data; covers session primer, token resolution, validation, query, and component description (Agent-readable surface).
-
Evolution — deprecation lifecycle, migration windows, change classification, and legacy format contract (Evolution).
1.2. Conformance
The key words MUST, MUST NOT, SHOULD, SHOULD NOT, MAY, and OPTIONAL in this specification are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
1.2.1. Conformance levels
| Level | Meaning |
|---|---|
| NORMATIVE | Required for a conforming document or tool. |
| RECOMMENDED | Strong default; deviations SHOULD be documented. |
| OPTIONAL | May be omitted unless a feature explicitly requires it. |
1.2.2. Validation layers
Conformance is checked in three layers (all under @adobe/design-data-spec):
| Layer | Artifact | Responsibility |
|---|---|---|
| 1 | schemas/*.json
| Per-instance structural shape (JSON Schema Draft 2020-12). |
| 2 | rules/rules.yaml
| Semantic rules with stable IDs (e.g. SPEC-001).
|
| 3 | conformance/
| Fixtures and expected diagnostics for implementors. |
A conforming validator MUST implement Layer 1 for supported document types and SHOULD implement Layer 2 rules whose introduced_in is less than or equal to the validator’s claimed spec version.
1.3. Spec version and SemVer
This document set carries the spec version 1.0.0-draft. Published artifacts (schemas, rule catalog) are expected to align with Semantic Versioning once 1.0.0 is released: MAJOR for incompatible schema or rule behavior, MINOR for backward-compatible additions, PATCH for clarifications and compatible fixes.
Full governance (compatibility tiers, migration, CLI --spec-version) is discussed in discussion #735 — Versioning and Evolution.
1.4. Normative references (sibling documents)
| Document | Role |
|---|---|
| Token format | Token name, value / $ref, value types, lifecycle metadata.
|
| Taxonomy | Concept categories, vocabulary, formatting, anatomy vs objects. |
| Registry | Named value collections for vocabulary validation; three-registry boundary (anatomy, token objects, categories) and packaging. |
| Component format | Component declaration: options, slots, anatomy (→ anatomy-format.md), states (→ state-model.md), lifecycle. |
| Anatomy format | Anatomy part declarations: field constraints, canonical vocabulary, SPEC-020/SPEC-023/SPEC-024/SPEC-025. |
| State model | State declarations: trigger semantics, precedence algorithm, canonical vocabulary, SPEC-022/SPEC-026. |
| Cascade | Layers, specificity, resolution algorithm. |
| Mode Sets | Mode set declarations, built-in mode sets, coverage. |
| Manifest | Platform manifest fields and validation expectations. |
| Product context | Product-layer context document: rationale, overrides, and extensions. |
| Diff | Semantic diff change taxonomy, token identity, property changes. |
| Query | Filter notation for selecting tokens by structured fields. |
| Accessibility | Component accessibility vocabulary: role, intents, focusable, keyboardIntents, wcag, and state-level AT fields (SPEC-030/031). |
| Accessibility adapters | Informative platform adapter contracts mapping foundation accessibility vocabulary to Web/ARIA, iOS, Android, and voice surfaces. |
| Document blocks | Typed prose blocks (purpose, guideline, accessibility, do-dont, examples) attachable to any entity. |
| Agent-readable surface | Transport contracts (CLI, MCP, Agent Skill) and operation catalog for AI agents consuming spec-conformant design data. |
| Evolution | Deprecation lifecycle, migration windows, change classification. |
1.5. JSON Schema $id and versioning
NORMATIVE: Canonical schema documents use versioned path $id URIs so major revisions can coexist on the documentation host:
-
Base:
https://opensource.adobe.com/spectrum-design-data/schemas/v0/ -
Examples:
.../v0/token.schema.json,.../v0/mode-set.schema.json,.../v0/manifest.schema.json
The v0 segment denotes the draft / pre-1.0 schema family aligned with spec version 1.0.0-draft. A future 1.0.0 stable release MAY introduce v1 paths without reusing v0 URLs for incompatible shapes.
RECOMMENDED: Each root schema document includes a top-level string property specVersion (const matching this spec’s version label) when the instance is a design-data document that should self-identify; see individual schemas.
Packaged copies in this repository live under packages/design-data-spec/schemas/; their $id still identifies the canonical published URL above.
1.6. Relationship to existing Adobe packages
| Package / area | Relationship |
|---|---|
@adobe/spectrum-tokens
| Current token JSON under packages/tokens/ is the legacy shape (e.g. color-set, scale-set). This spec defines the target format; backward-compat schemas and migration are Phase 1 (#723).
|
@adobe/design-system-registry
| Registry enums and component metadata MAY be referenced by validation rules (e.g. component association); exact coupling is Layer 2. |
@adobe/spectrum-component-api-schemas
| Will become a thin adapter over component declarations in packages/design-data-spec/components/ (Phase 6.5). Until migration, existing schemas remain authoritative. Cross-reference rules SPEC-018–SPEC-020 apply when component declarations are present in the dataset.
|
1.7. Umbrella discussions
2. Token format
Spec version: 1.0.0-draft (see Overview)
This document defines the normative token object: identity (name), either a literal value or an alias $ref, optional metadata, and value types validated by JSON Schema.
2.1. Token object
A token is a JSON object that satisfies the Layer 1 schema token.schema.json (canonical $id: https://opensource.adobe.com/spectrum-design-data/schemas/v0/token.schema.json).
2.1.1. Required shape
A token MUST contain:
-
name— a JSON object (the name object) as defined below, or a non-empty plain string (escape hatch — see String-name escape hatch). -
Exactly one of:
-
value — a literal token value (type depends on value-type schema), or
-
$ref— a string reference to another token (alias).
-
A token MUST NOT include both value and $ref.
2.1.2. String-name escape hatch
A token’s name field MAY be a non-empty plain string instead of a name object when the token’s identity cannot be expressed using the structured taxonomy fields.
{ "name" : "focus-ring-color-key-focus" , "value" : "#0265dc" , "uuid" : "aaaaaaaa-0011-4000-8000-000000000001" }
NORMATIVE: String-named tokens are schema-valid. Validators MUST accept them without a structural error.
NORMATIVE: String-named tokens MUST trigger rule SPEC-017 (severity: warning, category: tech-debt). The warning surfaces the token as tracked debt requiring future remediation.
NORMATIVE: String-named tokens MUST NOT participate in name-object cascade mode-set matching, specificity calculation, or registry vocabulary checks (SPEC-009 does not apply).
RECOMMENDED: Authors SHOULD treat string names as a temporary escape hatch and track a remediation plan. Each string-named token SHOULD eventually be given a structured name object, at which point SPEC-017 no longer fires.
2.1.3. Name object
The name object identifies the token in a structured way. Implementations use it for cascade matching, specificity, and tooling.
NORMATIVE fields (all string unless noted):
The set of available name-object fields is declared in the design system’s field catalog (fields/ directory). Each field declaration conforms to field.schema.json and specifies its kind (semantic or mode-set), vocabulary registry, validation severity, and default serialization position. See Taxonomy for the full concept category hierarchy, component anatomy vs. token objects, and serialization rules.
Fields are divided into semantic fields (identity, structure, intent) and mode-set fields (axes of variation for cascade resolution). The tables below list Spectrum’s foundation-standard fields as declared in the catalog.
2.1.3.1. Semantic fields
The table below lists all semantic fields. Fields marked with a scope are domain-restricted — see Taxonomy — Token-type taxonomies for the normative per-domain field rules and serialization orders. Validators enforce scope restrictions via rule SPEC-042.
Universal semantic fields (scope: null — apply to all token types):
| Field | Status | Taxonomy category | Description |
|---|---|---|---|
property
| REQUIRED | Property | The stylistic attribute being defined (e.g. color, width, padding, gap).
|
component
| OPTIONAL | Component | Component name when the token is component-scoped. |
structure
| OPTIONAL | Structure | Reusable visual pattern or object category (e.g. base, container, list, accessory). Distinct from component.
|
substructure
| OPTIONAL | Sub-structure | A structure that only exists within its parent structure (e.g. item in list-item).
|
anatomy
| OPTIONAL | Anatomy | A visible, named part of a component as defined by designers (e.g. handle, icon, label). See Taxonomy — Component anatomy.
|
object
| OPTIONAL | Object | Styling surface to which a visual property is applied (e.g. background, border, edge). See Taxonomy — Token objects.
|
variant
| OPTIONAL | Variant | Variant within a component (e.g. accent, negative, primary).
|
state
| OPTIONAL | State | Interactive or semantic state (e.g. hover, focus, disabled).
|
orientation
| OPTIONAL | Orientation | Direction or order of structures and elements (e.g. vertical, horizontal).
|
position
| OPTIONAL | Position | Location of an object relative to another (e.g. affixed).
|
size
| OPTIONAL | Size | Relative t-shirt sizing for relationships across tokens (e.g. small, medium, large).
|
density
| OPTIONAL | Density | Space within or around component parts (e.g. spacious, compact).
|
shape
| OPTIONAL | Shape | Relative to overall component shape (e.g. uniform).
|
scaleIndex
| OPTIONAL | — | Numeric scale index appended at the end of the serialized name (e.g. 100, 200, 900). Used by color palette, spacing, font-size, and motion duration tokens.
|
Domain-scoped semantic fields (only valid on the indicated token type):
| Field | Status | Scope | Description |
|---|---|---|---|
colorFamily
| OPTIONAL | color
| Hue family of the color (e.g. blue, gray, cyan). See Taxonomy — Color token taxonomy.
|
family
| OPTIONAL | typography
| Type family (e.g. sans-serif, serif, cjk, code). See Taxonomy — Typography token taxonomy.
|
weight
| OPTIONAL | typography
| Typographic weight (e.g. regular, bold, light). See Taxonomy — Typography token taxonomy.
|
style
| OPTIONAL | typography
| Typographic style when non-default (e.g. italic). See Taxonomy — Typography token taxonomy.
|
motionRole
| OPTIONAL | motion
| Semantic animation role (e.g. enter, exit, transition). See Taxonomy — Motion token taxonomy.
|
easing
| OPTIONAL | motion
| Easing curve identifier (e.g. ease-out, standard). See Taxonomy — Motion token taxonomy.
|
2.1.3.2. Mode-set fields
| Field | Status | Description |
|---|---|---|
colorScheme
| OPTIONAL | Mode set: light / dark / wireframe / etc. |
scale
| OPTIONAL | Mode set: platform density scale (e.g. desktop, mobile). Distinct from semantic size.
|
contrast
| OPTIONAL | Mode set: contrast level (e.g. regular, high).
|
| Additional keys | OPTIONAL | Other mode sets declared in the dataset’s mode set catalog (see Mode Sets). |
NORMATIVE: Each field is validated according to the validation severity declared in its field declaration. Semantic fields typically use advisory severity (warning); mode-set fields use strict severity (error). See Taxonomy — Name object field categories.
RECOMMENDED: Name objects use a consistent key ordering in authored files for diffs; this is not a conformance requirement. Concept ordering for serialized names is defined in Taxonomy — Default serialization.
2.1.4. Alias ($ref)
When $ref is present, the token is an alias. The $ref string MUST be a non-empty string interpreted as a token path or stable identifier resolvable by the validator (resolution rules are Layer 2; see rule SPEC-001 in rules/rules.yaml).
2.1.5. Literal value
When value is present, it MUST conform to the declared value type for that token. Value types are defined under schemas/value-types/ and referenced from the token schema.
2.1.6. Lifecycle and metadata
The following OPTIONAL fields implement the token lifecycle model described in #623 and the evolution policy in Evolution. Inspired by Swift’s @available attribute, Kotlin’s @Deprecated, and OpenAPI 3.3’s deprecation model.
| Field | Type | Description |
|---|---|---|
uuid
| string (UUID) | Stable unique id for rename tracking and diffs. |
introduced
| string (version) | Spec version when the token was first added (e.g. "1.0.0").
|
deprecated
| string (version) | Spec version when the token was deprecated (e.g. "3.2.0"). Truthy = deprecated.
|
deprecated_comment
| string | Human-readable deprecation explanation and migration guidance. |
replaced_by
| string (UUID) or array of string (UUID) | UUID(s) of the replacement token(s). Single string for 1:1 replacement; array for one-to-many splits. |
plannedRemoval
| string (version) | Spec version when the token will be removed. If omitted, defaults to the next major version after deprecated.
|
private
| boolean | Not part of public API surface. |
rationale
| string | Why this token has its current value. Intended for product-layer authoring context; see Product context. |
2.1.6.1. Lifecycle example
{ "name" : { "component" : "button" , "object" : "background" , "property" : "color" , "variant" : "primary" }, "value" : "#0265dc" , "uuid" : "aaaaaaaa-0001-4000-8000-000000000001" , "introduced" : "1.0.0" , "deprecated" : "3.2.0" , "deprecated_comment" : "Use action-background-default instead." , "replaced_by" : "bbbbbbbb-0002-4000-8000-000000000001" , "plannedRemoval" : "4.0.0" }
2.1.6.2. Normative rules
NORMATIVE: If deprecated is present, deprecated_comment SHOULD be present.
NORMATIVE: If replaced_by is an array, deprecated_comment is REQUIRED — the comment MUST explain which replacement applies in which context.
NORMATIVE: If replaced_by is present, deprecated MUST be present.
NORMATIVE: If plannedRemoval is present, deprecated MUST be present, and the plannedRemoval version MUST NOT precede the deprecated version.
NORMATIVE: Each UUID in replaced_by MUST resolve to an existing token in the dataset (see rule SPEC-010).
2.1.6.3. Legacy format mapping
When generating legacy-format output from cascade tokens:
-
deprecated: "3.2.0"maps todeprecated: true -
replaced_by: "<uuid>"maps torenamed: "<target-token-name>"(resolved via UUID lookup) -
introducedandplannedRemovalhave no legacy equivalent and are not emitted
When migrating legacy-format tokens to cascade:
-
deprecated: truemaps todeprecated: "unknown"(authors should backfill the actual version) -
renamed: "<name>"maps toreplaced_by: "<uuid>"(resolved via name lookup across all files in the migrated input set). If the rename target is not found in the scanned corpus, the field is dropped —replaced_bymust be set manually in that case
2.1.7. specVersion
RECOMMENDED: Root token documents (when stored as standalone JSON files) include specVersion with const 1.0.0-draft for self-identification. Embedded tokens inside larger files MAY omit it if the parent document carries version metadata.
2.1.8. Name-object migration policy
This section defines the normative policy for migrating tokens from string-form names to structured name objects, and for narrowing the property field to its intended CSS/styling-attribute semantics.
2.1.8.1. String-name escape hatch — SPEC-017 severity schedule
String-named tokens (see String-name escape hatch) trigger SPEC-017 at warning severity through the current minor series. Authors SHOULD treat SPEC-017 warnings as actionable tech debt and maintain a remediation backlog (e.g. packages/tokens/naming-exceptions.json).
NORMATIVE: SPEC-017 MUST graduate from warning to error at spec version 2.0.0, no earlier than two minor versions after the minor release that ships this section. This conforms to the evolution policy — rule severity tightening is a major change.
No string-named token may remain in a conforming dataset after the 2.0.0 cut without first being converted to a structured name object or removed.
2.1.8.2. Narrowed property semantics
The property field on a name object is the CSS/styling attribute or design-system abstraction being defined — not an anatomy part, not a styling surface, and not a legacy compound name string. Not all valid values are CSS property identifiers; design-system abstractions (e.g. padding-horizontal, overlay-color, size) are permitted.
NORMATIVE: Values for property SHOULD come from the property-terms registry. Non-registry values emit an advisory warning (SPEC-009 applied to the property field).
Examples of valid property values: color, background-color, border-radius, font-size, gap, opacity.
Examples of invalid property values (migration debt):
-
Anatomy parts — use the
anatomyfield instead (handle,icon,label). -
Styling surfaces — use the
objectfield instead (background,border,edge). -
Legacy compound names — split into structured fields (
focus-ring-color-key-focus→component + anatomy + object + property + state).
2.1.8.3. Author migration guidance
When converting a string-named token to a structured name object:
-
Parse the legacy name string into its constituent segments using the default serialization order.
-
Place the CSS/styling attribute in
property(SHOULD be inproperty-terms.json). -
Route anatomy parts to
anatomy(validated againstanatomy-terms.json). -
Route styling surfaces (background, border, edge) to
object(validated againsttoken-objects.json). -
Retain component, variant, state, and other structural fields as-is.
-
Remove the token from
naming-exceptions.jsonafter conversion.
2.2. Document shape
Cascade-format tokens are stored in JSON files that conform to cascade-file.schema.json (canonical $id: https://opensource.adobe.com/spectrum-design-data/schemas/v0/cascade-file.schema.json).
NORMATIVE: A cascade file MUST be a JSON array of token objects. Each element MUST conform to token.schema.json.
NORMATIVE: The array is ordered. Document order is used for tie-breaking during cascade resolution (earlier element wins); see Cascade — Semantic specificity.
RECOMMENDED: A cascade file uses the .tokens.json extension to distinguish it from legacy set-format files.
Example:
[ { "name" : { "object" : "background" , "property" : "color" }, "value" : "#f5f5f5" , "uuid" : "..." }, { "name" : { "object" : "background" , "property" : "color" , "colorScheme" : "dark" }, "value" : "#1e1e1e" , "uuid" : "..." } ]
2.3. Value types
Individual types (color, dimension, opacity, etc.) MUST be defined as JSON Schemas under schemas/value-types/ and MUST use $id under the same v0 base path as Overview — JSON Schema $id.
2.3.1. Value-type declaration ($valueType)
A token MAY include a $valueType field: a URI reference pointing to a value-type schema under schemas/value-types/.
{ "name" : { "property" : "typography-scale" , "scale" : "desktop" }, "$valueType" : "value-types/typography-scale.schema.json" , "value" : { "fontSize" : "14px" , "lineHeight" : "18px" }, "uuid" : "377145e8-079b-43fd-b522-8f16b1b8f883" }
NORMATIVE: When $valueType is present on a token with a literal value, the value MUST validate against the referenced schema (rule SPEC-016).
NORMATIVE: When $valueType is present on an alias token ($ref), the alias resolution chain MUST terminate at a token whose value validates against the same value-type schema (rule SPEC-002, extended).
RECOMMENDED: All tokens with composite values (see below) SHOULD include $valueType to enable tooling discovery and validation. Tokens without $valueType remain valid under the permissive anyOf union in token.schema.json.
2.3.2. Composite value types
A composite value type is a value-type schema whose root type is object or array. Composite values bundle multiple sub-values into a single token.
NORMATIVE: Composite value types MUST be defined as JSON Schemas under schemas/value-types/ following the same conventions as primitive value types.
NORMATIVE: A composite token participates in cascade resolution as an atomic unit. Sub-values within a composite MUST NOT independently match, override, or participate in specificity calculation.
2.3.3. Inline alias references
Within a composite value, a string sub-value MAY be an inline alias: a reference to another token that is resolved to produce the final sub-value.
{ "name" : { "property" : "component-m-regular" }, "$valueType" : "value-types/typography.schema.json" , "value" : { "fontFamily" : "{sans-serif-font-family}" , "fontSize" : "{font-size-100}" , "fontWeight" : "{regular-font-weight}" , "letterSpacing" : "{letter-spacing}" , "lineHeight" : "{line-height-font-size-100}" } }
NORMATIVE: In legacy format, inline aliases use the syntax {token-name} (curly-brace-wrapped token property name). In cascade format, the inline alias syntax is {token-name} for backward compatibility; UUID-based inline aliases are reserved for a future spec version.
NORMATIVE: Inline aliases within composite values are subject to alias resolution rules. Validators MUST resolve inline aliases and report errors for missing targets (SPEC-014), type mismatches (SPEC-015), and circular references (SPEC-003, extended).
2.4. Component bindings
The optional componentBindings array on a token is the reverse index of tokenBindings on a component declaration (Phase 6.7). It declares which components reference this token in their tokenBindings list.
"componentBindings" : [ { "component" : "button" , "context" : "Minimum height" }, { "component" : "checkbox" , "context" : "Height" } ]
| Field | Required | Type | Description |
|---|---|---|---|
component
| yes | string | Component name (kebab-case). MUST match a declared component name.
|
context
| no | string | Human-readable label for how this token is used in the component. |
componentBindings is informative and optional. It is fully derivable from the tokenBindings arrays on component declarations and does not need to be hand-maintained. Tooling that generates component files may populate componentBindings as a convenience for consumers that query token files directly.
2.5. Relationship to legacy Spectrum tokens
The current @adobe/spectrum-tokens JSON uses sets (color-set, scale-set, …). This specification describes the target per-token model. Mapping from legacy to this format is out of scope for this document; see #743.
2.6. Relationship to RFC #646 token shape
RFC #646 proposed an analytical token shape during the design process. This spec defines the canonical serialization format. The two are related but not identical:
| Aspect | RFC #646 shape | This spec |
|---|---|---|
| Identity field | id
| uuid
|
| Name model | name.original (string) + name.structure (nested object)
| Flat fields directly on name (property, component, colorScheme, …)
|
| Complexity tracking | name.semanticComplexity (stored on token)
| Computed at validation time from mode set declarations |
NORMATIVE: The flat name object defined in this spec is the authoritative serialization format. RFC #646’s name.structure / name.original shape is not a conformance target; it remains a useful reference for the analytical model that informed this design.
RFC #646 remains open as a historical reference. It is not superseded; the spec evolved the format during Phase 2 based on implementation experience.
2.7. References
3. Taxonomy
Spec version: 1.0.0-draft (see Overview)
This document defines the token taxonomy: a hierarchical system of concept categories that classify design tokens, the token term vocabulary of allowed words within each category, and the formatting style rules that control serialization of structured token names into platform-consumable strings.
3.1. Motivation
"Naming convention" is too broad a term when discussing malleability across platform teams. A token name like accent-background-color-hover embeds multiple independent decisions:
-
Which concepts are represented and in what hierarchy (taxonomy).
-
Which words describe each concept (vocabulary).
-
How the words are rendered — casing, delimiters, abbreviations, concept order (formatting).
Each layer has a different malleability profile: the taxonomy is shared across all platforms; the vocabulary is shared with platform-aware compromises; the formatting is platform-malleable.
3.2. Three layers of naming
3.2.1. Layer 1: Token taxonomy
A token taxonomy is a hierarchical set of concept categories for classifying design ideas and use cases. It creates a clear, consistent, and predictable shared language across disciplines and teams.
The taxonomy is NORMATIVE and shared — all platforms use the same concept categories in the same hierarchy. Changing the taxonomy changes the meaning of token names across the entire ecosystem.
Taxonomies are scoped to specific token types for clarity. The semantic/layout taxonomy defined in this document is one such scope; additional taxonomies (e.g. for color tokens) will be defined in future spec versions.
3.2.2. Layer 2: Token term vocabulary
The token term vocabulary is the set of specific words used to describe each conceptual option within the taxonomy. The vocabulary creates a shared language across disciplines and teams.
The vocabulary is NORMATIVE at the foundation level — the foundation defines canonical terms. Platforms MAY declare vocabulary mappings (e.g. hover → highlighted for iOS) in their manifest for platform-specific consumption.
3.2.3. Layer 3: Formatting style
Formatting style defines rules for altering the appearance of a token’s name for platform-specific consumption and usability needs. This includes concept ordering, casing, delimiters, and abbreviations.
Formatting is platform-malleable — each platform manifest MAY declare its own formatting rules. The foundation defines a default formatting style for legacy compatibility.
NORMATIVE: The name object defined in Token format is unordered structured data. Concept ordering is purely a serialization concern and MUST NOT affect cascade resolution, specificity, or validation.
3.3. Principles
The taxonomy is designed with three guiding principles:
-
Object-oriented — Designers and developers think in terms of how they would construct components, rather than abstract semantic ideas.
-
Agnostic (with compromises) — Platform-agnostic terms are used except when platforms have specific terms for the same concept. In those cases, the most common or clear term is used.
-
Verified — Multiple existing components must be rebuildable using the taxonomy system, and consumers must find them reasonably understandable or learnable.
3.4. Token-type taxonomies
Concept categories for name-object fields are declared in the design system’s field catalog — a set of field declarations in the fields/ directory, each conforming to field.schema.json. Each declaration specifies the field name, vocabulary registry, validation severity, default serialization position, and an optional scope that restricts the field to a specific token type.
NORMATIVE: The field catalog is the authoritative source for what fields exist on the name object. Tools, validators, and serializers SHOULD read the catalog rather than hardcoding field knowledge.
NORMATIVE: A field with a non-null scope declaration MUST only appear on tokens of that type. Using a scoped field on a mismatched token type triggers rule SPEC-042 (field-scope-violation, warning).
3.4.1. Semantic / layout token taxonomy
The following concept categories are defined in Spectrum’s foundation field catalog for semantic and layout tokens (scope: null — universal), ordered by default serialization position. This ordering is the default serialization order for legacy format output; it is not a conformance requirement for stored name objects.
NORMATIVE: Each category listed below corresponds to a field on the token name object. Tokens MAY use any subset of these fields. Exception: property is REQUIRED on every name object — see token-format.md.
| Category | Name object field | Answers | Description |
|---|---|---|---|
| Structure | structure
| What? | Individual objects or object categories that have shared styling. Distinctly different from "components" in that they represent structures and visual patterns that can or do occur across many varieties of components. |
| Sub-structure | substructure
| What? | A structure within an element that should only exist within the context of its parent structure. |
| Component | component
| What? | Component scope when the token is component-scoped. |
| Anatomy | anatomy
| What? | A visible, named part of a component as defined by designers. |
| Object | object
| Where? | The styling surface to which a visual property is applied (e.g. background, border, edge). |
| Property | property
| Where? | The CSS/styling attribute or design-system abstraction being defined (e.g. color, width, padding, gap). REQUIRED — see exception in preamble. Values SHOULD come from property-terms.json. Anatomy parts and styling surfaces do NOT belong here — they belong in anatomy and object respectively. See token-format.md — Name-object migration policy for migration guidance.
|
| Orientation | orientation
| When/Why? | The direction or order of structures and elements within a component or pattern. |
| Position | position
| When/Why? | The location of an object relative to another, with or without respect to directional order. |
| Size | size
| When/Why? | Relative terms used to create relationships and patterns of usage across multiple tokens and token types. |
| Density | density
| When/Why? | Options that create more or less space within or around the parts of a component. |
| Shape | shape
| When/Why? | Relative to the overall shape of a component (e.g. "uniform" creates a 1:1 padding ratio between horizontal and vertical padding). |
Additional categories for variant and state are inherited from the existing name object:
| Category | Name object field | Description |
|---|---|---|
| Variant | variant
| Variant within a component (e.g. accent, negative, primary). |
| State | state
| Interactive or semantic state (e.g. hover, focus, disabled). |
3.4.2. Color token taxonomy
Color tokens describe palette entries and semantic color assignments. Their name objects use scope: "color" fields alongside the universal property and state fields.
NORMATIVE: Color tokens SHOULD include colorFamily, scaleIndex, or both to allow tooling to group and sort palette entries. Tokens missing both are flagged by rule SPEC-043 (domain-required-fields, warning).
| Category | Name object field | Answers | Description |
|---|---|---|---|
| Color Family | colorFamily
| What? | Hue family of the color (e.g. blue, gray, celery, transparent-black). Values come from color-families.json.
|
| Ramp Index | scaleIndex
| Which? | Numeric perceptual ramp step (e.g. 100, 400, 900, 1600). Shared with layout tokens; see scaleIndex field declaration. Not scope-restricted.
|
Default serialization order for color tokens:
{variant}-{colorFamily}-{scaleIndex}
Example: colorFamily=blue + scaleIndex=100 → blue-100.
3.4.3. Typography token taxonomy
Typography tokens describe typeface attributes: family, weight, style, and numeric scale. Their name objects use scope: "typography" fields alongside the universal property field.
NORMATIVE: Typography tokens SHOULD include at least one of family, weight, or style. Tokens missing all three are flagged by rule SPEC-043 (domain-required-fields, warning).
| Category | Name object field | Answers | Description |
|---|---|---|---|
| Family | family
| What? | Type family of the token (e.g. sans-serif, serif, cjk, code). Values come from typography-families.json.
|
| Weight | weight
| How? | Typographic weight (e.g. regular, bold, light, black). Values come from typography-weights.json.
|
| Style | style
| How? | Typographic style (e.g. italic, oblique, normal). Include normal when the token explicitly declares a normal style (e.g. a reset). Values come from typography-styles.json.
|
| Alignment | alignment
| How? | Horizontal text-alignment direction (e.g. start, center, end). Corresponds to the CSS text-align axis. Values come from alignments.json.
|
| Scale | scaleIndex
| Which? | Numeric size scale step (e.g. 75, 100, 200). Shared with other token types; not scope-restricted.
|
Default serialization order for typography tokens:
{family}-{weight}-{style}-{scaleIndex}
Example: family=sans-serif + weight=bold → sans-serif-bold. family=sans-serif + style=italic + scaleIndex=100 → sans-serif-italic-100.
3.4.4. Motion token taxonomy
Motion tokens describe timing, easing, and animation role for UI animation. Their name objects use scope: "motion" fields alongside the universal property field.
NOTE: No motion tokens exist in the foundation dataset at the time of this writing. This taxonomy is normative but the registry values for motionRole and easing are provisional — they will be refined when motion tokens are added to the foundation. Validators emit SPEC-043 at warning severity so provisional tokens are not blocked.
NORMATIVE: Motion tokens SHOULD include motionRole or easing. Tokens missing both are flagged by rule SPEC-043 (domain-required-fields, warning).
| Category | Name object field | Answers | Description |
|---|---|---|---|
| Motion Role | motionRole
| What? | Semantic role of the animation (e.g. enter, exit, transition, emphasis). Values come from motion-roles.json.
|
| Easing | easing
| How? | Easing curve identifier (e.g. ease-in, ease-out, standard). Values come from easing-curves.json.
|
| Duration | scaleIndex
| Which? | Numeric duration bucket index (e.g. 100 for 100ms, 200 for 200ms). Shared with other token types; not scope-restricted.
|
Default serialization order for motion tokens:
{motionRole}-{easing}-{scaleIndex}
Example: motionRole=enter + easing=ease-out → enter-ease-out. motionRole=transition + scaleIndex=100 → transition-100.
3.4.5. Alias / semantic token name objects
Alias tokens ($schema: …/alias.json) MAY carry name objects using the same field vocabulary
as their target domain. A color alias carrying colorFamily is valid when its alias chain
resolves to a color-domain schema (color.json, color-set.json).
NORMATIVE: SPEC-042 (field-scope-violation) evaluates alias tokens by following the
alias_target chain to the terminal non-alias schema, then checking that schema against the
field’s domain. This is the alias-target-domain rule: the alias inherits its domain
from what it ultimately resolves to.
Examples:
// icon-color-blue-primary-default ($schema=alias.json, $ref → icon-color-blue-100 which is color-set.json) // Valid: colorFamily allowed because target resolves to color domain. { "property" : "icon-color" , "colorFamily" : "blue" , "variant" : "primary" } // icon-color-primary-default ($schema=alias.json, $ref → icon-color-blue-primary-default) // Valid: no domain-scoped fields used — variant and state are universal. { "property" : "icon-color" , "variant" : "primary" }
What stays deferred: alias tokens referencing the same target but carrying modifiers that
have no current field (e.g. inverse, emphasized, subtle, subdued) remain unclassified
until a color-modifier RFC defines those fields.
3.4.6. Structure vs. component — when does the line move?
The structure and component fields both answer "What?" but apply at different scopes. A useful rule of thumb:
-
Use
componentwhen the token belongs to a specific component’s surface (e.g.button-background-color— the background color of the Button component). -
Use
structurewhen the token belongs to a reusable visual pattern that recurs across components (e.g.container-padding— padding for any container-shaped surface, regardless of which component owns it).
Worked example — card:
-
As a
structure: when "card" describes a layout primitive used inside many components (e.g.card-padding-mediumon a list item, a popover body, or a modal header), the token is structure-scoped. -
As a
component: when "card" describes the dedicated Card component’s own surfaces (e.g.card-background-coloron the Card root), the token is component-scoped.
The same word can validly appear in both fields across the dataset; they are independent. Authors choose based on whether the token’s meaning generalizes across many components (structure) or is specific to one component’s identity (component).
Source: Nate Baldwin, "Naming conventions & shared taxonomy" — Design Data & Platforms onsite, April 1, 2026.
3.5. Component anatomy vs. token objects
Two concepts that are often conflated but serve different purposes:
3.5.1. Component anatomy
Component anatomy refers to the visible, named parts of a component as defined by designers. These are the parts called out in component specification diagrams (e.g. icon, label, track, handle, hold icon).
Component anatomy is declared per component in component schemas and validated against the anatomy registry. A token referencing a component’s anatomy part (e.g. slider + handle) can be validated as a legitimate combination.
Anatomy parts fall into three tiers:
| Tier | Description | Examples |
|---|---|---|
| Primitive | Reusable across many components | icon, label, track, handle, fill, divider, title, description |
| Composite | Another component used as a named part | checkbox, close button, popover, avatar |
| Component-specific | Unique to one component | loupe, gripper, opacity checkerboard |
3.5.2. Token objects (styling surfaces)
Token objects (or styling surfaces) describe where a visual property is applied on a UI element. These are NOT anatomy — they are abstract styling targets that exist on any element regardless of its component type.
| Object | Description |
|---|---|
background
| Background surface or fill |
border
| Border or outline |
edge
| Outer boundary of component (used in spacing tokens) |
visual
| Visible graphic element area (may be inset from edge) |
content
| Main content area |
Token objects are stored in a separate registry from anatomy parts. Both may appear in the same token name — e.g. a token for the background color of a slider’s handle would reference anatomy handle and object background.
3.6. Name object field categories
Name object fields fall into two categories with different validation behavior:
3.6.1. Semantic fields
Semantic fields describe identity, structure, and intent. They are used for querying and organization but do not participate in cascade resolution or specificity calculation.
NORMATIVE: Semantic field values are validated against their declared vocabulary registry with the severity specified in the field declaration (typically advisory — warning, not error). Values not in the registry are permitted but flagged.
Semantic fields are those declared with kind: "semantic" in the field catalog. In Spectrum’s foundation catalog, these are: structure, substructure, component, anatomy, object, property, variant, state, orientation, position, size, density, shape.
3.6.2. Mode-set fields
Mode-set fields represent axes of variation that drive the cascade resolution algorithm and specificity calculation.
NORMATIVE: Mode-set field values are validated against declared mode set modes with strict severity (error). An invalid mode value would silently fail to match any context during cascade resolution.
Mode-set fields are those declared with kind: "mode-set" in the field catalog, plus any additional mode set keys from the dataset’s mode set declarations. In Spectrum’s foundation catalog, the standard mode-set fields are: colorScheme, scale, contrast.
See Mode Sets for mode set declarations, modes, and defaults.
3.7. Default serialization (legacy format)
The default serialization produces a kebab-case string from the name object by ordering fields according to their serialization.position values (ascending) as declared in the field catalog. Omitted fields are skipped.
For Spectrum’s foundation catalog, this produces the following concept order:
{variant}-{component}-{structure}-{substructure}-{anatomy}-{object}-{property}-{orientation}-{position}-{size}-{density}-{shape}-{state}
All fields are independent — variant and component MAY both appear in the same token name (e.g. a token with component: "button" and variant: "accent" serializes as accent-button-...).
This ordering is preserved for backward compatibility with the current @adobe/spectrum-tokens package. It is a serialization convention, not a structural requirement.
NORMATIVE: A conforming formatter MUST produce deterministic output for a given name object and formatting configuration. Two name objects that differ only in field ordering MUST produce identical serialized strings.
3.8. Platform formatting configuration
A platform manifest MAY declare formatting rules in its extensions.formatting section to control concept ordering, casing, delimiters, and abbreviations. The normative contract for these fields is defined in Manifest — extensions.formatting.
When no platform formatting is declared, the default serialization above is used.
3.9. Scalability
The taxonomy and terms are built to scale as new concepts and terms are identified:
-
New concept categories MAY be added by creating a new field declaration file in the field catalog — no spec version change is required for the mechanism itself.
-
New terms MAY be added to the vocabulary registry without spec version changes.
-
New token type taxonomies MAY be added by creating scoped field declarations (non-null
scope) and a corresponding registry section in taxonomy.md. Color, typography, and motion taxonomies are defined above. -
Platform manifests MAY extend the vocabulary with platform-specific terms and formatting.
3.10. Where name objects live
Token taxonomy data is decoupled from the published @adobe/spectrum-tokens
package to avoid bumping the tokens version on every taxonomy change.
| Artifact | Location | Description |
|---|---|---|
| Token source data | packages/tokens/src/*.json
| $schema, value, uuid, sets, … — no name field
|
| Taxonomy sidecar | packages/token-names/names/*.json
| { "<slug>": { property, colorFamily, … }, … } — one file per token source file
|
| Field definitions | packages/design-data-spec/fields/
| Authoritative field catalog with scope and type |
The sidecar package (@adobe/token-names) is private (not published to npm).
Its delivery format for downstream consumers is TBD.
3.10.1. SDK validator integration
Pass --names-dir packages/token-names/names/ to the design-data validate CLI
to merge sidecar names into the token graph at ingest. All relational rules
(SPEC-042, SPEC-043, SPEC-018…022, cascade, diff, query) continue to read
record.raw["name"] as if the field were inline:
cargo run --bin design-data -- validate packages/tokens/src/\ --names-dir packages/token-names/names/
Validation without --names-dir is a valid fail-open configuration (name-scope
rules are silent); CI always supplies the flag.
3.10.2. Regenerating name data
node tools/token-corpus-migrate/src/cli.js\ --root packages/tokens/src\ --names-out packages/token-names/names\ --write
3.11. References
-
Manifest —
extensions.formatting— normative contract for platform formatting rules -
Nate Baldwin, "Naming conventions & shared taxonomy" — Design Data & Platforms onsite, April 1, 2026
4. Agent-readable surface
Spec version: 1.0.0-draft (see Overview)
Status: Implemented — RFC-C / Phase 8 (epic #830). Core read/validate/write surface shipped. write_component and explain deferred (no CLI subcommand or MCP tool yet).
This document defines the agent-readable surface: the contract an external AI agent uses to consume design data conformant with this specification. It standardizes a small set of operations exposed through three transports — a CLI, a Model Context Protocol (MCP) server, and a Claude Code Agent Skill — all backed by the same resolver, validator, and query implementations that power the rest of the SDK.
4.1. Goals
The surface targets three consumer shapes:
-
Authoring an external system. A non-Spectrum design system being constructed inside an AI tool (e.g. a finance-dashboard prototype tool) wants to produce spec-conformant tokens, mode sets, and components without re-deriving the format from prose.
-
Extending Spectrum. A product or platform team adds tokens, components, or overrides on top of the published Spectrum foundation and needs to validate that the additions cascade and resolve correctly.
-
Adhering to Spectrum. A prototyping tool generates UI that should match Spectrum even where no bound component exists (e.g. CSS for a custom card). The agent needs to look up tokens by intent, validate proposed property values against the foundation, and report drift.
NORMATIVE: A conforming agent surface implementation MUST support all three consumer shapes, parameterized by the manifest provided at session start (see Session primer).
4.2. Non-goals
-
Generating finished platform code (Swift, CSS, etc.). Output formatting is the consumer’s responsibility; the surface returns structured tokens.
-
Hosting design data. The surface operates on local datasets reachable from the consumer’s filesystem, plus optionally a remote published manifest.
-
Replacing the existing Spectrum-bound tools (
@adobe/spectrum-design-data-mcp,@adobe/s2-docs-mcp). Those expose Spectrum-specific shapes; this surface is generic to any spec-conformant dataset.
4.3. Tool catalog
NORMATIVE: A conforming implementation MUST expose the following operations. Transport-specific naming (CLI subcommand vs MCP tool name vs skill action) MAY differ; the semantics MUST NOT.
| Operation | Reads | Returns | Backed by |
|---|---|---|---|
resolve_token
| property + mode set context | winning token (literal or resolved alias) with file/UUID/specificity | cascade::resolve
|
query_tokens
| filter expression (see Query) | matching token list | query::filter
|
validate_usage
| candidate token document or fragment | ValidationReport (Layer 1 + Layer 2 diagnostics)
| validate::validate_*
|
describe_component
| component identifier | component contract (anatomy, options, states, tokenBindings); see #832 and Phase 6.7 | (Phase 6 contract) |
suggest_token
| natural-language intent + optional property hint | ranked candidate tokens with rationale (RECOMMENDED, not NORMATIVE in v1) | registry + query |
get_guidance
| token UUID, component identifier, or anatomy reference | attached document blocks (Phase 9 / RFC-D); falls back to empty list pre-RFC-D | document blocks |
diff_datasets
| two dataset roots | DiffReport per Diff
| diff::semantic_diff
|
write_token
| token object + optional rationale string | updated product-layer token file + product-context.json (RECOMMENDED, not NORMATIVE in v1)
| write::write_token — shipped: design-data write-token (CLI) / authoring_session_commit (MCP)
|
write_component
| component object + optional rationale string | updated product-layer component file + product-context.json (RECOMMENDED, not NORMATIVE in v1)
| write::write_component — deferred; no CLI subcommand or MCP tool yet
|
NORMATIVE: validate_usage, resolve_token, query_tokens, diff_datasets, and describe_component MUST be implemented in a conforming agent surface. suggest_token, get_guidance, write_token, and write_component are RECOMMENDED.
RECOMMENDED: When write_token or write_component is invoked, the implementation SHOULD capture a rationale argument from the agent session context and record it in both the token’s inline rationale field and the product context document’s overrides[].rationale or extensions.tokens[].rationale. See Product context — Agent capture behavior.
4.4. Session primer
An agent loop benefits from a small, structural overview at session start so that subsequent calls are well-scoped. The session primer is a single operation that returns a serialized summary of the active dataset.
NORMATIVE: A conforming implementation MUST expose a primer operation returning a JSON object with at least:
| Field | Type | Meaning |
|---|---|---|
specVersion
| string | The spec version the dataset declares (see Overview). |
manifest
| object | null | Resolved platform manifest, if any (see Manifest). |
modeSets
| array | Declared mode sets with modes and defaults. |
components
| array | Component identifiers exposed by the dataset (post Phase 6). |
taxonomyFields
| array | Active name-object fields and their declared vocabulary. |
tokenCount
| integer | Total tokens in the merged cascade. |
RECOMMENDED: The primer payload SHOULD fit within 2,000 tokens of LLM context for typical Spectrum-scale datasets. Implementations that produce larger payloads SHOULD provide a --summary mode.
RATIONALE: The primer replaces the "DESIGN.md emit" approach explored in earlier RFC-C drafts. A live, queryable primer keeps the agent’s session context current without requiring the agent to maintain a frozen prose summary that can drift from the dataset.
4.5. Transports
NORMATIVE: A conforming implementation MUST expose the Tool catalog through at least one of the following transports.
4.5.1. CLI
The reference CLI is design-data (see sdk/cli/). RFC-C extends the existing subcommands (validate, resolve, diff, query) with:
-
design-data primer [PATH]— emit the Session primer payload. -
design-data suggest "<intent>" [--property <hint>]— invokesuggest_token. -
design-data explain <token-uuid|component-id>— invokeget_guidance. (Deferred — not yet shipped; pendingget_guidancewire-up.)
NORMATIVE: All RFC-C CLI output MUST default to JSON when stdout is not a TTY, and MUST emit human-friendly output when stdout is a TTY. This makes the CLI directly composable from agent shells without per-call format flags.
4.5.2. MCP server
A reference MCP server is RECOMMENDED to ship as @adobe/design-data-agent-mcp (separate from the existing Spectrum-bound @adobe/spectrum-design-data-mcp to avoid coupling to a specific dataset).
NORMATIVE: The MCP server MUST register one tool per Tool catalog operation. Tool names MUST match the operation name in the table verbatim. Each tool’s input schema MUST mirror the CLI flag set; agents that learn one transport SHOULD work with the other.
4.5.3. Agent skill
A reference Claude Code Agent Skill is RECOMMENDED at tools/design-data-agent-mcp/skills/design-data/SKILL.md. The skill SHOULD trigger on intent words covering all three Goals — for example "design system", "design tokens", "drift", "spec-conformant", and explicit Spectrum mentions when the active manifest binds Spectrum.
RECOMMENDED: The skill SHOULD shell out to the CLI rather than embedding tool calls, so its description (the only persistent context cost) stays small and the heavy lifting happens out-of-band.
4.6. describe_component return shape
The describe_component tool returns the component declaration object as stored in the dataset, extended with tokenBindings when Phase 6.7 data is present. A conforming implementation MUST include tokenBindings in the response when the component declaration contains that field.
{ "name" : "button" , "displayName" : "Button" , "meta" : { "category" : "actions" , "documentationUrl" : "https://spectrum.adobe.com/page/button/" }, "options" : { "variant" : { "type" : "string" , "values" : [{ "value" : "accent" }, { "value" : "negative" }, { "value" : "primary" }, { "value" : "secondary" }], "default" : "accent" } }, "anatomy" : [ { "name" : "icon" , "description" : "Leading icon." }, { "name" : "label" , "description" : "Button text." , "required" : true } ], "states" : [ { "name" : "hover" , "trigger" : "interaction" , "precedence" : 50 }, { "name" : "focus" , "trigger" : "interaction" , "precedence" : 60 , "layered" : true }, { "name" : "disabled" , "trigger" : "prop" , "precedence" : 100 } ], "tokenBindings" : [ { "token" : "component-height-100" , "context" : "Minimum height" }, { "token" : "corner-radius-full" , "context" : "Rounding" } ] }
tokenBindings enables agents to retrieve a complete picture of a component’s token usage — including shared structure and foundation tokens that do not carry the component name in their name-object — without issuing a second query_tokens call.
4.7. Conformance
NORMATIVE: An agent surface implementation that claims conformance MUST:
-
Implement all NORMATIVE operations in the Tool catalog.
-
Implement the Session primer operation.
-
Expose the catalog through at least one transport in Transports.
-
Emit
validate_usagediagnostics that match the structure produced byvalidate::validate_all_with_options(seesdk/core/src/report.rs): each diagnostic MUST includerule_id,severity,message,instance_path,schema_path,file, andtokenwhere applicable. -
Honor manifest-based filtering: when a manifest is present in the session,
query_tokensandresolve_tokenMUST respectinclude/excludeand MUST apply manifest overrides before returning results.
4.8. Worked example
The following sketch shows an agent loop that adheres-to-Spectrum while authoring a non-bound component.
-
Agent calls
primer ./spectrum-dataand learns thatcolorSchemeandscaleare the active mode sets and thatbutton,picker, andcardare exposed components. -
User asks for a "subtle hover background for a card on dark mode".
-
Agent calls
suggest_token "subtle hover background for card" --property background-color. -
Surface returns a ranked list including
background-color-hoverfrom Spectrum foundation andbackground-color-card-hoverfrom a card component group. -
Agent calls
resolve_token background-color-card-hover --color-scheme dark. -
Surface returns the resolved literal value for the dark-mode card hover background.
-
Agent emits CSS using that value and calls
validate_usageagainst the proposed token document fragment to confirm no SPEC-NNN diagnostics fire.
The same loop, with a different manifest passed at primer time, authors a non-Spectrum system: the surface returns whatever tokens that dataset declares, and validate_usage enforces the same spec rules independent of which design system is in play.
4.9. References
-
#832 — Component Contract in Design Data Spec — supplies
describe_componentonce implemented -
Document blocks (forthcoming, RFC-D / Phase 9) — supplies
get_guidancepayloads -
sdk/cli/src/main.rs— CLI surface to extend -
sdk/core/src/report.rs— diagnostic shape
5. Validation rule catalog (excerpt)
This excerpt demonstrates stable-ID cross-references using five representative
rules drawn from rules/rules.yaml. The full catalog ships in the canonical
@adobe/design-data-spec package.
5.1. Rules
- SPEC-001 —
alias-target-exists -
-
Severity: error
-
Category: reference-integrity
-
Assert: Every alias
$refMUST resolve to an existing token in the dataset. -
Message:
Alias target not found for $ref: {path} -
Introduced in:
1.0.0-draft
-
- SPEC-005 —
cascade-coverage -
-
Severity: error
-
Category: completeness
-
Assert: Mode set declarations MUST satisfy coverage rules (e.g.
default ∈ modes; peer mode requirements from coverage metadata). -
Message:
Mode-set coverage violation for {mode_set} -
Introduced in:
1.0.0-draft
-
- SPEC-006 —
specificity-correctness -
-
Severity: warning
-
Category: type-safety
-
Assert: When two tokens from the same layer match a context with equal specificity, the tie MUST be broken by document order (earlier in file wins; lexicographically earlier file path wins across files). Ties MUST be reported as warnings.
-
Message:
Ambiguous cascade resolution (specificity tie) between {token_a} and {token_b} for context {context}; resolved by document order -
Introduced in:
1.0.0-draft
-
- SPEC-009 —
name-field-enum-sync -
-
Severity: warning
-
Category: naming-consistency
-
Assert: Recognized name object fields (
component,state,variant, etc.) SHOULD use values drawn from the corresponding design-system-registry enums when those enums are available. -
Message:
Token name field '{field}' value '{value}' is not in the design-system-registry enum for '{field}' -
Introduced in:
1.0.0-draft
-
- SPEC-017 —
string-name-tech-debt -
-
Severity: warning
-
Category: tech-debt
-
Assert: Token names SHOULD be structured name objects. A plain string name is permitted as a temporary escape hatch but MUST be treated as tech debt and tracked for remediation.
-
Message:
Token "{name}" uses a string name instead of a name object — treat as tech debt and plan remediation -
Spec ref: String-name escape hatch
-
Introduced in:
1.0.0-draft
-