@documentation-robotics/cli 0.2.0 → 0.4.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 (335) hide show
  1. package/README.md +46 -16
  2. package/dist/analysis/relationship-classifier.js +2 -9
  3. package/dist/analysis/relationship-classifier.js.map +2 -2
  4. package/dist/analyzers/active-analyzer.js +62 -0
  5. package/dist/analyzers/active-analyzer.js.map +7 -0
  6. package/dist/analyzers/call-graph-utils.js +2 -2
  7. package/dist/analyzers/call-graph-utils.js.map +2 -2
  8. package/dist/analyzers/cards/build.js +191 -0
  9. package/dist/analyzers/cards/build.js.map +7 -0
  10. package/dist/analyzers/cards/classify.js +42 -0
  11. package/dist/analyzers/cards/classify.js.map +7 -0
  12. package/dist/analyzers/cards/edge-index.js +44 -0
  13. package/dist/analyzers/cards/edge-index.js.map +7 -0
  14. package/dist/analyzers/cards/extract.js +138 -0
  15. package/dist/analyzers/cards/extract.js.map +7 -0
  16. package/dist/analyzers/cards/facts.js +46 -0
  17. package/dist/analyzers/cards/facts.js.map +7 -0
  18. package/dist/analyzers/cards/graph.js +42 -0
  19. package/dist/analyzers/cards/graph.js.map +7 -0
  20. package/dist/analyzers/cards/index.js +8 -0
  21. package/dist/analyzers/cards/index.js.map +7 -0
  22. package/dist/analyzers/cards/routes.js +96 -0
  23. package/dist/analyzers/cards/routes.js.map +7 -0
  24. package/dist/analyzers/cards/tier0.js +18 -0
  25. package/dist/analyzers/cards/tier0.js.map +7 -0
  26. package/dist/analyzers/cards/types.js +1 -0
  27. package/dist/analyzers/cards/types.js.map +7 -0
  28. package/dist/analyzers/cbm-analyzer.js +270 -174
  29. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  30. package/dist/analyzers/cbm-responses.js +342 -0
  31. package/dist/analyzers/cbm-responses.js.map +7 -0
  32. package/dist/analyzers/code-changes.js +159 -0
  33. package/dist/analyzers/code-changes.js.map +7 -0
  34. package/dist/analyzers/edge-relationships.js +49 -0
  35. package/dist/analyzers/edge-relationships.js.map +7 -0
  36. package/dist/analyzers/extraction-plan.js +541 -0
  37. package/dist/analyzers/extraction-plan.js.map +7 -0
  38. package/dist/analyzers/index-job.js +229 -0
  39. package/dist/analyzers/index-job.js.map +7 -0
  40. package/dist/analyzers/mapping-loader.js +9 -0
  41. package/dist/analyzers/mapping-loader.js.map +2 -2
  42. package/dist/analyzers/tier0-rules.js +153 -0
  43. package/dist/analyzers/tier0-rules.js.map +7 -0
  44. package/dist/analyzers/types.js.map +1 -1
  45. package/dist/audit/relationships/ai/prompts.js +10 -10
  46. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  47. package/dist/audit/relationships/analysis/layer-templates.js +52 -52
  48. package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
  49. package/dist/cli.js +23 -11
  50. package/dist/cli.js.map +2 -2
  51. package/dist/coding-agents/default-permissions.js +31 -1
  52. package/dist/coding-agents/default-permissions.js.map +2 -2
  53. package/dist/coding-agents/drbot-mcp.js +269 -0
  54. package/dist/coding-agents/drbot-mcp.js.map +7 -0
  55. package/dist/commands/add.js +7 -4
  56. package/dist/commands/add.js.map +2 -2
  57. package/dist/commands/analyzer.js +143 -40
  58. package/dist/commands/analyzer.js.map +2 -2
  59. package/dist/commands/changeset-verify.js +63 -0
  60. package/dist/commands/changeset-verify.js.map +7 -0
  61. package/dist/commands/changeset.js +80 -29
  62. package/dist/commands/changeset.js.map +2 -2
  63. package/dist/commands/delete.js +10 -4
  64. package/dist/commands/delete.js.map +2 -2
  65. package/dist/commands/farm.js +176 -60
  66. package/dist/commands/farm.js.map +2 -2
  67. package/dist/commands/init.js +9 -26
  68. package/dist/commands/init.js.map +2 -2
  69. package/dist/commands/mcp.js +40 -21
  70. package/dist/commands/mcp.js.map +3 -3
  71. package/dist/commands/relationship.js +208 -37
  72. package/dist/commands/relationship.js.map +2 -2
  73. package/dist/commands/reports.js +3 -3
  74. package/dist/commands/reports.js.map +2 -2
  75. package/dist/commands/update.js +52 -32
  76. package/dist/commands/update.js.map +2 -2
  77. package/dist/commands/upgrade.js +99 -103
  78. package/dist/commands/upgrade.js.map +3 -3
  79. package/dist/commands/validate.js +19 -3
  80. package/dist/commands/validate.js.map +2 -2
  81. package/dist/commands/version.js +1 -1
  82. package/dist/commands/visualize.js +34 -15
  83. package/dist/commands/visualize.js.map +2 -2
  84. package/dist/core/annotation-store.js +15 -5
  85. package/dist/core/annotation-store.js.map +2 -2
  86. package/dist/core/catalog-migration.js +34 -0
  87. package/dist/core/catalog-migration.js.map +7 -0
  88. package/dist/core/changeset-analysis.js +421 -0
  89. package/dist/core/changeset-analysis.js.map +7 -0
  90. package/dist/core/changeset-base-index.js +160 -0
  91. package/dist/core/changeset-base-index.js.map +7 -0
  92. package/dist/core/changeset-brief-compact.js +256 -0
  93. package/dist/core/changeset-brief-compact.js.map +7 -0
  94. package/dist/core/changeset-brief-delta.js +102 -0
  95. package/dist/core/changeset-brief-delta.js.map +7 -0
  96. package/dist/core/changeset-graph.js +281 -0
  97. package/dist/core/changeset-graph.js.map +7 -0
  98. package/dist/core/changeset-only-guard.js +32 -0
  99. package/dist/core/changeset-only-guard.js.map +7 -0
  100. package/dist/core/changeset-summary.js +68 -0
  101. package/dist/core/changeset-summary.js.map +7 -0
  102. package/dist/core/changeset-validator.js +66 -20
  103. package/dist/core/changeset-validator.js.map +2 -2
  104. package/dist/core/changeset-verify.js +848 -0
  105. package/dist/core/changeset-verify.js.map +7 -0
  106. package/dist/core/changeset.js +56 -9
  107. package/dist/core/changeset.js.map +2 -2
  108. package/dist/core/element-type-migration.js +145 -0
  109. package/dist/core/element-type-migration.js.map +7 -0
  110. package/dist/core/extraction-observability.js +161 -0
  111. package/dist/core/extraction-observability.js.map +7 -0
  112. package/dist/core/farm-manifest.js +12 -6
  113. package/dist/core/farm-manifest.js.map +2 -2
  114. package/dist/core/farm-sync-engine.js +1 -1
  115. package/dist/core/farm-sync-engine.js.map +2 -2
  116. package/dist/core/farm-sync-state.js +10 -2
  117. package/dist/core/farm-sync-state.js.map +2 -2
  118. package/dist/core/migration-registry.js +88 -47
  119. package/dist/core/migration-registry.js.map +2 -2
  120. package/dist/core/model-upgrade.js +102 -0
  121. package/dist/core/model-upgrade.js.map +7 -0
  122. package/dist/core/model.js +82 -30
  123. package/dist/core/model.js.map +2 -2
  124. package/dist/core/mutation-handler.js +71 -6
  125. package/dist/core/mutation-handler.js.map +2 -2
  126. package/dist/core/project-init.js +53 -0
  127. package/dist/core/project-init.js.map +7 -0
  128. package/dist/core/relationship-migration-table.js +6639 -0
  129. package/dist/core/relationship-migration-table.js.map +7 -0
  130. package/dist/core/relationship-migration.js +272 -0
  131. package/dist/core/relationship-migration.js.map +7 -0
  132. package/dist/core/relationship-prune.js +49 -0
  133. package/dist/core/relationship-prune.js.map +7 -0
  134. package/dist/core/relationship-staging.js +161 -0
  135. package/dist/core/relationship-staging.js.map +7 -0
  136. package/dist/core/relationships.js +26 -4
  137. package/dist/core/relationships.js.map +2 -2
  138. package/dist/core/report-data-model.js +7 -13
  139. package/dist/core/report-data-model.js.map +2 -2
  140. package/dist/core/staged-changeset-storage.js +145 -18
  141. package/dist/core/staged-changeset-storage.js.map +2 -2
  142. package/dist/core/staged-source-reference.js +28 -0
  143. package/dist/core/staged-source-reference.js.map +7 -0
  144. package/dist/core/staging-area.js +166 -24
  145. package/dist/core/staging-area.js.map +2 -2
  146. package/dist/core/upgrade-plan.js +117 -0
  147. package/dist/core/upgrade-plan.js.map +7 -0
  148. package/dist/core/virtual-projection.js +13 -5
  149. package/dist/core/virtual-projection.js.map +2 -2
  150. package/dist/export/archimate-exporter.js +1 -0
  151. package/dist/export/archimate-exporter.js.map +2 -2
  152. package/dist/generated/compiled-validators.js +2 -2
  153. package/dist/generated/compiled-validators.js.map +2 -2
  154. package/dist/generated/layer-registry.js +16 -16
  155. package/dist/generated/layer-registry.js.map +2 -2
  156. package/dist/generated/node-types.js +186 -168
  157. package/dist/generated/node-types.js.map +2 -2
  158. package/dist/generated/relationship-index.js +2468 -7913
  159. package/dist/generated/relationship-index.js.map +2 -2
  160. package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
  161. package/dist/integrations/claude_code/agents/dr-architect.md +30 -3
  162. package/dist/integrations/claude_code/agents/dr-extractor.md +8 -2
  163. package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
  164. package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
  165. package/dist/integrations/claude_code/commands/dr-map.md +20 -1
  166. package/dist/integrations/claude_code/commands/dr-plan.md +66 -0
  167. package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
  168. package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
  169. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
  170. package/dist/integrations/claude_code/docs/MCP_SERVER.md +47 -26
  171. package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
  172. package/dist/integrations/claude_code/docs/README.md +68 -2
  173. package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
  174. package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
  175. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
  176. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
  177. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
  178. package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
  179. package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
  180. package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
  181. package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
  182. package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
  183. package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
  184. package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
  185. package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
  186. package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
  187. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +95 -15
  188. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +178 -0
  189. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +8 -0
  190. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +6 -1
  191. package/dist/integrations/github_copilot/agents/dr-architect.md +3 -1
  192. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
  193. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
  194. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
  195. package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
  196. package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
  197. package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
  198. package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
  199. package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
  200. package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
  201. package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
  202. package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
  203. package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
  204. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +225 -102
  205. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +177 -0
  206. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
  207. package/dist/integrations/hash-utils.js.map +2 -2
  208. package/dist/mcp/api-key-manager.js +14 -1
  209. package/dist/mcp/api-key-manager.js.map +2 -2
  210. package/dist/mcp/changeset-only.js +45 -0
  211. package/dist/mcp/changeset-only.js.map +7 -0
  212. package/dist/mcp/project-root.js +85 -0
  213. package/dist/mcp/project-root.js.map +7 -0
  214. package/dist/mcp/server-instructions.js +27 -0
  215. package/dist/mcp/server-instructions.js.map +7 -0
  216. package/dist/mcp/strict-schema.js +52 -0
  217. package/dist/mcp/strict-schema.js.map +7 -0
  218. package/dist/mcp/tool-registry.js +55 -5
  219. package/dist/mcp/tool-registry.js.map +2 -2
  220. package/dist/mcp/tools/changeset-analysis-tools.js +98 -0
  221. package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
  222. package/dist/mcp/tools/changeset-commit.js +224 -0
  223. package/dist/mcp/tools/changeset-commit.js.map +7 -0
  224. package/dist/mcp/tools/changeset-editing.js +260 -0
  225. package/dist/mcp/tools/changeset-editing.js.map +7 -0
  226. package/dist/mcp/tools/changeset-lifecycle.js +83 -0
  227. package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
  228. package/dist/mcp/tools/changeset-shared.js +31 -0
  229. package/dist/mcp/tools/changeset-shared.js.map +7 -0
  230. package/dist/mcp/tools/changeset-show.js +17 -1
  231. package/dist/mcp/tools/changeset-show.js.map +2 -2
  232. package/dist/mcp/tools/changeset-verify.js +49 -0
  233. package/dist/mcp/tools/changeset-verify.js.map +7 -0
  234. package/dist/mcp/tools/codebase-extract.js +836 -0
  235. package/dist/mcp/tools/codebase-extract.js.map +7 -0
  236. package/dist/mcp/tools/codebase-index.js +125 -0
  237. package/dist/mcp/tools/codebase-index.js.map +7 -0
  238. package/dist/mcp/tools/codebase-shared.js +265 -0
  239. package/dist/mcp/tools/codebase-shared.js.map +7 -0
  240. package/dist/mcp/tools/codebase-verify.js +48 -0
  241. package/dist/mcp/tools/codebase-verify.js.map +7 -0
  242. package/dist/mcp/tools/index.js +34 -1
  243. package/dist/mcp/tools/index.js.map +2 -2
  244. package/dist/mcp/tools/model-add.js +191 -74
  245. package/dist/mcp/tools/model-add.js.map +2 -2
  246. package/dist/mcp/tools/model-delete.js +2 -2
  247. package/dist/mcp/tools/model-delete.js.map +2 -2
  248. package/dist/mcp/tools/model-search.js +14 -0
  249. package/dist/mcp/tools/model-search.js.map +2 -2
  250. package/dist/mcp/tools/model-show.js +29 -2
  251. package/dist/mcp/tools/model-show.js.map +2 -2
  252. package/dist/mcp/tools/model-trace.js +93 -30
  253. package/dist/mcp/tools/model-trace.js.map +2 -2
  254. package/dist/mcp/tools/model-update.js +46 -26
  255. package/dist/mcp/tools/model-update.js.map +2 -2
  256. package/dist/mcp/tools/model-validate.js +46 -4
  257. package/dist/mcp/tools/model-validate.js.map +2 -2
  258. package/dist/mcp/tools/project-status-collectors.js +381 -0
  259. package/dist/mcp/tools/project-status-collectors.js.map +7 -0
  260. package/dist/mcp/tools/project-status.js +237 -0
  261. package/dist/mcp/tools/project-status.js.map +7 -0
  262. package/dist/mcp/tools/project-tools.js +505 -0
  263. package/dist/mcp/tools/project-tools.js.map +7 -0
  264. package/dist/mcp/tools/relationship-tools.js +167 -0
  265. package/dist/mcp/tools/relationship-tools.js.map +7 -0
  266. package/dist/mcp/tools/review-open.js +210 -0
  267. package/dist/mcp/tools/review-open.js.map +7 -0
  268. package/dist/mcp/tools/shared.js +35 -4
  269. package/dist/mcp/tools/shared.js.map +2 -2
  270. package/dist/mcp/tools/spec-type.js +90 -0
  271. package/dist/mcp/tools/spec-type.js.map +7 -0
  272. package/dist/reports/model-report-orchestrator.js +31 -2
  273. package/dist/reports/model-report-orchestrator.js.map +2 -2
  274. package/dist/schemas/bundled/analyzers/cbm.json +1200 -70
  275. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  276. package/dist/schemas/bundled/api.json +1029 -1658
  277. package/dist/schemas/bundled/apm.json +499 -734
  278. package/dist/schemas/bundled/application.json +735 -371
  279. package/dist/schemas/bundled/base.json +3 -220
  280. package/dist/schemas/bundled/business.json +452 -366
  281. package/dist/schemas/bundled/data-model.json +395 -411
  282. package/dist/schemas/bundled/data-store.json +334 -558
  283. package/dist/schemas/bundled/manifest.json +18 -18
  284. package/dist/schemas/bundled/motivation.json +349 -368
  285. package/dist/schemas/bundled/navigation.json +415 -731
  286. package/dist/schemas/bundled/product.json +325 -159
  287. package/dist/schemas/bundled/security.json +864 -1232
  288. package/dist/schemas/bundled/technology.json +574 -703
  289. package/dist/schemas/bundled/testing.json +865 -1646
  290. package/dist/schemas/bundled/ux.json +739 -1352
  291. package/dist/server/schemas.js +8 -0
  292. package/dist/server/schemas.js.map +2 -2
  293. package/dist/server/server.js +686 -231
  294. package/dist/server/server.js.map +3 -3
  295. package/dist/server/viewer-registry.js +264 -0
  296. package/dist/server/viewer-registry.js.map +7 -0
  297. package/dist/server-entry.js +2 -1
  298. package/dist/server-entry.js.map +2 -2
  299. package/dist/telemetry/index.js +1 -1
  300. package/dist/utils/ansi-suppressor.js +6 -8
  301. package/dist/utils/ansi-suppressor.js.map +2 -2
  302. package/dist/utils/attribute-patch.js +41 -0
  303. package/dist/utils/attribute-patch.js.map +7 -0
  304. package/dist/utils/error-hints.js +29 -0
  305. package/dist/utils/error-hints.js.map +7 -0
  306. package/dist/utils/errors.js +9 -3
  307. package/dist/utils/errors.js.map +2 -2
  308. package/dist/utils/id-generator.js +5 -2
  309. package/dist/utils/id-generator.js.map +2 -2
  310. package/dist/utils/project-paths.js +26 -1
  311. package/dist/utils/project-paths.js.map +2 -2
  312. package/dist/utils/source-reference.js +64 -31
  313. package/dist/utils/source-reference.js.map +2 -2
  314. package/dist/utils/spec-version.js +2 -2
  315. package/dist/utils/spec-version.js.map +1 -1
  316. package/dist/validators/composed-reference-validator.js +5 -27
  317. package/dist/validators/composed-reference-validator.js.map +2 -2
  318. package/dist/validators/model-warnings.js +28 -0
  319. package/dist/validators/model-warnings.js.map +7 -0
  320. package/dist/validators/reference-validator.js +0 -7
  321. package/dist/validators/reference-validator.js.map +2 -2
  322. package/dist/validators/relationship-schema-validator.js +3 -3
  323. package/dist/validators/relationship-schema-validator.js.map +2 -2
  324. package/dist/validators/schema-validator.js +27 -9
  325. package/dist/validators/schema-validator.js.map +2 -2
  326. package/dist/validators/types.js.map +1 -1
  327. package/dist/viewer/README.md +6 -6
  328. package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
  329. package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
  330. package/dist/viewer/index.html +2 -2
  331. package/dist/viewer/manifest.json +10 -10
  332. package/dist/viewer/version.json +1 -1
  333. package/package.json +2 -1
  334. package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
  335. package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
