@adobe/design-data-spec 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/conformance/invalid/SPEC-009/expected-errors.json +1 -1
  2. package/conformance/invalid/SPEC-018/dataset.json +8 -1
  3. package/conformance/invalid/SPEC-034/expected-errors.json +1 -1
  4. package/conformance/invalid/SPEC-035/expected-errors.json +1 -1
  5. package/conformance/invalid/SPEC-044/empty-optional-dir/components/.gitkeep +0 -0
  6. package/conformance/invalid/SPEC-044/empty-optional-dir/expected-errors.json +10 -0
  7. package/conformance/invalid/SPEC-044/empty-optional-dir/tokens/base.tokens.json +1 -0
  8. package/conformance/invalid/SPEC-044/missing-tokens/expected-errors.json +10 -0
  9. package/conformance/valid/SPEC-044/components/button.json +9 -0
  10. package/conformance/valid/SPEC-044/expected-errors.json +4 -0
  11. package/conformance/valid/SPEC-044/tokens/base.tokens.json +1 -0
  12. package/package.json +6 -6
  13. package/rules/rules.yaml +27 -7
  14. package/schemas/component.schema.json +1 -1
  15. package/schemas/dataset.schema.json +39 -0
  16. package/schemas/manifest.schema.json +1 -23
  17. package/schemas/mode-set.schema.json +4 -0
  18. package/schemas/platform-extension.json +79 -0
  19. package/schemas/registry-value.json +230 -0
  20. package/schemas/token.schema.json +1 -1
  21. package/spec/agent-surface.md +16 -14
  22. package/spec/anatomy-format.md +1 -1
  23. package/spec/cascade.md +1 -1
  24. package/spec/dataset-layout.md +72 -0
  25. package/spec/index.md +7 -5
  26. package/spec/mode-sets.md +1 -1
  27. package/spec/registry.md +6 -8
  28. package/spec/taxonomy.md +32 -32
  29. package/spec/token-format.md +11 -3
  30. package/components/accordion.json +0 -557
  31. package/components/action-bar.json +0 -214
  32. package/components/action-button.json +0 -522
  33. package/components/action-group.json +0 -134
  34. package/components/alert-banner.json +0 -134
  35. package/components/alert-dialog.json +0 -180
  36. package/components/avatar-group.json +0 -166
  37. package/components/avatar.json +0 -246
  38. package/components/badge.json +0 -594
  39. package/components/body.json +0 -54
  40. package/components/bottom-navigation-android.json +0 -72
  41. package/components/breadcrumbs.json +0 -307
  42. package/components/button-group.json +0 -86
  43. package/components/button.json +0 -586
  44. package/components/calendar.json +0 -133
  45. package/components/cards.json +0 -541
  46. package/components/checkbox-group.json +0 -91
  47. package/components/checkbox.json +0 -339
  48. package/components/close-button.json +0 -208
  49. package/components/coach-indicator.json +0 -105
  50. package/components/coach-mark.json +0 -169
  51. package/components/code.json +0 -44
  52. package/components/color-area.json +0 -138
  53. package/components/color-handle.json +0 -111
  54. package/components/color-loupe.json +0 -77
  55. package/components/color-slider.json +0 -165
  56. package/components/color-wheel.json +0 -117
  57. package/components/combo-box.json +0 -543
  58. package/components/contextual-help.json +0 -230
  59. package/components/date-picker.json +0 -471
  60. package/components/detail.json +0 -53
  61. package/components/divider.json +0 -93
  62. package/components/drop-zone.json +0 -238
  63. package/components/field-label.json +0 -219
  64. package/components/heading.json +0 -68
  65. package/components/help-text.json +0 -209
  66. package/components/illustrated-message.json +0 -175
  67. package/components/in-field-progress-button.json +0 -88
  68. package/components/in-field-progress-circle.json +0 -116
  69. package/components/in-line-alert.json +0 -233
  70. package/components/link.json +0 -167
  71. package/components/list-view.json +0 -382
  72. package/components/menu.json +0 -597
  73. package/components/meter.json +0 -199
  74. package/components/number-field.json +0 -518
  75. package/components/opacity-checkerboard.json +0 -69
  76. package/components/picker.json +0 -579
  77. package/components/popover.json +0 -174
  78. package/components/progress-bar.json +0 -229
  79. package/components/progress-circle.json +0 -132
  80. package/components/radio-button.json +0 -308
  81. package/components/radio-group.json +0 -113
  82. package/components/rating.json +0 -168
  83. package/components/scroll-zoom-bar.json +0 -82
  84. package/components/search-field.json +0 -346
  85. package/components/segmented-control.json +0 -248
  86. package/components/select-box.json +0 -272
  87. package/components/side-navigation.json +0 -320
  88. package/components/slider.json +0 -407
  89. package/components/standard-dialog.json +0 -179
  90. package/components/standard-panel.json +0 -83
  91. package/components/status-light.json +0 -334
  92. package/components/steplist.json +0 -294
  93. package/components/swatch-group.json +0 -114
  94. package/components/swatch.json +0 -240
  95. package/components/switch.json +0 -336
  96. package/components/tab-bar-ios.json +0 -72
  97. package/components/table.json +0 -435
  98. package/components/tabs.json +0 -253
  99. package/components/tag-field.json +0 -243
  100. package/components/tag-group.json +0 -87
  101. package/components/tag.json +0 -393
  102. package/components/takeover-dialog.json +0 -117
  103. package/components/text-area.json +0 -555
  104. package/components/text-field.json +0 -555
  105. package/components/thumbnail.json +0 -149
  106. package/components/title.json +0 -91
  107. package/components/toast.json +0 -156
  108. package/components/tooltip.json +0 -179
  109. package/components/tray.json +0 -32
  110. package/components/tree-view.json +0 -393
  111. package/fields/alignment.json +0 -15
  112. package/fields/anatomy.json +0 -15
  113. package/fields/color-scheme.json +0 -15
  114. package/fields/colorFamily.json +0 -15
  115. package/fields/component.json +0 -15
  116. package/fields/contrast.json +0 -15
  117. package/fields/density.json +0 -15
  118. package/fields/easing.json +0 -15
  119. package/fields/family.json +0 -15
  120. package/fields/motionRole.json +0 -15
  121. package/fields/object.json +0 -15
  122. package/fields/orientation.json +0 -15
  123. package/fields/position.json +0 -15
  124. package/fields/property.json +0 -15
  125. package/fields/scale.json +0 -15
  126. package/fields/scaleIndex.json +0 -15
  127. package/fields/shape.json +0 -15
  128. package/fields/size.json +0 -15
  129. package/fields/state.json +0 -15
  130. package/fields/structure.json +0 -15
  131. package/fields/style.json +0 -15
  132. package/fields/substructure.json +0 -15
  133. package/fields/variant.json +0 -15
  134. package/fields/weight.json +0 -15
