@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
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "rule_id": "SPEC-009",
6
6
  "severity": "warning",
7
- "message_pattern": ".*not in the design-system-registry.*"
7
+ "message_pattern": ".*not in the spectrum-design-data.*"
8
8
  }
9
9
  ]
10
10
  }
@@ -5,5 +5,12 @@
5
5
  "value": "#ff0000"
6
6
  }
7
7
  ],
8
- "components": []
8
+ "components": [
9
+ {
10
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/components/button.json",
11
+ "name": "button",
12
+ "displayName": "Button",
13
+ "meta": { "category": "actions" }
14
+ }
15
+ ]
9
16
  }
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "rule_id": "SPEC-034",
6
6
  "severity": "warning",
7
- "message_pattern": ".*not in the design-system-registry categories vocabulary.*"
7
+ "message_pattern": ".*not in the spectrum-design-data registry/categories vocabulary.*"
8
8
  }
9
9
  ]
10
10
  }
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "rule_id": "SPEC-035",
6
6
  "severity": "warning",
7
- "message_pattern": ".*not in the design-system-registry anatomy-terms vocabulary.*"
7
+ "message_pattern": ".*not in the spectrum-design-data registry/anatomy-terms vocabulary.*"
8
8
  }
9
9
  ]
10
10
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-044",
6
+ "severity": "warning",
7
+ "message_pattern": ".*components/.*contains no.*json.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": [
4
+ {
5
+ "rule_id": "SPEC-044",
6
+ "severity": "error",
7
+ "message_pattern": ".*tokens/.*not found.*"
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$id": "https://opensource.adobe.com/spectrum-design-data/conformance/valid/SPEC-044/button.json",
3
+ "name": "button",
4
+ "displayName": "Button",
5
+ "meta": {
6
+ "category": "actions",
7
+ "documentationUrl": "https://spectrum.adobe.com/page/button/"
8
+ }
9
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "layer": 2,
3
+ "errors": []
4
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adobe/design-data-spec",
3
- "version": "1.5.0",
4
- "description": "Design Data Specification — prose, JSON Schemas, rule catalog, and conformance fixtures for Spectrum design data",
3
+ "version": "2.1.0",
4
+ "description": "Design Data Specification — prose, JSON Schemas, rule catalog, and conformance fixtures for the design data format",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -20,7 +20,6 @@
20
20
  },
21
21
  "exports": {
22
22
  "./package.json": "./package.json",
23
- "./components/*.json": "./components/*.json",
24
23
  "./schemas/token.schema.json": "./schemas/token.schema.json",
25
24
  "./schemas/mode-set.schema.json": "./schemas/mode-set.schema.json",
26
25
  "./schemas/field.schema.json": "./schemas/field.schema.json",
@@ -29,12 +28,13 @@
29
28
  "./schemas/component.schema.json": "./schemas/component.schema.json",
30
29
  "./schemas/anatomy-part.schema.json": "./schemas/anatomy-part.schema.json",
31
30
  "./schemas/state-declaration.schema.json": "./schemas/state-declaration.schema.json",
32
- "./rules/rules.yaml": "./rules/rules.yaml"
31
+ "./rules/rules.yaml": "./rules/rules.yaml",
32
+ "./schemas/registry-value.json": "./schemas/registry-value.json",
33
+ "./schemas/platform-extension.json": "./schemas/platform-extension.json",
34
+ "./schemas/dataset.schema.json": "./schemas/dataset.schema.json"
33
35
  },
34
36
  "files": [
35
- "components",
36
37
  "conformance",
37
- "fields",
38
38
  "rules",
39
39
  "schemas",
40
40
  "spec",
package/rules/rules.yaml CHANGED
@@ -78,8 +78,8 @@ rules:
78
78
  name: name-field-enum-sync
79
79
  severity: warning
80
80
  category: naming-consistency
81
- 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.
82
- message: "Token name field '{field}' value '{value}' is not in the design-system-registry enum for '{field}'"
81
+ assert: Recognized name object fields (component, state, variant, etc.) SHOULD use values drawn from the corresponding spectrum-design-data registry when those enums are available.
82
+ message: "Token name field '{field}' value '{value}' is not in the spectrum-design-data registry for '{field}'"
83
83
  spec_ref: spec/token-format.md#name-object
84
84
  introduced_in: "1.0.0-draft"
85
85
 
@@ -161,6 +161,7 @@ rules:
161
161
  category: reference-integrity
162
162
  assert: Token name-object 'component' field value MUST match the 'name' of a declared component in the dataset.
163
163
  message: "Token '{token}' references undeclared component '{component}'"
164
+ note: "Skipped when no component catalog is loaded (empty components list). Token-only validation runs that omit component declarations will not trigger this rule."
164
165
  spec_ref: spec/component-format.md#name
165
166
  introduced_in: "1.0.0-draft"
166
167
 
@@ -327,9 +328,9 @@ rules:
327
328
  category: naming-consistency
328
329
  assert: >
329
330
  A component's meta.category SHOULD reference an id from the categories registry in
330
- @adobe/design-system-registry (categories.json). Unknown values are reported as
331
+ @adobe/spectrum-design-data registry/categories.json. Unknown values are reported as
331
332
  warnings; the registry is the authoritative vocabulary.
332
- message: "Component '{entity}' meta.category value '{value}' is not in the design-system-registry categories vocabulary"
333
+ message: "Component '{entity}' meta.category value '{value}' is not in the spectrum-design-data registry/categories vocabulary"
333
334
  spec_ref: spec/registry.md#categories
334
335
  introduced_in: "1.0.0-draft"
335
336
  - id: SPEC-035
@@ -338,9 +339,9 @@ rules:
338
339
  category: naming-consistency
339
340
  assert: >
340
341
  A component anatomy part's name SHOULD reference an id from the anatomy-terms registry in
341
- @adobe/design-system-registry (anatomy-terms.json). Unknown values are reported as
342
+ @adobe/spectrum-design-data registry/anatomy-terms.json. Unknown values are reported as
342
343
  warnings; custom names remain permitted but the registry is the authoritative vocabulary.
343
- message: "Component '{entity}' anatomy part name '{value}' is not in the design-system-registry anatomy-terms vocabulary"
344
+ message: "Component '{entity}' anatomy part name '{value}' is not in the spectrum-design-data registry/anatomy-terms vocabulary"
344
345
  spec_ref: spec/anatomy-format.md#canonical-anatomy-vocabulary
345
346
  introduced_in: "1.0.0-draft"
346
347
 
@@ -452,7 +453,7 @@ rules:
452
453
  color-domain token. Using a color-scoped field on a typography token, or a
453
454
  typography-scoped field on a color token, is a taxonomy violation. The set of
454
455
  domain-scoped fields and their valid schema URL suffixes is declared in the field
455
- catalog under `packages/design-data-spec/fields/` via the `scope` property.
456
+ catalog under `packages/design-data/fields/` via the `scope` property.
456
457
  Tokens without a `$schema` are skipped (domain cannot be determined).
457
458
  message: "name.{field} is a {scope}-scoped field but token schema '{effective_schema}' is not a {scope} token type"
458
459
  spec_ref: spec/taxonomy.md#token-type-taxonomies
@@ -476,3 +477,22 @@ rules:
476
477
  message: "{domain} token has a name object but no domain-identifying field — add at least one of: {required_fields}"
477
478
  spec_ref: spec/taxonomy.md#token-type-taxonomies
478
479
  introduced_in: "1.0.0-draft"
480
+
481
+ - id: SPEC-044
482
+ name: dataset-structure
483
+ severity: error
484
+ layer: 2
485
+ category: structure
486
+ assert: >
487
+ A conformant dataset MUST contain a `tokens/` directory holding at least one
488
+ `*.tokens.json` file. This structural pre-check fires before token- and
489
+ component-level rules so that downstream rules can assume the dataset structure
490
+ is present, and an incomplete dataset produces a clear "structure is incomplete"
491
+ diagnostic rather than a cascade of confusing per-file errors. A registered
492
+ optional directory (`components/`, `fields/`, `mode-sets/`, `registry/`) that is
493
+ present SHOULD contain at least one conformant `*.json` file; an empty registered
494
+ directory is reported as a warning. Because this rule inspects the on-disk
495
+ directory layout it runs as a filesystem pre-pass, not against the in-memory graph.
496
+ message: "Dataset structure incomplete: {detail}"
497
+ spec_ref: spec/dataset-layout.md#structural-validation
498
+ introduced_in: "1.0.0-draft"
@@ -89,7 +89,7 @@
89
89
  "category": {
90
90
  "type": "string",
91
91
  "minLength": 1,
92
- "description": "Category id from @adobe/design-system-registry categories.json. Advisory validation via SPEC-034."
92
+ "description": "Category id from @adobe/spectrum-design-data registry/categories.json. Advisory validation via SPEC-034."
93
93
  },
94
94
  "documentationUrl": {
95
95
  "type": "string",
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/v0/dataset.schema.json",
4
+ "title": "Dataset root descriptor",
5
+ "description": "Optional root descriptor (dataset.json) a design-data dataset MAY carry to declare which optional directories are present, pin the targeted spec version, and override default discovery paths. Absence of this file is not an error; see spec/dataset-layout.md.",
6
+ "type": "object",
7
+ "properties": {
8
+ "specVersion": {
9
+ "type": "string",
10
+ "minLength": 1,
11
+ "description": "The spec version this dataset targets (e.g. \"1.0.0-draft\")."
12
+ },
13
+ "directories": {
14
+ "type": "object",
15
+ "description": "Declares which registered directories the dataset provides. List a directory key with the value true to declare it present and authoritative; omit the key otherwise. The value is constrained to true so the flag cannot be used to negate a directory's presence (in particular it cannot waive the required tokens/ directory).",
16
+ "properties": {
17
+ "tokens": { "const": true },
18
+ "components": { "const": true },
19
+ "fields": { "const": true },
20
+ "modeSets": { "const": true },
21
+ "registry": { "const": true }
22
+ },
23
+ "additionalProperties": false
24
+ },
25
+ "paths": {
26
+ "type": "object",
27
+ "description": "Optional overrides for the default discovery paths, relative to the dataset root. When omitted, tooling uses the conventional directory names defined in spec/dataset-layout.md.",
28
+ "properties": {
29
+ "tokens": { "type": "string", "minLength": 1 },
30
+ "components": { "type": "string", "minLength": 1 },
31
+ "fields": { "type": "string", "minLength": 1 },
32
+ "modeSets": { "type": "string", "minLength": 1 },
33
+ "registry": { "type": "string", "minLength": 1 }
34
+ },
35
+ "additionalProperties": false
36
+ }
37
+ },
38
+ "additionalProperties": false
39
+ }
@@ -94,29 +94,7 @@
94
94
  "conceptOrder": {
95
95
  "type": "array",
96
96
  "items": {
97
- "type": "string",
98
- "enum": [
99
- "variant",
100
- "component",
101
- "structure",
102
- "substructure",
103
- "anatomy",
104
- "object",
105
- "property",
106
- "orientation",
107
- "position",
108
- "size",
109
- "density",
110
- "shape",
111
- "state",
112
- "colorFamily",
113
- "family",
114
- "weight",
115
- "style",
116
- "motionRole",
117
- "easing",
118
- "alignment"
119
- ]
97
+ "type": "string"
120
98
  },
121
99
  "uniqueItems": true,
122
100
  "description": "Ordered list of field names for serialization. Values must match declared field names from the design system's field catalog (field.schema.json declarations). Replaces the default serialization.position order from each field declaration."
@@ -6,6 +6,10 @@
6
6
  "type": "object",
7
7
  "required": ["name", "modes", "default"],
8
8
  "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "format": "uri"
12
+ },
9
13
  "specVersion": {
10
14
  "const": "1.0.0-draft"
11
15
  },
@@ -0,0 +1,79 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/platform-extension.json",
4
+ "title": "Platform Extension",
5
+ "description": "Schema for platform-specific terminology extensions",
6
+ "type": "object",
7
+ "required": ["platform", "extends", "extensions"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "format": "uri"
12
+ },
13
+ "platform": {
14
+ "type": "string",
15
+ "description": "The platform this extension is for (e.g., iOS, Android, Web Components, Qt)"
16
+ },
17
+ "platformVersion": {
18
+ "type": "string",
19
+ "description": "Optional platform version or framework version"
20
+ },
21
+ "description": {
22
+ "type": "string",
23
+ "description": "Description of what this extension provides"
24
+ },
25
+ "extends": {
26
+ "type": "string",
27
+ "description": "Which registry this extends (sizes, states, variants, etc.)"
28
+ },
29
+ "extensions": {
30
+ "type": "array",
31
+ "description": "Array of term extensions",
32
+ "items": {
33
+ "$ref": "#/$defs/extension"
34
+ }
35
+ }
36
+ },
37
+ "$defs": {
38
+ "extension": {
39
+ "type": "object",
40
+ "required": ["termId"],
41
+ "properties": {
42
+ "termId": {
43
+ "type": "string",
44
+ "description": "The ID of the term being extended (must exist in the base registry)"
45
+ },
46
+ "platformTerm": {
47
+ "type": "string",
48
+ "description": "Platform-specific term or name"
49
+ },
50
+ "platformAliases": {
51
+ "type": "array",
52
+ "description": "Platform-specific aliases",
53
+ "items": {
54
+ "type": "string"
55
+ }
56
+ },
57
+ "notes": {
58
+ "type": "string",
59
+ "description": "Platform-specific implementation notes"
60
+ },
61
+ "reference": {
62
+ "type": "string",
63
+ "description": "Platform documentation reference or API name"
64
+ },
65
+ "codeExample": {
66
+ "type": "string",
67
+ "description": "Code example showing platform usage"
68
+ },
69
+ "differences": {
70
+ "type": "array",
71
+ "description": "Key differences from the base term",
72
+ "items": {
73
+ "type": "string"
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,230 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://opensource.adobe.com/spectrum-design-data/schemas/registry-value.json",
4
+ "title": "Registry Value",
5
+ "description": "Schema for design system registry value entries",
6
+ "type": "object",
7
+ "required": ["type", "description", "values"],
8
+ "properties": {
9
+ "$schema": {
10
+ "type": "string",
11
+ "format": "uri"
12
+ },
13
+ "type": {
14
+ "type": "string",
15
+ "description": "The type of registry (size, state, variant, etc.)"
16
+ },
17
+ "description": {
18
+ "type": "string",
19
+ "description": "Description of what this registry contains"
20
+ },
21
+ "allowCustom": {
22
+ "type": "boolean",
23
+ "description": "Whether custom values are allowed beyond the registry"
24
+ },
25
+ "customPattern": {
26
+ "type": "string",
27
+ "description": "Regex pattern for validating custom values"
28
+ },
29
+ "values": {
30
+ "type": "array",
31
+ "description": "Array of registry values",
32
+ "items": {
33
+ "$ref": "#/$defs/value"
34
+ }
35
+ }
36
+ },
37
+ "$defs": {
38
+ "value": {
39
+ "type": "object",
40
+ "required": ["id", "label"],
41
+ "properties": {
42
+ "id": {
43
+ "type": "string",
44
+ "description": "Unique identifier for this value"
45
+ },
46
+ "label": {
47
+ "type": "string",
48
+ "description": "Human-readable label"
49
+ },
50
+ "aliases": {
51
+ "type": "array",
52
+ "description": "Alternative names or spellings",
53
+ "items": {
54
+ "type": "string"
55
+ }
56
+ },
57
+ "description": {
58
+ "type": "string",
59
+ "description": "Detailed description of this value"
60
+ },
61
+ "default": {
62
+ "type": "boolean",
63
+ "description": "Whether this is the default value"
64
+ },
65
+ "deprecated": {
66
+ "type": "boolean",
67
+ "description": "Whether this value is deprecated"
68
+ },
69
+ "usedIn": {
70
+ "type": "array",
71
+ "description": "Where this value is used (tokens, component-schemas, etc.)",
72
+ "items": {
73
+ "type": "string"
74
+ }
75
+ },
76
+ "category": {
77
+ "type": "string",
78
+ "description": "Category or grouping for this value"
79
+ },
80
+ "value": {
81
+ "type": ["string", "number", "boolean"],
82
+ "description": "Actual value (if different from id)"
83
+ },
84
+ "documentationUrl": {
85
+ "type": "string",
86
+ "format": "uri",
87
+ "description": "URL to documentation"
88
+ },
89
+ "definition": {
90
+ "type": "object",
91
+ "description": "Structured definition following Spectrum naming methodology",
92
+ "properties": {
93
+ "superordinate": {
94
+ "type": "string",
95
+ "description": "The higher-level category or class this term belongs to"
96
+ },
97
+ "description": {
98
+ "type": "string",
99
+ "description": "Core definition explaining what it is and how it differs"
100
+ },
101
+ "essentialCharacteristics": {
102
+ "type": "array",
103
+ "description": "Key characteristics that distinguish this term",
104
+ "items": {
105
+ "type": "string"
106
+ }
107
+ }
108
+ }
109
+ },
110
+ "platforms": {
111
+ "type": "object",
112
+ "description": "Platform-specific terminology and notes",
113
+ "patternProperties": {
114
+ ".*": {
115
+ "type": "object",
116
+ "properties": {
117
+ "term": {
118
+ "type": "string",
119
+ "description": "Platform-specific term or name"
120
+ },
121
+ "notes": {
122
+ "type": "string",
123
+ "description": "Platform-specific implementation notes"
124
+ },
125
+ "reference": {
126
+ "type": "string",
127
+ "description": "Platform documentation reference"
128
+ }
129
+ }
130
+ }
131
+ }
132
+ },
133
+ "terminology": {
134
+ "type": "object",
135
+ "description": "Terminology metadata and classification",
136
+ "properties": {
137
+ "conceptType": {
138
+ "type": "string",
139
+ "enum": ["word", "term", "name", "concept"],
140
+ "description": "Classification per Spectrum naming guide"
141
+ },
142
+ "namingRationale": {
143
+ "type": "string",
144
+ "description": "Why this name was chosen"
145
+ },
146
+ "alternatives": {
147
+ "type": "array",
148
+ "description": "Alternative terms considered but not used",
149
+ "items": {
150
+ "type": "string"
151
+ }
152
+ }
153
+ }
154
+ },
155
+ "sources": {
156
+ "type": "array",
157
+ "description": "References to source documentation",
158
+ "items": {
159
+ "type": "object",
160
+ "required": ["type"],
161
+ "properties": {
162
+ "type": {
163
+ "type": "string",
164
+ "enum": [
165
+ "wiki",
166
+ "industry-standard",
167
+ "platform-standard",
168
+ "internal-doc",
169
+ "research"
170
+ ],
171
+ "description": "Type of source"
172
+ },
173
+ "url": {
174
+ "type": "string",
175
+ "format": "uri",
176
+ "description": "URL to source"
177
+ },
178
+ "reference": {
179
+ "type": "string",
180
+ "description": "Text reference or citation"
181
+ },
182
+ "date": {
183
+ "type": "string",
184
+ "format": "date",
185
+ "description": "Date of source or last update"
186
+ }
187
+ }
188
+ }
189
+ },
190
+ "governance": {
191
+ "type": "object",
192
+ "description": "Governance and ownership metadata",
193
+ "properties": {
194
+ "owner": {
195
+ "type": "string",
196
+ "description": "Team or person responsible for this term"
197
+ },
198
+ "reviewDate": {
199
+ "type": "string",
200
+ "format": "date",
201
+ "description": "Last review date"
202
+ },
203
+ "nextReviewDate": {
204
+ "type": "string",
205
+ "format": "date",
206
+ "description": "Scheduled next review date"
207
+ },
208
+ "status": {
209
+ "type": "string",
210
+ "enum": ["draft", "review", "approved", "deprecated"],
211
+ "description": "Current status of this term"
212
+ },
213
+ "replacedBy": {
214
+ "type": "string",
215
+ "description": "If deprecated, the term that replaces this one"
216
+ }
217
+ }
218
+ },
219
+ "relatedTerms": {
220
+ "type": "array",
221
+ "description": "Related or cross-referenced terms",
222
+ "items": {
223
+ "type": "string",
224
+ "description": "ID of related term"
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+ }
@@ -218,7 +218,7 @@
218
218
  "$ref": {
219
219
  "type": "string",
220
220
  "minLength": 1,
221
- "description": "Alias target path or stable token id (resolution is Layer 2)."
221
+ "description": "Alias target. In cascade format: the target token's UUID (canonical, rename-proof, resolved via uuid_index — Layer 2). In the legacy transition format: the target's kebab-case name slug."
222
222
  },
223
223
  "uuid": {
224
224
  "type": "string",