@@ -1,22 +1,32 @@
1
1
  {
2
- "specVersion": "0.10.0",
2
+ "specVersion": "0.12.0",
3
3
  "layer": {
4
4
  "id": "data-model",
5
5
  "number": 8,
6
6
  "name": "Data Model Layer",
7
- "description": "Layer 8: Data Model Layer",
7
+ "description": "Defines the logical data model: object schemas and their properties, enumerations, validation rules and the relationships between entities, independent of any particular storage technology (JSON Schema Draft 7). Entity classes, ORM models, DTO and record types, and type definitions that describe domain data are evidence for elements here; how that data is persisted belongs to the data-store layer. Modelling rules: data-model elements are passive structure; they are realized, accessed, referenced and mapped, and never serve, trigger or perform behaviour. A subschema written in place is part of what declares it (composes): a schema document composes its root schema and the definitions declared in it, an object schema composes its properties, an array schema its inline item schema, a composition its inline branches, and a property the value constraints it carries. A type declared elsewhere and reached by $ref or by name is referenced (references): a property references the object schema or definition its value takes, an array or composition references a named definition, and a Reference references the definition, object schema or document it points at. Subtyping is specializes. An entity class, an ORM model whatever the framework, or a type whose shape is published as a schema is an object schema; an in-code structure that only carries data between parts of the program is an application data object, which an object schema may realize. Object schemas and definitions realize the application data objects and business objects they give form to (a direct link to the business object is a shortcut through the data object), and map to their counterparts in other layers (maps-to): API schemas, request bodies, responses and parameters, and data-store collections. Behaviour reaches data by accessing it: application functions, components and events access object schemas and definitions, and business behaviour accesses the business objects they realize; a schema does not reference the behaviour that uses it. Schemas satisfy the requirements and constraints that govern the data but do not realize goals. The model is independent of technology: it does not depend on system software or use technology services, and the file that holds a schema document maps to a technology artifact.",
8
8
  "inspired_by": {
9
9
  "standard": "JSON Schema Draft 7",
10
10
  "version": "Draft 7",
11
11
  "url": "https://json-schema.org/draft-07/"
12
12
  },
13
- "node_types": []
13
+ "node_types": [
14
+ "data-model.arrayschema",
15
+ "data-model.jsonschema",
16
+ "data-model.numericschema",
17
+ "data-model.objectschema",
18
+ "data-model.reference",
19
+ "data-model.schemacomposition",
20
+ "data-model.schemadefinition",
21
+ "data-model.schemaproperty",
22
+ "data-model.stringschema"
23
+ ]
14
24
  },
15
25
  "nodeSchemas": {
16
26
  "arrayschema": {
17
27
  "$schema": "http://json-schema.org/draft-07/schema#",
18
28
  "title": "ArraySchema",
19
- "description": "Defines validation rules for JSON array instances, constraining item schemas, cardinality bounds (minItems/maxItems), uniqueness requirements, and contains-subschema matching.",
29
+ "description": "A JSON Schema subschema with type 'array' that constrains an ordered list of values: the schema each element must satisfy, how many elements are allowed, whether they must be distinct, and whether at least one element must match a given subschema. Use SchemaProperty instead when you are modelling the named field that holds the list (its name, title, description, readOnly) rather than the constraints on the list value itself. Use ObjectSchema instead when the collection is keyed by name rather than ordered by position, such as a Map<String, T>, dict or record type, which becomes an object with additionalProperties or patternProperties. Use SchemaDefinition instead when the list type is declared once under 'definitions' with a title and reused through $ref. Model the array constraints inside it as an arrayschema. Use SchemaComposition instead when the constraint is a boolean combination (allOf/anyOf/oneOf/not) of subschemas, for example a union of element types, rather than array keywords directly.",
20
30
  "allOf": [
21
31
  {
22
32
  "$ref": "urn:dr:spec:base:spec-node"
@@ -36,34 +46,52 @@
36
46
  "type": "object",
37
47
  "properties": {
38
48
  "type": {
39
- "const": "array"
49
+ "const": "array",
50
+ "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."
40
51
  },
41
52
  "items": {
42
- "type": "string"
53
+ "type": "string",
54
+ "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."
43
55
  },
44
56
  "minItems": {
45
- "type": "integer"
57
+ "type": "integer",
58
+ "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."
46
59
  },
47
60
  "maxItems": {
48
- "type": "integer"
61
+ "type": "integer",
62
+ "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."
49
63
  },
50
64
  "uniqueItems": {
51
- "type": "boolean"
65
+ "type": "boolean",
66
+ "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."
52
67
  },
53
68
  "contains": {
54
- "type": "string"
69
+ "type": "string",
70
+ "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."
55
71
  }
56
72
  },
57
73
  "required": [],
58
74
  "additionalProperties": false
59
75
  }
60
76
  },
77
+ "x-dr-standard": "JSON Schema Draft 7 Validation (draft-handrews-json-schema-validation-01) §6.4 Validation Keywords for Arrays (items, additionalItems, maxItems, minItems, uniqueItems, contains)",
78
+ "x-dr-evidence": [
79
+ "A DTO, entity or record field typed as a collection, such as List<T>, T[], Array<T>, Set<T>, Sequence[T] or repeated in protobuf, where Set or frozenset types imply uniqueItems.",
80
+ "Cardinality validators on a collection field, such as Bean Validation @Size(min, max) or @NotEmpty on a List, Pydantic conlist or Field(min_length=..., max_length=...), or Zod z.array(...).min().max().nonempty().",
81
+ "A JSON Schema or OpenAPI fragment containing \"type\": \"array\" together with an \"items\" keyword, often with minItems, maxItems or uniqueItems."
82
+ ],
83
+ "x-dr-distinguish": {
84
+ "data-model.schemaproperty": "you are modelling the named field that holds the list (its name, title, description, readOnly) rather than the constraints on the list value itself.",
85
+ "data-model.objectschema": "the collection is keyed by name rather than ordered by position, such as a Map<String, T>, dict or record type, which becomes an object with additionalProperties or patternProperties.",
86
+ "data-model.schemadefinition": "the list type is declared once under 'definitions' with a title and reused through $ref. Model the array constraints inside it as an arrayschema.",
87
+ "data-model.schemacomposition": "the constraint is a boolean combination (allOf/anyOf/oneOf/not) of subschemas, for example a union of element types, rather than array keywords directly."
88
+ },
61
89
  "$id": "urn:dr:spec:node:data-model.arrayschema"
62
90
  },
63
91
  "jsonschema": {
64
92
  "$schema": "http://json-schema.org/draft-07/schema#",
65
93
  "title": "JSONSchema",
66
- "description": "The root JSON Schema document, identified by $schema (dialect URI) and $id (base URI for $ref resolution), containing type constraints, annotations, and reusable definitions.",
94
+ "description": "A top-level schema document that is the unit of identity and $ref resolution in the data model: it declares a dialect via $schema and a base URI via $id, and contains the root type constraint plus any named subschemas under definitions. Only the outermost schema of a file or registered document qualifies; nested subschemas do not. Use SchemaDefinition instead when the schema is a named, reusable subschema nested under a document's definitions keyword rather than the document itself. Use ObjectSchema instead when you are modelling the object-level constraints (properties, required, additionalProperties) of a schema rather than the document that carries $schema/$id. Use Reference instead when the element is only a $ref pointer to another schema, not a self-contained document with its own $id. Use SchemaComposition instead when the element combines subschemas with allOf/anyOf/oneOf/not rather than being an identified root document.",
67
95
  "allOf": [
68
96
  {
69
97
  "$ref": "urn:dr:spec:base:spec-node"
@@ -83,13 +111,16 @@
83
111
  "type": "object",
84
112
  "properties": {
85
113
  "$schema": {
86
- "type": "string"
114
+ "type": "string",
115
+ "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."
87
116
  },
88
117
  "$id": {
89
- "type": "string"
118
+ "type": "string",
119
+ "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."
90
120
  },
91
121
  "title": {
92
- "type": "string"
122
+ "type": "string",
123
+ "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."
93
124
  },
94
125
  "type": {
95
126
  "type": "string",
@@ -113,12 +144,24 @@
113
144
  "additionalProperties": false
114
145
  }
115
146
  },
147
+ "x-dr-standard": "JSON Schema Draft 7 (draft-handrews-json-schema-01) §4.3.3 Root Schema and Subschemas, §7 The $schema Keyword, §8.2 The $id Keyword",
148
+ "x-dr-evidence": [
149
+ "a *.schema.json or *.json file whose top-level object contains \"$schema\": \"http://json-schema.org/draft-07/schema#\" and an \"$id\" URI",
150
+ "a schema registered with a validator by URI, e.g. ajv.addSchema(schema, 'https://example.com/order.json') or compile() called on a loaded file",
151
+ "a build step or decorator that emits a whole schema document per model, e.g. pydantic Model.model_json_schema() or zod-to-json-schema output written to a schemas/ directory"
152
+ ],
153
+ "x-dr-distinguish": {
154
+ "data-model.schemadefinition": "the schema is a named, reusable subschema nested under a document's definitions keyword rather than the document itself",
155
+ "data-model.objectschema": "you are modelling the object-level constraints (properties, required, additionalProperties) of a schema rather than the document that carries $schema/$id",
156
+ "data-model.reference": "the element is only a $ref pointer to another schema, not a self-contained document with its own $id",
157
+ "data-model.schemacomposition": "the element combines subschemas with allOf/anyOf/oneOf/not rather than being an identified root document"
158
+ },
116
159
  "$id": "urn:dr:spec:node:data-model.jsonschema"
117
160
  },
118
161
  "numericschema": {
119
162
  "$schema": "http://json-schema.org/draft-07/schema#",
120
163
  "title": "NumericSchema",
121
- "description": "Defines validation rules for JSON numeric instances (number or integer types), including inclusive/exclusive bounds and divisibility constraints. Note: in JSON Schema Draft 7, exclusiveMinimum and exclusiveMaximum are numeric boundary values (e.g., exclusiveMinimum: 0), not the boolean flags used in Draft 4.",
164
+ "description": "A schema constraining JSON number or integer values through validation keywords: inclusive or exclusive lower and upper bounds, or a divisibility step (multipleOf). It describes the value space of a numeric datum, independent of the field that carries it or how the value is stored. Use SchemaProperty instead when the element is a named field of an object (e.g. Order.quantity) carrying its own title, default, readOnly or description; the numeric constraints it applies may be modelled as a NumericSchema that the property composes. Use SchemaDefinition instead when the numeric type is a named, reusable definition under 'definitions' (e.g. a 'Percentage' type referenced via $ref), especially one restricted to an enum of fixed values rather than a range. Use StringSchema instead when the value is serialized as a string even though it looks numeric, e.g. a decimal-as-string money amount, a zero-padded code or a phone number constrained by pattern or length. Use SchemaComposition instead when the numeric constraint is formed by combining subschemas with allOf/anyOf/oneOf/not, e.g. 'positive OR null', rather than by a single set of bounds.",
122
165
  "allOf": [
123
166
  {
124
167
  "$ref": "urn:dr:spec:base:spec-node"
@@ -143,31 +186,48 @@
143
186
  "description": "JSON Schema Draft 7 numeric type: 'number' for any numeric value, 'integer' for whole numbers only"
144
187
  },
145
188
  "minimum": {
146
- "type": "number"
189
+ "type": "number",
190
+ "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."
147
191
  },
148
192
  "maximum": {
149
- "type": "number"
193
+ "type": "number",
194
+ "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."
150
195
  },
151
196
  "exclusiveMinimum": {
152
- "type": "number"
197
+ "type": "number",
198
+ "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."
153
199
  },
154
200
  "exclusiveMaximum": {
155
- "type": "number"
201
+ "type": "number",
202
+ "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."
156
203
  },
157
204
  "multipleOf": {
158
- "type": "number"
205
+ "type": "number",
206
+ "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."
159
207
  }
160
208
  },
161
209
  "required": ["type"],
162
210
  "additionalProperties": false
163
211
  }
164
212
  },
213
+ "x-dr-standard": "JSON Schema Draft 7 Validation §6.2 Validation Keywords for Numeric Instances (multipleOf, maximum, exclusiveMaximum, minimum, exclusiveMinimum), with type 'number'/'integer' (§6.1.1)",
214
+ "x-dr-evidence": [
215
+ "a JSON Schema or OpenAPI fragment with \"type\": \"integer\" or \"number\" plus minimum, maximum, exclusiveMinimum or multipleOf keywords",
216
+ "a numeric field annotated with range validators, e.g. Java @Min/@Max/@DecimalMin/@Positive, Pydantic Field(ge=0, le=100) or conint(gt=0), or Zod z.number().int().min(1)",
217
+ "a declared numeric value type or constrained alias with range checks in its constructor or validator, e.g. a Percentage or Quantity class that rejects values outside 0..100 or non-integers"
218
+ ],
219
+ "x-dr-distinguish": {
220
+ "data-model.schemaproperty": "the element is a named field of an object (e.g. Order.quantity) carrying its own title, default, readOnly or description; the numeric constraints it applies may be modelled as a NumericSchema that the property references.",
221
+ "data-model.schemadefinition": "the numeric type is a named, reusable definition under 'definitions' (e.g. a 'Percentage' type referenced via $ref), especially one restricted to an enum of fixed values rather than a range.",
222
+ "data-model.stringschema": "the value is serialized as a string even though it looks numeric, e.g. a decimal-as-string money amount, a zero-padded code or a phone number constrained by pattern or length.",
223
+ "data-model.schemacomposition": "the numeric constraint is formed by combining subschemas with allOf/anyOf/oneOf/not, e.g. 'positive OR null', rather than by a single set of bounds."
224
+ },
165
225
  "$id": "urn:dr:spec:node:data-model.numericschema"
166
226
  },
167
227
  "objectschema": {
168
228
  "$schema": "http://json-schema.org/draft-07/schema#",
169
229
  "title": "ObjectSchema",
170
- "description": "Defines validation rules for JSON object instances, specifying named properties, required fields, and constraints on additional or dynamically named properties.",
230
+ "description": "A schema node of type 'object' that constrains JSON object instances by declaring a set of named, typed properties, which of those properties must be present, and rules for undeclared or dynamically named keys. In code it corresponds to a structured domain record whose shape is part of the data model (an entity class, an ORM model whatever the framework, or a DTO, record or interface whose shape is published as a schema), not to an individual field or to a primitive type alias. Use application DataObject instead when the structure only carries data between parts of the program and is neither persisted as an entity nor published as a schema; an object schema may realize such a data object. Use SchemaProperty instead when the symbol is a single field, column or attribute inside a structure rather than the structure that owns the fields. Use JSONSchema instead when the element is the root schema document or file, identified by $schema and $id and holding definitions, rather than one object shape described within it. Use SchemaDefinition instead when the named reusable type is a primitive alias or enumeration (e.g. a TypeScript enum, a branded string type, a Python Enum) with no named fields of its own. Use SchemaComposition instead when the type is defined only by combining other schemas (union, intersection, discriminated oneOf, negation) rather than by declaring its own properties; plain class inheritance stays an objectschema with a specializes relationship.",
171
231
  "allOf": [
172
232
  {
173
233
  "$ref": "urn:dr:spec:base:spec-node"
@@ -187,7 +247,8 @@
187
247
  "type": "object",
188
248
  "properties": {
189
249
  "type": {
190
- "type": "string"
250
+ "type": "string",
251
+ "description": "The JSON Schema type keyword, which is always the string 'object' for this element; set it on every instance."
191
252
  },
192
253
  "properties": {
193
254
  "type": "object",
@@ -205,28 +266,44 @@
205
266
  "type": "array",
206
267
  "items": {
207
268
  "type": "string"
208
- }
269
+ },
270
+ "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."
209
271
  },
210
272
  "additionalProperties": {
211
- "type": "string"
273
+ "type": "string",
274
+ "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."
212
275
  },
213
276
  "minProperties": {
214
- "type": "integer"
277
+ "type": "integer",
278
+ "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."
215
279
  },
216
280
  "maxProperties": {
217
- "type": "integer"
281
+ "type": "integer",
282
+ "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."
218
283
  }
219
284
  },
220
285
  "required": ["type"],
221
286
  "additionalProperties": false
222
287
  }
223
288
  },
289
+ "x-dr-standard": "JSON Schema Draft 7 Validation (draft-handrews-json-schema-validation-01) §6.5 Validation Keywords for Objects",
290
+ "x-dr-evidence": [
291
+ "A class annotated @Entity/@Table, a Django models.Model subclass, or a SQLAlchemy declarative class whose attributes declare domain fields",
292
+ "A TypeScript interface or type literal, Pydantic BaseModel, Python @dataclass, Java record, or Go struct with named typed fields used as a DTO or request/response payload",
293
+ "A JSON Schema or OpenAPI components.schemas entry with \"type\": \"object\" and a \"properties\" map, or a z.object()/Joi.object()/yup.object() validator declaration"
294
+ ],
295
+ "x-dr-distinguish": {
296
+ "data-model.schemaproperty": "the symbol is a single field, column or attribute inside a structure rather than the structure that owns the fields",
297
+ "data-model.jsonschema": "the element is the root schema document or file, identified by $schema and $id and holding definitions, rather than one object shape described within it",
298
+ "data-model.schemadefinition": "the named reusable type is a primitive alias or enumeration (e.g. a TypeScript enum, a branded string type, a Python Enum) with no named fields of its own",
299
+ "data-model.schemacomposition": "the type is defined only by combining other schemas (union, intersection, discriminated oneOf, negation) rather than by declaring its own properties; plain class inheritance stays an objectschema with an extends relationship"
300
+ },
224
301
  "$id": "urn:dr:spec:node:data-model.objectschema"
225
302
  },
226
303
  "reference": {
227
304
  "$schema": "http://json-schema.org/draft-07/schema#",
228
305
  "title": "Reference",
229
- "description": "A JSON Schema $ref pointer that references another schema by URI or JSON Pointer fragment, enabling schema reuse without duplication. In JSON Schema Draft 7, all sibling keywords alongside $ref are ignored — use allOf to combine a $ref with additional constraints.",
306
+ "description": "A schema node whose only effective content is a $ref keyword holding a URI or JSON Pointer fragment (e.g. '#/definitions/Address') that delegates validation of an instance to another schema, adding no constraints of its own. A usage site that points at a type declared elsewhere, not the declaration of that type. Use SchemaDefinition instead when the element is the named, reusable type being pointed at (the target under 'definitions'), rather than the pointer to it. Use SchemaProperty instead when the element is a named property of an object schema that also carries its own type, description, default or other constraints, even if it uses $ref to obtain its type. Use SchemaComposition instead when the $ref must be combined with further constraints or alternatives, which in Draft 7 requires wrapping it in allOf/anyOf/oneOf. Use JSONSchema instead when the element is the whole root schema document with $schema and $id, not a pointer into or toward one.",
230
307
  "allOf": [
231
308
  {
232
309
  "$ref": "urn:dr:spec:base:spec-node"
@@ -253,12 +330,24 @@
253
330
  "additionalProperties": false
254
331
  }
255
332
  },
333
+ "x-dr-standard": "JSON Schema Draft 7 (draft-handrews-json-schema-01) §8.3 Schema References With \"$ref\"",
334
+ "x-dr-evidence": [
335
+ "A literal \"$ref\": \"#/definitions/...\" or \"$ref\": \"other.schema.json#/...\" entry in a JSON/YAML schema or an OpenAPI components file",
336
+ "A field in a DTO, Pydantic model or TypeScript interface typed by another separately declared model class (e.g. 'billing: Address'), which schema generators emit as a $ref",
337
+ "Schema-generator configuration or decorators that hoist nested types into shared definitions, such as Pydantic's ref_template, zod-to-json-schema $refStrategy, or @ApiProperty({ type: () => Address })"
338
+ ],
339
+ "x-dr-distinguish": {
340
+ "data-model.schemadefinition": "the element is the named, reusable type being pointed at (the target under 'definitions'), rather than the pointer to it",
341
+ "data-model.schemaproperty": "the element is a named property of an object schema that also carries its own type, description, default or other constraints, even if it uses $ref to obtain its type",
342
+ "data-model.schemacomposition": "the $ref must be combined with further constraints or alternatives, which in Draft 7 requires wrapping it in allOf/anyOf/oneOf",
343
+ "data-model.jsonschema": "the element is the whole root schema document with $schema and $id, not a pointer into or toward one"
344
+ },
256
345
  "$id": "urn:dr:spec:node:data-model.reference"
257
346
  },
258
347
  "schemacomposition": {
259
348
  "$schema": "http://json-schema.org/draft-07/schema#",
260
349
  "title": "SchemaComposition",
261
- "description": "Combines multiple schemas using boolean logic. allOf requires all subschemas to validate; anyOf requires at least one; oneOf requires exactly one; not inverts the result of the subschema.",
350
+ "description": "A schema node whose validation outcome is computed by applying boolean logic (allOf, anyOf, oneOf, not) to the outcomes of one or more subschemas, rather than by constraining the instance's type, properties, items, length or bounds directly. In code it corresponds to union, intersection, discriminated-variant or negation types built from other data types. Use Reference instead when the node is a single $ref pointer to another schema with no boolean combination; a lone $ref wrapped in a one-element allOf only to attach sibling constraints is still a composition. Use ObjectSchema instead when the structure comes from declared properties, required and additionalProperties on one object, not from merging or choosing among separate subschemas (e.g. a class extending a base is modelled as one object unless the base is a distinct schema combined via allOf). Use SchemaDefinition instead when the subject is the named, reusable entry under definitions itself; a definition whose body is an anyOf/oneOf is a schemadefinition, and the composition is referenced from where it is used. Use StringSchema instead when a set of allowed string literals is expressed with enum or const on one string schema rather than as oneOf over separate subschemas.",
262
351
  "allOf": [
263
352
  {
264
353
  "$ref": "urn:dr:spec:base:spec-node"
@@ -306,12 +395,24 @@
306
395
  "additionalProperties": false
307
396
  }
308
397
  },
398
+ "x-dr-standard": "JSON Schema Draft 7 (draft-handrews-json-schema-validation-01) §6.7 Keywords for Applying Subschemas With Boolean Logic (allOf, anyOf, oneOf, not)",
399
+ "x-dr-evidence": [
400
+ "A TypeScript union or intersection type alias (type Payment = Card | BankTransfer; type Admin = User & Permissions), or a Python Union[...]/Annotated discriminated union field in a Pydantic model",
401
+ "Serialization polymorphism annotations such as Jackson @JsonTypeInfo/@JsonSubTypes, a Pydantic Field(discriminator=...), or OpenAPI/JSON Schema files containing allOf, anyOf, oneOf or not keys",
402
+ "Validator-library combinators that join other schemas: zod z.union/z.discriminatedUnion/z.intersection/.and(), Joi alternatives().try(), or io-ts t.union/t.intersection"
403
+ ],
404
+ "x-dr-distinguish": {
405
+ "data-model.reference": "the node is a single $ref pointer to another schema with no boolean combination; a lone $ref wrapped in a one-element allOf only to attach sibling constraints is still a composition.",
406
+ "data-model.objectschema": "the structure comes from declared properties, required and additionalProperties on one object, not from merging or choosing among separate subschemas (e.g. a class extending a base is modelled as one object unless the base is a distinct schema combined via allOf).",
407
+ "data-model.schemadefinition": "the subject is the named, reusable entry under definitions itself; a definition whose body is an anyOf/oneOf is a schemadefinition that aggregates a composition.",
408
+ "data-model.stringschema": "a set of allowed string literals is expressed with enum or const on one string schema rather than as oneOf over separate subschemas."
409
+ },
309
410
  "$id": "urn:dr:spec:node:data-model.schemacomposition"
310
411
  },
311
412
  "schemadefinition": {
312
413
  "$schema": "http://json-schema.org/draft-07/schema#",
313
414
  "title": "SchemaDefinition",
314
- "description": "A reusable JSON Schema definition declared under the 'definitions' keyword and referenced via '$ref: #/definitions/{name}'. Enables DRY schema design and consistent type definitions across entities.",
415
+ "description": "A named, reusable subschema declared under a JSON Schema document's 'definitions' keyword and addressable as '$ref: #/definitions/{name}'. It describes one domain data type, such as an entity, value object, DTO or enumeration, that other schemas or properties reuse by name rather than declaring inline. Use ObjectSchema instead when you are modelling the structural constraints of an object (its properties, required list, additionalProperties) rather than the named, reusable type entry that carries them. Use SchemaProperty instead when the schema is a single field declared inline within a parent schema's properties and is not reused by name elsewhere. Use JSONSchema instead when the element is the root schema document with its own $schema and $id, not an entry within its definitions. Use Reference instead when the element is only the $ref pointer that points at a definition, not the definition itself.",
315
416
  "allOf": [
316
417
  {
317
418
  "$ref": "urn:dr:spec:base:spec-node"
@@ -331,7 +432,8 @@
331
432
  "type": "object",
332
433
  "properties": {
333
434
  "title": {
334
- "type": "string"
435
+ "type": "string",
436
+ "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."
335
437
  },
336
438
  "type": {
337
439
  "type": "string",
@@ -373,12 +475,24 @@
373
475
  "additionalProperties": false
374
476
  }
375
477
  },
478
+ "x-dr-standard": "JSON Schema Draft 7 (draft-handrews-json-schema-validation-01) §9 Schema Re-Use With \"definitions\"",
479
+ "x-dr-evidence": [
480
+ "an entry under \"definitions\" (or \"$defs\", or OpenAPI \"components.schemas\") in a .schema.json or spec file that is targeted by one or more \"$ref\": \"#/definitions/...\" pointers",
481
+ "an exported entity, DTO or record class, a TypeScript interface or type alias, or a Pydantic/zod model that other types import and use as a field type",
482
+ "an exported enum type (e.g. a Java enum, TypeScript enum or Python Enum subclass) whose values represent a fixed domain vocabulary used by several models"
483
+ ],
484
+ "x-dr-distinguish": {
485
+ "data-model.objectschema": "you are modelling the structural constraints of an object (its properties, required list, additionalProperties) rather than the named, reusable type entry that carries them",
486
+ "data-model.schemaproperty": "the schema is a single field declared inline within a parent schema's properties and is not reused by name elsewhere",
487
+ "data-model.jsonschema": "the element is the root schema document with its own $schema and $id, not an entry within its definitions",
488
+ "data-model.reference": "the element is only the $ref pointer that points at a definition, not the definition itself"
489
+ },
376
490
  "$id": "urn:dr:spec:node:data-model.schemadefinition"
377
491
  },
378
492
  "schemaproperty": {
379
493
  "$schema": "http://json-schema.org/draft-07/schema#",
380
494
  "title": "SchemaProperty",
381
- "description": "Defines a single property within a schema, including its type, constraints, validation rules, and documentation. The fundamental building block of data model structure.",
495
+ "description": "A single named field of an object schema, such as one attribute of a domain entity, DTO or record type, together with the subschema that governs its value: type, value restrictions (enum, const, format, default) and annotations (title, description, readOnly, writeOnly, examples). It corresponds to one entry under an ObjectSchema's 'properties' keyword and has no meaning apart from its owning object. Use ObjectSchema instead when the element is the whole entity, class or record that owns several fields, rather than one field of it. Use SchemaDefinition instead when the schema is a named, reusable type declared under 'definitions' (for example a shared enum or value type referenced by several fields) rather than a field belonging to one owning object. Use StringSchema instead when you are modelling the string constraints of the value (minLength, maxLength, pattern, format) apart from the field, which the property then composes; a reusable named string type is a SchemaDefinition. Use NumericSchema instead when you are modelling the numeric bounds or multipleOf rule of the value apart from the field, which the property then composes.",
382
496
  "allOf": [
383
497
  {
384
498
  "$ref": "urn:dr:spec:base:spec-node"
@@ -411,28 +525,36 @@
411
525
  "description": "JSON Schema Draft 7 primitive type"
412
526
  },
413
527
  "title": {
414
- "type": "string"
528
+ "type": "string",
529
+ "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."
415
530
  },
416
531
  "format": {
417
- "type": "string"
532
+ "type": "string",
533
+ "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."
418
534
  },
419
535
  "default": {
420
- "type": "string"
536
+ "type": "string",
537
+ "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."
421
538
  },
422
539
  "enum": {
423
- "type": "string"
540
+ "type": "string",
541
+ "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."
424
542
  },
425
543
  "const": {
426
- "type": "string"
544
+ "type": "string",
545
+ "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."
427
546
  },
428
547
  "readOnly": {
429
- "type": "boolean"
548
+ "type": "boolean",
549
+ "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."
430
550
  },
431
551
  "writeOnly": {
432
- "type": "boolean"
552
+ "type": "boolean",
553
+ "description": "Set to true when the value may be submitted but is never returned in representations, such as passwords, secrets or one-time tokens."
433
554
  },
434
555
  "examples": {
435
- "type": "string"
556
+ "type": "string",
557
+ "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."
436
558
  },
437
559
  "description": {
438
560
  "type": "string",
@@ -447,12 +569,24 @@
447
569
  "additionalProperties": false
448
570
  }
449
571
  },
572
+ "x-dr-standard": "JSON Schema Draft 7 Validation, §6.5.4 'properties' (a member subschema), with §6.1.2 enum, §6.1.3 const, §7 format and §10 annotation keywords",
573
+ "x-dr-evidence": [
574
+ "An attribute declared on an ORM entity class, such as a JPA @Column field, a SQLAlchemy Column(...) or a Django models.CharField.",
575
+ "A typed member of a DTO, Pydantic/dataclass model, TypeScript interface or protobuf message, often carrying a validator, default value or Field(...) metadata.",
576
+ "A key nested under 'properties' in a JSON Schema file or an OpenAPI components/schemas entry, with its own 'type', 'format' or 'enum'."
577
+ ],
578
+ "x-dr-distinguish": {
579
+ "data-model.objectschema": "the element is the whole entity, class or record that owns several fields, rather than one field of it.",
580
+ "data-model.schemadefinition": "the schema is a named, reusable type declared under 'definitions' (for example a shared enum or value type referenced by several fields) rather than a field belonging to one owning object.",
581
+ "data-model.stringschema": "you are modelling a reusable bundle of string constraints (minLength, maxLength, pattern) that a property points to, rather than the field itself.",
582
+ "data-model.numericschema": "you are modelling a reusable bundle of numeric bounds or a multipleOf rule that a property points to, rather than the field itself."
583
+ },
450
584
  "$id": "urn:dr:spec:node:data-model.schemaproperty"
451
585
  },
452
586
  "stringschema": {
453
587
  "$schema": "http://json-schema.org/draft-07/schema#",
454
588
  "title": "StringSchema",
455
- "description": "Defines validation rules for JSON string instances, including length bounds (minLength/maxLength), regular expression patterns, and semantic format hints (e.g., date-time, email, uri). The canonical node type for string type constraints in the data model.",
589
+ "description": "A JSON Schema subschema whose type is 'string' and which constrains string instances through at least one string-specific keyword: minLength, maxLength, pattern or format. A bare type: 'string' with no such keyword is not enough. Use SchemaProperty instead when the element is the named member of an object (its name, documentation, default, readOnly/writeOnly), rather than the string constraint set that the property composes. Use SchemaDefinition instead when the string type is declared as a named, reusable entry under 'definitions' and referenced via $ref, especially an enumerated string type defined mainly by its enum values. Use Reference instead when the code only points to another schema via $ref and declares no length, pattern or format constraints of its own. Use SchemaComposition instead when string constraints are combined with other subschemas through allOf/anyOf/oneOf/not, and the combination itself is the element being modelled.",
456
590
  "allOf": [
457
591
  {
458
592
  "$ref": "urn:dr:spec:base:spec-node"
@@ -472,16 +606,20 @@
472
606
  "type": "object",
473
607
  "properties": {
474
608
  "type": {
475
- "const": "string"
609
+ "const": "string",
610
+ "description": "The JSON Schema type keyword. Always set it to the literal 'string', the value that identifies this element as a string schema."
476
611
  },
477
612
  "minLength": {
478
- "type": "integer"
613
+ "type": "integer",
614
+ "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."
479
615
  },
480
616
  "maxLength": {
481
- "type": "integer"
617
+ "type": "integer",
618
+ "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."
482
619
  },
483
620
  "pattern": {
484
- "type": "string"
621
+ "type": "string",
622
+ "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."
485
623
  },
486
624
  "format": {
487
625
  "type": "string",
@@ -512,64 +650,69 @@
512
650
  "additionalProperties": false
513
651
  }
514
652
  },
653
+ "x-dr-standard": "JSON Schema Validation Draft 7 §6.3 Validation Keywords for Strings (maxLength, minLength, pattern) and §7 Semantic Validation with 'format'",
654
+ "x-dr-evidence": [
655
+ "A JSON/YAML schema fragment of the form {\"type\": \"string\", \"maxLength\": 255, \"pattern\": \"^[A-Z]{3}$\"} or one carrying a \"format\" keyword, embedded in a schema file or OpenAPI components",
656
+ "A string field declared with validation constraints, such as Pydantic constr(min_length=…, regex=…) or Field(max_length=…), Zod z.string().min().max().email(), or Joi.string().pattern()",
657
+ "A Java/Kotlin String field annotated with Bean Validation constraints such as @Size(min=…, max=…), @Pattern(regexp=…), or @Email in an entity or DTO class"
658
+ ],
659
+ "x-dr-distinguish": {
660
+ "data-model.schemaproperty": "the element is the named member of an object (its name, documentation, default, readOnly/writeOnly), rather than the string constraint set that the property references or embeds",
661
+ "data-model.schemadefinition": "the string type is declared as a named, reusable entry under 'definitions' and referenced via $ref, especially an enumerated string type defined mainly by its enum values",
662
+ "data-model.reference": "the code only points to another schema via $ref and declares no length, pattern or format constraints of its own",
663
+ "data-model.schemacomposition": "string constraints are combined with other subschemas through allOf/anyOf/oneOf/not, and the combination itself is the element being modelled"
664
+ },
515
665
  "$id": "urn:dr:spec:node:data-model.stringschema"
516
666
  }
517
667
  },
518
668
  "relationshipSchemas": {
519
- "data-model.arrayschema.aggregates.data-model.numericschema": {
520
- "id": "data-model.arrayschema.aggregates.data-model.numericschema",
669
+ "data-model.arrayschema.composes.data-model.numericschema": {
670
+ "id": "data-model.arrayschema.composes.data-model.numericschema",
521
671
  "source_spec_node_id": "data-model.arrayschema",
522
672
  "source_layer": "data-model",
523
673
  "destination_spec_node_id": "data-model.numericschema",
524
674
  "destination_layer": "data-model",
525
- "predicate": "aggregates",
675
+ "predicate": "composes",
526
676
  "cardinality": "many-to-many",
527
677
  "strength": "medium",
528
- "required": false
678
+ "required": false,
679
+ "description": "The array's items are numbers constrained in place (an items subschema with bounds or multipleOf), so the numeric schema is part of the array schema. Use references to a schema definition instead when the item type is a named, reusable definition."
529
680
  },
530
- "data-model.arrayschema.aggregates.data-model.objectschema": {
531
- "id": "data-model.arrayschema.aggregates.data-model.objectschema",
681
+ "data-model.arrayschema.composes.data-model.objectschema": {
682
+ "id": "data-model.arrayschema.composes.data-model.objectschema",
532
683
  "source_spec_node_id": "data-model.arrayschema",
533
684
  "source_layer": "data-model",
534
685
  "destination_spec_node_id": "data-model.objectschema",
535
686
  "destination_layer": "data-model",
536
- "predicate": "aggregates",
687
+ "predicate": "composes",
537
688
  "cardinality": "many-to-many",
538
689
  "strength": "medium",
539
- "required": false
690
+ "required": false,
691
+ "description": "The array's items are objects whose shape is written in place under items, so the object schema is part of the array schema. When the items are a named entity or record declared elsewhere, the array references that definition, or the property that holds the list references the object schema."
540
692
  },
541
- "data-model.arrayschema.aggregates.data-model.reference": {
542
- "id": "data-model.arrayschema.aggregates.data-model.reference",
693
+ "data-model.arrayschema.composes.data-model.reference": {
694
+ "id": "data-model.arrayschema.composes.data-model.reference",
543
695
  "source_spec_node_id": "data-model.arrayschema",
544
696
  "source_layer": "data-model",
545
697
  "destination_spec_node_id": "data-model.reference",
546
698
  "destination_layer": "data-model",
547
- "predicate": "aggregates",
548
- "cardinality": "many-to-many",
549
- "strength": "medium",
550
- "required": false
551
- },
552
- "data-model.arrayschema.aggregates.data-model.schemadefinition": {
553
- "id": "data-model.arrayschema.aggregates.data-model.schemadefinition",
554
- "source_spec_node_id": "data-model.arrayschema",
555
- "source_layer": "data-model",
556
- "destination_spec_node_id": "data-model.schemadefinition",
557
- "destination_layer": "data-model",
558
- "predicate": "aggregates",
699
+ "predicate": "composes",
559
700
  "cardinality": "many-to-many",
560
701
  "strength": "medium",
561
- "required": false
702
+ "required": false,
703
+ "description": "The array's items keyword is a $ref written in place, so the reference node is part of the array schema; the reference in turn references the type it points at."
562
704
  },
563
- "data-model.arrayschema.aggregates.data-model.stringschema": {
564
- "id": "data-model.arrayschema.aggregates.data-model.stringschema",
705
+ "data-model.arrayschema.composes.data-model.stringschema": {
706
+ "id": "data-model.arrayschema.composes.data-model.stringschema",
565
707
  "source_spec_node_id": "data-model.arrayschema",
566
708
  "source_layer": "data-model",
567
709
  "destination_spec_node_id": "data-model.stringschema",
568
710
  "destination_layer": "data-model",
569
- "predicate": "aggregates",
711
+ "predicate": "composes",
570
712
  "cardinality": "many-to-many",
571
713
  "strength": "medium",
572
- "required": false
714
+ "required": false,
715
+ "description": "The array's items are strings constrained in place (length, pattern or format under items), so the string schema is part of the array schema. Use references to a schema definition instead when the item type is a named string type such as an enumeration."
573
716
  },
574
717
  "data-model.arrayschema.maps-to.api.response": {
575
718
  "id": "data-model.arrayschema.maps-to.api.response",
@@ -580,62 +723,68 @@
580
723
  "predicate": "maps-to",
581
724
  "cardinality": "many-to-many",
582
725
  "strength": "medium",
583
- "required": false
726
+ "required": false,
727
+ "description": "The array schema describes the same list as an API response body that returns a collection, such as a list endpoint's payload. Use the object schema's maps-to response instead when the response is a single object, including an object that wraps the list."
584
728
  },
585
- "data-model.jsonschema.aggregates.data-model.arrayschema": {
586
- "id": "data-model.jsonschema.aggregates.data-model.arrayschema",
587
- "source_spec_node_id": "data-model.jsonschema",
729
+ "data-model.arrayschema.references.data-model.schemadefinition": {
730
+ "id": "data-model.arrayschema.references.data-model.schemadefinition",
731
+ "source_spec_node_id": "data-model.arrayschema",
588
732
  "source_layer": "data-model",
589
- "destination_spec_node_id": "data-model.arrayschema",
733
+ "destination_spec_node_id": "data-model.schemadefinition",
590
734
  "destination_layer": "data-model",
591
- "predicate": "aggregates",
735
+ "predicate": "references",
592
736
  "cardinality": "many-to-many",
593
737
  "strength": "medium",
594
- "required": false
738
+ "required": false,
739
+ "description": "The array's items are a named, reusable definition reached by $ref or by name, so the array points at a type it does not own. Use composes instead when the item schema is written in place."
595
740
  },
596
- "data-model.jsonschema.aggregates.data-model.objectschema": {
597
- "id": "data-model.jsonschema.aggregates.data-model.objectschema",
741
+ "data-model.jsonschema.composes.data-model.arrayschema": {
742
+ "id": "data-model.jsonschema.composes.data-model.arrayschema",
598
743
  "source_spec_node_id": "data-model.jsonschema",
599
744
  "source_layer": "data-model",
600
- "destination_spec_node_id": "data-model.objectschema",
745
+ "destination_spec_node_id": "data-model.arrayschema",
601
746
  "destination_layer": "data-model",
602
- "predicate": "aggregates",
747
+ "predicate": "composes",
603
748
  "cardinality": "many-to-many",
604
749
  "strength": "medium",
605
- "required": false
750
+ "required": false,
751
+ "description": "The document's root schema is an array schema, which exists only as part of the document."
606
752
  },
607
- "data-model.jsonschema.aggregates.data-model.schemacomposition": {
608
- "id": "data-model.jsonschema.aggregates.data-model.schemacomposition",
753
+ "data-model.jsonschema.composes.data-model.objectschema": {
754
+ "id": "data-model.jsonschema.composes.data-model.objectschema",
609
755
  "source_spec_node_id": "data-model.jsonschema",
610
756
  "source_layer": "data-model",
611
- "destination_spec_node_id": "data-model.schemacomposition",
757
+ "destination_spec_node_id": "data-model.objectschema",
612
758
  "destination_layer": "data-model",
613
- "predicate": "aggregates",
759
+ "predicate": "composes",
614
760
  "cardinality": "many-to-many",
615
761
  "strength": "medium",
616
- "required": false
762
+ "required": false,
763
+ "description": "The document's root schema, or an object shape written in place in it, is this object schema, which exists only as part of the document."
617
764
  },
618
- "data-model.jsonschema.aggregates.data-model.schemadefinition": {
619
- "id": "data-model.jsonschema.aggregates.data-model.schemadefinition",
765
+ "data-model.jsonschema.composes.data-model.schemacomposition": {
766
+ "id": "data-model.jsonschema.composes.data-model.schemacomposition",
620
767
  "source_spec_node_id": "data-model.jsonschema",
621
768
  "source_layer": "data-model",
622
- "destination_spec_node_id": "data-model.schemadefinition",
769
+ "destination_spec_node_id": "data-model.schemacomposition",
623
770
  "destination_layer": "data-model",
624
- "predicate": "aggregates",
771
+ "predicate": "composes",
625
772
  "cardinality": "many-to-many",
626
773
  "strength": "medium",
627
- "required": false
774
+ "required": false,
775
+ "description": "The document's root schema is a composition (allOf, anyOf, oneOf or not), which exists only as part of the document."
628
776
  },
629
- "data-model.jsonschema.depends-on.technology.systemsoftware": {
630
- "id": "data-model.jsonschema.depends-on.technology.systemsoftware",
777
+ "data-model.jsonschema.composes.data-model.schemadefinition": {
778
+ "id": "data-model.jsonschema.composes.data-model.schemadefinition",
631
779
  "source_spec_node_id": "data-model.jsonschema",
632
780
  "source_layer": "data-model",
633
- "destination_spec_node_id": "technology.systemsoftware",
634
- "destination_layer": "technology",
635
- "predicate": "depends-on",
781
+ "destination_spec_node_id": "data-model.schemadefinition",
782
+ "destination_layer": "data-model",
783
+ "predicate": "composes",
636
784
  "cardinality": "many-to-many",
637
785
  "strength": "medium",
638
- "required": false
786
+ "required": false,
787
+ "description": "The definition is declared under this document's definitions keyword and is addressed through the document's $id, so it does not exist apart from the document even though other schemas reference it by name."
639
788
  },
640
789
  "data-model.jsonschema.maps-to.technology.artifact": {
641
790
  "id": "data-model.jsonschema.maps-to.technology.artifact",
@@ -646,51 +795,20 @@
646
795
  "predicate": "maps-to",
647
796
  "cardinality": "many-to-many",
648
797
  "strength": "medium",
649
- "required": false
798
+ "required": false,
799
+ "description": "The schema document is stored in or published as this artifact, such as a .schema.json file or a generated schema bundle; the artifact is the technology form of the document."
650
800
  },
651
- "data-model.jsonschema.realizes.motivation.goal": {
652
- "id": "data-model.jsonschema.realizes.motivation.goal",
653
- "source_spec_node_id": "data-model.jsonschema",
654
- "source_layer": "data-model",
655
- "destination_spec_node_id": "motivation.goal",
656
- "destination_layer": "motivation",
657
- "predicate": "realizes",
658
- "cardinality": "many-to-many",
659
- "strength": "medium",
660
- "required": false
661
- },
662
- "data-model.jsonschema.realizes.api.schema": {
663
- "id": "data-model.jsonschema.realizes.api.schema",
801
+ "data-model.jsonschema.maps-to.api.schema": {
802
+ "id": "data-model.jsonschema.maps-to.api.schema",
664
803
  "source_spec_node_id": "data-model.jsonschema",
665
804
  "source_layer": "data-model",
666
805
  "destination_spec_node_id": "api.schema",
667
806
  "destination_layer": "api",
668
- "predicate": "realizes",
669
- "cardinality": "many-to-many",
670
- "strength": "medium",
671
- "required": false
672
- },
673
- "data-model.jsonschema.references.application.applicationservice": {
674
- "id": "data-model.jsonschema.references.application.applicationservice",
675
- "source_spec_node_id": "data-model.jsonschema",
676
- "source_layer": "data-model",
677
- "destination_spec_node_id": "application.applicationservice",
678
- "destination_layer": "application",
679
- "predicate": "references",
680
- "cardinality": "many-to-many",
681
- "strength": "medium",
682
- "required": false
683
- },
684
- "data-model.jsonschema.references.business.businessobject": {
685
- "id": "data-model.jsonschema.references.business.businessobject",
686
- "source_spec_node_id": "data-model.jsonschema",
687
- "source_layer": "data-model",
688
- "destination_spec_node_id": "business.businessobject",
689
- "destination_layer": "business",
690
- "predicate": "references",
807
+ "predicate": "maps-to",
691
808
  "cardinality": "many-to-many",
692
809
  "strength": "medium",
693
- "required": false
810
+ "required": false,
811
+ "description": "The schema document describes the same data as an API schema, for example a JSON Schema file that an OpenAPI component reuses or is generated from. Use the schema definition's or object schema's maps-to instead when one type inside the document corresponds to the API schema."
694
812
  },
695
813
  "data-model.jsonschema.satisfies.motivation.constraint": {
696
814
  "id": "data-model.jsonschema.satisfies.motivation.constraint",
@@ -701,7 +819,8 @@
701
819
  "predicate": "satisfies",
702
820
  "cardinality": "many-to-many",
703
821
  "strength": "medium",
704
- "required": false
822
+ "required": false,
823
+ "description": "The schema document as a whole meets a constraint on the data, such as a mandated interchange format or a standard the schemas must conform to."
705
824
  },
706
825
  "data-model.jsonschema.satisfies.motivation.requirement": {
707
826
  "id": "data-model.jsonschema.satisfies.motivation.requirement",
@@ -712,73 +831,20 @@
712
831
  "predicate": "satisfies",
713
832
  "cardinality": "many-to-many",
714
833
  "strength": "medium",
715
- "required": false
716
- },
717
- "data-model.jsonschema.serves.application.applicationfunction": {
718
- "id": "data-model.jsonschema.serves.application.applicationfunction",
719
- "source_spec_node_id": "data-model.jsonschema",
720
- "source_layer": "data-model",
721
- "destination_spec_node_id": "application.applicationfunction",
722
- "destination_layer": "application",
723
- "predicate": "serves",
724
- "cardinality": "many-to-many",
725
- "strength": "medium",
726
- "required": false
727
- },
728
- "data-model.jsonschema.serves.business.businessservice": {
729
- "id": "data-model.jsonschema.serves.business.businessservice",
730
- "source_spec_node_id": "data-model.jsonschema",
731
- "source_layer": "data-model",
732
- "destination_spec_node_id": "business.businessservice",
733
- "destination_layer": "business",
734
- "predicate": "serves",
735
- "cardinality": "many-to-many",
736
- "strength": "medium",
737
- "required": false
738
- },
739
- "data-model.jsonschema.uses.technology.technologyservice": {
740
- "id": "data-model.jsonschema.uses.technology.technologyservice",
741
- "source_spec_node_id": "data-model.jsonschema",
742
- "source_layer": "data-model",
743
- "destination_spec_node_id": "technology.technologyservice",
744
- "destination_layer": "technology",
745
- "predicate": "uses",
746
- "cardinality": "many-to-many",
747
- "strength": "medium",
748
- "required": false
834
+ "required": false,
835
+ "description": "The schema document as a whole meets a requirement on the data, such as publishing a contract that consumers can validate against. Use the object schema's or definition's satisfies instead when one type meets the requirement."
749
836
  },
750
- "data-model.objectschema.aggregates.data-model.schemaproperty": {
751
- "id": "data-model.objectschema.aggregates.data-model.schemaproperty",
837
+ "data-model.objectschema.composes.data-model.schemaproperty": {
838
+ "id": "data-model.objectschema.composes.data-model.schemaproperty",
752
839
  "source_spec_node_id": "data-model.objectschema",
753
840
  "source_layer": "data-model",
754
841
  "destination_spec_node_id": "data-model.schemaproperty",
755
842
  "destination_layer": "data-model",
756
- "predicate": "aggregates",
757
- "cardinality": "many-to-many",
758
- "strength": "medium",
759
- "required": false
760
- },
761
- "data-model.objectschema.depends-on.technology.systemsoftware": {
762
- "id": "data-model.objectschema.depends-on.technology.systemsoftware",
763
- "source_spec_node_id": "data-model.objectschema",
764
- "source_layer": "data-model",
765
- "destination_spec_node_id": "technology.systemsoftware",
766
- "destination_layer": "technology",
767
- "predicate": "depends-on",
768
- "cardinality": "many-to-many",
769
- "strength": "medium",
770
- "required": false
771
- },
772
- "data-model.objectschema.extends.data-model.objectschema": {
773
- "id": "data-model.objectschema.extends.data-model.objectschema",
774
- "source_spec_node_id": "data-model.objectschema",
775
- "source_layer": "data-model",
776
- "destination_spec_node_id": "data-model.objectschema",
777
- "destination_layer": "data-model",
778
- "predicate": "extends",
843
+ "predicate": "composes",
779
844
  "cardinality": "many-to-many",
780
845
  "strength": "medium",
781
- "required": false
846
+ "required": false,
847
+ "description": "The property is one of the fields the object schema declares under properties, and it has no meaning apart from the object that owns it."
782
848
  },
783
849
  "data-model.objectschema.maps-to.data-store.collection": {
784
850
  "id": "data-model.objectschema.maps-to.data-store.collection",
@@ -789,7 +855,8 @@
789
855
  "predicate": "maps-to",
790
856
  "cardinality": "many-to-many",
791
857
  "strength": "medium",
792
- "required": false
858
+ "required": false,
859
+ "description": "The object schema describes the same records that the collection or table stores, such as an entity class and its table. Use the schema definition's maps-to instead when the stored type is a named definition rather than an object schema."
793
860
  },
794
861
  "data-model.objectschema.maps-to.api.requestbody": {
795
862
  "id": "data-model.objectschema.maps-to.api.requestbody",
@@ -800,7 +867,8 @@
800
867
  "predicate": "maps-to",
801
868
  "cardinality": "many-to-many",
802
869
  "strength": "medium",
803
- "required": false
870
+ "required": false,
871
+ "description": "The object schema describes the same payload that an API operation accepts as its request body, such as the DTO a create endpoint binds."
804
872
  },
805
873
  "data-model.objectschema.maps-to.api.response": {
806
874
  "id": "data-model.objectschema.maps-to.api.response",
@@ -811,7 +879,8 @@
811
879
  "predicate": "maps-to",
812
880
  "cardinality": "many-to-many",
813
881
  "strength": "medium",
814
- "required": false
882
+ "required": false,
883
+ "description": "The object schema describes the same payload that an API operation returns as a response body. Use the array schema's maps-to response instead when the response is a bare list."
815
884
  },
816
885
  "data-model.objectschema.realizes.business.businessobject": {
817
886
  "id": "data-model.objectschema.realizes.business.businessobject",
@@ -822,7 +891,8 @@
822
891
  "predicate": "realizes",
823
892
  "cardinality": "many-to-many",
824
893
  "strength": "medium",
825
- "required": false
894
+ "required": false,
895
+ "description": "The object schema gives concrete form to a business object, such as the Order entity class for the business concept of an order. This is a shortcut through the application data object; use it when the model has no separate data object for the entity."
826
896
  },
827
897
  "data-model.objectschema.realizes.application.dataobject": {
828
898
  "id": "data-model.objectschema.realizes.application.dataobject",
@@ -833,40 +903,8 @@
833
903
  "predicate": "realizes",
834
904
  "cardinality": "many-to-many",
835
905
  "strength": "medium",
836
- "required": false
837
- },
838
- "data-model.objectschema.realizes.motivation.goal": {
839
- "id": "data-model.objectschema.realizes.motivation.goal",
840
- "source_spec_node_id": "data-model.objectschema",
841
- "source_layer": "data-model",
842
- "destination_spec_node_id": "motivation.goal",
843
- "destination_layer": "motivation",
844
- "predicate": "realizes",
845
- "cardinality": "many-to-many",
846
- "strength": "medium",
847
- "required": false
848
- },
849
- "data-model.objectschema.references.business.businessfunction": {
850
- "id": "data-model.objectschema.references.business.businessfunction",
851
- "source_spec_node_id": "data-model.objectschema",
852
- "source_layer": "data-model",
853
- "destination_spec_node_id": "business.businessfunction",
854
- "destination_layer": "business",
855
- "predicate": "references",
856
- "cardinality": "many-to-many",
857
- "strength": "medium",
858
- "required": false
859
- },
860
- "data-model.objectschema.references.business.businessprocess": {
861
- "id": "data-model.objectschema.references.business.businessprocess",
862
- "source_spec_node_id": "data-model.objectschema",
863
- "source_layer": "data-model",
864
- "destination_spec_node_id": "business.businessprocess",
865
- "destination_layer": "business",
866
- "predicate": "references",
867
- "cardinality": "many-to-many",
868
- "strength": "medium",
869
- "required": false
906
+ "required": false,
907
+ "description": "The object schema gives a persisted or published shape to an application data object, such as the entity class or published schema behind a data structure the application passes around."
870
908
  },
871
909
  "data-model.objectschema.references.security.secureresource": {
872
910
  "id": "data-model.objectschema.references.security.secureresource",
@@ -877,7 +915,8 @@
877
915
  "predicate": "references",
878
916
  "cardinality": "many-to-many",
879
917
  "strength": "medium",
880
- "required": false
918
+ "required": false,
919
+ "description": "The object schema describes data that a security model protects as a secure resource, so access rules for that resource apply to instances of it."
881
920
  },
882
921
  "data-model.objectschema.satisfies.motivation.requirement": {
883
922
  "id": "data-model.objectschema.satisfies.motivation.requirement",
@@ -888,62 +927,44 @@
888
927
  "predicate": "satisfies",
889
928
  "cardinality": "many-to-many",
890
929
  "strength": "medium",
891
- "required": false
892
- },
893
- "data-model.objectschema.satisfies.security.securityconstraints": {
894
- "id": "data-model.objectschema.satisfies.security.securityconstraints",
895
- "source_spec_node_id": "data-model.objectschema",
896
- "source_layer": "data-model",
897
- "destination_spec_node_id": "security.securityconstraints",
898
- "destination_layer": "security",
899
- "predicate": "satisfies",
900
- "cardinality": "many-to-many",
901
- "strength": "medium",
902
- "required": false
903
- },
904
- "data-model.objectschema.serves.application.applicationcomponent": {
905
- "id": "data-model.objectschema.serves.application.applicationcomponent",
906
- "source_spec_node_id": "data-model.objectschema",
907
- "source_layer": "data-model",
908
- "destination_spec_node_id": "application.applicationcomponent",
909
- "destination_layer": "application",
910
- "predicate": "serves",
911
- "cardinality": "many-to-many",
912
- "strength": "medium",
913
- "required": false
930
+ "required": false,
931
+ "description": "The object schema meets a requirement on the data it describes, such as capturing a field the business requires or enforcing a mandatory structure."
914
932
  },
915
- "data-model.objectschema.serves.application.applicationfunction": {
916
- "id": "data-model.objectschema.serves.application.applicationfunction",
933
+ "data-model.objectschema.specializes.data-model.objectschema": {
934
+ "id": "data-model.objectschema.specializes.data-model.objectschema",
917
935
  "source_spec_node_id": "data-model.objectschema",
918
936
  "source_layer": "data-model",
919
- "destination_spec_node_id": "application.applicationfunction",
920
- "destination_layer": "application",
921
- "predicate": "serves",
937
+ "destination_spec_node_id": "data-model.objectschema",
938
+ "destination_layer": "data-model",
939
+ "predicate": "specializes",
922
940
  "cardinality": "many-to-many",
923
941
  "strength": "medium",
924
- "required": false
942
+ "required": false,
943
+ "description": "The object schema is a subtype of another object schema, inheriting its properties and adding its own, such as a subclass of an entity class or a schema built by extending a base schema. This is the data-model's only subtyping predicate."
925
944
  },
926
- "data-model.reference.maps-to.application.applicationservice": {
927
- "id": "data-model.reference.maps-to.application.applicationservice",
945
+ "data-model.reference.references.data-model.jsonschema": {
946
+ "id": "data-model.reference.references.data-model.jsonschema",
928
947
  "source_spec_node_id": "data-model.reference",
929
948
  "source_layer": "data-model",
930
- "destination_spec_node_id": "application.applicationservice",
931
- "destination_layer": "application",
932
- "predicate": "maps-to",
949
+ "destination_spec_node_id": "data-model.jsonschema",
950
+ "destination_layer": "data-model",
951
+ "predicate": "references",
933
952
  "cardinality": "many-to-many",
934
953
  "strength": "medium",
935
- "required": false
954
+ "required": false,
955
+ "description": "The $ref points at another schema document by its $id or URI, delegating validation to that document's root schema."
936
956
  },
937
- "data-model.reference.maps-to.api.schema": {
938
- "id": "data-model.reference.maps-to.api.schema",
957
+ "data-model.reference.references.data-model.objectschema": {
958
+ "id": "data-model.reference.references.data-model.objectschema",
939
959
  "source_spec_node_id": "data-model.reference",
940
960
  "source_layer": "data-model",
941
- "destination_spec_node_id": "api.schema",
942
- "destination_layer": "api",
943
- "predicate": "maps-to",
961
+ "destination_spec_node_id": "data-model.objectschema",
962
+ "destination_layer": "data-model",
963
+ "predicate": "references",
944
964
  "cardinality": "many-to-many",
945
965
  "strength": "medium",
946
- "required": false
966
+ "required": false,
967
+ "description": "The $ref points at an object schema declared elsewhere, delegating validation to it."
947
968
  },
948
969
  "data-model.reference.references.data-model.schemadefinition": {
949
970
  "id": "data-model.reference.references.data-model.schemadefinition",
@@ -954,7 +975,8 @@
954
975
  "predicate": "references",
955
976
  "cardinality": "many-to-many",
956
977
  "strength": "medium",
957
- "required": false
978
+ "required": false,
979
+ "description": "The $ref points at a named definition, such as '#/definitions/Address', delegating validation to it. This is the most common target of a reference."
958
980
  },
959
981
  "data-model.schemacomposition.composes.data-model.arrayschema": {
960
982
  "id": "data-model.schemacomposition.composes.data-model.arrayschema",
@@ -965,7 +987,8 @@
965
987
  "predicate": "composes",
966
988
  "cardinality": "many-to-many",
967
989
  "strength": "medium",
968
- "required": false
990
+ "required": false,
991
+ "description": "One branch of the composition is an array schema written in place, which is part of the composition."
969
992
  },
970
993
  "data-model.schemacomposition.composes.data-model.numericschema": {
971
994
  "id": "data-model.schemacomposition.composes.data-model.numericschema",
@@ -976,7 +999,8 @@
976
999
  "predicate": "composes",
977
1000
  "cardinality": "many-to-many",
978
1001
  "strength": "medium",
979
- "required": false
1002
+ "required": false,
1003
+ "description": "One branch of the composition is a numeric schema written in place, such as a range alternative in an anyOf, which is part of the composition."
980
1004
  },
981
1005
  "data-model.schemacomposition.composes.data-model.objectschema": {
982
1006
  "id": "data-model.schemacomposition.composes.data-model.objectschema",
@@ -987,18 +1011,20 @@
987
1011
  "predicate": "composes",
988
1012
  "cardinality": "many-to-many",
989
1013
  "strength": "medium",
990
- "required": false
1014
+ "required": false,
1015
+ "description": "One branch of the composition is an object schema written in place, such as one variant of a discriminated union declared inline, which is part of the composition."
991
1016
  },
992
- "data-model.schemacomposition.composes.data-model.schemadefinition": {
993
- "id": "data-model.schemacomposition.composes.data-model.schemadefinition",
1017
+ "data-model.schemacomposition.composes.data-model.reference": {
1018
+ "id": "data-model.schemacomposition.composes.data-model.reference",
994
1019
  "source_spec_node_id": "data-model.schemacomposition",
995
1020
  "source_layer": "data-model",
996
- "destination_spec_node_id": "data-model.schemadefinition",
1021
+ "destination_spec_node_id": "data-model.reference",
997
1022
  "destination_layer": "data-model",
998
1023
  "predicate": "composes",
999
1024
  "cardinality": "many-to-many",
1000
1025
  "strength": "medium",
1001
- "required": false
1026
+ "required": false,
1027
+ "description": "One branch of the composition is a $ref written in place, the usual form of an allOf base or a oneOf variant; the reference in turn references the type it points at."
1002
1028
  },
1003
1029
  "data-model.schemacomposition.composes.data-model.stringschema": {
1004
1030
  "id": "data-model.schemacomposition.composes.data-model.stringschema",
@@ -1009,18 +1035,20 @@
1009
1035
  "predicate": "composes",
1010
1036
  "cardinality": "many-to-many",
1011
1037
  "strength": "medium",
1012
- "required": false
1038
+ "required": false,
1039
+ "description": "One branch of the composition is a string schema written in place, which is part of the composition."
1013
1040
  },
1014
- "data-model.schemacomposition.serves.application.applicationfunction": {
1015
- "id": "data-model.schemacomposition.serves.application.applicationfunction",
1041
+ "data-model.schemacomposition.references.data-model.schemadefinition": {
1042
+ "id": "data-model.schemacomposition.references.data-model.schemadefinition",
1016
1043
  "source_spec_node_id": "data-model.schemacomposition",
1017
1044
  "source_layer": "data-model",
1018
- "destination_spec_node_id": "application.applicationfunction",
1019
- "destination_layer": "application",
1020
- "predicate": "serves",
1045
+ "destination_spec_node_id": "data-model.schemadefinition",
1046
+ "destination_layer": "data-model",
1047
+ "predicate": "references",
1021
1048
  "cardinality": "many-to-many",
1022
1049
  "strength": "medium",
1023
- "required": false
1050
+ "required": false,
1051
+ "description": "One branch of the composition is a named definition that exists apart from it and is reused elsewhere, so the composition references it rather than owning it. Use composes instead for a branch written in place."
1024
1052
  },
1025
1053
  "data-model.schemadefinition.composes.data-model.schemadefinition": {
1026
1054
  "id": "data-model.schemadefinition.composes.data-model.schemadefinition",
@@ -1031,18 +1059,8 @@
1031
1059
  "predicate": "composes",
1032
1060
  "cardinality": "many-to-many",
1033
1061
  "strength": "high",
1034
- "required": false
1035
- },
1036
- "data-model.schemadefinition.depends-on.technology.systemsoftware": {
1037
- "id": "data-model.schemadefinition.depends-on.technology.systemsoftware",
1038
- "source_spec_node_id": "data-model.schemadefinition",
1039
- "source_layer": "data-model",
1040
- "destination_spec_node_id": "technology.systemsoftware",
1041
- "destination_layer": "technology",
1042
- "predicate": "depends-on",
1043
- "cardinality": "many-to-many",
1044
- "strength": "medium",
1045
- "required": false
1062
+ "required": false,
1063
+ "description": "The definition declares another definition nested under its own definitions keyword, which exists only as part of it. Use references instead when one definition uses another declared alongside it."
1046
1064
  },
1047
1065
  "data-model.schemadefinition.maps-to.data-store.collection": {
1048
1066
  "id": "data-model.schemadefinition.maps-to.data-store.collection",
@@ -1053,7 +1071,8 @@
1053
1071
  "predicate": "maps-to",
1054
1072
  "cardinality": "many-to-many",
1055
1073
  "strength": "medium",
1056
- "required": false
1074
+ "required": false,
1075
+ "description": "The named definition describes the same records that the collection or table stores. Use the object schema's maps-to instead when the stored type is modelled as an object schema."
1057
1076
  },
1058
1077
  "data-model.schemadefinition.maps-to.api.schema": {
1059
1078
  "id": "data-model.schemadefinition.maps-to.api.schema",
@@ -1064,7 +1083,8 @@
1064
1083
  "predicate": "maps-to",
1065
1084
  "cardinality": "many-to-many",
1066
1085
  "strength": "medium",
1067
- "required": false
1086
+ "required": false,
1087
+ "description": "The named definition describes the same data as an API schema, such as a shared type that an OpenAPI components entry is generated from."
1068
1088
  },
1069
1089
  "data-model.schemadefinition.realizes.business.businessobject": {
1070
1090
  "id": "data-model.schemadefinition.realizes.business.businessobject",
@@ -1075,7 +1095,8 @@
1075
1095
  "predicate": "realizes",
1076
1096
  "cardinality": "many-to-many",
1077
1097
  "strength": "medium",
1078
- "required": false
1098
+ "required": false,
1099
+ "description": "The named definition gives concrete form to a business object. This is a shortcut through the application data object; use it when the model has no separate data object for the type."
1079
1100
  },
1080
1101
  "data-model.schemadefinition.realizes.application.dataobject": {
1081
1102
  "id": "data-model.schemadefinition.realizes.application.dataobject",
@@ -1086,18 +1107,20 @@
1086
1107
  "predicate": "realizes",
1087
1108
  "cardinality": "many-to-many",
1088
1109
  "strength": "medium",
1089
- "required": false
1110
+ "required": false,
1111
+ "description": "The named definition gives a published shape to an application data object, such as a shared definition that describes a structure the application passes around."
1090
1112
  },
1091
- "data-model.schemadefinition.references.business.businessprocess": {
1092
- "id": "data-model.schemadefinition.references.business.businessprocess",
1113
+ "data-model.schemadefinition.references.security.dataclassification": {
1114
+ "id": "data-model.schemadefinition.references.security.dataclassification",
1093
1115
  "source_spec_node_id": "data-model.schemadefinition",
1094
1116
  "source_layer": "data-model",
1095
- "destination_spec_node_id": "business.businessprocess",
1096
- "destination_layer": "business",
1117
+ "destination_spec_node_id": "security.dataclassification",
1118
+ "destination_layer": "security",
1097
1119
  "predicate": "references",
1098
1120
  "cardinality": "many-to-many",
1099
1121
  "strength": "medium",
1100
- "required": false
1122
+ "required": false,
1123
+ "description": "The definition is handled at the protection level of the data classification, so data of this type is treated as that class."
1101
1124
  },
1102
1125
  "data-model.schemadefinition.references.data-model.schemadefinition": {
1103
1126
  "id": "data-model.schemadefinition.references.data-model.schemadefinition",
@@ -1108,7 +1131,8 @@
1108
1131
  "predicate": "references",
1109
1132
  "cardinality": "many-to-many",
1110
1133
  "strength": "medium",
1111
- "required": false
1134
+ "required": false,
1135
+ "description": "The definition uses another named definition declared alongside it, for example through a $ref in one of its properties. Use composes instead when the other definition is nested inside it."
1112
1136
  },
1113
1137
  "data-model.schemadefinition.references.security.threat": {
1114
1138
  "id": "data-model.schemadefinition.references.security.threat",
@@ -1119,7 +1143,8 @@
1119
1143
  "predicate": "references",
1120
1144
  "cardinality": "many-to-many",
1121
1145
  "strength": "medium",
1122
- "required": false
1146
+ "required": false,
1147
+ "description": "The definition describes data that a modelled threat targets, such as a type holding credentials or personal data named in a threat."
1123
1148
  },
1124
1149
  "data-model.schemadefinition.requires.security.retentionpolicy": {
1125
1150
  "id": "data-model.schemadefinition.requires.security.retentionpolicy",
@@ -1130,7 +1155,8 @@
1130
1155
  "predicate": "requires",
1131
1156
  "cardinality": "many-to-many",
1132
1157
  "strength": "medium",
1133
- "required": false
1158
+ "required": false,
1159
+ "description": "Instances of the definition must be kept or deleted according to the retention policy, such as audit records with a minimum retention period."
1134
1160
  },
1135
1161
  "data-model.schemadefinition.satisfies.motivation.constraint": {
1136
1162
  "id": "data-model.schemadefinition.satisfies.motivation.constraint",
@@ -1141,18 +1167,8 @@
1141
1167
  "predicate": "satisfies",
1142
1168
  "cardinality": "many-to-many",
1143
1169
  "strength": "medium",
1144
- "required": false
1145
- },
1146
- "data-model.schemadefinition.satisfies.security.dataclassification": {
1147
- "id": "data-model.schemadefinition.satisfies.security.dataclassification",
1148
- "source_spec_node_id": "data-model.schemadefinition",
1149
- "source_layer": "data-model",
1150
- "destination_spec_node_id": "security.dataclassification",
1151
- "destination_layer": "security",
1152
- "predicate": "satisfies",
1153
- "cardinality": "many-to-many",
1154
- "strength": "medium",
1155
- "required": false
1170
+ "required": false,
1171
+ "description": "The named definition meets a constraint on the data, such as a value range or format the type is required to enforce."
1156
1172
  },
1157
1173
  "data-model.schemadefinition.satisfies.motivation.requirement": {
1158
1174
  "id": "data-model.schemadefinition.satisfies.motivation.requirement",
@@ -1163,62 +1179,56 @@
1163
1179
  "predicate": "satisfies",
1164
1180
  "cardinality": "many-to-many",
1165
1181
  "strength": "medium",
1166
- "required": false
1167
- },
1168
- "data-model.schemadefinition.serves.application.applicationcomponent": {
1169
- "id": "data-model.schemadefinition.serves.application.applicationcomponent",
1170
- "source_spec_node_id": "data-model.schemadefinition",
1171
- "source_layer": "data-model",
1172
- "destination_spec_node_id": "application.applicationcomponent",
1173
- "destination_layer": "application",
1174
- "predicate": "serves",
1175
- "cardinality": "many-to-many",
1176
- "strength": "medium",
1177
- "required": false
1182
+ "required": false,
1183
+ "description": "The named definition meets a requirement on the data, such as a shared type that captures what the business needs to record."
1178
1184
  },
1179
- "data-model.schemadefinition.serves.application.applicationevent": {
1180
- "id": "data-model.schemadefinition.serves.application.applicationevent",
1185
+ "data-model.schemadefinition.specializes.data-model.schemadefinition": {
1186
+ "id": "data-model.schemadefinition.specializes.data-model.schemadefinition",
1181
1187
  "source_spec_node_id": "data-model.schemadefinition",
1182
1188
  "source_layer": "data-model",
1183
- "destination_spec_node_id": "application.applicationevent",
1184
- "destination_layer": "application",
1185
- "predicate": "serves",
1189
+ "destination_spec_node_id": "data-model.schemadefinition",
1190
+ "destination_layer": "data-model",
1191
+ "predicate": "specializes",
1186
1192
  "cardinality": "many-to-many",
1187
1193
  "strength": "medium",
1188
- "required": false
1194
+ "required": false,
1195
+ "description": "The definition is a subtype of another definition, narrowing or extending it, such as a specific address type derived from a general one. Use the object schema's specializes when both are object schemas."
1189
1196
  },
1190
- "data-model.schemadefinition.serves.application.applicationfunction": {
1191
- "id": "data-model.schemadefinition.serves.application.applicationfunction",
1192
- "source_spec_node_id": "data-model.schemadefinition",
1197
+ "data-model.schemaproperty.composes.data-model.arrayschema": {
1198
+ "id": "data-model.schemaproperty.composes.data-model.arrayschema",
1199
+ "source_spec_node_id": "data-model.schemaproperty",
1193
1200
  "source_layer": "data-model",
1194
- "destination_spec_node_id": "application.applicationfunction",
1195
- "destination_layer": "application",
1196
- "predicate": "serves",
1201
+ "destination_spec_node_id": "data-model.arrayschema",
1202
+ "destination_layer": "data-model",
1203
+ "predicate": "composes",
1197
1204
  "cardinality": "many-to-many",
1198
1205
  "strength": "medium",
1199
- "required": false
1206
+ "required": false,
1207
+ "description": "The property's value is a list whose constraints (items, length, uniqueness) are written in place on the property, so the array schema is part of it."
1200
1208
  },
1201
- "data-model.schemadefinition.serves.api.operation": {
1202
- "id": "data-model.schemadefinition.serves.api.operation",
1203
- "source_spec_node_id": "data-model.schemadefinition",
1209
+ "data-model.schemaproperty.composes.data-model.numericschema": {
1210
+ "id": "data-model.schemaproperty.composes.data-model.numericschema",
1211
+ "source_spec_node_id": "data-model.schemaproperty",
1204
1212
  "source_layer": "data-model",
1205
- "destination_spec_node_id": "api.operation",
1206
- "destination_layer": "api",
1207
- "predicate": "serves",
1213
+ "destination_spec_node_id": "data-model.numericschema",
1214
+ "destination_layer": "data-model",
1215
+ "predicate": "composes",
1208
1216
  "cardinality": "many-to-many",
1209
1217
  "strength": "medium",
1210
- "required": false
1218
+ "required": false,
1219
+ "description": "The property's value is a number whose bounds or step are written in place on the property, so the numeric schema is part of it. Model the numeric schema separately only when its constraints matter apart from the field."
1211
1220
  },
1212
- "data-model.schemadefinition.specializes.data-model.schemadefinition": {
1213
- "id": "data-model.schemadefinition.specializes.data-model.schemadefinition",
1214
- "source_spec_node_id": "data-model.schemadefinition",
1221
+ "data-model.schemaproperty.composes.data-model.stringschema": {
1222
+ "id": "data-model.schemaproperty.composes.data-model.stringschema",
1223
+ "source_spec_node_id": "data-model.schemaproperty",
1215
1224
  "source_layer": "data-model",
1216
- "destination_spec_node_id": "data-model.schemadefinition",
1225
+ "destination_spec_node_id": "data-model.stringschema",
1217
1226
  "destination_layer": "data-model",
1218
- "predicate": "specializes",
1227
+ "predicate": "composes",
1219
1228
  "cardinality": "many-to-many",
1220
1229
  "strength": "medium",
1221
- "required": false
1230
+ "required": false,
1231
+ "description": "The property's value is a string whose length, pattern or format is written in place on the property, so the string schema is part of it. A named, reusable string type is a schema definition the property references."
1222
1232
  },
1223
1233
  "data-model.schemaproperty.maps-to.api.parameter": {
1224
1234
  "id": "data-model.schemaproperty.maps-to.api.parameter",
@@ -1229,29 +1239,20 @@
1229
1239
  "predicate": "maps-to",
1230
1240
  "cardinality": "many-to-many",
1231
1241
  "strength": "medium",
1232
- "required": false
1233
- },
1234
- "data-model.schemaproperty.references.data-model.arrayschema": {
1235
- "id": "data-model.schemaproperty.references.data-model.arrayschema",
1236
- "source_spec_node_id": "data-model.schemaproperty",
1237
- "source_layer": "data-model",
1238
- "destination_spec_node_id": "data-model.arrayschema",
1239
- "destination_layer": "data-model",
1240
- "predicate": "references",
1241
- "cardinality": "many-to-many",
1242
- "strength": "medium",
1243
- "required": false
1242
+ "required": false,
1243
+ "description": "The property carries the same value as an API parameter, such as a filter field that a query parameter binds to."
1244
1244
  },
1245
- "data-model.schemaproperty.references.data-model.numericschema": {
1246
- "id": "data-model.schemaproperty.references.data-model.numericschema",
1245
+ "data-model.schemaproperty.references.security.dataclassification": {
1246
+ "id": "data-model.schemaproperty.references.security.dataclassification",
1247
1247
  "source_spec_node_id": "data-model.schemaproperty",
1248
1248
  "source_layer": "data-model",
1249
- "destination_spec_node_id": "data-model.numericschema",
1250
- "destination_layer": "data-model",
1249
+ "destination_spec_node_id": "security.dataclassification",
1250
+ "destination_layer": "security",
1251
1251
  "predicate": "references",
1252
1252
  "cardinality": "many-to-many",
1253
1253
  "strength": "medium",
1254
- "required": false
1254
+ "required": false,
1255
+ "description": "The property is handled at the protection level of the data classification, such as a field holding personal data."
1255
1256
  },
1256
1257
  "data-model.schemaproperty.references.data-model.objectschema": {
1257
1258
  "id": "data-model.schemaproperty.references.data-model.objectschema",
@@ -1262,7 +1263,8 @@
1262
1263
  "predicate": "references",
1263
1264
  "cardinality": "many-to-many",
1264
1265
  "strength": "medium",
1265
- "required": false
1266
+ "required": false,
1267
+ "description": "The property's value is an object of a type declared elsewhere, such as Pet.owner typed as the Owner entity, so the property points at that object schema rather than owning it."
1266
1268
  },
1267
1269
  "data-model.schemaproperty.references.data-model.schemadefinition": {
1268
1270
  "id": "data-model.schemaproperty.references.data-model.schemadefinition",
@@ -1273,18 +1275,8 @@
1273
1275
  "predicate": "references",
1274
1276
  "cardinality": "many-to-many",
1275
1277
  "strength": "medium",
1276
- "required": false
1277
- },
1278
- "data-model.schemaproperty.references.data-model.stringschema": {
1279
- "id": "data-model.schemaproperty.references.data-model.stringschema",
1280
- "source_spec_node_id": "data-model.schemaproperty",
1281
- "source_layer": "data-model",
1282
- "destination_spec_node_id": "data-model.stringschema",
1283
- "destination_layer": "data-model",
1284
- "predicate": "references",
1285
- "cardinality": "many-to-many",
1286
- "strength": "medium",
1287
- "required": false
1278
+ "required": false,
1279
+ "description": "The property's value takes a named, reusable definition, such as a shared enumeration or value type reached by $ref."
1288
1280
  },
1289
1281
  "data-model.schemaproperty.satisfies.motivation.constraint": {
1290
1282
  "id": "data-model.schemaproperty.satisfies.motivation.constraint",
@@ -1295,18 +1287,8 @@
1295
1287
  "predicate": "satisfies",
1296
1288
  "cardinality": "many-to-many",
1297
1289
  "strength": "medium",
1298
- "required": false
1299
- },
1300
- "data-model.schemaproperty.satisfies.security.dataclassification": {
1301
- "id": "data-model.schemaproperty.satisfies.security.dataclassification",
1302
- "source_spec_node_id": "data-model.schemaproperty",
1303
- "source_layer": "data-model",
1304
- "destination_spec_node_id": "security.dataclassification",
1305
- "destination_layer": "security",
1306
- "predicate": "satisfies",
1307
- "cardinality": "many-to-many",
1308
- "strength": "medium",
1309
- "required": false
1290
+ "required": false,
1291
+ "description": "The property meets a constraint on the data, such as a mandatory field or a permitted range set by policy."
1310
1292
  },
1311
1293
  "data-model.schemaproperty.satisfies.security.fieldaccesscontrol": {
1312
1294
  "id": "data-model.schemaproperty.satisfies.security.fieldaccesscontrol",
@@ -1317,7 +1299,8 @@
1317
1299
  "predicate": "satisfies",
1318
1300
  "cardinality": "many-to-many",
1319
1301
  "strength": "medium",
1320
- "required": false
1302
+ "required": false,
1303
+ "description": "The property is subject to field-level access control, so who may read or write it is governed by that rule."
1321
1304
  },
1322
1305
  "data-model.schemaproperty.satisfies.security.validationrule": {
1323
1306
  "id": "data-model.schemaproperty.satisfies.security.validationrule",
@@ -1328,7 +1311,8 @@
1328
1311
  "predicate": "satisfies",
1329
1312
  "cardinality": "many-to-many",
1330
1313
  "strength": "medium",
1331
- "required": false
1314
+ "required": false,
1315
+ "description": "The property's value is checked by a security-motivated validation rule, such as input sanitisation on a free-text field; ordinary value constraints stay on the property's own schema."
1332
1316
  }
1333
1317
  }
1334
1318
  }