@documentation-robotics/cli 0.1.13 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/README.md +74 -2
  2. package/dist/analysis/relationship-classifier.js +2 -9
  3. package/dist/analysis/relationship-classifier.js.map +2 -2
  4. package/dist/analyzers/call-graph-utils.js +2 -2
  5. package/dist/analyzers/call-graph-utils.js.map +2 -2
  6. package/dist/analyzers/cards/build.js +171 -0
  7. package/dist/analyzers/cards/build.js.map +7 -0
  8. package/dist/analyzers/cards/classify.js +42 -0
  9. package/dist/analyzers/cards/classify.js.map +7 -0
  10. package/dist/analyzers/cards/edge-index.js +44 -0
  11. package/dist/analyzers/cards/edge-index.js.map +7 -0
  12. package/dist/analyzers/cards/facts.js +46 -0
  13. package/dist/analyzers/cards/facts.js.map +7 -0
  14. package/dist/analyzers/cards/graph.js +42 -0
  15. package/dist/analyzers/cards/graph.js.map +7 -0
  16. package/dist/analyzers/cards/index.js +8 -0
  17. package/dist/analyzers/cards/index.js.map +7 -0
  18. package/dist/analyzers/cards/tier0.js +18 -0
  19. package/dist/analyzers/cards/tier0.js.map +7 -0
  20. package/dist/analyzers/cards/types.js +1 -0
  21. package/dist/analyzers/cards/types.js.map +7 -0
  22. package/dist/analyzers/cbm-analyzer.js +195 -171
  23. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  24. package/dist/analyzers/cbm-responses.js +336 -0
  25. package/dist/analyzers/cbm-responses.js.map +7 -0
  26. package/dist/analyzers/edge-relationships.js +45 -0
  27. package/dist/analyzers/edge-relationships.js.map +7 -0
  28. package/dist/analyzers/mapping-loader.js +9 -0
  29. package/dist/analyzers/mapping-loader.js.map +2 -2
  30. package/dist/analyzers/tier0-rules.js +153 -0
  31. package/dist/analyzers/tier0-rules.js.map +7 -0
  32. package/dist/analyzers/types.js.map +1 -1
  33. package/dist/analyzers/verify-engine.js +22 -19
  34. package/dist/analyzers/verify-engine.js.map +2 -2
  35. package/dist/audit/relationships/ai/prompts.js +10 -10
  36. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  37. package/dist/audit/relationships/analysis/layer-templates.js +52 -52
  38. package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
  39. package/dist/cli.js +112 -28
  40. package/dist/cli.js.map +3 -3
  41. package/dist/coding-agents/agents/claude-code.js +3 -1
  42. package/dist/coding-agents/agents/claude-code.js.map +2 -2
  43. package/dist/coding-agents/claude-code-client.js +2 -1
  44. package/dist/coding-agents/claude-code-client.js.map +2 -2
  45. package/dist/coding-agents/copilot-client.js +17 -12
  46. package/dist/coding-agents/copilot-client.js.map +2 -2
  47. package/dist/coding-agents/default-permissions.js +152 -0
  48. package/dist/coding-agents/default-permissions.js.map +7 -0
  49. package/dist/coding-agents/drbot-mcp.js +167 -0
  50. package/dist/coding-agents/drbot-mcp.js.map +7 -0
  51. package/dist/commands/add.js +12 -7
  52. package/dist/commands/add.js.map +2 -2
  53. package/dist/commands/analyzer.js +134 -23
  54. package/dist/commands/analyzer.js.map +2 -2
  55. package/dist/commands/audit.js +6 -6
  56. package/dist/commands/audit.js.map +2 -2
  57. package/dist/commands/changeset-verify.js +55 -0
  58. package/dist/commands/changeset-verify.js.map +7 -0
  59. package/dist/commands/changeset.js +261 -147
  60. package/dist/commands/changeset.js.map +2 -2
  61. package/dist/commands/delete.js +52 -19
  62. package/dist/commands/delete.js.map +3 -3
  63. package/dist/commands/element.js +3 -2
  64. package/dist/commands/element.js.map +2 -2
  65. package/dist/commands/farm.js +773 -0
  66. package/dist/commands/farm.js.map +7 -0
  67. package/dist/commands/init.js +11 -1
  68. package/dist/commands/init.js.map +2 -2
  69. package/dist/commands/mcp.js +122 -0
  70. package/dist/commands/mcp.js.map +7 -0
  71. package/dist/commands/relationship.js +251 -47
  72. package/dist/commands/relationship.js.map +2 -2
  73. package/dist/commands/reports.js +1 -1
  74. package/dist/commands/reports.js.map +2 -2
  75. package/dist/commands/update.js +56 -24
  76. package/dist/commands/update.js.map +2 -2
  77. package/dist/commands/upgrade.js +99 -11
  78. package/dist/commands/upgrade.js.map +3 -3
  79. package/dist/commands/validate.js +41 -3
  80. package/dist/commands/validate.js.map +2 -2
  81. package/dist/commands/version.js +2 -2
  82. package/dist/commands/version.js.map +2 -2
  83. package/dist/commands/visualize.js +4 -3
  84. package/dist/commands/visualize.js.map +2 -2
  85. package/dist/config.js +83 -0
  86. package/dist/config.js.map +7 -0
  87. package/dist/core/annotation-store.js +138 -0
  88. package/dist/core/annotation-store.js.map +7 -0
  89. package/dist/core/catalog-migration.js +33 -0
  90. package/dist/core/catalog-migration.js.map +7 -0
  91. package/dist/core/changeset-analysis.js +421 -0
  92. package/dist/core/changeset-analysis.js.map +7 -0
  93. package/dist/core/changeset-base-index.js +153 -0
  94. package/dist/core/changeset-base-index.js.map +7 -0
  95. package/dist/core/changeset-brief-delta.js +102 -0
  96. package/dist/core/changeset-brief-delta.js.map +7 -0
  97. package/dist/core/changeset-graph.js +281 -0
  98. package/dist/core/changeset-graph.js.map +7 -0
  99. package/dist/core/changeset-only-guard.js +32 -0
  100. package/dist/core/changeset-only-guard.js.map +7 -0
  101. package/dist/core/changeset-summary.js +68 -0
  102. package/dist/core/changeset-summary.js.map +7 -0
  103. package/dist/core/changeset-validator.js +66 -20
  104. package/dist/core/changeset-validator.js.map +2 -2
  105. package/dist/core/changeset-verify.js +518 -0
  106. package/dist/core/changeset-verify.js.map +7 -0
  107. package/dist/core/changeset.js +56 -9
  108. package/dist/core/changeset.js.map +2 -2
  109. package/dist/core/element-type-migration.js +145 -0
  110. package/dist/core/element-type-migration.js.map +7 -0
  111. package/dist/core/farm-manifest.js +140 -0
  112. package/dist/core/farm-manifest.js.map +7 -0
  113. package/dist/core/farm-sync-engine.js +346 -0
  114. package/dist/core/farm-sync-engine.js.map +7 -0
  115. package/dist/core/farm-sync-state.js +167 -0
  116. package/dist/core/farm-sync-state.js.map +7 -0
  117. package/dist/core/manifest.js +6 -3
  118. package/dist/core/manifest.js.map +2 -2
  119. package/dist/core/migration-registry.js +84 -1
  120. package/dist/core/migration-registry.js.map +2 -2
  121. package/dist/core/model-upgrade.js +102 -0
  122. package/dist/core/model-upgrade.js.map +7 -0
  123. package/dist/core/model.js +257 -44
  124. package/dist/core/model.js.map +3 -3
  125. package/dist/core/mutation-handler.js +71 -6
  126. package/dist/core/mutation-handler.js.map +2 -2
  127. package/dist/core/relationship-migration-table.js +6639 -0
  128. package/dist/core/relationship-migration-table.js.map +7 -0
  129. package/dist/core/relationship-migration.js +272 -0
  130. package/dist/core/relationship-migration.js.map +7 -0
  131. package/dist/core/relationship-prune.js +49 -0
  132. package/dist/core/relationship-prune.js.map +7 -0
  133. package/dist/core/relationship-staging.js +68 -0
  134. package/dist/core/relationship-staging.js.map +7 -0
  135. package/dist/core/relationships.js +26 -4
  136. package/dist/core/relationships.js.map +2 -2
  137. package/dist/core/report-data-model.js +7 -13
  138. package/dist/core/report-data-model.js.map +2 -2
  139. package/dist/core/staged-changeset-storage.js +64 -17
  140. package/dist/core/staged-changeset-storage.js.map +2 -2
  141. package/dist/core/staged-source-reference.js +28 -0
  142. package/dist/core/staged-source-reference.js.map +7 -0
  143. package/dist/core/staging-area.js +83 -18
  144. package/dist/core/staging-area.js.map +2 -2
  145. package/dist/core/virtual-projection.js +14 -5
  146. package/dist/core/virtual-projection.js.map +2 -2
  147. package/dist/export/archimate-exporter.js +1 -0
  148. package/dist/export/archimate-exporter.js.map +2 -2
  149. package/dist/generated/compiled-validators.js +2 -2
  150. package/dist/generated/compiled-validators.js.map +2 -2
  151. package/dist/generated/layer-registry.js +16 -16
  152. package/dist/generated/layer-registry.js.map +2 -2
  153. package/dist/generated/node-types.js +186 -168
  154. package/dist/generated/node-types.js.map +2 -2
  155. package/dist/generated/relationship-index.js +2209 -7727
  156. package/dist/generated/relationship-index.js.map +2 -2
  157. package/dist/integrations/claude_code/agents/dr-architect.md +16 -3
  158. package/dist/integrations/claude_code/agents/dr-extractor.md +1 -1
  159. package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
  160. package/dist/integrations/claude_code/commands/dr-map.md +13 -0
  161. package/dist/integrations/claude_code/commands/dr-plan.md +40 -0
  162. package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
  163. package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
  164. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
  165. package/dist/integrations/claude_code/docs/MCP_SERVER.md +79 -0
  166. package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
  167. package/dist/integrations/claude_code/docs/README.md +52 -1
  168. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
  169. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
  170. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
  171. package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
  172. package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
  173. package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
  174. package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
  175. package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
  176. package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
  177. package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
  178. package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
  179. package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
  180. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +92 -15
  181. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +119 -0
  182. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +3 -0
  183. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +1 -1
  184. package/dist/integrations/github_copilot/agents/dr-architect.md +1 -1
  185. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
  186. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
  187. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
  188. package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
  189. package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
  190. package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
  191. package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
  192. package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
  193. package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
  194. package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
  195. package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
  196. package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
  197. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +222 -102
  198. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +119 -0
  199. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
  200. package/dist/integrations/hash-utils.js.map +2 -2
  201. package/dist/mcp/api-key-manager.js +111 -0
  202. package/dist/mcp/api-key-manager.js.map +7 -0
  203. package/dist/mcp/changeset-only.js +34 -0
  204. package/dist/mcp/changeset-only.js.map +7 -0
  205. package/dist/mcp/http-transport.js +176 -0
  206. package/dist/mcp/http-transport.js.map +7 -0
  207. package/dist/mcp/resource-registry.js +97 -0
  208. package/dist/mcp/resource-registry.js.map +7 -0
  209. package/dist/mcp/tool-registry.js +60 -0
  210. package/dist/mcp/tool-registry.js.map +7 -0
  211. package/dist/mcp/tools/annotation-create.js +39 -0
  212. package/dist/mcp/tools/annotation-create.js.map +7 -0
  213. package/dist/mcp/tools/annotation-delete.js +29 -0
  214. package/dist/mcp/tools/annotation-delete.js.map +7 -0
  215. package/dist/mcp/tools/annotation-get.js +29 -0
  216. package/dist/mcp/tools/annotation-get.js.map +7 -0
  217. package/dist/mcp/tools/annotation-list.js +24 -0
  218. package/dist/mcp/tools/annotation-list.js.map +7 -0
  219. package/dist/mcp/tools/annotation-reply.js +34 -0
  220. package/dist/mcp/tools/annotation-reply.js.map +7 -0
  221. package/dist/mcp/tools/annotation-shared.js +10 -0
  222. package/dist/mcp/tools/annotation-shared.js.map +7 -0
  223. package/dist/mcp/tools/annotation-update.js +39 -0
  224. package/dist/mcp/tools/annotation-update.js.map +7 -0
  225. package/dist/mcp/tools/changeset-analysis-tools.js +78 -0
  226. package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
  227. package/dist/mcp/tools/changeset-editing.js +184 -0
  228. package/dist/mcp/tools/changeset-editing.js.map +7 -0
  229. package/dist/mcp/tools/changeset-lifecycle.js +83 -0
  230. package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
  231. package/dist/mcp/tools/changeset-list.js +33 -0
  232. package/dist/mcp/tools/changeset-list.js.map +7 -0
  233. package/dist/mcp/tools/changeset-shared.js +31 -0
  234. package/dist/mcp/tools/changeset-shared.js.map +7 -0
  235. package/dist/mcp/tools/changeset-show.js +55 -0
  236. package/dist/mcp/tools/changeset-show.js.map +7 -0
  237. package/dist/mcp/tools/changeset-verify.js +43 -0
  238. package/dist/mcp/tools/changeset-verify.js.map +7 -0
  239. package/dist/mcp/tools/chat-launch.js +50 -0
  240. package/dist/mcp/tools/chat-launch.js.map +7 -0
  241. package/dist/mcp/tools/chat-status.js +26 -0
  242. package/dist/mcp/tools/chat-status.js.map +7 -0
  243. package/dist/mcp/tools/index.js +65 -0
  244. package/dist/mcp/tools/index.js.map +7 -0
  245. package/dist/mcp/tools/model-add.js +107 -0
  246. package/dist/mcp/tools/model-add.js.map +7 -0
  247. package/dist/mcp/tools/model-delete.js +99 -0
  248. package/dist/mcp/tools/model-delete.js.map +7 -0
  249. package/dist/mcp/tools/model-export.js +72 -0
  250. package/dist/mcp/tools/model-export.js.map +7 -0
  251. package/dist/mcp/tools/model-info.js +51 -0
  252. package/dist/mcp/tools/model-info.js.map +7 -0
  253. package/dist/mcp/tools/model-list.js +53 -0
  254. package/dist/mcp/tools/model-list.js.map +7 -0
  255. package/dist/mcp/tools/model-reload.js +34 -0
  256. package/dist/mcp/tools/model-reload.js.map +7 -0
  257. package/dist/mcp/tools/model-search.js +102 -0
  258. package/dist/mcp/tools/model-search.js.map +7 -0
  259. package/dist/mcp/tools/model-show.js +68 -0
  260. package/dist/mcp/tools/model-show.js.map +7 -0
  261. package/dist/mcp/tools/model-stats.js +22 -0
  262. package/dist/mcp/tools/model-stats.js.map +7 -0
  263. package/dist/mcp/tools/model-trace.js +118 -0
  264. package/dist/mcp/tools/model-trace.js.map +7 -0
  265. package/dist/mcp/tools/model-update.js +121 -0
  266. package/dist/mcp/tools/model-update.js.map +7 -0
  267. package/dist/mcp/tools/model-validate.js +78 -0
  268. package/dist/mcp/tools/model-validate.js.map +7 -0
  269. package/dist/mcp/tools/relationship-tools.js +98 -0
  270. package/dist/mcp/tools/relationship-tools.js.map +7 -0
  271. package/dist/mcp/tools/shared.js +126 -0
  272. package/dist/mcp/tools/shared.js.map +7 -0
  273. package/dist/mcp/tools/spec-type.js +90 -0
  274. package/dist/mcp/tools/spec-type.js.map +7 -0
  275. package/dist/reports/model-layer-report-generator.js +5 -3
  276. package/dist/reports/model-layer-report-generator.js.map +2 -2
  277. package/dist/reports/model-readme-generator.js +116 -0
  278. package/dist/reports/model-readme-generator.js.map +7 -0
  279. package/dist/reports/model-report-data.js +37 -1
  280. package/dist/reports/model-report-data.js.map +2 -2
  281. package/dist/reports/model-report-orchestrator.js +29 -6
  282. package/dist/reports/model-report-orchestrator.js.map +2 -2
  283. package/dist/reports/model-report-utils.js +9 -0
  284. package/dist/reports/model-report-utils.js.map +7 -0
  285. package/dist/schemas/bundled/analyzers/cbm.json +1186 -68
  286. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  287. package/dist/schemas/bundled/api.json +1029 -1658
  288. package/dist/schemas/bundled/apm.json +499 -734
  289. package/dist/schemas/bundled/application.json +745 -370
  290. package/dist/schemas/bundled/base.json +3 -220
  291. package/dist/schemas/bundled/business.json +452 -366
  292. package/dist/schemas/bundled/data-model.json +403 -383
  293. package/dist/schemas/bundled/data-store.json +334 -558
  294. package/dist/schemas/bundled/manifest.json +18 -18
  295. package/dist/schemas/bundled/motivation.json +349 -368
  296. package/dist/schemas/bundled/navigation.json +415 -731
  297. package/dist/schemas/bundled/product.json +325 -159
  298. package/dist/schemas/bundled/security.json +864 -1232
  299. package/dist/schemas/bundled/technology.json +574 -703
  300. package/dist/schemas/bundled/testing.json +718 -1643
  301. package/dist/schemas/bundled/ux.json +739 -1352
  302. package/dist/server/schemas.js +8 -0
  303. package/dist/server/schemas.js.map +2 -2
  304. package/dist/server/server.js +234 -31
  305. package/dist/server/server.js.map +2 -2
  306. package/dist/server-entry.js +2 -1
  307. package/dist/server-entry.js.map +2 -2
  308. package/dist/telemetry/config.js +2 -40
  309. package/dist/telemetry/config.js.map +2 -2
  310. package/dist/telemetry/index.js +1 -1
  311. package/dist/types/index.js.map +2 -2
  312. package/dist/utils/ansi-suppressor.js +23 -0
  313. package/dist/utils/ansi-suppressor.js.map +7 -0
  314. package/dist/utils/attribute-patch.js +41 -0
  315. package/dist/utils/attribute-patch.js.map +7 -0
  316. package/dist/utils/color-utils.js +34 -0
  317. package/dist/utils/color-utils.js.map +7 -0
  318. package/dist/utils/element-reference-shape.js +15 -1
  319. package/dist/utils/element-reference-shape.js.map +3 -3
  320. package/dist/utils/error-hints.js +29 -0
  321. package/dist/utils/error-hints.js.map +7 -0
  322. package/dist/utils/errors.js +75 -10
  323. package/dist/utils/errors.js.map +2 -2
  324. package/dist/utils/globals.js +17 -1
  325. package/dist/utils/globals.js.map +2 -2
  326. package/dist/utils/project-paths.js +50 -3
  327. package/dist/utils/project-paths.js.map +2 -2
  328. package/dist/utils/reference-path-parser.js +49 -0
  329. package/dist/utils/reference-path-parser.js.map +7 -0
  330. package/dist/utils/source-reference.js +17 -10
  331. package/dist/utils/source-reference.js.map +2 -2
  332. package/dist/utils/spec-version.js +10 -2
  333. package/dist/utils/spec-version.js.map +2 -2
  334. package/dist/validators/composed-reference-validator.js +240 -0
  335. package/dist/validators/composed-reference-validator.js.map +7 -0
  336. package/dist/validators/reference-validator.js +57 -13
  337. package/dist/validators/reference-validator.js.map +3 -3
  338. package/dist/validators/relationship-schema-validator.js +33 -5
  339. package/dist/validators/relationship-schema-validator.js.map +3 -3
  340. package/dist/validators/schema-validator.js +27 -9
  341. package/dist/validators/schema-validator.js.map +2 -2
  342. package/dist/validators/types.js.map +1 -1
  343. package/dist/viewer/README.md +6 -6
  344. package/dist/viewer/assets/main-CxzcuU_o.js +84 -0
  345. package/dist/viewer/assets/main-j-7ULYpm.css +1 -0
  346. package/dist/viewer/index.html +2 -2
  347. package/dist/viewer/manifest.json +10 -10
  348. package/dist/viewer/version.json +1 -1
  349. package/package.json +7 -3
  350. package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
  351. package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
@@ -5,7 +5,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
5
5
  title: "Assessment",
6
6
  requiredAttributes: ["assessmentType"],
7
7
  optionalAttributes: ["documentation"],
