@documentation-robotics/cli 0.1.0 → 0.1.7

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 (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +208 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +162 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +42 -16
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -0,0 +1,3592 @@
1
+ {
2
+ "specVersion": "0.8.4",
3
+ "layer": {
4
+ "id": "ux",
5
+ "number": 9,
6
+ "name": "UX Layer",
7
+ "description": "Layer 9: UX Layer",
8
+ "inspired_by": {
9
+ "standard": "HTML 5.3",
10
+ "version": "5.3",
11
+ "url": "https://html.spec.whatwg.org/"
12
+ },
13
+ "node_types": [
14
+ "ux.actioncomponent",
15
+ "ux.actionpattern",
16
+ "ux.chartseries",
17
+ "ux.componentinstance",
18
+ "ux.componentreference",
19
+ "ux.dataconfig",
20
+ "ux.errorconfig",
21
+ "ux.experiencestate",
22
+ "ux.layoutconfig",
23
+ "ux.librarycomponent",
24
+ "ux.librarysubview",
25
+ "ux.stateaction",
26
+ "ux.stateactiontemplate",
27
+ "ux.statepattern",
28
+ "ux.statetransition",
29
+ "ux.subview",
30
+ "ux.tablecolumn",
31
+ "ux.transitiontemplate",
32
+ "ux.uxapplication",
33
+ "ux.uxlibrary",
34
+ "ux.uxspec",
35
+ "ux.view"
36
+ ]
37
+ },
38
+ "nodeSchemas": {
39
+ "actioncomponent": {
40
+ "$schema": "http://json-schema.org/draft-07/schema#",
41
+ "title": "ActionComponent",
42
+ "description": "Interactive element that triggers actions (button, menu, link, voice command)",
43
+ "allOf": [
44
+ {
45
+ "$ref": "urn:dr:spec:base:spec-node"
46
+ }
47
+ ],
48
+ "properties": {
49
+ "spec_node_id": {
50
+ "const": "ux.actioncomponent"
51
+ },
52
+ "layer_id": {
53
+ "const": "ux"
54
+ },
55
+ "type": {
56
+ "const": "actioncomponent"
57
+ },
58
+ "attributes": {
59
+ "type": "object",
60
+ "properties": {
61
+ "label": {
62
+ "type": "string"
63
+ },
64
+ "type": {
65
+ "type": "string",
66
+ "enum": [
67
+ "button",
68
+ "link",
69
+ "menu",
70
+ "voice-command",
71
+ "icon-button"
72
+ ],
73
+ "description": "Interactive element kind, per HTML 5.3 button, anchor, and menu element semantics."
74
+ },
75
+ "icon": {
76
+ "type": "string"
77
+ },
78
+ "disabled": {
79
+ "type": "boolean"
80
+ },
81
+ "tooltip": {
82
+ "type": "string"
83
+ },
84
+ "channel": {
85
+ "type": "string",
86
+ "enum": ["web", "mobile", "voice", "chat", "sms"],
87
+ "description": "Delivery channel for which this component is rendered."
88
+ },
89
+ "style": {
90
+ "type": "string",
91
+ "enum": [
92
+ "primary",
93
+ "secondary",
94
+ "danger",
95
+ "ghost",
96
+ "link",
97
+ "icon"
98
+ ],
99
+ "description": "Visual style variant of the action component, per design system button style conventions."
100
+ },
101
+ "validations": {
102
+ "type": "array",
103
+ "description": "Client-side validation rules applied to this component, per HTML 5.3 Constraint Validation API. Each rule specifies a constraint type, threshold value, and user-facing error message.",
104
+ "items": {
105
+ "type": "object",
106
+ "properties": {
107
+ "type": {
108
+ "type": "string",
109
+ "enum": [
110
+ "required",
111
+ "minlength",
112
+ "maxlength",
113
+ "pattern",
114
+ "min",
115
+ "max",
116
+ "type",
117
+ "custom"
118
+ ],
119
+ "description": "Constraint type. 'required': field must not be empty; 'minlength'/'maxlength': string length bounds (value = integer); 'pattern': regex the input must match (value = regex string); 'min'/'max': numeric range (value = number); 'type': expected data type; 'custom': application-defined rule."
120
+ },
121
+ "value": {
122
+ "type": "string",
123
+ "description": "Constraint threshold or parameter (e.g., '8' for minlength, '^[a-z]+$' for pattern)."
124
+ },
125
+ "message": {
126
+ "type": "string",
127
+ "description": "User-facing error message shown when this constraint is violated."
128
+ }
129
+ },
130
+ "required": ["type", "message"],
131
+ "additionalProperties": false
132
+ }
133
+ }
134
+ },
135
+ "required": ["type"],
136
+ "additionalProperties": false
137
+ }
138
+ },
139
+ "$id": "urn:dr:spec:node:ux.actioncomponent"
140
+ },
141
+ "actionpattern": {
142
+ "$schema": "http://json-schema.org/draft-07/schema#",
143
+ "title": "ActionPattern",
144
+ "description": "Reusable action configuration for common user interactions. Defines the trigger, feedback mechanism, and optional target for recurring UX patterns. Example: 'confirm-and-delete' pattern — trigger: click on delete button, feedback: confirmation modal then success toast, targetRef: the item being deleted.",
145
+ "allOf": [
146
+ {
147
+ "$ref": "urn:dr:spec:base:spec-node"
148
+ }
149
+ ],
150
+ "properties": {
151
+ "spec_node_id": {
152
+ "const": "ux.actionpattern"
153
+ },
154
+ "layer_id": {
155
+ "const": "ux"
156
+ },
157
+ "type": {
158
+ "const": "actionpattern"
159
+ },
160
+ "attributes": {
161
+ "type": "object",
162
+ "properties": {
163
+ "description": {
164
+ "type": "string"
165
+ },
166
+ "category": {
167
+ "type": "string",
168
+ "enum": ["crud", "navigation", "confirmation", "bulk-operation"],
169
+ "description": "Functional taxonomy of the action pattern."
170
+ },
171
+ "trigger": {
172
+ "type": "string",
173
+ "enum": ["click", "swipe", "voice", "keyboard"],
174
+ "description": "Input modality that initiates this action pattern."
175
+ },
176
+ "feedback": {
177
+ "type": "string",
178
+ "enum": [
179
+ "toast",
180
+ "animation",
181
+ "route-change",
182
+ "modal",
183
+ "inline-message",
184
+ "none"
185
+ ],
186
+ "description": "User-facing feedback mechanism invoked after the action completes."
187
+ },
188
+ "targetRef": {
189
+ "type": "string",
190
+ "description": "Optional specNodeId of the component or element this action pattern is applied to."
191
+ }
192
+ },
193
+ "additionalProperties": false
194
+ }
195
+ },
196
+ "$id": "urn:dr:spec:node:ux.actionpattern"
197
+ },
198
+ "chartseries": {
199
+ "$schema": "http://json-schema.org/draft-07/schema#",
200
+ "title": "ChartSeries",
201
+ "description": "Configuration for a data series within a chart component, specifying data source, visualization type, colors, and legend properties. Defines how data is visualized in charts.",
202
+ "allOf": [
203
+ {
204
+ "$ref": "urn:dr:spec:base:spec-node"
205
+ }
206
+ ],
207
+ "properties": {
208
+ "spec_node_id": {
209
+ "const": "ux.chartseries"
210
+ },
211
+ "layer_id": {
212
+ "const": "ux"
213
+ },
214
+ "type": {
215
+ "const": "chartseries"
216
+ },
217
+ "attributes": {
218
+ "type": "object",
219
+ "properties": {
220
+ "label": {
221
+ "type": "string"
222
+ },
223
+ "type": {
224
+ "type": "string",
225
+ "enum": [
226
+ "line",
227
+ "bar",
228
+ "column",
229
+ "pie",
230
+ "donut",
231
+ "area",
232
+ "scatter",
233
+ "bubble",
234
+ "heatmap"
235
+ ],
236
+ "description": "Visualization type for this data series."
237
+ },
238
+ "dataField": {
239
+ "type": "string",
240
+ "description": "Field name from the bound data source representing the numeric/value axis of this series (e.g., 'revenue', 'count'). For formal data-model binding, use a relationship to the corresponding data-model entity."
241
+ },
242
+ "categoryField": {
243
+ "type": "string",
244
+ "description": "Field name from the bound data source representing the category/x-axis grouping (e.g., 'month', 'region'). For formal data-model binding, use a relationship to the corresponding data-model entity."
245
+ },
246
+ "color": {
247
+ "type": "string",
248
+ "description": "CSS color value for this series (e.g., '#3B82F6', 'var(--brand-primary)'). Overrides any theme-level color scheme for this specific series."
249
+ },
250
+ "lineStyle": {
251
+ "type": "string",
252
+ "enum": ["solid", "dashed", "dotted", "double", "none"],
253
+ "description": "CSS border/line style applied to line chart series rendering, per CSS Border specification."
254
+ }
255
+ },
256
+ "required": ["label", "dataField"],
257
+ "additionalProperties": false
258
+ }
259
+ },
260
+ "$id": "urn:dr:spec:node:ux.chartseries"
261
+ },
262
+ "componentinstance": {
263
+ "$schema": "http://json-schema.org/draft-07/schema#",
264
+ "title": "ComponentInstance",
265
+ "description": "Instance of a LibraryComponent with application-specific configuration",
266
+ "allOf": [
267
+ {
268
+ "$ref": "urn:dr:spec:base:spec-node"
269
+ }
270
+ ],
271
+ "properties": {
272
+ "spec_node_id": {
273
+ "const": "ux.componentinstance"
274
+ },
275
+ "layer_id": {
276
+ "const": "ux"
277
+ },
278
+ "type": {
279
+ "const": "componentinstance"
280
+ },
281
+ "attributes": {
282
+ "type": "object",
283
+ "properties": {
284
+ "order": {
285
+ "type": "integer",
286
+ "description": "Render order of this component instance within its parent View or SubView's component list. Lower values render first."
287
+ },
288
+ "ref": {
289
+ "type": "string",
290
+ "description": "SpecNodeId of the ux.librarycomponent this instance is based on (e.g., 'ux.librarycomponent.data-table'). Determines the component type and the set of valid prop keys."
291
+ },
292
+ "props": {
293
+ "type": "object",
294
+ "description": "Key-value map of property overrides applied to this instance. Keys must match prop names declared on the referenced LibraryComponent. Values override the component defaults for this specific usage.",
295
+ "additionalProperties": true
296
+ }
297
+ },
298
+ "additionalProperties": false
299
+ }
300
+ },
301
+ "$id": "urn:dr:spec:node:ux.componentinstance"
302
+ },
303
+ "componentreference": {
304
+ "$schema": "http://json-schema.org/draft-07/schema#",
305
+ "title": "ComponentReference",
306
+ "description": "A declarative placeholder in a parent component's named slot, pointing to another component to be rendered there. Unlike ComponentInstance (a concrete rendered occurrence), ComponentReference is a composition declaration that says 'render this component in this slot of the parent', analogous to the HTML slot element.",
307
+ "allOf": [
308
+ {
309
+ "$ref": "urn:dr:spec:base:spec-node"
310
+ }
311
+ ],
312
+ "properties": {
313
+ "spec_node_id": {
314
+ "const": "ux.componentreference"
315
+ },
316
+ "layer_id": {
317
+ "const": "ux"
318
+ },
319
+ "type": {
320
+ "const": "componentreference"
321
+ },
322
+ "attributes": {
323
+ "type": "object",
324
+ "properties": {
325
+ "ref": {
326
+ "type": "string",
327
+ "description": "SpecNodeId of the component (ux.librarycomponent or ux.componentinstance) to render in the slot."
328
+ },
329
+ "variant": {
330
+ "type": "string",
331
+ "description": "Optional design variant override for this reference (e.g., 'compact', 'expanded', 'readonly'). Must match a variant defined on the referenced component."
332
+ },
333
+ "slot": {
334
+ "type": "string",
335
+ "description": "Named slot in the parent component where this reference is placed. Slot names are defined by the parent LibraryComponent (e.g., 'header', 'actions', 'footer')."
336
+ }
337
+ },
338
+ "required": ["ref"],
339
+ "additionalProperties": false
340
+ }
341
+ },
342
+ "$id": "urn:dr:spec:node:ux.componentreference"
343
+ },
344
+ "dataconfig": {
345
+ "$schema": "http://json-schema.org/draft-07/schema#",
346
+ "title": "DataConfig",
347
+ "description": "Configuration for data binding and state management within UI components, defining data sources, transformation pipelines, and update triggers. Manages component data flow.",
348
+ "allOf": [
349
+ {
350
+ "$ref": "urn:dr:spec:base:spec-node"
351
+ }
352
+ ],
353
+ "properties": {
354
+ "spec_node_id": {
355
+ "const": "ux.dataconfig"
356
+ },
357
+ "layer_id": {
358
+ "const": "ux"
359
+ },
360
+ "type": {
361
+ "const": "dataconfig"
362
+ },
363
+ "attributes": {
364
+ "type": "object",
365
+ "properties": {
366
+ "source": {
367
+ "type": "string",
368
+ "enum": ["api", "state", "local-storage", "mock", "static"],
369
+ "description": "Data origin for this binding configuration."
370
+ },
371
+ "target": {
372
+ "type": "string",
373
+ "description": "SpecNodeId of the destination element receiving bound data (e.g., a data-model entity ID or API endpoint ID). Use relationships to formally link to those layers."
374
+ },
375
+ "path": {
376
+ "type": "string",
377
+ "description": "Dot-notation or JSONPath expression selecting a field within the source data (e.g., 'user.profile.name' or '$.items[0].id')."
378
+ }
379
+ },
380
+ "required": ["source", "target"],
381
+ "additionalProperties": false
382
+ }
383
+ },
384
+ "$id": "urn:dr:spec:node:ux.dataconfig"
385
+ },
386
+ "errorconfig": {
387
+ "$schema": "http://json-schema.org/draft-07/schema#",
388
+ "title": "ErrorConfig",
389
+ "description": "Configuration for error handling and display within UI components, specifying error message formats, retry behavior, fallback content, and user guidance. Ensures consistent error UX.",
390
+ "allOf": [
391
+ {
392
+ "$ref": "urn:dr:spec:base:spec-node"
393
+ }
394
+ ],
395
+ "properties": {
396
+ "spec_node_id": {
397
+ "const": "ux.errorconfig"
398
+ },
399
+ "layer_id": {
400
+ "const": "ux"
401
+ },
402
+ "type": {
403
+ "const": "errorconfig"
404
+ },
405
+ "attributes": {
406
+ "type": "object",
407
+ "properties": {
408
+ "showNotification": {
409
+ "type": "boolean"
410
+ },
411
+ "notificationType": {
412
+ "type": "string",
413
+ "enum": ["success", "error", "warning", "info", "neutral"],
414
+ "description": "Severity category of the notification, aligned with ARIA live region and alert role semantics."
415
+ },
416
+ "errorMessage": {
417
+ "type": "string"
418
+ },
419
+ "defaultErrorMessage": {
420
+ "type": "string"
421
+ }
422
+ },
423
+ "additionalProperties": false
424
+ }
425
+ },
426
+ "$id": "urn:dr:spec:node:ux.errorconfig"
427
+ },
428
+ "experiencestate": {
429
+ "$schema": "http://json-schema.org/draft-07/schema#",
430
+ "title": "ExperienceState",
431
+ "description": "Distinct state that the experience can be in (works across all channels)",
432
+ "allOf": [
433
+ {
434
+ "$ref": "urn:dr:spec:base:spec-node"
435
+ }
436
+ ],
437
+ "properties": {
438
+ "spec_node_id": {
439
+ "const": "ux.experiencestate"
440
+ },
441
+ "layer_id": {
442
+ "const": "ux"
443
+ },
444
+ "type": {
445
+ "const": "experiencestate"
446
+ },
447
+ "attributes": {
448
+ "type": "object",
449
+ "properties": {
450
+ "initial": {
451
+ "type": "boolean",
452
+ "description": "When true, marks this as the starting state of the state machine. Only one ExperienceState per state machine should have initial: true."
453
+ },
454
+ "description": {
455
+ "type": "string"
456
+ },
457
+ "channel": {
458
+ "type": "string",
459
+ "enum": ["web", "mobile", "voice", "chat", "sms"],
460
+ "description": "Delivery channel context for this experience state."
461
+ },
462
+ "onEnter": {
463
+ "type": "array",
464
+ "description": "List of StateAction specNodeIds executed when entering this state (lifecycle: on-enter).",
465
+ "items": {
466
+ "type": "string",
467
+ "description": "SpecNodeId of a ux.stateaction node."
468
+ }
469
+ },
470
+ "onExit": {
471
+ "type": "array",
472
+ "description": "List of StateAction specNodeIds executed when leaving this state (lifecycle: on-exit).",
473
+ "items": {
474
+ "type": "string",
475
+ "description": "SpecNodeId of a ux.stateaction node."
476
+ }
477
+ },
478
+ "transitions": {
479
+ "type": "array",
480
+ "description": "List of StateTransition specNodeIds owned by this state, defining the outgoing edges of the state machine.",
481
+ "items": {
482
+ "type": "string",
483
+ "description": "SpecNodeId of a ux.statetransition node."
484
+ }
485
+ },
486
+ "enabledComponents": {
487
+ "type": "array",
488
+ "description": "List of component specNodeIds that are interactive (enabled) when this state is active. Corresponds to ARIA aria-disabled=false.",
489
+ "items": {
490
+ "type": "string",
491
+ "description": "SpecNodeId of a component node."
492
+ }
493
+ },
494
+ "disabledComponents": {
495
+ "type": "array",
496
+ "description": "List of component specNodeIds that are non-interactive (disabled) when this state is active. Corresponds to ARIA aria-disabled=true.",
497
+ "items": {
498
+ "type": "string",
499
+ "description": "SpecNodeId of a component node."
500
+ }
501
+ },
502
+ "hiddenComponents": {
503
+ "type": "array",
504
+ "description": "List of component specNodeIds that are not rendered when this state is active. Corresponds to ARIA aria-hidden=true or display:none.",
505
+ "items": {
506
+ "type": "string",
507
+ "description": "SpecNodeId of a component node."
508
+ }
509
+ }
510
+ },
511
+ "additionalProperties": false
512
+ }
513
+ },
514
+ "$id": "urn:dr:spec:node:ux.experiencestate"
515
+ },
516
+ "layoutconfig": {
517
+ "$schema": "http://json-schema.org/draft-07/schema#",
518
+ "title": "LayoutConfig",
519
+ "description": "Configuration for UI layout structure, defining grid systems, responsive breakpoints, spacing rules, and component arrangement patterns. Controls visual organization of the interface.",
520
+ "allOf": [
521
+ {
522
+ "$ref": "urn:dr:spec:base:spec-node"
523
+ }
524
+ ],
525
+ "properties": {
526
+ "spec_node_id": {
527
+ "const": "ux.layoutconfig"
528
+ },
529
+ "layer_id": {
530
+ "const": "ux"
531
+ },
532
+ "type": {
533
+ "const": "layoutconfig"
534
+ },
535
+ "attributes": {
536
+ "type": "object",
537
+ "properties": {
538
+ "type": {
539
+ "type": "string",
540
+ "enum": ["grid", "flex", "block", "inline", "absolute", "sticky"],
541
+ "description": "CSS layout mode governing element positioning and flow, per CSS Flexbox/Grid specification."
542
+ },
543
+ "columns": {
544
+ "type": "integer"
545
+ },
546
+ "rows": {
547
+ "type": "integer"
548
+ },
549
+ "gap": {
550
+ "type": "string"
551
+ },
552
+ "rowGap": {
553
+ "type": "string"
554
+ },
555
+ "columnGap": {
556
+ "type": "string"
557
+ },
558
+ "padding": {
559
+ "type": "string"
560
+ },
561
+ "margin": {
562
+ "type": "string"
563
+ },
564
+ "maxWidth": {
565
+ "type": "string"
566
+ },
567
+ "alignContent": {
568
+ "type": "string",
569
+ "enum": [
570
+ "flex-start",
571
+ "flex-end",
572
+ "center",
573
+ "space-between",
574
+ "space-around",
575
+ "stretch"
576
+ ],
577
+ "description": "CSS align-content property value, per CSS Flexbox/Grid specification."
578
+ },
579
+ "alignItems": {
580
+ "type": "string",
581
+ "enum": [
582
+ "flex-start",
583
+ "flex-end",
584
+ "center",
585
+ "baseline",
586
+ "stretch"
587
+ ],
588
+ "description": "CSS align-items property value, per CSS Flexbox/Grid specification."
589
+ },
590
+ "justifyContent": {
591
+ "type": "string",
592
+ "enum": [
593
+ "flex-start",
594
+ "flex-end",
595
+ "center",
596
+ "space-between",
597
+ "space-around",
598
+ "space-evenly"
599
+ ],
600
+ "description": "CSS justify-content property value, per CSS Flexbox/Grid specification."
601
+ },
602
+ "justifyItems": {
603
+ "type": "string",
604
+ "enum": [
605
+ "flex-start",
606
+ "flex-end",
607
+ "center",
608
+ "stretch",
609
+ "baseline"
610
+ ],
611
+ "description": "CSS justify-items property value, per CSS Grid specification."
612
+ },
613
+ "stickyPosition": {
614
+ "type": "string",
615
+ "enum": ["top", "bottom", "left", "right", "none"],
616
+ "description": "Anchor edge for CSS position:sticky elements, per CSS Positioning specification."
617
+ },
618
+ "style": {
619
+ "type": "string",
620
+ "enum": ["card", "table", "list", "grid", "masonry", "split"],
621
+ "description": "Visual presentation style applied to the layout container."
622
+ },
623
+ "labelPosition": {
624
+ "type": "string",
625
+ "enum": ["top", "left", "right", "inline", "floating", "hidden"],
626
+ "description": "Placement of form field labels relative to their input elements, per HTML 5.3 label element positioning patterns."
627
+ }
628
+ },
629
+ "required": ["type"],
630
+ "additionalProperties": false
631
+ }
632
+ },
633
+ "$id": "urn:dr:spec:node:ux.layoutconfig"
634
+ },
635
+ "librarycomponent": {
636
+ "$schema": "http://json-schema.org/draft-07/schema#",
637
+ "title": "LibraryComponent",
638
+ "description": "Reusable UI component definition that can be instantiated in multiple UXSpecs",
639
+ "allOf": [
640
+ {
641
+ "$ref": "urn:dr:spec:base:spec-node"
642
+ }
643
+ ],
644
+ "properties": {
645
+ "spec_node_id": {
646
+ "const": "ux.librarycomponent"
647
+ },
648
+ "layer_id": {
649
+ "const": "ux"
650
+ },
651
+ "type": {
652
+ "const": "librarycomponent"
653
+ },
654
+ "attributes": {
655
+ "type": "object",
656
+ "properties": {
657
+ "type": {
658
+ "type": "string",
659
+ "enum": [
660
+ "form",
661
+ "table",
662
+ "chart",
663
+ "navigation",
664
+ "feedback",
665
+ "layout",
666
+ "input",
667
+ "display"
668
+ ],
669
+ "description": "UI component category used for library organization and component lookup."
670
+ },
671
+ "label": {
672
+ "type": "string"
673
+ },
674
+ "description": {
675
+ "type": "string"
676
+ },
677
+ "category": {
678
+ "type": "string",
679
+ "description": "Fine-grained categorization within the component type (e.g., 'data-grid', 'inline-form', 'bar-chart') for library browsing and search."
680
+ },
681
+ "source": {
682
+ "type": "object",
683
+ "description": "Distribution source for this component (npm package, git repository, or internal registry).",
684
+ "properties": {
685
+ "type": {
686
+ "type": "string",
687
+ "enum": ["npm", "git", "internal-registry"],
688
+ "description": "Distribution mechanism."
689
+ },
690
+ "identifier": {
691
+ "type": "string",
692
+ "description": "Package name, git URL, or registry path (e.g., '@org/ui-components', 'https://github.com/org/ui')."
693
+ }
694
+ },
695
+ "additionalProperties": false
696
+ },
697
+ "props": {
698
+ "type": "array",
699
+ "description": "Schema of properties accepted by this component. Each entry defines an accepted prop with its name, type, and whether it is required.",
700
+ "items": {
701
+ "type": "object",
702
+ "properties": {
703
+ "name": {
704
+ "type": "string",
705
+ "description": "Prop identifier."
706
+ },
707
+ "type": {
708
+ "type": "string",
709
+ "enum": ["string", "number", "boolean", "object", "array"],
710
+ "description": "Data type of the prop value."
711
+ },
712
+ "required": {
713
+ "type": "boolean",
714
+ "description": "Whether this prop must be provided by consumers."
715
+ },
716
+ "default": {
717
+ "type": "string",
718
+ "description": "Default value as string; coerced to declared type at runtime."
719
+ }
720
+ },
721
+ "required": ["name", "type"],
722
+ "additionalProperties": false
723
+ }
724
+ },
725
+ "slots": {
726
+ "type": "array",
727
+ "description": "Named content slots this component exposes for composition, analogous to HTML slot elements in Web Components.",
728
+ "items": {
729
+ "type": "object",
730
+ "properties": {
731
+ "name": {
732
+ "type": "string",
733
+ "description": "Slot identifier referenced by ComponentReference.slot."
734
+ },
735
+ "description": {
736
+ "type": "string",
737
+ "description": "What content is expected in this slot."
738
+ }
739
+ },
740
+ "required": ["name"],
741
+ "additionalProperties": false
742
+ }
743
+ },
744
+ "events": {
745
+ "type": "array",
746
+ "description": "Custom events emitted by this component that consumers can listen to.",
747
+ "items": {
748
+ "type": "object",
749
+ "properties": {
750
+ "name": {
751
+ "type": "string",
752
+ "description": "Event name (e.g., 'row-selected', 'form-submitted')."
753
+ },
754
+ "description": {
755
+ "type": "string",
756
+ "description": "When this event fires and what payload it carries."
757
+ }
758
+ },
759
+ "required": ["name"],
760
+ "additionalProperties": false
761
+ }
762
+ }
763
+ },
764
+ "required": ["type"],
765
+ "additionalProperties": false
766
+ }
767
+ },
768
+ "$id": "urn:dr:spec:node:ux.librarycomponent"
769
+ },
770
+ "librarysubview": {
771
+ "$schema": "http://json-schema.org/draft-07/schema#",
772
+ "title": "LibrarySubView",
773
+ "description": "Reusable, non-routable grouping of components intended to be composed into Views or other SubViews. Unlike View, LibrarySubView has no route and cannot be navigated to directly. It exists purely as a reusable composition unit, analogous to an HTML template element.",
774
+ "allOf": [
775
+ {
776
+ "$ref": "urn:dr:spec:base:spec-node"
777
+ }
778
+ ],
779
+ "properties": {
780
+ "spec_node_id": {
781
+ "const": "ux.librarysubview"
782
+ },
783
+ "layer_id": {
784
+ "const": "ux"
785
+ },
786
+ "type": {
787
+ "const": "librarysubview"
788
+ },
789
+ "attributes": {
790
+ "type": "object",
791
+ "properties": {
792
+ "title": {
793
+ "type": "string"
794
+ },
795
+ "description": {
796
+ "type": "string"
797
+ },
798
+ "category": {
799
+ "type": "string",
800
+ "description": "Functional category grouping related sub-views within a library (e.g., 'forms', 'data-display', 'navigation', 'feedback')."
801
+ },
802
+ "components": {
803
+ "type": "array",
804
+ "description": "Ordered list of ComponentInstance specNodeIds that constitute this reusable sub-view composition.",
805
+ "items": {
806
+ "type": "string",
807
+ "description": "SpecNodeId of a ux.componentinstance node."
808
+ }
809
+ }
810
+ },
811
+ "additionalProperties": false
812
+ }
813
+ },
814
+ "$id": "urn:dr:spec:node:ux.librarysubview"
815
+ },
816
+ "stateaction": {
817
+ "$schema": "http://json-schema.org/draft-07/schema#",
818
+ "title": "StateAction",
819
+ "description": "A concrete action bound to a specific ExperienceState lifecycle event. Instances are bound to a state and lifecycle hook; for reusable parameterizable definitions use StateActionTemplate. Examples: scroll-to-top (lifecycle: on-enter), focus-first-field (lifecycle: on-enter), dispatch-analytics-event (lifecycle: on-exit).",
820
+ "allOf": [
821
+ {
822
+ "$ref": "urn:dr:spec:base:spec-node"
823
+ }
824
+ ],
825
+ "properties": {
826
+ "spec_node_id": {
827
+ "const": "ux.stateaction"
828
+ },
829
+ "layer_id": {
830
+ "const": "ux"
831
+ },
832
+ "type": {
833
+ "const": "stateaction"
834
+ },
835
+ "attributes": {
836
+ "type": "object",
837
+ "properties": {
838
+ "action": {
839
+ "type": "string",
840
+ "enum": [
841
+ "navigate",
842
+ "submit",
843
+ "open",
844
+ "close",
845
+ "dispatch",
846
+ "validate"
847
+ ],
848
+ "description": "Operation executed during the state lifecycle."
849
+ },
850
+ "description": {
851
+ "type": "string"
852
+ },
853
+ "lifecycle": {
854
+ "type": "string",
855
+ "enum": ["on-enter", "on-exit", "on-transition"],
856
+ "description": "State lifecycle hook that triggers this action. 'on-enter': fires when entering the owning ExperienceState; 'on-exit': fires when leaving it; 'on-transition': fires during any outgoing transition from this state."
857
+ },
858
+ "timing": {
859
+ "type": "string",
860
+ "enum": ["immediate", "deferred", "conditional"],
861
+ "description": "Execution scheduling within the lifecycle hook: 'immediate' runs synchronously before the state activates; 'deferred' runs asynchronously after; 'conditional' runs only when a guard condition is met."
862
+ }
863
+ },
864
+ "required": ["action"],
865
+ "additionalProperties": false
866
+ }
867
+ },
868
+ "$id": "urn:dr:spec:node:ux.stateaction"
869
+ },
870
+ "stateactiontemplate": {
871
+ "$schema": "http://json-schema.org/draft-07/schema#",
872
+ "title": "StateActionTemplate",
873
+ "description": "A parameterizable, reusable definition of an action to execute during state transitions. StateActionTemplate is the definition; StateAction is the concrete usage bound to a specific ExperienceState and lifecycle hook. Example: a 'scroll-to-top' template with a 'targetId' parameter, instantiated as a StateAction on multiple states.",
874
+ "allOf": [
875
+ {
876
+ "$ref": "urn:dr:spec:base:spec-node"
877
+ }
878
+ ],
879
+ "properties": {
880
+ "spec_node_id": {
881
+ "const": "ux.stateactiontemplate"
882
+ },
883
+ "layer_id": {
884
+ "const": "ux"
885
+ },
886
+ "type": {
887
+ "const": "stateactiontemplate"
888
+ },
889
+ "attributes": {
890
+ "type": "object",
891
+ "properties": {
892
+ "action": {
893
+ "type": "string",
894
+ "enum": [
895
+ "navigate",
896
+ "submit",
897
+ "open",
898
+ "close",
899
+ "dispatch",
900
+ "validate"
901
+ ],
902
+ "description": "Operation this template encapsulates. Must match a value from the StateAction action enum."
903
+ },
904
+ "description": {
905
+ "type": "string"
906
+ },
907
+ "parameters": {
908
+ "type": "array",
909
+ "description": "Configurable parameters that can be supplied when instantiating this template as a StateAction. Each item defines a named input with its expected type and optional default value.",
910
+ "items": {
911
+ "type": "object",
912
+ "properties": {
913
+ "name": {
914
+ "type": "string",
915
+ "description": "Parameter identifier used to reference it in the action (e.g., 'targetId', 'routePath')."
916
+ },
917
+ "type": {
918
+ "type": "string",
919
+ "enum": ["string", "number", "boolean"],
920
+ "description": "Expected data type of the parameter value."
921
+ },
922
+ "default": {
923
+ "type": "string",
924
+ "description": "Optional default value as a string; coerced to the declared type at runtime."
925
+ }
926
+ },
927
+ "required": ["name", "type"],
928
+ "additionalProperties": false
929
+ }
930
+ }
931
+ },
932
+ "required": ["action"],
933
+ "additionalProperties": false
934
+ }
935
+ },
936
+ "$id": "urn:dr:spec:node:ux.stateactiontemplate"
937
+ },
938
+ "statepattern": {
939
+ "$schema": "http://json-schema.org/draft-07/schema#",
940
+ "title": "StatePattern",
941
+ "description": "Reusable state machine template for common UX interaction flows, composed of named ExperienceStates and transitions. Canonical examples: 'wizard' — multi-step form with back/next/submit transitions; 'optimistic-update' — loading → success/error with retry; 'tab-panel' — N peer states with tab-driven transitions; 'authenticated-route' — unauthenticated → redirect/login → authenticated.",
942
+ "allOf": [
943
+ {
944
+ "$ref": "urn:dr:spec:base:spec-node"
945
+ }
946
+ ],
947
+ "properties": {
948
+ "spec_node_id": {
949
+ "const": "ux.statepattern"
950
+ },
951
+ "layer_id": {
952
+ "const": "ux"
953
+ },
954
+ "type": {
955
+ "const": "statepattern"
956
+ },
957
+ "attributes": {
958
+ "type": "object",
959
+ "properties": {
960
+ "description": {
961
+ "type": "string"
962
+ },
963
+ "category": {
964
+ "type": "string",
965
+ "enum": [
966
+ "navigation",
967
+ "form",
968
+ "data-loading",
969
+ "authentication",
970
+ "multi-step"
971
+ ],
972
+ "description": "Functional taxonomy of the reusable state machine pattern."
973
+ },
974
+ "states": {
975
+ "type": "array",
976
+ "description": "Ordered list of ExperienceState specNodeIds comprising this reusable pattern. The first entry is the initial state.",
977
+ "items": {
978
+ "type": "string",
979
+ "description": "specNodeId of an ExperienceState node belonging to this pattern."
980
+ }
981
+ }
982
+ },
983
+ "additionalProperties": false
984
+ }
985
+ },
986
+ "$id": "urn:dr:spec:node:ux.statepattern"
987
+ },
988
+ "statetransition": {
989
+ "$schema": "http://json-schema.org/draft-07/schema#",
990
+ "title": "StateTransition",
991
+ "description": "A directed edge in the ExperienceState machine, owned by its source ExperienceState. Specifies the trigger event, destination state, optional guard condition, and side-effect actions. The 'from' state is implicitly the ExperienceState that contains this transition via relationship.",
992
+ "allOf": [
993
+ {
994
+ "$ref": "urn:dr:spec:base:spec-node"
995
+ }
996
+ ],
997
+ "properties": {
998
+ "spec_node_id": {
999
+ "const": "ux.statetransition"
1000
+ },
1001
+ "layer_id": {
1002
+ "const": "ux"
1003
+ },
1004
+ "type": {
1005
+ "const": "statetransition"
1006
+ },
1007
+ "attributes": {
1008
+ "type": "object",
1009
+ "properties": {
1010
+ "to": {
1011
+ "type": "string",
1012
+ "description": "SpecNodeId of the destination ExperienceState this transition leads to (e.g., 'ux.experiencestate.order-confirmed')."
1013
+ },
1014
+ "trigger": {
1015
+ "type": "string",
1016
+ "enum": [
1017
+ "click",
1018
+ "hover",
1019
+ "focus",
1020
+ "blur",
1021
+ "change",
1022
+ "submit",
1023
+ "load",
1024
+ "swipe",
1025
+ "voice-command"
1026
+ ],
1027
+ "description": "DOM or UX event that initiates this state transition, per HTML 5.3 event model."
1028
+ },
1029
+ "description": {
1030
+ "type": "string"
1031
+ },
1032
+ "actions": {
1033
+ "type": "array",
1034
+ "description": "List of StateAction specNodeIds to execute when this transition fires, in order.",
1035
+ "items": {
1036
+ "type": "string",
1037
+ "description": "SpecNodeId of a ux.stateaction node."
1038
+ }
1039
+ },
1040
+ "guard": {
1041
+ "type": "object",
1042
+ "description": "Optional boolean guard condition that must evaluate to true for this transition to fire.",
1043
+ "properties": {
1044
+ "expression": {
1045
+ "type": "string",
1046
+ "description": "Boolean expression string evaluated against current state context."
1047
+ },
1048
+ "syntax": {
1049
+ "type": "string",
1050
+ "enum": ["javascript", "jsonpath", "cel", "jsonata"],
1051
+ "description": "Expression language used to evaluate the guard expression. 'javascript': JS boolean expression (e.g., 'user.isLoggedIn && cart.items.length > 0'); 'jsonpath': JSONPath predicate (e.g., '$.user.role == \"admin\"'); 'cel': Common Expression Language (e.g., 'user.age >= 18'); 'jsonata': JSONata expression (e.g., '$count(items) > 0')."
1052
+ }
1053
+ },
1054
+ "required": ["expression", "syntax"],
1055
+ "additionalProperties": false
1056
+ }
1057
+ },
1058
+ "required": ["trigger"],
1059
+ "additionalProperties": false
1060
+ }
1061
+ },
1062
+ "$id": "urn:dr:spec:node:ux.statetransition"
1063
+ },
1064
+ "subview": {
1065
+ "$schema": "http://json-schema.org/draft-07/schema#",
1066
+ "title": "SubView",
1067
+ "description": "A non-routable UI fragment embedded within a parent View. Two usage modes: (1) Library instance — 'ref' is populated with a ux.librarysubview specNodeId, rendering that reusable fragment; (2) Inline definition — 'ref' is absent and the SubView defines its own composition inline. SubViews are not independently routable; use View for routable pages.",
1068
+ "allOf": [
1069
+ {
1070
+ "$ref": "urn:dr:spec:base:spec-node"
1071
+ }
1072
+ ],
1073
+ "properties": {
1074
+ "spec_node_id": {
1075
+ "const": "ux.subview"
1076
+ },
1077
+ "layer_id": {
1078
+ "const": "ux"
1079
+ },
1080
+ "type": {
1081
+ "const": "subview"
1082
+ },
1083
+ "attributes": {
1084
+ "type": "object",
1085
+ "properties": {
1086
+ "title": {
1087
+ "type": "string"
1088
+ },
1089
+ "description": {
1090
+ "type": "string"
1091
+ },
1092
+ "order": {
1093
+ "type": "integer",
1094
+ "description": "Render order of this SubView within its parent View's subViews list. Lower values render first (top-to-bottom or left-to-right depending on layout)."
1095
+ },
1096
+ "ref": {
1097
+ "type": "string",
1098
+ "description": "SpecNodeId of the ux.librarysubview this instance is based on (e.g., 'ux.librarysubview.data-table-with-filters'). When present, this SubView is a library instance; when absent, it is an inline definition."
1099
+ }
1100
+ },
1101
+ "additionalProperties": false
1102
+ }
1103
+ },
1104
+ "$id": "urn:dr:spec:node:ux.subview"
1105
+ },
1106
+ "tablecolumn": {
1107
+ "$schema": "http://json-schema.org/draft-07/schema#",
1108
+ "title": "TableColumn",
1109
+ "description": "Configuration for a single column within a data table component, specifying header, data binding, sorting, filtering, and rendering options. Defines table structure and behavior.",
1110
+ "allOf": [
1111
+ {
1112
+ "$ref": "urn:dr:spec:base:spec-node"
1113
+ }
1114
+ ],
1115
+ "properties": {
1116
+ "spec_node_id": {
1117
+ "const": "ux.tablecolumn"
1118
+ },
1119
+ "layer_id": {
1120
+ "const": "ux"
1121
+ },
1122
+ "type": {
1123
+ "const": "tablecolumn"
1124
+ },
1125
+ "attributes": {
1126
+ "type": "object",
1127
+ "properties": {
1128
+ "header": {
1129
+ "type": "string"
1130
+ },
1131
+ "field": {
1132
+ "type": "string"
1133
+ },
1134
+ "width": {
1135
+ "type": "string"
1136
+ },
1137
+ "minWidth": {
1138
+ "type": "string"
1139
+ },
1140
+ "maxWidth": {
1141
+ "type": "string"
1142
+ },
1143
+ "filterType": {
1144
+ "type": "string",
1145
+ "enum": [
1146
+ "equals",
1147
+ "contains",
1148
+ "startsWith",
1149
+ "endsWith",
1150
+ "range",
1151
+ "multiselect",
1152
+ "boolean"
1153
+ ],
1154
+ "description": "Filter operation type available for this column, per HTML 5.3 form input filter patterns."
1155
+ },
1156
+ "textAlign": {
1157
+ "type": "string",
1158
+ "enum": ["left", "right", "center", "justify", "start", "end"],
1159
+ "description": "CSS text-align value for cell content, per CSS Text specification."
1160
+ },
1161
+ "displayType": {
1162
+ "type": "string",
1163
+ "enum": [
1164
+ "text",
1165
+ "badge",
1166
+ "icon",
1167
+ "link",
1168
+ "image",
1169
+ "boolean",
1170
+ "date",
1171
+ "currency",
1172
+ "actions"
1173
+ ],
1174
+ "description": "Rendering type that controls how cell values are visually presented."
1175
+ },
1176
+ "defaultSortDirection": {
1177
+ "type": "string",
1178
+ "enum": ["asc", "desc", "none"],
1179
+ "description": "Default sort direction applied to this column when first sorted."
1180
+ }
1181
+ },
1182
+ "required": ["header", "field"],
1183
+ "additionalProperties": false
1184
+ }
1185
+ },
1186
+ "$id": "urn:dr:spec:node:ux.tablecolumn"
1187
+ },
1188
+ "transitiontemplate": {
1189
+ "$schema": "http://json-schema.org/draft-07/schema#",
1190
+ "title": "TransitionTemplate",
1191
+ "description": "Defines reusable animation and transition patterns for state changes, page navigation, or component lifecycle events. Ensures consistent motion design across the application.",
1192
+ "allOf": [
1193
+ {
1194
+ "$ref": "urn:dr:spec:base:spec-node"
1195
+ }
1196
+ ],
1197
+ "properties": {
1198
+ "spec_node_id": {
1199
+ "const": "ux.transitiontemplate"
1200
+ },
1201
+ "layer_id": {
1202
+ "const": "ux"
1203
+ },
1204
+ "type": {
1205
+ "const": "transitiontemplate"
1206
+ },
1207
+ "attributes": {
1208
+ "type": "object",
1209
+ "properties": {
1210
+ "to": {
1211
+ "type": "string"
1212
+ },
1213
+ "trigger": {
1214
+ "type": "string"
1215
+ },
1216
+ "description": {
1217
+ "type": "string"
1218
+ },
1219
+ "animationType": {
1220
+ "type": "string",
1221
+ "enum": ["fade", "slide", "scale", "bounce", "none"],
1222
+ "description": "Motion animation category applied during this transition."
1223
+ },
1224
+ "duration": {
1225
+ "type": "string",
1226
+ "description": "CSS transition duration (e.g., '300ms', '0.5s'), per CSS Transitions specification."
1227
+ },
1228
+ "easing": {
1229
+ "type": "string",
1230
+ "description": "CSS timing function controlling the transition's acceleration curve (e.g., 'ease-in-out', 'cubic-bezier(0.4, 0, 0.2, 1)')."
1231
+ }
1232
+ },
1233
+ "required": ["to", "trigger"],
1234
+ "additionalProperties": false
1235
+ }
1236
+ },
1237
+ "$id": "urn:dr:spec:node:ux.transitiontemplate"
1238
+ },
1239
+ "uxapplication": {
1240
+ "$schema": "http://json-schema.org/draft-07/schema#",
1241
+ "title": "UXApplication",
1242
+ "description": "Application-level UX configuration that groups UXSpecs and defines shared settings",
1243
+ "allOf": [
1244
+ {
1245
+ "$ref": "urn:dr:spec:base:spec-node"
1246
+ }
1247
+ ],
1248
+ "properties": {
1249
+ "spec_node_id": {
1250
+ "const": "ux.uxapplication"
1251
+ },
1252
+ "layer_id": {
1253
+ "const": "ux"
1254
+ },
1255
+ "type": {
1256
+ "const": "uxapplication"
1257
+ },
1258
+ "attributes": {
1259
+ "type": "object",
1260
+ "properties": {
1261
+ "version": {
1262
+ "type": "string"
1263
+ },
1264
+ "description": {
1265
+ "type": "string"
1266
+ },
1267
+ "channel": {
1268
+ "type": "string",
1269
+ "enum": ["web", "mobile", "voice", "chat", "sms"],
1270
+ "description": "Primary delivery channel this application targets. Multi-channel products use one UXApplication per channel, each referencing channel-specific UXSpecs."
1271
+ },
1272
+ "experiences": {
1273
+ "type": "array",
1274
+ "description": "List of UXSpec specNodeIds that comprise the user experiences of this application.",
1275
+ "items": {
1276
+ "type": "string",
1277
+ "description": "SpecNodeId of a ux.uxspec node."
1278
+ }
1279
+ },
1280
+ "theme": {
1281
+ "type": "string",
1282
+ "description": "Design token theme identifier applied application-wide (e.g., 'brand-light', 'brand-dark', 'high-contrast')."
1283
+ },
1284
+ "designSystem": {
1285
+ "type": "string",
1286
+ "description": "Identifier of the design system or UXLibrary this application uses (e.g., specNodeId of a ux.uxlibrary node)."
1287
+ },
1288
+ "defaultLocale": {
1289
+ "type": "string",
1290
+ "description": "Default locale for internationalization, as a BCP 47 language tag (e.g., 'en-US', 'fr-FR', 'ja-JP')."
1291
+ }
1292
+ },
1293
+ "required": ["channel"],
1294
+ "additionalProperties": false
1295
+ }
1296
+ },
1297
+ "$id": "urn:dr:spec:node:ux.uxapplication"
1298
+ },
1299
+ "uxlibrary": {
1300
+ "$schema": "http://json-schema.org/draft-07/schema#",
1301
+ "title": "UXLibrary",
1302
+ "description": "Collection of reusable UI components and sub-views that can be shared across applications",
1303
+ "allOf": [
1304
+ {
1305
+ "$ref": "urn:dr:spec:base:spec-node"
1306
+ }
1307
+ ],
1308
+ "properties": {
1309
+ "spec_node_id": {
1310
+ "const": "ux.uxlibrary"
1311
+ },
1312
+ "layer_id": {
1313
+ "const": "ux"
1314
+ },
1315
+ "type": {
1316
+ "const": "uxlibrary"
1317
+ },
1318
+ "attributes": {
1319
+ "type": "object",
1320
+ "properties": {
1321
+ "version": {
1322
+ "type": "string"
1323
+ },
1324
+ "description": {
1325
+ "type": "string"
1326
+ },
1327
+ "author": {
1328
+ "type": "string"
1329
+ },
1330
+ "license": {
1331
+ "type": "string"
1332
+ },
1333
+ "components": {
1334
+ "type": "array",
1335
+ "description": "List of ux.librarycomponent specNodeIds exported by this library.",
1336
+ "items": {
1337
+ "type": "string",
1338
+ "description": "SpecNodeId of a ux.librarycomponent node."
1339
+ }
1340
+ },
1341
+ "subViews": {
1342
+ "type": "array",
1343
+ "description": "List of ux.librarysubview specNodeIds exported by this library.",
1344
+ "items": {
1345
+ "type": "string",
1346
+ "description": "SpecNodeId of a ux.librarysubview node."
1347
+ }
1348
+ },
1349
+ "statePatterns": {
1350
+ "type": "array",
1351
+ "description": "List of ux.statepattern specNodeIds exported by this library.",
1352
+ "items": {
1353
+ "type": "string",
1354
+ "description": "SpecNodeId of a ux.statepattern node."
1355
+ }
1356
+ },
1357
+ "actionPatterns": {
1358
+ "type": "array",
1359
+ "description": "List of ux.actionpattern specNodeIds exported by this library.",
1360
+ "items": {
1361
+ "type": "string",
1362
+ "description": "SpecNodeId of a ux.actionpattern node."
1363
+ }
1364
+ },
1365
+ "source": {
1366
+ "type": "object",
1367
+ "description": "Distribution source for this library package.",
1368
+ "properties": {
1369
+ "type": {
1370
+ "type": "string",
1371
+ "enum": ["npm", "git", "internal-registry"],
1372
+ "description": "Distribution mechanism: 'npm' for a published npm package, 'git' for a git repository URL, 'internal-registry' for a private artifact registry."
1373
+ },
1374
+ "identifier": {
1375
+ "type": "string",
1376
+ "description": "Package name, git URL, or registry path (e.g., '@org/design-system', 'https://github.com/org/ds', 'registry.internal/ux-lib')."
1377
+ }
1378
+ },
1379
+ "additionalProperties": false
1380
+ }
1381
+ },
1382
+ "required": ["version"],
1383
+ "additionalProperties": false
1384
+ }
1385
+ },
1386
+ "$id": "urn:dr:spec:node:ux.uxlibrary"
1387
+ },
1388
+ "uxspec": {
1389
+ "$schema": "http://json-schema.org/draft-07/schema#",
1390
+ "title": "UXSpec",
1391
+ "description": "Complete UX specification for a single experience (visual, voice, chat, SMS)",
1392
+ "allOf": [
1393
+ {
1394
+ "$ref": "urn:dr:spec:base:spec-node"
1395
+ }
1396
+ ],
1397
+ "properties": {
1398
+ "spec_node_id": {
1399
+ "const": "ux.uxspec"
1400
+ },
1401
+ "layer_id": {
1402
+ "const": "ux"
1403
+ },
1404
+ "type": {
1405
+ "const": "uxspec"
1406
+ },
1407
+ "attributes": {
1408
+ "type": "object",
1409
+ "properties": {
1410
+ "version": {
1411
+ "type": "string"
1412
+ },
1413
+ "experience": {
1414
+ "type": "string",
1415
+ "enum": ["visual", "voice", "chat", "sms"],
1416
+ "description": "Delivery modality this spec describes. 'visual': screen-based UI; 'voice': voice assistant interface; 'chat': conversational messaging UI; 'sms': text message-based interaction."
1417
+ },
1418
+ "title": {
1419
+ "type": "string"
1420
+ },
1421
+ "description": {
1422
+ "type": "string"
1423
+ },
1424
+ "source": {
1425
+ "type": "object",
1426
+ "description": "Reference to the design artifact (e.g., Figma file, Storybook, or internal design system URL) that this spec is based on.",
1427
+ "properties": {
1428
+ "type": {
1429
+ "type": "string",
1430
+ "enum": ["figma", "storybook", "zeplin", "url"],
1431
+ "description": "Design tool or artifact type."
1432
+ },
1433
+ "url": {
1434
+ "type": "string",
1435
+ "description": "URL to the design artifact."
1436
+ }
1437
+ },
1438
+ "additionalProperties": false
1439
+ },
1440
+ "views": {
1441
+ "type": "array",
1442
+ "description": "List of ux.view specNodeIds that comprise the routable screens of this experience.",
1443
+ "items": {
1444
+ "type": "string",
1445
+ "description": "SpecNodeId of a ux.view node."
1446
+ }
1447
+ },
1448
+ "states": {
1449
+ "type": "array",
1450
+ "description": "List of ux.experiencestate specNodeIds that represent the top-level states of this experience's state machine.",
1451
+ "items": {
1452
+ "type": "string",
1453
+ "description": "SpecNodeId of a ux.experiencestate node."
1454
+ }
1455
+ }
1456
+ },
1457
+ "additionalProperties": false
1458
+ }
1459
+ },
1460
+ "$id": "urn:dr:spec:node:ux.uxspec"
1461
+ },
1462
+ "view": {
1463
+ "$schema": "http://json-schema.org/draft-07/schema#",
1464
+ "title": "View",
1465
+ "description": "Routable grouping of components (a complete user experience)",
1466
+ "allOf": [
1467
+ {
1468
+ "$ref": "urn:dr:spec:base:spec-node"
1469
+ }
1470
+ ],
1471
+ "properties": {
1472
+ "spec_node_id": {
1473
+ "const": "ux.view"
1474
+ },
1475
+ "layer_id": {
1476
+ "const": "ux"
1477
+ },
1478
+ "type": {
1479
+ "const": "view"
1480
+ },
1481
+ "attributes": {
1482
+ "type": "object",
1483
+ "properties": {
1484
+ "type": {
1485
+ "type": "string",
1486
+ "enum": [
1487
+ "page",
1488
+ "modal",
1489
+ "dialog",
1490
+ "drawer",
1491
+ "panel",
1492
+ "overlay",
1493
+ "embedded",
1494
+ "full-screen"
1495
+ ],
1496
+ "description": "View display mode, per HTML 5.3 sectioning and dialog element semantics."
1497
+ },
1498
+ "title": {
1499
+ "type": "string"
1500
+ },
1501
+ "description": {
1502
+ "type": "string"
1503
+ },
1504
+ "routable": {
1505
+ "type": "boolean"
1506
+ },
1507
+ "layout": {
1508
+ "type": "string"
1509
+ },
1510
+ "source": {
1511
+ "type": "object",
1512
+ "description": "Source code reference"
1513
+ }
1514
+ },
1515
+ "required": ["type"],
1516
+ "additionalProperties": false
1517
+ }
1518
+ },
1519
+ "$id": "urn:dr:spec:node:ux.view"
1520
+ }
1521
+ },
1522
+ "relationshipSchemas": {
1523
+ "ux.actioncomponent.accesses.data-store.collection": {
1524
+ "id": "ux.actioncomponent.accesses.data-store.collection",
1525
+ "source_spec_node_id": "ux.actioncomponent",
1526
+ "source_layer": "ux",
1527
+ "destination_spec_node_id": "data-store.collection",
1528
+ "destination_layer": "data-store",
1529
+ "predicate": "accesses",
1530
+ "cardinality": "many-to-many",
1531
+ "strength": "medium",
1532
+ "required": false
1533
+ },
1534
+ "ux.actioncomponent.binds-to.ux.dataconfig": {
1535
+ "id": "ux.actioncomponent.binds-to.ux.dataconfig",
1536
+ "source_spec_node_id": "ux.actioncomponent",
1537
+ "source_layer": "ux",
1538
+ "destination_spec_node_id": "ux.dataconfig",
1539
+ "destination_layer": "ux",
1540
+ "predicate": "binds-to",
1541
+ "cardinality": "many-to-many",
1542
+ "strength": "medium",
1543
+ "required": false
1544
+ },
1545
+ "ux.actioncomponent.implements.ux.actionpattern": {
1546
+ "id": "ux.actioncomponent.implements.ux.actionpattern",
1547
+ "source_spec_node_id": "ux.actioncomponent",
1548
+ "source_layer": "ux",
1549
+ "destination_spec_node_id": "ux.actionpattern",
1550
+ "destination_layer": "ux",
1551
+ "predicate": "implements",
1552
+ "cardinality": "many-to-many",
1553
+ "strength": "medium",
1554
+ "required": false
1555
+ },
1556
+ "ux.actioncomponent.navigates-to.ux.view": {
1557
+ "id": "ux.actioncomponent.navigates-to.ux.view",
1558
+ "source_spec_node_id": "ux.actioncomponent",
1559
+ "source_layer": "ux",
1560
+ "destination_spec_node_id": "ux.view",
1561
+ "destination_layer": "ux",
1562
+ "predicate": "navigates-to",
1563
+ "cardinality": "many-to-many",
1564
+ "strength": "medium",
1565
+ "required": false
1566
+ },
1567
+ "ux.actioncomponent.realizes.business.businessfunction": {
1568
+ "id": "ux.actioncomponent.realizes.business.businessfunction",
1569
+ "source_spec_node_id": "ux.actioncomponent",
1570
+ "source_layer": "ux",
1571
+ "destination_spec_node_id": "business.businessfunction",
1572
+ "destination_layer": "business",
1573
+ "predicate": "realizes",
1574
+ "cardinality": "many-to-many",
1575
+ "strength": "medium",
1576
+ "required": false
1577
+ },
1578
+ "ux.actioncomponent.references.security.secureresource": {
1579
+ "id": "ux.actioncomponent.references.security.secureresource",
1580
+ "source_spec_node_id": "ux.actioncomponent",
1581
+ "source_layer": "ux",
1582
+ "destination_spec_node_id": "security.secureresource",
1583
+ "destination_layer": "security",
1584
+ "predicate": "references",
1585
+ "cardinality": "many-to-many",
1586
+ "strength": "medium",
1587
+ "required": false
1588
+ },
1589
+ "ux.actioncomponent.renders.ux.actioncomponent": {
1590
+ "id": "ux.actioncomponent.renders.ux.actioncomponent",
1591
+ "source_spec_node_id": "ux.actioncomponent",
1592
+ "source_layer": "ux",
1593
+ "destination_spec_node_id": "ux.actioncomponent",
1594
+ "destination_layer": "ux",
1595
+ "predicate": "renders",
1596
+ "cardinality": "many-to-many",
1597
+ "strength": "medium",
1598
+ "required": false
1599
+ },
1600
+ "ux.actioncomponent.renders.ux.componentinstance": {
1601
+ "id": "ux.actioncomponent.renders.ux.componentinstance",
1602
+ "source_spec_node_id": "ux.actioncomponent",
1603
+ "source_layer": "ux",
1604
+ "destination_spec_node_id": "ux.componentinstance",
1605
+ "destination_layer": "ux",
1606
+ "predicate": "renders",
1607
+ "cardinality": "many-to-many",
1608
+ "strength": "medium",
1609
+ "required": false
1610
+ },
1611
+ "ux.actioncomponent.renders.ux.componentreference": {
1612
+ "id": "ux.actioncomponent.renders.ux.componentreference",
1613
+ "source_spec_node_id": "ux.actioncomponent",
1614
+ "source_layer": "ux",
1615
+ "destination_spec_node_id": "ux.componentreference",
1616
+ "destination_layer": "ux",
1617
+ "predicate": "renders",
1618
+ "cardinality": "many-to-many",
1619
+ "strength": "medium",
1620
+ "required": false
1621
+ },
1622
+ "ux.actioncomponent.renders.ux.librarycomponent": {
1623
+ "id": "ux.actioncomponent.renders.ux.librarycomponent",
1624
+ "source_spec_node_id": "ux.actioncomponent",
1625
+ "source_layer": "ux",
1626
+ "destination_spec_node_id": "ux.librarycomponent",
1627
+ "destination_layer": "ux",
1628
+ "predicate": "renders",
1629
+ "cardinality": "many-to-many",
1630
+ "strength": "medium",
1631
+ "required": false
1632
+ },
1633
+ "ux.actioncomponent.requires.security.permission": {
1634
+ "id": "ux.actioncomponent.requires.security.permission",
1635
+ "source_spec_node_id": "ux.actioncomponent",
1636
+ "source_layer": "ux",
1637
+ "destination_spec_node_id": "security.permission",
1638
+ "destination_layer": "security",
1639
+ "predicate": "requires",
1640
+ "cardinality": "many-to-many",
1641
+ "strength": "medium",
1642
+ "required": false
1643
+ },
1644
+ "ux.actioncomponent.satisfies.motivation.requirement": {
1645
+ "id": "ux.actioncomponent.satisfies.motivation.requirement",
1646
+ "source_spec_node_id": "ux.actioncomponent",
1647
+ "source_layer": "ux",
1648
+ "destination_spec_node_id": "motivation.requirement",
1649
+ "destination_layer": "motivation",
1650
+ "predicate": "satisfies",
1651
+ "cardinality": "many-to-many",
1652
+ "strength": "medium",
1653
+ "required": false
1654
+ },
1655
+ "ux.actioncomponent.triggers.application.applicationservice": {
1656
+ "id": "ux.actioncomponent.triggers.application.applicationservice",
1657
+ "source_spec_node_id": "ux.actioncomponent",
1658
+ "source_layer": "ux",
1659
+ "destination_spec_node_id": "application.applicationservice",
1660
+ "destination_layer": "application",
1661
+ "predicate": "triggers",
1662
+ "cardinality": "many-to-many",
1663
+ "strength": "medium",
1664
+ "required": false
1665
+ },
1666
+ "ux.actioncomponent.triggers.business.businessevent": {
1667
+ "id": "ux.actioncomponent.triggers.business.businessevent",
1668
+ "source_spec_node_id": "ux.actioncomponent",
1669
+ "source_layer": "ux",
1670
+ "destination_spec_node_id": "business.businessevent",
1671
+ "destination_layer": "business",
1672
+ "predicate": "triggers",
1673
+ "cardinality": "many-to-many",
1674
+ "strength": "medium",
1675
+ "required": false
1676
+ },
1677
+ "ux.actioncomponent.triggers.api.operation": {
1678
+ "id": "ux.actioncomponent.triggers.api.operation",
1679
+ "source_spec_node_id": "ux.actioncomponent",
1680
+ "source_layer": "ux",
1681
+ "destination_spec_node_id": "api.operation",
1682
+ "destination_layer": "api",
1683
+ "predicate": "triggers",
1684
+ "cardinality": "many-to-many",
1685
+ "strength": "medium",
1686
+ "required": false
1687
+ },
1688
+ "ux.actioncomponent.triggers.ux.stateaction": {
1689
+ "id": "ux.actioncomponent.triggers.ux.stateaction",
1690
+ "source_spec_node_id": "ux.actioncomponent",
1691
+ "source_layer": "ux",
1692
+ "destination_spec_node_id": "ux.stateaction",
1693
+ "destination_layer": "ux",
1694
+ "predicate": "triggers",
1695
+ "cardinality": "many-to-many",
1696
+ "strength": "medium",
1697
+ "required": false
1698
+ },
1699
+ "ux.actioncomponent.triggers.ux.statetransition": {
1700
+ "id": "ux.actioncomponent.triggers.ux.statetransition",
1701
+ "source_spec_node_id": "ux.actioncomponent",
1702
+ "source_layer": "ux",
1703
+ "destination_spec_node_id": "ux.statetransition",
1704
+ "destination_layer": "ux",
1705
+ "predicate": "triggers",
1706
+ "cardinality": "many-to-many",
1707
+ "strength": "medium",
1708
+ "required": false
1709
+ },
1710
+ "ux.actioncomponent.triggers.data-store.storedlogic": {
1711
+ "id": "ux.actioncomponent.triggers.data-store.storedlogic",
1712
+ "source_spec_node_id": "ux.actioncomponent",
1713
+ "source_layer": "ux",
1714
+ "destination_spec_node_id": "data-store.storedlogic",
1715
+ "destination_layer": "data-store",
1716
+ "predicate": "triggers",
1717
+ "cardinality": "many-to-many",
1718
+ "strength": "medium",
1719
+ "required": false
1720
+ },
1721
+ "ux.actioncomponent.uses.application.applicationfunction": {
1722
+ "id": "ux.actioncomponent.uses.application.applicationfunction",
1723
+ "source_spec_node_id": "ux.actioncomponent",
1724
+ "source_layer": "ux",
1725
+ "destination_spec_node_id": "application.applicationfunction",
1726
+ "destination_layer": "application",
1727
+ "predicate": "uses",
1728
+ "cardinality": "many-to-many",
1729
+ "strength": "medium",
1730
+ "required": false
1731
+ },
1732
+ "ux.actioncomponent.uses.ux.errorconfig": {
1733
+ "id": "ux.actioncomponent.uses.ux.errorconfig",
1734
+ "source_spec_node_id": "ux.actioncomponent",
1735
+ "source_layer": "ux",
1736
+ "destination_spec_node_id": "ux.errorconfig",
1737
+ "destination_layer": "ux",
1738
+ "predicate": "uses",
1739
+ "cardinality": "many-to-many",
1740
+ "strength": "medium",
1741
+ "required": false
1742
+ },
1743
+ "ux.actioncomponent.uses.technology.technologyservice": {
1744
+ "id": "ux.actioncomponent.uses.technology.technologyservice",
1745
+ "source_spec_node_id": "ux.actioncomponent",
1746
+ "source_layer": "ux",
1747
+ "destination_spec_node_id": "technology.technologyservice",
1748
+ "destination_layer": "technology",
1749
+ "predicate": "uses",
1750
+ "cardinality": "many-to-many",
1751
+ "strength": "medium",
1752
+ "required": false
1753
+ },
1754
+ "ux.actionpattern.associated-with.ux.statepattern": {
1755
+ "id": "ux.actionpattern.associated-with.ux.statepattern",
1756
+ "source_spec_node_id": "ux.actionpattern",
1757
+ "source_layer": "ux",
1758
+ "destination_spec_node_id": "ux.statepattern",
1759
+ "destination_layer": "ux",
1760
+ "predicate": "associated-with",
1761
+ "cardinality": "many-to-many",
1762
+ "strength": "medium",
1763
+ "required": false
1764
+ },
1765
+ "ux.actionpattern.governs.ux.actioncomponent": {
1766
+ "id": "ux.actionpattern.governs.ux.actioncomponent",
1767
+ "source_spec_node_id": "ux.actionpattern",
1768
+ "source_layer": "ux",
1769
+ "destination_spec_node_id": "ux.actioncomponent",
1770
+ "destination_layer": "ux",
1771
+ "predicate": "governs",
1772
+ "cardinality": "many-to-many",
1773
+ "strength": "medium",
1774
+ "required": false
1775
+ },
1776
+ "ux.actionpattern.governs.ux.stateaction": {
1777
+ "id": "ux.actionpattern.governs.ux.stateaction",
1778
+ "source_spec_node_id": "ux.actionpattern",
1779
+ "source_layer": "ux",
1780
+ "destination_spec_node_id": "ux.stateaction",
1781
+ "destination_layer": "ux",
1782
+ "predicate": "governs",
1783
+ "cardinality": "many-to-many",
1784
+ "strength": "medium",
1785
+ "required": false
1786
+ },
1787
+ "ux.actionpattern.triggers.ux.statetransition": {
1788
+ "id": "ux.actionpattern.triggers.ux.statetransition",
1789
+ "source_spec_node_id": "ux.actionpattern",
1790
+ "source_layer": "ux",
1791
+ "destination_spec_node_id": "ux.statetransition",
1792
+ "destination_layer": "ux",
1793
+ "predicate": "triggers",
1794
+ "cardinality": "many-to-many",
1795
+ "strength": "medium",
1796
+ "required": false
1797
+ },
1798
+ "ux.actionpattern.uses.ux.transitiontemplate": {
1799
+ "id": "ux.actionpattern.uses.ux.transitiontemplate",
1800
+ "source_spec_node_id": "ux.actionpattern",
1801
+ "source_layer": "ux",
1802
+ "destination_spec_node_id": "ux.transitiontemplate",
1803
+ "destination_layer": "ux",
1804
+ "predicate": "uses",
1805
+ "cardinality": "many-to-many",
1806
+ "strength": "medium",
1807
+ "required": false
1808
+ },
1809
+ "ux.chartseries.accesses.data-store.collection": {
1810
+ "id": "ux.chartseries.accesses.data-store.collection",
1811
+ "source_spec_node_id": "ux.chartseries",
1812
+ "source_layer": "ux",
1813
+ "destination_spec_node_id": "data-store.collection",
1814
+ "destination_layer": "data-store",
1815
+ "predicate": "accesses",
1816
+ "cardinality": "many-to-many",
1817
+ "strength": "medium",
1818
+ "required": false
1819
+ },
1820
+ "ux.chartseries.binds-to.ux.dataconfig": {
1821
+ "id": "ux.chartseries.binds-to.ux.dataconfig",
1822
+ "source_spec_node_id": "ux.chartseries",
1823
+ "source_layer": "ux",
1824
+ "destination_spec_node_id": "ux.dataconfig",
1825
+ "destination_layer": "ux",
1826
+ "predicate": "binds-to",
1827
+ "cardinality": "many-to-many",
1828
+ "strength": "medium",
1829
+ "required": false
1830
+ },
1831
+ "ux.chartseries.maps-to.data-model.arrayschema": {
1832
+ "id": "ux.chartseries.maps-to.data-model.arrayschema",
1833
+ "source_spec_node_id": "ux.chartseries",
1834
+ "source_layer": "ux",
1835
+ "destination_spec_node_id": "data-model.arrayschema",
1836
+ "destination_layer": "data-model",
1837
+ "predicate": "maps-to",
1838
+ "cardinality": "many-to-many",
1839
+ "strength": "medium",
1840
+ "required": false
1841
+ },
1842
+ "ux.chartseries.references.ux.librarycomponent": {
1843
+ "id": "ux.chartseries.references.ux.librarycomponent",
1844
+ "source_spec_node_id": "ux.chartseries",
1845
+ "source_layer": "ux",
1846
+ "destination_spec_node_id": "ux.librarycomponent",
1847
+ "destination_layer": "ux",
1848
+ "predicate": "references",
1849
+ "cardinality": "many-to-many",
1850
+ "strength": "medium",
1851
+ "required": false
1852
+ },
1853
+ "ux.chartseries.uses.ux.experiencestate": {
1854
+ "id": "ux.chartseries.uses.ux.experiencestate",
1855
+ "source_spec_node_id": "ux.chartseries",
1856
+ "source_layer": "ux",
1857
+ "destination_spec_node_id": "ux.experiencestate",
1858
+ "destination_layer": "ux",
1859
+ "predicate": "uses",
1860
+ "cardinality": "many-to-many",
1861
+ "strength": "medium",
1862
+ "required": false
1863
+ },
1864
+ "ux.componentinstance.accesses.application.applicationservice": {
1865
+ "id": "ux.componentinstance.accesses.application.applicationservice",
1866
+ "source_spec_node_id": "ux.componentinstance",
1867
+ "source_layer": "ux",
1868
+ "destination_spec_node_id": "application.applicationservice",
1869
+ "destination_layer": "application",
1870
+ "predicate": "accesses",
1871
+ "cardinality": "many-to-many",
1872
+ "strength": "medium",
1873
+ "required": false
1874
+ },
1875
+ "ux.componentinstance.aggregates.ux.chartseries": {
1876
+ "id": "ux.componentinstance.aggregates.ux.chartseries",
1877
+ "source_spec_node_id": "ux.componentinstance",
1878
+ "source_layer": "ux",
1879
+ "destination_spec_node_id": "ux.chartseries",
1880
+ "destination_layer": "ux",
1881
+ "predicate": "aggregates",
1882
+ "cardinality": "many-to-many",
1883
+ "strength": "medium",
1884
+ "required": false
1885
+ },
1886
+ "ux.componentinstance.aggregates.ux.componentreference": {
1887
+ "id": "ux.componentinstance.aggregates.ux.componentreference",
1888
+ "source_spec_node_id": "ux.componentinstance",
1889
+ "source_layer": "ux",
1890
+ "destination_spec_node_id": "ux.componentreference",
1891
+ "destination_layer": "ux",
1892
+ "predicate": "aggregates",
1893
+ "cardinality": "many-to-many",
1894
+ "strength": "medium",
1895
+ "required": false
1896
+ },
1897
+ "ux.componentinstance.aggregates.ux.tablecolumn": {
1898
+ "id": "ux.componentinstance.aggregates.ux.tablecolumn",
1899
+ "source_spec_node_id": "ux.componentinstance",
1900
+ "source_layer": "ux",
1901
+ "destination_spec_node_id": "ux.tablecolumn",
1902
+ "destination_layer": "ux",
1903
+ "predicate": "aggregates",
1904
+ "cardinality": "many-to-many",
1905
+ "strength": "medium",
1906
+ "required": false
1907
+ },
1908
+ "ux.componentinstance.binds-to.ux.dataconfig": {
1909
+ "id": "ux.componentinstance.binds-to.ux.dataconfig",
1910
+ "source_spec_node_id": "ux.componentinstance",
1911
+ "source_layer": "ux",
1912
+ "destination_spec_node_id": "ux.dataconfig",
1913
+ "destination_layer": "ux",
1914
+ "predicate": "binds-to",
1915
+ "cardinality": "many-to-many",
1916
+ "strength": "medium",
1917
+ "required": false
1918
+ },
1919
+ "ux.componentinstance.implements.ux.librarycomponent": {
1920
+ "id": "ux.componentinstance.implements.ux.librarycomponent",
1921
+ "source_spec_node_id": "ux.componentinstance",
1922
+ "source_layer": "ux",
1923
+ "destination_spec_node_id": "ux.librarycomponent",
1924
+ "destination_layer": "ux",
1925
+ "predicate": "implements",
1926
+ "cardinality": "many-to-many",
1927
+ "strength": "medium",
1928
+ "required": false
1929
+ },
1930
+ "ux.componentinstance.maps-to.data-model.objectschema": {
1931
+ "id": "ux.componentinstance.maps-to.data-model.objectschema",
1932
+ "source_spec_node_id": "ux.componentinstance",
1933
+ "source_layer": "ux",
1934
+ "destination_spec_node_id": "data-model.objectschema",
1935
+ "destination_layer": "data-model",
1936
+ "predicate": "maps-to",
1937
+ "cardinality": "many-to-many",
1938
+ "strength": "medium",
1939
+ "required": false
1940
+ },
1941
+ "ux.componentinstance.provides.ux.componentinstance": {
1942
+ "id": "ux.componentinstance.provides.ux.componentinstance",
1943
+ "source_spec_node_id": "ux.componentinstance",
1944
+ "source_layer": "ux",
1945
+ "destination_spec_node_id": "ux.componentinstance",
1946
+ "destination_layer": "ux",
1947
+ "predicate": "provides",
1948
+ "cardinality": "many-to-many",
1949
+ "strength": "medium",
1950
+ "required": false
1951
+ },
1952
+ "ux.componentinstance.realizes.ux.librarycomponent": {
1953
+ "id": "ux.componentinstance.realizes.ux.librarycomponent",
1954
+ "source_spec_node_id": "ux.componentinstance",
1955
+ "source_layer": "ux",
1956
+ "destination_spec_node_id": "ux.librarycomponent",
1957
+ "destination_layer": "ux",
1958
+ "predicate": "realizes",
1959
+ "cardinality": "many-to-many",
1960
+ "strength": "medium",
1961
+ "required": false
1962
+ },
1963
+ "ux.componentinstance.renders.ux.actioncomponent": {
1964
+ "id": "ux.componentinstance.renders.ux.actioncomponent",
1965
+ "source_spec_node_id": "ux.componentinstance",
1966
+ "source_layer": "ux",
1967
+ "destination_spec_node_id": "ux.actioncomponent",
1968
+ "destination_layer": "ux",
1969
+ "predicate": "renders",
1970
+ "cardinality": "many-to-many",
1971
+ "strength": "medium",
1972
+ "required": false
1973
+ },
1974
+ "ux.componentinstance.renders.ux.componentinstance": {
1975
+ "id": "ux.componentinstance.renders.ux.componentinstance",
1976
+ "source_spec_node_id": "ux.componentinstance",
1977
+ "source_layer": "ux",
1978
+ "destination_spec_node_id": "ux.componentinstance",
1979
+ "destination_layer": "ux",
1980
+ "predicate": "renders",
1981
+ "cardinality": "many-to-many",
1982
+ "strength": "medium",
1983
+ "required": false
1984
+ },
1985
+ "ux.componentinstance.renders.ux.componentreference": {
1986
+ "id": "ux.componentinstance.renders.ux.componentreference",
1987
+ "source_spec_node_id": "ux.componentinstance",
1988
+ "source_layer": "ux",
1989
+ "destination_spec_node_id": "ux.componentreference",
1990
+ "destination_layer": "ux",
1991
+ "predicate": "renders",
1992
+ "cardinality": "many-to-many",
1993
+ "strength": "medium",
1994
+ "required": false
1995
+ },
1996
+ "ux.componentinstance.renders.ux.layoutconfig": {
1997
+ "id": "ux.componentinstance.renders.ux.layoutconfig",
1998
+ "source_spec_node_id": "ux.componentinstance",
1999
+ "source_layer": "ux",
2000
+ "destination_spec_node_id": "ux.layoutconfig",
2001
+ "destination_layer": "ux",
2002
+ "predicate": "renders",
2003
+ "cardinality": "many-to-many",
2004
+ "strength": "medium",
2005
+ "required": false
2006
+ },
2007
+ "ux.componentinstance.renders.ux.librarycomponent": {
2008
+ "id": "ux.componentinstance.renders.ux.librarycomponent",
2009
+ "source_spec_node_id": "ux.componentinstance",
2010
+ "source_layer": "ux",
2011
+ "destination_spec_node_id": "ux.librarycomponent",
2012
+ "destination_layer": "ux",
2013
+ "predicate": "renders",
2014
+ "cardinality": "many-to-many",
2015
+ "strength": "medium",
2016
+ "required": false
2017
+ },
2018
+ "ux.componentinstance.uses.ux.errorconfig": {
2019
+ "id": "ux.componentinstance.uses.ux.errorconfig",
2020
+ "source_spec_node_id": "ux.componentinstance",
2021
+ "source_layer": "ux",
2022
+ "destination_spec_node_id": "ux.errorconfig",
2023
+ "destination_layer": "ux",
2024
+ "predicate": "uses",
2025
+ "cardinality": "many-to-many",
2026
+ "strength": "medium",
2027
+ "required": false
2028
+ },
2029
+ "ux.componentreference.implements.ux.librarycomponent": {
2030
+ "id": "ux.componentreference.implements.ux.librarycomponent",
2031
+ "source_spec_node_id": "ux.componentreference",
2032
+ "source_layer": "ux",
2033
+ "destination_spec_node_id": "ux.librarycomponent",
2034
+ "destination_layer": "ux",
2035
+ "predicate": "implements",
2036
+ "cardinality": "many-to-many",
2037
+ "strength": "medium",
2038
+ "required": false
2039
+ },
2040
+ "ux.componentreference.renders.ux.actioncomponent": {
2041
+ "id": "ux.componentreference.renders.ux.actioncomponent",
2042
+ "source_spec_node_id": "ux.componentreference",
2043
+ "source_layer": "ux",
2044
+ "destination_spec_node_id": "ux.actioncomponent",
2045
+ "destination_layer": "ux",
2046
+ "predicate": "renders",
2047
+ "cardinality": "many-to-many",
2048
+ "strength": "medium",
2049
+ "required": false
2050
+ },
2051
+ "ux.componentreference.renders.ux.componentinstance": {
2052
+ "id": "ux.componentreference.renders.ux.componentinstance",
2053
+ "source_spec_node_id": "ux.componentreference",
2054
+ "source_layer": "ux",
2055
+ "destination_spec_node_id": "ux.componentinstance",
2056
+ "destination_layer": "ux",
2057
+ "predicate": "renders",
2058
+ "cardinality": "many-to-many",
2059
+ "strength": "medium",
2060
+ "required": false
2061
+ },
2062
+ "ux.componentreference.renders.ux.componentreference": {
2063
+ "id": "ux.componentreference.renders.ux.componentreference",
2064
+ "source_spec_node_id": "ux.componentreference",
2065
+ "source_layer": "ux",
2066
+ "destination_spec_node_id": "ux.componentreference",
2067
+ "destination_layer": "ux",
2068
+ "predicate": "renders",
2069
+ "cardinality": "many-to-many",
2070
+ "strength": "medium",
2071
+ "required": false
2072
+ },
2073
+ "ux.componentreference.renders.ux.librarycomponent": {
2074
+ "id": "ux.componentreference.renders.ux.librarycomponent",
2075
+ "source_spec_node_id": "ux.componentreference",
2076
+ "source_layer": "ux",
2077
+ "destination_spec_node_id": "ux.librarycomponent",
2078
+ "destination_layer": "ux",
2079
+ "predicate": "renders",
2080
+ "cardinality": "many-to-many",
2081
+ "strength": "medium",
2082
+ "required": false
2083
+ },
2084
+ "ux.componentreference.uses.ux.layoutconfig": {
2085
+ "id": "ux.componentreference.uses.ux.layoutconfig",
2086
+ "source_spec_node_id": "ux.componentreference",
2087
+ "source_layer": "ux",
2088
+ "destination_spec_node_id": "ux.layoutconfig",
2089
+ "destination_layer": "ux",
2090
+ "predicate": "uses",
2091
+ "cardinality": "many-to-many",
2092
+ "strength": "medium",
2093
+ "required": false
2094
+ },
2095
+ "ux.dataconfig.accesses.data-store.collection": {
2096
+ "id": "ux.dataconfig.accesses.data-store.collection",
2097
+ "source_spec_node_id": "ux.dataconfig",
2098
+ "source_layer": "ux",
2099
+ "destination_spec_node_id": "data-store.collection",
2100
+ "destination_layer": "data-store",
2101
+ "predicate": "accesses",
2102
+ "cardinality": "many-to-many",
2103
+ "strength": "medium",
2104
+ "required": false
2105
+ },
2106
+ "ux.dataconfig.aggregates.ux.errorconfig": {
2107
+ "id": "ux.dataconfig.aggregates.ux.errorconfig",
2108
+ "source_spec_node_id": "ux.dataconfig",
2109
+ "source_layer": "ux",
2110
+ "destination_spec_node_id": "ux.errorconfig",
2111
+ "destination_layer": "ux",
2112
+ "predicate": "aggregates",
2113
+ "cardinality": "many-to-many",
2114
+ "strength": "medium",
2115
+ "required": false
2116
+ },
2117
+ "ux.dataconfig.binds-to.ux.componentinstance": {
2118
+ "id": "ux.dataconfig.binds-to.ux.componentinstance",
2119
+ "source_spec_node_id": "ux.dataconfig",
2120
+ "source_layer": "ux",
2121
+ "destination_spec_node_id": "ux.componentinstance",
2122
+ "destination_layer": "ux",
2123
+ "predicate": "binds-to",
2124
+ "cardinality": "many-to-many",
2125
+ "strength": "medium",
2126
+ "required": false
2127
+ },
2128
+ "ux.dataconfig.binds-to.ux.librarycomponent": {
2129
+ "id": "ux.dataconfig.binds-to.ux.librarycomponent",
2130
+ "source_spec_node_id": "ux.dataconfig",
2131
+ "source_layer": "ux",
2132
+ "destination_spec_node_id": "ux.librarycomponent",
2133
+ "destination_layer": "ux",
2134
+ "predicate": "binds-to",
2135
+ "cardinality": "many-to-many",
2136
+ "strength": "medium",
2137
+ "required": false
2138
+ },
2139
+ "ux.dataconfig.binds-to.ux.subview": {
2140
+ "id": "ux.dataconfig.binds-to.ux.subview",
2141
+ "source_spec_node_id": "ux.dataconfig",
2142
+ "source_layer": "ux",
2143
+ "destination_spec_node_id": "ux.subview",
2144
+ "destination_layer": "ux",
2145
+ "predicate": "binds-to",
2146
+ "cardinality": "many-to-many",
2147
+ "strength": "medium",
2148
+ "required": false
2149
+ },
2150
+ "ux.dataconfig.binds-to.ux.view": {
2151
+ "id": "ux.dataconfig.binds-to.ux.view",
2152
+ "source_spec_node_id": "ux.dataconfig",
2153
+ "source_layer": "ux",
2154
+ "destination_spec_node_id": "ux.view",
2155
+ "destination_layer": "ux",
2156
+ "predicate": "binds-to",
2157
+ "cardinality": "many-to-many",
2158
+ "strength": "medium",
2159
+ "required": false
2160
+ },
2161
+ "ux.dataconfig.composes.ux.chartseries": {
2162
+ "id": "ux.dataconfig.composes.ux.chartseries",
2163
+ "source_spec_node_id": "ux.dataconfig",
2164
+ "source_layer": "ux",
2165
+ "destination_spec_node_id": "ux.chartseries",
2166
+ "destination_layer": "ux",
2167
+ "predicate": "composes",
2168
+ "cardinality": "many-to-many",
2169
+ "strength": "medium",
2170
+ "required": false
2171
+ },
2172
+ "ux.dataconfig.maps-to.data-model.objectschema": {
2173
+ "id": "ux.dataconfig.maps-to.data-model.objectschema",
2174
+ "source_spec_node_id": "ux.dataconfig",
2175
+ "source_layer": "ux",
2176
+ "destination_spec_node_id": "data-model.objectschema",
2177
+ "destination_layer": "data-model",
2178
+ "predicate": "maps-to",
2179
+ "cardinality": "many-to-many",
2180
+ "strength": "medium",
2181
+ "required": false
2182
+ },
2183
+ "ux.dataconfig.maps-to.api.requestbody": {
2184
+ "id": "ux.dataconfig.maps-to.api.requestbody",
2185
+ "source_spec_node_id": "ux.dataconfig",
2186
+ "source_layer": "ux",
2187
+ "destination_spec_node_id": "api.requestbody",
2188
+ "destination_layer": "api",
2189
+ "predicate": "maps-to",
2190
+ "cardinality": "many-to-many",
2191
+ "strength": "medium",
2192
+ "required": false
2193
+ },
2194
+ "ux.dataconfig.maps-to.api.response": {
2195
+ "id": "ux.dataconfig.maps-to.api.response",
2196
+ "source_spec_node_id": "ux.dataconfig",
2197
+ "source_layer": "ux",
2198
+ "destination_spec_node_id": "api.response",
2199
+ "destination_layer": "api",
2200
+ "predicate": "maps-to",
2201
+ "cardinality": "many-to-many",
2202
+ "strength": "medium",
2203
+ "required": false
2204
+ },
2205
+ "ux.dataconfig.maps-to.api.schema": {
2206
+ "id": "ux.dataconfig.maps-to.api.schema",
2207
+ "source_spec_node_id": "ux.dataconfig",
2208
+ "source_layer": "ux",
2209
+ "destination_spec_node_id": "api.schema",
2210
+ "destination_layer": "api",
2211
+ "predicate": "maps-to",
2212
+ "cardinality": "many-to-many",
2213
+ "strength": "medium",
2214
+ "required": false
2215
+ },
2216
+ "ux.dataconfig.provides.ux.tablecolumn": {
2217
+ "id": "ux.dataconfig.provides.ux.tablecolumn",
2218
+ "source_spec_node_id": "ux.dataconfig",
2219
+ "source_layer": "ux",
2220
+ "destination_spec_node_id": "ux.tablecolumn",
2221
+ "destination_layer": "ux",
2222
+ "predicate": "provides",
2223
+ "cardinality": "many-to-many",
2224
+ "strength": "medium",
2225
+ "required": false
2226
+ },
2227
+ "ux.dataconfig.realizes.ux.statepattern": {
2228
+ "id": "ux.dataconfig.realizes.ux.statepattern",
2229
+ "source_spec_node_id": "ux.dataconfig",
2230
+ "source_layer": "ux",
2231
+ "destination_spec_node_id": "ux.statepattern",
2232
+ "destination_layer": "ux",
2233
+ "predicate": "realizes",
2234
+ "cardinality": "many-to-many",
2235
+ "strength": "medium",
2236
+ "required": false
2237
+ },
2238
+ "ux.dataconfig.references.data-model.schemadefinition": {
2239
+ "id": "ux.dataconfig.references.data-model.schemadefinition",
2240
+ "source_spec_node_id": "ux.dataconfig",
2241
+ "source_layer": "ux",
2242
+ "destination_spec_node_id": "data-model.schemadefinition",
2243
+ "destination_layer": "data-model",
2244
+ "predicate": "references",
2245
+ "cardinality": "many-to-many",
2246
+ "strength": "medium",
2247
+ "required": false
2248
+ },
2249
+ "ux.errorconfig.associated-with.ux.dataconfig": {
2250
+ "id": "ux.errorconfig.associated-with.ux.dataconfig",
2251
+ "source_spec_node_id": "ux.errorconfig",
2252
+ "source_layer": "ux",
2253
+ "destination_spec_node_id": "ux.dataconfig",
2254
+ "destination_layer": "ux",
2255
+ "predicate": "associated-with",
2256
+ "cardinality": "many-to-many",
2257
+ "strength": "medium",
2258
+ "required": false
2259
+ },
2260
+ "ux.errorconfig.governs.ux.actioncomponent": {
2261
+ "id": "ux.errorconfig.governs.ux.actioncomponent",
2262
+ "source_spec_node_id": "ux.errorconfig",
2263
+ "source_layer": "ux",
2264
+ "destination_spec_node_id": "ux.actioncomponent",
2265
+ "destination_layer": "ux",
2266
+ "predicate": "governs",
2267
+ "cardinality": "many-to-many",
2268
+ "strength": "medium",
2269
+ "required": false
2270
+ },
2271
+ "ux.errorconfig.governs.ux.componentinstance": {
2272
+ "id": "ux.errorconfig.governs.ux.componentinstance",
2273
+ "source_spec_node_id": "ux.errorconfig",
2274
+ "source_layer": "ux",
2275
+ "destination_spec_node_id": "ux.componentinstance",
2276
+ "destination_layer": "ux",
2277
+ "predicate": "governs",
2278
+ "cardinality": "many-to-many",
2279
+ "strength": "medium",
2280
+ "required": false
2281
+ },
2282
+ "ux.errorconfig.governs.ux.experiencestate": {
2283
+ "id": "ux.errorconfig.governs.ux.experiencestate",
2284
+ "source_spec_node_id": "ux.errorconfig",
2285
+ "source_layer": "ux",
2286
+ "destination_spec_node_id": "ux.experiencestate",
2287
+ "destination_layer": "ux",
2288
+ "predicate": "governs",
2289
+ "cardinality": "many-to-many",
2290
+ "strength": "medium",
2291
+ "required": false
2292
+ },
2293
+ "ux.errorconfig.governs.ux.view": {
2294
+ "id": "ux.errorconfig.governs.ux.view",
2295
+ "source_spec_node_id": "ux.errorconfig",
2296
+ "source_layer": "ux",
2297
+ "destination_spec_node_id": "ux.view",
2298
+ "destination_layer": "ux",
2299
+ "predicate": "governs",
2300
+ "cardinality": "many-to-many",
2301
+ "strength": "medium",
2302
+ "required": false
2303
+ },
2304
+ "ux.errorconfig.maps-to.api.response": {
2305
+ "id": "ux.errorconfig.maps-to.api.response",
2306
+ "source_spec_node_id": "ux.errorconfig",
2307
+ "source_layer": "ux",
2308
+ "destination_spec_node_id": "api.response",
2309
+ "destination_layer": "api",
2310
+ "predicate": "maps-to",
2311
+ "cardinality": "many-to-many",
2312
+ "strength": "medium",
2313
+ "required": false
2314
+ },
2315
+ "ux.errorconfig.references.data-model.objectschema": {
2316
+ "id": "ux.errorconfig.references.data-model.objectschema",
2317
+ "source_spec_node_id": "ux.errorconfig",
2318
+ "source_layer": "ux",
2319
+ "destination_spec_node_id": "data-model.objectschema",
2320
+ "destination_layer": "data-model",
2321
+ "predicate": "references",
2322
+ "cardinality": "many-to-many",
2323
+ "strength": "medium",
2324
+ "required": false
2325
+ },
2326
+ "ux.experiencestate.associated-with.ux.view": {
2327
+ "id": "ux.experiencestate.associated-with.ux.view",
2328
+ "source_spec_node_id": "ux.experiencestate",
2329
+ "source_layer": "ux",
2330
+ "destination_spec_node_id": "ux.view",
2331
+ "destination_layer": "ux",
2332
+ "predicate": "associated-with",
2333
+ "cardinality": "many-to-many",
2334
+ "strength": "medium",
2335
+ "required": false
2336
+ },
2337
+ "ux.experiencestate.flows-to.ux.statetransition": {
2338
+ "id": "ux.experiencestate.flows-to.ux.statetransition",
2339
+ "source_spec_node_id": "ux.experiencestate",
2340
+ "source_layer": "ux",
2341
+ "destination_spec_node_id": "ux.statetransition",
2342
+ "destination_layer": "ux",
2343
+ "predicate": "flows-to",
2344
+ "cardinality": "many-to-many",
2345
+ "strength": "medium",
2346
+ "required": false
2347
+ },
2348
+ "ux.experiencestate.governs.ux.view": {
2349
+ "id": "ux.experiencestate.governs.ux.view",
2350
+ "source_spec_node_id": "ux.experiencestate",
2351
+ "source_layer": "ux",
2352
+ "destination_spec_node_id": "ux.view",
2353
+ "destination_layer": "ux",
2354
+ "predicate": "governs",
2355
+ "cardinality": "many-to-many",
2356
+ "strength": "medium",
2357
+ "required": false
2358
+ },
2359
+ "ux.experiencestate.navigates-to.ux.experiencestate": {
2360
+ "id": "ux.experiencestate.navigates-to.ux.experiencestate",
2361
+ "source_spec_node_id": "ux.experiencestate",
2362
+ "source_layer": "ux",
2363
+ "destination_spec_node_id": "ux.experiencestate",
2364
+ "destination_layer": "ux",
2365
+ "predicate": "navigates-to",
2366
+ "cardinality": "many-to-many",
2367
+ "strength": "medium",
2368
+ "required": false
2369
+ },
2370
+ "ux.experiencestate.renders.ux.view": {
2371
+ "id": "ux.experiencestate.renders.ux.view",
2372
+ "source_spec_node_id": "ux.experiencestate",
2373
+ "source_layer": "ux",
2374
+ "destination_spec_node_id": "ux.view",
2375
+ "destination_layer": "ux",
2376
+ "predicate": "renders",
2377
+ "cardinality": "many-to-many",
2378
+ "strength": "medium",
2379
+ "required": false
2380
+ },
2381
+ "ux.experiencestate.specializes.ux.statepattern": {
2382
+ "id": "ux.experiencestate.specializes.ux.statepattern",
2383
+ "source_spec_node_id": "ux.experiencestate",
2384
+ "source_layer": "ux",
2385
+ "destination_spec_node_id": "ux.statepattern",
2386
+ "destination_layer": "ux",
2387
+ "predicate": "specializes",
2388
+ "cardinality": "many-to-many",
2389
+ "strength": "medium",
2390
+ "required": false
2391
+ },
2392
+ "ux.experiencestate.triggers.ux.stateaction": {
2393
+ "id": "ux.experiencestate.triggers.ux.stateaction",
2394
+ "source_spec_node_id": "ux.experiencestate",
2395
+ "source_layer": "ux",
2396
+ "destination_spec_node_id": "ux.stateaction",
2397
+ "destination_layer": "ux",
2398
+ "predicate": "triggers",
2399
+ "cardinality": "many-to-many",
2400
+ "strength": "medium",
2401
+ "required": false
2402
+ },
2403
+ "ux.experiencestate.uses.ux.stateactiontemplate": {
2404
+ "id": "ux.experiencestate.uses.ux.stateactiontemplate",
2405
+ "source_spec_node_id": "ux.experiencestate",
2406
+ "source_layer": "ux",
2407
+ "destination_spec_node_id": "ux.stateactiontemplate",
2408
+ "destination_layer": "ux",
2409
+ "predicate": "uses",
2410
+ "cardinality": "many-to-many",
2411
+ "strength": "medium",
2412
+ "required": false
2413
+ },
2414
+ "ux.layoutconfig.associated-with.ux.librarycomponent": {
2415
+ "id": "ux.layoutconfig.associated-with.ux.librarycomponent",
2416
+ "source_spec_node_id": "ux.layoutconfig",
2417
+ "source_layer": "ux",
2418
+ "destination_spec_node_id": "ux.librarycomponent",
2419
+ "destination_layer": "ux",
2420
+ "predicate": "associated-with",
2421
+ "cardinality": "many-to-many",
2422
+ "strength": "medium",
2423
+ "required": false
2424
+ },
2425
+ "ux.layoutconfig.composes.ux.layoutconfig": {
2426
+ "id": "ux.layoutconfig.composes.ux.layoutconfig",
2427
+ "source_spec_node_id": "ux.layoutconfig",
2428
+ "source_layer": "ux",
2429
+ "destination_spec_node_id": "ux.layoutconfig",
2430
+ "destination_layer": "ux",
2431
+ "predicate": "composes",
2432
+ "cardinality": "many-to-many",
2433
+ "strength": "medium",
2434
+ "required": false
2435
+ },
2436
+ "ux.layoutconfig.governs.ux.view": {
2437
+ "id": "ux.layoutconfig.governs.ux.view",
2438
+ "source_spec_node_id": "ux.layoutconfig",
2439
+ "source_layer": "ux",
2440
+ "destination_spec_node_id": "ux.view",
2441
+ "destination_layer": "ux",
2442
+ "predicate": "governs",
2443
+ "cardinality": "many-to-many",
2444
+ "strength": "medium",
2445
+ "required": false
2446
+ },
2447
+ "ux.layoutconfig.provides.ux.subview": {
2448
+ "id": "ux.layoutconfig.provides.ux.subview",
2449
+ "source_spec_node_id": "ux.layoutconfig",
2450
+ "source_layer": "ux",
2451
+ "destination_spec_node_id": "ux.subview",
2452
+ "destination_layer": "ux",
2453
+ "predicate": "provides",
2454
+ "cardinality": "many-to-many",
2455
+ "strength": "medium",
2456
+ "required": false
2457
+ },
2458
+ "ux.layoutconfig.provides.ux.view": {
2459
+ "id": "ux.layoutconfig.provides.ux.view",
2460
+ "source_spec_node_id": "ux.layoutconfig",
2461
+ "source_layer": "ux",
2462
+ "destination_spec_node_id": "ux.view",
2463
+ "destination_layer": "ux",
2464
+ "predicate": "provides",
2465
+ "cardinality": "many-to-many",
2466
+ "strength": "medium",
2467
+ "required": false
2468
+ },
2469
+ "ux.librarycomponent.composes.ux.actioncomponent": {
2470
+ "id": "ux.librarycomponent.composes.ux.actioncomponent",
2471
+ "source_spec_node_id": "ux.librarycomponent",
2472
+ "source_layer": "ux",
2473
+ "destination_spec_node_id": "ux.actioncomponent",
2474
+ "destination_layer": "ux",
2475
+ "predicate": "composes",
2476
+ "cardinality": "many-to-many",
2477
+ "strength": "medium",
2478
+ "required": false
2479
+ },
2480
+ "ux.librarycomponent.composes.ux.librarycomponent": {
2481
+ "id": "ux.librarycomponent.composes.ux.librarycomponent",
2482
+ "source_spec_node_id": "ux.librarycomponent",
2483
+ "source_layer": "ux",
2484
+ "destination_spec_node_id": "ux.librarycomponent",
2485
+ "destination_layer": "ux",
2486
+ "predicate": "composes",
2487
+ "cardinality": "many-to-many",
2488
+ "strength": "medium",
2489
+ "required": false
2490
+ },
2491
+ "ux.librarycomponent.depends-on.technology.systemsoftware": {
2492
+ "id": "ux.librarycomponent.depends-on.technology.systemsoftware",
2493
+ "source_spec_node_id": "ux.librarycomponent",
2494
+ "source_layer": "ux",
2495
+ "destination_spec_node_id": "technology.systemsoftware",
2496
+ "destination_layer": "technology",
2497
+ "predicate": "depends-on",
2498
+ "cardinality": "many-to-many",
2499
+ "strength": "medium",
2500
+ "required": false
2501
+ },
2502
+ "ux.librarycomponent.renders.ux.actioncomponent": {
2503
+ "id": "ux.librarycomponent.renders.ux.actioncomponent",
2504
+ "source_spec_node_id": "ux.librarycomponent",
2505
+ "source_layer": "ux",
2506
+ "destination_spec_node_id": "ux.actioncomponent",
2507
+ "destination_layer": "ux",
2508
+ "predicate": "renders",
2509
+ "cardinality": "many-to-many",
2510
+ "strength": "medium",
2511
+ "required": false
2512
+ },
2513
+ "ux.librarycomponent.renders.ux.componentinstance": {
2514
+ "id": "ux.librarycomponent.renders.ux.componentinstance",
2515
+ "source_spec_node_id": "ux.librarycomponent",
2516
+ "source_layer": "ux",
2517
+ "destination_spec_node_id": "ux.componentinstance",
2518
+ "destination_layer": "ux",
2519
+ "predicate": "renders",
2520
+ "cardinality": "many-to-many",
2521
+ "strength": "medium",
2522
+ "required": false
2523
+ },
2524
+ "ux.librarycomponent.renders.ux.componentreference": {
2525
+ "id": "ux.librarycomponent.renders.ux.componentreference",
2526
+ "source_spec_node_id": "ux.librarycomponent",
2527
+ "source_layer": "ux",
2528
+ "destination_spec_node_id": "ux.componentreference",
2529
+ "destination_layer": "ux",
2530
+ "predicate": "renders",
2531
+ "cardinality": "many-to-many",
2532
+ "strength": "medium",
2533
+ "required": false
2534
+ },
2535
+ "ux.librarycomponent.renders.ux.librarycomponent": {
2536
+ "id": "ux.librarycomponent.renders.ux.librarycomponent",
2537
+ "source_spec_node_id": "ux.librarycomponent",
2538
+ "source_layer": "ux",
2539
+ "destination_spec_node_id": "ux.librarycomponent",
2540
+ "destination_layer": "ux",
2541
+ "predicate": "renders",
2542
+ "cardinality": "many-to-many",
2543
+ "strength": "medium",
2544
+ "required": false
2545
+ },
2546
+ "ux.librarycomponent.requires.technology.technologyservice": {
2547
+ "id": "ux.librarycomponent.requires.technology.technologyservice",
2548
+ "source_spec_node_id": "ux.librarycomponent",
2549
+ "source_layer": "ux",
2550
+ "destination_spec_node_id": "technology.technologyservice",
2551
+ "destination_layer": "technology",
2552
+ "predicate": "requires",
2553
+ "cardinality": "many-to-many",
2554
+ "strength": "medium",
2555
+ "required": false
2556
+ },
2557
+ "ux.librarycomponent.satisfies.motivation.principle": {
2558
+ "id": "ux.librarycomponent.satisfies.motivation.principle",
2559
+ "source_spec_node_id": "ux.librarycomponent",
2560
+ "source_layer": "ux",
2561
+ "destination_spec_node_id": "motivation.principle",
2562
+ "destination_layer": "motivation",
2563
+ "predicate": "satisfies",
2564
+ "cardinality": "many-to-many",
2565
+ "strength": "medium",
2566
+ "required": false
2567
+ },
2568
+ "ux.librarycomponent.satisfies.motivation.requirement": {
2569
+ "id": "ux.librarycomponent.satisfies.motivation.requirement",
2570
+ "source_spec_node_id": "ux.librarycomponent",
2571
+ "source_layer": "ux",
2572
+ "destination_spec_node_id": "motivation.requirement",
2573
+ "destination_layer": "motivation",
2574
+ "predicate": "satisfies",
2575
+ "cardinality": "many-to-many",
2576
+ "strength": "medium",
2577
+ "required": false
2578
+ },
2579
+ "ux.librarycomponent.specializes.ux.librarycomponent": {
2580
+ "id": "ux.librarycomponent.specializes.ux.librarycomponent",
2581
+ "source_spec_node_id": "ux.librarycomponent",
2582
+ "source_layer": "ux",
2583
+ "destination_spec_node_id": "ux.librarycomponent",
2584
+ "destination_layer": "ux",
2585
+ "predicate": "specializes",
2586
+ "cardinality": "many-to-many",
2587
+ "strength": "medium",
2588
+ "required": false
2589
+ },
2590
+ "ux.librarycomponent.uses.ux.actionpattern": {
2591
+ "id": "ux.librarycomponent.uses.ux.actionpattern",
2592
+ "source_spec_node_id": "ux.librarycomponent",
2593
+ "source_layer": "ux",
2594
+ "destination_spec_node_id": "ux.actionpattern",
2595
+ "destination_layer": "ux",
2596
+ "predicate": "uses",
2597
+ "cardinality": "many-to-many",
2598
+ "strength": "medium",
2599
+ "required": false
2600
+ },
2601
+ "ux.librarycomponent.uses.ux.statepattern": {
2602
+ "id": "ux.librarycomponent.uses.ux.statepattern",
2603
+ "source_spec_node_id": "ux.librarycomponent",
2604
+ "source_layer": "ux",
2605
+ "destination_spec_node_id": "ux.statepattern",
2606
+ "destination_layer": "ux",
2607
+ "predicate": "uses",
2608
+ "cardinality": "many-to-many",
2609
+ "strength": "medium",
2610
+ "required": false
2611
+ },
2612
+ "ux.librarysubview.aggregates.ux.componentinstance": {
2613
+ "id": "ux.librarysubview.aggregates.ux.componentinstance",
2614
+ "source_spec_node_id": "ux.librarysubview",
2615
+ "source_layer": "ux",
2616
+ "destination_spec_node_id": "ux.componentinstance",
2617
+ "destination_layer": "ux",
2618
+ "predicate": "aggregates",
2619
+ "cardinality": "many-to-many",
2620
+ "strength": "medium",
2621
+ "required": false
2622
+ },
2623
+ "ux.librarysubview.composes.ux.componentinstance": {
2624
+ "id": "ux.librarysubview.composes.ux.componentinstance",
2625
+ "source_spec_node_id": "ux.librarysubview",
2626
+ "source_layer": "ux",
2627
+ "destination_spec_node_id": "ux.componentinstance",
2628
+ "destination_layer": "ux",
2629
+ "predicate": "composes",
2630
+ "cardinality": "many-to-many",
2631
+ "strength": "medium",
2632
+ "required": false
2633
+ },
2634
+ "ux.librarysubview.uses.ux.actionpattern": {
2635
+ "id": "ux.librarysubview.uses.ux.actionpattern",
2636
+ "source_spec_node_id": "ux.librarysubview",
2637
+ "source_layer": "ux",
2638
+ "destination_spec_node_id": "ux.actionpattern",
2639
+ "destination_layer": "ux",
2640
+ "predicate": "uses",
2641
+ "cardinality": "many-to-many",
2642
+ "strength": "medium",
2643
+ "required": false
2644
+ },
2645
+ "ux.librarysubview.uses.ux.dataconfig": {
2646
+ "id": "ux.librarysubview.uses.ux.dataconfig",
2647
+ "source_spec_node_id": "ux.librarysubview",
2648
+ "source_layer": "ux",
2649
+ "destination_spec_node_id": "ux.dataconfig",
2650
+ "destination_layer": "ux",
2651
+ "predicate": "uses",
2652
+ "cardinality": "many-to-many",
2653
+ "strength": "medium",
2654
+ "required": false
2655
+ },
2656
+ "ux.librarysubview.uses.ux.layoutconfig": {
2657
+ "id": "ux.librarysubview.uses.ux.layoutconfig",
2658
+ "source_spec_node_id": "ux.librarysubview",
2659
+ "source_layer": "ux",
2660
+ "destination_spec_node_id": "ux.layoutconfig",
2661
+ "destination_layer": "ux",
2662
+ "predicate": "uses",
2663
+ "cardinality": "many-to-many",
2664
+ "strength": "medium",
2665
+ "required": false
2666
+ },
2667
+ "ux.stateaction.flows-to.ux.statetransition": {
2668
+ "id": "ux.stateaction.flows-to.ux.statetransition",
2669
+ "source_spec_node_id": "ux.stateaction",
2670
+ "source_layer": "ux",
2671
+ "destination_spec_node_id": "ux.statetransition",
2672
+ "destination_layer": "ux",
2673
+ "predicate": "flows-to",
2674
+ "cardinality": "many-to-many",
2675
+ "strength": "medium",
2676
+ "required": false
2677
+ },
2678
+ "ux.stateaction.specializes.ux.stateactiontemplate": {
2679
+ "id": "ux.stateaction.specializes.ux.stateactiontemplate",
2680
+ "source_spec_node_id": "ux.stateaction",
2681
+ "source_layer": "ux",
2682
+ "destination_spec_node_id": "ux.stateactiontemplate",
2683
+ "destination_layer": "ux",
2684
+ "predicate": "specializes",
2685
+ "cardinality": "many-to-many",
2686
+ "strength": "medium",
2687
+ "required": false
2688
+ },
2689
+ "ux.stateaction.triggers.api.operation": {
2690
+ "id": "ux.stateaction.triggers.api.operation",
2691
+ "source_spec_node_id": "ux.stateaction",
2692
+ "source_layer": "ux",
2693
+ "destination_spec_node_id": "api.operation",
2694
+ "destination_layer": "api",
2695
+ "predicate": "triggers",
2696
+ "cardinality": "many-to-many",
2697
+ "strength": "medium",
2698
+ "required": false
2699
+ },
2700
+ "ux.stateaction.uses.ux.actionpattern": {
2701
+ "id": "ux.stateaction.uses.ux.actionpattern",
2702
+ "source_spec_node_id": "ux.stateaction",
2703
+ "source_layer": "ux",
2704
+ "destination_spec_node_id": "ux.actionpattern",
2705
+ "destination_layer": "ux",
2706
+ "predicate": "uses",
2707
+ "cardinality": "many-to-many",
2708
+ "strength": "medium",
2709
+ "required": false
2710
+ },
2711
+ "ux.stateactiontemplate.associated-with.ux.statepattern": {
2712
+ "id": "ux.stateactiontemplate.associated-with.ux.statepattern",
2713
+ "source_spec_node_id": "ux.stateactiontemplate",
2714
+ "source_layer": "ux",
2715
+ "destination_spec_node_id": "ux.statepattern",
2716
+ "destination_layer": "ux",
2717
+ "predicate": "associated-with",
2718
+ "cardinality": "many-to-many",
2719
+ "strength": "medium",
2720
+ "required": false
2721
+ },
2722
+ "ux.stateactiontemplate.governs.ux.statetransition": {
2723
+ "id": "ux.stateactiontemplate.governs.ux.statetransition",
2724
+ "source_spec_node_id": "ux.stateactiontemplate",
2725
+ "source_layer": "ux",
2726
+ "destination_spec_node_id": "ux.statetransition",
2727
+ "destination_layer": "ux",
2728
+ "predicate": "governs",
2729
+ "cardinality": "many-to-many",
2730
+ "strength": "medium",
2731
+ "required": false
2732
+ },
2733
+ "ux.stateactiontemplate.implements.ux.stateaction": {
2734
+ "id": "ux.stateactiontemplate.implements.ux.stateaction",
2735
+ "source_spec_node_id": "ux.stateactiontemplate",
2736
+ "source_layer": "ux",
2737
+ "destination_spec_node_id": "ux.stateaction",
2738
+ "destination_layer": "ux",
2739
+ "predicate": "implements",
2740
+ "cardinality": "many-to-many",
2741
+ "strength": "medium",
2742
+ "required": false
2743
+ },
2744
+ "ux.stateactiontemplate.provides.ux.stateaction": {
2745
+ "id": "ux.stateactiontemplate.provides.ux.stateaction",
2746
+ "source_spec_node_id": "ux.stateactiontemplate",
2747
+ "source_layer": "ux",
2748
+ "destination_spec_node_id": "ux.stateaction",
2749
+ "destination_layer": "ux",
2750
+ "predicate": "provides",
2751
+ "cardinality": "many-to-many",
2752
+ "strength": "medium",
2753
+ "required": false
2754
+ },
2755
+ "ux.statepattern.aggregates.ux.experiencestate": {
2756
+ "id": "ux.statepattern.aggregates.ux.experiencestate",
2757
+ "source_spec_node_id": "ux.statepattern",
2758
+ "source_layer": "ux",
2759
+ "destination_spec_node_id": "ux.experiencestate",
2760
+ "destination_layer": "ux",
2761
+ "predicate": "aggregates",
2762
+ "cardinality": "many-to-many",
2763
+ "strength": "medium",
2764
+ "required": false
2765
+ },
2766
+ "ux.statepattern.governs.ux.experiencestate": {
2767
+ "id": "ux.statepattern.governs.ux.experiencestate",
2768
+ "source_spec_node_id": "ux.statepattern",
2769
+ "source_layer": "ux",
2770
+ "destination_spec_node_id": "ux.experiencestate",
2771
+ "destination_layer": "ux",
2772
+ "predicate": "governs",
2773
+ "cardinality": "many-to-many",
2774
+ "strength": "medium",
2775
+ "required": false
2776
+ },
2777
+ "ux.statepattern.specializes.ux.statepattern": {
2778
+ "id": "ux.statepattern.specializes.ux.statepattern",
2779
+ "source_spec_node_id": "ux.statepattern",
2780
+ "source_layer": "ux",
2781
+ "destination_spec_node_id": "ux.statepattern",
2782
+ "destination_layer": "ux",
2783
+ "predicate": "specializes",
2784
+ "cardinality": "many-to-many",
2785
+ "strength": "medium",
2786
+ "required": false
2787
+ },
2788
+ "ux.statepattern.uses.ux.stateactiontemplate": {
2789
+ "id": "ux.statepattern.uses.ux.stateactiontemplate",
2790
+ "source_spec_node_id": "ux.statepattern",
2791
+ "source_layer": "ux",
2792
+ "destination_spec_node_id": "ux.stateactiontemplate",
2793
+ "destination_layer": "ux",
2794
+ "predicate": "uses",
2795
+ "cardinality": "many-to-many",
2796
+ "strength": "medium",
2797
+ "required": false
2798
+ },
2799
+ "ux.statepattern.uses.ux.transitiontemplate": {
2800
+ "id": "ux.statepattern.uses.ux.transitiontemplate",
2801
+ "source_spec_node_id": "ux.statepattern",
2802
+ "source_layer": "ux",
2803
+ "destination_spec_node_id": "ux.transitiontemplate",
2804
+ "destination_layer": "ux",
2805
+ "predicate": "uses",
2806
+ "cardinality": "many-to-many",
2807
+ "strength": "medium",
2808
+ "required": false
2809
+ },
2810
+ "ux.statetransition.associated-with.ux.actioncomponent": {
2811
+ "id": "ux.statetransition.associated-with.ux.actioncomponent",
2812
+ "source_spec_node_id": "ux.statetransition",
2813
+ "source_layer": "ux",
2814
+ "destination_spec_node_id": "ux.actioncomponent",
2815
+ "destination_layer": "ux",
2816
+ "predicate": "associated-with",
2817
+ "cardinality": "many-to-many",
2818
+ "strength": "medium",
2819
+ "required": false
2820
+ },
2821
+ "ux.statetransition.navigates-to.ux.experiencestate": {
2822
+ "id": "ux.statetransition.navigates-to.ux.experiencestate",
2823
+ "source_spec_node_id": "ux.statetransition",
2824
+ "source_layer": "ux",
2825
+ "destination_spec_node_id": "ux.experiencestate",
2826
+ "destination_layer": "ux",
2827
+ "predicate": "navigates-to",
2828
+ "cardinality": "many-to-many",
2829
+ "strength": "medium",
2830
+ "required": false
2831
+ },
2832
+ "ux.statetransition.triggers.ux.stateaction": {
2833
+ "id": "ux.statetransition.triggers.ux.stateaction",
2834
+ "source_spec_node_id": "ux.statetransition",
2835
+ "source_layer": "ux",
2836
+ "destination_spec_node_id": "ux.stateaction",
2837
+ "destination_layer": "ux",
2838
+ "predicate": "triggers",
2839
+ "cardinality": "many-to-many",
2840
+ "strength": "medium",
2841
+ "required": false
2842
+ },
2843
+ "ux.statetransition.uses.ux.transitiontemplate": {
2844
+ "id": "ux.statetransition.uses.ux.transitiontemplate",
2845
+ "source_spec_node_id": "ux.statetransition",
2846
+ "source_layer": "ux",
2847
+ "destination_spec_node_id": "ux.transitiontemplate",
2848
+ "destination_layer": "ux",
2849
+ "predicate": "uses",
2850
+ "cardinality": "many-to-many",
2851
+ "strength": "medium",
2852
+ "required": false
2853
+ },
2854
+ "ux.subview.accesses.data-store.collection": {
2855
+ "id": "ux.subview.accesses.data-store.collection",
2856
+ "source_spec_node_id": "ux.subview",
2857
+ "source_layer": "ux",
2858
+ "destination_spec_node_id": "data-store.collection",
2859
+ "destination_layer": "data-store",
2860
+ "predicate": "accesses",
2861
+ "cardinality": "many-to-many",
2862
+ "strength": "medium",
2863
+ "required": false
2864
+ },
2865
+ "ux.subview.aggregates.ux.componentinstance": {
2866
+ "id": "ux.subview.aggregates.ux.componentinstance",
2867
+ "source_spec_node_id": "ux.subview",
2868
+ "source_layer": "ux",
2869
+ "destination_spec_node_id": "ux.componentinstance",
2870
+ "destination_layer": "ux",
2871
+ "predicate": "aggregates",
2872
+ "cardinality": "many-to-many",
2873
+ "strength": "medium",
2874
+ "required": false
2875
+ },
2876
+ "ux.subview.binds-to.ux.dataconfig": {
2877
+ "id": "ux.subview.binds-to.ux.dataconfig",
2878
+ "source_spec_node_id": "ux.subview",
2879
+ "source_layer": "ux",
2880
+ "destination_spec_node_id": "ux.dataconfig",
2881
+ "destination_layer": "ux",
2882
+ "predicate": "binds-to",
2883
+ "cardinality": "many-to-many",
2884
+ "strength": "medium",
2885
+ "required": false
2886
+ },
2887
+ "ux.subview.realizes.business.businessprocess": {
2888
+ "id": "ux.subview.realizes.business.businessprocess",
2889
+ "source_spec_node_id": "ux.subview",
2890
+ "source_layer": "ux",
2891
+ "destination_spec_node_id": "business.businessprocess",
2892
+ "destination_layer": "business",
2893
+ "predicate": "realizes",
2894
+ "cardinality": "many-to-many",
2895
+ "strength": "medium",
2896
+ "required": false
2897
+ },
2898
+ "ux.subview.realizes.ux.librarysubview": {
2899
+ "id": "ux.subview.realizes.ux.librarysubview",
2900
+ "source_spec_node_id": "ux.subview",
2901
+ "source_layer": "ux",
2902
+ "destination_spec_node_id": "ux.librarysubview",
2903
+ "destination_layer": "ux",
2904
+ "predicate": "realizes",
2905
+ "cardinality": "many-to-many",
2906
+ "strength": "medium",
2907
+ "required": false
2908
+ },
2909
+ "ux.subview.references.data-model.objectschema": {
2910
+ "id": "ux.subview.references.data-model.objectschema",
2911
+ "source_spec_node_id": "ux.subview",
2912
+ "source_layer": "ux",
2913
+ "destination_spec_node_id": "data-model.objectschema",
2914
+ "destination_layer": "data-model",
2915
+ "predicate": "references",
2916
+ "cardinality": "many-to-many",
2917
+ "strength": "medium",
2918
+ "required": false
2919
+ },
2920
+ "ux.subview.renders.ux.componentinstance": {
2921
+ "id": "ux.subview.renders.ux.componentinstance",
2922
+ "source_spec_node_id": "ux.subview",
2923
+ "source_layer": "ux",
2924
+ "destination_spec_node_id": "ux.componentinstance",
2925
+ "destination_layer": "ux",
2926
+ "predicate": "renders",
2927
+ "cardinality": "many-to-many",
2928
+ "strength": "medium",
2929
+ "required": false
2930
+ },
2931
+ "ux.subview.requires.security.permission": {
2932
+ "id": "ux.subview.requires.security.permission",
2933
+ "source_spec_node_id": "ux.subview",
2934
+ "source_layer": "ux",
2935
+ "destination_spec_node_id": "security.permission",
2936
+ "destination_layer": "security",
2937
+ "predicate": "requires",
2938
+ "cardinality": "many-to-many",
2939
+ "strength": "medium",
2940
+ "required": false
2941
+ },
2942
+ "ux.subview.serves.application.applicationservice": {
2943
+ "id": "ux.subview.serves.application.applicationservice",
2944
+ "source_spec_node_id": "ux.subview",
2945
+ "source_layer": "ux",
2946
+ "destination_spec_node_id": "application.applicationservice",
2947
+ "destination_layer": "application",
2948
+ "predicate": "serves",
2949
+ "cardinality": "many-to-many",
2950
+ "strength": "medium",
2951
+ "required": false
2952
+ },
2953
+ "ux.subview.uses.ux.errorconfig": {
2954
+ "id": "ux.subview.uses.ux.errorconfig",
2955
+ "source_spec_node_id": "ux.subview",
2956
+ "source_layer": "ux",
2957
+ "destination_spec_node_id": "ux.errorconfig",
2958
+ "destination_layer": "ux",
2959
+ "predicate": "uses",
2960
+ "cardinality": "many-to-many",
2961
+ "strength": "medium",
2962
+ "required": false
2963
+ },
2964
+ "ux.subview.uses.ux.layoutconfig": {
2965
+ "id": "ux.subview.uses.ux.layoutconfig",
2966
+ "source_spec_node_id": "ux.subview",
2967
+ "source_layer": "ux",
2968
+ "destination_spec_node_id": "ux.layoutconfig",
2969
+ "destination_layer": "ux",
2970
+ "predicate": "uses",
2971
+ "cardinality": "many-to-many",
2972
+ "strength": "medium",
2973
+ "required": false
2974
+ },
2975
+ "ux.subview.uses.ux.librarysubview": {
2976
+ "id": "ux.subview.uses.ux.librarysubview",
2977
+ "source_spec_node_id": "ux.subview",
2978
+ "source_layer": "ux",
2979
+ "destination_spec_node_id": "ux.librarysubview",
2980
+ "destination_layer": "ux",
2981
+ "predicate": "uses",
2982
+ "cardinality": "many-to-many",
2983
+ "strength": "medium",
2984
+ "required": false
2985
+ },
2986
+ "ux.tablecolumn.binds-to.ux.dataconfig": {
2987
+ "id": "ux.tablecolumn.binds-to.ux.dataconfig",
2988
+ "source_spec_node_id": "ux.tablecolumn",
2989
+ "source_layer": "ux",
2990
+ "destination_spec_node_id": "ux.dataconfig",
2991
+ "destination_layer": "ux",
2992
+ "predicate": "binds-to",
2993
+ "cardinality": "many-to-many",
2994
+ "strength": "medium",
2995
+ "required": false
2996
+ },
2997
+ "ux.tablecolumn.maps-to.data-store.field": {
2998
+ "id": "ux.tablecolumn.maps-to.data-store.field",
2999
+ "source_spec_node_id": "ux.tablecolumn",
3000
+ "source_layer": "ux",
3001
+ "destination_spec_node_id": "data-store.field",
3002
+ "destination_layer": "data-store",
3003
+ "predicate": "maps-to",
3004
+ "cardinality": "many-to-many",
3005
+ "strength": "medium",
3006
+ "required": false
3007
+ },
3008
+ "ux.tablecolumn.maps-to.data-model.schemaproperty": {
3009
+ "id": "ux.tablecolumn.maps-to.data-model.schemaproperty",
3010
+ "source_spec_node_id": "ux.tablecolumn",
3011
+ "source_layer": "ux",
3012
+ "destination_spec_node_id": "data-model.schemaproperty",
3013
+ "destination_layer": "data-model",
3014
+ "predicate": "maps-to",
3015
+ "cardinality": "many-to-many",
3016
+ "strength": "medium",
3017
+ "required": false
3018
+ },
3019
+ "ux.tablecolumn.references.ux.actionpattern": {
3020
+ "id": "ux.tablecolumn.references.ux.actionpattern",
3021
+ "source_spec_node_id": "ux.tablecolumn",
3022
+ "source_layer": "ux",
3023
+ "destination_spec_node_id": "ux.actionpattern",
3024
+ "destination_layer": "ux",
3025
+ "predicate": "references",
3026
+ "cardinality": "many-to-many",
3027
+ "strength": "medium",
3028
+ "required": false
3029
+ },
3030
+ "ux.tablecolumn.references.security.fieldaccesscontrol": {
3031
+ "id": "ux.tablecolumn.references.security.fieldaccesscontrol",
3032
+ "source_spec_node_id": "ux.tablecolumn",
3033
+ "source_layer": "ux",
3034
+ "destination_spec_node_id": "security.fieldaccesscontrol",
3035
+ "destination_layer": "security",
3036
+ "predicate": "references",
3037
+ "cardinality": "many-to-many",
3038
+ "strength": "medium",
3039
+ "required": false
3040
+ },
3041
+ "ux.tablecolumn.renders.ux.componentinstance": {
3042
+ "id": "ux.tablecolumn.renders.ux.componentinstance",
3043
+ "source_spec_node_id": "ux.tablecolumn",
3044
+ "source_layer": "ux",
3045
+ "destination_spec_node_id": "ux.componentinstance",
3046
+ "destination_layer": "ux",
3047
+ "predicate": "renders",
3048
+ "cardinality": "many-to-many",
3049
+ "strength": "medium",
3050
+ "required": false
3051
+ },
3052
+ "ux.tablecolumn.uses.ux.layoutconfig": {
3053
+ "id": "ux.tablecolumn.uses.ux.layoutconfig",
3054
+ "source_spec_node_id": "ux.tablecolumn",
3055
+ "source_layer": "ux",
3056
+ "destination_spec_node_id": "ux.layoutconfig",
3057
+ "destination_layer": "ux",
3058
+ "predicate": "uses",
3059
+ "cardinality": "many-to-many",
3060
+ "strength": "medium",
3061
+ "required": false
3062
+ },
3063
+ "ux.transitiontemplate.flows-to.ux.experiencestate": {
3064
+ "id": "ux.transitiontemplate.flows-to.ux.experiencestate",
3065
+ "source_spec_node_id": "ux.transitiontemplate",
3066
+ "source_layer": "ux",
3067
+ "destination_spec_node_id": "ux.experiencestate",
3068
+ "destination_layer": "ux",
3069
+ "predicate": "flows-to",
3070
+ "cardinality": "many-to-many",
3071
+ "strength": "medium",
3072
+ "required": false
3073
+ },
3074
+ "ux.transitiontemplate.flows-to.ux.subview": {
3075
+ "id": "ux.transitiontemplate.flows-to.ux.subview",
3076
+ "source_spec_node_id": "ux.transitiontemplate",
3077
+ "source_layer": "ux",
3078
+ "destination_spec_node_id": "ux.subview",
3079
+ "destination_layer": "ux",
3080
+ "predicate": "flows-to",
3081
+ "cardinality": "many-to-many",
3082
+ "strength": "medium",
3083
+ "required": false
3084
+ },
3085
+ "ux.transitiontemplate.governs.ux.statetransition": {
3086
+ "id": "ux.transitiontemplate.governs.ux.statetransition",
3087
+ "source_spec_node_id": "ux.transitiontemplate",
3088
+ "source_layer": "ux",
3089
+ "destination_spec_node_id": "ux.statetransition",
3090
+ "destination_layer": "ux",
3091
+ "predicate": "governs",
3092
+ "cardinality": "many-to-many",
3093
+ "strength": "medium",
3094
+ "required": false
3095
+ },
3096
+ "ux.transitiontemplate.navigates-to.ux.view": {
3097
+ "id": "ux.transitiontemplate.navigates-to.ux.view",
3098
+ "source_spec_node_id": "ux.transitiontemplate",
3099
+ "source_layer": "ux",
3100
+ "destination_spec_node_id": "ux.view",
3101
+ "destination_layer": "ux",
3102
+ "predicate": "navigates-to",
3103
+ "cardinality": "many-to-many",
3104
+ "strength": "medium",
3105
+ "required": false
3106
+ },
3107
+ "ux.transitiontemplate.specializes.ux.transitiontemplate": {
3108
+ "id": "ux.transitiontemplate.specializes.ux.transitiontemplate",
3109
+ "source_spec_node_id": "ux.transitiontemplate",
3110
+ "source_layer": "ux",
3111
+ "destination_spec_node_id": "ux.transitiontemplate",
3112
+ "destination_layer": "ux",
3113
+ "predicate": "specializes",
3114
+ "cardinality": "many-to-many",
3115
+ "strength": "medium",
3116
+ "required": false
3117
+ },
3118
+ "ux.transitiontemplate.triggers.ux.stateaction": {
3119
+ "id": "ux.transitiontemplate.triggers.ux.stateaction",
3120
+ "source_spec_node_id": "ux.transitiontemplate",
3121
+ "source_layer": "ux",
3122
+ "destination_spec_node_id": "ux.stateaction",
3123
+ "destination_layer": "ux",
3124
+ "predicate": "triggers",
3125
+ "cardinality": "many-to-many",
3126
+ "strength": "medium",
3127
+ "required": false
3128
+ },
3129
+ "ux.uxapplication.aggregates.ux.uxspec": {
3130
+ "id": "ux.uxapplication.aggregates.ux.uxspec",
3131
+ "source_spec_node_id": "ux.uxapplication",
3132
+ "source_layer": "ux",
3133
+ "destination_spec_node_id": "ux.uxspec",
3134
+ "destination_layer": "ux",
3135
+ "predicate": "aggregates",
3136
+ "cardinality": "many-to-many",
3137
+ "strength": "medium",
3138
+ "required": false
3139
+ },
3140
+ "ux.uxlibrary.aggregates.ux.librarycomponent": {
3141
+ "id": "ux.uxlibrary.aggregates.ux.librarycomponent",
3142
+ "source_spec_node_id": "ux.uxlibrary",
3143
+ "source_layer": "ux",
3144
+ "destination_spec_node_id": "ux.librarycomponent",
3145
+ "destination_layer": "ux",
3146
+ "predicate": "aggregates",
3147
+ "cardinality": "many-to-many",
3148
+ "strength": "medium",
3149
+ "required": false
3150
+ },
3151
+ "ux.uxlibrary.aggregates.ux.librarysubview": {
3152
+ "id": "ux.uxlibrary.aggregates.ux.librarysubview",
3153
+ "source_spec_node_id": "ux.uxlibrary",
3154
+ "source_layer": "ux",
3155
+ "destination_spec_node_id": "ux.librarysubview",
3156
+ "destination_layer": "ux",
3157
+ "predicate": "aggregates",
3158
+ "cardinality": "many-to-many",
3159
+ "strength": "medium",
3160
+ "required": false
3161
+ },
3162
+ "ux.uxlibrary.provides.ux.librarycomponent": {
3163
+ "id": "ux.uxlibrary.provides.ux.librarycomponent",
3164
+ "source_spec_node_id": "ux.uxlibrary",
3165
+ "source_layer": "ux",
3166
+ "destination_spec_node_id": "ux.librarycomponent",
3167
+ "destination_layer": "ux",
3168
+ "predicate": "provides",
3169
+ "cardinality": "many-to-many",
3170
+ "strength": "medium",
3171
+ "required": false
3172
+ },
3173
+ "ux.uxlibrary.provides.ux.librarysubview": {
3174
+ "id": "ux.uxlibrary.provides.ux.librarysubview",
3175
+ "source_spec_node_id": "ux.uxlibrary",
3176
+ "source_layer": "ux",
3177
+ "destination_spec_node_id": "ux.librarysubview",
3178
+ "destination_layer": "ux",
3179
+ "predicate": "provides",
3180
+ "cardinality": "many-to-many",
3181
+ "strength": "medium",
3182
+ "required": false
3183
+ },
3184
+ "ux.uxlibrary.uses.ux.uxlibrary": {
3185
+ "id": "ux.uxlibrary.uses.ux.uxlibrary",
3186
+ "source_spec_node_id": "ux.uxlibrary",
3187
+ "source_layer": "ux",
3188
+ "destination_spec_node_id": "ux.uxlibrary",
3189
+ "destination_layer": "ux",
3190
+ "predicate": "uses",
3191
+ "cardinality": "many-to-many",
3192
+ "strength": "medium",
3193
+ "required": false
3194
+ },
3195
+ "ux.uxspec.aggregates.ux.experiencestate": {
3196
+ "id": "ux.uxspec.aggregates.ux.experiencestate",
3197
+ "source_spec_node_id": "ux.uxspec",
3198
+ "source_layer": "ux",
3199
+ "destination_spec_node_id": "ux.experiencestate",
3200
+ "destination_layer": "ux",
3201
+ "predicate": "aggregates",
3202
+ "cardinality": "many-to-many",
3203
+ "strength": "medium",
3204
+ "required": false
3205
+ },
3206
+ "ux.uxspec.aggregates.ux.view": {
3207
+ "id": "ux.uxspec.aggregates.ux.view",
3208
+ "source_spec_node_id": "ux.uxspec",
3209
+ "source_layer": "ux",
3210
+ "destination_spec_node_id": "ux.view",
3211
+ "destination_layer": "ux",
3212
+ "predicate": "aggregates",
3213
+ "cardinality": "many-to-many",
3214
+ "strength": "medium",
3215
+ "required": false
3216
+ },
3217
+ "ux.uxspec.governs.ux.errorconfig": {
3218
+ "id": "ux.uxspec.governs.ux.errorconfig",
3219
+ "source_spec_node_id": "ux.uxspec",
3220
+ "source_layer": "ux",
3221
+ "destination_spec_node_id": "ux.errorconfig",
3222
+ "destination_layer": "ux",
3223
+ "predicate": "governs",
3224
+ "cardinality": "many-to-many",
3225
+ "strength": "medium",
3226
+ "required": false
3227
+ },
3228
+ "ux.uxspec.satisfies.motivation.requirement": {
3229
+ "id": "ux.uxspec.satisfies.motivation.requirement",
3230
+ "source_spec_node_id": "ux.uxspec",
3231
+ "source_layer": "ux",
3232
+ "destination_spec_node_id": "motivation.requirement",
3233
+ "destination_layer": "motivation",
3234
+ "predicate": "satisfies",
3235
+ "cardinality": "many-to-many",
3236
+ "strength": "medium",
3237
+ "required": false
3238
+ },
3239
+ "ux.uxspec.uses.ux.uxlibrary": {
3240
+ "id": "ux.uxspec.uses.ux.uxlibrary",
3241
+ "source_spec_node_id": "ux.uxspec",
3242
+ "source_layer": "ux",
3243
+ "destination_spec_node_id": "ux.uxlibrary",
3244
+ "destination_layer": "ux",
3245
+ "predicate": "uses",
3246
+ "cardinality": "many-to-many",
3247
+ "strength": "medium",
3248
+ "required": false
3249
+ },
3250
+ "ux.view.accesses.application.applicationcomponent": {
3251
+ "id": "ux.view.accesses.application.applicationcomponent",
3252
+ "source_spec_node_id": "ux.view",
3253
+ "source_layer": "ux",
3254
+ "destination_spec_node_id": "application.applicationcomponent",
3255
+ "destination_layer": "application",
3256
+ "predicate": "accesses",
3257
+ "cardinality": "many-to-many",
3258
+ "strength": "medium",
3259
+ "required": false
3260
+ },
3261
+ "ux.view.accesses.data-store.collection": {
3262
+ "id": "ux.view.accesses.data-store.collection",
3263
+ "source_spec_node_id": "ux.view",
3264
+ "source_layer": "ux",
3265
+ "destination_spec_node_id": "data-store.collection",
3266
+ "destination_layer": "data-store",
3267
+ "predicate": "accesses",
3268
+ "cardinality": "many-to-many",
3269
+ "strength": "medium",
3270
+ "required": false
3271
+ },
3272
+ "ux.view.accesses.api.operation": {
3273
+ "id": "ux.view.accesses.api.operation",
3274
+ "source_spec_node_id": "ux.view",
3275
+ "source_layer": "ux",
3276
+ "destination_spec_node_id": "api.operation",
3277
+ "destination_layer": "api",
3278
+ "predicate": "accesses",
3279
+ "cardinality": "many-to-many",
3280
+ "strength": "medium",
3281
+ "required": false
3282
+ },
3283
+ "ux.view.accesses.data-store.view": {
3284
+ "id": "ux.view.accesses.data-store.view",
3285
+ "source_spec_node_id": "ux.view",
3286
+ "source_layer": "ux",
3287
+ "destination_spec_node_id": "data-store.view",
3288
+ "destination_layer": "data-store",
3289
+ "predicate": "accesses",
3290
+ "cardinality": "many-to-many",
3291
+ "strength": "medium",
3292
+ "required": false
3293
+ },
3294
+ "ux.view.aggregates.actioncomponent": {
3295
+ "id": "ux.view.aggregates.actioncomponent",
3296
+ "source_spec_node_id": "ux.view",
3297
+ "source_layer": "ux",
3298
+ "destination_spec_node_id": "ux.actioncomponent",
3299
+ "destination_layer": "ux",
3300
+ "predicate": "aggregates",
3301
+ "cardinality": "one-to-many",
3302
+ "strength": "medium",
3303
+ "required": false
3304
+ },
3305
+ "ux.view.aggregates.ux.subview": {
3306
+ "id": "ux.view.aggregates.ux.subview",
3307
+ "source_spec_node_id": "ux.view",
3308
+ "source_layer": "ux",
3309
+ "destination_spec_node_id": "ux.subview",
3310
+ "destination_layer": "ux",
3311
+ "predicate": "aggregates",
3312
+ "cardinality": "many-to-many",
3313
+ "strength": "medium",
3314
+ "required": false
3315
+ },
3316
+ "ux.view.applies.ux.layoutconfig": {
3317
+ "id": "ux.view.applies.ux.layoutconfig",
3318
+ "source_spec_node_id": "ux.view",
3319
+ "source_layer": "ux",
3320
+ "destination_spec_node_id": "ux.layoutconfig",
3321
+ "destination_layer": "ux",
3322
+ "predicate": "applies",
3323
+ "cardinality": "many-to-many",
3324
+ "strength": "medium",
3325
+ "required": false
3326
+ },
3327
+ "ux.view.binds-to.ux.dataconfig": {
3328
+ "id": "ux.view.binds-to.ux.dataconfig",
3329
+ "source_spec_node_id": "ux.view",
3330
+ "source_layer": "ux",
3331
+ "destination_spec_node_id": "ux.dataconfig",
3332
+ "destination_layer": "ux",
3333
+ "predicate": "binds-to",
3334
+ "cardinality": "many-to-many",
3335
+ "strength": "medium",
3336
+ "required": false
3337
+ },
3338
+ "ux.view.composes.ux.subview": {
3339
+ "id": "ux.view.composes.ux.subview",
3340
+ "source_spec_node_id": "ux.view",
3341
+ "source_layer": "ux",
3342
+ "destination_spec_node_id": "ux.subview",
3343
+ "destination_layer": "ux",
3344
+ "predicate": "composes",
3345
+ "cardinality": "many-to-many",
3346
+ "strength": "medium",
3347
+ "required": false
3348
+ },
3349
+ "ux.view.depends-on.technology.systemsoftware": {
3350
+ "id": "ux.view.depends-on.technology.systemsoftware",
3351
+ "source_spec_node_id": "ux.view",
3352
+ "source_layer": "ux",
3353
+ "destination_spec_node_id": "technology.systemsoftware",
3354
+ "destination_layer": "technology",
3355
+ "predicate": "depends-on",
3356
+ "cardinality": "many-to-many",
3357
+ "strength": "medium",
3358
+ "required": false
3359
+ },
3360
+ "ux.view.maps-to.business.businessobject": {
3361
+ "id": "ux.view.maps-to.business.businessobject",
3362
+ "source_spec_node_id": "ux.view",
3363
+ "source_layer": "ux",
3364
+ "destination_spec_node_id": "business.businessobject",
3365
+ "destination_layer": "business",
3366
+ "predicate": "maps-to",
3367
+ "cardinality": "many-to-many",
3368
+ "strength": "medium",
3369
+ "required": false
3370
+ },
3371
+ "ux.view.maps-to.motivation.outcome": {
3372
+ "id": "ux.view.maps-to.motivation.outcome",
3373
+ "source_spec_node_id": "ux.view",
3374
+ "source_layer": "ux",
3375
+ "destination_spec_node_id": "motivation.outcome",
3376
+ "destination_layer": "motivation",
3377
+ "predicate": "maps-to",
3378
+ "cardinality": "many-to-many",
3379
+ "strength": "medium",
3380
+ "required": false
3381
+ },
3382
+ "ux.view.realizes.application.applicationinterface": {
3383
+ "id": "ux.view.realizes.application.applicationinterface",
3384
+ "source_spec_node_id": "ux.view",
3385
+ "source_layer": "ux",
3386
+ "destination_spec_node_id": "application.applicationinterface",
3387
+ "destination_layer": "application",
3388
+ "predicate": "realizes",
3389
+ "cardinality": "many-to-many",
3390
+ "strength": "medium",
3391
+ "required": false
3392
+ },
3393
+ "ux.view.realizes.business.businessprocess": {
3394
+ "id": "ux.view.realizes.business.businessprocess",
3395
+ "source_spec_node_id": "ux.view",
3396
+ "source_layer": "ux",
3397
+ "destination_spec_node_id": "business.businessprocess",
3398
+ "destination_layer": "business",
3399
+ "predicate": "realizes",
3400
+ "cardinality": "many-to-many",
3401
+ "strength": "medium",
3402
+ "required": false
3403
+ },
3404
+ "ux.view.realizes.motivation.goal": {
3405
+ "id": "ux.view.realizes.motivation.goal",
3406
+ "source_spec_node_id": "ux.view",
3407
+ "source_layer": "ux",
3408
+ "destination_spec_node_id": "motivation.goal",
3409
+ "destination_layer": "motivation",
3410
+ "predicate": "realizes",
3411
+ "cardinality": "many-to-many",
3412
+ "strength": "medium",
3413
+ "required": false
3414
+ },
3415
+ "ux.view.references.data-model.objectschema": {
3416
+ "id": "ux.view.references.data-model.objectschema",
3417
+ "source_spec_node_id": "ux.view",
3418
+ "source_layer": "ux",
3419
+ "destination_spec_node_id": "data-model.objectschema",
3420
+ "destination_layer": "data-model",
3421
+ "predicate": "references",
3422
+ "cardinality": "many-to-many",
3423
+ "strength": "medium",
3424
+ "required": false
3425
+ },
3426
+ "ux.view.references.security.secureresource": {
3427
+ "id": "ux.view.references.security.secureresource",
3428
+ "source_spec_node_id": "ux.view",
3429
+ "source_layer": "ux",
3430
+ "destination_spec_node_id": "security.secureresource",
3431
+ "destination_layer": "security",
3432
+ "predicate": "references",
3433
+ "cardinality": "many-to-many",
3434
+ "strength": "medium",
3435
+ "required": false
3436
+ },
3437
+ "ux.view.renders.ux.componentinstance": {
3438
+ "id": "ux.view.renders.ux.componentinstance",
3439
+ "source_spec_node_id": "ux.view",
3440
+ "source_layer": "ux",
3441
+ "destination_spec_node_id": "ux.componentinstance",
3442
+ "destination_layer": "ux",
3443
+ "predicate": "renders",
3444
+ "cardinality": "many-to-many",
3445
+ "strength": "medium",
3446
+ "required": false
3447
+ },
3448
+ "ux.view.requires.ux.errorconfig": {
3449
+ "id": "ux.view.requires.ux.errorconfig",
3450
+ "source_spec_node_id": "ux.view",
3451
+ "source_layer": "ux",
3452
+ "destination_spec_node_id": "ux.errorconfig",
3453
+ "destination_layer": "ux",
3454
+ "predicate": "requires",
3455
+ "cardinality": "many-to-many",
3456
+ "strength": "medium",
3457
+ "required": false
3458
+ },
3459
+ "ux.view.requires.security.permission": {
3460
+ "id": "ux.view.requires.security.permission",
3461
+ "source_spec_node_id": "ux.view",
3462
+ "source_layer": "ux",
3463
+ "destination_spec_node_id": "security.permission",
3464
+ "destination_layer": "security",
3465
+ "predicate": "requires",
3466
+ "cardinality": "many-to-many",
3467
+ "strength": "medium",
3468
+ "required": false
3469
+ },
3470
+ "ux.view.requires.security.role": {
3471
+ "id": "ux.view.requires.security.role",
3472
+ "source_spec_node_id": "ux.view",
3473
+ "source_layer": "ux",
3474
+ "destination_spec_node_id": "security.role",
3475
+ "destination_layer": "security",
3476
+ "predicate": "requires",
3477
+ "cardinality": "many-to-many",
3478
+ "strength": "medium",
3479
+ "required": false
3480
+ },
3481
+ "ux.view.requires.technology.technologyservice": {
3482
+ "id": "ux.view.requires.technology.technologyservice",
3483
+ "source_spec_node_id": "ux.view",
3484
+ "source_layer": "ux",
3485
+ "destination_spec_node_id": "technology.technologyservice",
3486
+ "destination_layer": "technology",
3487
+ "predicate": "requires",
3488
+ "cardinality": "many-to-many",
3489
+ "strength": "medium",
3490
+ "required": false
3491
+ },
3492
+ "ux.view.satisfies.motivation.requirement": {
3493
+ "id": "ux.view.satisfies.motivation.requirement",
3494
+ "source_spec_node_id": "ux.view",
3495
+ "source_layer": "ux",
3496
+ "destination_spec_node_id": "motivation.requirement",
3497
+ "destination_layer": "motivation",
3498
+ "predicate": "satisfies",
3499
+ "cardinality": "many-to-many",
3500
+ "strength": "medium",
3501
+ "required": false
3502
+ },
3503
+ "ux.view.satisfies.security.securitypolicy": {
3504
+ "id": "ux.view.satisfies.security.securitypolicy",
3505
+ "source_spec_node_id": "ux.view",
3506
+ "source_layer": "ux",
3507
+ "destination_spec_node_id": "security.securitypolicy",
3508
+ "destination_layer": "security",
3509
+ "predicate": "satisfies",
3510
+ "cardinality": "many-to-many",
3511
+ "strength": "medium",
3512
+ "required": false
3513
+ },
3514
+ "ux.view.serves.application.applicationservice": {
3515
+ "id": "ux.view.serves.application.applicationservice",
3516
+ "source_spec_node_id": "ux.view",
3517
+ "source_layer": "ux",
3518
+ "destination_spec_node_id": "application.applicationservice",
3519
+ "destination_layer": "application",
3520
+ "predicate": "serves",
3521
+ "cardinality": "many-to-many",
3522
+ "strength": "medium",
3523
+ "required": false
3524
+ },
3525
+ "ux.view.serves.business.businessrole": {
3526
+ "id": "ux.view.serves.business.businessrole",
3527
+ "source_spec_node_id": "ux.view",
3528
+ "source_layer": "ux",
3529
+ "destination_spec_node_id": "business.businessrole",
3530
+ "destination_layer": "business",
3531
+ "predicate": "serves",
3532
+ "cardinality": "many-to-many",
3533
+ "strength": "medium",
3534
+ "required": false
3535
+ },
3536
+ "ux.view.serves.business.businessservice": {
3537
+ "id": "ux.view.serves.business.businessservice",
3538
+ "source_spec_node_id": "ux.view",
3539
+ "source_layer": "ux",
3540
+ "destination_spec_node_id": "business.businessservice",
3541
+ "destination_layer": "business",
3542
+ "predicate": "serves",
3543
+ "cardinality": "many-to-many",
3544
+ "strength": "medium",
3545
+ "required": false
3546
+ },
3547
+ "ux.view.serves.motivation.stakeholder": {
3548
+ "id": "ux.view.serves.motivation.stakeholder",
3549
+ "source_spec_node_id": "ux.view",
3550
+ "source_layer": "ux",
3551
+ "destination_spec_node_id": "motivation.stakeholder",
3552
+ "destination_layer": "motivation",
3553
+ "predicate": "serves",
3554
+ "cardinality": "many-to-many",
3555
+ "strength": "medium",
3556
+ "required": false
3557
+ },
3558
+ "ux.view.uses.application.applicationevent": {
3559
+ "id": "ux.view.uses.application.applicationevent",
3560
+ "source_spec_node_id": "ux.view",
3561
+ "source_layer": "ux",
3562
+ "destination_spec_node_id": "application.applicationevent",
3563
+ "destination_layer": "application",
3564
+ "predicate": "uses",
3565
+ "cardinality": "many-to-many",
3566
+ "strength": "medium",
3567
+ "required": false
3568
+ },
3569
+ "ux.view.uses.ux.layoutconfig": {
3570
+ "id": "ux.view.uses.ux.layoutconfig",
3571
+ "source_spec_node_id": "ux.view",
3572
+ "source_layer": "ux",
3573
+ "destination_spec_node_id": "ux.layoutconfig",
3574
+ "destination_layer": "ux",
3575
+ "predicate": "uses",
3576
+ "cardinality": "many-to-many",
3577
+ "strength": "medium",
3578
+ "required": false
3579
+ },
3580
+ "ux.view.uses.api.securityscheme": {
3581
+ "id": "ux.view.uses.api.securityscheme",
3582
+ "source_spec_node_id": "ux.view",
3583
+ "source_layer": "ux",
3584
+ "destination_spec_node_id": "api.securityscheme",
3585
+ "destination_layer": "api",
3586
+ "predicate": "uses",
3587
+ "cardinality": "many-to-many",
3588
+ "strength": "medium",
3589
+ "required": false
3590
+ }
3591
+ }
3592
+ }