@@ -1,7 +1,7 @@
1
1
  # Agent-readable surface
2
2
 
3
3
  **Spec version:** `1.0.0-draft` (see [Overview](index.md))\
4
- **Status:** Draft — RFC-C / Phase 8. Surface and tool list are subject to change. No reference implementation exists yet.
4
+ **Status:** Implemented — RFC-C / Phase 8 (epic [#830](https://github.com/adobe/spectrum-design-data/issues/830)). Core read/validate/write surface shipped. `write_component` and `explain` deferred (no CLI subcommand or MCP tool yet).
5
5
 
6
6
  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.
7
7
 
@@ -25,19 +25,19 @@ The surface targets three consumer shapes:
25
25
 
26
26
  **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.
27
27
 
28
- | Operation | Reads | Returns | Backed by |
29
- | -------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
30
- | `resolve_token` | property + mode set context | winning token (literal or resolved alias) with file/UUID/specificity | `cascade::resolve` |
31
- | `query_tokens` | filter expression (see [Query](query.md)) | matching token list | `query::filter` |
32
- | `validate_usage` | candidate token document or fragment | `ValidationReport` (Layer 1 + Layer 2 diagnostics) | `validate::validate_*` |
33
- | `describe_component` | component identifier | component contract (anatomy, options, states, tokenBindings); see [#832](https://github.com/adobe/spectrum-design-data/discussions/832) and [Phase 6.7](#describe_component-return-shape) | (Phase 6 contract) |
34
- | `suggest_token` | natural-language intent + optional property hint | ranked candidate tokens with rationale (RECOMMENDED, not NORMATIVE in v1) | registry + query |
35
- | `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 |
36
- | `diff_datasets` | two dataset roots | `DiffReport` per [Diff](diff.md) | `diff::semantic_diff` |
37
- | `write_token` | token object + optional rationale string | updated product-layer token file + `product-context.json` (RECOMMENDED, not NORMATIVE in v1) | `write::write_token` (Phase 8.x, not yet implemented) |
38
- | `write_component` | component object + optional rationale string | updated product-layer component file + `product-context.json` (RECOMMENDED, not NORMATIVE in v1) | `write::write_component` (Phase 8.x, not yet implemented) |
28
+ | Operation | Reads | Returns | Backed by |
29
+ | -------------------- | ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
30
+ | `resolve_token` | property + mode set context | winning token (literal or resolved alias) with file/UUID/specificity | `cascade::resolve` |
31
+ | `query_tokens` | filter expression (see [Query](query.md)) | matching token list | `query::filter` |
32
+ | `validate_usage` | candidate token document or fragment | `ValidationReport` (Layer 1 + Layer 2 diagnostics) | `validate::validate_*` |
33
+ | `describe_component` | component identifier | component contract (anatomy, options, states, tokenBindings); see [#832](https://github.com/adobe/spectrum-design-data/discussions/832) and [Phase 6.7](#describe_component-return-shape) | (Phase 6 contract) |
34
+ | `suggest_token` | natural-language intent + optional property hint | ranked candidate tokens with rationale (RECOMMENDED, not NORMATIVE in v1) | registry + query |
35
+ | `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 |
36
+ | `diff_datasets` | two dataset roots | `DiffReport` per [Diff](diff.md) | `diff::semantic_diff` |
37
+ | `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) |
38
+ | `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 |
39
39
 
40
- **NORMATIVE:** `validate_usage`, `resolve_token`, `query_tokens`, and `diff_datasets` MUST be implemented in a conforming agent surface. `suggest_token`, `get_guidance`, `write_token`, and `write_component` are RECOMMENDED. `describe_component` becomes NORMATIVE once [#832](https://github.com/adobe/spectrum-design-data/discussions/832) reaches implemented status.
40
+ **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.
41
41
 
42
42
  **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](product-context.md#agent-capture-behavior).
43
43
 
@@ -70,7 +70,7 @@ The reference CLI is `design-data` (see [`sdk/cli/`](../../../sdk/cli/)). RFC-C
70
70
 
71
71
  * `design-data primer [PATH]` — emit the [Session primer](#session-primer) payload.
72
72
  * `design-data suggest "<intent>" [--property <hint>]` — invoke `suggest_token`.
73
- * `design-data explain <token-uuid|component-id>` — invoke `get_guidance`.
73
+ * `design-data explain <token-uuid|component-id>` — invoke `get_guidance`. (Deferred — not yet shipped; pending `get_guidance` wire-up.)
74
74
 
75
75
  **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.
76
76
 
@@ -84,6 +84,8 @@ A reference MCP server is RECOMMENDED to ship as `@adobe/design-data-agent-mcp`
84
84
 
85
85
  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](#goals) — for example "design system", "design tokens", "drift", "spec-conformant", and explicit Spectrum mentions when the active manifest binds Spectrum.
86
86
 
87
+ A separate Spectrum-oriented skill (embedded snapshot, zero config) lives at `tools/design-data-skill/skills/design-data/SKILL.md`. Install both via the `spectrum-design-data` Claude Code marketplace as `design-data-agent@spectrum-design-data` and `design-data@spectrum-design-data` respectively.
88
+
87
89
  **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.
88
90
 
89
91
  ## `describe_component` return shape
@@ -99,7 +99,7 @@ The following anatomy part names are defined by the cross-platform design audit
99
99
 
100
100
  Custom part names are permitted. When a custom name is used, the anatomy part object **SHOULD** include a `description` field explaining its visual role (rule SPEC-023).
101
101
 
102
- The table above is informative; the authoritative vocabulary is `@adobe/design-system-registry/registry/anatomy-terms.json` (119 entries). SPEC-035 fires advisory warnings when a declared anatomy part `name` is not in that registry, pointing authors at the canonical list. Custom names remain valid — SPEC-035 is advisory, not an error.
102
+ The table above is informative; the authoritative vocabulary is `@adobe/spectrum-design-data/registry/anatomy-terms.json` (119 entries). SPEC-035 fires advisory warnings when a declared anatomy part `name` is not in that registry, pointing authors at the canonical list. Custom names remain valid — SPEC-035 is advisory, not an error.
103
103
 
104
104
  ## Cross-reference with token name objects
105
105
 
package/spec/cascade.md CHANGED
@@ -55,7 +55,7 @@ Exact matching rules for omitted mode sets are defined alongside mode set declar
55
55
 
56
56
  **NORMATIVE:** Alias (`$ref`) resolution **MUST** occur **after** cascade selection. The resolution algorithm selects the winning candidate using layer, specificity, and tie-breaking rules before any alias chain is followed.
57
57
 
58
- **NORMATIVE:** If the winning candidate is an alias, its `$ref` chain **MUST** be resolved to a literal value using the standard alias-resolution rules (SPEC-001 through SPEC-003 in `rules/rules.yaml`). The alias target is resolved within the same dataset (i.e. the same merged layer stack), not relative to any single layer.
58
+ **NORMATIVE:** If the winning candidate is an alias, its `$ref` chain **MUST** be resolved to a literal value using the standard alias-resolution rules (SPEC-001 through SPEC-003 in `rules/rules.yaml`). The alias target is resolved within the same dataset (i.e. the same merged layer stack), not relative to any single layer. In cascade format, `$ref` holds the **UUID** of the target token (see [`token-format.md` §Alias](token-format.md#alias-ref)); resolution proceeds UUID-first, then direct graph key (legacy slug), then serialised name.
59
59
 
60
60
  **RATIONALE:** Aliases participate in cascade as opaque references — their target values are not examined during specificity calculation or layer comparison. This keeps resolution deterministic and allows aliases to be valid candidates at any specificity level.
61
61
 
@@ -0,0 +1,72 @@
1
+ # Dataset layout
2
+
3
+ **Spec version:** `1.0.0-draft` (see [Overview](index.md))
4
+
5
+ This document defines the normative **directory layout** of a conformant design-data **dataset**: which directories are required, which are optional but registered, how files in each directory are named and validated, how tooling **discovers** a dataset on disk, and the optional root **descriptor** a dataset MAY carry.
6
+
7
+ A **dataset** is a directory tree that holds design tokens and the optional catalogs (components, fields, mode sets, registry vocabulary) that describe them. The Spectrum foundation dataset lives at `packages/design-data/`, but any design system MAY publish a dataset in this layout.
8
+
9
+ ## Directory layout
10
+
11
+ A dataset is rooted at a single **dataset root** directory. The following table defines the directories tooling recognizes:
12
+
13
+ | Directory | Status | Contents | Schema |
14
+ | ------------- | --------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------- |
15
+ | `tokens/` | **Required** | Cascade-format token files, named `*.tokens.json`. | [`cascade-file.schema.json`](../schemas/cascade-file.schema.json) |
16
+ | `components/` | Optional (registered) | One component declaration per `*.json` file. | [`component.schema.json`](../schemas/component.schema.json) |
17
+ | `fields/` | Optional (registered) | Name-object field declarations, one or more `*.json` files. | [`field.schema.json`](../schemas/field.schema.json) |
18
+ | `mode-sets/` | Optional (registered) | Mode set declarations, one per `*.json` file. | [`mode-set.schema.json`](../schemas/mode-set.schema.json) |
19
+ | `registry/` | Optional (registered) | Registry value collections (vocabulary), one or more `*.json` files. | [`registry-value.json`](../schemas/registry-value.json) |
20
+
21
+ **NORMATIVE:** A conformant dataset **MUST** contain a `tokens/` directory holding at least one `*.tokens.json` file. A dataset with no `tokens/` directory, or a `tokens/` directory containing no `*.tokens.json` file, is **not** conformant.
22
+
23
+ **NORMATIVE:** When a **registered** directory name (`components/`, `fields/`, `mode-sets/`, `registry/`) is present, the files it contains **MUST** validate against the schema named above. Tooling validating a dataset **MUST** validate the files in every registered directory that is present.
24
+
25
+ **RECOMMENDED:** A registered directory that exists **SHOULD** contain at least one conformant `*.json` file. An empty registered directory is permitted but **SHOULD** produce a warning, since it usually indicates incomplete data rather than intent.
26
+
27
+ **NORMATIVE:** Directory names not listed above carry no special meaning and are ignored by dataset-layout validation. Tooling **MUST NOT** treat an unrecognized sibling directory as an error.
28
+
29
+ ### File-naming patterns
30
+
31
+ | Directory | Pattern | Notes |
32
+ | ------------- | ------------------ | ------------------------------------------------------------------------------ |
33
+ | `tokens/` | `**/*.tokens.json` | May be nested in subdirectories; only `*.tokens.json` files are token sources. |
34
+ | `components/` | `*.json` | One declaration per file. |
35
+ | `fields/` | `*.json` | The catalog MAY be split across multiple files. |
36
+ | `mode-sets/` | `*.json` | One declaration per file. |
37
+ | `registry/` | `*.json` | One value collection per file. |
38
+
39
+ ## Dataset discovery
40
+
41
+ Tooling that operates on "the current dataset" (rather than an explicit path) **MUST** resolve the dataset root using the following precedence. The first match wins; later tiers are only consulted when an earlier tier does not resolve a value.
42
+
43
+ 1. **Explicit override** — a path passed directly by the caller (CLI positional argument or `--*-path` flag, environment variable). Explicit overrides always win.
44
+ 2. **Config file** — a `.design-data.toml` discovered by walking **up** the ancestor chain from the working directory. A `[source]` block of `type = "path"` names the dataset root (resolved relative to the config file's directory). This is the explicit, portable way to point a project at a dataset outside its own tree.
45
+ 3. **In-repo probing** — when running inside a monorepo checkout, probe for the standard layout relative to the working directory (`packages/design-data/tokens` and one level up). This preserves the in-repo workflow with zero configuration.
46
+ 4. **Embedded snapshot** — when no dataset is found on disk, tooling MAY fall back to a snapshot of the foundation dataset embedded in the binary, materialized to a local cache directory.
47
+
48
+ **NORMATIVE:** The required directory (`tokens/`) and registered optional directories are resolved **relative to the dataset root** determined above. A discovery tier that resolves a dataset root **MUST** look for `tokens/`, `components/`, `fields/`, `mode-sets/`, and `registry/` directly under that root.
49
+
50
+ The reference implementation of this algorithm lives in the SDK at `sdk/core/src/data_source/mod.rs` (`resolve`, `from_root`, and `probe_cwd`).
51
+
52
+ ## Root descriptor
53
+
54
+ A dataset **MAY** carry a root **descriptor** to make its structure and target spec version explicit. Two forms are recognized:
55
+
56
+ * **`.design-data.toml`** — a project-level config (TOML) that primarily declares where the dataset lives (`[source]`) and cache overrides. It is consumed during [discovery](#dataset-discovery) tier 2.
57
+ * **`dataset.json`** — an OPTIONAL JSON descriptor placed at the dataset root that **MAY** declare which optional directories are present, pin the spec version the dataset targets, and override default discovery paths. It **MUST** conform to [`dataset.schema.json`](../schemas/dataset.schema.json) (canonical `$id`: `https://opensource.adobe.com/spectrum-design-data/schemas/v0/dataset.schema.json`).
58
+
59
+ **NORMATIVE:** Neither descriptor is required. A dataset with a conformant `tokens/` directory and no descriptor is fully conformant. When a `dataset.json` is present it **MUST** validate against `dataset.schema.json`, but its absence **MUST NOT** be treated as an error.
60
+
61
+ ## Structural validation
62
+
63
+ **NORMATIVE:** Validators implementing rule **`SPEC-044`** (`dataset-structure`) **MUST** report an **error** when a dataset path lacks a `tokens/` directory containing at least one `*.tokens.json` file. The check **MUST** fire **before** token- and component-level rules so that downstream rules can assume the dataset structure is present, and so that an incomplete dataset produces a clear "dataset structure is incomplete" diagnostic rather than a cascade of confusing per-file errors.
64
+
65
+ **RECOMMENDED:** Validators implementing `SPEC-044` **SHOULD** emit a **warning** when a registered optional directory is present but contains no conformant `*.json` file. See `rules/rules.yaml` for the full rule definition.
66
+
67
+ ## References
68
+
69
+ * [#1114 — Define normative dataset-directory layout and add SPEC-044 structural pre-check](https://github.com/adobe/spectrum-design-data/issues/1114)
70
+ * [#1113 — Consolidate Spectrum design data into a single package](https://github.com/adobe/spectrum-design-data/pull/1113)
71
+ * [#714 — Design Data Specification (umbrella)](https://github.com/adobe/spectrum-design-data/discussions/714)
72
+ * [#715 — Distributed Design Data Architecture](https://github.com/adobe/spectrum-design-data/discussions/715)
package/spec/index.md CHANGED
@@ -25,6 +25,7 @@ The specification defines:
25
25
  11. **Document blocks** — typed prose blocks attachable to tokens, components, and anatomy parts; makes design guidance machine-readable and agent-queryable ([Document blocks](document-blocks.md)).
26
26
  12. **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](agent-surface.md)).
27
27
  13. **Evolution** — deprecation lifecycle, migration windows, change classification, and legacy format contract ([Evolution](evolution.md)).
28
+ 14. **Dataset layout** — normative directory structure of a dataset (`tokens/`, `components/`, `fields/`, `mode-sets/`, `registry/`), discovery algorithm, and optional root descriptor ([Dataset layout](dataset-layout.md)).
28
29
 
29
30
  ## Conformance
30
31
 
@@ -77,6 +78,7 @@ Full governance (compatibility tiers, migration, CLI `--spec-version`) is discus
77
78
  | [Document blocks](document-blocks.md) | Typed prose blocks (purpose, guideline, accessibility, do-dont, examples) attachable to any entity. |
78
79
  | [Agent-readable surface](agent-surface.md) | Transport contracts (CLI, MCP, Agent Skill) and operation catalog for AI agents consuming spec-conformant design data. |
79
80
  | [Evolution](evolution.md) | Deprecation lifecycle, migration windows, change classification. |
81
+ | [Dataset layout](dataset-layout.md) | Normative dataset directory structure, discovery algorithm, optional root descriptor, and SPEC-044 structural pre-check. |
80
82
 
81
83
  ## JSON Schema `$id` and versioning
82
84
 
@@ -93,11 +95,11 @@ Packaged copies in this repository live under `packages/design-data-spec/schemas
93
95
 
94
96
  ## Relationship to existing Adobe packages
95
97
 
96
- | Package / area | Relationship |
97
- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
98
- | `@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](https://github.com/adobe/spectrum-design-data/issues/723)). |
99
- | `@adobe/design-system-registry` | Registry enums and component metadata MAY be referenced by validation rules (e.g. component association); exact coupling is Layer 2. |
100
- | `@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. |
98
+ | Package / area | Relationship |
99
+ | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
100
+ | `@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](https://github.com/adobe/spectrum-design-data/issues/723)). |
101
+ | `@adobe/spectrum-design-data` | Registry enums (under `registry/`) and component metadata MAY be referenced by validation rules (e.g. component association); exact coupling is Layer 2. |
102
+ | `@adobe/spectrum-component-api-schemas` | Will become a thin adapter over component declarations in `packages/design-data/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. |
101
103
 
102
104
  ## Umbrella discussions
103
105
 
package/spec/mode-sets.md CHANGED
@@ -35,7 +35,7 @@ These mode sets are declared in the `mode-sets/` catalog (see [Mode Set catalog]
35
35
 
36
36
  ## Mode Set catalog
37
37
 
38
- The Spectrum foundation publishes mode set declarations as JSON files under `packages/design-data-spec/mode-sets/`. Each file conforms to [`mode-set.schema.json`](../schemas/mode-set.schema.json).
38
+ The Spectrum foundation publishes mode set declarations as JSON files under `packages/design-data/mode-sets/`. Each file conforms to [`mode-set.schema.json`](../schemas/mode-set.schema.json).
39
39
 
40
40
  **NORMATIVE:** Tooling (validators, resolution engine) **MUST** load mode set declarations from the dataset's mode set catalog before performing specificity calculations or coverage validation.
41
41
 
package/spec/registry.md CHANGED
@@ -6,15 +6,13 @@ This document defines the **design system registry**: the set of named value col
6
6
 
7
7
  ## What a registry is
8
8
 
9
- A **registry** is a JSON file in `@adobe/design-system-registry` that declares an ordered list of named values. Each value has at minimum an `id` (the canonical string used in token names and component files) and a `label` (a human-readable display name). Values **MAY** carry additional fields such as `description`, `aliases`, `deprecated`, and `usedIn`.
9
+ A **registry** is a JSON file in `@adobe/spectrum-design-data` (under `registry/`) that declares an ordered list of named values. Each value has at minimum an `id` (the canonical string used in token names and component files) and a `label` (a human-readable display name). Values **MAY** carry additional fields such as `description`, `aliases`, `deprecated`, and `usedIn`.
10
10
 
11
11
  Registries are the authoritative source of truth for vocabulary validation. A validator SHOULD flag token field values that are not present in the corresponding registry (typically as a warning, not an error — see field declarations in the field catalog).
12
12
 
13
13
  ## Packaging strategy
14
14
 
15
- All registries ship as a **single package**: `@adobe/design-system-registry`. The three semantically distinct registries described below are separate JSON files within that package. Independent sub-package splits are explicitly deferred.
16
-
17
- **Rationale:** No external consumers currently require independent semver versioning of individual registries. A single package is cheaper to maintain, simpler to consume, and avoids the proliferation of tiny packages with coordinated versioning overhead. If independent versioning needs emerge in a future release, the split can be done with a standard deprecation window per [Evolution](evolution.md).
15
+ All registries ship within **`@adobe/spectrum-design-data`** under the `registry/` directory. The three semantically distinct registries described below are separate JSON files in that directory.
18
16
 
19
17
  ## Registries
20
18
 
@@ -32,7 +30,7 @@ Anatomy terms fall into three tiers:
32
30
  | Composite | Another component used as a named part | `checkbox`, `close-button`, `popover`, `avatar` |
33
31
  | Component-specific | Unique to one component | `loupe`, `gripper`, `hold-icon` |
34
32
 
35
- **File:** `packages/design-system-registry/registry/anatomy-terms.json`\
33
+ **File:** `packages/design-data/registry/anatomy-terms.json`\
36
34
  **Validated by:** SPEC-020, SPEC-023, SPEC-024, SPEC-025, SPEC-035 (advisory — anatomy part `name` values SHOULD match the anatomy-terms registry)\
37
35
  **See also:** [Taxonomy — Component anatomy vs. token objects](taxonomy.md#component-anatomy-vs-token-objects), [Anatomy format](anatomy-format.md)
38
36
 
@@ -50,7 +48,7 @@ Validates the `object` field on token name objects.
50
48
  | `visual` | Visible graphic element area (may be inset from edge) |
51
49
  | `content` | Main content area |
52
50
 
53
- **File:** `packages/design-system-registry/registry/token-objects.json`\
51
+ **File:** `packages/design-data/registry/token-objects.json`\
54
52
  **Validated by:** SPEC-009 (advisory — `name.object` field values SHOULD match the token-objects registry)\
55
53
  **See also:** [Taxonomy — Token objects (styling surfaces)](taxonomy.md#token-objects-styling-surfaces)
56
54
 
@@ -60,7 +58,7 @@ Validates the `category` field on component declarations.
60
58
 
61
59
  **What it contains:** Top-level categories for organizing components by purpose and interaction type. Used for documentation navigation and tooling filters.
62
60
 
63
- **File:** `packages/design-system-registry/registry/categories.json`\
61
+ **File:** `packages/design-data/registry/categories.json`\
64
62
  **Validated by:** SPEC-034 (advisory — `meta.category` field values SHOULD match the categories registry)\
65
63
  **See also:** [Component format](component-format.md)
66
64
 
@@ -72,7 +70,7 @@ Registry IDs are scoped to their registry. The same ID **MAY** appear in multipl
72
70
 
73
71
  ## Other registries in the package
74
72
 
75
- The following registries exist in `@adobe/design-system-registry` but are not part of the three-registry boundary defined above. They validate other token name fields and component metadata fields:
73
+ The following registries exist in `@adobe/spectrum-design-data` (under `registry/`) but are not part of the three-registry boundary defined above. They validate other token name fields and component metadata fields:
76
74
 
77
75
  | Registry | File | Validates |
78
76
  | ----------------- | ------------------------ | ------------------------------------ |
package/spec/taxonomy.md CHANGED
@@ -60,19 +60,19 @@ The following concept categories are defined in Spectrum's foundation field cata
60
60
 
61
61
  **NORMATIVE:** Each category listed below corresponds to a field on the token [name object](token-format.md). Tokens **MAY** use any subset of these fields. Exception: `property` is REQUIRED on every name object — see [token-format.md](token-format.md#name-object).
62
62
 
63
- | Category | Name object field | Answers | Description |
64
- | ------------- | ----------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
65
- | 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. |
66
- | Sub-structure | `substructure` | What? | A structure within an element that should only exist within the context of its parent structure. |
67
- | Component | `component` | What? | Component scope when the token is component-scoped. |
68
- | Anatomy | `anatomy` | What? | A visible, named part of a component as defined by designers. |
69
- | Object | `object` | Where? | The styling surface to which a visual property is applied (e.g. background, border, edge). |
70
- | 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`](../../packages/design-system-registry/registry/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](token-format.md#name-object-migration-policy) for migration guidance. |
71
- | Orientation | `orientation` | When/Why? | The direction or order of structures and elements within a component or pattern. |
72
- | Position | `position` | When/Why? | The location of an object relative to another, with or without respect to directional order. |
73
- | Size | `size` | When/Why? | Relative terms used to create relationships and patterns of usage across multiple tokens and token types. |
74
- | Density | `density` | When/Why? | Options that create more or less space within or around the parts of a component. |
75
- | 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). |
63
+ | Category | Name object field | Answers | Description |
64
+ | ------------- | ----------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
65
+ | 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. |
66
+ | Sub-structure | `substructure` | What? | A structure within an element that should only exist within the context of its parent structure. |
67
+ | Component | `component` | What? | Component scope when the token is component-scoped. |
68
+ | Anatomy | `anatomy` | What? | A visible, named part of a component as defined by designers. |
69
+ | Object | `object` | Where? | The styling surface to which a visual property is applied (e.g. background, border, edge). |
70
+ | 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`](../../packages/design-data/registry/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](token-format.md#name-object-migration-policy) for migration guidance. |
71
+ | Orientation | `orientation` | When/Why? | The direction or order of structures and elements within a component or pattern. |
72
+ | Position | `position` | When/Why? | The location of an object relative to another, with or without respect to directional order. |
73
+ | Size | `size` | When/Why? | Relative terms used to create relationships and patterns of usage across multiple tokens and token types. |
74
+ | Density | `density` | When/Why? | Options that create more or less space within or around the parts of a component. |
75
+ | 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). |
76
76
 
77
77
  Additional categories for variant and state are inherited from the existing name object:
78
78
 
@@ -87,10 +87,10 @@ Color tokens describe palette entries and semantic color assignments. Their name
87
87
 
88
88
  **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).
89
89
 
90
- | Category | Name object field | Answers | Description |
91
- | ------------ | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
92
- | Color Family | `colorFamily` | What? | Hue family of the color (e.g. `blue`, `gray`, `celery`, `transparent-black`). Values come from [`color-families.json`](../../packages/design-system-registry/registry/color-families.json). |
93
- | Ramp Index | `scaleIndex` | Which? | Numeric perceptual ramp step (e.g. `100`, `400`, `900`, `1600`). Shared with layout tokens; see [scaleIndex field declaration](../fields/scaleIndex.json). Not scope-restricted. |
90
+ | Category | Name object field | Answers | Description |
91
+ | ------------ | ----------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
92
+ | Color Family | `colorFamily` | What? | Hue family of the color (e.g. `blue`, `gray`, `celery`, `transparent-black`). Values come from [`color-families.json`](../../packages/design-data/registry/color-families.json). |
93
+ | Ramp Index | `scaleIndex` | Which? | Numeric perceptual ramp step (e.g. `100`, `400`, `900`, `1600`). Shared with layout tokens; see [scaleIndex field declaration](../fields/scaleIndex.json). Not scope-restricted. |
94
94
 
95
95
  **Default serialization order for color tokens:**
96
96
 
@@ -106,13 +106,13 @@ Typography tokens describe typeface attributes: family, weight, style, and numer
106
106
 
107
107
  **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).
108
108
 
109
- | Category | Name object field | Answers | Description |
110
- | --------- | ----------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
111
- | Family | `family` | What? | Type family of the token (e.g. `sans-serif`, `serif`, `cjk`, `code`). Values come from [`typography-families.json`](../../packages/design-system-registry/registry/typography-families.json). |
112
- | Weight | `weight` | How? | Typographic weight (e.g. `regular`, `bold`, `light`, `black`). Values come from [`typography-weights.json`](../../packages/design-system-registry/registry/typography-weights.json). |
113
- | 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`](../../packages/design-system-registry/registry/typography-styles.json). |
114
- | Alignment | `alignment` | How? | Horizontal text-alignment direction (e.g. `start`, `center`, `end`). Corresponds to the CSS `text-align` axis. Values come from [`alignments.json`](../../packages/design-system-registry/registry/alignments.json). |
115
- | Scale | `scaleIndex` | Which? | Numeric size scale step (e.g. `75`, `100`, `200`). Shared with other token types; not scope-restricted. |
109
+ | Category | Name object field | Answers | Description |
110
+ | --------- | ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
111
+ | Family | `family` | What? | Type family of the token (e.g. `sans-serif`, `serif`, `cjk`, `code`). Values come from [`typography-families.json`](../../packages/design-data/registry/typography-families.json). |
112
+ | Weight | `weight` | How? | Typographic weight (e.g. `regular`, `bold`, `light`, `black`). Values come from [`typography-weights.json`](../../packages/design-data/registry/typography-weights.json). |
113
+ | 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`](../../packages/design-data/registry/typography-styles.json). |
114
+ | Alignment | `alignment` | How? | Horizontal text-alignment direction (e.g. `start`, `center`, `end`). Corresponds to the CSS `text-align` axis. Values come from [`alignments.json`](../../packages/design-data/registry/alignments.json). |
115
+ | Scale | `scaleIndex` | Which? | Numeric size scale step (e.g. `75`, `100`, `200`). Shared with other token types; not scope-restricted. |
116
116
 
117
117
  **Default serialization order for typography tokens:**
118
118
 
@@ -130,11 +130,11 @@ Motion tokens describe timing, easing, and animation role for UI animation. Thei
130
130
 
131
131
  **NORMATIVE:** Motion tokens SHOULD include `motionRole` or `easing`. Tokens missing both are flagged by rule SPEC-043 (`domain-required-fields`, warning).
132
132
 
133
- | Category | Name object field | Answers | Description |
134
- | ----------- | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
135
- | Motion Role | `motionRole` | What? | Semantic role of the animation (e.g. `enter`, `exit`, `transition`, `emphasis`). Values come from [`motion-roles.json`](../../packages/design-system-registry/registry/motion-roles.json). |
136
- | Easing | `easing` | How? | Easing curve identifier (e.g. `ease-in`, `ease-out`, `standard`). Values come from [`easing-curves.json`](../../packages/design-system-registry/registry/easing-curves.json). |
137
- | Duration | `scaleIndex` | Which? | Numeric duration bucket index (e.g. `100` for 100ms, `200` for 200ms). Shared with other token types; not scope-restricted. |
133
+ | Category | Name object field | Answers | Description |
134
+ | ----------- | ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
135
+ | Motion Role | `motionRole` | What? | Semantic role of the animation (e.g. `enter`, `exit`, `transition`, `emphasis`). Values come from [`motion-roles.json`](../../packages/design-data/registry/motion-roles.json). |
136
+ | Easing | `easing` | How? | Easing curve identifier (e.g. `ease-in`, `ease-out`, `standard`). Values come from [`easing-curves.json`](../../packages/design-data/registry/easing-curves.json). |
137
+ | Duration | `scaleIndex` | Which? | Numeric duration bucket index (e.g. `100` for 100ms, `200` for 200ms). Shared with other token types; not scope-restricted. |
138
138
 
139
139
  **Default serialization order for motion tokens:**
140
140
 
@@ -229,7 +229,7 @@ Semantic fields describe identity, structure, and intent. They are used for quer
229
229
 
230
230
  **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.
231
231
 
232
- 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`.
232
+ Semantic fields are those declared with `kind: "semantic"` in the field catalog. The authoritative list for any given design system is determined by its field catalog declarations (see `packages/design-data/fields/` for Spectrum's catalog).
233
233
 
234
234
  ### Mode-set fields
235
235
 
@@ -237,7 +237,7 @@ Mode-set fields represent axes of variation that drive the [cascade](cascade.md)
237
237
 
238
238
  **NORMATIVE:** Mode-set field values are validated against declared [mode set](mode-sets.md) modes with **strict** severity (error). An invalid mode value would silently fail to match any context during cascade resolution.
239
239
 
240
- 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](mode-sets.md). In Spectrum's foundation catalog, the standard mode-set fields are: `colorScheme`, `scale`, `contrast`.
240
+ 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](mode-sets.md). The authoritative list for any given design system is determined by its field catalog and mode-set declarations (see `packages/design-data/fields/` for Spectrum's catalog).
241
241
 
242
242
  See [Mode Sets](mode-sets.md) for mode set declarations, modes, and defaults.
243
243
 
@@ -281,7 +281,7 @@ package to avoid bumping the tokens version on every taxonomy change.
281
281
  | ----------------- | ----------------------------------- | -------------------------------------------------------------------------------- |
282
282
  | Token source data | `packages/tokens/src/*.json` | `$schema`, `value`, `uuid`, `sets`, … — no `name` field |
283
283
  | Taxonomy sidecar | `packages/token-names/names/*.json` | `{ "<slug>": { property, colorFamily, … }, … }` — one file per token source file |
284
- | Field definitions | `packages/design-data-spec/fields/` | Authoritative field catalog with scope and type |
284
+ | Field definitions | `packages/design-data/fields/` | Authoritative field catalog with scope and type |
285
285
 
286
286
  The sidecar package (`@adobe/token-names`) is **private** (not published to npm).
287
287
  Its delivery format for downstream consumers is TBD.
@@ -98,7 +98,15 @@ The table below lists all semantic fields. Fields marked with a scope are domain
98
98
 
99
99
  ### Alias (`$ref`)
100
100
 
101
- When **`$ref`** is present, the token is an **alias**. The value **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`).
101
+ When **`$ref`** is present, the token is an **alias**. The value **MUST** be a non-empty string. In cascade format the value is the **UUID** of the target token (rename-proof, resolved via the graph's `uuid_index`). In the legacy transition format the value is the target token's kebab-case name (serialized legacy slug). Both forms are accepted; resolution rules are Layer 2 (see rule `SPEC-001` in `rules/rules.yaml`).
102
+
103
+ ```json
104
+ // Cascade canonical form (recommended) — the UUID is stable across renames.
105
+ { "name": { "property": "accent-background-color", "state": "default", "colorScheme": "dark" },
106
+ "$schema": "…/alias.json",
107
+ "$ref": "87a2c8f0-54fd-4939-8f42-3124fde1e49e",
108
+ "uuid": "f24eb871-6419-4cef-88a2-cca8548ae31e" }
109
+ ```
102
110
 
103
111
  ### Literal `value`
104
112
 
@@ -179,7 +187,7 @@ No string-named token may remain in a conforming dataset after the `2.0.0` cut w
179
187
 
180
188
  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.
181
189
 
182
- **NORMATIVE:** Values for `property` **SHOULD** come from the [`property-terms`](../../packages/design-system-registry/registry/property-terms.json) registry. Non-registry values emit an advisory warning (SPEC-009 applied to the `property` field).
190
+ **NORMATIVE:** Values for `property` **SHOULD** come from the [`property-terms`](../../packages/design-data/registry/property-terms.json) registry. Non-registry values emit an advisory warning (SPEC-009 applied to the `property` field).
183
191
 
184
192
  Examples of **valid** `property` values: `color`, `background-color`, `border-radius`, `font-size`, `gap`, `opacity`.
185
193
 
@@ -268,7 +276,7 @@ Within a composite value, a string sub-value **MAY** be an **inline alias**: a r
268
276
  }
269
277
  ```
270
278
 
271
- **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.
279
+ **NORMATIVE:** In legacy format, inline aliases use the syntax `{token-name}` (curly-brace-wrapped token property name). In cascade format, top-level `$ref` aliases use a UUID (canonical, rename-proof); inline composite aliases within `value` objects remain `{token-name}` for backward compatibility. UUID-based inline composite aliases are reserved for a future spec version.
272
280
 
273
281
  **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).
274
282