8
- attributeConstraints: { documentation: { type: "string" }, assessmentType: { type: "string", enum: ["SWOT", "risk", "gap", "feasibility", "readiness", "impact"], description: "Classification of the assessment method or framework used" } }
8
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the finding, including what was analysed, the evidence or source (e.g. audit, ADR, threat model), and when it was assessed. Set it for every assessment so the finding can be verified." }, assessmentType: { type: "string", enum: ["SWOT", "risk", "gap", "feasibility", "readiness", "impact"], description: "Classification of the assessment method or framework used" } }
9
9
  }, NODE_TYPE_MOTIVATION_CONSTRAINT = {
10
10
  specNodeId: "motivation.constraint",
11
11
  layer: "motivation",
@@ -13,7 +13,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
13
13
  title: "Constraint",
14
14
  requiredAttributes: ["constraintType"],
15
15
  optionalAttributes: ["documentation", "properties"],
16
- attributeConstraints: { documentation: { type: "string" }, constraintType: { type: "string", enum: ["regulatory", "technical", "organizational", "time-based", "financial", "external"], description: "Category of constraint restricting the solution space" }, properties: { type: "object", description: "Cross-layer properties" } }
16
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the restriction, giving its source (regulation, contract, decision record, budget), the scope it applies to and how compliance can be checked; set it for every constraint so the limit can be verified." }, constraintType: { type: "string", enum: ["regulatory", "technical", "organizational", "time-based", "financial", "external"], description: "Category of constraint restricting the solution space" }, properties: { type: "object", description: "Cross-layer properties" } }
17
17
  }, NODE_TYPE_MOTIVATION_DRIVER = {
18
18
  specNodeId: "motivation.driver",
19
19
  layer: "motivation",
@@ -21,7 +21,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
21
21
  title: "Driver",
22
22
  requiredAttributes: ["category"],
23
23
  optionalAttributes: ["documentation"],
24
- attributeConstraints: { documentation: { type: "string" }, category: { type: "string", enum: ["market", "regulatory", "operational", "strategic", "competitive", "technological", "business", "technical"], description: "Category of the motivating condition or force" } }
24
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the motivating condition: what it is, where it originates (internal or external), and any source evidence such as a regulation citation, incident or metric. Set it whenever the name alone does not make the condition unambiguous." }, category: { type: "string", enum: ["market", "regulatory", "operational", "strategic", "competitive", "technological", "business", "technical"], description: "Category of the motivating condition or force" } }
25
25
  }, NODE_TYPE_MOTIVATION_GOAL = {
26
26
  specNodeId: "motivation.goal",
27
27
  layer: "motivation",
@@ -29,7 +29,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
29
29
  title: "Goal",
30
30
  requiredAttributes: ["priority"],
31
31
  optionalAttributes: ["documentation", "properties"],
32
- attributeConstraints: { documentation: { type: "string" }, priority: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: "Priority level of this goal" }, properties: { type: "object", description: "Cross-layer properties" } }
32
+ attributeConstraints: { documentation: { type: "string", description: "Free-text prose that states the intended end state, its scope and owning stakeholders, and links to the source document. Set it whenever the goal's name alone does not make the intent unambiguous." }, priority: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: "Priority level of this goal" }, properties: { type: "object", description: "Cross-layer properties" } }
33
33
  }, NODE_TYPE_MOTIVATION_MEANING = {
34
34
  specNodeId: "motivation.meaning",
35
35
  layer: "motivation",
@@ -37,7 +37,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
37
37
  title: "Meaning",
38
38
  requiredAttributes: [],
39
39
  optionalAttributes: ["documentation"],
40
- attributeConstraints: { documentation: { type: "string" } }
40
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the interpretation itself: which concept it applies to, the context or stakeholder group in which the interpretation holds, and the meaning given; set it on every instance, since it is the substance of the element." } }
41
41
  }, NODE_TYPE_MOTIVATION_OUTCOME = {
42
42
  specNodeId: "motivation.outcome",
43
43
  layer: "motivation",
@@ -45,7 +45,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
45
45
  title: "Outcome",
46
46
  requiredAttributes: ["status"],
47
47
  optionalAttributes: ["documentation", "properties"],
48
- attributeConstraints: { documentation: { type: "string" }, status: { type: "string", enum: ["planned", "in-progress", "achieved", "abandoned", "at-risk"], description: "Lifecycle state of the outcome" }, properties: { type: "object", description: "Cross-layer properties" } }
48
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the result, including the measure, target value or threshold, and target date where known; set it for every outcome so its achievement can be verified." }, status: { type: "string", enum: ["planned", "in-progress", "achieved", "abandoned", "at-risk"], description: "Lifecycle state of the outcome" }, properties: { type: "object", description: "Cross-layer properties" } }
49
49
  }, NODE_TYPE_MOTIVATION_PRINCIPLE = {
50
50
  specNodeId: "motivation.principle",
51
51
  layer: "motivation",
@@ -53,7 +53,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
53
53
  title: "Principle",
54
54
  requiredAttributes: ["category"],
55
55
  optionalAttributes: ["documentation", "properties"],
56
- attributeConstraints: { documentation: { type: "string" }, category: { type: "string", enum: ["architecture", "data", "security", "operational", "financial", "integration", "development"], description: "Domain area to which this architectural principle applies" }, properties: { type: "object", description: "Cross-layer properties" } }
56
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the principle, ideally with its rationale and implications, written as a single prescriptive sentence followed by explanatory prose; set it for every principle." }, category: { type: "string", enum: ["architecture", "data", "security", "operational", "financial", "integration", "development"], description: "Domain area to which this architectural principle applies" }, properties: { type: "object", description: "Cross-layer properties" } }
57
57
  }, NODE_TYPE_MOTIVATION_REQUIREMENT = {
58
58
  specNodeId: "motivation.requirement",
59
59
  layer: "motivation",
@@ -61,7 +61,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
61
61
  title: "Requirement",
62
62
  requiredAttributes: ["requirementType", "priority"],
63
63
  optionalAttributes: ["documentation", "properties"],
64
- attributeConstraints: { documentation: { type: "string" }, requirementType: { type: "string", enum: ["functional", "non-functional", "regulatory", "business", "quality"], description: "Classification of what aspect of the system this requirement addresses" }, priority: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: "Priority level of this requirement" }, properties: { type: "object", description: "Cross-layer properties" } }
64
+ attributeConstraints: { documentation: { type: "string", description: "Free-text statement of the requirement, including its full wording, rationale, source, and acceptance or verification criteria; set it whenever the name alone does not make the need verifiable." }, requirementType: { type: "string", enum: ["functional", "non-functional", "regulatory", "business", "quality"], description: "Classification of what aspect of the system this requirement addresses" }, priority: { type: "string", enum: ["critical", "high", "medium", "low", "informational"], description: "Priority level of this requirement" }, properties: { type: "object", description: "Cross-layer properties" } }
65
65
  }, NODE_TYPE_MOTIVATION_STAKEHOLDER = {
66
66
  specNodeId: "motivation.stakeholder",
67
67
  layer: "motivation",
@@ -69,7 +69,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
69
69
  title: "Stakeholder",
70
70
  requiredAttributes: ["type"],
71
71
  optionalAttributes: ["documentation"],
72
- attributeConstraints: { documentation: { type: "string" }, type: { type: "string", enum: ["internal", "external", "regulatory", "customer", "sponsor", "end-user", "system"], description: "Classification of the stakeholder's relationship to the organization" } }
72
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the stakeholder's role, scope, and principal concerns or interests in the architecture. Set it whenever the name alone does not make clear who the party is or what it cares about." }, type: { type: "string", enum: ["internal", "external", "regulatory", "customer", "sponsor", "end-user", "system"], description: "Classification of the stakeholder's relationship to the organization" } }
73
73
  }, NODE_TYPE_MOTIVATION_VALUE = {
74
74
  specNodeId: "motivation.value",
75
75
  layer: "motivation",
@@ -77,7 +77,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
77
77
  title: "Value",
78
78
  requiredAttributes: ["valueType"],
79
79
  optionalAttributes: ["documentation", "properties"],
80
- attributeConstraints: { documentation: { type: "string" }, valueType: { type: "string", enum: ["financial", "strategic", "operational", "reputational", "social"], description: "Category of worth or utility this value represents" }, properties: { type: "object", description: "Cross-layer properties" } }
80
+ attributeConstraints: { documentation: { type: "string", description: "Free-text explanation of the value: which stakeholders it applies to, what benefit they gain, and any quantification or evidence. Set it whenever the element name alone does not state who benefits and how." }, valueType: { type: "string", enum: ["financial", "strategic", "operational", "reputational", "social"], description: "Category of worth or utility this value represents" }, properties: { type: "object", description: "Cross-layer properties" } }
81
81
  }, NODE_TYPE_BUSINESS_BUSINESSACTOR = {
82
82
  specNodeId: "business.businessactor",
83
83
  layer: "business",
@@ -85,7 +85,15 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
85
85
  title: "BusinessActor",
86
86
  requiredAttributes: [],
87
87
  optionalAttributes: ["documentation"],
88
- attributeConstraints: { documentation: { type: "string" } }
88
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the organizational entity: who it is, whether it is internal or external, and its scope (person, unit or organization). Set it whenever the name alone does not make the entity's identity and boundary clear." } }
89
+ }, NODE_TYPE_BUSINESS_BUSINESSCAPABILITY = {
90
+ specNodeId: "business.businesscapability",
91
+ layer: "business",
92
+ type: "businesscapability",
93
+ title: "BusinessCapability",
94
+ requiredAttributes: [],
95
+ optionalAttributes: ["documentation", "level"],
96
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the ability, its scope and the outcomes it enables; set whenever the name alone does not make the ability unambiguous." }, level: { type: "integer", minimum: 1, description: "Depth of the capability in the organization's capability map, 1 for a top-level capability." } }
89
97
  }, NODE_TYPE_BUSINESS_BUSINESSCOLLABORATION = {
90
98
  specNodeId: "business.businesscollaboration",
91
99
  layer: "business",
@@ -93,7 +101,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
93
101
  title: "BusinessCollaboration",
94
102
  requiredAttributes: [],
95
103
  optionalAttributes: ["documentation", "properties"],
96
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
104
+ attributeConstraints: { documentation: { type: "string", description: "Free-text prose describing the collaboration's purpose, its participating roles and the collective behavior it exists to perform; set whenever the element name alone does not make the participants and scope clear." }, properties: { type: "object", description: "Cross-layer properties" } }
97
105
  }, NODE_TYPE_BUSINESS_BUSINESSEVENT = {
98
106
  specNodeId: "business.businessevent",
99
107
  layer: "business",
@@ -101,7 +109,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
101
109
  title: "BusinessEvent",
102
110
  requiredAttributes: ["type"],
103
111
  optionalAttributes: ["documentation", "properties"],
104
- attributeConstraints: { documentation: { type: "string" }, type: { type: "string", enum: ["internal", "external", "message", "timer"], description: "Classification of the business event trigger" }, properties: { type: "object", description: "Cross-layer properties" } }
112
+ attributeConstraints: { documentation: { type: "string", description: "Free-text explanation of the business occurrence, giving the state change it marks, its source, and the condition under which it is raised; set it whenever the event name alone does not make the trigger condition unambiguous." }, type: { type: "string", enum: ["internal", "external", "message", "timer"], description: "Classification of the business event trigger" }, properties: { type: "object", description: "Cross-layer properties" } }
105
113
  }, NODE_TYPE_BUSINESS_BUSINESSFUNCTION = {
106
114
  specNodeId: "business.businessfunction",
107
115
  layer: "business",
@@ -109,7 +117,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
109
117
  title: "BusinessFunction",
110
118
  requiredAttributes: [],
111
119
  optionalAttributes: ["documentation"],
112
- attributeConstraints: { documentation: { type: "string" } }
120
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the competency area this function covers, its scope boundaries and the roles that perform it; set whenever the name alone does not make the grouped behavior unambiguous." } }
113
121
  }, NODE_TYPE_BUSINESS_BUSINESSINTERACTION = {
114
122
  specNodeId: "business.businessinteraction",
115
123
  layer: "business",
@@ -117,7 +125,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
117
125
  title: "BusinessInteraction",
118
126
  requiredAttributes: [],
119
127
  optionalAttributes: ["documentation"],
120
- attributeConstraints: { documentation: { type: "string" } }
128
+ attributeConstraints: { documentation: { type: "string", description: "Free-text prose that names the participating roles, the joint result the interaction produces and its triggering events; set it whenever the participants or outcome are not obvious from the element name." } }
121
129
  }, NODE_TYPE_BUSINESS_BUSINESSINTERFACE = {
122
130
  specNodeId: "business.businessinterface",
123
131
  layer: "business",
@@ -125,7 +133,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
125
133
  title: "BusinessInterface",
126
134
  requiredAttributes: [],
127
135
  optionalAttributes: ["documentation", "properties"],
128
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
136
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the access channel, stating which BusinessServices it exposes, who uses it, and its medium (e.g. phone, web, in person); set it for every instance so the channel's scope is unambiguous." }, properties: { type: "object", description: "Cross-layer properties" } }
129
137
  }, NODE_TYPE_BUSINESS_BUSINESSOBJECT = {
130
138
  specNodeId: "business.businessobject",
131
139
  layer: "business",
@@ -133,7 +141,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
133
141
  title: "BusinessObject",
134
142
  requiredAttributes: [],
135
143
  optionalAttributes: ["documentation", "properties"],
136
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
144
+ attributeConstraints: { documentation: { type: "string", description: "Free-text business definition of the object: what it means to the organization, its key information content and its lifecycle. Write it in domain vocabulary without storage or schema detail, and set it whenever the name alone is ambiguous." }, properties: { type: "object", description: "Cross-layer properties" } }
137
145
  }, NODE_TYPE_BUSINESS_BUSINESSPROCESS = {
138
146
  specNodeId: "business.businessprocess",
139
147
  layer: "business",
@@ -141,7 +149,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
141
149
  title: "BusinessProcess",
142
150
  requiredAttributes: [],
143
151
  optionalAttributes: ["documentation", "properties"],
144
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
152
+ attributeConstraints: { documentation: { type: "string", description: "Free-text prose describing the process's trigger, main steps, performing role, and end result, written in business terms; set whenever the name alone does not make the start and end conditions clear." }, properties: { type: "object", description: "Cross-layer properties" } }
145
153
  }, NODE_TYPE_BUSINESS_BUSINESSROLE = {
146
154
  specNodeId: "business.businessrole",
147
155
  layer: "business",
@@ -149,7 +157,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
149
157
  title: "BusinessRole",
150
158
  requiredAttributes: [],
151
159
  optionalAttributes: ["documentation"],
152
- attributeConstraints: { documentation: { type: "string" } }
160
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the role's responsibilities, required skills or authorizations, and typical occupying actors; set it whenever the role name alone does not make the scope of responsibility clear." } }
153
161
  }, NODE_TYPE_BUSINESS_BUSINESSSERVICE = {
154
162
  specNodeId: "business.businessservice",
155
163
  layer: "business",
@@ -157,7 +165,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
157
165
  title: "BusinessService",
158
166
  requiredAttributes: [],
159
167
  optionalAttributes: ["documentation", "properties"],
160
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
168
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the service from the consumer's perspective: the need it fulfills, its intended consumers, and any service levels. Set it whenever the name alone does not make the offered outcome clear." }, properties: { type: "object", description: "Cross-layer properties" } }
161
169
  }, NODE_TYPE_BUSINESS_CONTRACT = {
162
170
  specNodeId: "business.contract",
163
171
  layer: "business",
@@ -165,7 +173,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
165
173
  title: "Contract",
166
174
  requiredAttributes: [],
167
175
  optionalAttributes: ["documentation", "properties"],
168
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
176
+ attributeConstraints: { documentation: { type: "string", description: "Free-text explanation of the agreement: the parties, the services or product it covers, and its key obligations and terms. Set it whenever the element name alone does not identify which agreement is meant." }, properties: { type: "object", description: "Cross-layer properties" } }
169
177
  }, NODE_TYPE_BUSINESS_PRODUCT = {
170
178
  specNodeId: "business.product",
171
179
  layer: "business",
@@ -173,7 +181,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
173
181
  title: "Product",
174
182
  requiredAttributes: [],
175
183
  optionalAttributes: ["documentation"],
176
- attributeConstraints: { documentation: { type: "string" } }
184
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the offering: its name as marketed, target customers or market, included services, and governing terms. Set it whenever the element is created so reviewers can tell this bundle apart from others." } }
177
185
  }, NODE_TYPE_BUSINESS_REPRESENTATION = {
178
186
  specNodeId: "business.representation",
179
187
  layer: "business",
@@ -181,15 +189,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
181
189
  title: "Representation",
182
190
  requiredAttributes: ["format"],
183
191
  optionalAttributes: ["documentation"],
184
- attributeConstraints: { documentation: { type: "string" }, format: { type: "string", enum: ["pdf", "html", "xml", "json", "plain-text", "binary"], description: "The media format of this representation" } }
185
- }, NODE_TYPE_PRODUCT_CAPABILITY = {
186
- specNodeId: "product.capability",
187
- layer: "product",
188
- type: "capability",
189
- title: "Capability",
190
- requiredAttributes: ["status"],
191
- optionalAttributes: ["documentation", "properties"],
192
- attributeConstraints: { documentation: { type: "string", description: "Detailed description of the capability" }, status: { type: "string", enum: ["proposed", "planned", "developing", "delivered", "deprecated"], description: "Lifecycle status of the capability" }, properties: { type: "object", description: "Cross-layer properties" } }
192
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the representation, such as its audience, layout, channel (printed, emailed, on-screen), and which business object it carries. Set it whenever the name alone does not identify the rendering." }, format: { type: "string", enum: ["pdf", "html", "xml", "json", "plain-text", "binary"], description: "The media format of this representation" } }
193
193
  }, NODE_TYPE_PRODUCT_FEATURE = {
194
194
  specNodeId: "product.feature",
195
195
  layer: "product",
@@ -214,6 +214,14 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
214
214
  requiredAttributes: ["category", "proficiency"],
215
215
  optionalAttributes: ["documentation"],
216
216
  attributeConstraints: { documentation: { type: "string", description: "Detailed description of the persona" }, category: { type: "string", enum: ["primary", "secondary", "served", "negative"], description: "Persona classification by importance" }, proficiency: { type: "string", enum: ["novice", "intermediate", "advanced", "expert"], description: "Technical proficiency level" } }
217
+ }, NODE_TYPE_PRODUCT_SOFTWARECAPABILITY = {
218
+ specNodeId: "product.softwarecapability",
219
+ layer: "product",
220
+ type: "softwarecapability",
221
+ title: "SoftwareCapability",
222
+ requiredAttributes: ["status"],
223
+ optionalAttributes: ["documentation", "properties"],
224
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the software capability" }, status: { type: "string", enum: ["proposed", "planned", "developing", "delivered", "deprecated"], description: "Lifecycle status of the software capability" }, properties: { type: "object", description: "Cross-layer properties" } }
217
225
  }, NODE_TYPE_PRODUCT_USERWORKFLOW = {
218
226
  specNodeId: "product.userworkflow",
219
227
  layer: "product",
@@ -222,6 +230,14 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
222
230
  requiredAttributes: ["complexity"],
223
231
  optionalAttributes: ["documentation", "properties"],
224
232
  attributeConstraints: { documentation: { type: "string", description: "Detailed description of the user workflow" }, complexity: { type: "string", enum: ["simple", "moderate", "complex"], description: "Workflow complexity assessment" }, properties: { type: "object", description: "Cross-layer properties" } }
233
+ }, NODE_TYPE_PRODUCT_WORKFLOWSTEP = {
234
+ specNodeId: "product.workflowstep",
235
+ layer: "product",
236
+ type: "workflowstep",
237
+ title: "WorkflowStep",
238
+ requiredAttributes: ["sequence", "action"],
239
+ optionalAttributes: ["documentation", "outcome", "optional", "properties"],
240
+ attributeConstraints: { documentation: { type: "string", description: "Detailed description of the step" }, sequence: { type: "integer", minimum: 1, description: "Position of the step within its UserWorkflow (1-based)" }, action: { type: "string", description: "What the user does or experiences at this step, from the user's point of view (e.g. 'Requests a password reset link')" }, outcome: { type: "string", description: "Observable result of the step for the user (e.g. 'Receives an email containing a reset link')" }, optional: { type: "boolean", description: "Whether the workflow can complete without this step", default: !1 }, properties: { type: "object", description: "Cross-layer properties" } }
225
241
  }, NODE_TYPE_SECURITY_ACCESSCONDITION = {
226
242
  specNodeId: "security.accesscondition",
227
243
  layer: "security",
@@ -229,7 +245,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
229
245
  title: "AccessCondition",
230
246
  requiredAttributes: ["field", "operator", "value", "message", "source"],
231
247
  optionalAttributes: [],
232
- attributeConstraints: { field: { type: "string" }, operator: { type: "string", enum: ["eq", "neq", "gt", "lt", "in", "contains", "matches", "exists"], description: "Comparison operator applied to the field value, per XACML 3.0 match function semantics." }, value: { type: "string" }, message: { type: "string" }, source: { type: "string" } }
248
+ attributeConstraints: { field: { type: "string", description: "Dot-path name of the request-context attribute being tested (e.g. 'subject.role', 'resource.ownerId', 'env.ipAddress'), as it is resolved at evaluation time." }, operator: { type: "string", enum: ["eq", "neq", "gt", "lt", "in", "contains", "matches", "exists"], description: "Comparison operator applied to the field value, per XACML 3.0 match function semantics." }, value: { type: "string", description: "Comparison operand as a string: a literal, a comma-separated list for 'in', a regex for 'matches', or a context reference such as '${subject.id}'. Leave empty only for operator 'exists'." }, message: { type: "string", description: "Human-readable denial reason returned or logged when the predicate evaluates to false, e.g. 'Caller must belong to the resource tenant'." }, source: { type: "string", description: "Where the field value is read from in the request context, such as 'token', 'header', 'path', 'query', 'body', 'session' or 'environment'. Set it so evaluators know which input to resolve." } }
233
249
  }, NODE_TYPE_SECURITY_ACCOUNTABILITYREQUIREMENT = {
234
250
  specNodeId: "security.accountabilityrequirement",
235
251
  layer: "security",
@@ -237,7 +253,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
237
253
  title: "AccountabilityRequirement",
238
254
  requiredAttributes: ["action", "resource", "nonRepudiation", "purposeDeclaration", "challengeable"],
239
255
  optionalAttributes: [],
240
- attributeConstraints: { action: { type: "string" }, resource: { type: "string" }, nonRepudiation: { type: "boolean" }, purposeDeclaration: { type: "string" }, challengeable: { type: "boolean" } }
256
+ attributeConstraints: { action: { type: "string", description: "The operation whose occurrence must be provable, named as a verb or operation identifier (e.g. 'approve-payment', 'delete'), ideally matching a ResourceOperation's operation value." }, resource: { type: "string", description: "Identifier of the secured resource or information entity on which the action is performed, matching a SecureResource resource name or InformationEntity name." }, nonRepudiation: { type: "boolean", description: "True when the actor must be unable to deny having performed the action, requiring strong or cryptographic evidence such as a digital signature. False when attributable logging alone suffices." }, purposeDeclaration: { type: "string", description: "A free-text statement of the business, legal or regulatory reason the action must be provable (e.g. 'SOX approval trail', 'GDPR consent record'). Set it from the governing requirement." }, challengeable: { type: "boolean", description: "True when the acting party or a third party may formally dispute the recorded proof through a defined process. False when the evidence is treated as final once recorded." } }
241
257
  }, NODE_TYPE_SECURITY_ACTOR = {
242
258
  specNodeId: "security.actor",
243
259
  layer: "security",
@@ -245,7 +261,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
245
261
  title: "Actor",
246
262
  requiredAttributes: ["type"],
247
263
  optionalAttributes: ["description", "trustLevel", "objectives", "dependencies"],
248
- attributeConstraints: { type: { type: "string", enum: ["human", "service", "system", "external-entity"], description: "Category of actor, per NIST AC-2 (Account Management) subject classification." }, description: { type: "string" }, trustLevel: { type: "string", enum: ["zero", "low", "medium", "high", "full"], description: "Zero-trust assurance level assigned to this actor, per NIST SP 800-207." }, objectives: { type: "array", description: "References nodes describing this actor's goals or intended behaviors (e.g., for threat modeling or trust analysis)." }, dependencies: { type: "array", description: "References actor or delegation nodes this actor depends on for trust chain or access delegation analysis." } }
264
+ attributeConstraints: { type: { type: "string", enum: ["human", "service", "system", "external-entity"], description: "Category of actor, per NIST AC-2 (Account Management) subject classification." }, description: { type: "string", description: "Free-text summary of who or what this actor represents, for example 'nightly billing batch job' or 'external payment partner'. Set it whenever the actor's name alone does not make its identity source or purpose clear." }, trustLevel: { type: "string", enum: ["zero", "low", "medium", "high", "full"], description: "Zero-trust assurance level assigned to this actor, per NIST SP 800-207." }, objectives: { type: "array", description: "References nodes describing this actor's goals or intended behaviors (e.g., for threat modeling or trust analysis)." }, dependencies: { type: "array", description: "References actor or delegation nodes this actor depends on for trust chain or access delegation analysis." } }
249
265
  }, NODE_TYPE_SECURITY_AUDITCONFIG = {
250
266
  specNodeId: "security.auditconfig",
251
267
  layer: "security",
@@ -253,7 +269,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
253
269
  title: "AuditConfig",
254
270
  requiredAttributes: ["level", "sanitizeFields"],
255
271
  optionalAttributes: ["enabled", "includePayload", "includeHeaders", "source"],
256
- attributeConstraints: { enabled: { type: "boolean" }, level: { type: "string", enum: ["none", "basic", "standard", "detailed", "verbose"], description: "Verbosity of audit event capture, from no logging to full payload-level tracing, per NIST SP 800-53 AU-2 Event Logging." }, includePayload: { type: "boolean" }, includeHeaders: { type: "boolean" }, sanitizeFields: { type: "string" }, source: { type: "object", description: "Source code reference" } }
272
+ attributeConstraints: { enabled: { type: "boolean", description: "Whether audit capture is active for the governed resources or operations; set false to model a defined but switched-off audit configuration (defaults to true when omitted)." }, level: { type: "string", enum: ["none", "basic", "standard", "detailed", "verbose"], description: "Verbosity of audit event capture, from no logging to full payload-level tracing, per NIST SP 800-53 AU-2 Event Logging." }, includePayload: { type: "boolean", description: "Whether request and response bodies are recorded in audit entries; set true only when forensic needs justify capturing body content, after applying sanitizeFields." }, includeHeaders: { type: "boolean", description: "Whether HTTP or message headers are recorded in audit entries; set true when headers such as client IP, user agent or correlation IDs are needed, with credentials redacted via sanitizeFields." }, sanitizeFields: { type: "string", description: "Comma-separated list of field names or JSON paths (e.g. 'password,authorization,card.number') whose values are redacted or masked before an audit entry is written; use an empty string when nothing is sanitized." }, source: { type: "object", description: "Source code reference" } }
257
273
  }, NODE_TYPE_SECURITY_AUTHENTICATIONCONFIG = {
258
274
  specNodeId: "security.authenticationconfig",
259
275
  layer: "security",
@@ -261,7 +277,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
261
277
  title: "AuthenticationConfig",
262
278
  requiredAttributes: ["provider", "sessionTimeout"],
263
279
  optionalAttributes: ["verificationLevel", "mfaRequired", "passwordPolicy", "source"],
264
- attributeConstraints: { provider: { type: "string", enum: ["oauth2", "saml", "ldap", "openid-connect", "local", "fido2"], description: "Authentication protocol or provider type." }, verificationLevel: { type: "string", enum: ["ial1", "ial2", "ial3"], description: "Identity Assurance Level, per NIST SP 800-63A: IAL1 (self-asserted), IAL2 (remote identity proofing), IAL3 (in-person proofing)." }, sessionTimeout: { type: "integer" }, mfaRequired: { type: "boolean" }, passwordPolicy: { type: "string" }, source: { type: "object", description: "Source code reference" } }
280
+ attributeConstraints: { provider: { type: "string", enum: ["oauth2", "saml", "ldap", "openid-connect", "local", "fido2"], description: "Authentication protocol or provider type." }, verificationLevel: { type: "string", enum: ["ial1", "ial2", "ial3"], description: "Identity Assurance Level, per NIST SP 800-63A: IAL1 (self-asserted), IAL2 (remote identity proofing), IAL3 (in-person proofing)." }, sessionTimeout: { type: "integer", description: "Maximum lifetime of an authenticated session in seconds before the principal must re-authenticate (IA-11). Set it from the configured session max-age or access-token expiry." }, mfaRequired: { type: "boolean", description: "True when principals must present a second authentication factor (TOTP, WebAuthn, SMS, push) in addition to the primary credential (IA-2(1)/(2)). Set it false or omit it when MFA is optional or absent." }, passwordPolicy: { type: "string", description: "Identifier of the security.passwordpolicy node governing credentials for this configuration. Set it only when the provider uses locally managed passwords, typically provider 'local' or 'ldap'." }, source: { type: "object", description: "Source code reference" } }
265
281
  }, NODE_TYPE_SECURITY_BINDINGOFDUTY = {
266
282
  specNodeId: "security.bindingofduty",
267
283
  layer: "security",
@@ -269,7 +285,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
269
285
  title: "BindingOfDuty",
270
286
  requiredAttributes: ["message"],
271
287
  optionalAttributes: ["description", "scope"],
272
- attributeConstraints: { description: { type: "string" }, message: { type: "string" }, scope: { type: "string", description: "Organizational or operational boundary within which this binding of duty constraint applies (e.g., a project, department, or system)." } }
288
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of which task steps are bound together and why the same actor must perform them; set it whenever the bound steps are not obvious from the element name." }, message: { type: "string", description: "The human-readable error or log message emitted when a different actor attempts to continue or complete the bound task, taken verbatim from the code where one exists." }, scope: { type: "string", description: "Organizational or operational boundary within which this binding of duty constraint applies (e.g., a project, department, or system)." } }
273
289
  }, NODE_TYPE_SECURITY_CONDITION = {
274
290
  specNodeId: "security.condition",
275
291
  layer: "security",
@@ -277,7 +293,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
277
293
  title: "Condition",
278
294
  requiredAttributes: ["expression"],
279
295
  optionalAttributes: ["description", "operator", "evaluationType", "source"],
280
- attributeConstraints: { expression: { type: "string" }, description: { type: "string" }, operator: { type: "string", enum: ["eq", "neq", "gt", "lt", "in", "contains", "matches"], description: "Comparison operator for the condition expression, aligned with XACML MatchType values." }, evaluationType: { type: "string", enum: ["static", "dynamic", "runtime", "compile-time"], description: "When the condition is evaluated: at build time, at policy load, or at runtime during access enforcement." }, source: { type: "object", description: "Source code reference" } }
296
+ attributeConstraints: { expression: { type: "string", description: "The boolean expression text in its source language (e.g. SpEL, CEL, Rego, IAM condition JSON, or pseudocode such as 'request.time between 08:00 and 18:00'). Always set this; copy it verbatim from code where possible." }, description: { type: "string", description: "A plain-language sentence stating what the condition tests and why policies reference it. Set it when the expression is not self-explanatory to a reviewer." }, operator: { type: "string", enum: ["eq", "neq", "gt", "lt", "in", "contains", "matches"], description: "Comparison operator for the condition expression, aligned with XACML MatchType values." }, evaluationType: { type: "string", enum: ["static", "dynamic", "runtime", "compile-time"], description: "When the condition is evaluated: at build time, at policy load, or at runtime during access enforcement." }, source: { type: "object", description: "Source code reference" } }
281
297
  }, NODE_TYPE_SECURITY_COUNTERMEASURE = {
282
298
  specNodeId: "security.countermeasure",
283
299
  layer: "security",
@@ -285,7 +301,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
285
301
  title: "Countermeasure",
286
302
  requiredAttributes: ["type"],
287
303
  optionalAttributes: ["description", "effectiveness", "implemented", "source"],
288
- attributeConstraints: { type: { type: "string", enum: ["technical", "operational", "management", "physical"], description: "NIST SP 800-53 control family classification: technical (hardware/software mechanisms), operational (people and procedures), management (governance), or physical (facility/environmental)." }, description: { type: "string" }, effectiveness: { type: "string", enum: ["high", "medium", "low", "unknown"], description: "Assessed effectiveness of the countermeasure in reducing threat risk, per NIST SP 800-30 risk treatment evaluation." }, implemented: { type: "boolean" }, source: { type: "object", description: "Source code reference" } }
304
+ attributeConstraints: { type: { type: "string", enum: ["technical", "operational", "management", "physical"], description: "NIST SP 800-53 control family classification: technical (hardware/software mechanisms), operational (people and procedures), management (governance), or physical (facility/environmental)." }, description: { type: "string", description: "Free-text explanation of what the control does, which mechanism or procedure realises it, and which threat behaviour it counters; set whenever the name alone does not identify the mechanism." }, effectiveness: { type: "string", enum: ["high", "medium", "low", "unknown"], description: "Assessed effectiveness of the countermeasure in reducing threat risk, per NIST SP 800-30 risk treatment evaluation." }, implemented: { type: "boolean", description: "True when the control is deployed and active in the system under model, false when it is planned, proposed or only documented; set from evidence such as deployed config or code, not from intent." }, source: { type: "object", description: "Source code reference" } }
289
305
  }, NODE_TYPE_SECURITY_DATACLASSIFICATION = {
290
306
  specNodeId: "security.dataclassification",
291
307
  layer: "security",
@@ -293,7 +309,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
293
309
  title: "DataClassification",
294
310
  requiredAttributes: [],
295
311
  optionalAttributes: ["version", "encryptionRequirement", "classificationLevel"],
296
- attributeConstraints: { version: { type: "string" }, encryptionRequirement: { type: "string", enum: ["none", "in-transit", "at-rest", "end-to-end", "field-level"], description: "Minimum encryption obligation for data within this classification scheme, per NIST SP 800-53 SC-28 and SC-8 controls." }, classificationLevel: { type: "string", enum: ["public", "internal", "confidential", "restricted", "top-secret"], description: "Data sensitivity tier applied by this scheme, aligned with NIST FIPS 199 security categorization levels." } }
312
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this classification definition, as semver or an ISO 8601 date; set it when the tier's handling rules are revised so that labelled data can be traced to the rules in force at the time." }, encryptionRequirement: { type: "string", enum: ["none", "in-transit", "at-rest", "end-to-end", "field-level"], description: "Minimum encryption obligation for data within this classification scheme, per NIST SP 800-53 SC-28 and SC-8 controls." }, classificationLevel: { type: "string", enum: ["public", "internal", "confidential", "restricted", "top-secret"], description: "Data sensitivity tier applied by this scheme, aligned with NIST FIPS 199 security categorization levels." } }
297
313
  }, NODE_TYPE_SECURITY_DELEGATION = {
298
314
  specNodeId: "security.delegation",
299
315
  layer: "security",
@@ -301,7 +317,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
301
317
  title: "Delegation",
302
318
  requiredAttributes: ["delegator", "delegatee", "delegationType"],
303
319
  optionalAttributes: ["validUntil", "description"],
304
- attributeConstraints: { delegator: { type: "string" }, delegatee: { type: "string" }, delegationType: { type: "string", enum: ["full", "partial", "temporary", "conditional", "revocable"], description: "Scope and constraints of the delegation grant, per OAuth 2.0 token delegation and NIST SP 800-162 attribute delegation models." }, validUntil: { type: "string", description: "ISO 8601 datetime after which this delegation automatically expires. Required for delegationType 'temporary' and recommended for 'conditional' to enforce time-bounded privilege grants per AC-6." }, description: { type: "string" } }
320
+ attributeConstraints: { delegator: { type: "string", description: "Identifier of the security.actor granting its authority; set to the actor whose permissions or role are being transferred, and that actor must hold that authority itself." }, delegatee: { type: "string", description: "Identifier of the security.actor receiving the delegated authority; set to the principal who will act on the delegator's behalf." }, delegationType: { type: "string", enum: ["full", "partial", "temporary", "conditional", "revocable"], description: "Scope and constraints of the delegation grant, per OAuth 2.0 token delegation and NIST SP 800-162 attribute delegation models." }, validUntil: { type: "string", description: "ISO 8601 datetime after which this delegation automatically expires. Required for delegationType 'temporary' and recommended for 'conditional' to enforce time-bounded privilege grants per AC-6." }, description: { type: "string", description: "Free-text explanation of what authority is delegated, for what purpose, and any scope limits not captured by delegationType or validUntil." } }
305
321
  }, NODE_TYPE_SECURITY_EVIDENCE = {
306
322
  specNodeId: "security.evidence",
307
323
  layer: "security",
@@ -317,7 +333,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
317
333
  title: "FieldAccessControl",
318
334
  requiredAttributes: ["field"],
319
335
  optionalAttributes: ["maskingStrategy", "description"],
320
- attributeConstraints: { field: { type: "string" }, maskingStrategy: { type: "string", enum: ["redact", "hash", "tokenize", "truncate", "blur", "none"], description: "Technique used to protect sensitive field values when exposed to unauthorized principals, per NIST SP 800-53 SC-28 data-at-rest protection controls." }, description: { type: "string" } }
336
+ attributeConstraints: { field: { type: "string", description: "Name or dotted path of the protected field within the parent SecureResource (e.g. 'customer.ssn' or 'card_number'); always set it, matching the field name as it appears in the resource's schema or payload." }, maskingStrategy: { type: "string", enum: ["redact", "hash", "tokenize", "truncate", "blur", "none"], description: "Technique used to protect sensitive field values when exposed to unauthorized principals, per NIST SP 800-53 SC-28 data-at-rest protection controls." }, description: { type: "string", description: "Free-text explanation of why the field is protected and who may see it unmasked; set it when the masking rationale or exemption is not obvious from the field name and strategy." } }
321
337
  }, NODE_TYPE_SECURITY_INFORMATIONENTITY = {
322
338
  specNodeId: "security.informationentity",
323
339
  layer: "security",
@@ -325,7 +341,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
325
341
  title: "InformationEntity",
326
342
  requiredAttributes: ["classification"],
327
343
  optionalAttributes: ["description", "authorizationRequirements"],
328
- attributeConstraints: { description: { type: "string" }, classification: { type: "string", description: "Sensitivity classification of this information asset. Use classificationLevel values: public, internal, confidential, restricted, or top-secret." }, authorizationRequirements: { type: "array", description: "References InformationRight nodes defining which actors may access this entity and under what constraints." } }
344
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of what data this information asset comprises (example fields, data subjects, and systems where it appears); set it whenever the entity name alone does not make the boundary of the asset clear." }, classification: { type: "string", description: "Sensitivity classification of this information asset. Use classificationLevel values: public, internal, confidential, restricted, or top-secret." }, authorizationRequirements: { type: "array", description: "References InformationRight nodes defining which actors may access this entity and under what constraints." } }
329
345
  }, NODE_TYPE_SECURITY_INFORMATIONRIGHT = {
330
346
  specNodeId: "security.informationright",
331
347
  layer: "security",
@@ -341,7 +357,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
341
357
  title: "NeedToKnow",
342
358
  requiredAttributes: ["resource", "objective", "message", "justificationRequired"],
343
359
  optionalAttributes: [],
344
- attributeConstraints: { resource: { type: "string" }, objective: { type: "string", description: "A free-text statement of the business or operational purpose that justifies access. This is a purpose declaration string, not a reference to an ActorObjective node." }, message: { type: "string" }, justificationRequired: { type: "boolean" } }
360
+ attributeConstraints: { resource: { type: "string", description: "Identifier of the protected resource or information entity (e.g. 'customer.pii' or '/api/patients/{id}') to which the need-to-know restriction applies; always set it to the same name used by the corresponding SecureResource or InformationEntity." }, objective: { type: "string", description: "A free-text statement of the business or operational purpose that justifies access. This is a purpose declaration string, not a reference to another node." }, message: { type: "string", description: "Human-readable denial text returned or logged when an actor's stated purpose does not satisfy the objective or when a required justification is missing." }, justificationRequired: { type: "boolean", description: "When true, the actor must supply an explicit purpose or justification before each access is evaluated; set it to false when the purpose is inferred from context such as role or assignment." } }
345
361
  }, NODE_TYPE_SECURITY_PASSWORDPOLICY = {
346
362
  specNodeId: "security.passwordpolicy",
347
363
  layer: "security",
@@ -349,7 +365,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
349
365
  title: "PasswordPolicy",
350
366
  requiredAttributes: ["expiryDays"],
351
367
  optionalAttributes: ["minLength", "maxLength", "requireUppercase", "requireLowercase", "requireNumbers", "requireSpecialChars", "preventReuse", "lockoutAttempts", "lockoutDuration"],
352
- attributeConstraints: { minLength: { type: "integer" }, maxLength: { type: "integer" }, requireUppercase: { type: "boolean" }, requireLowercase: { type: "boolean" }, requireNumbers: { type: "boolean" }, requireSpecialChars: { type: "boolean" }, preventReuse: { type: "integer" }, expiryDays: { type: "integer" }, lockoutAttempts: { type: "integer" }, lockoutDuration: { type: "integer" } }
368
+ attributeConstraints: { minLength: { type: "integer", description: "Minimum number of characters a password must contain; set whenever a lower length bound is enforced (NIST SP 800-63B suggests at least 8, commonly 12+)." }, maxLength: { type: "integer", description: "Maximum number of characters accepted for a password; set only when the system caps length, and leave unset if no cap exists." }, requireUppercase: { type: "boolean", description: "True when a password must contain at least one uppercase letter (A-Z); omit or set false when no such rule is enforced." }, requireLowercase: { type: "boolean", description: "True when a password must contain at least one lowercase letter (a-z); omit or set false when no such rule is enforced." }, requireNumbers: { type: "boolean", description: "True when a password must contain at least one decimal digit (0-9); omit or set false when no such rule is enforced." }, requireSpecialChars: { type: "boolean", description: "True when a password must contain at least one non-alphanumeric symbol; omit or set false when no such rule is enforced." }, preventReuse: { type: "integer", description: "Number of previous passwords per account that a new password may not match; 0 or unset means no history check." }, expiryDays: { type: "integer", description: "Number of days after which a password must be changed; use 0 when passwords never expire by age." }, lockoutAttempts: { type: "integer", description: "Number of consecutive failed authentication attempts that triggers account lockout; leave unset when no lockout is enforced." }, lockoutDuration: { type: "integer", description: "Length of time, in minutes, that an account stays locked after reaching lockoutAttempts; use 0 when unlock requires administrator action." } }
353
369
  }, NODE_TYPE_SECURITY_PERMISSION = {
354
370
  specNodeId: "security.permission",
355
371
  layer: "security",
@@ -357,7 +373,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
357
373
  title: "Permission",
358
374
  requiredAttributes: ["scope", "resource", "action"],
359
375
  optionalAttributes: ["description"],
360
- attributeConstraints: { description: { type: "string" }, scope: { type: "string", enum: ["read-only", "write", "admin", "delegated", "conditional"], description: "Access level granted by this permission, ranging from read-only to full administrative control." }, resource: { type: "string" }, action: { type: "string", enum: ["create", "read", "update", "delete", "execute", "list"], description: "CRUD-plus operation type this permission governs, per NIST SP 800-53 AC-3 Access Enforcement." } }
376
+ attributeConstraints: { description: { type: "string", description: "Human-readable sentence explaining what the grant allows and why it exists; set it whenever the permission identifier alone is not self-explanatory to auditors." }, scope: { type: "string", enum: ["read-only", "write", "admin", "delegated", "conditional"], description: "Access level granted by this permission, ranging from read-only to full administrative control." }, resource: { type: "string", description: "Identifier of the protected resource the action applies to, ideally the 'resource' name of a security.secureresource (e.g. 'orders' or 'billing-api'), or a wildcard pattern such as 'orders/*' when the grant spans a resource family." }, action: { type: "string", enum: ["create", "read", "update", "delete", "execute", "list"], description: "CRUD-plus operation type this permission governs, per NIST SP 800-53 AC-3 Access Enforcement." } }
361
377
  }, NODE_TYPE_SECURITY_POLICYACTION = {
362
378
  specNodeId: "security.policyaction",
363
379
  layer: "security",
@@ -373,7 +389,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
373
389
  title: "PolicyRule",
374
390
  requiredAttributes: ["condition", "effect"],
375
391
  optionalAttributes: ["message", "source"],
376
- attributeConstraints: { condition: { type: "string" }, effect: { type: "string", enum: ["permit", "deny", "indeterminate", "not-applicable"], description: "Policy decision outcome, per XACML 3.0 Rule element effect values." }, message: { type: "string" }, source: { type: "object", description: "Source code reference" } }
392
+ attributeConstraints: { condition: { type: "string", description: 'The predicate expression that must evaluate true for the rule to fire, recorded verbatim in the source policy language or as a normalized boolean expression (e.g. "user.department == resource.owner && time < 18:00"). Always set it; when the rule is composed from AccessCondition nodes, summarize their conjunction here.' }, effect: { type: "string", enum: ["permit", "deny", "indeterminate", "not-applicable"], description: "Policy decision outcome, per XACML 3.0 Rule element effect values." }, message: { type: "string", description: 'A human-readable explanation returned to the caller or written to logs when the rule fires, typically the denial reason (e.g. "Only owners may delete reports"). Set it when the code or policy emits a specific message for this rule.' }, source: { type: "object", description: "Source code reference" } }
377
393
  }, NODE_TYPE_SECURITY_RESOURCEOPERATION = {
378
394
  specNodeId: "security.resourceoperation",
379
395
  layer: "security",
@@ -381,7 +397,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
381
397
  title: "ResourceOperation",
382
398
  requiredAttributes: ["operation"],
383
399
  optionalAttributes: ["description", "conditions", "rateLimit", "audit"],
384
- attributeConstraints: { operation: { type: "string", enum: ["create", "read", "update", "delete", "list", "execute", "approve", "share", "export", "import"], description: "Permitted operation type on the secured resource." }, description: { type: "string" }, conditions: { type: "array", description: "References AccessCondition nodes that must be satisfied before this operation is authorized." }, rateLimit: { type: "array", description: "References RateLimit nodes (api.ratelimit) applied to this operation." }, audit: { type: "array", description: "References AuditConfig nodes specifying how this operation is logged for accountability." } }
400
+ attributeConstraints: { operation: { type: "string", enum: ["create", "read", "update", "delete", "list", "execute", "approve", "share", "export", "import"], description: "Permitted operation type on the secured resource." }, description: { type: "string", description: "Free-text explanation of what invoking this operation does to the resource and any business significance (e.g. 'Approves a pending invoice for payment'); set it when the operation verb alone does not make the effect or the sensitivity clear." }, conditions: { type: "array", description: "References AccessCondition nodes that must be satisfied before this operation is authorized." }, rateLimit: { type: "array", description: "References RateLimit nodes (api.ratelimit) applied to this operation." }, audit: { type: "array", description: "References AuditConfig nodes specifying how this operation is logged for accountability." } }
385
401
  }, NODE_TYPE_SECURITY_RETENTIONPOLICY = {
386
402
  specNodeId: "security.retentionpolicy",
387
403
  layer: "security",
@@ -389,7 +405,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
389
405
  title: "RetentionPolicy",
390
406
  requiredAttributes: ["period"],
391
407
  optionalAttributes: ["destination", "deletionMethod", "description"],
392
- attributeConstraints: { period: { type: "string" }, destination: { type: "string", enum: ["siem", "database", "file", "cloud", "stream", "archive"], description: "Storage or forwarding target for retained security data, per NIST SP 800-53 AU-9 Protection of Audit Information." }, deletionMethod: { type: "string", enum: ["secure-erase", "crypto-shred", "overwrite", "logical-delete", "archive"], description: "Secure disposal technique applied when data reaches end of retention period, per NIST SP 800-88 Guidelines for Media Sanitization." }, description: { type: "string" } }
408
+ attributeConstraints: { period: { type: "string", description: "Minimum duration for which the governed data must be retained before disposal, expressed as an ISO 8601 duration (e.g. 'P90D', 'P7Y'); always set it, using the longest applicable regulatory or contractual requirement." }, destination: { type: "string", enum: ["siem", "database", "file", "cloud", "stream", "archive"], description: "Storage or forwarding target for retained security data, per NIST SP 800-53 AU-9 Protection of Audit Information." }, deletionMethod: { type: "string", enum: ["secure-erase", "crypto-shred", "overwrite", "logical-delete", "archive"], description: "Secure disposal technique applied when data reaches end of retention period, per NIST SP 800-88 Guidelines for Media Sanitization." }, description: { type: "string", description: "Free-text summary of which security data this policy covers and the regulation or internal mandate that justifies the period (e.g. 'SOX audit trail, 7 years'); set it whenever the period or scope is not self-evident." } }
393
409
  }, NODE_TYPE_SECURITY_ROLE = {
394
410
  specNodeId: "security.role",
395
411
  layer: "security",
@@ -397,7 +413,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
397
413
  title: "Role",
398
414
  requiredAttributes: ["displayName", "level", "inheritsFrom"],
399
415
  optionalAttributes: ["description"],
400
- attributeConstraints: { displayName: { type: "string" }, description: { type: "string" }, level: { type: "integer" }, inheritsFrom: { type: "string", description: "Name of the parent role this role inherits permissions from. Supports single inheritance; the child accumulates all permissions of the referenced role in addition to its own." } }
416
+ attributeConstraints: { displayName: { type: "string", description: "Human-readable label for the role as shown in admin UIs or documentation (e.g. 'Billing Administrator'). Set it whenever the machine name differs from what users see." }, description: { type: "string", description: "Free-text statement of the role's intended responsibilities and the kind of actor expected to hold it. Set it when the purpose is not obvious from the name." }, level: { type: "integer", description: "Integer privilege tier used for least-privilege comparison, where higher values denote broader privilege by convention. Set it consistently across all roles in the same SecurityModel." }, inheritsFrom: { type: "string", description: "Name of the parent role this role inherits permissions from. Supports single inheritance; the child accumulates all permissions of the referenced role in addition to its own." } }
401
417
  }, NODE_TYPE_SECURITY_SECURERESOURCE = {
402
418
  specNodeId: "security.secureresource",
403
419
  layer: "security",
@@ -405,7 +421,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
405
421
  title: "SecureResource",
406
422
  requiredAttributes: ["resource", "type"],
407
423
  optionalAttributes: ["description"],
408
- attributeConstraints: { resource: { type: "string" }, type: { type: "string", enum: ["api", "database", "file", "service", "ui", "stream"], description: "Category of protected resource, used to apply appropriate access control and audit policies per NIST SP 800-53 AC-3." }, description: { type: "string" } }
424
+ attributeConstraints: { resource: { type: "string", description: "Canonical identifier of the protected object as used in authorization checks \u2014 e.g. an API path pattern ('/api/orders/*'), table name, bucket URI or permission-string resource key; set it to the exact value enforcement code matches against." }, type: { type: "string", enum: ["api", "database", "file", "service", "ui", "stream"], description: "Category of protected resource, used to apply appropriate access control and audit policies per NIST SP 800-53 AC-3." }, description: { type: "string", description: "Free-text explanation of what the resource contains or exposes and why it requires protection; set it when the identifier alone does not convey sensitivity or scope." } }
409
425
  }, NODE_TYPE_SECURITY_SECURITYCONSTRAINTS = {
410
426
  specNodeId: "security.securityconstraints",
411
427
  layer: "security",
@@ -413,7 +429,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
413
429
  title: "SecurityConstraints",
414
430
  requiredAttributes: [],
415
431
  optionalAttributes: ["version"],
416
- attributeConstraints: { version: { type: "string" } }
432
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this constraint set (e.g. semantic version '1.2.0' or a dated revision), set when the grouped duty and need-to-know rules are versioned independently of the enclosing SecurityModel." } }
417
433
  }, NODE_TYPE_SECURITY_SECURITYMODEL = {
418
434
  specNodeId: "security.securitymodel",
419
435
  layer: "security",
@@ -421,7 +437,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
421
437
  title: "SecurityModel",
422
438
  requiredAttributes: ["version", "application"],
423
439
  optionalAttributes: ["accessControlModel"],
424
- attributeConstraints: { version: { type: "string" }, application: { type: "string", description: "Name or identifier of the application this security model governs. Used to scope the security posture to a single application or bounded context." }, accessControlModel: { type: "string", enum: ["dac", "mac", "rbac", "abac", "rebac"], description: "Access control paradigm in use: DAC (discretionary), MAC (mandatory), RBAC (role-based), ABAC (attribute-based), ReBAC (relationship-based). Per NIST SP 800-162 and SP 800-207." } }
440
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this security specification, as a semantic version or date string such as '2.1.0' or '2024-06'. Increment it when the composed roles, policies, constraints or threat model change, so that audits can reference a specific posture." }, application: { type: "string", description: "Name or identifier of the application this security model governs. Used to scope the security posture to a single application or bounded context." }, accessControlModel: { type: "string", enum: ["dac", "mac", "rbac", "abac", "rebac"], description: "Access control paradigm in use: DAC (discretionary), MAC (mandatory), RBAC (role-based), ABAC (attribute-based), ReBAC (relationship-based). Per NIST SP 800-162 and SP 800-207." } }
425
441
  }, NODE_TYPE_SECURITY_SECURITYPOLICY = {
426
442
  specNodeId: "security.securitypolicy",
427
443
  layer: "security",
@@ -429,7 +445,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
429
445
  title: "SecurityPolicy",
430
446
  requiredAttributes: ["priority", "target"],
431
447
  optionalAttributes: ["description", "enabled", "requirementLevel", "source"],
432
- attributeConstraints: { description: { type: "string" }, enabled: { type: "boolean" }, priority: { type: "integer" }, target: { type: "string", enum: ["endpoint", "service", "data", "user", "role", "resource"], description: "The category of entity this policy governs, aligned with XACML target element semantics." }, requirementLevel: { type: "string", enum: ["mandatory", "recommended", "optional", "conditional"], description: "Compliance obligation of this policy, indicating whether enforcement is required by regulation, recommended best practice, or situationally applicable." }, source: { type: "object", description: "Source code reference" } }
448
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of the policy's intent and the access decisions it governs; set it whenever the policy name alone does not convey its purpose." }, enabled: { type: "boolean", description: "Boolean indicating whether the policy is currently active in evaluation; set it to false for policies that are defined but switched off, and omit it or set it to true otherwise." }, priority: { type: "integer", description: "Integer evaluation rank used to order policies against the same target, with higher values evaluated first and taking precedence when multiple policies match; always set it, using distinct values where order matters." }, target: { type: "string", enum: ["endpoint", "service", "data", "user", "role", "resource"], description: "The category of entity this policy governs, aligned with XACML target element semantics." }, requirementLevel: { type: "string", enum: ["mandatory", "recommended", "optional", "conditional"], description: "Compliance obligation of this policy, indicating whether enforcement is required by regulation, recommended best practice, or situationally applicable." }, source: { type: "object", description: "Source code reference" } }
433
449
  }, NODE_TYPE_SECURITY_SEPARATIONOFDUTY = {
434
450
  specNodeId: "security.separationofduty",
435
451
  layer: "security",
@@ -437,7 +453,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
437
453
  title: "SeparationOfDuty",
438
454
  requiredAttributes: ["message"],
439
455
  optionalAttributes: ["description", "mutuallyExclusive"],
440
- attributeConstraints: { description: { type: "string" }, message: { type: "string" }, mutuallyExclusive: { type: "boolean", description: "When true, the roles in this constraint cannot be held simultaneously by the same subject. Enforces strict role exclusivity within the separation of duty rule." } }
456
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of which tasks or roles are separated and the risk being controlled (e.g., 'Invoice creators may not approve invoices they created'); set whenever the rule's intent is not obvious from its name." }, message: { type: "string", description: "Human-readable violation text returned to the user or written to logs when the constraint blocks an assignment or action (e.g., 'You cannot approve a request you submitted')." }, mutuallyExclusive: { type: "boolean", description: "When true, the roles in this constraint cannot be held simultaneously by the same subject. Enforces strict role exclusivity within the separation of duty rule." } }
441
457
  }, NODE_TYPE_SECURITY_THREAT = {
442
458
  specNodeId: "security.threat",
443
459
  layer: "security",
@@ -445,7 +461,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
445
461
  title: "Threat",
446
462
  requiredAttributes: ["threatens", "likelihood", "impact"],
447
463
  optionalAttributes: ["description", "criticality", "source"],
448
- attributeConstraints: { description: { type: "string" }, threatens: { type: "string" }, likelihood: { type: "string", enum: ["low", "moderate", "high"], description: "Probability the threat will be exploited, per NIST SP 800-30 Table E-2." }, impact: { type: "string", enum: ["low", "moderate", "high"], description: "Potential adverse impact if the threat is realized, per NIST FIPS 199." }, criticality: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Combined severity rating reflecting both likelihood and impact for prioritization." }, source: { type: "object", description: "Source code reference" } }
464
+ attributeConstraints: { description: { type: "string", description: "Free-text narrative of the threat scenario: attack vector, preconditions and the adverse outcome, optionally citing CWE/CAPEC/STRIDE identifiers; set whenever the name alone does not make the attack clear." }, threatens: { type: "string", description: "Identifier or name of the primary asset the threat endangers, such as a SecureResource, InformationEntity, business service or process; set to the most critical target when several apply." }, likelihood: { type: "string", enum: ["low", "moderate", "high"], description: "Probability the threat will be exploited, per NIST SP 800-30 Table E-2." }, impact: { type: "string", enum: ["low", "moderate", "high"], description: "Potential adverse impact if the threat is realized, per NIST FIPS 199." }, criticality: { type: "string", enum: ["low", "medium", "high", "critical"], description: "Combined severity rating reflecting both likelihood and impact for prioritization." }, source: { type: "object", description: "Source code reference" } }
449
465
  }, NODE_TYPE_SECURITY_VALIDATIONRULE = {
450
466
  specNodeId: "security.validationrule",
451
467
  layer: "security",
@@ -461,7 +477,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
461
477
  title: "ApplicationCollaboration",
462
478
  requiredAttributes: [],
463
479
  optionalAttributes: ["documentation", "properties"],
464
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
480
+ attributeConstraints: { documentation: { type: "string", description: "A free-text description of the collaboration that names its participating components and the joint purpose they serve. Set it whenever the element name alone does not make membership or purpose clear." }, properties: { type: "object", description: "Cross-layer properties" } }
465
481
  }, NODE_TYPE_APPLICATION_APPLICATIONCOMPONENT = {
466
482
  specNodeId: "application.applicationcomponent",
467
483
  layer: "application",
@@ -469,7 +485,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
469
485
  title: "ApplicationComponent",
470
486
  requiredAttributes: ["type"],
471
487
  optionalAttributes: ["documentation", "properties"],
472
- attributeConstraints: { documentation: { type: "string" }, type: { type: "string", enum: ["generic", "external", "internal", "service-component"], description: "Classification of the application component kind." }, properties: { type: "object", description: "Cross-layer properties" } }
488
+ attributeConstraints: { documentation: { type: "string", description: "Free-text narrative describing the component's responsibility, boundaries, and notable dependencies. Set it whenever the component's name alone does not convey what it owns or why it exists." }, type: { type: "string", enum: ["generic", "external", "internal", "service-component"], description: "Classification of the application component kind." }, properties: { type: "object", description: "Cross-layer properties" } }
473
489
  }, NODE_TYPE_APPLICATION_APPLICATIONEVENT = {
474
490
  specNodeId: "application.applicationevent",
475
491
  layer: "application",
@@ -477,7 +493,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
477
493
  title: "ApplicationEvent",
478
494
  requiredAttributes: ["eventType"],
479
495
  optionalAttributes: ["documentation", "properties"],
480
- attributeConstraints: { documentation: { type: "string" }, eventType: { type: "string", enum: ["domain", "integration", "system"], description: "Classification of the application event: domain (business logic), integration (cross-system), or system (infrastructure/runtime)." }, properties: { type: "object", description: "Cross-layer properties" } }
496
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the event: what state change it signals, which component emits it, its typical consumers and any delivery guarantees. Set it whenever the event name alone does not make these clear." }, eventType: { type: "string", enum: ["domain", "integration", "system"], description: "Classification of the application event: domain (business logic), integration (cross-system), or system (infrastructure/runtime)." }, properties: { type: "object", description: "Cross-layer properties" } }
481
497
  }, NODE_TYPE_APPLICATION_APPLICATIONFUNCTION = {
482
498
  specNodeId: "application.applicationfunction",
483
499
  layer: "application",
@@ -485,7 +501,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
485
501
  title: "ApplicationFunction",
486
502
  requiredAttributes: [],
487
503
  optionalAttributes: ["documentation", "properties"],
488
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
504
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of what the function computes or manages, its inputs and outputs, and the owning component; set it whenever the name alone does not make the behavior's scope clear." }, properties: { type: "object", description: "Cross-layer properties" } }
489
505
  }, NODE_TYPE_APPLICATION_APPLICATIONINTERACTION = {
490
506
  specNodeId: "application.applicationinteraction",
491
507
  layer: "application",
@@ -493,7 +509,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
493
509
  title: "ApplicationInteraction",
494
510
  requiredAttributes: ["pattern"],
495
511
  optionalAttributes: ["documentation"],
496
- attributeConstraints: { documentation: { type: "string" }, pattern: { type: "string", enum: ["request-reply", "publish-subscribe", "event-driven", "fire-and-forget"], description: "Interaction pattern used by this application collaboration." } }
512
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the joint behaviour, naming the participating components, the exchange it accomplishes and its trigger. Set it whenever the participants or flow are not evident from the element name." }, pattern: { type: "string", enum: ["request-reply", "publish-subscribe", "event-driven", "fire-and-forget"], description: "Interaction pattern used by this application collaboration." } }
497
513
  }, NODE_TYPE_APPLICATION_APPLICATIONINTERFACE = {
498
514
  specNodeId: "application.applicationinterface",
499
515
  layer: "application",
@@ -501,7 +517,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
501
517
  title: "ApplicationInterface",
502
518
  requiredAttributes: ["protocol"],
503
519
  optionalAttributes: ["documentation", "properties"],
504
- attributeConstraints: { documentation: { type: "string" }, protocol: { type: "string", enum: ["HTTP", "HTTPS", "gRPC", "AMQP", "WebSocket", "REST", "GraphQL", "SOAP"], description: "Application-level communication protocol used to expose the service. Use application-level protocols only; network/transport-level protocols (TCP, TLS) belong in the Technology Layer." }, properties: { type: "object", description: "Cross-layer properties" } }
520
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the access point: which component provides it, its base path, address or channel name, the services reachable through it, and any notable constraints. Set it whenever the name and protocol alone do not identify the endpoint." }, protocol: { type: "string", enum: ["HTTP", "HTTPS", "gRPC", "AMQP", "WebSocket", "REST", "GraphQL", "SOAP"], description: "Application-level communication protocol used to expose the service. Use application-level protocols only; network/transport-level protocols (TCP, TLS) belong in the Technology Layer." }, properties: { type: "object", description: "Cross-layer properties" } }
505
521
  }, NODE_TYPE_APPLICATION_APPLICATIONPROCESS = {
506
522
  specNodeId: "application.applicationprocess",
507
523
  layer: "application",
@@ -509,7 +525,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
509
525
  title: "ApplicationProcess",
510
526
  requiredAttributes: [],
511
527
  optionalAttributes: ["documentation", "properties"],
512
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
528
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the process: its triggering event, its ordered main steps, and the result it produces. Set it whenever the step sequence is not evident from the element name, preferably drawn from code comments or workflow docs." }, properties: { type: "object", description: "Cross-layer properties" } }
513
529
  }, NODE_TYPE_APPLICATION_APPLICATIONSERVICE = {
514
530
  specNodeId: "application.applicationservice",
515
531
  layer: "application",
@@ -517,7 +533,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
517
533
  title: "ApplicationService",
518
534
  requiredAttributes: ["serviceType"],
519
535
  optionalAttributes: ["documentation", "properties"],
520
- attributeConstraints: { documentation: { type: "string" }, serviceType: { type: "string", enum: ["synchronous", "asynchronous", "event-driven", "batch"], description: "Classification of how the service exposes its functionality to consumers." }, properties: { type: "object", description: "Cross-layer properties" } }
536
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of what the service offers to its consumers, including its main operations and intended callers; set it whenever the service name alone does not convey its scope." }, serviceType: { type: "string", enum: ["synchronous", "asynchronous", "event-driven", "batch"], description: "Classification of how the service exposes its functionality to consumers." }, properties: { type: "object", description: "Cross-layer properties" } }
521
537
  }, NODE_TYPE_APPLICATION_DATAOBJECT = {
522
538
  specNodeId: "application.dataobject",
523
539
  layer: "application",
@@ -525,7 +541,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
525
541
  title: "DataObject",
526
542
  requiredAttributes: [],
527
543
  optionalAttributes: ["documentation", "properties"],
528
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" } }
544
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of what information the data object holds, its main fields and which components produce or consume it; set it whenever the symbol name alone does not convey the data's meaning." }, properties: { type: "object", description: "Cross-layer properties" } }
529
545
  }, NODE_TYPE_TECHNOLOGY_ARTIFACT = {
530
546
  specNodeId: "technology.artifact",
531
547
  layer: "technology",
@@ -533,7 +549,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
533
549
  title: "Artifact",
534
550
  requiredAttributes: ["artifactType"],
535
551
  optionalAttributes: ["documentation", "properties", "source"],
536
- attributeConstraints: { documentation: { type: "string" }, artifactType: { type: "string", enum: ["file", "container-image", "archive", "library", "script", "configuration"], description: "Data artifact category, per ArchiMate 3.2 Artifact element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
552
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of what the artifact contains, how it is produced (build step or source), and where it is stored or deployed. Set it whenever the name and artifactType alone do not identify the artifact's purpose." }, artifactType: { type: "string", enum: ["file", "container-image", "archive", "library", "script", "configuration"], description: "Data artifact category, per ArchiMate 3.2 Artifact element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
537
553
  }, NODE_TYPE_TECHNOLOGY_COMMUNICATIONNETWORK = {
538
554
  specNodeId: "technology.communicationnetwork",
539
555
  layer: "technology",
@@ -541,7 +557,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
541
557
  title: "CommunicationNetwork",
542
558
  requiredAttributes: ["networkType"],
543
559
  optionalAttributes: ["documentation", "properties", "source"],
544
- attributeConstraints: { documentation: { type: "string" }, networkType: { type: "string", enum: ["lan", "wan", "vpn", "wireless", "internet", "intranet"], description: "Topology and scope classification of the network, per ArchiMate 3.2 CommunicationNetwork element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
560
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the network's purpose, scope and address range (e.g. 'private VPC 10.0.0.0/16 for production workloads'); set it whenever the name alone does not convey which hosts attach to the network or what traffic it carries." }, networkType: { type: "string", enum: ["lan", "wan", "vpn", "wireless", "internet", "intranet"], description: "Topology and scope classification of the network, per ArchiMate 3.2 CommunicationNetwork element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
545
561
  }, NODE_TYPE_TECHNOLOGY_DEVICE = {
546
562
  specNodeId: "technology.device",
547
563
  layer: "technology",
@@ -549,7 +565,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
549
565
  title: "Device",
550
566
  requiredAttributes: ["deviceType"],
551
567
  optionalAttributes: ["documentation", "properties", "source"],
552
- attributeConstraints: { documentation: { type: "string" }, deviceType: { type: "string", enum: ["server", "workstation", "network-device", "storage", "mobile", "embedded"], description: "Physical hardware category of the device, per ArchiMate 3.2 Technology Layer device classification." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
568
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the physical device: its make and model, location or role, and any hardware constraints relevant to deployment. Set it whenever the identifier alone does not make clear which hardware is meant." }, deviceType: { type: "string", enum: ["server", "workstation", "network-device", "storage", "mobile", "embedded"], description: "Physical hardware category of the device, per ArchiMate 3.2 Technology Layer device classification." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
553
569
  }, NODE_TYPE_TECHNOLOGY_NODE = {
554
570
  specNodeId: "technology.node",
555
571
  layer: "technology",
@@ -557,7 +573,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
557
573
  title: "Node",
558
574
  requiredAttributes: ["nodeType"],
559
575
  optionalAttributes: ["documentation", "properties", "source"],
560
- attributeConstraints: { documentation: { type: "string" }, nodeType: { type: "string", enum: ["physical-server", "virtual-machine", "container", "kubernetes-cluster", "bare-metal"], description: "Computational resource category of the node, per ArchiMate 3.2 Node element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
576
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the node: what it hosts, its environment (e.g. production, staging), and notable sizing or provisioning details. Set it whenever the name and nodeType alone do not identify the host's purpose." }, nodeType: { type: "string", enum: ["physical-server", "virtual-machine", "container", "kubernetes-cluster", "bare-metal"], description: "Computational resource category of the node, per ArchiMate 3.2 Node element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
561
577
  }, NODE_TYPE_TECHNOLOGY_PATH = {
562
578
  specNodeId: "technology.path",
563
579
  layer: "technology",
@@ -565,7 +581,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
565
581
  title: "Path",
566
582
  requiredAttributes: ["pathType"],
567
583
  optionalAttributes: ["documentation", "protocol", "properties"],
568
- attributeConstraints: { documentation: { type: "string" }, pathType: { type: "string", enum: ["point-to-point", "multicast", "broadcast", "bidirectional"], description: "Transmission topology of the path, per ArchiMate 3.2 Path element." }, protocol: { type: "string", enum: ["http", "https", "grpc", "amqp", "mqtt", "tcp", "udp", "websocket"], description: "Communication protocol carried by this path." }, properties: { type: "object", description: "Cross-layer properties" } }
584
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the path naming its endpoints, the direction and purpose of the data flow, and any notable constraints such as ports, encryption or latency; set whenever the endpoints or purpose are not obvious from the name." }, pathType: { type: "string", enum: ["point-to-point", "multicast", "broadcast", "bidirectional"], description: "Transmission topology of the path, per ArchiMate 3.2 Path element." }, protocol: { type: "string", enum: ["http", "https", "grpc", "amqp", "mqtt", "tcp", "udp", "websocket"], description: "Communication protocol carried by this path." }, properties: { type: "object", description: "Cross-layer properties" } }
569
585
  }, NODE_TYPE_TECHNOLOGY_SYSTEMSOFTWARE = {
570
586
  specNodeId: "technology.systemsoftware",
571
587
  layer: "technology",
@@ -573,7 +589,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
573
589
  title: "SystemSoftware",
574
590
  requiredAttributes: ["softwareType"],
575
591
  optionalAttributes: ["documentation", "properties", "source"],
576
- attributeConstraints: { documentation: { type: "string" }, softwareType: { type: "string", enum: ["operating-system", "container-runtime", "middleware", "dbms", "message-broker", "cache"], description: "Platform software category, per ArchiMate 3.2 SystemSoftware element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
592
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the software product: its name, version or edition, and its role in the deployment. Set it whenever the product, version or notable configuration choices (e.g. clustering mode, persistence settings) are not evident from the element name." }, softwareType: { type: "string", enum: ["operating-system", "container-runtime", "middleware", "dbms", "message-broker", "cache"], description: "Platform software category, per ArchiMate 3.2 SystemSoftware element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
577
593
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYCOLLABORATION = {
578
594
  specNodeId: "technology.technologycollaboration",
579
595
  layer: "technology",
@@ -581,7 +597,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
581
597
  title: "TechnologyCollaboration",
582
598
  requiredAttributes: [],
583
599
  optionalAttributes: ["documentation", "properties", "source"],
584
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
600
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description naming the collaborating members, how they coordinate (replication, consensus, sharding, sidecar proxying) and the collective behavior they provide. Set it whenever membership or coordination is not evident from the element name." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
585
601
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYEVENT = {
586
602
  specNodeId: "technology.technologyevent",
587
603
  layer: "technology",
@@ -589,7 +605,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
589
605
  title: "TechnologyEvent",
590
606
  requiredAttributes: ["eventType"],
591
607
  optionalAttributes: ["documentation", "properties", "source"],
592
- attributeConstraints: { documentation: { type: "string" }, eventType: { type: "string", enum: ["failure", "alert", "scheduled", "threshold-breach", "deployment"], description: "Technology state change category, per ArchiMate 3.2 Technology Event element; aligned with OpenTelemetry event semantics." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
608
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the state change: the condition that raises the event, its emitting source, and what it triggers. Set it whenever the event name alone does not make the trigger condition clear." }, eventType: { type: "string", enum: ["failure", "alert", "scheduled", "threshold-breach", "deployment"], description: "Technology state change category, per ArchiMate 3.2 Technology Event element; aligned with OpenTelemetry event semantics." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
593
609
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYFUNCTION = {
594
610
  specNodeId: "technology.technologyfunction",
595
611
  layer: "technology",
@@ -597,7 +613,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
597
613
  title: "TechnologyFunction",
598
614
  requiredAttributes: [],
599
615
  optionalAttributes: ["documentation", "properties", "source"],
600
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
616
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of what the function does, which node or system software performs it, and its triggering or operating conditions; set whenever the name alone does not make the capability's scope clear." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
601
617
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYINTERACTION = {
602
618
  specNodeId: "technology.technologyinteraction",
603
619
  layer: "technology",
@@ -605,7 +621,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
605
621
  title: "TechnologyInteraction",
606
622
  requiredAttributes: [],
607
623
  optionalAttributes: ["documentation", "properties", "source"],
608
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
624
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the joint behavior: the participating elements, the coordination protocol or algorithm used (e.g. Raft, 2PC, gossip), and the outcome. Set it whenever the participants or protocol cannot be inferred from the element name." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
609
625
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYINTERFACE = {
610
626
  specNodeId: "technology.technologyinterface",
611
627
  layer: "technology",
@@ -613,7 +629,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
613
629
  title: "TechnologyInterface",
614
630
  requiredAttributes: ["protocol"],
615
631
  optionalAttributes: ["documentation", "properties", "source"],
616
- attributeConstraints: { documentation: { type: "string" }, protocol: { type: "string", enum: ["http", "https", "grpc", "amqp", "mqtt", "tcp", "udp", "websocket"], description: "Communication protocol exposed at this interface, per ArchiMate 3.2 TechnologyInterface element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
632
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the endpoint, including its address or port, authentication or TLS requirements, and which service it exposes. Set it whenever these facts are not captured by other attributes." }, protocol: { type: "string", enum: ["http", "https", "grpc", "amqp", "mqtt", "tcp", "udp", "websocket"], description: "Communication protocol exposed at this interface, per ArchiMate 3.2 TechnologyInterface element." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
617
633
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYPROCESS = {
618
634
  specNodeId: "technology.technologyprocess",
619
635
  layer: "technology",
@@ -621,7 +637,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
621
637
  title: "TechnologyProcess",
622
638
  requiredAttributes: [],
623
639
  optionalAttributes: ["documentation", "properties", "source"],
624
- attributeConstraints: { documentation: { type: "string" }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
640
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the process's purpose, its trigger, its main ordered steps and its end result; set it whenever the pipeline or job name alone does not convey what it achieves." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
625
641
  }, NODE_TYPE_TECHNOLOGY_TECHNOLOGYSERVICE = {
626
642
  specNodeId: "technology.technologyservice",
627
643
  layer: "technology",
@@ -629,7 +645,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
629
645
  title: "TechnologyService",
630
646
  requiredAttributes: ["serviceType"],
631
647
  optionalAttributes: ["documentation", "properties", "source"],
632
- attributeConstraints: { documentation: { type: "string" }, serviceType: { type: "string", enum: ["compute", "storage", "messaging", "database", "cache", "identity", "monitoring"], description: "Infrastructure service category, aligned with cloud provider service classifications (IaaS/PaaS/SaaS) per ArchiMate 3.2 TechnologyService." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
648
+ attributeConstraints: { documentation: { type: "string", description: "Free-text description of the capability the service offers, its provider (self-hosted or managed vendor), and its consumers; set it whenever the name alone does not make the capability and provider clear." }, serviceType: { type: "string", enum: ["compute", "storage", "messaging", "database", "cache", "identity", "monitoring"], description: "Infrastructure service category, aligned with cloud provider service classifications (IaaS/PaaS/SaaS) per ArchiMate 3.2 TechnologyService." }, properties: { type: "object", description: "Cross-layer properties" }, source: { type: "object", description: "Source code reference" } }
633
649
  }, NODE_TYPE_API_CALLBACK = {
634
650
  specNodeId: "api.callback",
635
651
  layer: "api",
@@ -653,7 +669,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
653
669
  title: "Contact",
654
670
  requiredAttributes: [],
655
671
  optionalAttributes: ["url", "email"],
656
- attributeConstraints: { url: { type: "string" }, email: { type: "string" } }
672
+ attributeConstraints: { url: { type: "string", description: "Absolute URL of the maintainer's support or contact page, e.g. https://example.com/support. Set it when consumers should reach the owner through a web page rather than, or as well as, by email." }, email: { type: "string", description: "Email address of the contact person or team, in RFC 5322 mailbox format, e.g. api-team@example.com. Set it when there is a monitored mailbox for API support or questions." } }
657
673
  }, NODE_TYPE_API_ENCODING = {
658
674
  specNodeId: "api.encoding",
659
675
  layer: "api",
@@ -661,7 +677,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
661
677
  title: "Encoding",
662
678
  requiredAttributes: [],
663
679
  optionalAttributes: ["propertyName", "contentType", "style", "explode", "allowReserved"],
664
- attributeConstraints: { propertyName: { type: "string" }, contentType: { type: "string" }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the encoding (only applicable to multipart/form-data and application/x-www-form-urlencoded)" }, explode: { type: "boolean" }, allowReserved: { type: "boolean", description: "Allows reserved characters in field values without percent-encoding. Only applies when style is 'form' and the content type is 'application/x-www-form-urlencoded'." } }
680
+ attributeConstraints: { propertyName: { type: "string", description: "Name of the top-level property in the MediaType's schema that this rule applies to (the map key in MediaType.encoding); it must match an existing schema property name exactly and should always be set." }, contentType: { type: "string", description: "MIME type, or comma-separated list of MIME types or wildcards such as 'image/png, image/jpeg', for this part; set it only to override the default (application/octet-stream for binary strings, text/plain for primitives, application/json for objects)." }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the encoding (only applicable to multipart/form-data and application/x-www-form-urlencoded)" }, explode: { type: "boolean", description: "Boolean; when true, array or object values of this property are emitted as separate key=value pairs; defaults to true when style is 'form' and false otherwise, and is ignored unless the body is application/x-www-form-urlencoded." }, allowReserved: { type: "boolean", description: "Allows reserved characters in field values without percent-encoding. Only applies when style is 'form' and the content type is 'application/x-www-form-urlencoded'." } }
665
681
  }, NODE_TYPE_API_EXAMPLE = {
666
682
  specNodeId: "api.example",
667
683
  layer: "api",
@@ -669,7 +685,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
669
685
  title: "Example",
670
686
  requiredAttributes: [],
671
687
  optionalAttributes: ["summary", "description", "value", "externalValue"],
672
- attributeConstraints: { summary: { type: "string" }, description: { type: "string" }, value: { type: "string", description: "Inline example value. Mutually exclusive with externalValue \u2014 only one may be set per Example." }, externalValue: { type: "string", description: "URL pointing to an external example. Mutually exclusive with value \u2014 only one may be set per Example." } }
688
+ attributeConstraints: { summary: { type: "string", description: "Short plain-text label for the example, typically shown as its title in documentation tools; set it whenever several examples sit side by side so readers can tell them apart." }, description: { type: "string", description: "Longer explanation of the scenario the example illustrates, written in CommonMark per OpenAPI 3.0; set it when the value's purpose or preconditions are not obvious from the summary." }, value: { type: "string", description: "Inline example value. Mutually exclusive with externalValue \u2014 only one may be set per Example." }, externalValue: { type: "string", description: "URL pointing to an external example. Mutually exclusive with value \u2014 only one may be set per Example." } }
673
689
  }, NODE_TYPE_API_EXTERNALDOCUMENTATION = {
674
690
  specNodeId: "api.externaldocumentation",
675
691
  layer: "api",
@@ -677,7 +693,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
677
693
  title: "ExternalDocumentation",
678
694
  requiredAttributes: ["url"],
679
695
  optionalAttributes: ["description"],
680
- attributeConstraints: { description: { type: "string" }, url: { type: "string" } }
696
+ attributeConstraints: { description: { type: "string", description: "Short CommonMark-capable text describing what the linked documentation covers; set it when the URL alone does not make the target's purpose clear." }, url: { type: "string", description: "Absolute URL of the external documentation resource (e.g. https://docs.example.com/guide), always required." } }
681
697
  }, NODE_TYPE_API_HEADER = {
682
698
  specNodeId: "api.header",
683
699
  layer: "api",
@@ -685,7 +701,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
685
701
  title: "Header",
686
702
  requiredAttributes: [],
687
703
  optionalAttributes: ["description", "required", "deprecated", "schema", "style", "explode", "allowEmptyValue", "allowReserved", "example", "examples"],
688
- attributeConstraints: { description: { type: "string" }, required: { type: "boolean" }, deprecated: { type: "boolean" }, schema: { type: "object", description: "The schema defining the type and constraints for the header value" }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the header value. Default is 'simple' for header parameters." }, explode: { type: "boolean", description: "When true, array/object values generate separate header instances for each element. Default: false." }, allowEmptyValue: { type: "boolean", description: "Allows the header to be sent with an empty value." }, allowReserved: { type: "boolean", description: "Allows reserved characters in the header value without percent-encoding." }, example: { description: "An example value for the header. Mutually exclusive with 'examples'." }, examples: { type: "object", description: "Map of named Example objects for the header. Mutually exclusive with 'example'." } }
704
+ attributeConstraints: { description: { type: "string", description: "Human-readable explanation of the header's meaning and value format, in CommonMark; set it whenever the header's purpose is not obvious from its name." }, required: { type: "boolean", description: "Boolean stating whether the header is always present in the enclosing response or multipart part. Defaults to false; set true only when the header is guaranteed to be sent." }, deprecated: { type: "boolean", description: "Boolean marking the header as deprecated so consumers stop relying on it. Defaults to false; set true when the header is scheduled for removal." }, schema: { type: "object", description: "The schema defining the type and constraints for the header value" }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the header value. Default is 'simple' for header parameters." }, explode: { type: "boolean", description: "When true, array/object values generate separate header instances for each element. Default: false." }, allowEmptyValue: { type: "boolean", description: "Allows the header to be sent with an empty value." }, allowReserved: { type: "boolean", description: "Allows reserved characters in the header value without percent-encoding." }, example: { description: "An example value for the header. Mutually exclusive with 'examples'." }, examples: { type: "object", description: "Map of named Example objects for the header. Mutually exclusive with 'example'." } }
689
705
  }, NODE_TYPE_API_INFO = {
690
706
  specNodeId: "api.info",
691
707
  layer: "api",
@@ -693,15 +709,15 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
693
709
  title: "Info",
694
710
  requiredAttributes: ["title", "version"],
695
711
  optionalAttributes: ["description", "termsOfService", "contact", "license"],
696
- attributeConstraints: { title: { type: "string" }, description: { type: "string", description: "Supports CommonMark (Markdown) syntax per OpenAPI 3.0." }, version: { type: "string" }, termsOfService: { type: "string" }, contact: { type: "string", description: "Reference to an api.contact node providing maintainer contact details." }, license: { type: "string", description: "Reference to an api.license node specifying the API's license terms." } }
712
+ attributeConstraints: { title: { type: "string", description: "Human-readable name of the API as shown in documentation portals and gateways (e.g. 'Taxonomy Service API'); always set, since OpenAPI 3.0 requires it." }, description: { type: "string", description: "Supports CommonMark (Markdown) syntax per OpenAPI 3.0." }, version: { type: "string", description: "Version string of the API definition document (e.g. '1.4.0' or '2024-05-01'), distinct from the OpenAPI specification version held in OpenAPIDocument.openapi; always set, since OpenAPI 3.0 requires it." }, termsOfService: { type: "string", description: "URL of the API's terms of service, which must be a valid URL per OpenAPI 3.0; set only when the API publishes usage terms." }, contact: { type: "string", description: "Reference to an api.contact node providing maintainer contact details." }, license: { type: "string", description: "Reference to an api.license node specifying the API's license terms." } }
697
713
  }, NODE_TYPE_API_LICENSE = {
698
714
  specNodeId: "api.license",
699
715
  layer: "api",
700
716
  type: "license",
701
717
  title: "License",
702
- requiredAttributes: ["name"],
718
+ requiredAttributes: [],
703
719
  optionalAttributes: ["url"],
704
- attributeConstraints: { url: { type: "string" } }
720
+ attributeConstraints: { url: { type: "string", description: "Absolute URL (OpenAPI 3.0 requires URL format) pointing to the full text of the license; set it whenever the license terms are published at a resolvable location." } }
705
721
  }, NODE_TYPE_API_LINK = {
706
722
  specNodeId: "api.link",
707
723
  layer: "api",
@@ -709,7 +725,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
709
725
  title: "Link",
710
726
  requiredAttributes: [],
711
727
  optionalAttributes: ["operationId", "operationRef", "description", "parameters", "requestBody"],
712
- attributeConstraints: { operationId: { type: "string", description: "The operationId of the target operation within this document. Mutually exclusive with 'operationRef' \u2014 only one may be specified per Link." }, operationRef: { type: "string", description: "A relative or absolute URL reference to an operation. Mutually exclusive with 'operationId' \u2014 only one may be specified per Link." }, description: { type: "string" }, parameters: { type: "object", description: "Map of parameter names to runtime expressions or literal values passed to the linked operation" }, requestBody: { type: "string", description: "Runtime expression or literal value for the linked operation's request body" } }
728
+ attributeConstraints: { operationId: { type: "string", description: "The operationId of the target operation within this document. Mutually exclusive with 'operationRef' \u2014 only one may be specified per Link." }, operationRef: { type: "string", description: "A relative or absolute URL reference to an operation. Mutually exclusive with 'operationId' \u2014 only one may be specified per Link." }, description: { type: "string", description: "Human-readable explanation of the link's purpose and when a client should follow it; CommonMark is allowed, and it should be set whenever the target or parameter mapping is not self-evident." }, parameters: { type: "object", description: "Map of parameter names to runtime expressions or literal values passed to the linked operation" }, requestBody: { type: "string", description: "Runtime expression or literal value for the linked operation's request body" } }
713
729
  }, NODE_TYPE_API_MEDIATYPE = {
714
730
  specNodeId: "api.mediatype",
715
731
  layer: "api",
@@ -717,7 +733,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
717
733
  title: "MediaType",
718
734
  requiredAttributes: ["contentType"],
719
735
  optionalAttributes: ["example"],
720
- attributeConstraints: { contentType: { type: "string" }, example: { type: "string", description: "An inline example value. Mutually exclusive with 'examples' \u2014 only one may be specified per MediaType." } }
736
+ attributeConstraints: { contentType: { type: "string", description: "The media type or media range string that keys this entry in the parent content map, per RFC 6838 (e.g. 'application/json', 'text/*', 'application/vnd.acme+json'); always set it, and keep it unique within the parent's content map." }, example: { type: "string", description: "An inline example value. Mutually exclusive with 'examples' \u2014 only one may be specified per MediaType." } }
721
737
  }, NODE_TYPE_API_OAUTHFLOW = {
722
738
  specNodeId: "api.oauthflow",
723
739
  layer: "api",
@@ -725,7 +741,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
725
741
  title: "OAuthFlow",
726
742
  requiredAttributes: ["scopes"],
727
743
  optionalAttributes: ["authorizationUrl", "tokenUrl", "refreshUrl"],
728
- attributeConstraints: { authorizationUrl: { type: "string" }, tokenUrl: { type: "string" }, refreshUrl: { type: "string" }, scopes: { type: "object", description: "Map of scope name to human-readable description string" } }
744
+ attributeConstraints: { authorizationUrl: { type: "string", description: "Absolute URL of the authorization endpoint where the user grants consent; required for implicit and authorizationCode flows and omitted for password and clientCredentials." }, tokenUrl: { type: "string", description: "Absolute URL of the token endpoint that exchanges a grant or credentials for an access token; required for password, clientCredentials and authorizationCode flows and omitted for implicit." }, refreshUrl: { type: "string", description: "Optional absolute URL of the endpoint used to obtain refreshed access tokens; set only when the provider issues refresh tokens via a distinct endpoint." }, scopes: { type: "object", description: "Map of scope name to human-readable description string" } }
729
745
  }, NODE_TYPE_API_OAUTHFLOWS = {
730
746
  specNodeId: "api.oauthflows",
731
747
  layer: "api",
@@ -741,7 +757,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
741
757
  title: "OpenAPIDocument",
742
758
  requiredAttributes: ["openapi", "info", "paths"],
743
759
  optionalAttributes: ["servers", "components", "security", "tags", "externalDocs"],
744
- attributeConstraints: { openapi: { type: "string" }, info: { type: "string" }, servers: { type: "string" }, paths: { type: "string", description: "Required per OpenAPI 3.0 but may be an empty object ({}) when the document is used solely to define reusable components." }, components: { type: "string" }, security: { type: "string", description: "Defines default security requirements applied to all operations. Individual operations can override or remove it by setting their own 'security' to an empty array ([])." }, tags: { type: "string" }, externalDocs: { type: "string" } }
760
+ attributeConstraints: { openapi: { type: "string", description: "The OpenAPI Specification version the document conforms to, as a semantic version string (e.g. '3.0.3'); always set, and distinct from the API's own version in Info." }, info: { type: "string", description: "Reference to the single api.info node holding the API's title, version and metadata; always set because Info is required." }, servers: { type: "string", description: "Reference to the api.server nodes giving the base URLs where the API is deployed; set when the spec declares root-level servers, otherwise tooling defaults to '/'. This schema stores the reference as a single string." }, paths: { type: "string", description: "Required per OpenAPI 3.0 but may be an empty object ({}) when the document is used solely to define reusable components." }, components: { type: "string", description: "Reference to the api.components node holding reusable schemas, responses, parameters and security schemes; set when the document defines any reusable objects." }, security: { type: "string", description: "Defines default security requirements applied to all operations. Individual operations can override or remove it by setting their own 'security' to an empty array ([])." }, tags: { type: "string", description: "Reference to the root-level api.tag nodes that supply descriptions and external docs for the tag names operations use; set when the spec declares a root tags array. This schema stores the reference as a single string." }, externalDocs: { type: "string", description: "Reference to an api.externaldocumentation node linking to supplementary documentation for the whole API; set only when the spec declares root-level externalDocs." } }
745
761
  }, NODE_TYPE_API_OPERATION = {
746
762
  specNodeId: "api.operation",
747
763
  layer: "api",
@@ -749,7 +765,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
749
765
  title: "Operation",
750
766
  requiredAttributes: ["operationId", "summary", "tags"],
751
767
  optionalAttributes: ["description", "deprecated", "http_method", "http_path"],
752
- attributeConstraints: { operationId: { type: "string", description: "Unique identifier for this operation across the entire API document" }, summary: { type: "string" }, description: { type: "string" }, tags: { type: "string" }, deprecated: { type: "boolean" }, http_method: { type: "string", description: "HTTP method for this operation", enum: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "TRACE"] }, http_path: { type: "string", description: "URL path template for this operation (e.g. '/api/taxonomies/{id}')", pattern: "^/" } }
768
+ attributeConstraints: { operationId: { type: "string", description: "Unique identifier for this operation across the entire API document" }, summary: { type: "string", description: "A short plain-text phrase, ideally under 120 characters, stating what the operation does; set it from the handler's docstring or the OpenAPI summary field." }, description: { type: "string", description: "A longer explanation of the operation's behaviour, side effects and constraints, which may use CommonMark; set it when the summary is insufficient to understand the contract." }, tags: { type: "string", description: "Tag name used to group this operation in documentation, typically the resource or controller name; it should match an api.tag element where one is declared. This schema stores the value as a single string although OpenAPI allows a list." }, deprecated: { type: "boolean", description: "Set to true when the operation is marked obsolete (for example via @Deprecated or OpenAPI deprecated: true) and consumers should stop calling it; it defaults to false." }, http_method: { type: "string", description: "HTTP method for this operation", enum: ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "TRACE"] }, http_path: { type: "string", description: "URL path template for this operation (e.g. '/api/taxonomies/{id}')", pattern: "^/" } }
753
769
  }, NODE_TYPE_API_PARAMETER = {
754
770
  specNodeId: "api.parameter",
755
771
  layer: "api",
@@ -757,7 +773,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
757
773
  title: "Parameter",
758
774
  requiredAttributes: ["in"],
759
775
  optionalAttributes: ["description", "required", "deprecated", "allowEmptyValue", "style", "schema", "explode", "allowReserved", "example", "examples", "content"],
760
- attributeConstraints: { in: { type: "string", enum: ["query", "header", "path", "cookie"], description: "Location of the parameter. Path parameters must always have required: true. Default serialization style: 'form' for query/cookie, 'simple' for path/header." }, description: { type: "string" }, required: { type: "boolean" }, deprecated: { type: "boolean" }, allowEmptyValue: { type: "boolean" }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the parameter value. Defaults: 'form' for query and cookie, 'simple' for path and header." }, schema: { type: "object", description: "The schema defining the type and constraints for the parameter value" }, explode: { type: "boolean", description: "When true, array/object values generate separate parameters for each element. Default: true when style is 'form', false otherwise." }, allowReserved: { type: "boolean", description: "Allows reserved characters in query parameter values without percent-encoding. Only applies to 'query' parameters." }, example: { description: "An example value for the parameter. Mutually exclusive with 'examples'." }, examples: { type: "object", description: "Map of named Example objects for the parameter. Mutually exclusive with 'example'." }, content: { type: "object", description: "Alternative to 'schema' for complex serialization. Mutually exclusive with 'schema'; must contain exactly one map entry keyed by media type string." } }
776
+ attributeConstraints: { in: { type: "string", enum: ["query", "header", "path", "cookie"], description: "Location of the parameter. Path parameters must always have required: true. Default serialization style: 'form' for query/cookie, 'simple' for path/header." }, description: { type: "string", description: "Human-readable explanation of the parameter's meaning and accepted values, in CommonMark; set it whenever the name alone does not convey semantics or units." }, required: { type: "boolean", description: "Whether the client must supply the parameter. It must be true when in is 'path' and defaults to false otherwise; set it to true for mandatory query, header or cookie inputs." }, deprecated: { type: "boolean", description: "Marks the parameter as scheduled for removal so that consumers stop sending it. Defaults to false; set it to true when the handler still accepts the parameter but it is slated for removal." }, allowEmptyValue: { type: "boolean", description: "Permits a query parameter to be sent with an empty value (e.g. '?flag='). It is valid only when in is 'query', is ignored when the chosen style cannot serialize an empty value, and is NOT RECOMMENDED in OpenAPI 3.0.3." }, style: { type: "string", enum: ["matrix", "label", "form", "simple", "spaceDelimited", "pipeDelimited", "deepObject"], description: "Serialization style for the parameter value. Defaults: 'form' for query and cookie, 'simple' for path and header." }, schema: { type: "object", description: "The schema defining the type and constraints for the parameter value" }, explode: { type: "boolean", description: "When true, array/object values generate separate parameters for each element. Default: true when style is 'form', false otherwise." }, allowReserved: { type: "boolean", description: "Allows reserved characters in query parameter values without percent-encoding. Only applies to 'query' parameters." }, example: { description: "An example value for the parameter. Mutually exclusive with 'examples'." }, examples: { type: "object", description: "Map of named Example objects for the parameter. Mutually exclusive with 'example'." }, content: { type: "object", description: "Alternative to 'schema' for complex serialization. Mutually exclusive with 'schema'; must contain exactly one map entry keyed by media type string." } }
761
777
  }, NODE_TYPE_API_PATHITEM = {
762
778
  specNodeId: "api.pathitem",
763
779
  layer: "api",
@@ -765,7 +781,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
765
781
  title: "PathItem",
766
782
  requiredAttributes: [],
767
783
  optionalAttributes: ["summary", "description"],
768
- attributeConstraints: { summary: { type: "string" }, description: { type: "string" } }
784
+ attributeConstraints: { summary: { type: "string", description: "Optional short one-line plain-text summary intended to apply to all operations under this path; set it when the path as a whole has a single clear purpose (e.g. 'Single user resource')." }, description: { type: "string", description: "Optional longer explanation, in CommonMark Markdown, of the resource or behaviour shared by all operations under this path; set it when path-wide context (semantics, constraints) is not captured by individual operation descriptions." } }
769
785
  }, NODE_TYPE_API_PATHS = {
770
786
  specNodeId: "api.paths",
771
787
  layer: "api",
@@ -789,7 +805,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
789
805
  title: "RequestBody",
790
806
  requiredAttributes: [],
791
807
  optionalAttributes: ["description", "required"],
792
- attributeConstraints: { description: { type: "string" }, required: { type: "boolean" } }
808
+ attributeConstraints: { description: { type: "string", description: "Brief human-readable explanation of the request payload's purpose and contents, CommonMark allowed per OpenAPI 3.0. Set it whenever the body's meaning is not obvious from the operation summary." }, required: { type: "boolean", description: "Boolean indicating whether a client must send a body for the operation to succeed; defaults to false, so set it to true when the handler rejects requests with an empty or missing body." } }
793
809
  }, NODE_TYPE_API_RESPONSE = {
794
810
  specNodeId: "api.response",
795
811
  layer: "api",
@@ -797,7 +813,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
797
813
  title: "Response",
798
814
  requiredAttributes: ["description"],
799
815
  optionalAttributes: [],
800
- attributeConstraints: { description: { type: "string" } }
816
+ attributeConstraints: { description: { type: "string", description: "Required human-readable explanation of what this outcome means (e.g. 'User not found'); CommonMark is permitted. Set it for every response, including those with no body." } }
801
817
  }, NODE_TYPE_API_RESPONSES = {
802
818
  specNodeId: "api.responses",
803
819
  layer: "api",
@@ -813,7 +829,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
813
829
  title: "Schema",
814
830
  requiredAttributes: [],
815
831
  optionalAttributes: ["type", "title", "description", "format", "default", "enum", "nullable", "properties", "items", "required", "allOf", "oneOf", "anyOf", "$ref", "readOnly", "writeOnly", "deprecated", "discriminator", "xml", "externalDocs"],
816
- attributeConstraints: { type: { type: "string" }, title: { type: "string" }, description: { type: "string" }, format: { type: "string" }, default: { type: "string" }, enum: { type: "string" }, nullable: { type: "boolean" }, properties: { type: "object", description: "Map of property names to schema definitions for object types" }, items: { type: "object", description: "Schema definition for array element types" }, required: { type: "array", description: "List of required property names for object types" }, allOf: { type: "array", description: "Composed schema: value must be valid against all listed schemas" }, oneOf: { type: "array", description: "Composed schema: value must be valid against exactly one of the listed schemas" }, anyOf: { type: "array", description: "Composed schema: value must be valid against one or more of the listed schemas" }, $ref: { type: "string", description: "JSON Reference to another schema definition. In OpenAPI 3.0, sibling keywords are ignored when $ref is present." }, readOnly: { type: "boolean", description: "Indicates the property is read-only and should not be sent in request bodies." }, writeOnly: { type: "boolean", description: "Indicates the property is write-only and should not be included in response bodies." }, deprecated: { type: "boolean", description: "Marks the schema as deprecated. Consumers should migrate away from using it." }, discriminator: { type: "object", description: "Adds support for polymorphism by specifying the property name that determines the subtype (propertyName) and an optional mapping of values to schema references." }, xml: { type: "object", description: "XML serialization metadata for this schema when producing XML representations." }, externalDocs: { type: "object", description: "Reference to an api.externaldocumentation node providing additional documentation for this schema." } }
832
+ attributeConstraints: { type: { type: "string", description: "The JSON data type of the value: one of string, number, integer, boolean, array or object. OpenAPI 3.0 does not allow type arrays or 'null'. Set it on every non-$ref, non-composed schema." }, title: { type: "string", description: "A short human-readable label for the schema, typically the model or DTO name. Set it when documentation tooling should display a name other than the component key." }, description: { type: "string", description: "Explanatory text for the schema or property, in CommonMark. Set it whenever the meaning of the value is not obvious from its name and type." }, format: { type: "string", description: "A modifier refining 'type', such as int32, int64, float, double, byte, binary, date, date-time, password, email or uuid. Set it when the base type alone does not convey the value's encoding or semantics." }, default: { type: "string", description: "The value the server assumes when the consumer omits this property or parameter. It must conform to the schema's type. Set it only when an actual server-side default exists." }, enum: { type: "string", description: "The closed set of literal values the data may take, each valid against the schema's type, as declared by the enum keyword. Set it for fixed vocabularies such as status codes or modes. This schema stores the set as a single string." }, nullable: { type: "boolean", description: "Boolean, default false. When true, null is an accepted value in addition to the declared type (the OpenAPI 3.0 substitute for type: [T, null]). Set it when the API may send or accept explicit nulls." }, properties: { type: "object", description: "Map of property names to schema definitions for object types" }, items: { type: "object", description: "Schema definition for array element types" }, required: { type: "array", description: "List of required property names for object types" }, allOf: { type: "array", description: "Composed schema: value must be valid against all listed schemas" }, oneOf: { type: "array", description: "Composed schema: value must be valid against exactly one of the listed schemas" }, anyOf: { type: "array", description: "Composed schema: value must be valid against one or more of the listed schemas" }, $ref: { type: "string", description: "JSON Reference to another schema definition. In OpenAPI 3.0, sibling keywords are ignored when $ref is present." }, readOnly: { type: "boolean", description: "Indicates the property is read-only and should not be sent in request bodies." }, writeOnly: { type: "boolean", description: "Indicates the property is write-only and should not be included in response bodies." }, deprecated: { type: "boolean", description: "Marks the schema as deprecated. Consumers should migrate away from using it." }, discriminator: { type: "object", description: "Adds support for polymorphism by specifying the property name that determines the subtype (propertyName) and an optional mapping of values to schema references." }, xml: { type: "object", description: "XML serialization metadata for this schema when producing XML representations." }, externalDocs: { type: "object", description: "Reference to an api.externaldocumentation node providing additional documentation for this schema." } }
817
833
  }, NODE_TYPE_API_SECURITYSCHEME = {
818
834
  specNodeId: "api.securityscheme",
819
835
  layer: "api",
@@ -821,7 +837,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
821
837
  title: "SecurityScheme",
822
838
  requiredAttributes: ["type"],
823
839
  optionalAttributes: ["description", "in", "scheme", "bearerFormat", "openIdConnectUrl"],
824
- attributeConstraints: { type: { type: "string", enum: ["apiKey", "http", "oauth2", "openIdConnect"], description: "Type of security scheme" }, description: { type: "string" }, in: { type: "string" }, scheme: { type: "string" }, bearerFormat: { type: "string" }, openIdConnectUrl: { type: "string", description: "OpenID Connect discovery URL, required when type is openIdConnect" } }
840
+ attributeConstraints: { type: { type: "string", enum: ["apiKey", "http", "oauth2", "openIdConnect"], description: "Type of security scheme" }, description: { type: "string", description: "Free-text (CommonMark) explanation of the scheme for consumers, e.g. how to obtain a key or token; set whenever the mechanism needs explanation beyond its type." }, in: { type: "string", description: "Location of the API key: one of 'header', 'query' or 'cookie'. Required and only meaningful when type is apiKey." }, scheme: { type: "string", description: "Name of the HTTP Authorization scheme as registered by IANA (RFC 7235), e.g. 'basic', 'bearer' or 'digest'. Required and only meaningful when type is http." }, bearerFormat: { type: "string", description: "Hint describing how the bearer token is formatted, e.g. 'JWT'. Documentation only; set when type is http and scheme is bearer." }, openIdConnectUrl: { type: "string", description: "OpenID Connect discovery URL, required when type is openIdConnect" } }
825
841
  }, NODE_TYPE_API_SERVER = {
826
842
  specNodeId: "api.server",
827
843
  layer: "api",
@@ -829,7 +845,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
829
845
  title: "Server",
830
846
  requiredAttributes: ["url"],
831
847
  optionalAttributes: ["description", "variables"],
832
- attributeConstraints: { url: { type: "string" }, description: { type: "string" }, variables: { type: "string", description: "Map of {placeholder} names (from the url template) to api.servervariable nodes defining allowed values and defaults." } }
848
+ attributeConstraints: { url: { type: "string", description: "Base URL of the target host, given as an absolute URL or one relative to the document's location, and optionally containing {name} placeholders defined in 'variables'. Always set it; operation paths are appended to it." }, description: { type: "string", description: "Optional human-readable text, CommonMark allowed, identifying the host or environment the URL designates (e.g. 'Production', 'EU staging'). Set it when several servers are listed." }, variables: { type: "string", description: "Map of {placeholder} names (from the url template) to api.servervariable nodes defining allowed values and defaults." } }
833
849
  }, NODE_TYPE_API_SERVERVARIABLE = {
834
850
  specNodeId: "api.servervariable",
835
851
  layer: "api",
@@ -837,7 +853,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
837
853
  title: "ServerVariable",
838
854
  requiredAttributes: ["default"],
839
855
  optionalAttributes: ["enum", "description"],
840
- attributeConstraints: { default: { type: "string", description: "Required default value for the variable. When 'enum' is specified, this value must be one of the listed enum values." }, enum: { type: "string", description: "Restricts the variable to a specific set of allowed values. The 'default' value must be one of these values when enum is present. The variable name (the map key in Server.variables) must exactly match a {placeholder} token in the parent server's URL string." }, description: { type: "string" } }
856
+ attributeConstraints: { default: { type: "string", description: "Required default value for the variable. When 'enum' is specified, this value must be one of the listed enum values." }, enum: { type: "string", description: "Restricts the variable to a specific set of allowed values. The 'default' value must be one of these values when enum is present. The variable name (the map key in Server.variables) must exactly match a {placeholder} token in the parent server's URL string." }, description: { type: "string", description: "Optional human-readable explanation of what the placeholder represents, such as tenant subdomain or deployment region; CommonMark is allowed. Set it whenever the variable's purpose is not obvious from its name." } }
841
857
  }, NODE_TYPE_API_TAG = {
842
858
  specNodeId: "api.tag",
843
859
  layer: "api",
@@ -845,7 +861,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
845
861
  title: "Tag",
846
862
  requiredAttributes: [],
847
863
  optionalAttributes: ["description"],
848
- attributeConstraints: { description: { type: "string" } }
864
+ attributeConstraints: { description: { type: "string", description: "A human-readable explanation of the category of operations this tag groups, in CommonMark per OpenAPI 3.0. Set it when the tag is declared at root level so documentation renderers can display a section introduction." } }
849
865
  }, NODE_TYPE_DATA_MODEL_ARRAYSCHEMA = {
850
866
  specNodeId: "data-model.arrayschema",
851
867
  layer: "data-model",
@@ -853,7 +869,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
853
869
  title: "ArraySchema",
854
870
  requiredAttributes: [],
855
871
  optionalAttributes: ["type", "items", "minItems", "maxItems", "uniqueItems", "contains"],
856
- attributeConstraints: { type: { const: "array" }, items: { type: "string" }, minItems: { type: "integer" }, maxItems: { type: "integer" }, uniqueItems: { type: "boolean" }, contains: { type: "string" } }
872
+ attributeConstraints: { type: { const: "array", description: "The JSON Schema type keyword, which for this element must be the literal string 'array'. Always set it so the schema validates only array instances." }, items: { type: "string", description: "The subschema, inline or as a $ref to a definition, that every array element must validate against. Set it whenever the element type is known, for example the T in List<T>. This schema stores the subschema or $ref as a single string." }, minItems: { type: "integer", description: "A non-negative integer giving the inclusive minimum number of elements. Set it when the list must not be empty (1) or needs a floor, for example from @Size(min) or @NotEmpty." }, maxItems: { type: "integer", description: "A non-negative integer giving the inclusive maximum number of elements. Set it when code or configuration enforces an upper bound on list length, for example @Size(max) or a page-size limit." }, uniqueItems: { type: "boolean", description: "When true, all elements must be pairwise distinct by JSON equality. Set it when the source type has set semantics or the code rejects duplicates." }, contains: { type: "string", description: "A subschema (inline or $ref) that at least one element must validate against. Set it only when the code requires the list to include a matching element, such as at least one primary address. This schema stores the subschema or $ref as a single string." } }
857
873
  }, NODE_TYPE_DATA_MODEL_JSONSCHEMA = {
858
874
  specNodeId: "data-model.jsonschema",
859
875
  layer: "data-model",
@@ -861,7 +877,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
861
877
  title: "JSONSchema",
862
878
  requiredAttributes: ["$schema", "$id", "type"],
863
879
  optionalAttributes: ["title", "definitions"],
864
- attributeConstraints: { $schema: { type: "string" }, $id: { type: "string" }, title: { type: "string" }, type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, definitions: { type: "object", description: "Reusable subschemas keyed by name, referenced elsewhere in the schema via $ref: '#/definitions/{name}'" } }
880
+ attributeConstraints: { $schema: { type: "string", description: "URI of the JSON Schema dialect/meta-schema the document conforms to (e.g. 'http://json-schema.org/draft-07/schema#'); set on every root document so validators apply Draft 7 semantics." }, $id: { type: "string", description: "Absolute URI that identifies the document and serves as the base URI for resolving relative $ref values (e.g. 'https://example.com/schemas/order.json'); set to a stable, unique URI per document." }, title: { type: "string", description: "Short human-readable name for the schema document, typically the domain entity it describes (e.g. 'Order'); set when the document needs a display label in tooling or generated docs." }, type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, definitions: { type: "object", description: "Reusable subschemas keyed by name, referenced elsewhere in the schema via $ref: '#/definitions/{name}'" } }
865
881
  }, NODE_TYPE_DATA_MODEL_NUMERICSCHEMA = {
866
882
  specNodeId: "data-model.numericschema",
867
883
  layer: "data-model",
@@ -869,7 +885,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
869
885
  title: "NumericSchema",
870
886
  requiredAttributes: ["type"],
871
887
  optionalAttributes: ["minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf"],
872
- attributeConstraints: { type: { type: "string", enum: ["number", "integer"], description: "JSON Schema Draft 7 numeric type: 'number' for any numeric value, 'integer' for whole numbers only" }, minimum: { type: "number" }, maximum: { type: "number" }, exclusiveMinimum: { type: "number" }, exclusiveMaximum: { type: "number" }, multipleOf: { type: "number" } }
888
+ attributeConstraints: { type: { type: "string", enum: ["number", "integer"], description: "JSON Schema Draft 7 numeric type: 'number' for any numeric value, 'integer' for whole numbers only" }, minimum: { type: "number", description: "Inclusive lower bound: valid instances must be greater than or equal to this number, in the same units as the value. Set it when the domain forbids smaller values, e.g. 0 for quantities." }, maximum: { type: "number", description: "Inclusive upper bound: valid instances must be less than or equal to this number, in the same units as the value. Set it when the domain caps the value, e.g. 100 for a percentage." }, exclusiveMinimum: { type: "number", description: "Exclusive lower bound given as a number (Draft 7 semantics): valid instances must be strictly greater than this value. Set it instead of minimum when the boundary itself is invalid, e.g. 0 for a strictly positive price." }, exclusiveMaximum: { type: "number", description: "Exclusive upper bound given as a number (Draft 7 semantics): valid instances must be strictly less than this value. Set it instead of maximum when the boundary itself is invalid, e.g. 1 for a probability strictly below one." }, multipleOf: { type: "number", description: "Strictly positive number that every valid instance must divide into evenly, expressing a step or precision such as 0.01 for cents or 5 for five-minute intervals. Set it only when the domain imposes such a granularity." } }
873
889
  }, NODE_TYPE_DATA_MODEL_OBJECTSCHEMA = {
874
890
  specNodeId: "data-model.objectschema",
875
891
  layer: "data-model",
@@ -877,7 +893,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
877
893
  title: "ObjectSchema",
878
894
  requiredAttributes: ["type"],
879
895
  optionalAttributes: ["properties", "patternProperties", "propertyNames", "required", "additionalProperties", "minProperties", "maxProperties"],
880
- attributeConstraints: { type: { type: "string" }, properties: { type: "object", description: "Named property definitions for the object schema (primary mechanism for defining object structure)" }, patternProperties: { type: "string", description: "Pattern-matched property definitions applied to properties whose names match the given regex" }, propertyNames: { type: "string", description: "Schema applied to all property names of the object instance for name validation" }, required: { type: "string" }, additionalProperties: { type: "string" }, minProperties: { type: "integer" }, maxProperties: { type: "integer" } }
896
+ attributeConstraints: { type: { type: "string", description: "The JSON Schema type keyword, which is always the string 'object' for this element; set it on every instance." }, properties: { type: "object", description: "Named property definitions for the object schema (primary mechanism for defining object structure)" }, patternProperties: { type: "string", description: "Pattern-matched property definitions applied to properties whose names match the given regex" }, propertyNames: { type: "string", description: "Schema applied to all property names of the object instance for name validation" }, required: { type: "array", items: { type: "string" }, description: "Array of property names (strings) that must be present in a valid instance; populate it from fields that are non-optional in code, such as TypeScript fields without '?', Pydantic fields without defaults, or NOT NULL columns." }, additionalProperties: { type: "string", description: "Either a boolean or a subschema (inline or $ref) governing keys not listed in properties or patternProperties; set false for closed models (e.g. Pydantic extra='forbid', TypeScript exact types) and a value schema for map-like types such as Record<string, T>. This schema stores the value as a single string." }, minProperties: { type: "integer", description: "Non-negative integer giving the minimum number of keys a valid instance must contain; set it only when code or a validator explicitly enforces a lower bound on key count." }, maxProperties: { type: "integer", description: "Non-negative integer giving the maximum number of keys a valid instance may contain; set it only when code or a validator explicitly enforces an upper bound on key count." } }
881
897
  }, NODE_TYPE_DATA_MODEL_REFERENCE = {
882
898
  specNodeId: "data-model.reference",
883
899
  layer: "data-model",
@@ -901,7 +917,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
901
917
  title: "SchemaDefinition",
902
918
  requiredAttributes: ["title", "type"],
903
919
  optionalAttributes: ["description", "format", "enum", "examples"],
904
- attributeConstraints: { title: { type: "string" }, type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, description: { type: "string", description: "Human-readable explanation of this definition's purpose (JSON Schema Draft 7 annotation keyword)" }, format: { type: "string", description: "Semantic format hint for string-typed definitions (e.g., date-time, email, uri)" }, enum: { type: "array", items: { type: "string" }, description: "Restricts the value of this definition to a fixed set of allowed values" }, examples: { type: "array", items: { type: "string" }, description: "Sample values illustrating valid instances of this definition (JSON Schema Draft 7 annotation keyword)" } }
920
+ attributeConstraints: { title: { type: "string", description: "Human-readable name of the definition, normally matching its key under 'definitions' or the source class or type name (e.g. 'CustomerAddress'). Always set it, because it is the label other elements use to identify the reusable type." }, type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, description: { type: "string", description: "Human-readable explanation of this definition's purpose (JSON Schema Draft 7 annotation keyword)" }, format: { type: "string", description: "Semantic format hint for string-typed definitions (e.g., date-time, email, uri)" }, enum: { type: "array", items: { type: "string" }, description: "Restricts the value of this definition to a fixed set of allowed values" }, examples: { type: "array", items: { type: "string" }, description: "Sample values illustrating valid instances of this definition (JSON Schema Draft 7 annotation keyword)" } }
905
921
  }, NODE_TYPE_DATA_MODEL_SCHEMAPROPERTY = {
906
922
  specNodeId: "data-model.schemaproperty",
907
923
  layer: "data-model",
@@ -909,7 +925,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
909
925
  title: "SchemaProperty",
910
926
  requiredAttributes: ["type"],
911
927
  optionalAttributes: ["title", "format", "default", "enum", "const", "readOnly", "writeOnly", "examples", "description", "$ref"],
912
- attributeConstraints: { type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, title: { type: "string" }, format: { type: "string" }, default: { type: "string" }, enum: { type: "string" }, const: { type: "string" }, readOnly: { type: "boolean" }, writeOnly: { type: "boolean" }, examples: { type: "string" }, description: { type: "string", description: "Human-readable explanation of the property's purpose (JSON Schema Draft 7 annotation keyword)" }, $ref: { type: "string", description: "URI reference to a reusable schema definition (e.g., #/definitions/MyType)" } }
928
+ attributeConstraints: { type: { type: "string", enum: ["string", "number", "integer", "boolean", "array", "object", "null"], description: "JSON Schema Draft 7 primitive type" }, title: { type: "string", description: "A short human-readable label for the property, used for example as a form label or table header; set it when the field's code name is not suitable for display." }, format: { type: "string", description: "A JSON Schema Draft 7 semantic format hint for string values, such as date-time, email or uuid; set it when the field's value follows a recognised format, for example a UUID-typed id or a timestamp column." }, default: { type: "string", description: "The value assumed when an instance omits the property, written as a JSON literal; set it when the code, ORM column or DTO declares a default." }, enum: { type: "string", description: "The fixed set of allowed values, written as a JSON array serialized into this single string; set it when the field is restricted to an enumeration, such as a language enum type, a union of literals or a CHECK-constrained column." }, const: { type: "string", description: "The single value the property must always hold, written as a JSON literal; set it for discriminator or type-tag fields that have a fixed value within this object." }, readOnly: { type: "boolean", description: "Set to true when the value is assigned by the owning system and must not be supplied by clients, such as generated ids, audit timestamps or computed fields." }, writeOnly: { type: "boolean", description: "Set to true when the value may be submitted but is never returned in representations, such as passwords, secrets or one-time tokens." }, examples: { type: "string", description: "Sample valid values for the property, written as a JSON array serialized into this single string; set it to document typical content for consumers and test generation." }, description: { type: "string", description: "Human-readable explanation of the property's purpose (JSON Schema Draft 7 annotation keyword)" }, $ref: { type: "string", description: "URI reference to a reusable schema definition (e.g., #/definitions/MyType)" } }
913
929
  }, NODE_TYPE_DATA_MODEL_STRINGSCHEMA = {
914
930
  specNodeId: "data-model.stringschema",
915
931
  layer: "data-model",
@@ -917,7 +933,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
917
933
  title: "StringSchema",
918
934
  requiredAttributes: [],
919
935
  optionalAttributes: ["type", "minLength", "maxLength", "pattern", "format"],
920
- attributeConstraints: { type: { const: "string" }, minLength: { type: "integer" }, maxLength: { type: "integer" }, pattern: { type: "string" }, format: { type: "string", enum: ["date-time", "date", "time", "duration", "email", "idn-email", "hostname", "idn-hostname", "ipv4", "ipv6", "uri", "uri-reference", "iri", "iri-reference", "uuid", "json-pointer", "relative-json-pointer", "regex"], description: "Semantic format hint for string values (JSON Schema Draft 7 format keyword)" } }
936
+ attributeConstraints: { type: { const: "string", description: "The JSON Schema type keyword. Always set it to the literal 'string', the value that identifies this element as a string schema." }, minLength: { type: "integer", description: "The minimum permitted number of characters (Unicode code points) in the string, as a non-negative integer; set it when empty or too-short values must be rejected." }, maxLength: { type: "integer", description: "The maximum permitted number of characters (Unicode code points) in the string, as a non-negative integer no smaller than minLength; set it when the domain or a downstream field imposes a length limit." }, pattern: { type: "string", description: "An ECMA-262 regular expression that the string must match, unanchored unless ^ and $ are used; set it when values follow a fixed syntax such as codes or identifiers." }, format: { type: "string", enum: ["date-time", "date", "time", "duration", "email", "idn-email", "hostname", "idn-hostname", "ipv4", "ipv6", "uri", "uri-reference", "iri", "iri-reference", "uuid", "json-pointer", "relative-json-pointer", "regex"], description: "Semantic format hint for string values (JSON Schema Draft 7 format keyword)" } }
921
937
  }, NODE_TYPE_DATA_STORE_ACCESSPATTERN = {
922
938
  specNodeId: "data-store.accesspattern",
923
939
  layer: "data-store",
@@ -941,7 +957,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
941
957
  title: "Database",
942
958
  requiredAttributes: ["engine", "paradigm"],
943
959
  optionalAttributes: ["version", "charset", "collation", "deploymentModel"],
944
- attributeConstraints: { engine: { type: "string", description: "Database engine name (e.g., 'PostgreSQL', 'MongoDB', 'Redis', 'Cassandra', 'Pinecone', 'Neo4j', 'Elasticsearch', 'InfluxDB', 'DynamoDB'). Free-text to accommodate any engine without enumeration constraints." }, paradigm: { type: "string", enum: ["RELATIONAL", "DOCUMENT", "KEY_VALUE", "WIDE_COLUMN", "VECTOR", "TIME_SERIES", "GRAPH", "SEARCH_ENGINE", "MULTI_MODEL"], description: "Primary data model paradigm. RELATIONAL: SQL-based tabular data (PostgreSQL, MySQL, Oracle). DOCUMENT: JSON/BSON document storage (MongoDB, CouchDB, Firestore). KEY_VALUE: simple key-to-value mapping (Redis, DynamoDB, etcd). WIDE_COLUMN: column-family storage (Cassandra, HBase, Bigtable). VECTOR: vector embedding storage and similarity search (Pinecone, Weaviate, Qdrant). TIME_SERIES: time-indexed measurements (InfluxDB, TimescaleDB). GRAPH: nodes and edges with traversal (Neo4j, Neptune). SEARCH_ENGINE: full-text search and analytics (Elasticsearch, OpenSearch). MULTI_MODEL: natively supports multiple paradigms (ArangoDB, CosmosDB, FaunaDB)." }, version: { type: "string" }, charset: { type: "string" }, collation: { type: "string" }, deploymentModel: { type: "string", enum: ["STANDALONE", "REPLICATED", "SHARDED", "DISTRIBUTED", "SERVERLESS", "EMBEDDED"], description: "How the database is deployed. STANDALONE: single instance. REPLICATED: primary with read replicas. SHARDED: data partitioned across nodes. DISTRIBUTED: fully distributed with no single primary. SERVERLESS: cloud-managed auto-scaling. EMBEDDED: in-process database (SQLite, RocksDB)." } }
960
+ attributeConstraints: { engine: { type: "string", description: "Database engine name (e.g., 'PostgreSQL', 'MongoDB', 'Redis', 'Cassandra', 'Pinecone', 'Neo4j', 'Elasticsearch', 'InfluxDB', 'DynamoDB'). Free-text to accommodate any engine without enumeration constraints." }, paradigm: { type: "string", enum: ["RELATIONAL", "DOCUMENT", "KEY_VALUE", "WIDE_COLUMN", "VECTOR", "TIME_SERIES", "GRAPH", "SEARCH_ENGINE", "MULTI_MODEL"], description: "Primary data model paradigm. RELATIONAL: SQL-based tabular data (PostgreSQL, MySQL, Oracle). DOCUMENT: JSON/BSON document storage (MongoDB, CouchDB, Firestore). KEY_VALUE: simple key-to-value mapping (Redis, DynamoDB, etcd). WIDE_COLUMN: column-family storage (Cassandra, HBase, Bigtable). VECTOR: vector embedding storage and similarity search (Pinecone, Weaviate, Qdrant). TIME_SERIES: time-indexed measurements (InfluxDB, TimescaleDB). GRAPH: nodes and edges with traversal (Neo4j, Neptune). SEARCH_ENGINE: full-text search and analytics (Elasticsearch, OpenSearch). MULTI_MODEL: natively supports multiple paradigms (ArangoDB, CosmosDB, FaunaDB)." }, version: { type: "string", description: "Release version of the database engine in the vendor's own format (e.g. '15.4', '7.0', '8.0.35'); set it when it is pinned in an image tag, provider config or migration baseline." }, charset: { type: "string", description: "Default character encoding for text stored in this database (e.g. 'UTF8', 'utf8mb4', 'LATIN1'); set it when it is declared at creation time, mainly for relational engines." }, collation: { type: "string", description: "Default collation governing string comparison and sort order (e.g. 'en_US.UTF-8', 'utf8mb4_unicode_ci', 'C'); set it when it is explicitly configured at database creation." }, deploymentModel: { type: "string", enum: ["STANDALONE", "REPLICATED", "SHARDED", "DISTRIBUTED", "SERVERLESS", "EMBEDDED"], description: "How the database is deployed. STANDALONE: single instance. REPLICATED: primary with read replicas. SHARDED: data partitioned across nodes. DISTRIBUTED: fully distributed with no single primary. SERVERLESS: cloud-managed auto-scaling. EMBEDDED: in-process database (SQLite, RocksDB)." } }
945
961
  }, NODE_TYPE_DATA_STORE_EVENTHANDLER = {
946
962
  specNodeId: "data-store.eventhandler",
947
963
  layer: "data-store",
@@ -949,7 +965,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
949
965
  title: "EventHandler",
950
966
  requiredAttributes: ["handlerType", "events"],
951
967
  optionalAttributes: ["targetCollection", "timing", "granularity", "action", "condition", "enabled"],
952
- attributeConstraints: { handlerType: { type: "string", enum: ["TRIGGER", "CHANGE_STREAM", "CDC_LISTENER", "KEYSPACE_NOTIFICATION", "STREAM_PROCESSOR", "WATCHER", "ALERT_RULE", "CUSTOM"], description: "Type of event handler mechanism. TRIGGER: synchronous SQL trigger (BEFORE/AFTER DML). CHANGE_STREAM: asynchronous document change feed (MongoDB, CouchDB). CDC_LISTENER: change data capture consumer (Cassandra, Debezium). KEYSPACE_NOTIFICATION: key event notification (Redis). STREAM_PROCESSOR: stream-based event processor (Redis Streams, Kafka Connect). WATCHER: periodic condition check and alert (Elasticsearch). ALERT_RULE: threshold or anomaly alerting (time-series, monitoring). CUSTOM: engine-specific mechanism not listed." }, targetCollection: { type: "string", description: "The collection or database-level scope this handler is attached to." }, timing: { type: "string", enum: ["BEFORE", "AFTER", "INSTEAD_OF", "ON_CHANGE", "CONTINUOUS"], description: "When the handler fires relative to the event. BEFORE: fires before the operation (SQL BEFORE trigger). AFTER: fires after the operation (SQL AFTER trigger). INSTEAD_OF: replaces the operation (SQL INSTEAD OF trigger for views). ON_CHANGE: fires when a change is detected (change streams, CDC). CONTINUOUS: always-on stream processing." }, events: { type: "array", items: { type: "string", enum: ["INSERT", "UPDATE", "DELETE", "REPLACE", "TRUNCATE", "DROP", "INVALIDATE", "EXPIRE", "SET", "DEL", "THRESHOLD", "ANOMALY", "CUSTOM"] }, description: "Events that activate this handler. SQL: INSERT/UPDATE/DELETE/TRUNCATE. Document: INSERT/UPDATE/DELETE/REPLACE/DROP/INVALIDATE. Key-value: EXPIRE/SET/DEL. Monitoring: THRESHOLD/ANOMALY. CUSTOM: engine-specific event not listed." }, granularity: { type: "string", enum: ["ROW", "STATEMENT", "DOCUMENT", "KEY", "BATCH"], description: "Granularity of handler activation. ROW: fires once per affected row (SQL FOR EACH ROW). STATEMENT: fires once per SQL statement. DOCUMENT: fires per changed document (document store change streams). KEY: fires per key operation (key-value notifications). BATCH: fires per batch of changes (CDC, stream processing)." }, action: { type: "string", description: "Reference to the stored logic (function name, pipeline reference, or inline expression) that executes when this handler fires." }, condition: { type: "string", description: "Optional filter condition. Only events matching this condition activate the handler. Maps to SQL WHEN clause, MongoDB pipeline $match stage, or Elasticsearch watcher condition." }, enabled: { type: "boolean" } }
968
+ attributeConstraints: { handlerType: { type: "string", enum: ["TRIGGER", "CHANGE_STREAM", "CDC_LISTENER", "KEYSPACE_NOTIFICATION", "STREAM_PROCESSOR", "WATCHER", "ALERT_RULE", "CUSTOM"], description: "Type of event handler mechanism. TRIGGER: synchronous SQL trigger (BEFORE/AFTER DML). CHANGE_STREAM: asynchronous document change feed (MongoDB, CouchDB). CDC_LISTENER: change data capture consumer (Cassandra, Debezium). KEYSPACE_NOTIFICATION: key event notification (Redis). STREAM_PROCESSOR: stream-based event processor (Redis Streams, Kafka Connect). WATCHER: periodic condition check and alert (Elasticsearch). ALERT_RULE: threshold or anomaly alerting (time-series, monitoring). CUSTOM: engine-specific mechanism not listed." }, targetCollection: { type: "string", description: "The collection or database-level scope this handler is attached to." }, timing: { type: "string", enum: ["BEFORE", "AFTER", "INSTEAD_OF", "ON_CHANGE", "CONTINUOUS"], description: "When the handler fires relative to the event. BEFORE: fires before the operation (SQL BEFORE trigger). AFTER: fires after the operation (SQL AFTER trigger). INSTEAD_OF: replaces the operation (SQL INSTEAD OF trigger for views). ON_CHANGE: fires when a change is detected (change streams, CDC). CONTINUOUS: always-on stream processing." }, events: { type: "array", items: { type: "string", enum: ["INSERT", "UPDATE", "DELETE", "REPLACE", "TRUNCATE", "DROP", "INVALIDATE", "EXPIRE", "SET", "DEL", "THRESHOLD", "ANOMALY", "CUSTOM"] }, description: "Events that activate this handler. SQL: INSERT/UPDATE/DELETE/TRUNCATE. Document: INSERT/UPDATE/DELETE/REPLACE/DROP/INVALIDATE. Key-value: EXPIRE/SET/DEL. Monitoring: THRESHOLD/ANOMALY. CUSTOM: engine-specific event not listed." }, granularity: { type: "string", enum: ["ROW", "STATEMENT", "DOCUMENT", "KEY", "BATCH"], description: "Granularity of handler activation. ROW: fires once per affected row (SQL FOR EACH ROW). STATEMENT: fires once per SQL statement. DOCUMENT: fires per changed document (document store change streams). KEY: fires per key operation (key-value notifications). BATCH: fires per batch of changes (CDC, stream processing)." }, action: { type: "string", description: "Reference to the stored logic (function name, pipeline reference, or inline expression) that executes when this handler fires." }, condition: { type: "string", description: "Optional filter condition. Only events matching this condition activate the handler. Maps to SQL WHEN clause, MongoDB pipeline $match stage, or Elasticsearch watcher condition." }, enabled: { type: "boolean", description: "Whether the handler is currently active and will fire; set false when it is declared but disabled (e.g. ALTER TABLE ... DISABLE TRIGGER, a paused connector or deactivated watcher), otherwise true, which is the default." } }
953
969
  }, NODE_TYPE_DATA_STORE_FIELD = {
954
970
  specNodeId: "data-store.field",
955
971
  layer: "data-store",
@@ -957,7 +973,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
957
973
  title: "Field",
958
974
  requiredAttributes: ["dataType"],
959
975
  optionalAttributes: ["nullable", "defaultValue", "generated", "fieldRole", "vectorDimensions", "distanceMetric", "analyzer", "nested", "x-source-reference"],
960
- attributeConstraints: { dataType: { type: "string", description: "Data type of this field. Interpretation is paradigm-specific: SQL types (VARCHAR, INTEGER, TIMESTAMP), BSON types (String, ObjectId, Document), Elasticsearch mapping types (keyword, text, dense_vector), or any engine-native type name." }, nullable: { type: "boolean" }, defaultValue: { type: "string" }, generated: { type: "string", enum: ["ALWAYS", "BY_DEFAULT", "NEVER"], description: "Whether the field value is auto-generated. ALWAYS: value is always system-generated (SQL identity GENERATED ALWAYS, MongoDB auto _id, auto-increment). BY_DEFAULT: system-generated unless explicitly overridden (SQL GENERATED BY DEFAULT). NEVER: value must be user-provided." }, fieldRole: { type: "string", enum: ["VALUE", "TAG", "TIMESTAMP", "PARTITION_KEY", "CLUSTERING_KEY", "VECTOR", "METADATA", "LABEL", "PROPERTY"], description: "Semantic role of this field within its collection. VALUE: regular data field. TAG: indexed metadata for filtering (time-series). TIMESTAMP: time-series time field. PARTITION_KEY: wide-column or distributed partition key component. CLUSTERING_KEY: wide-column clustering/sort key component. VECTOR: vector embedding field. METADATA: vector store metadata for filtering. LABEL: graph node label. PROPERTY: graph node or edge property." }, vectorDimensions: { type: "integer", description: "Number of dimensions for vector fields. Only applicable when fieldRole is VECTOR." }, distanceMetric: { type: "string", enum: ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"], description: "Distance metric for vector similarity search. COSINE: angular similarity. EUCLIDEAN: L2 distance. DOT_PRODUCT: inner product similarity. MANHATTAN: L1 distance. Only applicable when fieldRole is VECTOR." }, analyzer: { type: "string", description: "Text analyzer for search engine fields (e.g., 'standard', 'english', 'keyword', 'whitespace'). Controls tokenization and normalization. Only applicable for search engine paradigm." }, nested: { type: "boolean", description: "Whether this field contains nested or embedded documents. Relevant for document stores (MongoDB embedded documents) and search engines (Elasticsearch nested type)." }, "x-source-reference": { type: "string", description: "Source code reference using OpenAPI x- extension pattern." } }
976
+ attributeConstraints: { dataType: { type: "string", description: "Data type of this field. Interpretation is paradigm-specific: SQL types (VARCHAR, INTEGER, TIMESTAMP), BSON types (String, ObjectId, Document), Elasticsearch mapping types (keyword, text, dense_vector), or any engine-native type name." }, nullable: { type: "boolean", description: "Whether the store accepts an absent or null value for this field. Set false when the declaration carries NOT NULL, required: true, or an equivalent, and true when nulls or missing paths are explicitly allowed." }, defaultValue: { type: "string", description: "The literal or expression the store assigns when a write omits this field, recorded as written in the source (e.g. '0', 'now()', 'CURRENT_TIMESTAMP'). Set only when the default is declared in the storage schema, not when it is assigned in application code." }, generated: { type: "string", enum: ["ALWAYS", "BY_DEFAULT", "NEVER"], description: "Whether the field value is auto-generated. ALWAYS: value is always system-generated (SQL identity GENERATED ALWAYS, MongoDB auto _id, auto-increment). BY_DEFAULT: system-generated unless explicitly overridden (SQL GENERATED BY DEFAULT). NEVER: value must be user-provided." }, fieldRole: { type: "string", enum: ["VALUE", "TAG", "TIMESTAMP", "PARTITION_KEY", "CLUSTERING_KEY", "VECTOR", "METADATA", "LABEL", "PROPERTY"], description: "Semantic role of this field within its collection. VALUE: regular data field. TAG: indexed metadata for filtering (time-series). TIMESTAMP: time-series time field. PARTITION_KEY: wide-column or distributed partition key component. CLUSTERING_KEY: wide-column clustering/sort key component. VECTOR: vector embedding field. METADATA: vector store metadata for filtering. LABEL: graph node label. PROPERTY: graph node or edge property." }, vectorDimensions: { type: "integer", description: "Number of dimensions for vector fields. Only applicable when fieldRole is VECTOR." }, distanceMetric: { type: "string", enum: ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"], description: "Distance metric for vector similarity search. COSINE: angular similarity. EUCLIDEAN: L2 distance. DOT_PRODUCT: inner product similarity. MANHATTAN: L1 distance. Only applicable when fieldRole is VECTOR." }, analyzer: { type: "string", description: "Text analyzer for search engine fields (e.g., 'standard', 'english', 'keyword', 'whitespace'). Controls tokenization and normalization. Only applicable for search engine paradigm." }, nested: { type: "boolean", description: "Whether this field contains nested or embedded documents. Relevant for document stores (MongoDB embedded documents) and search engines (Elasticsearch nested type)." }, "x-source-reference": { type: "string", description: "Source code reference using OpenAPI x- extension pattern." } }
961
977
  }, NODE_TYPE_DATA_STORE_INDEX = {
962
978
  specNodeId: "data-store.index",
963
979
  layer: "data-store",
@@ -965,7 +981,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
965
981
  title: "Index",
966
982
  requiredAttributes: [],
967
983
  optionalAttributes: ["fields", "unique", "method", "where", "include", "sparse", "vectorConfig"],
968
- attributeConstraints: { fields: { type: "string", description: "Field name(s) included in the index key." }, unique: { type: "boolean" }, method: { type: "string", enum: ["BTREE", "HASH", "GIN", "GIST", "SPGIST", "BRIN", "HNSW", "IVF_FLAT", "IVF_PQ", "ANNOY", "LSH", "INVERTED", "FULLTEXT", "GEOSPATIAL", "COMPOUND", "MULTIKEY", "CUSTOM"], description: "Index access method. BTREE/HASH: traditional ordered and hash-based (relational, document). GIN/GIST/SPGIST/BRIN: PostgreSQL advanced index types. HNSW/IVF_FLAT/IVF_PQ/ANNOY/LSH: vector approximate nearest neighbor algorithms. INVERTED/FULLTEXT: search engine and full-text indexes. GEOSPATIAL: location-based spatial indexes. COMPOUND/MULTIKEY: document store compound and array indexes. CUSTOM: engine-specific method not listed." }, where: { type: "string", description: "Partial or filtered index predicate. Only entries satisfying this condition are indexed. Supported by relational (PostgreSQL, SQL Server) and document stores (MongoDB partial index filter)." }, include: { type: "string", description: "Covering index: additional fields stored in the index but not in the search key. Reduces lookups by including frequently accessed fields in the index leaf pages." }, sparse: { type: "boolean", description: "Whether the index only includes entries where the indexed field exists. Relevant for document stores with flexible schemas and sparse datasets." }, vectorConfig: { type: "object", description: "Configuration parameters for vector indexes. Only applicable when method is HNSW, IVF_FLAT, IVF_PQ, ANNOY, or LSH.", properties: { dimensions: { type: "integer", description: "Number of dimensions in the vector space." }, distanceMetric: { type: "string", enum: ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"], description: "Distance metric for similarity computation." }, efConstruction: { type: "integer", description: "HNSW build-time parameter controlling index quality vs. build speed tradeoff." }, m: { type: "integer", description: "HNSW maximum number of connections per node in the graph." }, nlist: { type: "integer", description: "IVF number of clusters (Voronoi cells) for partitioning the vector space." } }, additionalProperties: !0 } }
984
+ attributeConstraints: { fields: { type: "string", description: "Field name(s) included in the index key." }, unique: { type: "boolean", description: "Boolean that is true when the index rejects duplicate key values across indexed entries (CREATE UNIQUE INDEX, MongoDB {unique: true}); set it only when the index declaration itself enforces uniqueness, and otherwise leave it false or unset." }, method: { type: "string", enum: ["BTREE", "HASH", "GIN", "GIST", "SPGIST", "BRIN", "HNSW", "IVF_FLAT", "IVF_PQ", "ANNOY", "LSH", "INVERTED", "FULLTEXT", "GEOSPATIAL", "COMPOUND", "MULTIKEY", "CUSTOM"], description: "Index access method. BTREE/HASH: traditional ordered and hash-based (relational, document). GIN/GIST/SPGIST/BRIN: PostgreSQL advanced index types. HNSW/IVF_FLAT/IVF_PQ/ANNOY/LSH: vector approximate nearest neighbor algorithms. INVERTED/FULLTEXT: search engine and full-text indexes. GEOSPATIAL: location-based spatial indexes. COMPOUND/MULTIKEY: document store compound and array indexes. CUSTOM: engine-specific method not listed." }, where: { type: "string", description: "Partial or filtered index predicate. Only entries satisfying this condition are indexed. Supported by relational (PostgreSQL, SQL Server) and document stores (MongoDB partial index filter)." }, include: { type: "string", description: "Covering index: additional fields stored in the index but not in the search key. Reduces lookups by including frequently accessed fields in the index leaf pages." }, sparse: { type: "boolean", description: "Whether the index only includes entries where the indexed field exists. Relevant for document stores with flexible schemas and sparse datasets." }, vectorConfig: { type: "object", description: "Configuration parameters for vector indexes. Only applicable when method is HNSW, IVF_FLAT, IVF_PQ, ANNOY, or LSH.", properties: { dimensions: { type: "integer", description: "Number of dimensions in the vector space." }, distanceMetric: { type: "string", enum: ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"], description: "Distance metric for similarity computation." }, efConstruction: { type: "integer", description: "HNSW build-time parameter controlling index quality vs. build speed tradeoff." }, m: { type: "integer", description: "HNSW maximum number of connections per node in the graph." }, nlist: { type: "integer", description: "IVF number of clusters (Voronoi cells) for partitioning the vector space." } }, additionalProperties: !0 } }
969
985
  }, NODE_TYPE_DATA_STORE_NAMESPACE = {
970
986
  specNodeId: "data-store.namespace",
971
987
  layer: "data-store",
@@ -973,7 +989,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
973
989
  title: "Namespace",
974
990
  requiredAttributes: [],
975
991
  optionalAttributes: ["owner"],
976
- attributeConstraints: { owner: { type: "string" } }
992
+ attributeConstraints: { owner: { type: "string", description: "The database role, user or principal that owns the namespace and holds default privileges over its objects, e.g. the AUTHORIZATION role in CREATE SCHEMA. Set it when ownership is declared in DDL or provisioning code, and leave it empty for paradigms without an ownership concept, such as Redis prefixes." } }
977
993
  }, NODE_TYPE_DATA_STORE_RETENTIONPOLICY = {
978
994
  specNodeId: "data-store.retentionpolicy",
979
995
  layer: "data-store",
@@ -981,7 +997,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
981
997
  title: "RetentionPolicy",
982
998
  requiredAttributes: ["targetCollection", "retentionDuration", "action"],
983
999
  optionalAttributes: ["downsampleInterval", "enabled"],
984
- attributeConstraints: { targetCollection: { type: "string", description: "The collection or namespace this policy applies to." }, retentionDuration: { type: "string", description: "How long data is retained, expressed as an ISO 8601 duration (e.g., 'P30D' for 30 days, 'P1Y' for 1 year, 'P6M' for 6 months)." }, action: { type: "string", enum: ["DELETE", "ARCHIVE", "DOWNSAMPLE", "MOVE_TIER", "COMPRESS"], description: "Action taken when data exceeds the retention period. DELETE: permanently remove. ARCHIVE: move to cold storage. DOWNSAMPLE: aggregate and reduce resolution (time-series). MOVE_TIER: transition to a different storage tier. COMPRESS: apply compression to reduce storage footprint." }, downsampleInterval: { type: "string", description: "For DOWNSAMPLE action, the aggregation interval (e.g., '1h', '1d'). Only applicable when action is DOWNSAMPLE." }, enabled: { type: "boolean" } }
1000
+ attributeConstraints: { targetCollection: { type: "string", description: "The collection or namespace this policy applies to." }, retentionDuration: { type: "string", description: "How long data is retained, expressed as an ISO 8601 duration (e.g., 'P30D' for 30 days, 'P1Y' for 1 year, 'P6M' for 6 months)." }, action: { type: "string", enum: ["DELETE", "ARCHIVE", "DOWNSAMPLE", "MOVE_TIER", "COMPRESS"], description: "Action taken when data exceeds the retention period. DELETE: permanently remove. ARCHIVE: move to cold storage. DOWNSAMPLE: aggregate and reduce resolution (time-series). MOVE_TIER: transition to a different storage tier. COMPRESS: apply compression to reduce storage footprint." }, downsampleInterval: { type: "string", description: "For DOWNSAMPLE action, the aggregation interval (e.g., '1h', '1d'). Only applicable when action is DOWNSAMPLE." }, enabled: { type: "boolean", description: "Whether the policy is currently active and enforced by the engine; set to false when the policy is defined but suspended (e.g., a disabled TimescaleDB job or paused ILM policy), otherwise true or omitted." } }
985
1001
  }, NODE_TYPE_DATA_STORE_STOREDLOGIC = {
986
1002
  specNodeId: "data-store.storedlogic",
987
1003
  layer: "data-store",
@@ -1013,7 +1029,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1013
1029
  title: "ActionComponent",
1014
1030
  requiredAttributes: ["type"],
1015
1031
  optionalAttributes: ["label", "icon", "disabled", "tooltip", "channel", "style", "validations"],
1016
- attributeConstraints: { label: { type: "string" }, type: { type: "string", enum: ["button", "link", "menu", "voice-command", "icon-button"], description: "Interactive element kind, per HTML 5.3 button, anchor, and menu element semantics." }, icon: { type: "string" }, disabled: { type: "boolean" }, tooltip: { type: "string" }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Delivery channel for which this component is rendered." }, style: { type: "string", enum: ["primary", "secondary", "danger", "ghost", "link", "icon"], description: "Visual style variant of the action component, per design system button style conventions." }, validations: { type: "array", 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.", items: { type: "object", properties: { type: { type: "string", enum: ["required", "minlength", "maxlength", "pattern", "min", "max", "type", "custom"], 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." }, value: { type: "string", description: "Constraint threshold or parameter (e.g., '8' for minlength, '^[a-z]+$' for pattern)." }, message: { type: "string", description: "User-facing error message shown when this constraint is violated." } }, required: ["type", "message"], additionalProperties: !1 } } }
1032
+ attributeConstraints: { label: { type: "string", description: "The visible text or accessible name of the control (the button text, link text or spoken phrase). Set it whenever the control is not icon-only; for icon-only controls, set it to the aria-label value." }, type: { type: "string", enum: ["button", "link", "menu", "voice-command", "icon-button"], description: "Interactive element kind, per HTML 5.3 button, anchor, and menu element semantics." }, icon: { type: "string", description: "Identifier of the icon displayed on the control, as a design-system icon name or asset path (e.g. 'trash', 'mdi-plus'). Set it when the control shows a glyph." }, disabled: { type: "boolean", description: "When true, the control is rendered but cannot be activated, corresponding to the HTML disabled attribute or aria-disabled. Set it only when the control is statically disabled; state-dependent disabling belongs on ExperienceState.disabledComponents." }, tooltip: { type: "string", description: "Short helper text shown on hover or focus, corresponding to the HTML title attribute or a tooltip component. Set it when the control's purpose is not obvious from its label or icon." }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Delivery channel for which this component is rendered." }, style: { type: "string", enum: ["primary", "secondary", "danger", "ghost", "link", "icon"], description: "Visual style variant of the action component, per design system button style conventions." }, validations: { type: "array", 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.", items: { type: "object", properties: { type: { type: "string", enum: ["required", "minlength", "maxlength", "pattern", "min", "max", "type", "custom"], 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." }, value: { type: "string", description: "Constraint threshold or parameter (e.g., '8' for minlength, '^[a-z]+$' for pattern)." }, message: { type: "string", description: "User-facing error message shown when this constraint is violated." } }, required: ["type", "message"], additionalProperties: !1 } } }
1017
1033
  }, NODE_TYPE_UX_ACTIONPATTERN = {
1018
1034
  specNodeId: "ux.actionpattern",
1019
1035
  layer: "ux",
@@ -1021,7 +1037,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1021
1037
  title: "ActionPattern",
1022
1038
  requiredAttributes: [],
1023
1039
  optionalAttributes: ["description", "category", "trigger", "feedback", "targetRef"],
1024
- attributeConstraints: { description: { type: "string" }, category: { type: "string", enum: ["crud", "navigation", "confirmation", "bulk-operation"], description: "Functional taxonomy of the action pattern." }, trigger: { type: "string", enum: ["click", "swipe", "voice", "keyboard"], description: "Input modality that initiates this action pattern." }, feedback: { type: "string", enum: ["toast", "animation", "route-change", "modal", "inline-message", "none"], description: "User-facing feedback mechanism invoked after the action completes." }, targetRef: { type: "string", description: "Optional specNodeId of the component or element this action pattern is applied to." } }
1040
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of the interaction sequence: what the user does, what feedback follows and in what order, and when the pattern applies. Set it whenever the name alone does not convey the steps, e.g. 'click delete \u2192 confirm modal \u2192 success toast'." }, category: { type: "string", enum: ["crud", "navigation", "confirmation", "bulk-operation"], description: "Functional taxonomy of the action pattern." }, trigger: { type: "string", enum: ["click", "swipe", "voice", "keyboard"], description: "Input modality that initiates this action pattern." }, feedback: { type: "string", enum: ["toast", "animation", "route-change", "modal", "inline-message", "none"], description: "User-facing feedback mechanism invoked after the action completes." }, targetRef: { type: "string", description: "Optional specNodeId of the component or element this action pattern is applied to." } }
1025
1041
  }, NODE_TYPE_UX_CHARTSERIES = {
1026
1042
  specNodeId: "ux.chartseries",
1027
1043
  layer: "ux",
@@ -1029,7 +1045,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1029
1045
  title: "ChartSeries",
1030
1046
  requiredAttributes: ["label", "dataField"],
1031
1047
  optionalAttributes: ["type", "categoryField", "color", "lineStyle"],
1032
- attributeConstraints: { label: { type: "string" }, type: { type: "string", enum: ["line", "bar", "column", "pie", "donut", "area", "scatter", "bubble", "heatmap"], description: "Visualization type for this data series." }, dataField: { type: "string", 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." }, categoryField: { type: "string", 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." }, color: { type: "string", description: "CSS color value for this series (e.g., '#3B82F6', 'var(--brand-primary)'). Overrides any theme-level color scheme for this specific series." }, lineStyle: { type: "string", enum: ["solid", "dashed", "dotted", "double", "none"], description: "CSS border/line style applied to line chart series rendering, per CSS Border specification." } }
1048
+ attributeConstraints: { label: { type: "string", description: "Human-readable series name shown in the chart legend and tooltips (e.g. 'Revenue 2024'). Set it on every series; it is required even when only one series is plotted, so the legend and screen readers can identify the series." }, type: { type: "string", enum: ["line", "bar", "column", "pie", "donut", "area", "scatter", "bubble", "heatmap"], description: "Visualization type for this data series." }, dataField: { type: "string", 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." }, categoryField: { type: "string", 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." }, color: { type: "string", description: "CSS color value for this series (e.g., '#3B82F6', 'var(--brand-primary)'). Overrides any theme-level color scheme for this specific series." }, lineStyle: { type: "string", enum: ["solid", "dashed", "dotted", "double", "none"], description: "CSS border/line style applied to line chart series rendering, per CSS Border specification." } }
1033
1049
  }, NODE_TYPE_UX_COMPONENTINSTANCE = {
1034
1050
  specNodeId: "ux.componentinstance",
1035
1051
  layer: "ux",
@@ -1061,7 +1077,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1061
1077
  title: "ErrorConfig",
1062
1078
  requiredAttributes: [],
1063
1079
  optionalAttributes: ["showNotification", "notificationType", "errorMessage", "defaultErrorMessage"],
1064
- attributeConstraints: { showNotification: { type: "boolean" }, notificationType: { type: "string", enum: ["success", "error", "warning", "info", "neutral"], description: "Severity category of the notification, aligned with ARIA live region and alert role semantics." }, errorMessage: { type: "string" }, defaultErrorMessage: { type: "string" } }
1080
+ attributeConstraints: { showNotification: { type: "boolean", description: "Boolean that, when true, surfaces the error as a transient notification (toast, snackbar or ARIA alert) in addition to or instead of inline display; set it when the failure should be announced outside the component's own area." }, notificationType: { type: "string", enum: ["success", "error", "warning", "info", "neutral"], description: "Severity category of the notification, aligned with ARIA live region and alert role semantics." }, errorMessage: { type: "string", description: "The specific user-facing message text, or i18n message key, shown for the error condition this configuration handles; set it when the failure has a known cause and tailored wording." }, defaultErrorMessage: { type: "string", description: "Fallback user-facing message text, or i18n message key, shown when no specific errorMessage applies or the underlying error carries no displayable message; set it to guarantee every failure shows some text." } }
1065
1081
  }, NODE_TYPE_UX_EXPERIENCESTATE = {
1066
1082
  specNodeId: "ux.experiencestate",
1067
1083
  layer: "ux",
@@ -1069,7 +1085,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1069
1085
  title: "ExperienceState",
1070
1086
  requiredAttributes: [],
1071
1087
  optionalAttributes: ["initial", "description", "channel", "onEnter", "onExit", "transitions", "enabledComponents", "disabledComponents", "hiddenComponents"],
1072
- attributeConstraints: { initial: { type: "boolean", description: "When true, marks this as the starting state of the state machine. Only one ExperienceState per state machine should have initial: true." }, description: { type: "string" }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Delivery channel context for this experience state." }, onEnter: { type: "array", description: "List of StateAction specNodeIds executed when entering this state (lifecycle: on-enter).", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, onExit: { type: "array", description: "List of StateAction specNodeIds executed when leaving this state (lifecycle: on-exit).", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, transitions: { type: "array", description: "List of StateTransition specNodeIds owned by this state, defining the outgoing edges of the state machine.", items: { type: "string", description: "SpecNodeId of a ux.statetransition node." } }, enabledComponents: { type: "array", description: "List of component specNodeIds that are interactive (enabled) when this state is active. Corresponds to ARIA aria-disabled=false.", items: { type: "string", description: "SpecNodeId of a component node." } }, disabledComponents: { type: "array", description: "List of component specNodeIds that are non-interactive (disabled) when this state is active. Corresponds to ARIA aria-disabled=true.", items: { type: "string", description: "SpecNodeId of a component node." } }, hiddenComponents: { type: "array", description: "List of component specNodeIds that are not rendered when this state is active. Corresponds to ARIA aria-hidden=true or display:none.", items: { type: "string", description: "SpecNodeId of a component node." } } }
1088
+ attributeConstraints: { initial: { type: "boolean", description: "When true, marks this as the starting state of the state machine. Only one ExperienceState per state machine should have initial: true." }, description: { type: "string", description: "Free-text explanation of what condition this state represents and what the user sees or can do while it is active; set it whenever the state name alone does not make the condition clear." }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Delivery channel context for this experience state." }, onEnter: { type: "array", description: "List of StateAction specNodeIds executed when entering this state (lifecycle: on-enter).", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, onExit: { type: "array", description: "List of StateAction specNodeIds executed when leaving this state (lifecycle: on-exit).", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, transitions: { type: "array", description: "List of StateTransition specNodeIds owned by this state, defining the outgoing edges of the state machine.", items: { type: "string", description: "SpecNodeId of a ux.statetransition node." } }, enabledComponents: { type: "array", description: "List of component specNodeIds that are interactive (enabled) when this state is active. Corresponds to ARIA aria-disabled=false.", items: { type: "string", description: "SpecNodeId of a component node." } }, disabledComponents: { type: "array", description: "List of component specNodeIds that are non-interactive (disabled) when this state is active. Corresponds to ARIA aria-disabled=true.", items: { type: "string", description: "SpecNodeId of a component node." } }, hiddenComponents: { type: "array", description: "List of component specNodeIds that are not rendered when this state is active. Corresponds to ARIA aria-hidden=true or display:none.", items: { type: "string", description: "SpecNodeId of a component node." } } }
1073
1089
  }, NODE_TYPE_UX_LAYOUTCONFIG = {
1074
1090
  specNodeId: "ux.layoutconfig",
1075
1091
  layer: "ux",
@@ -1077,7 +1093,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1077
1093
  title: "LayoutConfig",
1078
1094
  requiredAttributes: ["type"],
1079
1095
  optionalAttributes: ["columns", "rows", "gap", "rowGap", "columnGap", "padding", "margin", "maxWidth", "alignContent", "alignItems", "justifyContent", "justifyItems", "stickyPosition", "style", "labelPosition"],
1080
- attributeConstraints: { type: { type: "string", enum: ["grid", "flex", "block", "inline", "absolute", "sticky"], description: "CSS layout mode governing element positioning and flow, per CSS Flexbox/Grid specification." }, columns: { type: "integer" }, rows: { type: "integer" }, gap: { type: "string" }, rowGap: { type: "string" }, columnGap: { type: "string" }, padding: { type: "string" }, margin: { type: "string" }, maxWidth: { type: "string" }, alignContent: { type: "string", enum: ["flex-start", "flex-end", "center", "space-between", "space-around", "stretch"], description: "CSS align-content property value, per CSS Flexbox/Grid specification." }, alignItems: { type: "string", enum: ["flex-start", "flex-end", "center", "baseline", "stretch"], description: "CSS align-items property value, per CSS Flexbox/Grid specification." }, justifyContent: { type: "string", enum: ["flex-start", "flex-end", "center", "space-between", "space-around", "space-evenly"], description: "CSS justify-content property value, per CSS Flexbox/Grid specification." }, justifyItems: { type: "string", enum: ["flex-start", "flex-end", "center", "stretch", "baseline"], description: "CSS justify-items property value, per CSS Grid specification." }, stickyPosition: { type: "string", enum: ["top", "bottom", "left", "right", "none"], description: "Anchor edge for CSS position:sticky elements, per CSS Positioning specification." }, style: { type: "string", enum: ["card", "table", "list", "grid", "masonry", "split"], description: "Visual presentation style applied to the layout container." }, labelPosition: { type: "string", enum: ["top", "left", "right", "inline", "floating", "hidden"], description: "Placement of form field labels relative to their input elements, per HTML 5.3 label element positioning patterns." } }
1096
+ attributeConstraints: { type: { type: "string", enum: ["grid", "flex", "block", "inline", "absolute", "sticky"], description: "CSS layout mode governing element positioning and flow, per CSS Flexbox/Grid specification." }, columns: { type: "integer", description: "Number of explicit grid column tracks (the repeat count in grid-template-columns), as a positive integer; set when type is 'grid' or style is 'grid'/'masonry'." }, rows: { type: "integer", description: "Number of explicit grid row tracks (the repeat count in grid-template-rows), as a positive integer; set only when the grid has a fixed row count rather than auto-flowing rows." }, gap: { type: "string", description: "CSS gap shorthand giving uniform spacing between children as a CSS length or design token (e.g. '16px', '1rem', 'var(--space-md)'); set when row and column spacing are equal." }, rowGap: { type: "string", description: "CSS row-gap length giving vertical spacing between rows or wrapped flex lines (e.g. '24px'); set only to override gap for the row axis." }, columnGap: { type: "string", description: "CSS column-gap length giving horizontal spacing between columns or flex items (e.g. '12px'); set only to override gap for the column axis." }, padding: { type: "string", description: "CSS padding shorthand for inner spacing between the container edge and its children (e.g. '16px 24px'); set when the container defines its own inset." }, margin: { type: "string", description: "CSS margin shorthand for outer spacing around the container (e.g. '0 auto' for centring); set when the layout controls its own offset from siblings or parent." }, maxWidth: { type: "string", description: "CSS max-width value capping the container width (e.g. '1200px', '80ch', '100%'); set for constrained or centred content containers." }, alignContent: { type: "string", enum: ["flex-start", "flex-end", "center", "space-between", "space-around", "stretch"], description: "CSS align-content property value, per CSS Flexbox/Grid specification." }, alignItems: { type: "string", enum: ["flex-start", "flex-end", "center", "baseline", "stretch"], description: "CSS align-items property value, per CSS Flexbox/Grid specification." }, justifyContent: { type: "string", enum: ["flex-start", "flex-end", "center", "space-between", "space-around", "space-evenly"], description: "CSS justify-content property value, per CSS Flexbox/Grid specification." }, justifyItems: { type: "string", enum: ["flex-start", "flex-end", "center", "stretch", "baseline"], description: "CSS justify-items property value, per CSS Grid specification." }, stickyPosition: { type: "string", enum: ["top", "bottom", "left", "right", "none"], description: "Anchor edge for CSS position:sticky elements, per CSS Positioning specification." }, style: { type: "string", enum: ["card", "table", "list", "grid", "masonry", "split"], description: "Visual presentation style applied to the layout container." }, labelPosition: { type: "string", enum: ["top", "left", "right", "inline", "floating", "hidden"], description: "Placement of form field labels relative to their input elements, per HTML 5.3 label element positioning patterns." } }
1081
1097
  }, NODE_TYPE_UX_LIBRARYCOMPONENT = {
1082
1098
  specNodeId: "ux.librarycomponent",
1083
1099
  layer: "ux",
@@ -1085,7 +1101,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1085
1101
  title: "LibraryComponent",
1086
1102
  requiredAttributes: ["type"],
1087
1103
  optionalAttributes: ["label", "description", "category", "source", "props", "slots", "events"],
1088
- attributeConstraints: { type: { type: "string", enum: ["form", "table", "chart", "navigation", "feedback", "layout", "input", "display"], description: "UI component category used for library organization and component lookup." }, label: { type: "string" }, description: { type: "string" }, category: { type: "string", description: "Fine-grained categorization within the component type (e.g., 'data-grid', 'inline-form', 'bar-chart') for library browsing and search." }, source: { type: "object", description: "Distribution source for this component (npm package, git repository, or internal registry).", properties: { type: { type: "string", enum: ["npm", "git", "internal-registry"], description: "Distribution mechanism." }, identifier: { type: "string", description: "Package name, git URL, or registry path (e.g., '@org/ui-components', 'https://github.com/org/ui')." } }, additionalProperties: !1 }, props: { type: "array", description: "Schema of properties accepted by this component. Each entry defines an accepted prop with its name, type, and whether it is required.", items: { type: "object", properties: { name: { type: "string", description: "Prop identifier." }, type: { type: "string", enum: ["string", "number", "boolean", "object", "array"], description: "Data type of the prop value." }, required: { type: "boolean", description: "Whether this prop must be provided by consumers." }, default: { type: "string", description: "Default value as string; coerced to declared type at runtime." } }, required: ["name", "type"], additionalProperties: !1 } }, slots: { type: "array", description: "Named content slots this component exposes for composition, analogous to HTML slot elements in Web Components.", items: { type: "object", properties: { name: { type: "string", description: "Slot identifier referenced by ComponentReference.slot." }, description: { type: "string", description: "What content is expected in this slot." } }, required: ["name"], additionalProperties: !1 } }, events: { type: "array", description: "Custom events emitted by this component that consumers can listen to.", items: { type: "object", properties: { name: { type: "string", description: "Event name (e.g., 'row-selected', 'form-submitted')." }, description: { type: "string", description: "When this event fires and what payload it carries." } }, required: ["name"], additionalProperties: !1 } } }
1104
+ attributeConstraints: { type: { type: "string", enum: ["form", "table", "chart", "navigation", "feedback", "layout", "input", "display"], description: "UI component category used for library organization and component lookup." }, label: { type: "string", description: "Human-readable display name of the component as shown in the library catalogue or Storybook, such as 'Data Table'; set it when the specNodeId slug is not presentation-friendly." }, description: { type: "string", description: "Free-text summary of the component's purpose, intended usage and notable behaviour, written for library consumers; set it for every published component." }, category: { type: "string", description: "Fine-grained categorization within the component type (e.g., 'data-grid', 'inline-form', 'bar-chart') for library browsing and search." }, source: { type: "object", description: "Distribution source for this component (npm package, git repository, or internal registry).", properties: { type: { type: "string", enum: ["npm", "git", "internal-registry"], description: "Distribution mechanism." }, identifier: { type: "string", description: "Package name, git URL, or registry path (e.g., '@org/ui-components', 'https://github.com/org/ui')." } }, additionalProperties: !1 }, props: { type: "array", description: "Schema of properties accepted by this component. Each entry defines an accepted prop with its name, type, and whether it is required.", items: { type: "object", properties: { name: { type: "string", description: "Prop identifier." }, type: { type: "string", enum: ["string", "number", "boolean", "object", "array"], description: "Data type of the prop value." }, required: { type: "boolean", description: "Whether this prop must be provided by consumers." }, default: { type: "string", description: "Default value as string; coerced to declared type at runtime." } }, required: ["name", "type"], additionalProperties: !1 } }, slots: { type: "array", description: "Named content slots this component exposes for composition, analogous to HTML slot elements in Web Components.", items: { type: "object", properties: { name: { type: "string", description: "Slot identifier referenced by ComponentReference.slot." }, description: { type: "string", description: "What content is expected in this slot." } }, required: ["name"], additionalProperties: !1 } }, events: { type: "array", description: "Custom events emitted by this component that consumers can listen to.", items: { type: "object", properties: { name: { type: "string", description: "Event name (e.g., 'row-selected', 'form-submitted')." }, description: { type: "string", description: "When this event fires and what payload it carries." } }, required: ["name"], additionalProperties: !1 } } }
1089
1105
  }, NODE_TYPE_UX_LIBRARYSUBVIEW = {
1090
1106
  specNodeId: "ux.librarysubview",
1091
1107
  layer: "ux",
@@ -1093,7 +1109,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1093
1109
  title: "LibrarySubView",
1094
1110
  requiredAttributes: [],
1095
1111
  optionalAttributes: ["title", "description", "category", "components"],
1096
- attributeConstraints: { title: { type: "string" }, description: { type: "string" }, category: { type: "string", description: "Functional category grouping related sub-views within a library (e.g., 'forms', 'data-display', 'navigation', 'feedback')." }, components: { type: "array", description: "Ordered list of ComponentInstance specNodeIds that constitute this reusable sub-view composition.", items: { type: "string", description: "SpecNodeId of a ux.componentinstance node." } } }
1112
+ attributeConstraints: { title: { type: "string", description: "Human-readable display name of the reusable sub-view as shown in library catalogues or Storybook (e.g. 'Address Form Section'); set it whenever the sub-view is published in a UXLibrary." }, description: { type: "string", description: "Plain-text summary of the sub-view's purpose, its contained components and its intended embedding contexts; set it to help consumers choose between similar library sub-views." }, category: { type: "string", description: "Functional category grouping related sub-views within a library (e.g., 'forms', 'data-display', 'navigation', 'feedback')." }, components: { type: "array", description: "Ordered list of ComponentInstance specNodeIds that constitute this reusable sub-view composition.", items: { type: "string", description: "SpecNodeId of a ux.componentinstance node." } } }
1097
1113
  }, NODE_TYPE_UX_STATEACTION = {
1098
1114
  specNodeId: "ux.stateaction",
1099
1115
  layer: "ux",
@@ -1101,7 +1117,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1101
1117
  title: "StateAction",
1102
1118
  requiredAttributes: ["action"],
1103
1119
  optionalAttributes: ["description", "lifecycle", "timing"],
1104
- attributeConstraints: { action: { type: "string", enum: ["navigate", "submit", "open", "close", "dispatch", "validate"], description: "Operation executed during the state lifecycle." }, description: { type: "string" }, lifecycle: { type: "string", enum: ["on-enter", "on-exit", "on-transition"], 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." }, timing: { type: "string", enum: ["immediate", "deferred", "conditional"], 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." } }
1120
+ attributeConstraints: { action: { type: "string", enum: ["navigate", "submit", "open", "close", "dispatch", "validate"], description: "Operation executed during the state lifecycle." }, description: { type: "string", description: "Free-text explanation of what this bound action does in context (e.g. 'moves keyboard focus to the first invalid field after entering the review step'); set it whenever the action enum value and name alone do not convey the effect." }, lifecycle: { type: "string", enum: ["on-enter", "on-exit", "on-transition"], 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." }, timing: { type: "string", enum: ["immediate", "deferred", "conditional"], 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." } }
1105
1121
  }, NODE_TYPE_UX_STATEACTIONTEMPLATE = {
1106
1122
  specNodeId: "ux.stateactiontemplate",
1107
1123
  layer: "ux",
@@ -1109,7 +1125,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1109
1125
  title: "StateActionTemplate",
1110
1126
  requiredAttributes: ["action"],
1111
1127
  optionalAttributes: ["description", "parameters"],
1112
- attributeConstraints: { action: { type: "string", enum: ["navigate", "submit", "open", "close", "dispatch", "validate"], description: "Operation this template encapsulates. Must match a value from the StateAction action enum." }, description: { type: "string" }, parameters: { type: "array", 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.", items: { type: "object", properties: { name: { type: "string", description: "Parameter identifier used to reference it in the action (e.g., 'targetId', 'routePath')." }, type: { type: "string", enum: ["string", "number", "boolean"], description: "Expected data type of the parameter value." }, default: { type: "string", description: "Optional default value as a string; coerced to the declared type at runtime." } }, required: ["name", "type"], additionalProperties: !1 } } }
1128
+ attributeConstraints: { action: { type: "string", enum: ["navigate", "submit", "open", "close", "dispatch", "validate"], description: "Operation this template encapsulates. Must match a value from the StateAction action enum." }, description: { type: "string", description: "Free-text explanation of what the templated action does and what each parameter controls; set it whenever the template name alone does not make its behaviour and side effects clear." }, parameters: { type: "array", 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.", items: { type: "object", properties: { name: { type: "string", description: "Parameter identifier used to reference it in the action (e.g., 'targetId', 'routePath')." }, type: { type: "string", enum: ["string", "number", "boolean"], description: "Expected data type of the parameter value." }, default: { type: "string", description: "Optional default value as a string; coerced to the declared type at runtime." } }, required: ["name", "type"], additionalProperties: !1 } } }
1113
1129
  }, NODE_TYPE_UX_STATEPATTERN = {
1114
1130
  specNodeId: "ux.statepattern",
1115
1131
  layer: "ux",
@@ -1117,7 +1133,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1117
1133
  title: "StatePattern",
1118
1134
  requiredAttributes: [],
1119
1135
  optionalAttributes: ["description", "category", "states"],
1120
- attributeConstraints: { description: { type: "string" }, category: { type: "string", enum: ["navigation", "form", "data-loading", "authentication", "multi-step"], description: "Functional taxonomy of the reusable state machine pattern." }, states: { type: "array", description: "Ordered list of ExperienceState specNodeIds comprising this reusable pattern. The first entry is the initial state.", items: { type: "string", description: "specNodeId of an ExperienceState node belonging to this pattern." } } }
1136
+ attributeConstraints: { description: { type: "string", description: "A plain-text summary of the flow the pattern encodes: its states, the main transitions and the situations it fits. Set it whenever the pattern name alone does not make its behaviour clear." }, category: { type: "string", enum: ["navigation", "form", "data-loading", "authentication", "multi-step"], description: "Functional taxonomy of the reusable state machine pattern." }, states: { type: "array", description: "Ordered list of ExperienceState specNodeIds comprising this reusable pattern. The first entry is the initial state.", items: { type: "string", description: "specNodeId of an ExperienceState node belonging to this pattern." } } }
1121
1137
  }, NODE_TYPE_UX_STATETRANSITION = {
1122
1138
  specNodeId: "ux.statetransition",
1123
1139
  layer: "ux",
@@ -1125,7 +1141,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1125
1141
  title: "StateTransition",
1126
1142
  requiredAttributes: ["trigger"],
1127
1143
  optionalAttributes: ["to", "description", "actions", "guard"],
1128
- attributeConstraints: { to: { type: "string", description: "SpecNodeId of the destination ExperienceState this transition leads to (e.g., 'ux.experiencestate.order-confirmed')." }, trigger: { type: "string", enum: ["click", "hover", "focus", "blur", "change", "submit", "load", "swipe", "voice-command"], description: "DOM or UX event that initiates this state transition, per HTML 5.3 event model." }, description: { type: "string" }, actions: { type: "array", description: "List of StateAction specNodeIds to execute when this transition fires, in order.", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, guard: { type: "object", description: "Optional boolean guard condition that must evaluate to true for this transition to fire.", properties: { expression: { type: "string", description: "Boolean expression string evaluated against current state context." }, syntax: { type: "string", enum: ["javascript", "jsonpath", "cel", "jsonata"], 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').` } }, required: ["expression", "syntax"], additionalProperties: !1 } }
1144
+ attributeConstraints: { to: { type: "string", description: "SpecNodeId of the destination ExperienceState this transition leads to (e.g., 'ux.experiencestate.order-confirmed')." }, trigger: { type: "string", enum: ["click", "hover", "focus", "blur", "change", "submit", "load", "swipe", "voice-command"], description: "DOM or UX event that initiates this state transition, per HTML 5.3 event model." }, description: { type: "string", description: "A plain-language sentence saying what user event moves the experience from the source state to the destination and why. Example: 'User submits valid payment form; moves to processing'. Set it whenever the trigger, guard or destination does not make the transition's intent obvious on its own." }, actions: { type: "array", description: "List of StateAction specNodeIds to execute when this transition fires, in order.", items: { type: "string", description: "SpecNodeId of a ux.stateaction node." } }, guard: { type: "object", description: "Optional boolean guard condition that must evaluate to true for this transition to fire.", properties: { expression: { type: "string", description: "Boolean expression string evaluated against current state context." }, syntax: { type: "string", enum: ["javascript", "jsonpath", "cel", "jsonata"], 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').` } }, required: ["expression", "syntax"], additionalProperties: !1 } }
1129
1145
  }, NODE_TYPE_UX_SUBVIEW = {
1130
1146
  specNodeId: "ux.subview",
1131
1147
  layer: "ux",
@@ -1133,7 +1149,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1133
1149
  title: "SubView",
1134
1150
  requiredAttributes: [],
1135
1151
  optionalAttributes: ["title", "description", "order", "ref"],
1136
- attributeConstraints: { title: { type: "string" }, description: { type: "string" }, order: { type: "integer", 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)." }, ref: { type: "string", 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." } }
1152
+ attributeConstraints: { title: { type: "string", description: "Human-readable heading or name of the fragment as shown to users or designers (e.g. 'Order Filters'). Set it when the region has a visible heading or a recognisable name in design artifacts." }, description: { type: "string", description: "Free-text explanation of what the fragment displays and what it is for within its parent View. Set it when the title alone does not make the region's content or behaviour clear." }, order: { type: "integer", 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)." }, ref: { type: "string", 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." } }
1137
1153
  }, NODE_TYPE_UX_TABLECOLUMN = {
1138
1154
  specNodeId: "ux.tablecolumn",
1139
1155
  layer: "ux",
@@ -1141,7 +1157,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1141
1157
  title: "TableColumn",
1142
1158
  requiredAttributes: ["header", "field"],
1143
1159
  optionalAttributes: ["width", "minWidth", "maxWidth", "filterType", "textAlign", "displayType", "defaultSortDirection"],
1144
- attributeConstraints: { header: { type: "string" }, field: { type: "string" }, width: { type: "string" }, minWidth: { type: "string" }, maxWidth: { type: "string" }, filterType: { type: "string", enum: ["equals", "contains", "startsWith", "endsWith", "range", "multiselect", "boolean"], description: "Filter operation type available for this column, per HTML 5.3 form input filter patterns." }, textAlign: { type: "string", enum: ["left", "right", "center", "justify", "start", "end"], description: "CSS text-align value for cell content, per CSS Text specification." }, displayType: { type: "string", enum: ["text", "badge", "icon", "link", "image", "boolean", "date", "currency", "actions"], description: "Rendering type that controls how cell values are visually presented." }, defaultSortDirection: { type: "string", enum: ["asc", "desc", "none"], description: "Default sort direction applied to this column when first sorted." } }
1160
+ attributeConstraints: { header: { type: "string", description: "User-visible text rendered in the column's header cell (the th content), e.g. 'Order Date'; set for every column, using an empty string or accessible label for icon-only or actions columns." }, field: { type: "string", description: "Key or dot-notation path of the property in each row record whose value populates this column's cells (e.g. 'customer.name'); set for every column and formalize via maps-to relationships to data-model or data-store fields." }, width: { type: "string", description: "Preferred column width as a CSS length or percentage (e.g. '160px', '20%', 'auto'); set when the column should not size automatically from content." }, minWidth: { type: "string", description: "Minimum CSS width the column may shrink to during resizing or responsive layout (e.g. '80px'); set when content would become unreadable below a threshold." }, maxWidth: { type: "string", description: "Maximum CSS width the column may grow to during resizing or flexible layout (e.g. '400px'); set to stop long text columns from dominating the table." }, filterType: { type: "string", enum: ["equals", "contains", "startsWith", "endsWith", "range", "multiselect", "boolean"], description: "Filter operation type available for this column, per HTML 5.3 form input filter patterns." }, textAlign: { type: "string", enum: ["left", "right", "center", "justify", "start", "end"], description: "CSS text-align value for cell content, per CSS Text specification." }, displayType: { type: "string", enum: ["text", "badge", "icon", "link", "image", "boolean", "date", "currency", "actions"], description: "Rendering type that controls how cell values are visually presented." }, defaultSortDirection: { type: "string", enum: ["asc", "desc", "none"], description: "Default sort direction applied to this column when first sorted." } }
1145
1161
  }, NODE_TYPE_UX_TRANSITIONTEMPLATE = {
1146
1162
  specNodeId: "ux.transitiontemplate",
1147
1163
  layer: "ux",
@@ -1149,7 +1165,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1149
1165
  title: "TransitionTemplate",
1150
1166
  requiredAttributes: ["to", "trigger"],
1151
1167
  optionalAttributes: ["description", "animationType", "duration", "easing"],
1152
- attributeConstraints: { to: { type: "string" }, trigger: { type: "string" }, description: { type: "string" }, animationType: { type: "string", enum: ["fade", "slide", "scale", "bounce", "none"], description: "Motion animation category applied during this transition." }, duration: { type: "string", description: "CSS transition duration (e.g., '300ms', '0.5s'), per CSS Transitions specification." }, easing: { type: "string", description: "CSS timing function controlling the transition's acceleration curve (e.g., 'ease-in-out', 'cubic-bezier(0.4, 0, 0.2, 1)')." } }
1168
+ attributeConstraints: { to: { type: "string", description: "The target end state of the animation: a specNodeId of the ExperienceState, View or SubView being entered, or a generic lifecycle target such as 'enter' or 'leave'. Set it to the narrowest target the template is meant for." }, trigger: { type: "string", description: "The event or change that starts the animation, e.g. 'route-change', 'state-change', 'mount', 'unmount', or a DOM event name such as 'click'. Set it so the template can be matched to the transitions it governs." }, description: { type: "string", description: "Free-text summary of the motion's intent and visual effect (e.g. 'modal slides up from bottom and fades in'). Set it whenever the name alone does not convey the effect." }, animationType: { type: "string", enum: ["fade", "slide", "scale", "bounce", "none"], description: "Motion animation category applied during this transition." }, duration: { type: "string", description: "CSS transition duration (e.g., '300ms', '0.5s'), per CSS Transitions specification." }, easing: { type: "string", description: "CSS timing function controlling the transition's acceleration curve (e.g., 'ease-in-out', 'cubic-bezier(0.4, 0, 0.2, 1)')." } }
1153
1169
  }, NODE_TYPE_UX_UXAPPLICATION = {
1154
1170
  specNodeId: "ux.uxapplication",
1155
1171
  layer: "ux",
@@ -1157,7 +1173,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1157
1173
  title: "UXApplication",
1158
1174
  requiredAttributes: ["channel"],
1159
1175
  optionalAttributes: ["version", "description", "experiences", "theme", "designSystem", "defaultLocale"],
1160
- attributeConstraints: { version: { type: "string" }, description: { type: "string" }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Primary delivery channel this application targets. Multi-channel products use one UXApplication per channel, each referencing channel-specific UXSpecs." }, experiences: { type: "array", description: "List of UXSpec specNodeIds that comprise the user experiences of this application.", items: { type: "string", description: "SpecNodeId of a ux.uxspec node." } }, theme: { type: "string", description: "Design token theme identifier applied application-wide (e.g., 'brand-light', 'brand-dark', 'high-contrast')." }, designSystem: { type: "string", description: "Identifier of the design system or UXLibrary this application uses (e.g., specNodeId of a ux.uxlibrary node)." }, defaultLocale: { type: "string", description: "Default locale for internationalization, as a BCP 47 language tag (e.g., 'en-US', 'fr-FR', 'ja-JP')." } }
1176
+ attributeConstraints: { version: { type: "string", description: "Release version of the application as shipped to users, typically a semantic version string (e.g. '2.3.1') taken from package.json, the app manifest or store listing; set it when the app is versioned independently of its UXSpecs." }, description: { type: "string", description: "Free-text summary of the application's purpose and audience (e.g. 'Customer self-service web portal'); set it to distinguish this application from others on the same channel." }, channel: { type: "string", enum: ["web", "mobile", "voice", "chat", "sms"], description: "Primary delivery channel this application targets. Multi-channel products use one UXApplication per channel, each referencing channel-specific UXSpecs." }, experiences: { type: "array", description: "List of UXSpec specNodeIds that comprise the user experiences of this application.", items: { type: "string", description: "SpecNodeId of a ux.uxspec node." } }, theme: { type: "string", description: "Design token theme identifier applied application-wide (e.g., 'brand-light', 'brand-dark', 'high-contrast')." }, designSystem: { type: "string", description: "Identifier of the design system or UXLibrary this application uses (e.g., specNodeId of a ux.uxlibrary node)." }, defaultLocale: { type: "string", description: "Default locale for internationalization, as a BCP 47 language tag (e.g., 'en-US', 'fr-FR', 'ja-JP')." } }
1161
1177
  }, NODE_TYPE_UX_UXLIBRARY = {
1162
1178
  specNodeId: "ux.uxlibrary",
1163
1179
  layer: "ux",
@@ -1165,7 +1181,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1165
1181
  title: "UXLibrary",
1166
1182
  requiredAttributes: ["version"],
1167
1183
  optionalAttributes: ["description", "author", "license", "components", "subViews", "statePatterns", "actionPatterns", "source"],
1168
- attributeConstraints: { version: { type: "string" }, description: { type: "string" }, author: { type: "string" }, license: { type: "string" }, components: { type: "array", description: "List of ux.librarycomponent specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.librarycomponent node." } }, subViews: { type: "array", description: "List of ux.librarysubview specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.librarysubview node." } }, statePatterns: { type: "array", description: "List of ux.statepattern specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.statepattern node." } }, actionPatterns: { type: "array", description: "List of ux.actionpattern specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.actionpattern node." } }, source: { type: "object", description: "Distribution source for this library package.", properties: { type: { type: "string", enum: ["npm", "git", "internal-registry"], description: "Distribution mechanism: 'npm' for a published npm package, 'git' for a git repository URL, 'internal-registry' for a private artifact registry." }, identifier: { type: "string", description: "Package name, git URL, or registry path (e.g., '@org/design-system', 'https://github.com/org/ds', 'registry.internal/ux-lib')." } }, additionalProperties: !1 } }
1184
+ attributeConstraints: { version: { type: "string", description: "Release version of the library package, normally a semantic version string (e.g. '2.4.1') matching the package manifest; always set, and update it whenever the exported set or its contracts change." }, description: { type: "string", description: "Short plain-text summary of the library's scope and intended consumers (e.g. 'Internal admin design system'); set it when the name alone does not convey what the library covers." }, author: { type: "string", description: "Person, team or organisation that owns and maintains the library, as recorded in the package manifest or ownership file; set it to identify who to contact for changes." }, license: { type: "string", description: "License under which the library is distributed, preferably as an SPDX identifier (e.g. 'MIT', 'Apache-2.0', or 'UNLICENSED' for proprietary); set it when the library is shared beyond a single codebase or sourced from a third party." }, components: { type: "array", description: "List of ux.librarycomponent specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.librarycomponent node." } }, subViews: { type: "array", description: "List of ux.librarysubview specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.librarysubview node." } }, statePatterns: { type: "array", description: "List of ux.statepattern specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.statepattern node." } }, actionPatterns: { type: "array", description: "List of ux.actionpattern specNodeIds exported by this library.", items: { type: "string", description: "SpecNodeId of a ux.actionpattern node." } }, source: { type: "object", description: "Distribution source for this library package.", properties: { type: { type: "string", enum: ["npm", "git", "internal-registry"], description: "Distribution mechanism: 'npm' for a published npm package, 'git' for a git repository URL, 'internal-registry' for a private artifact registry." }, identifier: { type: "string", description: "Package name, git URL, or registry path (e.g., '@org/design-system', 'https://github.com/org/ds', 'registry.internal/ux-lib')." } }, additionalProperties: !1 } }
1169
1185
  }, NODE_TYPE_UX_UXSPEC = {
1170
1186
  specNodeId: "ux.uxspec",
1171
1187
  layer: "ux",
@@ -1173,7 +1189,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1173
1189
  title: "UXSpec",
1174
1190
  requiredAttributes: [],
1175
1191
  optionalAttributes: ["version", "experience", "title", "description", "source", "views", "states"],
1176
- attributeConstraints: { version: { type: "string" }, experience: { type: "string", enum: ["visual", "voice", "chat", "sms"], description: "Delivery modality this spec describes. 'visual': screen-based UI; 'voice': voice assistant interface; 'chat': conversational messaging UI; 'sms': text message-based interaction." }, title: { type: "string" }, description: { type: "string" }, source: { type: "object", description: "Reference to the design artifact (e.g., Figma file, Storybook, or internal design system URL) that this spec is based on.", properties: { type: { type: "string", enum: ["figma", "storybook", "zeplin", "url"], description: "Design tool or artifact type." }, url: { type: "string", description: "URL to the design artifact." } }, additionalProperties: !1 }, views: { type: "array", description: "List of ux.view specNodeIds that comprise the routable screens of this experience.", items: { type: "string", description: "SpecNodeId of a ux.view node." } }, states: { type: "array", description: "List of ux.experiencestate specNodeIds that represent the top-level states of this experience's state machine.", items: { type: "string", description: "SpecNodeId of a ux.experiencestate node." } } }
1192
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this experience specification, preferably semantic versioning (e.g. '1.2.0'); set it when the spec is released or revised independently of the application." }, experience: { type: "string", enum: ["visual", "voice", "chat", "sms"], description: "Delivery modality this spec describes. 'visual': screen-based UI; 'voice': voice assistant interface; 'chat': conversational messaging UI; 'sms': text message-based interaction." }, title: { type: "string", description: "Human-readable name of the experience (e.g. 'Checkout', 'Account Onboarding') used in documentation and diagrams; set it on every spec." }, description: { type: "string", description: "Free-text summary of the user goal and scope this experience covers, including which journeys are in or out of scope; set it whenever the title alone does not make the boundary clear." }, source: { type: "object", description: "Reference to the design artifact (e.g., Figma file, Storybook, or internal design system URL) that this spec is based on.", properties: { type: { type: "string", enum: ["figma", "storybook", "zeplin", "url"], description: "Design tool or artifact type." }, url: { type: "string", description: "URL to the design artifact." } }, additionalProperties: !1 }, views: { type: "array", description: "List of ux.view specNodeIds that comprise the routable screens of this experience.", items: { type: "string", description: "SpecNodeId of a ux.view node." } }, states: { type: "array", description: "List of ux.experiencestate specNodeIds that represent the top-level states of this experience's state machine.", items: { type: "string", description: "SpecNodeId of a ux.experiencestate node." } } }
1177
1193
  }, NODE_TYPE_UX_VIEW = {
1178
1194
  specNodeId: "ux.view",
1179
1195
  layer: "ux",
@@ -1181,7 +1197,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1181
1197
  title: "View",
1182
1198
  requiredAttributes: ["type"],
1183
1199
  optionalAttributes: ["title", "description", "routable", "layout", "source"],
1184
- attributeConstraints: { type: { type: "string", enum: ["page", "modal", "dialog", "drawer", "panel", "overlay", "embedded", "full-screen"], description: "View display mode, per HTML 5.3 sectioning and dialog element semantics." }, title: { type: "string" }, description: { type: "string" }, routable: { type: "boolean" }, layout: { type: "string" }, source: { type: "object", description: "Source code reference" } }
1200
+ attributeConstraints: { type: { type: "string", enum: ["page", "modal", "dialog", "drawer", "panel", "overlay", "embedded", "full-screen"], description: "View display mode, per HTML 5.3 sectioning and dialog element semantics." }, title: { type: "string", description: "Human-readable title shown to users for this view, typically the document <title>, page heading, or dialog header; set it whenever the screen displays or announces a title." }, description: { type: "string", description: "Free-text summary of the view's purpose and main content for modellers and reviewers; set it when the name and title alone do not convey what the screen is for." }, routable: { type: "boolean", description: "True when the view can be reached directly through a URL or navigation route; false for views such as modals or overlays that only open programmatically from another view." }, layout: { type: "string", description: "Identifier or name of the layout template or shell (e.g. 'two-column', 'dashboard-shell') this view renders within; set it when the view uses a named layout, and prefer an applies relationship to a ux.layoutconfig for formal binding." }, source: { type: "object", description: "Source code reference" } }
1185
1201
  }, NODE_TYPE_NAVIGATION_BREADCRUMBCONFIG = {
1186
1202
  specNodeId: "navigation.breadcrumbconfig",
1187
1203
  layer: "navigation",
@@ -1189,7 +1205,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1189
1205
  title: "BreadcrumbConfig",
1190
1206
  requiredAttributes: ["label"],
1191
1207
  optionalAttributes: ["labelTemplate", "showHome", "homeLabel", "homeRoute"],
1192
- attributeConstraints: { label: { type: "string" }, labelTemplate: { type: "string", description: "Template string for dynamic label generation using {title} placeholder syntax to interpolate route metadata. Used when breadcrumb labels need to vary by route context rather than a static label." }, showHome: { type: "boolean" }, homeLabel: { type: "string" }, homeRoute: { type: "string" } }
1208
+ attributeConstraints: { label: { type: "string", description: "Default static text for breadcrumb items in this scope. It is used when neither labelTemplate nor a route's own breadcrumb meta yields a label, or it names the scope's root segment." }, labelTemplate: { type: "string", description: "Template string for dynamic label generation using {title} placeholder syntax to interpolate route metadata. Used when breadcrumb labels need to vary by route context rather than a static label." }, showHome: { type: "boolean", description: "Boolean that, when true, prepends a home link as the first breadcrumb item. Set it to false when the trail should start at the current section." }, homeLabel: { type: "string", description: "Display text for the home breadcrumb item, such as 'Home' or an i18n key. It is meaningful only when showHome is true." }, homeRoute: { type: "string", description: "Route ID or URL path, such as 'home' or '/', that the home breadcrumb item links to. It is meaningful only when showHome is true and should resolve to a declared Route." } }
1193
1209
  }, NODE_TYPE_NAVIGATION_CONTEXTVARIABLE = {
1194
1210
  specNodeId: "navigation.contextvariable",
1195
1211
  layer: "navigation",
@@ -1197,7 +1213,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1197
1213
  title: "ContextVariable",
1198
1214
  requiredAttributes: ["schemaRef", "scope", "persistedIn"],
1199
1215
  optionalAttributes: ["defaultValue", "required"],
1200
- attributeConstraints: { schemaRef: { type: "string" }, scope: { type: "string", enum: ["global", "flow", "step", "session"], description: "Lifetime and visibility of the variable across navigation flow execution." }, persistedIn: { type: "string", enum: ["sessionStorage", "localStorage", "memory", "url-param"], description: "Storage mechanism used to persist the variable across route transitions: sessionStorage (browser session), localStorage (cross-session), memory (in-process only), url-param (serialized into the URL query string)." }, defaultValue: { type: "string" }, required: { type: "boolean", description: "When true, the flow cannot proceed if this variable is unset or null. Used to enforce mandatory input collection before advancing to dependent steps." } }
1216
+ attributeConstraints: { schemaRef: { type: "string", description: "Reference (ID or URI) to the data-model JSON Schema or application DataObject that defines the variable's type and shape, e.g. 'data-model.jsonschema.shipping-address'. Always set, so steps and guards can validate the value." }, scope: { type: "string", enum: ["global", "flow", "step", "session"], description: "Lifetime and visibility of the variable across navigation flow execution." }, persistedIn: { type: "string", enum: ["sessionStorage", "localStorage", "memory", "url-param"], description: "Storage mechanism used to persist the variable across route transitions: sessionStorage (browser session), localStorage (cross-session), memory (in-process only), url-param (serialized into the URL query string)." }, defaultValue: { type: "string", description: "Serialized initial value (literal or JSON string conforming to schemaRef) assigned when the flow or scope starts before any step writes the variable. Omit when the variable must be explicitly collected, typically when required is true." }, required: { type: "boolean", description: "When true, the flow cannot proceed if this variable is unset or null. Used to enforce mandatory input collection before advancing to dependent steps." } }
1201
1217
  }, NODE_TYPE_NAVIGATION_FLOWSTEP = {
1202
1218
  specNodeId: "navigation.flowstep",
1203
1219
  layer: "navigation",
@@ -1205,7 +1221,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1205
1221
  title: "FlowStep",
1206
1222
  requiredAttributes: ["sequence", "route"],
1207
1223
  optionalAttributes: ["description", "required", "waitBehavior"],
1208
- attributeConstraints: { sequence: { type: "integer" }, route: { type: "string" }, description: { type: "string" }, required: { type: "boolean" }, waitBehavior: { type: "string", enum: ["blocking", "non-blocking", "timeout", "async"], description: "Execution model governing how the flow waits for this step to complete before advancing." } }
1224
+ attributeConstraints: { sequence: { type: "integer", description: "Integer position of the step within its NavigationFlow, starting at 1 and unique within the flow, that sets traversal order; always set it, taking the value from the array index or explicit step number in code." }, route: { type: "string", description: "Identifier or path of the navigation.route the user visits at this step (e.g. 'checkout-payment' or '/checkout/payment'); set it to the route ID where one exists, otherwise to the literal path." }, description: { type: "string", description: "Free-text summary of what the user accomplishes at this step (e.g. 'enter shipping address'); set it when the route name alone does not convey the step's purpose." }, required: { type: "boolean", description: "Boolean flag; true means the flow cannot advance past this step without completing it, and false means the step may be skipped. Set it to false for steps marked optional or skippable in code." }, waitBehavior: { type: "string", enum: ["blocking", "non-blocking", "timeout", "async"], description: "Execution model governing how the flow waits for this step to complete before advancing." } }
1209
1225
  }, NODE_TYPE_NAVIGATION_GUARDACTION = {
1210
1226
  specNodeId: "navigation.guardaction",
1211
1227
  layer: "navigation",
@@ -1229,7 +1245,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1229
1245
  title: "NavigationFlow",
1230
1246
  requiredAttributes: [],
1231
1247
  optionalAttributes: ["description", "source"],
1232
- attributeConstraints: { description: { type: "string" }, source: { type: "object", description: "Source code reference" } }
1248
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of the user process the flow realizes, naming its purpose, its entry and exit steps and its completion outcome (e.g. 'Guest checkout from cart review to order confirmation'); set it whenever the flow's name alone does not convey its scope." }, source: { type: "object", description: "Source code reference" } }
1233
1249
  }, NODE_TYPE_NAVIGATION_NAVIGATIONGRAPH = {
1234
1250
  specNodeId: "navigation.navigationgraph",
1235
1251
  layer: "navigation",
@@ -1237,7 +1253,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1237
1253
  title: "NavigationGraph",
1238
1254
  requiredAttributes: ["version", "application"],
1239
1255
  optionalAttributes: ["description"],
1240
- attributeConstraints: { version: { type: "string" }, application: { type: "string", description: "Reference to the Layer 4 ApplicationComponent that this navigation graph belongs to, enabling cross-layer traceability from routing to application architecture." }, description: { type: "string" } }
1256
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this navigation model, such as a semver string matching the application release or route-table revision it reflects. Set it whenever the graph is extracted or published, so that changes to the routing structure can be tracked over time." }, application: { type: "string", description: "Reference to the Layer 4 ApplicationComponent that this navigation graph belongs to, enabling cross-layer traceability from routing to application architecture." }, description: { type: "string", description: "Free-text summary of the graph's scope: which application or router instance it covers and any notable boundaries, such as excluded micro-frontends or admin sub-apps. Set it when the scope is not obvious from the application reference." } }
1241
1257
  }, NODE_TYPE_NAVIGATION_NAVIGATIONGUARD = {
1242
1258
  specNodeId: "navigation.navigationguard",
1243
1259
  layer: "navigation",
@@ -1245,7 +1261,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1245
1261
  title: "NavigationGuard",
1246
1262
  requiredAttributes: ["type", "order"],
1247
1263
  optionalAttributes: ["description", "source"],
1248
- attributeConstraints: { type: { type: "string", enum: ["auth", "role", "permission", "feature-flag", "custom"], description: "Classification of the guard mechanism: auth (authentication check), role (role membership), permission (fine-grained permission), feature-flag (feature toggle), custom (arbitrary condition)." }, description: { type: "string" }, order: { type: "integer" }, source: { type: "object", description: "Source code reference" } }
1264
+ attributeConstraints: { type: { type: "string", enum: ["auth", "role", "permission", "feature-flag", "custom"], description: "Classification of the guard mechanism: auth (authentication check), role (role membership), permission (fine-grained permission), feature-flag (feature toggle), custom (arbitrary condition)." }, description: { type: "string", description: "Free-text summary of the access policy the guard enforces and the routes or flows it protects, e.g. 'Blocks admin routes for users without the admin role'; set whenever the guard's purpose is not obvious from its type and name." }, order: { type: "integer", description: "Non-negative integer execution priority among guards protecting the same route, evaluated lowest value first; derive it from registration order in the router (array position in canActivate, beforeEach registration sequence) and set it whenever more than one guard can apply." }, source: { type: "object", description: "Source code reference" } }
1249
1265
  }, NODE_TYPE_NAVIGATION_NAVIGATIONTRANSITION = {
1250
1266
  specNodeId: "navigation.navigationtransition",
1251
1267
  layer: "navigation",
@@ -1253,7 +1269,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1253
1269
  title: "NavigationTransition",
1254
1270
  requiredAttributes: ["from", "to", "trigger"],
1255
1271
  optionalAttributes: ["description"],
1256
- attributeConstraints: { from: { type: "string" }, to: { type: "string" }, trigger: { type: "string", enum: ["user-click", "programmatic", "timeout", "browser-back", "redirect"], description: "Mechanism that initiates the route transition: user-click (explicit user interaction), programmatic (code-driven), timeout (time-based), browser-back (browser history navigation), redirect (automatic server/guard redirect)." }, description: { type: "string" } }
1272
+ attributeConstraints: { from: { type: "string", description: "Identifier (Route ID or path pattern) of the source Route from which the transition starts; set to the route whose view or config contains the link, call, or redirect, or to '*' only when the transition can be fired from any route." }, to: { type: "string", description: "Identifier (Route ID or path pattern, with parameter placeholders such as '/orders/:id') of the destination Route that becomes active once the transition completes; always set to a Route defined in the same NavigationGraph." }, trigger: { type: "string", enum: ["user-click", "programmatic", "timeout", "browser-back", "redirect"], description: "Mechanism that initiates the route transition: user-click (explicit user interaction), programmatic (code-driven), timeout (time-based), browser-back (browser history navigation), redirect (automatic server/guard redirect)." }, description: { type: "string", description: "Free-text explanation of when and why the transition occurs, such as the UI control or business event that fires it; set when the trigger alone does not make the user intent clear." } }
1257
1273
  }, NODE_TYPE_NAVIGATION_ROUTE = {
1258
1274
  specNodeId: "navigation.route",
1259
1275
  layer: "navigation",
@@ -1261,7 +1277,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1261
1277
  title: "Route",
1262
1278
  requiredAttributes: ["type"],
1263
1279
  optionalAttributes: ["title", "description", "source"],
1264
- attributeConstraints: { title: { type: "string" }, description: { type: "string" }, type: { type: "string", enum: ["public", "protected", "redirect", "alias", "lazy"], description: "Access and loading classification: public (no auth), protected (requires auth), redirect (auto-forwards), alias (multiple paths to same component), lazy (code-split, loaded on demand)." }, source: { type: "object", description: "Source code reference" } }
1280
+ attributeConstraints: { title: { type: "string", description: "Human-readable page title for the route, usually taken from route meta or document.title, used for headings, tab titles and default breadcrumb text. Set it when the route renders a user-visible page." }, description: { type: "string", description: "Free-text prose explaining what the route displays and why a user reaches it. Set it when the path and title alone do not convey the route's purpose." }, type: { type: "string", enum: ["public", "protected", "redirect", "alias", "lazy"], description: "Access and loading classification: public (no auth), protected (requires auth), redirect (auto-forwards), alias (multiple paths to same component), lazy (code-split, loaded on demand)." }, source: { type: "object", description: "Source code reference" } }
1265
1281
  }, NODE_TYPE_NAVIGATION_ROUTEMETA = {
1266
1282
  specNodeId: "navigation.routemeta",
1267
1283
  layer: "navigation",
@@ -1293,7 +1309,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1293
1309
  title: "ExporterConfig",
1294
1310
  requiredAttributes: ["type", "endpoint"],
1295
1311
  optionalAttributes: ["enabled", "protocol", "authType", "compression"],
1296
- attributeConstraints: { type: { type: "string", enum: ["otlp", "jaeger", "zipkin", "prometheus", "stdout", "logging"], description: "The type of exporter" }, enabled: { type: "boolean" }, endpoint: { type: "string" }, protocol: { type: "string" }, authType: { type: "string", enum: ["none", "api_key", "bearer", "tls_client_cert", "basic"], description: "Authentication method used for the export destination" }, compression: { type: "string", enum: ["none", "gzip"], description: "Compression algorithm for OTLP export payloads. Applies to OTLP exporters only." } }
1312
+ attributeConstraints: { type: { type: "string", enum: ["otlp", "jaeger", "zipkin", "prometheus", "stdout", "logging"], description: "The type of exporter" }, enabled: { type: "boolean", description: "Whether this exporter is active and receives telemetry; set to false to keep the configuration defined but disabled (e.g. per environment), defaulting to true when omitted." }, endpoint: { type: "string", description: "URL or host:port of the export destination (e.g. 'http://otel-collector:4318/v1/traces' or 'collector:4317'); for pull-based exporters such as Prometheus it is the local listen address scraped by the backend, and for stdout/logging it may be 'stdout'." }, protocol: { type: "string", description: "Wire transport and encoding used to deliver data, using OTel values 'grpc', 'http/protobuf' or 'http/json' for OTLP, or the exporter-native transport (e.g. 'thrift' for Jaeger); set whenever the exporter supports more than one protocol." }, authType: { type: "string", enum: ["none", "api_key", "bearer", "tls_client_cert", "basic"], description: "Authentication method used for the export destination" }, compression: { type: "string", enum: ["none", "gzip"], description: "Compression algorithm for OTLP export payloads. Applies to OTLP exporters only." } }
1297
1313
  }, NODE_TYPE_APM_INSTRUMENTATIONCONFIG = {
1298
1314
  specNodeId: "apm.instrumentationconfig",
1299
1315
  layer: "apm",
@@ -1301,7 +1317,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1301
1317
  title: "InstrumentationConfig",
1302
1318
  requiredAttributes: ["type"],
1303
1319
  optionalAttributes: ["libraryName", "enabled", "description", "instrumentationType"],
1304
- attributeConstraints: { type: { type: "string" }, libraryName: { type: "string", description: "OTel InstrumentationScope-compatible library name identifying the instrumented library or framework (e.g., 'io.opentelemetry.spring-webmvc-6.0'). Used to correlate this config with telemetry emitted under the matching InstrumentationScope." }, enabled: { type: "boolean" }, description: { type: "string" }, instrumentationType: { type: "string", enum: ["automatic", "manual", "both"], description: "Whether instrumentation is applied automatically, manually, or both" } }
1320
+ attributeConstraints: { type: { type: "string", description: "Category of the instrumented target, as a short lowercase label such as 'http', 'database', 'messaging', 'rpc', 'framework' or 'runtime'; set it on every instance to group instrumentation by technology." }, libraryName: { type: "string", description: "OTel InstrumentationScope-compatible library name identifying the instrumented library or framework (e.g., 'io.opentelemetry.spring-webmvc-6.0'). Used to correlate this config with telemetry emitted under the matching InstrumentationScope." }, enabled: { type: "boolean", description: "Whether this instrumentation is active at runtime. Treat it as true when absent, and set it to false when the library is explicitly disabled (e.g., OTEL_INSTRUMENTATION_FS_ENABLED=false)." }, description: { type: "string", description: "Free-text explanation of what this instrumentation captures and any notable options applied, such as ignored routes or captured headers. Set it when the libraryName alone does not convey intent." }, instrumentationType: { type: "string", enum: ["automatic", "manual", "both"], description: "Whether instrumentation is applied automatically, manually, or both" } }
1305
1321
  }, NODE_TYPE_APM_INSTRUMENTATIONSCOPE = {
1306
1322
  specNodeId: "apm.instrumentationscope",
1307
1323
  layer: "apm",
@@ -1309,7 +1325,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1309
1325
  title: "InstrumentationScope",
1310
1326
  requiredAttributes: ["droppedAttributesCount"],
1311
1327
  optionalAttributes: ["version", "schemaUrl", "attributes"],
1312
- attributeConstraints: { version: { type: "string" }, schemaUrl: { type: "string" }, droppedAttributesCount: { type: "integer" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1328
+ attributeConstraints: { version: { type: "string", description: "Version string of the instrumenting library or module (typically semver, e.g. '1.4.0'), as passed to getTracer/getMeter/getLogger; set whenever the code supplies a version." }, schemaUrl: { type: "string", description: "URL of the OpenTelemetry semantic-conventions schema that this scope's telemetry conforms to (e.g. 'https://opentelemetry.io/schemas/1.24.0'); set when the code passes a schemaUrl on acquisition." }, droppedAttributesCount: { type: "integer", description: "Non-negative integer count of scope attributes discarded because of attribute limits; set to 0 when modelling a scope definition rather than observed runtime data." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1313
1329
  }, NODE_TYPE_APM_LOGCONFIGURATION = {
1314
1330
  specNodeId: "apm.logconfiguration",
1315
1331
  layer: "apm",
@@ -1317,7 +1333,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1317
1333
  title: "LogConfiguration",
1318
1334
  requiredAttributes: ["serviceName"],
1319
1335
  optionalAttributes: ["minimumSeverity"],
1320
- attributeConstraints: { serviceName: { type: "string" }, minimumSeverity: { type: "string", enum: ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"], description: "Minimum OTel SeverityText level for log records to be emitted" } }
1336
+ attributeConstraints: { serviceName: { type: "string", description: "Logical name of the service whose log pipeline this configuration sets up, given as a plain string matching the Resource's service.name (e.g. 'checkout-api'); set it to tie the configuration to its emitting service." }, minimumSeverity: { type: "string", enum: ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "FATAL"], description: "Minimum OTel SeverityText level for log records to be emitted" } }
1321
1337
  }, NODE_TYPE_APM_LOGPROCESSOR = {
1322
1338
  specNodeId: "apm.logprocessor",
1323
1339
  layer: "apm",
@@ -1325,7 +1341,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1325
1341
  title: "LogProcessor",
1326
1342
  requiredAttributes: ["type"],
1327
1343
  optionalAttributes: ["order", "enabled"],
1328
- attributeConstraints: { type: { type: "string", enum: ["simple", "batch", "custom"], description: "OTel log record processor type (simple: synchronous, batch: asynchronous buffered)" }, order: { type: "integer" }, enabled: { type: "boolean" } }
1344
+ attributeConstraints: { type: { type: "string", enum: ["simple", "batch", "custom"], description: "OTel log record processor type (simple: synchronous, batch: asynchronous buffered)" }, order: { type: "integer", description: "Ascending integer position of this processor in its LoggerProvider or pipeline chain, where lower values run first; set it when more than one processor is registered so that invocation order is explicit." }, enabled: { type: "boolean", description: "Boolean indicating whether the processor is active in the pipeline (default true); set it to false when the processor is defined in configuration but deliberately not registered or is disabled by a feature flag." } }
1329
1345
  }, NODE_TYPE_APM_LOGRECORD = {
1330
1346
  specNodeId: "apm.logrecord",
1331
1347
  layer: "apm",
@@ -1333,7 +1349,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1333
1349
  title: "LogRecord",
1334
1350
  requiredAttributes: ["timeUnixNano", "observedTimeUnixNano", "severityNumber", "body", "flags", "droppedAttributesCount"],
1335
1351
  optionalAttributes: ["severityText", "attributes"],
1336
- attributeConstraints: { timeUnixNano: { type: "string" }, observedTimeUnixNano: { type: "string" }, severityNumber: { type: "string" }, severityText: { type: "string" }, body: { type: "string" }, flags: { type: "string" }, droppedAttributesCount: { type: "integer" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1352
+ attributeConstraints: { timeUnixNano: { type: "string", description: "Time the described event occurred, given as nanoseconds since the Unix epoch encoded as a decimal string; set it when the emitting source supplies an event time, otherwise use '0' (unknown)." }, observedTimeUnixNano: { type: "string", description: "Time the record was observed by the collection pipeline (SDK or collector), given as nanoseconds since the Unix epoch encoded as a decimal string; it is normally set by the pipeline and falls back to timeUnixNano when no separate observation time exists." }, severityNumber: { type: "string", description: "OTel numeric severity from 1 to 24 (1\u20134 TRACE, 5\u20138 DEBUG, 9\u201312 INFO, 13\u201316 WARN, 17\u201320 ERROR, 21\u201324 FATAL), with 0 meaning unspecified, written here as a decimal string; set it to the level used by the emitting call." }, severityText: { type: "string", description: "Original severity label as produced by the source logging framework (e.g., 'WARNING', 'err'); set it to preserve the native level name alongside severityNumber." }, body: { type: "string", description: "The log message or event payload, typically the message template (e.g., 'Order {orderId} created') or a serialized structured body; set it to the stable content that identifies this record." }, flags: { type: "string", description: "W3C trace flags byte from the span context active at emission, as a hex string (e.g., '01' = sampled); set it when the record is correlated with a trace, otherwise use '00'." }, droppedAttributesCount: { type: "integer", description: "Number of attributes discarded because of attribute count or length limits, as a non-negative integer; use 0 for modelled records unless limits are known to truncate them." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1337
1353
  }, NODE_TYPE_APM_METRICCONFIGURATION = {
1338
1354
  specNodeId: "apm.metricconfiguration",
1339
1355
  layer: "apm",
@@ -1341,7 +1357,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1341
1357
  title: "MetricConfiguration",
1342
1358
  requiredAttributes: ["serviceName"],
1343
1359
  optionalAttributes: ["exportIntervalMillis", "exportTimeoutMillis", "cardinalityLimit", "exemplarFilter", "exemplarReservoirSize"],
1344
- attributeConstraints: { serviceName: { type: "string" }, exportIntervalMillis: { type: "integer" }, exportTimeoutMillis: { type: "integer", description: "Maximum time allowed for a metric export to complete" }, cardinalityLimit: { type: "integer", description: "Maximum number of unique metric time series per instrument" }, exemplarFilter: { type: "string", enum: ["always_on", "always_off", "trace_based"], description: "OTel exemplar filter controlling which exemplars are recorded" }, exemplarReservoirSize: { type: "integer", description: "Maximum number of exemplars retained per instrument per collection cycle. Used in conjunction with exemplarFilter to control exemplar sampling volume." } }
1360
+ attributeConstraints: { serviceName: { type: "string", description: "Logical service name (matching the Resource service.name) identifying which service's MeterProvider this configuration belongs to; set it so the configuration can be correlated with the service's Resource." }, exportIntervalMillis: { type: "integer", description: "Interval in milliseconds between successive collections and exports by the periodic metric reader (OTel default 60000); set it when the code or OTEL_METRIC_EXPORT_INTERVAL overrides the default." }, exportTimeoutMillis: { type: "integer", description: "Maximum time allowed for a metric export to complete" }, cardinalityLimit: { type: "integer", description: "Maximum number of unique metric time series per instrument" }, exemplarFilter: { type: "string", enum: ["always_on", "always_off", "trace_based"], description: "OTel exemplar filter controlling which exemplars are recorded" }, exemplarReservoirSize: { type: "integer", description: "Maximum number of exemplars retained per instrument per collection cycle. Used in conjunction with exemplarFilter to control exemplar sampling volume." } }
1345
1361
  }, NODE_TYPE_APM_METRICINSTRUMENT = {
1346
1362
  specNodeId: "apm.metricinstrument",
1347
1363
  layer: "apm",
@@ -1349,7 +1365,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1349
1365
  title: "MetricInstrument",
1350
1366
  requiredAttributes: ["type", "unit"],
1351
1367
  optionalAttributes: ["description", "enabled", "source"],
1352
- attributeConstraints: { type: { type: "string", enum: ["Counter", "UpDownCounter", "Histogram", "Gauge", "ObservableCounter", "ObservableUpDownCounter", "ObservableGauge"], description: "OTel instrument type: synchronous (Counter, UpDownCounter, Histogram, Gauge) or asynchronous/observable (ObservableCounter, ObservableUpDownCounter, ObservableGauge)" }, unit: { type: "string" }, description: { type: "string" }, enabled: { type: "boolean" }, source: { type: "object", description: "Source code reference for code-defined metrics" } }
1368
+ attributeConstraints: { type: { type: "string", enum: ["Counter", "UpDownCounter", "Histogram", "Gauge", "ObservableCounter", "ObservableUpDownCounter", "ObservableGauge"], description: "OTel instrument type: synchronous (Counter, UpDownCounter, Histogram, Gauge) or asynchronous/observable (ObservableCounter, ObservableUpDownCounter, ObservableGauge)" }, unit: { type: "string", description: "The instrument's unit of measure, as a UCUM case-sensitive string per OTel semantic conventions (e.g. 'ms', 's', 'By', '1', '{request}'). Copy it from the unit argument at instrument creation, using a curly-brace annotation for counts of things." }, description: { type: "string", description: "Human-readable text explaining what the instrument measures, taken from the description argument or the Prometheus help string at creation. Set it whenever the code provides one." }, enabled: { type: "boolean", description: "Whether measurements from this instrument are currently recorded and exported. Set it to false when the instrument is disabled by a feature flag, configuration, or an OTel View with Drop aggregation." }, source: { type: "object", description: "Source code reference for code-defined metrics" } }
1353
1369
  }, NODE_TYPE_APM_RESOURCE = {
1354
1370
  specNodeId: "apm.resource",
1355
1371
  layer: "apm",
@@ -1357,7 +1373,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1357
1373
  title: "Resource",
1358
1374
  requiredAttributes: ["droppedAttributesCount"],
1359
1375
  optionalAttributes: ["schemaUrl", "serviceName", "serviceVersion", "deploymentEnvironment", "attributes"],
1360
- attributeConstraints: { schemaUrl: { type: "string" }, droppedAttributesCount: { type: "integer" }, serviceName: { type: "string", description: "OTel Resource semantic convention: logical name of the service (service.name)" }, serviceVersion: { type: "string", description: "OTel Resource semantic convention: version of the service (service.version)" }, deploymentEnvironment: { type: "string", description: "OTel Resource semantic convention: deployment environment (deployment.environment)" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1376
+ attributeConstraints: { schemaUrl: { type: "string", description: "URL of the OpenTelemetry semantic-conventions schema version that the resource attribute keys follow (e.g. 'https://opentelemetry.io/schemas/1.21.0'); set it when the resource or its detectors declare an explicit schema version." }, droppedAttributesCount: { type: "integer", description: "Non-negative integer count of resource attributes discarded because of attribute limits or invalid values; set it to 0 when all attributes were retained." }, serviceName: { type: "string", description: "OTel Resource semantic convention: logical name of the service (service.name)" }, serviceVersion: { type: "string", description: "OTel Resource semantic convention: version of the service (service.version)" }, deploymentEnvironment: { type: "string", description: "OTel Resource semantic convention: deployment environment (deployment.environment)" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1361
1377
  }, NODE_TYPE_APM_SPAN = {
1362
1378
  specNodeId: "apm.span",
1363
1379
  layer: "apm",
@@ -1365,7 +1381,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1365
1381
  title: "Span",
1366
1382
  requiredAttributes: ["traceId", "spanId", "traceState", "parentSpanId", "spanKind", "startTimeUnixNano", "endTimeUnixNano", "droppedAttributesCount", "droppedEventsCount", "droppedLinksCount"],
1367
1383
  optionalAttributes: ["statusCode", "statusMessage", "attributes"],
1368
- attributeConstraints: { traceId: { type: "string" }, spanId: { type: "string" }, traceState: { type: "string" }, parentSpanId: { type: "string" }, spanKind: { type: "string", enum: ["INTERNAL", "SERVER", "CLIENT", "PRODUCER", "CONSUMER"], description: "OTel SpanKind indicating the span's relationship to the calling and receiving system" }, startTimeUnixNano: { type: "string" }, endTimeUnixNano: { type: "string" }, droppedAttributesCount: { type: "integer" }, droppedEventsCount: { type: "string" }, droppedLinksCount: { type: "string" }, statusCode: { type: "string", enum: ["UNSET", "OK", "ERROR"], description: "OTel span status code. UNSET = not explicitly set by instrumentation; OK = explicitly successful; ERROR = explicitly failed. Once set to OK, cannot be overridden to ERROR." }, statusMessage: { type: "string", description: "Optional human-readable error message, used when statusCode is ERROR." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1384
+ attributeConstraints: { traceId: { type: "string", description: "The 16-byte trace identifier shared by all spans in a trace, written as 32 lowercase hex characters; set it only when modelling a captured span instance, otherwise leave it empty." }, spanId: { type: "string", description: "The 8-byte identifier unique to this span within its trace, written as 16 lowercase hex characters; populate it from captured telemetry, not for design-time definitions." }, traceState: { type: "string", description: "The W3C tracestate header value carrying vendor-specific key=value pairs propagated with the span context; use an empty string when no vendor state is propagated." }, parentSpanId: { type: "string", description: "The spanId (16 hex characters) of the parent span in the same trace; use an empty string for a root span." }, spanKind: { type: "string", enum: ["INTERNAL", "SERVER", "CLIENT", "PRODUCER", "CONSUMER"], description: "OTel SpanKind indicating the span's relationship to the calling and receiving system" }, startTimeUnixNano: { type: "string", description: "The time the operation started, in nanoseconds since the Unix epoch, encoded as a decimal string of a uint64." }, endTimeUnixNano: { type: "string", description: "The time the operation ended, in nanoseconds since the Unix epoch, encoded as a decimal string of a uint64; it must be greater than or equal to startTimeUnixNano." }, droppedAttributesCount: { type: "integer", description: "The number of attributes the SDK discarded because of attribute count or length limits; set it to 0 when none were dropped." }, droppedEventsCount: { type: "string", description: "The number of span events the SDK discarded because of the per-span event limit, as a non-negative integer written as a decimal string; set it to 0 when none were dropped." }, droppedLinksCount: { type: "string", description: "The number of span links the SDK discarded because of the per-span link limit, as a non-negative integer written as a decimal string; set it to 0 when none were dropped." }, statusCode: { type: "string", enum: ["UNSET", "OK", "ERROR"], description: "OTel span status code. UNSET = not explicitly set by instrumentation; OK = explicitly successful; ERROR = explicitly failed. Once set to OK, cannot be overridden to ERROR." }, statusMessage: { type: "string", description: "Optional human-readable error message, used when statusCode is ERROR." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1369
1385
  }, NODE_TYPE_APM_SPANEVENT = {
1370
1386
  specNodeId: "apm.spanevent",
1371
1387
  layer: "apm",
@@ -1373,7 +1389,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1373
1389
  title: "SpanEvent",
1374
1390
  requiredAttributes: ["timeUnixNano", "droppedAttributesCount"],
1375
1391
  optionalAttributes: ["attributes"],
1376
- attributeConstraints: { timeUnixNano: { type: "string" }, droppedAttributesCount: { type: "integer" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1392
+ attributeConstraints: { timeUnixNano: { type: "string", description: "Instant at which the event occurred, as nanoseconds since the Unix epoch encoded as a decimal string (OTLP fixed64). It must fall within the parent span's start and end times; set it explicitly only when the event time differs from the moment addEvent was called." }, droppedAttributesCount: { type: "integer", description: "Number of attributes discarded from this event because SDK attribute count or length limits were exceeded; use 0 when no attributes were dropped." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1377
1393
  }, NODE_TYPE_APM_SPANLINK = {
1378
1394
  specNodeId: "apm.spanlink",
1379
1395
  layer: "apm",
@@ -1381,7 +1397,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1381
1397
  title: "SpanLink",
1382
1398
  requiredAttributes: ["traceId", "spanId", "droppedAttributesCount"],
1383
1399
  optionalAttributes: ["traceState", "attributes"],
1384
- attributeConstraints: { traceId: { type: "string" }, spanId: { type: "string" }, traceState: { type: "string" }, droppedAttributesCount: { type: "integer" }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1400
+ attributeConstraints: { traceId: { type: "string", description: "W3C trace ID of the linked span, a 32-character lowercase hex string (16 bytes); always set, and it may differ from the owning span's trace." }, spanId: { type: "string", description: "Span ID of the linked span, a 16-character lowercase hex string (8 bytes); always set to identify the exact target span." }, traceState: { type: "string", description: "W3C tracestate value (comma-separated vendor key=value list) carried by the linked span context; set only when the linked context propagated a non-empty tracestate." }, droppedAttributesCount: { type: "integer", description: "Number of attributes on this link that the SDK discarded because of attribute limits (e.g., the per-link attribute count limit); set to 0 when none were dropped." }, attributes: { type: "object", description: "Key-value pairs of observability metadata attached to this signal, per the OpenTelemetry attribute specification. Keys are strings; values may be strings, booleans, integers, floats, or arrays thereof.", additionalProperties: !0 } }
1385
1401
  }, NODE_TYPE_APM_TRACECONFIGURATION = {
1386
1402
  specNodeId: "apm.traceconfiguration",
1387
1403
  layer: "apm",
@@ -1397,7 +1413,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1397
1413
  title: "ContextVariation",
1398
1414
  requiredAttributes: ["contextType"],
1399
1415
  optionalAttributes: ["description", "environmentFactors"],
1400
- attributeConstraints: { description: { type: "string" }, contextType: { type: "string", enum: ["functional", "load", "security", "regression", "smoke", "exploratory"], description: "The category of test context this variation represents" }, environmentFactors: { type: "array", description: "References EnvironmentFactor nodes specifying the concrete environmental constraints (OS, locale, network, hardware, dependency versions) that define this context variation." } }
1416
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of the execution condition this variation represents: its purpose, scope and how it differs from other contexts applied to the same target, such as 'peak-load run at 500 rps against staging'. Set it whenever the contextType alone does not identify the context uniquely." }, contextType: { type: "string", enum: ["functional", "load", "security", "regression", "smoke", "exploratory"], description: "The category of test context this variation represents" }, environmentFactors: { type: "array", description: "References EnvironmentFactor nodes specifying the concrete environmental constraints (OS, locale, network, hardware, dependency versions) that define this context variation." } }
1401
1417
  }, NODE_TYPE_TESTING_COVERAGEEXCLUSION = {
1402
1418
  specNodeId: "testing.coverageexclusion",
1403
1419
  layer: "testing",
@@ -1405,7 +1421,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1405
1421
  title: "CoverageExclusion",
1406
1422
  requiredAttributes: ["reason", "riskAccepted", "approvedBy"],
1407
1423
  optionalAttributes: ["description", "affectedTargetRef", "dateApproved"],
1408
- attributeConstraints: { description: { type: "string" }, reason: { type: "string" }, riskAccepted: { type: "boolean" }, approvedBy: { type: "string" }, affectedTargetRef: { type: "string", description: "ID of the testing.testcoveragetarget or testing.coveragerequirement being excluded from coverage" }, dateApproved: { type: "string", format: "date", description: "ISO date when the exclusion was formally approved, supporting audit trail requirements" } }
1424
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of what is excluded and the scope of the exclusion; set it when the reason alone does not make the boundary of the excluded item clear." }, reason: { type: "string", description: "Plain-language justification for excluding the item from coverage (e.g. 'third-party code', 'deprecated endpoint scheduled for removal', 'not testable in CI environment'); always required." }, riskAccepted: { type: "boolean", description: "True when the approver has explicitly accepted the residual risk of the item going untested. False when the exclusion rests on the item having no meaningful risk (e.g. dead or generated code)." }, approvedBy: { type: "string", description: "Name, role or identity reference of the person or body accountable for authorising the exclusion (e.g. 'QA Lead', 'jane.doe', 'Change Advisory Board'); always required." }, affectedTargetRef: { type: "string", description: "ID of the testing.testcoveragetarget or testing.coveragerequirement being excluded from coverage" }, dateApproved: { type: "string", format: "date", description: "ISO date when the exclusion was formally approved, supporting audit trail requirements" } }
1409
1425
  }, NODE_TYPE_TESTING_COVERAGEGAP = {
1410
1426
  specNodeId: "testing.coveragegap",
1411
1427
  layer: "testing",
@@ -1413,7 +1429,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1413
1429
  title: "CoverageGap",
1414
1430
  requiredAttributes: ["severity", "affectedRequirements"],
1415
1431
  optionalAttributes: ["description", "remediationStatus", "targetRef"],
1416
- attributeConstraints: { description: { type: "string" }, severity: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Risk level of leaving this gap unaddressed" }, affectedRequirements: { type: "string", description: "Identifier or reference to the requirement(s) that remain uncovered due to this gap." }, remediationStatus: { type: "string", enum: ["open", "deferred", "resolved", "accepted-risk"], description: "Lifecycle state of this coverage gap." }, targetRef: { type: "string", description: "ID of the testing.testcoveragetarget where this gap was identified" } }
1432
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of what is not covered (for example, missing partitions, contexts or outcome categories) and how the gap was detected. Set it whenever the severity and affected requirement alone do not make the gap clear." }, severity: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Risk level of leaving this gap unaddressed" }, affectedRequirements: { type: "string", description: "Identifier or reference to the requirement(s) that remain uncovered due to this gap." }, remediationStatus: { type: "string", enum: ["open", "deferred", "resolved", "accepted-risk"], description: "Lifecycle state of this coverage gap." }, targetRef: { type: "string", description: "ID of the testing.testcoveragetarget where this gap was identified" } }
1417
1433
  }, NODE_TYPE_TESTING_COVERAGEREQUIREMENT = {
1418
1434
  specNodeId: "testing.coveragerequirement",
1419
1435
  layer: "testing",
@@ -1421,7 +1437,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1421
1437
  title: "CoverageRequirement",
1422
1438
  requiredAttributes: ["coverageCriteria"],
1423
1439
  optionalAttributes: ["description", "priority"],
1424
- attributeConstraints: { description: { type: "string" }, coverageCriteria: { type: "string", enum: ["all-partitions", "boundary-values", "pairwise", "each-choice", "MC/DC", "path-coverage"], description: "The coverage strategy defining which combinations of partition values must be exercised" }, priority: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Relative importance of fulfilling this coverage requirement" } }
1440
+ attributeConstraints: { description: { type: "string", description: "Free-text statement of what this requirement demands for its target, naming the partitions, contexts or outcomes in scope and any rationale. Set it whenever the coverageCriteria value alone does not make the scope evident." }, coverageCriteria: { type: "string", enum: ["all-partitions", "boundary-values", "pairwise", "each-choice", "MC/DC", "path-coverage"], description: "The coverage strategy defining which combinations of partition values must be exercised" }, priority: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Relative importance of fulfilling this coverage requirement" } }
1425
1441
  }, NODE_TYPE_TESTING_COVERAGESUMMARY = {
1426
1442
  specNodeId: "testing.coveragesummary",
1427
1443
  layer: "testing",
@@ -1429,7 +1445,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1429
1445
  title: "CoverageSummary",
1430
1446
  requiredAttributes: ["totalTargets", "totalRequirements", "totalSketches"],
1431
1447
  optionalAttributes: ["modelRef", "generatedAt"],
1432
- attributeConstraints: { modelRef: { type: "string", description: "ID of the testing.testcoveragemodel this summary aggregates" }, generatedAt: { type: "string" }, totalTargets: { type: "integer" }, totalRequirements: { type: "integer" }, totalSketches: { type: "integer" } }
1448
+ attributeConstraints: { modelRef: { type: "string", description: "ID of the testing.testcoveragemodel this summary aggregates" }, generatedAt: { type: "string", description: "ISO 8601 date-time at which the summary was computed; set it every time the summary is regenerated so stale reports can be detected." }, totalTargets: { type: "integer", description: "Non-negative count of TestCoverageTarget nodes in the referenced model at generation time, including targets that have exclusions or gaps." }, totalRequirements: { type: "integer", description: "Non-negative count of CoverageRequirement nodes across all targets in the referenced model at generation time." }, totalSketches: { type: "integer", description: "Non-negative count of TestCaseSketch nodes across all targets in the model regardless of status; this equals the sum of sketchCount over the model's TargetCoverageSummary records." } }
1433
1449
  }, NODE_TYPE_TESTING_ENVIRONMENTFACTOR = {
1434
1450
  specNodeId: "testing.environmentfactor",
1435
1451
  layer: "testing",
@@ -1437,7 +1453,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1437
1453
  title: "EnvironmentFactor",
1438
1454
  requiredAttributes: ["factorType", "value"],
1439
1455
  optionalAttributes: ["expectedRange", "testImpact", "description"],
1440
- attributeConstraints: { factorType: { type: "string", enum: ["os", "network", "locale", "hardware", "dependency-version"], description: "Category of environmental variable being documented." }, value: { type: "string", description: "The specific value or constraint for this factor (e.g., 'Ubuntu 22.04', 'latency < 100ms', 'en-US', 'Node.js 20.x')." }, expectedRange: { type: "string", description: "Acceptable range or set of values for this factor in the test environment (e.g., 'latency 50-200ms', 'Ubuntu 20.04 or 22.04')." }, testImpact: { type: "string", description: "Description of how variations in this factor are expected to affect test behavior or outcomes." }, description: { type: "string" } }
1456
+ attributeConstraints: { factorType: { type: "string", enum: ["os", "network", "locale", "hardware", "dependency-version"], description: "Category of environmental variable being documented." }, value: { type: "string", description: "The specific value or constraint for this factor (e.g., 'Ubuntu 22.04', 'latency < 100ms', 'en-US', 'Node.js 20.x')." }, expectedRange: { type: "string", description: "Acceptable range or set of values for this factor in the test environment (e.g., 'latency 50-200ms', 'Ubuntu 20.04 or 22.04')." }, testImpact: { type: "string", description: "Description of how variations in this factor are expected to affect test behavior or outcomes." }, description: { type: "string", description: "Free-text explanation of what this environmental factor is and why it is pinned for testing, for example 'Server-side timezone forced to UTC to make date-boundary tests deterministic'. Set it whenever the factorType and value alone do not make the factor's purpose clear." } }
1441
1457
  }, NODE_TYPE_TESTING_INPUTPARTITIONSELECTION = {
1442
1458
  specNodeId: "testing.inputpartitionselection",
1443
1459
  layer: "testing",
@@ -1453,7 +1469,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1453
1469
  title: "InputSelection",
1454
1470
  requiredAttributes: ["partitionRef", "selectedValue", "concreteValue", "valueSource"],
1455
1471
  optionalAttributes: [],
1456
- attributeConstraints: { partitionRef: { type: "string" }, selectedValue: { type: "string" }, concreteValue: { type: "string" }, valueSource: { type: "string", enum: ["manual", "generated", "data-driven", "fixture"], description: "How the concrete value was obtained: manually authored, algorithmically generated, drawn from a data set, or loaded from a test fixture" } }
1472
+ attributeConstraints: { partitionRef: { type: "string", description: "ID of the testing.inputspacepartition whose input field this binding supplies a value for; set it on every selection so the concrete value can be traced to its input dimension." }, selectedValue: { type: "string", description: "Label or ID of the testing.partitionvalue (equivalence class) chosen from that partition for this test case, e.g. 'boundary-max' or 'null-empty'." }, concreteValue: { type: "string", description: `The exact datum the test submits for the field, serialized as a string (literal, JSON fragment, or fixture key), e.g. '255', '""', or 'fixtures/user_admin.json'.` }, valueSource: { type: "string", enum: ["manual", "generated", "data-driven", "fixture"], description: "How the concrete value was obtained: manually authored, algorithmically generated, drawn from a data set, or loaded from a test fixture" } }
1457
1473
  }, NODE_TYPE_TESTING_INPUTSPACEPARTITION = {
1458
1474
  specNodeId: "testing.inputspacepartition",
1459
1475
  layer: "testing",
@@ -1461,7 +1477,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1461
1477
  title: "InputSpacePartition",
1462
1478
  requiredAttributes: ["fieldRef", "presenceRule"],
1463
1479
  optionalAttributes: ["description"],
1464
- attributeConstraints: { description: { type: "string" }, fieldRef: { type: "string" }, presenceRule: { type: "string", enum: ["required", "optional", "conditional", "forbidden", "mutually-exclusive"], description: "Whether this input field must be present in test inputs for this partition" } }
1480
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of the input dimension being partitioned and the basis on which its equivalence classes were derived (e.g. specification rule, data type limits); set whenever the partitioning rationale is not obvious from the field name." }, fieldRef: { type: "string", description: "Cross-layer ID of the input field this partition divides, typically an api.parameter, data-model.schemaproperty, data-model.jsonschema or data-store.collection element; always set to the single field whose value domain is being partitioned." }, presenceRule: { type: "string", enum: ["required", "optional", "conditional", "forbidden", "mutually-exclusive"], description: "Whether this input field must be present in test inputs for this partition" } }
1465
1481
  }, NODE_TYPE_TESTING_OUTCOMECATEGORY = {
1466
1482
  specNodeId: "testing.outcomecategory",
1467
1483
  layer: "testing",
@@ -1469,7 +1485,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1469
1485
  title: "OutcomeCategory",
1470
1486
  requiredAttributes: ["outcomeType"],
1471
1487
  optionalAttributes: ["description"],
1472
- attributeConstraints: { description: { type: "string" }, outcomeType: { type: "string", enum: ["success", "validation-error", "authorization-error", "not-found", "server-error", "exception", "timeout"], description: "The class of observable outcome this category represents, used to group test cases by expected result type for coverage analysis and reporting." } }
1488
+ attributeConstraints: { description: { type: "string", description: "Free-text explanation of what observable behaviour qualifies as this outcome for the target, e.g. 'HTTP 422 with field-level error list'. Set it whenever the outcomeType alone does not identify the signal tests should check." }, outcomeType: { type: "string", enum: ["success", "validation-error", "authorization-error", "not-found", "server-error", "exception", "timeout"], description: "The class of observable outcome this category represents, used to group test cases by expected result type for coverage analysis and reporting." } }
1473
1489
  }, NODE_TYPE_TESTING_PARTITIONDEPENDENCY = {
1474
1490
  specNodeId: "testing.partitiondependency",
1475
1491
  layer: "testing",
@@ -1477,7 +1493,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1477
1493
  title: "PartitionDependency",
1478
1494
  requiredAttributes: ["dependsOnPartition", "dependsOnValue", "effect", "affectedValues"],
1479
1495
  optionalAttributes: ["description"],
1480
- attributeConstraints: { dependsOnPartition: { type: "string", description: "ID of the testing.inputspacepartition that triggers this dependency" }, dependsOnValue: { type: "string", description: "Label or ID of the testing.partitionvalue that activates this dependency" }, effect: { type: "string", enum: ["excludes", "requires", "restricts-to", "modifies-range"], description: "How the dependency affects the related partition values" }, affectedValues: { type: "string", description: "Comma-separated labels or IDs of the partition values in the dependent field whose availability is modified by this dependency (e.g., values that are excluded, required, or restricted when the trigger value is selected)." }, description: { type: "string" } }
1496
+ attributeConstraints: { dependsOnPartition: { type: "string", description: "ID of the testing.inputspacepartition that triggers this dependency" }, dependsOnValue: { type: "string", description: "Label or ID of the testing.partitionvalue that activates this dependency" }, effect: { type: "string", enum: ["excludes", "requires", "restricts-to", "modifies-range"], description: "How the dependency affects the related partition values" }, affectedValues: { type: "string", description: "Comma-separated labels or IDs of the partition values in the dependent field whose availability is modified by this dependency (e.g., values that are excluded, required, or restricted when the trigger value is selected)." }, description: { type: "string", description: "Free-text explanation of the business or technical reason the trigger value constrains the affected values (e.g. 'guest accounts cannot hold admin role'); set whenever the rule is not self-evident from effect and affectedValues." } }
1481
1497
  }, NODE_TYPE_TESTING_PARTITIONVALUE = {
1482
1498
  specNodeId: "testing.partitionvalue",
1483
1499
  layer: "testing",
@@ -1485,7 +1501,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1485
1501
  title: "PartitionValue",
1486
1502
  requiredAttributes: ["label", "constraint", "constraintExpression", "category", "representativeValue"],
1487
1503
  optionalAttributes: ["description"],
1488
- attributeConstraints: { label: { type: "string" }, description: { type: "string" }, constraint: { type: "string", description: "Human-readable description of the condition this partition boundary represents (e.g., 'must be between 0 and 100', 'must not be null or empty')." }, constraintExpression: { type: "string", description: "Machine-evaluable expression encoding the partition boundary condition (e.g., a regex pattern, JSONPath predicate, or comparison expression such as 'value >= 0 && value <= 100')." }, category: { type: "string", enum: ["valid", "invalid", "boundary-valid", "boundary-invalid", "null-empty", "special-character"], description: "Equivalence partition category for this value" }, representativeValue: { type: "string" } }
1504
+ attributeConstraints: { label: { type: "string", description: "Short identifier for the class, unique within its parent partition (e.g. 'empty-string', 'above-max'); other nodes cite it in coverValues, excludeValues and affectedValues, so it is always set." }, description: { type: "string", description: "Optional free-text explanation of why values in this class are expected to behave alike and what behaviour they probe; set it when the label and constraint alone do not make the intent clear." }, constraint: { type: "string", description: "Human-readable description of the condition this partition boundary represents (e.g., 'must be between 0 and 100', 'must not be null or empty')." }, constraintExpression: { type: "string", description: "Machine-evaluable expression encoding the partition boundary condition (e.g., a regex pattern, JSONPath predicate, or comparison expression such as 'value >= 0 && value <= 100')." }, category: { type: "string", enum: ["valid", "invalid", "boundary-valid", "boundary-invalid", "null-empty", "special-character"], description: "Equivalence partition category for this value" }, representativeValue: { type: "string", description: "One abstract value, written as a string, that stands for the whole class in test design (e.g. '101' for above-max, '' for null-empty); it is distinct from the concrete datum later bound in InputSelection.concreteValue." } }
1489
1505
  }, NODE_TYPE_TESTING_TARGETCOVERAGESUMMARY = {
1490
1506
  specNodeId: "testing.targetcoveragesummary",
1491
1507
  layer: "testing",
@@ -1501,7 +1517,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1501
1517
  title: "TargetInputField",
1502
1518
  requiredAttributes: ["fieldRef", "partitionRef"],
1503
1519
  optionalAttributes: ["description", "relevance"],
1504
- attributeConstraints: { fieldRef: { type: "string", description: "ID of the referenced field element in the API layer (e.g., an API parameter) or Data Model layer (e.g., a data-model property)" }, partitionRef: { type: "string", description: "ID of the testing.inputspacepartition that defines the equivalence classes or boundary values for this input field." }, description: { type: "string" }, relevance: { type: "string", enum: ["required", "optional", "conditional", "not-applicable"], description: "Whether this field must be included in test case input specifications" } }
1520
+ attributeConstraints: { fieldRef: { type: "string", description: "ID of the referenced field element in the API layer (e.g., an API parameter) or Data Model layer (e.g., a data-model property)" }, partitionRef: { type: "string", description: "ID of the testing.inputspacepartition that defines the equivalence classes or boundary values for this input field." }, description: { type: "string", description: "Free-text note on why this field matters for testing the target, such as validation rules or known defect history. Set it when the field's relevance or chosen partition is not self-evident from fieldRef and partitionRef." }, relevance: { type: "string", enum: ["required", "optional", "conditional", "not-applicable"], description: "Whether this field must be included in test case input specifications" } }
1505
1521
  }, NODE_TYPE_TESTING_TESTCASESKETCH = {
1506
1522
  specNodeId: "testing.testcasesketch",
1507
1523
  layer: "testing",
@@ -1509,7 +1525,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1509
1525
  title: "TestCaseSketch",
1510
1526
  requiredAttributes: ["status"],
1511
1527
  optionalAttributes: ["description", "inputSelections", "implementationFormat", "source"],
1512
- attributeConstraints: { description: { type: "string" }, status: { type: "string", enum: ["draft", "under-review", "approved", "implemented", "automated", "deprecated"], description: "Lifecycle status of the test case sketch" }, inputSelections: { type: "array", description: "References InputPartitionSelection nodes specifying which partition values this sketch exercises." }, implementationFormat: { type: "string", enum: ["manual", "automated", "semi-automated", "exploratory"], description: "How the test case will be executed" }, source: { type: "object", description: "Source code reference to the test case implementation" } }
1528
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of the scenario this sketch exercises: preconditions, the input combination chosen and the expected observable outcome. Set it whenever the name alone does not make the intent clear." }, status: { type: "string", enum: ["draft", "under-review", "approved", "implemented", "automated", "deprecated"], description: "Lifecycle status of the test case sketch" }, inputSelections: { type: "array", description: "References InputPartitionSelection nodes specifying which partition values this sketch exercises." }, implementationFormat: { type: "string", enum: ["manual", "automated", "semi-automated", "exploratory"], description: "How the test case will be executed" }, source: { type: "object", description: "Source code reference to the test case implementation" } }
1513
1529
  }, NODE_TYPE_TESTING_TESTCOVERAGEMODEL = {
1514
1530
  specNodeId: "testing.testcoveragemodel",
1515
1531
  layer: "testing",
@@ -1517,7 +1533,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1517
1533
  title: "TestCoverageModel",
1518
1534
  requiredAttributes: ["version", "application"],
1519
1535
  optionalAttributes: ["description", "source"],
1520
- attributeConstraints: { version: { type: "string" }, application: { type: "string", description: "Cross-layer reference ID to the application or API element (application layer or api layer) being covered by this model" }, description: { type: "string" }, source: { type: "object", description: "Provenance information indicating the origin of this model (e.g., manually authored, imported from OpenAPI, or generated from source artifacts)" } }
1536
+ attributeConstraints: { version: { type: "string", description: "Version identifier of this coverage model, as a semantic version or date stamp (e.g. '1.2.0' or '2024-05-01'); increment it whenever targets, requirements or exclusions are added, removed or changed." }, application: { type: "string", description: "Cross-layer reference ID to the application or API element (application layer or api layer) being covered by this model" }, description: { type: "string", description: "Free-text summary of the model's scope, the application release or test level it addresses, and any overall test approach; set it whenever the scope is not obvious from the application reference." }, source: { type: "object", description: "Provenance information indicating the origin of this model (e.g., manually authored, imported from OpenAPI, or generated from source artifacts)" } }
1521
1537
  }, NODE_TYPE_TESTING_TESTCOVERAGETARGET = {
1522
1538
  specNodeId: "testing.testcoveragetarget",
1523
1539
  layer: "testing",
@@ -1525,7 +1541,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1525
1541
  title: "TestCoverageTarget",
1526
1542
  requiredAttributes: ["targetType"],
1527
1543
  optionalAttributes: ["description", "priority", "source"],
1528
- attributeConstraints: { description: { type: "string" }, targetType: { type: "string", enum: ["api-endpoint", "business-workflow", "ui-component", "data-migration", "integration-flow", "scheduled-job"], description: "The kind of artifact or functionality requiring test coverage" }, priority: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Relative importance of achieving coverage for this target" }, source: { type: "object", description: "Source code reference for the artifact requiring test coverage" } }
1544
+ attributeConstraints: { description: { type: "string", description: "Free-text summary of the artifact or functionality in scope and the testing concerns it raises. Set it whenever the target name and targetType alone do not make the boundary of what must be verified clear." }, targetType: { type: "string", enum: ["api-endpoint", "business-workflow", "ui-component", "data-migration", "integration-flow", "scheduled-job"], description: "The kind of artifact or functionality requiring test coverage" }, priority: { type: "string", enum: ["critical", "high", "medium", "low"], description: "Relative importance of achieving coverage for this target" }, source: { type: "object", description: "Source code reference for the artifact requiring test coverage" } }
1529
1545
  }, NODE_TYPES = /* @__PURE__ */ new Map([
1530
1546
  ["motivation.assessment", NODE_TYPE_MOTIVATION_ASSESSMENT],
1531
1547
  ["motivation.constraint", NODE_TYPE_MOTIVATION_CONSTRAINT],
@@ -1538,6 +1554,7 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1538
1554
  ["motivation.stakeholder", NODE_TYPE_MOTIVATION_STAKEHOLDER],
1539
1555
  ["motivation.value", NODE_TYPE_MOTIVATION_VALUE],
1540
1556
  ["business.businessactor", NODE_TYPE_BUSINESS_BUSINESSACTOR],
1557
+ ["business.businesscapability", NODE_TYPE_BUSINESS_BUSINESSCAPABILITY],
1541
1558
  ["business.businesscollaboration", NODE_TYPE_BUSINESS_BUSINESSCOLLABORATION],
1542
1559
  ["business.businessevent", NODE_TYPE_BUSINESS_BUSINESSEVENT],
1543
1560
  ["business.businessfunction", NODE_TYPE_BUSINESS_BUSINESSFUNCTION],
@@ -1550,11 +1567,12 @@ const NODE_TYPE_MOTIVATION_ASSESSMENT = {
1550
1567
  ["business.contract", NODE_TYPE_BUSINESS_CONTRACT],
1551
1568
  ["business.product", NODE_TYPE_BUSINESS_PRODUCT],
1552
1569
  ["business.representation", NODE_TYPE_BUSINESS_REPRESENTATION],
1553
- ["product.capability", NODE_TYPE_PRODUCT_CAPABILITY],
1554
1570
  ["product.feature", NODE_TYPE_PRODUCT_FEATURE],
1555
1571
  ["product.milestone", NODE_TYPE_PRODUCT_MILESTONE],
1556
1572
  ["product.persona", NODE_TYPE_PRODUCT_PERSONA],
1573
+ ["product.softwarecapability", NODE_TYPE_PRODUCT_SOFTWARECAPABILITY],
1557
1574
  ["product.userworkflow", NODE_TYPE_PRODUCT_USERWORKFLOW],
1575
+ ["product.workflowstep", NODE_TYPE_PRODUCT_WORKFLOWSTEP],
1558
1576
  ["security.accesscondition", NODE_TYPE_SECURITY_ACCESSCONDITION],
1559
1577
  ["security.accountabilityrequirement", NODE_TYPE_SECURITY_ACCOUNTABILITYREQUIREMENT],
1560
1578
  ["security.actor", NODE_TYPE_SECURITY_ACTOR],