@documentation-robotics/cli 0.1.0 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +466 -693
  3. package/dist/analysis/data-model-analyzer.js +189 -0
  4. package/dist/analysis/data-model-analyzer.js.map +7 -0
  5. package/dist/analysis/index.js +3 -0
  6. package/dist/analysis/index.js.map +7 -0
  7. package/dist/analysis/relationship-classifier.js +181 -0
  8. package/dist/analysis/relationship-classifier.js.map +7 -0
  9. package/dist/analyzers/base-analyzer.js +1 -0
  10. package/dist/analyzers/base-analyzer.js.map +7 -0
  11. package/dist/analyzers/call-graph-utils.js +39 -0
  12. package/dist/analyzers/call-graph-utils.js.map +7 -0
  13. package/dist/analyzers/cbm-analyzer.js +1205 -0
  14. package/dist/analyzers/cbm-analyzer.js.map +7 -0
  15. package/dist/analyzers/heuristic-utils.js +55 -0
  16. package/dist/analyzers/heuristic-utils.js.map +7 -0
  17. package/dist/analyzers/mapping-loader.js +146 -0
  18. package/dist/analyzers/mapping-loader.js.map +7 -0
  19. package/dist/analyzers/registry.js +124 -0
  20. package/dist/analyzers/registry.js.map +7 -0
  21. package/dist/analyzers/session-state.js +176 -0
  22. package/dist/analyzers/session-state.js.map +7 -0
  23. package/dist/analyzers/stdio-client.js +208 -0
  24. package/dist/analyzers/stdio-client.js.map +7 -0
  25. package/dist/analyzers/types.js +15 -0
  26. package/dist/analyzers/types.js.map +7 -0
  27. package/dist/analyzers/verify-engine.js +209 -0
  28. package/dist/analyzers/verify-engine.js.map +7 -0
  29. package/dist/analyzers/verify-ignore.js +130 -0
  30. package/dist/analyzers/verify-ignore.js.map +7 -0
  31. package/dist/analyzers/version.js +8 -0
  32. package/dist/analyzers/version.js.map +7 -0
  33. package/dist/audit/ai/runner.js +41 -0
  34. package/dist/audit/ai/runner.js.map +7 -0
  35. package/dist/audit/differential-analyzer.js +183 -0
  36. package/dist/audit/differential-analyzer.js.map +7 -0
  37. package/dist/audit/index.js +32 -0
  38. package/dist/audit/index.js.map +7 -0
  39. package/dist/audit/nodes/ai/evaluator.js +49 -0
  40. package/dist/audit/nodes/ai/evaluator.js.map +7 -0
  41. package/dist/audit/nodes/ai/parser.js +55 -0
  42. package/dist/audit/nodes/ai/parser.js.map +7 -0
  43. package/dist/audit/nodes/ai/prompts.js +103 -0
  44. package/dist/audit/nodes/ai/prompts.js.map +7 -0
  45. package/dist/audit/nodes/analysis/node-completeness-checker.js +32 -0
  46. package/dist/audit/nodes/analysis/node-completeness-checker.js.map +7 -0
  47. package/dist/audit/nodes/analysis/node-definition-analyzer.js +47 -0
  48. package/dist/audit/nodes/analysis/node-definition-analyzer.js.map +7 -0
  49. package/dist/audit/nodes/analysis/node-overlap-detector.js +79 -0
  50. package/dist/audit/nodes/analysis/node-overlap-detector.js.map +7 -0
  51. package/dist/audit/nodes/model/orchestrator.js +82 -0
  52. package/dist/audit/nodes/model/orchestrator.js.map +7 -0
  53. package/dist/audit/nodes/spec/loader.js +116 -0
  54. package/dist/audit/nodes/spec/loader.js.map +7 -0
  55. package/dist/audit/nodes/spec/orchestrator.js +68 -0
  56. package/dist/audit/nodes/spec/orchestrator.js.map +7 -0
  57. package/dist/audit/nodes/types.js +1 -0
  58. package/dist/audit/nodes/types.js.map +7 -0
  59. package/dist/audit/pipeline/index.js +5 -0
  60. package/dist/audit/pipeline/index.js.map +7 -0
  61. package/dist/audit/pipeline/pipeline-orchestrator.js +218 -0
  62. package/dist/audit/pipeline/pipeline-orchestrator.js.map +7 -0
  63. package/dist/audit/relationships/ai/evaluator.js +235 -0
  64. package/dist/audit/relationships/ai/evaluator.js.map +7 -0
  65. package/dist/audit/relationships/ai/parser.js +197 -0
  66. package/dist/audit/relationships/ai/parser.js.map +7 -0
  67. package/dist/audit/relationships/ai/prompts.js +274 -0
  68. package/dist/audit/relationships/ai/prompts.js.map +7 -0
  69. package/dist/audit/relationships/analysis/balance-assessor.js +115 -0
  70. package/dist/audit/relationships/analysis/balance-assessor.js.map +7 -0
  71. package/dist/audit/relationships/analysis/coverage-analyzer.js +99 -0
  72. package/dist/audit/relationships/analysis/coverage-analyzer.js.map +7 -0
  73. package/dist/audit/relationships/analysis/duplicate-detector.js +95 -0
  74. package/dist/audit/relationships/analysis/duplicate-detector.js.map +7 -0
  75. package/dist/audit/relationships/analysis/gap-analyzer.js +99 -0
  76. package/dist/audit/relationships/analysis/gap-analyzer.js.map +7 -0
  77. package/dist/audit/relationships/analysis/layer-templates.js +294 -0
  78. package/dist/audit/relationships/analysis/layer-templates.js.map +7 -0
  79. package/dist/audit/relationships/graph/connectivity.js +129 -0
  80. package/dist/audit/relationships/graph/connectivity.js.map +7 -0
  81. package/dist/audit/relationships/graph/relationship-graph.js +179 -0
  82. package/dist/audit/relationships/graph/relationship-graph.js.map +7 -0
  83. package/dist/audit/relationships/model/balance-assessor.js +49 -0
  84. package/dist/audit/relationships/model/balance-assessor.js.map +7 -0
  85. package/dist/audit/relationships/model/coverage-analyzer.js +34 -0
  86. package/dist/audit/relationships/model/coverage-analyzer.js.map +7 -0
  87. package/dist/audit/relationships/model/duplicate-detector.js +68 -0
  88. package/dist/audit/relationships/model/duplicate-detector.js.map +7 -0
  89. package/dist/audit/relationships/model/gap-analyzer.js +41 -0
  90. package/dist/audit/relationships/model/gap-analyzer.js.map +7 -0
  91. package/dist/audit/relationships/model/orchestrator.js +126 -0
  92. package/dist/audit/relationships/model/orchestrator.js.map +7 -0
  93. package/dist/audit/relationships/spec/orchestrator.js +157 -0
  94. package/dist/audit/relationships/spec/orchestrator.js.map +7 -0
  95. package/dist/audit/reports/index.js +5 -0
  96. package/dist/audit/reports/index.js.map +7 -0
  97. package/dist/audit/reports/report-generator.js +118 -0
  98. package/dist/audit/reports/report-generator.js.map +7 -0
  99. package/dist/audit/snapshot-storage.js +163 -0
  100. package/dist/audit/snapshot-storage.js.map +7 -0
  101. package/dist/audit/types.js +21 -0
  102. package/dist/audit/types.js.map +7 -0
  103. package/dist/cli.js +223 -92
  104. package/dist/cli.js.map +3 -3
  105. package/dist/coding-agents/agents/claude-code.js +147 -0
  106. package/dist/coding-agents/agents/claude-code.js.map +7 -0
  107. package/dist/coding-agents/agents/index.js +5 -0
  108. package/dist/coding-agents/agents/index.js.map +7 -0
  109. package/dist/coding-agents/agents/types.js +1 -0
  110. package/dist/coding-agents/agents/types.js.map +7 -0
  111. package/dist/coding-agents/base-chat-client.js +45 -0
  112. package/dist/coding-agents/base-chat-client.js.map +7 -0
  113. package/dist/coding-agents/chat-utils.js +23 -0
  114. package/dist/coding-agents/chat-utils.js.map +7 -0
  115. package/dist/coding-agents/claude-code-client.js +246 -0
  116. package/dist/coding-agents/claude-code-client.js.map +7 -0
  117. package/dist/coding-agents/copilot-client.js +209 -0
  118. package/dist/coding-agents/copilot-client.js.map +7 -0
  119. package/dist/commands/add.js +95 -33
  120. package/dist/commands/add.js.map +2 -2
  121. package/dist/commands/analyzer.js +511 -0
  122. package/dist/commands/analyzer.js.map +7 -0
  123. package/dist/commands/audit-diff.js +49 -0
  124. package/dist/commands/audit-diff.js.map +7 -0
  125. package/dist/commands/audit-snapshots.js +62 -0
  126. package/dist/commands/audit-snapshots.js.map +7 -0
  127. package/dist/commands/audit.js +81 -0
  128. package/dist/commands/audit.js.map +7 -0
  129. package/dist/commands/catalog.js +248 -0
  130. package/dist/commands/catalog.js.map +7 -0
  131. package/dist/commands/changeset.js +577 -66
  132. package/dist/commands/changeset.js.map +2 -2
  133. package/dist/commands/chat.js +106 -83
  134. package/dist/commands/chat.js.map +2 -2
  135. package/dist/commands/claude.js +74 -0
  136. package/dist/commands/claude.js.map +7 -0
  137. package/dist/commands/conformance.js +71 -68
  138. package/dist/commands/conformance.js.map +2 -2
  139. package/dist/commands/copilot.js +75 -0
  140. package/dist/commands/copilot.js.map +7 -0
  141. package/dist/commands/delete.js +125 -11
  142. package/dist/commands/delete.js.map +3 -3
  143. package/dist/commands/discover-logic.js +44 -0
  144. package/dist/commands/discover-logic.js.map +7 -0
  145. package/dist/commands/docs.js +87 -0
  146. package/dist/commands/docs.js.map +7 -0
  147. package/dist/commands/element.js +14 -20
  148. package/dist/commands/element.js.map +2 -2
  149. package/dist/commands/export.js +13 -3
  150. package/dist/commands/export.js.map +2 -2
  151. package/dist/commands/import.js +51 -0
  152. package/dist/commands/import.js.map +7 -0
  153. package/dist/commands/info.js +30 -24
  154. package/dist/commands/info.js.map +2 -2
  155. package/dist/commands/init.js +27 -11
  156. package/dist/commands/init.js.map +2 -2
  157. package/dist/commands/list.js +63 -13
  158. package/dist/commands/list.js.map +3 -3
  159. package/dist/commands/relationship.js +225 -37
  160. package/dist/commands/relationship.js.map +2 -2
  161. package/dist/commands/report.js +54 -0
  162. package/dist/commands/report.js.map +7 -0
  163. package/dist/commands/reports.js +45 -0
  164. package/dist/commands/reports.js.map +7 -0
  165. package/dist/commands/schema.js +135 -0
  166. package/dist/commands/schema.js.map +7 -0
  167. package/dist/commands/search.js +40 -12
  168. package/dist/commands/search.js.map +2 -2
  169. package/dist/commands/show.js +58 -27
  170. package/dist/commands/show.js.map +2 -2
  171. package/dist/commands/stats.js +35 -0
  172. package/dist/commands/stats.js.map +7 -0
  173. package/dist/commands/trace.js +39 -16
  174. package/dist/commands/trace.js.map +2 -2
  175. package/dist/commands/update.js +141 -14
  176. package/dist/commands/update.js.map +2 -2
  177. package/dist/commands/upgrade.js +210 -46
  178. package/dist/commands/upgrade.js.map +3 -3
  179. package/dist/commands/validate.js +142 -23
  180. package/dist/commands/validate.js.map +3 -3
  181. package/dist/commands/version.js +8 -12
  182. package/dist/commands/version.js.map +2 -2
  183. package/dist/commands/visualize.js +162 -25
  184. package/dist/commands/visualize.js.map +2 -2
  185. package/dist/core/base-snapshot-manager.js +84 -0
  186. package/dist/core/base-snapshot-manager.js.map +7 -0
  187. package/dist/core/changeset-exporter.js +305 -0
  188. package/dist/core/changeset-exporter.js.map +7 -0
  189. package/dist/core/changeset-validator.js +41 -0
  190. package/dist/core/changeset-validator.js.map +7 -0
  191. package/dist/core/changeset.js +88 -173
  192. package/dist/core/changeset.js.map +2 -2
  193. package/dist/core/dependency-tracker.js +4 -2
  194. package/dist/core/dependency-tracker.js.map +2 -2
  195. package/dist/core/element.js +98 -27
  196. package/dist/core/element.js.map +2 -2
  197. package/dist/core/golden-copy-cache.js +290 -0
  198. package/dist/core/golden-copy-cache.js.map +7 -0
  199. package/dist/core/graph-model.js +266 -0
  200. package/dist/core/graph-model.js.map +7 -0
  201. package/dist/core/layer.js +159 -16
  202. package/dist/core/layer.js.map +2 -2
  203. package/dist/core/layers.js +32 -0
  204. package/dist/core/layers.js.map +7 -0
  205. package/dist/core/manifest.js +32 -11
  206. package/dist/core/manifest.js.map +2 -2
  207. package/dist/core/migration-registry.js +56 -1
  208. package/dist/core/migration-registry.js.map +2 -2
  209. package/dist/core/model.js +424 -217
  210. package/dist/core/model.js.map +3 -3
  211. package/dist/core/mutation-handler.js +179 -0
  212. package/dist/core/mutation-handler.js.map +7 -0
  213. package/dist/core/reference-registry.js +29 -21
  214. package/dist/core/reference-registry.js.map +2 -2
  215. package/dist/core/relationship-catalog.js +189 -0
  216. package/dist/core/relationship-catalog.js.map +7 -0
  217. package/dist/core/relationship-registry.js.map +2 -2
  218. package/dist/core/relationships.js.map +1 -1
  219. package/dist/core/report-data-model.js +285 -0
  220. package/dist/core/report-data-model.js.map +7 -0
  221. package/dist/core/spec-data-service.js +185 -0
  222. package/dist/core/spec-data-service.js.map +7 -0
  223. package/dist/core/spec-loader-types.js +1 -0
  224. package/dist/core/spec-loader-types.js.map +7 -0
  225. package/dist/core/spec-loader.js +234 -0
  226. package/dist/core/spec-loader.js.map +7 -0
  227. package/dist/core/staged-changeset-storage.js +282 -0
  228. package/dist/core/staged-changeset-storage.js.map +7 -0
  229. package/dist/core/staging-area.js +1002 -0
  230. package/dist/core/staging-area.js.map +7 -0
  231. package/dist/core/stats-collector.js +169 -0
  232. package/dist/core/stats-collector.js.map +7 -0
  233. package/dist/core/virtual-projection.js +443 -0
  234. package/dist/core/virtual-projection.js.map +7 -0
  235. package/dist/export/archimate-exporter.js +99 -60
  236. package/dist/export/archimate-exporter.js.map +2 -2
  237. package/dist/export/audit-formatters.js +479 -0
  238. package/dist/export/audit-formatters.js.map +7 -0
  239. package/dist/export/diff-formatters.js +99 -0
  240. package/dist/export/diff-formatters.js.map +7 -0
  241. package/dist/export/export-manager.js.map +2 -2
  242. package/dist/export/graphml-exporter.js +44 -27
  243. package/dist/export/graphml-exporter.js.map +2 -2
  244. package/dist/export/index.js +4 -0
  245. package/dist/export/index.js.map +2 -2
  246. package/dist/export/json-schema-exporter.js +55 -42
  247. package/dist/export/json-schema-exporter.js.map +2 -2
  248. package/dist/export/markdown-exporter.js +92 -70
  249. package/dist/export/markdown-exporter.js.map +2 -2
  250. package/dist/export/markdown-generator.js +248 -0
  251. package/dist/export/markdown-generator.js.map +7 -0
  252. package/dist/export/markdown-utils.js +30 -0
  253. package/dist/export/markdown-utils.js.map +7 -0
  254. package/dist/export/mermaid-markdown-exporter.js +37 -0
  255. package/dist/export/mermaid-markdown-exporter.js.map +7 -0
  256. package/dist/export/openapi-exporter.js +119 -71
  257. package/dist/export/openapi-exporter.js.map +2 -2
  258. package/dist/export/plantuml-exporter.js +104 -39
  259. package/dist/export/plantuml-exporter.js.map +2 -2
  260. package/dist/export/report-formatters.js +111 -0
  261. package/dist/export/report-formatters.js.map +7 -0
  262. package/dist/export/stats-formatters.js +98 -0
  263. package/dist/export/stats-formatters.js.map +7 -0
  264. package/dist/export/types.js +2 -14
  265. package/dist/export/types.js.map +2 -2
  266. package/dist/export/verify-formatters.js +153 -0
  267. package/dist/export/verify-formatters.js.map +7 -0
  268. package/dist/generated/compiled-validators.js +17 -0
  269. package/dist/generated/compiled-validators.js.map +7 -0
  270. package/dist/generated/index.js +31 -0
  271. package/dist/generated/index.js.map +7 -0
  272. package/dist/generated/layer-registry.js +190 -0
  273. package/dist/generated/layer-registry.js.map +7 -0
  274. package/dist/generated/layer-types.js +7 -0
  275. package/dist/generated/layer-types.js.map +7 -0
  276. package/dist/generated/node-types.js +1719 -0
  277. package/dist/generated/node-types.js.map +7 -0
  278. package/dist/generated/relationship-index.js +14552 -0
  279. package/dist/generated/relationship-index.js.map +7 -0
  280. package/dist/import/archimate-importer.js +166 -0
  281. package/dist/import/archimate-importer.js.map +7 -0
  282. package/dist/import/index.js +47 -0
  283. package/dist/import/index.js.map +7 -0
  284. package/dist/import/openapi-importer.js +143 -0
  285. package/dist/import/openapi-importer.js.map +7 -0
  286. package/dist/import/types.js +1 -0
  287. package/dist/import/types.js.map +7 -0
  288. package/dist/integrations/base-manager.js +311 -0
  289. package/dist/integrations/base-manager.js.map +7 -0
  290. package/dist/integrations/claude-manager.js +360 -0
  291. package/dist/integrations/claude-manager.js.map +7 -0
  292. package/dist/integrations/claude_code/agents/dr-advisor.md +253 -0
  293. package/dist/integrations/claude_code/agents/dr-architect.md +278 -0
  294. package/dist/integrations/claude_code/agents/dr-extractor.md +286 -0
  295. package/dist/integrations/claude_code/commands/dr-changeset.md +657 -0
  296. package/dist/integrations/claude_code/commands/dr-design.md +373 -0
  297. package/dist/integrations/claude_code/commands/dr-info.md +132 -0
  298. package/dist/integrations/claude_code/commands/dr-init.md +251 -0
  299. package/dist/integrations/claude_code/commands/dr-map.md +936 -0
  300. package/dist/integrations/claude_code/commands/dr-model.md +493 -0
  301. package/dist/integrations/claude_code/commands/dr-relate.md +814 -0
  302. package/dist/integrations/claude_code/commands/dr-sync.md +279 -0
  303. package/dist/integrations/claude_code/commands/dr-validate.md +654 -0
  304. package/dist/integrations/claude_code/commands/dr-verify.md +559 -0
  305. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +903 -0
  306. package/dist/integrations/claude_code/docs/QUICK_START.md +271 -0
  307. package/dist/integrations/claude_code/docs/README.md +347 -0
  308. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +550 -0
  309. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +620 -0
  310. package/dist/integrations/claude_code/skills/dr_03_security_layer/SKILL.md +642 -0
  311. package/dist/integrations/claude_code/skills/dr_04_application_layer/SKILL.md +911 -0
  312. package/dist/integrations/claude_code/skills/dr_05_technology_layer/SKILL.md +836 -0
  313. package/dist/integrations/claude_code/skills/dr_06_api_layer/SKILL.md +933 -0
  314. package/dist/integrations/claude_code/skills/dr_07_data_model_layer/SKILL.md +210 -0
  315. package/dist/integrations/claude_code/skills/dr_08_dataset_layer/SKILL.md +319 -0
  316. package/dist/integrations/claude_code/skills/dr_09_ux_layer/SKILL.md +319 -0
  317. package/dist/integrations/claude_code/skills/dr_10_navigation_layer/SKILL.md +318 -0
  318. package/dist/integrations/claude_code/skills/dr_11_apm_layer/SKILL.md +273 -0
  319. package/dist/integrations/claude_code/skills/dr_12_testing_layer/SKILL.md +273 -0
  320. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +187 -0
  321. package/dist/integrations/claude_code/skills/dr_codebase_memory/SKILL.md +590 -0
  322. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +295 -0
  323. package/dist/integrations/copilot-manager.js +328 -0
  324. package/dist/integrations/copilot-manager.js.map +7 -0
  325. package/dist/integrations/github_copilot/agents/dr-advisor.md +243 -0
  326. package/dist/integrations/github_copilot/agents/dr-architect.md +1567 -0
  327. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +491 -0
  328. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +539 -0
  329. package/dist/integrations/github_copilot/skills/dr_03_security_layer/SKILL.md +667 -0
  330. package/dist/integrations/github_copilot/skills/dr_04_application_layer/SKILL.md +670 -0
  331. package/dist/integrations/github_copilot/skills/dr_05_technology_layer/SKILL.md +660 -0
  332. package/dist/integrations/github_copilot/skills/dr_06_api_layer/SKILL.md +855 -0
  333. package/dist/integrations/github_copilot/skills/dr_07_data_model_layer/SKILL.md +171 -0
  334. package/dist/integrations/github_copilot/skills/dr_08_dataset_layer/SKILL.md +216 -0
  335. package/dist/integrations/github_copilot/skills/dr_09_ux_layer/SKILL.md +230 -0
  336. package/dist/integrations/github_copilot/skills/dr_10_navigation_layer/SKILL.md +228 -0
  337. package/dist/integrations/github_copilot/skills/dr_11_apm_layer/SKILL.md +234 -0
  338. package/dist/integrations/github_copilot/skills/dr_12_testing_layer/SKILL.md +230 -0
  339. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +187 -0
  340. package/dist/integrations/hash-utils.js +51 -0
  341. package/dist/integrations/hash-utils.js.map +7 -0
  342. package/dist/integrations/types.js +16 -0
  343. package/dist/integrations/types.js.map +7 -0
  344. package/dist/reports/model-layer-report-generator.js +278 -0
  345. package/dist/reports/model-layer-report-generator.js.map +7 -0
  346. package/dist/reports/model-report-data.js +57 -0
  347. package/dist/reports/model-report-data.js.map +7 -0
  348. package/dist/reports/model-report-orchestrator.js +103 -0
  349. package/dist/reports/model-report-orchestrator.js.map +7 -0
  350. package/dist/schemas/bundled/analyzers/cbm.json +595 -0
  351. package/dist/schemas/bundled/analyzers/manifest.json +9 -0
  352. package/dist/schemas/bundled/api.json +3411 -0
  353. package/dist/schemas/bundled/apm.json +2371 -0
  354. package/dist/schemas/bundled/application.json +1253 -0
  355. package/dist/schemas/bundled/base.json +1622 -0
  356. package/dist/schemas/bundled/business.json +1279 -0
  357. package/dist/schemas/bundled/data-model.json +1298 -0
  358. package/dist/schemas/bundled/data-store.json +2025 -0
  359. package/dist/schemas/bundled/manifest.json +93 -0
  360. package/dist/schemas/bundled/motivation.json +1360 -0
  361. package/dist/schemas/bundled/navigation.json +1874 -0
  362. package/dist/schemas/bundled/security.json +3488 -0
  363. package/dist/schemas/bundled/technology.json +2067 -0
  364. package/dist/schemas/bundled/testing.json +3120 -0
  365. package/dist/schemas/bundled/ux.json +3592 -0
  366. package/dist/server/schemas.js +202 -0
  367. package/dist/server/schemas.js.map +7 -0
  368. package/dist/server/server.js +1336 -252
  369. package/dist/server/server.js.map +3 -3
  370. package/dist/server/telemetry-middleware.js +22 -15
  371. package/dist/server/telemetry-middleware.js.map +2 -2
  372. package/dist/server-entry.js +65 -0
  373. package/dist/server-entry.js.map +7 -0
  374. package/dist/telemetry/config.js +89 -0
  375. package/dist/telemetry/config.js.map +7 -0
  376. package/dist/telemetry/console-interceptor.js.map +1 -1
  377. package/dist/telemetry/detect.js +24 -0
  378. package/dist/telemetry/detect.js.map +7 -0
  379. package/dist/telemetry/fetch-otlp-exporter.js +112 -0
  380. package/dist/telemetry/fetch-otlp-exporter.js.map +7 -0
  381. package/dist/telemetry/index.js +153 -3
  382. package/dist/telemetry/index.js.map +2 -2
  383. package/dist/telemetry/resilient-exporter.js +22 -8
  384. package/dist/telemetry/resilient-exporter.js.map +2 -2
  385. package/dist/telemetry/resilient-log-exporter.js +17 -8
  386. package/dist/telemetry/resilient-log-exporter.js.map +2 -2
  387. package/dist/telemetry/test-instrumentation.js.map +2 -2
  388. package/dist/types/index.js +84 -0
  389. package/dist/types/index.js.map +3 -3
  390. package/dist/types/source-reference.js +1 -0
  391. package/dist/types/source-reference.js.map +7 -0
  392. package/dist/utils/chat-logger.js +292 -0
  393. package/dist/utils/chat-logger.js.map +7 -0
  394. package/dist/utils/claude-stream.js +8 -0
  395. package/dist/utils/claude-stream.js.map +7 -0
  396. package/dist/utils/date-utils.js +7 -0
  397. package/dist/utils/date-utils.js.map +7 -0
  398. package/dist/utils/element-utils.js.map +1 -1
  399. package/dist/utils/errors.js +88 -15
  400. package/dist/utils/errors.js.map +3 -3
  401. package/dist/utils/export-python-annotations.js +82 -0
  402. package/dist/utils/export-python-annotations.js.map +7 -0
  403. package/dist/utils/file-io.js +7 -2
  404. package/dist/utils/file-io.js.map +2 -2
  405. package/dist/utils/file-lock.js +156 -0
  406. package/dist/utils/file-lock.js.map +7 -0
  407. package/dist/utils/id-generator.js +18 -0
  408. package/dist/utils/id-generator.js.map +7 -0
  409. package/dist/utils/layer-name-formatter.js +16 -0
  410. package/dist/utils/layer-name-formatter.js.map +7 -0
  411. package/dist/utils/markdown-anchor.js +7 -0
  412. package/dist/utils/markdown-anchor.js.map +7 -0
  413. package/dist/utils/markdown-link.js +12 -0
  414. package/dist/utils/markdown-link.js.map +7 -0
  415. package/dist/utils/markdown-table.js +17 -0
  416. package/dist/utils/markdown-table.js.map +7 -0
  417. package/dist/utils/mermaid-utils.js +11 -0
  418. package/dist/utils/mermaid-utils.js.map +7 -0
  419. package/dist/utils/project-paths.js.map +2 -2
  420. package/dist/utils/source-reference.js +52 -0
  421. package/dist/utils/source-reference.js.map +7 -0
  422. package/dist/utils/spec-installer.js +40 -53
  423. package/dist/utils/spec-installer.js.map +2 -2
  424. package/dist/utils/spec-version.js +5 -1
  425. package/dist/utils/spec-version.js.map +2 -2
  426. package/dist/utils/string-utils.js +12 -0
  427. package/dist/utils/string-utils.js.map +7 -0
  428. package/dist/utils/table-formatting.js +19 -0
  429. package/dist/utils/table-formatting.js.map +7 -0
  430. package/dist/validators/index.js +4 -0
  431. package/dist/validators/index.js.map +2 -2
  432. package/dist/validators/naming-validator.js +20 -23
  433. package/dist/validators/naming-validator.js.map +2 -2
  434. package/dist/validators/reference-validator.js +23 -38
  435. package/dist/validators/reference-validator.js.map +2 -2
  436. package/dist/validators/relationship-schema-validator.js +243 -0
  437. package/dist/validators/relationship-schema-validator.js.map +7 -0
  438. package/dist/validators/schema-validator.js +168 -68
  439. package/dist/validators/schema-validator.js.map +2 -2
  440. package/dist/validators/semantic-validator.js +36 -60
  441. package/dist/validators/semantic-validator.js.map +2 -2
  442. package/dist/validators/types.js.map +2 -2
  443. package/dist/validators/validation-formatter.js +159 -0
  444. package/dist/validators/validation-formatter.js.map +7 -0
  445. package/dist/validators/validator.js +24 -38
  446. package/dist/validators/validator.js.map +2 -2
  447. package/dist/viewer/README.md +139 -0
  448. package/dist/viewer/assets/main-CY0Xufuj.css +1 -0
  449. package/dist/viewer/assets/main-DtgErnwF.js +81 -0
  450. package/dist/viewer/assets/vendor-CxKvDp2x.js +17 -0
  451. package/dist/viewer/favicon.svg +11 -0
  452. package/dist/viewer/fonts/inter/Inter-Black.woff2 +0 -0
  453. package/dist/viewer/fonts/inter/Inter-Bold.woff2 +0 -0
  454. package/dist/viewer/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  455. package/dist/viewer/fonts/inter/Inter-Light.woff2 +0 -0
  456. package/dist/viewer/fonts/inter/Inter-Medium.woff2 +0 -0
  457. package/dist/viewer/fonts/inter/Inter-Regular.woff2 +0 -0
  458. package/dist/viewer/fonts/inter/Inter-SemiBold.woff2 +0 -0
  459. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Medium.woff2 +0 -0
  460. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-Regular.woff2 +0 -0
  461. package/dist/viewer/fonts/jetbrains-mono/JetBrainsMono-SemiBold.woff2 +0 -0
  462. package/dist/viewer/index.html +15 -0
  463. package/dist/viewer/manifest.json +99 -0
  464. package/dist/viewer/version.json +1 -0
  465. package/package.json +42 -16
  466. package/PYTHON_CLI_PARITY.md +0 -265
  467. package/PYTHON_CLI_STRUCTURE_UPDATE.md +0 -246
  468. package/biome.json +0 -42
  469. package/bunfig.toml +0 -3
  470. package/dist/ai/claude-client.js +0 -71
  471. package/dist/ai/claude-client.js.map +0 -7
  472. package/dist/ai/context-provider.js +0 -129
  473. package/dist/ai/context-provider.js.map +0 -7
  474. package/dist/ai/tools.js +0 -231
  475. package/dist/ai/tools.js.map +0 -7
  476. package/dist/commands/migrate.js +0 -36
  477. package/dist/commands/migrate.js.map +0 -7
  478. package/dist/commands/project.js +0 -74
  479. package/dist/commands/project.js.map +0 -7
  480. package/dist/core/active-changeset.js +0 -52
  481. package/dist/core/active-changeset.js.map +0 -7
  482. package/dist/core/projection-engine.js +0 -288
  483. package/dist/core/projection-engine.js.map +0 -7
  484. package/dist/schemas/bundled/01-motivation-layer.schema.json +0 -942
  485. package/dist/schemas/bundled/02-business-layer.schema.json +0 -1293
  486. package/dist/schemas/bundled/03-security-layer.schema.json +0 -2177
  487. package/dist/schemas/bundled/04-application-layer.schema.json +0 -1328
  488. package/dist/schemas/bundled/05-technology-layer.schema.json +0 -1465
  489. package/dist/schemas/bundled/06-api-layer.schema.json +0 -1743
  490. package/dist/schemas/bundled/07-data-model-layer.schema.json +0 -1253
  491. package/dist/schemas/bundled/08-datastore-layer.schema.json +0 -892
  492. package/dist/schemas/bundled/09-ux-layer.schema.json +0 -1506
  493. package/dist/schemas/bundled/10-navigation-layer.schema.json +0 -843
  494. package/dist/schemas/bundled/11-apm-observability-layer.schema.json +0 -1430
  495. package/dist/schemas/bundled/12-testing-layer.schema.json +0 -1091
  496. package/dist/schemas/bundled/common/layer-extensions.schema.json +0 -266
  497. package/dist/schemas/bundled/common/predicates.schema.json +0 -493
  498. package/dist/schemas/bundled/common/relationships.schema.json +0 -791
  499. package/dist/schemas/bundled/common/source-references.schema.json +0 -71
  500. package/dist/schemas/bundled/link-registry.json +0 -1839
  501. package/dist/schemas/bundled/link-registry.schema.json +0 -339
  502. package/dist/schemas/bundled/relationship-catalog.json +0 -1302
  503. package/dist/schemas/bundled/relationship-type.schema.json +0 -221
  504. package/dist/utils/model-path.js +0 -22
  505. package/dist/utils/model-path.js.map +0 -7
  506. package/docs/TEST-INSTRUMENTATION.md +0 -405
  507. package/docs/telemetry.md +0 -427
  508. package/test-debug.js +0 -33
  509. package/test-special.mjs +0 -46
  510. package/test_runner.ts +0 -7
@@ -0,0 +1,2025 @@
1
+ {
2
+ "specVersion": "0.8.4",
3
+ "layer": {
4
+ "id": "data-store",
5
+ "number": 8,
6
+ "name": "Data Store Layer",
7
+ "description": "Layer 8: Data Store Layer",
8
+ "inspired_by": {
9
+ "standard": "ISO/IEC 9075 (SQL) + Paradigm Extensions",
10
+ "version": "2024",
11
+ "url": "https://en.wikipedia.org/wiki/Database_model"
12
+ },
13
+ "node_types": [
14
+ "data-store.accesspattern",
15
+ "data-store.collection",
16
+ "data-store.database",
17
+ "data-store.eventhandler",
18
+ "data-store.field",
19
+ "data-store.index",
20
+ "data-store.namespace",
21
+ "data-store.retentionpolicy",
22
+ "data-store.storedlogic",
23
+ "data-store.validationrule",
24
+ "data-store.view"
25
+ ]
26
+ },
27
+ "nodeSchemas": {
28
+ "accesspattern": {
29
+ "$schema": "http://json-schema.org/draft-07/schema#",
30
+ "title": "AccessPattern",
31
+ "description": "A documented data access pattern that describes how applications read or write data. Critical for NoSQL data modeling where schema design is driven by access patterns rather than normalization.",
32
+ "allOf": [
33
+ {
34
+ "$ref": "urn:dr:spec:base:spec-node"
35
+ }
36
+ ],
37
+ "properties": {
38
+ "spec_node_id": {
39
+ "const": "data-store.accesspattern"
40
+ },
41
+ "layer_id": {
42
+ "const": "data-store"
43
+ },
44
+ "type": {
45
+ "const": "accesspattern"
46
+ },
47
+ "attributes": {
48
+ "type": "object",
49
+ "properties": {
50
+ "patternType": {
51
+ "type": "string",
52
+ "enum": [
53
+ "POINT_READ",
54
+ "RANGE_SCAN",
55
+ "FULL_SCAN",
56
+ "WRITE",
57
+ "UPSERT",
58
+ "BATCH_WRITE",
59
+ "AGGREGATION",
60
+ "SEARCH",
61
+ "VECTOR_SIMILARITY",
62
+ "GRAPH_TRAVERSAL",
63
+ "TIME_RANGE",
64
+ "LATEST_VALUE",
65
+ "CUSTOM"
66
+ ],
67
+ "description": "Category of access pattern. POINT_READ: single-record lookup by key. RANGE_SCAN: ordered range of records. FULL_SCAN: all records. WRITE/UPSERT/BATCH_WRITE: mutation patterns. AGGREGATION: computed result over records. SEARCH: full-text or filtered search. VECTOR_SIMILARITY: approximate nearest neighbor. GRAPH_TRAVERSAL: multi-hop graph walk. TIME_RANGE/LATEST_VALUE: time-series queries."
68
+ },
69
+ "targetCollection": {
70
+ "type": "string",
71
+ "description": "The collection this access pattern operates on."
72
+ },
73
+ "keyCondition": {
74
+ "type": "string",
75
+ "description": "Key or partition condition for this access (e.g., 'customer_id = :id', 'PK = USER#:userId AND SK BEGINS_WITH ORDER#')."
76
+ },
77
+ "sortKey": {
78
+ "type": "string",
79
+ "description": "Sort key expression for composite key patterns (e.g., 'SK BEGINS_WITH ORDER#', 'timestamp BETWEEN :start AND :end'). Used in DynamoDB/Cassandra to define the clustering dimension of the access pattern."
80
+ },
81
+ "filterCondition": {
82
+ "type": "string",
83
+ "description": "Additional filter condition applied after key lookup."
84
+ },
85
+ "expectedFrequency": {
86
+ "type": "string",
87
+ "enum": [
88
+ "RARE",
89
+ "OCCASIONAL",
90
+ "FREQUENT",
91
+ "HIGH_THROUGHPUT",
92
+ "REAL_TIME"
93
+ ],
94
+ "description": "Expected frequency of this access pattern. Informs capacity planning and index decisions."
95
+ },
96
+ "consistencyRequirement": {
97
+ "type": "string",
98
+ "enum": [
99
+ "STRONG",
100
+ "EVENTUAL",
101
+ "SESSION",
102
+ "CAUSAL",
103
+ "LINEARIZABLE"
104
+ ],
105
+ "description": "Required consistency level for this access pattern."
106
+ },
107
+ "x-source-reference": {
108
+ "type": "string",
109
+ "description": "Source code reference using OpenAPI x- extension pattern."
110
+ }
111
+ },
112
+ "required": ["patternType", "targetCollection"],
113
+ "additionalProperties": false
114
+ }
115
+ },
116
+ "$id": "urn:dr:spec:node:data-store.accesspattern"
117
+ },
118
+ "collection": {
119
+ "$schema": "http://json-schema.org/draft-07/schema#",
120
+ "title": "Collection",
121
+ "description": "A container for records, documents, or entries within a data store. Paradigm-neutral: maps to SQL table, document store collection, key-value bucket/hash, wide-column table/column family, vector collection, time-series measurement/hypertable, graph node label or edge type, and search engine index.",
122
+ "allOf": [
123
+ {
124
+ "$ref": "urn:dr:spec:base:spec-node"
125
+ }
126
+ ],
127
+ "properties": {
128
+ "spec_node_id": {
129
+ "const": "data-store.collection"
130
+ },
131
+ "layer_id": {
132
+ "const": "data-store"
133
+ },
134
+ "type": {
135
+ "const": "collection"
136
+ },
137
+ "attributes": {
138
+ "type": "object",
139
+ "properties": {
140
+ "collectionType": {
141
+ "type": "string",
142
+ "enum": [
143
+ "TABLE",
144
+ "COLLECTION",
145
+ "COLUMN_FAMILY",
146
+ "BUCKET",
147
+ "HASH",
148
+ "SORTED_SET",
149
+ "STREAM",
150
+ "VECTOR_COLLECTION",
151
+ "MEASUREMENT",
152
+ "HYPERTABLE",
153
+ "NODE_LABEL",
154
+ "EDGE_TYPE",
155
+ "SEARCH_INDEX"
156
+ ],
157
+ "description": "The paradigm-specific type of this collection. TABLE: relational table. COLLECTION: document store collection. COLUMN_FAMILY: wide-column column family. BUCKET/HASH/SORTED_SET/STREAM: key-value data structures. VECTOR_COLLECTION: vector embedding store. MEASUREMENT/HYPERTABLE: time-series data container. NODE_LABEL/EDGE_TYPE: graph database structural types. SEARCH_INDEX: search engine index."
158
+ },
159
+ "partitionKey": {
160
+ "type": "string",
161
+ "description": "Primary partition key field name(s). Used by wide-column stores (Cassandra partition key), DynamoDB (partition key), time-series (time field), and sharded relational databases."
162
+ },
163
+ "clusteringKeys": {
164
+ "type": "string",
165
+ "description": "Clustering or sort key field name(s) that determine ordering within a partition. Relevant for wide-column stores (Cassandra clustering columns) and DynamoDB sort keys."
166
+ },
167
+ "ttlDefault": {
168
+ "type": "integer",
169
+ "description": "Default time-to-live in seconds for entries in this collection. Relevant for key-value stores, wide-column stores, and time-series databases."
170
+ },
171
+ "validationSchema": {
172
+ "type": "string",
173
+ "description": "Reference to a schema definition that validates documents or records. For MongoDB this is the JSON Schema validator; for relational databases, the set of column constraints; for search engines, the mapping definition."
174
+ },
175
+ "x-source-reference": {
176
+ "type": "string",
177
+ "description": "Source code reference using OpenAPI x- extension pattern."
178
+ }
179
+ },
180
+ "additionalProperties": false
181
+ }
182
+ },
183
+ "$id": "urn:dr:spec:node:data-store.collection"
184
+ },
185
+ "database": {
186
+ "$schema": "http://json-schema.org/draft-07/schema#",
187
+ "title": "Database",
188
+ "description": "A database instance representing a top-level data store deployment. Paradigm-neutral: covers relational databases, document stores, key-value stores, wide-column stores, vector databases, time-series databases, graph databases, search engines, and multi-model systems.",
189
+ "allOf": [
190
+ {
191
+ "$ref": "urn:dr:spec:base:spec-node"
192
+ }
193
+ ],
194
+ "properties": {
195
+ "spec_node_id": {
196
+ "const": "data-store.database"
197
+ },
198
+ "layer_id": {
199
+ "const": "data-store"
200
+ },
201
+ "type": {
202
+ "const": "database"
203
+ },
204
+ "attributes": {
205
+ "type": "object",
206
+ "properties": {
207
+ "engine": {
208
+ "type": "string",
209
+ "description": "Database engine name (e.g., 'PostgreSQL', 'MongoDB', 'Redis', 'Cassandra', 'Pinecone', 'Neo4j', 'Elasticsearch', 'InfluxDB', 'DynamoDB'). Free-text to accommodate any engine without enumeration constraints."
210
+ },
211
+ "paradigm": {
212
+ "type": "string",
213
+ "enum": [
214
+ "RELATIONAL",
215
+ "DOCUMENT",
216
+ "KEY_VALUE",
217
+ "WIDE_COLUMN",
218
+ "VECTOR",
219
+ "TIME_SERIES",
220
+ "GRAPH",
221
+ "SEARCH_ENGINE",
222
+ "MULTI_MODEL"
223
+ ],
224
+ "description": "Primary data model paradigm. RELATIONAL: SQL-based tabular data (PostgreSQL, MySQL, Oracle). DOCUMENT: JSON/BSON document storage (MongoDB, CouchDB, Firestore). KEY_VALUE: simple key-to-value mapping (Redis, DynamoDB, etcd). WIDE_COLUMN: column-family storage (Cassandra, HBase, Bigtable). VECTOR: vector embedding storage and similarity search (Pinecone, Weaviate, Qdrant). TIME_SERIES: time-indexed measurements (InfluxDB, TimescaleDB). GRAPH: nodes and edges with traversal (Neo4j, Neptune). SEARCH_ENGINE: full-text search and analytics (Elasticsearch, OpenSearch). MULTI_MODEL: natively supports multiple paradigms (ArangoDB, CosmosDB, FaunaDB)."
225
+ },
226
+ "version": {
227
+ "type": "string"
228
+ },
229
+ "charset": {
230
+ "type": "string"
231
+ },
232
+ "collation": {
233
+ "type": "string"
234
+ },
235
+ "deploymentModel": {
236
+ "type": "string",
237
+ "enum": [
238
+ "STANDALONE",
239
+ "REPLICATED",
240
+ "SHARDED",
241
+ "DISTRIBUTED",
242
+ "SERVERLESS",
243
+ "EMBEDDED"
244
+ ],
245
+ "description": "How the database is deployed. STANDALONE: single instance. REPLICATED: primary with read replicas. SHARDED: data partitioned across nodes. DISTRIBUTED: fully distributed with no single primary. SERVERLESS: cloud-managed auto-scaling. EMBEDDED: in-process database (SQLite, RocksDB)."
246
+ }
247
+ },
248
+ "required": ["engine", "paradigm"],
249
+ "additionalProperties": false
250
+ }
251
+ },
252
+ "$id": "urn:dr:spec:node:data-store.database"
253
+ },
254
+ "eventhandler": {
255
+ "$schema": "http://json-schema.org/draft-07/schema#",
256
+ "title": "EventHandler",
257
+ "description": "A reactive mechanism that executes in response to data change events. Paradigm-neutral: covers SQL triggers, MongoDB change streams, DynamoDB Streams, Cassandra CDC, Redis keyspace notifications, Elasticsearch watchers, Neo4j APOC triggers, and time-series alerting rules.",
258
+ "allOf": [
259
+ {
260
+ "$ref": "urn:dr:spec:base:spec-node"
261
+ }
262
+ ],
263
+ "properties": {
264
+ "spec_node_id": {
265
+ "const": "data-store.eventhandler"
266
+ },
267
+ "layer_id": {
268
+ "const": "data-store"
269
+ },
270
+ "type": {
271
+ "const": "eventhandler"
272
+ },
273
+ "attributes": {
274
+ "type": "object",
275
+ "properties": {
276
+ "handlerType": {
277
+ "type": "string",
278
+ "enum": [
279
+ "TRIGGER",
280
+ "CHANGE_STREAM",
281
+ "CDC_LISTENER",
282
+ "KEYSPACE_NOTIFICATION",
283
+ "STREAM_PROCESSOR",
284
+ "WATCHER",
285
+ "ALERT_RULE",
286
+ "CUSTOM"
287
+ ],
288
+ "description": "Type of event handler mechanism. TRIGGER: synchronous SQL trigger (BEFORE/AFTER DML). CHANGE_STREAM: asynchronous document change feed (MongoDB, CouchDB). CDC_LISTENER: change data capture consumer (Cassandra, Debezium). KEYSPACE_NOTIFICATION: key event notification (Redis). STREAM_PROCESSOR: stream-based event processor (Redis Streams, Kafka Connect). WATCHER: periodic condition check and alert (Elasticsearch). ALERT_RULE: threshold or anomaly alerting (time-series, monitoring). CUSTOM: engine-specific mechanism not listed."
289
+ },
290
+ "targetCollection": {
291
+ "type": "string",
292
+ "description": "The collection or database-level scope this handler is attached to."
293
+ },
294
+ "timing": {
295
+ "type": "string",
296
+ "enum": [
297
+ "BEFORE",
298
+ "AFTER",
299
+ "INSTEAD_OF",
300
+ "ON_CHANGE",
301
+ "CONTINUOUS"
302
+ ],
303
+ "description": "When the handler fires relative to the event. BEFORE: fires before the operation (SQL BEFORE trigger). AFTER: fires after the operation (SQL AFTER trigger). INSTEAD_OF: replaces the operation (SQL INSTEAD OF trigger for views). ON_CHANGE: fires when a change is detected (change streams, CDC). CONTINUOUS: always-on stream processing."
304
+ },
305
+ "events": {
306
+ "type": "array",
307
+ "items": {
308
+ "type": "string",
309
+ "enum": [
310
+ "INSERT",
311
+ "UPDATE",
312
+ "DELETE",
313
+ "REPLACE",
314
+ "TRUNCATE",
315
+ "DROP",
316
+ "INVALIDATE",
317
+ "EXPIRE",
318
+ "SET",
319
+ "DEL",
320
+ "THRESHOLD",
321
+ "ANOMALY",
322
+ "CUSTOM"
323
+ ]
324
+ },
325
+ "description": "Events that activate this handler. SQL: INSERT/UPDATE/DELETE/TRUNCATE. Document: INSERT/UPDATE/DELETE/REPLACE/DROP/INVALIDATE. Key-value: EXPIRE/SET/DEL. Monitoring: THRESHOLD/ANOMALY. CUSTOM: engine-specific event not listed."
326
+ },
327
+ "granularity": {
328
+ "type": "string",
329
+ "enum": ["ROW", "STATEMENT", "DOCUMENT", "KEY", "BATCH"],
330
+ "description": "Granularity of handler activation. ROW: fires once per affected row (SQL FOR EACH ROW). STATEMENT: fires once per SQL statement. DOCUMENT: fires per changed document (document store change streams). KEY: fires per key operation (key-value notifications). BATCH: fires per batch of changes (CDC, stream processing)."
331
+ },
332
+ "action": {
333
+ "type": "string",
334
+ "description": "Reference to the stored logic (function name, pipeline reference, or inline expression) that executes when this handler fires."
335
+ },
336
+ "condition": {
337
+ "type": "string",
338
+ "description": "Optional filter condition. Only events matching this condition activate the handler. Maps to SQL WHEN clause, MongoDB pipeline $match stage, or Elasticsearch watcher condition."
339
+ },
340
+ "enabled": {
341
+ "type": "boolean"
342
+ }
343
+ },
344
+ "required": ["handlerType", "events"],
345
+ "additionalProperties": false
346
+ }
347
+ },
348
+ "$id": "urn:dr:spec:node:data-store.eventhandler"
349
+ },
350
+ "field": {
351
+ "$schema": "http://json-schema.org/draft-07/schema#",
352
+ "title": "Field",
353
+ "description": "A named data element within a collection. Paradigm-neutral: maps to SQL column, document store field/path, key-value hash field, wide-column column, vector dimension or metadata field, time-series tag or field, graph property, and search engine mapping property.",
354
+ "allOf": [
355
+ {
356
+ "$ref": "urn:dr:spec:base:spec-node"
357
+ }
358
+ ],
359
+ "properties": {
360
+ "spec_node_id": {
361
+ "const": "data-store.field"
362
+ },
363
+ "layer_id": {
364
+ "const": "data-store"
365
+ },
366
+ "type": {
367
+ "const": "field"
368
+ },
369
+ "attributes": {
370
+ "type": "object",
371
+ "properties": {
372
+ "dataType": {
373
+ "type": "string",
374
+ "description": "Data type of this field. Interpretation is paradigm-specific: SQL types (VARCHAR, INTEGER, TIMESTAMP), BSON types (String, ObjectId, Document), Elasticsearch mapping types (keyword, text, dense_vector), or any engine-native type name."
375
+ },
376
+ "nullable": {
377
+ "type": "boolean"
378
+ },
379
+ "defaultValue": {
380
+ "type": "string"
381
+ },
382
+ "generated": {
383
+ "type": "string",
384
+ "enum": ["ALWAYS", "BY_DEFAULT", "NEVER"],
385
+ "description": "Whether the field value is auto-generated. ALWAYS: value is always system-generated (SQL identity GENERATED ALWAYS, MongoDB auto _id, auto-increment). BY_DEFAULT: system-generated unless explicitly overridden (SQL GENERATED BY DEFAULT). NEVER: value must be user-provided."
386
+ },
387
+ "fieldRole": {
388
+ "type": "string",
389
+ "enum": [
390
+ "VALUE",
391
+ "TAG",
392
+ "TIMESTAMP",
393
+ "PARTITION_KEY",
394
+ "CLUSTERING_KEY",
395
+ "VECTOR",
396
+ "METADATA",
397
+ "LABEL",
398
+ "PROPERTY"
399
+ ],
400
+ "description": "Semantic role of this field within its collection. VALUE: regular data field. TAG: indexed metadata for filtering (time-series). TIMESTAMP: time-series time field. PARTITION_KEY: wide-column or distributed partition key component. CLUSTERING_KEY: wide-column clustering/sort key component. VECTOR: vector embedding field. METADATA: vector store metadata for filtering. LABEL: graph node label. PROPERTY: graph node or edge property."
401
+ },
402
+ "vectorDimensions": {
403
+ "type": "integer",
404
+ "description": "Number of dimensions for vector fields. Only applicable when fieldRole is VECTOR."
405
+ },
406
+ "distanceMetric": {
407
+ "type": "string",
408
+ "enum": ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"],
409
+ "description": "Distance metric for vector similarity search. COSINE: angular similarity. EUCLIDEAN: L2 distance. DOT_PRODUCT: inner product similarity. MANHATTAN: L1 distance. Only applicable when fieldRole is VECTOR."
410
+ },
411
+ "analyzer": {
412
+ "type": "string",
413
+ "description": "Text analyzer for search engine fields (e.g., 'standard', 'english', 'keyword', 'whitespace'). Controls tokenization and normalization. Only applicable for search engine paradigm."
414
+ },
415
+ "nested": {
416
+ "type": "boolean",
417
+ "description": "Whether this field contains nested or embedded documents. Relevant for document stores (MongoDB embedded documents) and search engines (Elasticsearch nested type)."
418
+ },
419
+ "x-source-reference": {
420
+ "type": "string",
421
+ "description": "Source code reference using OpenAPI x- extension pattern."
422
+ }
423
+ },
424
+ "required": ["dataType"],
425
+ "additionalProperties": false
426
+ }
427
+ },
428
+ "$id": "urn:dr:spec:node:data-store.field"
429
+ },
430
+ "index": {
431
+ "$schema": "http://json-schema.org/draft-07/schema#",
432
+ "title": "Index",
433
+ "description": "A database index for query optimization. Paradigm-neutral: covers B-tree and hash indexes (relational), compound and multikey indexes (document stores), vector approximate nearest neighbor indexes (HNSW, IVF), inverted indexes (search engines), geospatial indexes, and secondary indexes (wide-column stores).",
434
+ "allOf": [
435
+ {
436
+ "$ref": "urn:dr:spec:base:spec-node"
437
+ }
438
+ ],
439
+ "properties": {
440
+ "spec_node_id": {
441
+ "const": "data-store.index"
442
+ },
443
+ "layer_id": {
444
+ "const": "data-store"
445
+ },
446
+ "type": {
447
+ "const": "index"
448
+ },
449
+ "attributes": {
450
+ "type": "object",
451
+ "properties": {
452
+ "fields": {
453
+ "type": "string",
454
+ "description": "Field name(s) included in the index key."
455
+ },
456
+ "unique": {
457
+ "type": "boolean"
458
+ },
459
+ "method": {
460
+ "type": "string",
461
+ "enum": [
462
+ "BTREE",
463
+ "HASH",
464
+ "GIN",
465
+ "GIST",
466
+ "SPGIST",
467
+ "BRIN",
468
+ "HNSW",
469
+ "IVF_FLAT",
470
+ "IVF_PQ",
471
+ "ANNOY",
472
+ "LSH",
473
+ "INVERTED",
474
+ "FULLTEXT",
475
+ "GEOSPATIAL",
476
+ "COMPOUND",
477
+ "MULTIKEY",
478
+ "CUSTOM"
479
+ ],
480
+ "description": "Index access method. BTREE/HASH: traditional ordered and hash-based (relational, document). GIN/GIST/SPGIST/BRIN: PostgreSQL advanced index types. HNSW/IVF_FLAT/IVF_PQ/ANNOY/LSH: vector approximate nearest neighbor algorithms. INVERTED/FULLTEXT: search engine and full-text indexes. GEOSPATIAL: location-based spatial indexes. COMPOUND/MULTIKEY: document store compound and array indexes. CUSTOM: engine-specific method not listed."
481
+ },
482
+ "where": {
483
+ "type": "string",
484
+ "description": "Partial or filtered index predicate. Only entries satisfying this condition are indexed. Supported by relational (PostgreSQL, SQL Server) and document stores (MongoDB partial index filter)."
485
+ },
486
+ "include": {
487
+ "type": "string",
488
+ "description": "Covering index: additional fields stored in the index but not in the search key. Reduces lookups by including frequently accessed fields in the index leaf pages."
489
+ },
490
+ "sparse": {
491
+ "type": "boolean",
492
+ "description": "Whether the index only includes entries where the indexed field exists. Relevant for document stores with flexible schemas and sparse datasets."
493
+ },
494
+ "vectorConfig": {
495
+ "type": "object",
496
+ "description": "Configuration parameters for vector indexes. Only applicable when method is HNSW, IVF_FLAT, IVF_PQ, ANNOY, or LSH.",
497
+ "properties": {
498
+ "dimensions": {
499
+ "type": "integer",
500
+ "description": "Number of dimensions in the vector space."
501
+ },
502
+ "distanceMetric": {
503
+ "type": "string",
504
+ "enum": ["COSINE", "EUCLIDEAN", "DOT_PRODUCT", "MANHATTAN"],
505
+ "description": "Distance metric for similarity computation."
506
+ },
507
+ "efConstruction": {
508
+ "type": "integer",
509
+ "description": "HNSW build-time parameter controlling index quality vs. build speed tradeoff."
510
+ },
511
+ "m": {
512
+ "type": "integer",
513
+ "description": "HNSW maximum number of connections per node in the graph."
514
+ },
515
+ "nlist": {
516
+ "type": "integer",
517
+ "description": "IVF number of clusters (Voronoi cells) for partitioning the vector space."
518
+ }
519
+ },
520
+ "additionalProperties": true
521
+ }
522
+ },
523
+ "additionalProperties": false
524
+ }
525
+ },
526
+ "$id": "urn:dr:spec:node:data-store.index"
527
+ },
528
+ "namespace": {
529
+ "$schema": "http://json-schema.org/draft-07/schema#",
530
+ "title": "Namespace",
531
+ "description": "A logical grouping of database objects within a database instance. Paradigm-neutral: maps to SQL schema, MongoDB database, Cassandra keyspace, Redis namespace/prefix, Elasticsearch index, vector database namespace, and graph database named graph.",
532
+ "allOf": [
533
+ {
534
+ "$ref": "urn:dr:spec:base:spec-node"
535
+ }
536
+ ],
537
+ "properties": {
538
+ "spec_node_id": {
539
+ "const": "data-store.namespace"
540
+ },
541
+ "layer_id": {
542
+ "const": "data-store"
543
+ },
544
+ "type": {
545
+ "const": "namespace"
546
+ },
547
+ "attributes": {
548
+ "type": "object",
549
+ "properties": {
550
+ "owner": {
551
+ "type": "string"
552
+ }
553
+ },
554
+ "additionalProperties": false
555
+ }
556
+ },
557
+ "$id": "urn:dr:spec:node:data-store.namespace"
558
+ },
559
+ "retentionpolicy": {
560
+ "$schema": "http://json-schema.org/draft-07/schema#",
561
+ "title": "RetentionPolicy",
562
+ "description": "A data lifecycle management policy that governs how long data is retained and what action is taken when the retention period expires. Applicable across paradigms: time-series downsampling, key-value TTL, search index lifecycle, relational partition pruning, and archival strategies.",
563
+ "allOf": [
564
+ {
565
+ "$ref": "urn:dr:spec:base:spec-node"
566
+ }
567
+ ],
568
+ "properties": {
569
+ "spec_node_id": {
570
+ "const": "data-store.retentionpolicy"
571
+ },
572
+ "layer_id": {
573
+ "const": "data-store"
574
+ },
575
+ "type": {
576
+ "const": "retentionpolicy"
577
+ },
578
+ "attributes": {
579
+ "type": "object",
580
+ "properties": {
581
+ "targetCollection": {
582
+ "type": "string",
583
+ "description": "The collection or namespace this policy applies to."
584
+ },
585
+ "retentionDuration": {
586
+ "type": "string",
587
+ "description": "How long data is retained, expressed as an ISO 8601 duration (e.g., 'P30D' for 30 days, 'P1Y' for 1 year, 'P6M' for 6 months)."
588
+ },
589
+ "action": {
590
+ "type": "string",
591
+ "enum": [
592
+ "DELETE",
593
+ "ARCHIVE",
594
+ "DOWNSAMPLE",
595
+ "MOVE_TIER",
596
+ "COMPRESS"
597
+ ],
598
+ "description": "Action taken when data exceeds the retention period. DELETE: permanently remove. ARCHIVE: move to cold storage. DOWNSAMPLE: aggregate and reduce resolution (time-series). MOVE_TIER: transition to a different storage tier. COMPRESS: apply compression to reduce storage footprint."
599
+ },
600
+ "downsampleInterval": {
601
+ "type": "string",
602
+ "description": "For DOWNSAMPLE action, the aggregation interval (e.g., '1h', '1d'). Only applicable when action is DOWNSAMPLE."
603
+ },
604
+ "enabled": {
605
+ "type": "boolean"
606
+ }
607
+ },
608
+ "required": ["targetCollection", "retentionDuration", "action"],
609
+ "additionalProperties": false
610
+ }
611
+ },
612
+ "$id": "urn:dr:spec:node:data-store.retentionpolicy"
613
+ },
614
+ "storedlogic": {
615
+ "$schema": "http://json-schema.org/draft-07/schema#",
616
+ "title": "StoredLogic",
617
+ "description": "Stored computation logic that executes within the data store engine. Paradigm-neutral: covers SQL functions and procedures, MongoDB aggregation pipelines, Redis Lua scripts, Cassandra UDFs, Neo4j stored procedures, Elasticsearch ingest pipelines, time-series continuous queries, and DynamoDB Lambda triggers.",
618
+ "allOf": [
619
+ {
620
+ "$ref": "urn:dr:spec:base:spec-node"
621
+ }
622
+ ],
623
+ "properties": {
624
+ "spec_node_id": {
625
+ "const": "data-store.storedlogic"
626
+ },
627
+ "layer_id": {
628
+ "const": "data-store"
629
+ },
630
+ "type": {
631
+ "const": "storedlogic"
632
+ },
633
+ "attributes": {
634
+ "type": "object",
635
+ "properties": {
636
+ "logicType": {
637
+ "type": "string",
638
+ "enum": [
639
+ "FUNCTION",
640
+ "PROCEDURE",
641
+ "PACKAGE",
642
+ "AGGREGATION_PIPELINE",
643
+ "MAP_REDUCE",
644
+ "LUA_SCRIPT",
645
+ "LAMBDA",
646
+ "UDF",
647
+ "UDA",
648
+ "CONTINUOUS_QUERY",
649
+ "FLUX_TASK",
650
+ "STORED_PROCEDURE",
651
+ "CYPHER_FUNCTION",
652
+ "INGEST_PIPELINE",
653
+ "PAINLESS_SCRIPT",
654
+ "CUSTOM"
655
+ ],
656
+ "description": "Type of stored computation. FUNCTION/PROCEDURE/PACKAGE: SQL-standard. AGGREGATION_PIPELINE/MAP_REDUCE: document store (MongoDB). LUA_SCRIPT: key-value (Redis). LAMBDA: serverless trigger (DynamoDB Streams). UDF/UDA: user-defined function/aggregate (Cassandra). CONTINUOUS_QUERY/FLUX_TASK: time-series scheduled computation. STORED_PROCEDURE/CYPHER_FUNCTION: graph database. INGEST_PIPELINE/PAINLESS_SCRIPT: search engine. CUSTOM: engine-specific type not listed."
657
+ },
658
+ "language": {
659
+ "type": "string",
660
+ "enum": [
661
+ "SQL",
662
+ "PLPGSQL",
663
+ "PLSQL",
664
+ "TSQL",
665
+ "JAVASCRIPT",
666
+ "PYTHON",
667
+ "LUA",
668
+ "JAVA",
669
+ "C",
670
+ "CYPHER",
671
+ "GREMLIN",
672
+ "SPARQL",
673
+ "FLUX",
674
+ "INFLUXQL",
675
+ "PAINLESS",
676
+ "MVEL",
677
+ "MQL",
678
+ "EXTERNAL",
679
+ "CUSTOM"
680
+ ],
681
+ "description": "Implementation language. SQL/PLPGSQL/PLSQL/TSQL: relational database languages. JAVASCRIPT/PYTHON/LUA/JAVA/C: general-purpose embedded languages. CYPHER/GREMLIN/SPARQL: graph query languages. FLUX/INFLUXQL: time-series query languages. PAINLESS/MVEL: search engine scripting. MQL: MongoDB Query Language. EXTERNAL: logic implemented outside the database. CUSTOM: language not listed."
682
+ },
683
+ "returnType": {
684
+ "type": "string",
685
+ "description": "Return type of the computation. For functions, the return data type. For pipelines, the output document shape. For void procedures, 'VOID'."
686
+ },
687
+ "deterministic": {
688
+ "type": "boolean",
689
+ "description": "Whether the logic always returns the same output for the same input. Generalizes SQL volatility (IMMUTABLE = true, VOLATILE = false) across paradigms. Deterministic logic is a candidate for result caching."
690
+ },
691
+ "sideEffects": {
692
+ "type": "boolean",
693
+ "description": "Whether the logic can modify data. Functions without side effects are safe for parallel execution and caching. Maps to SQL CONTAINS SQL / MODIFIES SQL DATA distinction."
694
+ },
695
+ "security": {
696
+ "type": "string",
697
+ "enum": ["DEFINER", "INVOKER"],
698
+ "description": "Security context for execution. DEFINER: runs with privileges of the creator (SQL SECURITY DEFINER). INVOKER: runs with privileges of the caller (SQL SECURITY INVOKER)."
699
+ },
700
+ "x-source-reference": {
701
+ "type": "string",
702
+ "description": "Source code reference using OpenAPI x- extension pattern."
703
+ }
704
+ },
705
+ "required": ["logicType", "language"],
706
+ "additionalProperties": false
707
+ }
708
+ },
709
+ "$id": "urn:dr:spec:node:data-store.storedlogic"
710
+ },
711
+ "validationrule": {
712
+ "$schema": "http://json-schema.org/draft-07/schema#",
713
+ "title": "ValidationRule",
714
+ "description": "A data integrity or validation rule enforced by the data store. Paradigm-neutral: covers SQL constraints (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL), document store schema validation and required fields, graph uniqueness and existence constraints, key-value key format rules, and search engine mapping enforcement.",
715
+ "allOf": [
716
+ {
717
+ "$ref": "urn:dr:spec:base:spec-node"
718
+ }
719
+ ],
720
+ "properties": {
721
+ "spec_node_id": {
722
+ "const": "data-store.validationrule"
723
+ },
724
+ "layer_id": {
725
+ "const": "data-store"
726
+ },
727
+ "type": {
728
+ "const": "validationrule"
729
+ },
730
+ "attributes": {
731
+ "type": "object",
732
+ "properties": {
733
+ "ruleType": {
734
+ "type": "string",
735
+ "enum": [
736
+ "PRIMARY_KEY",
737
+ "FOREIGN_KEY",
738
+ "UNIQUE",
739
+ "CHECK",
740
+ "NOT_NULL",
741
+ "SCHEMA_VALIDATION",
742
+ "REQUIRED_FIELD",
743
+ "KEY_FORMAT",
744
+ "TTL_CONSTRAINT",
745
+ "UNIQUENESS_CONSTRAINT",
746
+ "EXISTENCE_CONSTRAINT",
747
+ "NODE_KEY",
748
+ "DIMENSION_CONSTRAINT",
749
+ "MAPPING_STRICT",
750
+ "CUSTOM"
751
+ ],
752
+ "description": "Type of validation or integrity rule. SQL-standard: PRIMARY_KEY, FOREIGN_KEY, UNIQUE, CHECK, NOT_NULL. Document store: SCHEMA_VALIDATION (JSON Schema validator), REQUIRED_FIELD. Key-value: KEY_FORMAT (key naming pattern), TTL_CONSTRAINT. Graph: UNIQUENESS_CONSTRAINT (unique node label+property), EXISTENCE_CONSTRAINT (required property), NODE_KEY (composite unique identifier). Vector: DIMENSION_CONSTRAINT (vector dimension enforcement). Search engine: MAPPING_STRICT (reject unmapped fields). CUSTOM: engine-specific rule not listed."
753
+ },
754
+ "expression": {
755
+ "type": "string",
756
+ "description": "Constraint expression or validation rule body. For CHECK constraints, the SQL expression. For SCHEMA_VALIDATION, a JSON Schema reference. For KEY_FORMAT, a key naming pattern."
757
+ },
758
+ "targetFields": {
759
+ "type": "string",
760
+ "description": "Field name(s) this rule applies to."
761
+ },
762
+ "referencedCollection": {
763
+ "type": "string",
764
+ "description": "For FOREIGN_KEY or cross-collection references, the target collection name."
765
+ },
766
+ "referencedFields": {
767
+ "type": "string",
768
+ "description": "For FOREIGN_KEY or cross-collection references, the target field name(s) in the referenced collection."
769
+ },
770
+ "onDelete": {
771
+ "type": "string",
772
+ "enum": [
773
+ "CASCADE",
774
+ "SET_NULL",
775
+ "SET_DEFAULT",
776
+ "RESTRICT",
777
+ "NO_ACTION"
778
+ ],
779
+ "description": "Referential action on delete. CASCADE: delete dependent entries. SET_NULL: nullify the reference. SET_DEFAULT: reset to default value. RESTRICT: reject if referenced entries exist. NO_ACTION: deferred reject. Applicable to FOREIGN_KEY rules."
780
+ },
781
+ "onUpdate": {
782
+ "type": "string",
783
+ "enum": [
784
+ "CASCADE",
785
+ "SET_NULL",
786
+ "SET_DEFAULT",
787
+ "RESTRICT",
788
+ "NO_ACTION"
789
+ ],
790
+ "description": "Referential action on update. Same values as onDelete, applied when the referenced field value is modified. Applicable to FOREIGN_KEY rules."
791
+ },
792
+ "enforcement": {
793
+ "type": "string",
794
+ "enum": ["STRICT", "WARN", "LOG"],
795
+ "description": "How the rule is enforced. STRICT: reject violating operations (default for most SQL constraints). WARN: allow but emit a warning (supported by some document store validators). LOG: allow and log the violation for audit purposes."
796
+ }
797
+ },
798
+ "required": ["ruleType"],
799
+ "additionalProperties": false
800
+ }
801
+ },
802
+ "$id": "urn:dr:spec:node:data-store.validationrule"
803
+ },
804
+ "view": {
805
+ "$schema": "http://json-schema.org/draft-07/schema#",
806
+ "title": "View",
807
+ "description": "A derived or virtual collection that presents data from one or more source collections. Paradigm-neutral: covers SQL views and materialized views, search engine aliases, document store views (CouchDB), time-series continuous aggregates (TimescaleDB), and named graph projections.",
808
+ "allOf": [
809
+ {
810
+ "$ref": "urn:dr:spec:base:spec-node"
811
+ }
812
+ ],
813
+ "properties": {
814
+ "spec_node_id": {
815
+ "const": "data-store.view"
816
+ },
817
+ "layer_id": {
818
+ "const": "data-store"
819
+ },
820
+ "type": {
821
+ "const": "view"
822
+ },
823
+ "attributes": {
824
+ "type": "object",
825
+ "properties": {
826
+ "definition": {
827
+ "type": "string",
828
+ "description": "Query or expression that defines this view. SQL query for relational, aggregation pipeline for document stores, alias definition for search engines, continuous aggregate query for time-series, Cypher projection for graph databases."
829
+ },
830
+ "materialized": {
831
+ "type": "boolean",
832
+ "description": "Whether the view data is precomputed and stored rather than computed on each read."
833
+ },
834
+ "viewType": {
835
+ "type": "string",
836
+ "enum": [
837
+ "VIRTUAL",
838
+ "MATERIALIZED",
839
+ "ALIAS",
840
+ "CONTINUOUS_AGGREGATE",
841
+ "FILTERED"
842
+ ],
843
+ "description": "Type of view. VIRTUAL: computed on every read (SQL view, CouchDB view). MATERIALIZED: precomputed and stored (SQL materialized view, Cassandra materialized view). ALIAS: pointer or routing abstraction over one or more collections (Elasticsearch alias). CONTINUOUS_AGGREGATE: incrementally maintained materialization (TimescaleDB continuous aggregate, InfluxDB continuous query). FILTERED: read-only subset of another collection."
844
+ },
845
+ "refreshPolicy": {
846
+ "type": "string",
847
+ "enum": ["ON_DEMAND", "ON_COMMIT", "PERIODIC", "CONTINUOUS"],
848
+ "description": "How materialized data is refreshed. ON_DEMAND: manual refresh required. ON_COMMIT: refreshed after each transaction commit. PERIODIC: refreshed on a schedule. CONTINUOUS: incrementally updated as source data changes. Only applicable when materialized is true or viewType is MATERIALIZED or CONTINUOUS_AGGREGATE."
849
+ }
850
+ },
851
+ "additionalProperties": false
852
+ }
853
+ },
854
+ "$id": "urn:dr:spec:node:data-store.view"
855
+ }
856
+ },
857
+ "relationshipSchemas": {
858
+ "data-store.accesspattern.accesses.data-store.collection": {
859
+ "id": "data-store.accesspattern.accesses.data-store.collection",
860
+ "source_spec_node_id": "data-store.accesspattern",
861
+ "source_layer": "data-store",
862
+ "destination_spec_node_id": "data-store.collection",
863
+ "destination_layer": "data-store",
864
+ "predicate": "accesses",
865
+ "cardinality": "many-to-many",
866
+ "strength": "medium",
867
+ "required": false
868
+ },
869
+ "data-store.accesspattern.aggregates.data-store.collection": {
870
+ "id": "data-store.accesspattern.aggregates.data-store.collection",
871
+ "source_spec_node_id": "data-store.accesspattern",
872
+ "source_layer": "data-store",
873
+ "destination_spec_node_id": "data-store.collection",
874
+ "destination_layer": "data-store",
875
+ "predicate": "aggregates",
876
+ "cardinality": "many-to-many",
877
+ "strength": "medium",
878
+ "required": false
879
+ },
880
+ "data-store.accesspattern.aggregates.data-store.field": {
881
+ "id": "data-store.accesspattern.aggregates.data-store.field",
882
+ "source_spec_node_id": "data-store.accesspattern",
883
+ "source_layer": "data-store",
884
+ "destination_spec_node_id": "data-store.field",
885
+ "destination_layer": "data-store",
886
+ "predicate": "aggregates",
887
+ "cardinality": "many-to-many",
888
+ "strength": "medium",
889
+ "required": false
890
+ },
891
+ "data-store.accesspattern.aggregates.data-store.index": {
892
+ "id": "data-store.accesspattern.aggregates.data-store.index",
893
+ "source_spec_node_id": "data-store.accesspattern",
894
+ "source_layer": "data-store",
895
+ "destination_spec_node_id": "data-store.index",
896
+ "destination_layer": "data-store",
897
+ "predicate": "aggregates",
898
+ "cardinality": "many-to-many",
899
+ "strength": "medium",
900
+ "required": false
901
+ },
902
+ "data-store.accesspattern.maps-to.api.operation": {
903
+ "id": "data-store.accesspattern.maps-to.api.operation",
904
+ "source_spec_node_id": "data-store.accesspattern",
905
+ "source_layer": "data-store",
906
+ "destination_spec_node_id": "api.operation",
907
+ "destination_layer": "api",
908
+ "predicate": "maps-to",
909
+ "cardinality": "many-to-many",
910
+ "strength": "medium",
911
+ "required": false
912
+ },
913
+ "data-store.accesspattern.satisfies.security.accesscondition": {
914
+ "id": "data-store.accesspattern.satisfies.security.accesscondition",
915
+ "source_spec_node_id": "data-store.accesspattern",
916
+ "source_layer": "data-store",
917
+ "destination_spec_node_id": "security.accesscondition",
918
+ "destination_layer": "security",
919
+ "predicate": "satisfies",
920
+ "cardinality": "many-to-many",
921
+ "strength": "medium",
922
+ "required": false
923
+ },
924
+ "data-store.accesspattern.satisfies.motivation.requirement": {
925
+ "id": "data-store.accesspattern.satisfies.motivation.requirement",
926
+ "source_spec_node_id": "data-store.accesspattern",
927
+ "source_layer": "data-store",
928
+ "destination_spec_node_id": "motivation.requirement",
929
+ "destination_layer": "motivation",
930
+ "predicate": "satisfies",
931
+ "cardinality": "many-to-many",
932
+ "strength": "medium",
933
+ "required": false
934
+ },
935
+ "data-store.accesspattern.serves.application.applicationfunction": {
936
+ "id": "data-store.accesspattern.serves.application.applicationfunction",
937
+ "source_spec_node_id": "data-store.accesspattern",
938
+ "source_layer": "data-store",
939
+ "destination_spec_node_id": "application.applicationfunction",
940
+ "destination_layer": "application",
941
+ "predicate": "serves",
942
+ "cardinality": "many-to-many",
943
+ "strength": "medium",
944
+ "required": false
945
+ },
946
+ "data-store.accesspattern.serves.business.businessfunction": {
947
+ "id": "data-store.accesspattern.serves.business.businessfunction",
948
+ "source_spec_node_id": "data-store.accesspattern",
949
+ "source_layer": "data-store",
950
+ "destination_spec_node_id": "business.businessfunction",
951
+ "destination_layer": "business",
952
+ "predicate": "serves",
953
+ "cardinality": "many-to-many",
954
+ "strength": "medium",
955
+ "required": false
956
+ },
957
+ "data-store.accesspattern.triggers.data-store.eventhandler": {
958
+ "id": "data-store.accesspattern.triggers.data-store.eventhandler",
959
+ "source_spec_node_id": "data-store.accesspattern",
960
+ "source_layer": "data-store",
961
+ "destination_spec_node_id": "data-store.eventhandler",
962
+ "destination_layer": "data-store",
963
+ "predicate": "triggers",
964
+ "cardinality": "many-to-many",
965
+ "strength": "medium",
966
+ "required": false
967
+ },
968
+ "data-store.accesspattern.triggers.data-store.storedlogic": {
969
+ "id": "data-store.accesspattern.triggers.data-store.storedlogic",
970
+ "source_spec_node_id": "data-store.accesspattern",
971
+ "source_layer": "data-store",
972
+ "destination_spec_node_id": "data-store.storedlogic",
973
+ "destination_layer": "data-store",
974
+ "predicate": "triggers",
975
+ "cardinality": "many-to-many",
976
+ "strength": "medium",
977
+ "required": false
978
+ },
979
+ "data-store.accesspattern.uses.data-store.index": {
980
+ "id": "data-store.accesspattern.uses.data-store.index",
981
+ "source_spec_node_id": "data-store.accesspattern",
982
+ "source_layer": "data-store",
983
+ "destination_spec_node_id": "data-store.index",
984
+ "destination_layer": "data-store",
985
+ "predicate": "uses",
986
+ "cardinality": "many-to-many",
987
+ "strength": "medium",
988
+ "required": false
989
+ },
990
+ "data-store.collection.composes.data-store.collection": {
991
+ "id": "data-store.collection.composes.data-store.collection",
992
+ "source_spec_node_id": "data-store.collection",
993
+ "source_layer": "data-store",
994
+ "destination_spec_node_id": "data-store.collection",
995
+ "destination_layer": "data-store",
996
+ "predicate": "composes",
997
+ "cardinality": "many-to-many",
998
+ "strength": "medium",
999
+ "required": false
1000
+ },
1001
+ "data-store.collection.composes.data-store.eventhandler": {
1002
+ "id": "data-store.collection.composes.data-store.eventhandler",
1003
+ "source_spec_node_id": "data-store.collection",
1004
+ "source_layer": "data-store",
1005
+ "destination_spec_node_id": "data-store.eventhandler",
1006
+ "destination_layer": "data-store",
1007
+ "predicate": "composes",
1008
+ "cardinality": "many-to-many",
1009
+ "strength": "medium",
1010
+ "required": false
1011
+ },
1012
+ "data-store.collection.composes.data-store.field": {
1013
+ "id": "data-store.collection.composes.data-store.field",
1014
+ "source_spec_node_id": "data-store.collection",
1015
+ "source_layer": "data-store",
1016
+ "destination_spec_node_id": "data-store.field",
1017
+ "destination_layer": "data-store",
1018
+ "predicate": "composes",
1019
+ "cardinality": "many-to-many",
1020
+ "strength": "medium",
1021
+ "required": false
1022
+ },
1023
+ "data-store.collection.composes.data-store.index": {
1024
+ "id": "data-store.collection.composes.data-store.index",
1025
+ "source_spec_node_id": "data-store.collection",
1026
+ "source_layer": "data-store",
1027
+ "destination_spec_node_id": "data-store.index",
1028
+ "destination_layer": "data-store",
1029
+ "predicate": "composes",
1030
+ "cardinality": "many-to-many",
1031
+ "strength": "medium",
1032
+ "required": false
1033
+ },
1034
+ "data-store.collection.composes.data-store.namespace": {
1035
+ "id": "data-store.collection.composes.data-store.namespace",
1036
+ "source_spec_node_id": "data-store.collection",
1037
+ "source_layer": "data-store",
1038
+ "destination_spec_node_id": "data-store.namespace",
1039
+ "destination_layer": "data-store",
1040
+ "predicate": "composes",
1041
+ "cardinality": "many-to-many",
1042
+ "strength": "medium",
1043
+ "required": false
1044
+ },
1045
+ "data-store.collection.composes.data-store.validationrule": {
1046
+ "id": "data-store.collection.composes.data-store.validationrule",
1047
+ "source_spec_node_id": "data-store.collection",
1048
+ "source_layer": "data-store",
1049
+ "destination_spec_node_id": "data-store.validationrule",
1050
+ "destination_layer": "data-store",
1051
+ "predicate": "composes",
1052
+ "cardinality": "many-to-many",
1053
+ "strength": "medium",
1054
+ "required": false
1055
+ },
1056
+ "data-store.collection.implements.security.secureresource": {
1057
+ "id": "data-store.collection.implements.security.secureresource",
1058
+ "source_spec_node_id": "data-store.collection",
1059
+ "source_layer": "data-store",
1060
+ "destination_spec_node_id": "security.secureresource",
1061
+ "destination_layer": "security",
1062
+ "predicate": "implements",
1063
+ "cardinality": "many-to-many",
1064
+ "strength": "medium",
1065
+ "required": false
1066
+ },
1067
+ "data-store.collection.maps-to.api.requestbody": {
1068
+ "id": "data-store.collection.maps-to.api.requestbody",
1069
+ "source_spec_node_id": "data-store.collection",
1070
+ "source_layer": "data-store",
1071
+ "destination_spec_node_id": "api.requestbody",
1072
+ "destination_layer": "api",
1073
+ "predicate": "maps-to",
1074
+ "cardinality": "many-to-many",
1075
+ "strength": "medium",
1076
+ "required": false
1077
+ },
1078
+ "data-store.collection.realizes.business.businessobject": {
1079
+ "id": "data-store.collection.realizes.business.businessobject",
1080
+ "source_spec_node_id": "data-store.collection",
1081
+ "source_layer": "data-store",
1082
+ "destination_spec_node_id": "business.businessobject",
1083
+ "destination_layer": "business",
1084
+ "predicate": "realizes",
1085
+ "cardinality": "many-to-many",
1086
+ "strength": "medium",
1087
+ "required": false
1088
+ },
1089
+ "data-store.collection.realizes.api.schema": {
1090
+ "id": "data-store.collection.realizes.api.schema",
1091
+ "source_spec_node_id": "data-store.collection",
1092
+ "source_layer": "data-store",
1093
+ "destination_spec_node_id": "api.schema",
1094
+ "destination_layer": "api",
1095
+ "predicate": "realizes",
1096
+ "cardinality": "many-to-many",
1097
+ "strength": "medium",
1098
+ "required": false
1099
+ },
1100
+ "data-store.collection.references.data-store.collection": {
1101
+ "id": "data-store.collection.references.data-store.collection",
1102
+ "source_spec_node_id": "data-store.collection",
1103
+ "source_layer": "data-store",
1104
+ "destination_spec_node_id": "data-store.collection",
1105
+ "destination_layer": "data-store",
1106
+ "predicate": "references",
1107
+ "cardinality": "many-to-many",
1108
+ "strength": "medium",
1109
+ "required": false
1110
+ },
1111
+ "data-store.collection.satisfies.security.dataclassification": {
1112
+ "id": "data-store.collection.satisfies.security.dataclassification",
1113
+ "source_spec_node_id": "data-store.collection",
1114
+ "source_layer": "data-store",
1115
+ "destination_spec_node_id": "security.dataclassification",
1116
+ "destination_layer": "security",
1117
+ "predicate": "satisfies",
1118
+ "cardinality": "many-to-many",
1119
+ "strength": "medium",
1120
+ "required": false
1121
+ },
1122
+ "data-store.collection.satisfies.motivation.requirement": {
1123
+ "id": "data-store.collection.satisfies.motivation.requirement",
1124
+ "source_spec_node_id": "data-store.collection",
1125
+ "source_layer": "data-store",
1126
+ "destination_spec_node_id": "motivation.requirement",
1127
+ "destination_layer": "motivation",
1128
+ "predicate": "satisfies",
1129
+ "cardinality": "many-to-many",
1130
+ "strength": "medium",
1131
+ "required": false
1132
+ },
1133
+ "data-store.collection.serves.application.applicationcomponent": {
1134
+ "id": "data-store.collection.serves.application.applicationcomponent",
1135
+ "source_spec_node_id": "data-store.collection",
1136
+ "source_layer": "data-store",
1137
+ "destination_spec_node_id": "application.applicationcomponent",
1138
+ "destination_layer": "application",
1139
+ "predicate": "serves",
1140
+ "cardinality": "many-to-many",
1141
+ "strength": "medium",
1142
+ "required": false
1143
+ },
1144
+ "data-store.collection.serves.application.applicationservice": {
1145
+ "id": "data-store.collection.serves.application.applicationservice",
1146
+ "source_spec_node_id": "data-store.collection",
1147
+ "source_layer": "data-store",
1148
+ "destination_spec_node_id": "application.applicationservice",
1149
+ "destination_layer": "application",
1150
+ "predicate": "serves",
1151
+ "cardinality": "many-to-many",
1152
+ "strength": "medium",
1153
+ "required": false
1154
+ },
1155
+ "data-store.collection.serves.api.operation": {
1156
+ "id": "data-store.collection.serves.api.operation",
1157
+ "source_spec_node_id": "data-store.collection",
1158
+ "source_layer": "data-store",
1159
+ "destination_spec_node_id": "api.operation",
1160
+ "destination_layer": "api",
1161
+ "predicate": "serves",
1162
+ "cardinality": "many-to-many",
1163
+ "strength": "medium",
1164
+ "required": false
1165
+ },
1166
+ "data-store.database.composes.data-store.collection": {
1167
+ "id": "data-store.database.composes.data-store.collection",
1168
+ "source_spec_node_id": "data-store.database",
1169
+ "source_layer": "data-store",
1170
+ "destination_spec_node_id": "data-store.collection",
1171
+ "destination_layer": "data-store",
1172
+ "predicate": "composes",
1173
+ "cardinality": "many-to-many",
1174
+ "strength": "medium",
1175
+ "required": false
1176
+ },
1177
+ "data-store.database.composes.data-store.field": {
1178
+ "id": "data-store.database.composes.data-store.field",
1179
+ "source_spec_node_id": "data-store.database",
1180
+ "source_layer": "data-store",
1181
+ "destination_spec_node_id": "data-store.field",
1182
+ "destination_layer": "data-store",
1183
+ "predicate": "composes",
1184
+ "cardinality": "many-to-many",
1185
+ "strength": "medium",
1186
+ "required": false
1187
+ },
1188
+ "data-store.database.composes.data-store.index": {
1189
+ "id": "data-store.database.composes.data-store.index",
1190
+ "source_spec_node_id": "data-store.database",
1191
+ "source_layer": "data-store",
1192
+ "destination_spec_node_id": "data-store.index",
1193
+ "destination_layer": "data-store",
1194
+ "predicate": "composes",
1195
+ "cardinality": "many-to-many",
1196
+ "strength": "medium",
1197
+ "required": false
1198
+ },
1199
+ "data-store.database.composes.data-store.namespace": {
1200
+ "id": "data-store.database.composes.data-store.namespace",
1201
+ "source_spec_node_id": "data-store.database",
1202
+ "source_layer": "data-store",
1203
+ "destination_spec_node_id": "data-store.namespace",
1204
+ "destination_layer": "data-store",
1205
+ "predicate": "composes",
1206
+ "cardinality": "many-to-many",
1207
+ "strength": "medium",
1208
+ "required": false
1209
+ },
1210
+ "data-store.database.composes.data-store.validationrule": {
1211
+ "id": "data-store.database.composes.data-store.validationrule",
1212
+ "source_spec_node_id": "data-store.database",
1213
+ "source_layer": "data-store",
1214
+ "destination_spec_node_id": "data-store.validationrule",
1215
+ "destination_layer": "data-store",
1216
+ "predicate": "composes",
1217
+ "cardinality": "many-to-many",
1218
+ "strength": "medium",
1219
+ "required": false
1220
+ },
1221
+ "data-store.database.composes.data-store.view": {
1222
+ "id": "data-store.database.composes.data-store.view",
1223
+ "source_spec_node_id": "data-store.database",
1224
+ "source_layer": "data-store",
1225
+ "destination_spec_node_id": "data-store.view",
1226
+ "destination_layer": "data-store",
1227
+ "predicate": "composes",
1228
+ "cardinality": "many-to-many",
1229
+ "strength": "medium",
1230
+ "required": false
1231
+ },
1232
+ "data-store.database.depends-on.technology.node": {
1233
+ "id": "data-store.database.depends-on.technology.node",
1234
+ "source_spec_node_id": "data-store.database",
1235
+ "source_layer": "data-store",
1236
+ "destination_spec_node_id": "technology.node",
1237
+ "destination_layer": "technology",
1238
+ "predicate": "depends-on",
1239
+ "cardinality": "many-to-many",
1240
+ "strength": "medium",
1241
+ "required": false
1242
+ },
1243
+ "data-store.database.depends-on.technology.systemsoftware": {
1244
+ "id": "data-store.database.depends-on.technology.systemsoftware",
1245
+ "source_spec_node_id": "data-store.database",
1246
+ "source_layer": "data-store",
1247
+ "destination_spec_node_id": "technology.systemsoftware",
1248
+ "destination_layer": "technology",
1249
+ "predicate": "depends-on",
1250
+ "cardinality": "many-to-many",
1251
+ "strength": "medium",
1252
+ "required": false
1253
+ },
1254
+ "data-store.database.federates.data-store.database": {
1255
+ "id": "data-store.database.federates.data-store.database",
1256
+ "source_spec_node_id": "data-store.database",
1257
+ "source_layer": "data-store",
1258
+ "destination_spec_node_id": "data-store.database",
1259
+ "destination_layer": "data-store",
1260
+ "predicate": "federates",
1261
+ "cardinality": "many-to-many",
1262
+ "strength": "medium",
1263
+ "required": false
1264
+ },
1265
+ "data-store.database.realizes.business.businessservice": {
1266
+ "id": "data-store.database.realizes.business.businessservice",
1267
+ "source_spec_node_id": "data-store.database",
1268
+ "source_layer": "data-store",
1269
+ "destination_spec_node_id": "business.businessservice",
1270
+ "destination_layer": "business",
1271
+ "predicate": "realizes",
1272
+ "cardinality": "many-to-many",
1273
+ "strength": "medium",
1274
+ "required": false
1275
+ },
1276
+ "data-store.database.replicates.data-store.database": {
1277
+ "id": "data-store.database.replicates.data-store.database",
1278
+ "source_spec_node_id": "data-store.database",
1279
+ "source_layer": "data-store",
1280
+ "destination_spec_node_id": "data-store.database",
1281
+ "destination_layer": "data-store",
1282
+ "predicate": "replicates",
1283
+ "cardinality": "many-to-many",
1284
+ "strength": "medium",
1285
+ "required": false
1286
+ },
1287
+ "data-store.database.satisfies.motivation.constraint": {
1288
+ "id": "data-store.database.satisfies.motivation.constraint",
1289
+ "source_spec_node_id": "data-store.database",
1290
+ "source_layer": "data-store",
1291
+ "destination_spec_node_id": "motivation.constraint",
1292
+ "destination_layer": "motivation",
1293
+ "predicate": "satisfies",
1294
+ "cardinality": "many-to-many",
1295
+ "strength": "medium",
1296
+ "required": false
1297
+ },
1298
+ "data-store.database.satisfies.motivation.requirement": {
1299
+ "id": "data-store.database.satisfies.motivation.requirement",
1300
+ "source_spec_node_id": "data-store.database",
1301
+ "source_layer": "data-store",
1302
+ "destination_spec_node_id": "motivation.requirement",
1303
+ "destination_layer": "motivation",
1304
+ "predicate": "satisfies",
1305
+ "cardinality": "many-to-many",
1306
+ "strength": "medium",
1307
+ "required": false
1308
+ },
1309
+ "data-store.database.satisfies.security.securitypolicy": {
1310
+ "id": "data-store.database.satisfies.security.securitypolicy",
1311
+ "source_spec_node_id": "data-store.database",
1312
+ "source_layer": "data-store",
1313
+ "destination_spec_node_id": "security.securitypolicy",
1314
+ "destination_layer": "security",
1315
+ "predicate": "satisfies",
1316
+ "cardinality": "many-to-many",
1317
+ "strength": "medium",
1318
+ "required": false
1319
+ },
1320
+ "data-store.database.serves.application.applicationcomponent": {
1321
+ "id": "data-store.database.serves.application.applicationcomponent",
1322
+ "source_spec_node_id": "data-store.database",
1323
+ "source_layer": "data-store",
1324
+ "destination_spec_node_id": "application.applicationcomponent",
1325
+ "destination_layer": "application",
1326
+ "predicate": "serves",
1327
+ "cardinality": "many-to-many",
1328
+ "strength": "medium",
1329
+ "required": false
1330
+ },
1331
+ "data-store.database.serves.application.applicationservice": {
1332
+ "id": "data-store.database.serves.application.applicationservice",
1333
+ "source_spec_node_id": "data-store.database",
1334
+ "source_layer": "data-store",
1335
+ "destination_spec_node_id": "application.applicationservice",
1336
+ "destination_layer": "application",
1337
+ "predicate": "serves",
1338
+ "cardinality": "many-to-many",
1339
+ "strength": "medium",
1340
+ "required": false
1341
+ },
1342
+ "data-store.database.serves.business.businessprocess": {
1343
+ "id": "data-store.database.serves.business.businessprocess",
1344
+ "source_spec_node_id": "data-store.database",
1345
+ "source_layer": "data-store",
1346
+ "destination_spec_node_id": "business.businessprocess",
1347
+ "destination_layer": "business",
1348
+ "predicate": "serves",
1349
+ "cardinality": "many-to-many",
1350
+ "strength": "medium",
1351
+ "required": false
1352
+ },
1353
+ "data-store.database.uses.technology.technologyservice": {
1354
+ "id": "data-store.database.uses.technology.technologyservice",
1355
+ "source_spec_node_id": "data-store.database",
1356
+ "source_layer": "data-store",
1357
+ "destination_spec_node_id": "technology.technologyservice",
1358
+ "destination_layer": "technology",
1359
+ "predicate": "uses",
1360
+ "cardinality": "many-to-many",
1361
+ "strength": "medium",
1362
+ "required": false
1363
+ },
1364
+ "data-store.eventhandler.monitors.data-store.collection": {
1365
+ "id": "data-store.eventhandler.monitors.data-store.collection",
1366
+ "source_spec_node_id": "data-store.eventhandler",
1367
+ "source_layer": "data-store",
1368
+ "destination_spec_node_id": "data-store.collection",
1369
+ "destination_layer": "data-store",
1370
+ "predicate": "monitors",
1371
+ "cardinality": "many-to-many",
1372
+ "strength": "medium",
1373
+ "required": false
1374
+ },
1375
+ "data-store.eventhandler.triggers.application.applicationevent": {
1376
+ "id": "data-store.eventhandler.triggers.application.applicationevent",
1377
+ "source_spec_node_id": "data-store.eventhandler",
1378
+ "source_layer": "data-store",
1379
+ "destination_spec_node_id": "application.applicationevent",
1380
+ "destination_layer": "application",
1381
+ "predicate": "triggers",
1382
+ "cardinality": "many-to-many",
1383
+ "strength": "medium",
1384
+ "required": false
1385
+ },
1386
+ "data-store.eventhandler.triggers.business.businessevent": {
1387
+ "id": "data-store.eventhandler.triggers.business.businessevent",
1388
+ "source_spec_node_id": "data-store.eventhandler",
1389
+ "source_layer": "data-store",
1390
+ "destination_spec_node_id": "business.businessevent",
1391
+ "destination_layer": "business",
1392
+ "predicate": "triggers",
1393
+ "cardinality": "many-to-many",
1394
+ "strength": "medium",
1395
+ "required": false
1396
+ },
1397
+ "data-store.eventhandler.triggers.data-store.storedlogic": {
1398
+ "id": "data-store.eventhandler.triggers.data-store.storedlogic",
1399
+ "source_spec_node_id": "data-store.eventhandler",
1400
+ "source_layer": "data-store",
1401
+ "destination_spec_node_id": "data-store.storedlogic",
1402
+ "destination_layer": "data-store",
1403
+ "predicate": "triggers",
1404
+ "cardinality": "many-to-many",
1405
+ "strength": "medium",
1406
+ "required": false
1407
+ },
1408
+ "data-store.field.composes.data-store.field": {
1409
+ "id": "data-store.field.composes.data-store.field",
1410
+ "source_spec_node_id": "data-store.field",
1411
+ "source_layer": "data-store",
1412
+ "destination_spec_node_id": "data-store.field",
1413
+ "destination_layer": "data-store",
1414
+ "predicate": "composes",
1415
+ "cardinality": "many-to-many",
1416
+ "strength": "medium",
1417
+ "required": false
1418
+ },
1419
+ "data-store.field.maps-to.api.parameter": {
1420
+ "id": "data-store.field.maps-to.api.parameter",
1421
+ "source_spec_node_id": "data-store.field",
1422
+ "source_layer": "data-store",
1423
+ "destination_spec_node_id": "api.parameter",
1424
+ "destination_layer": "api",
1425
+ "predicate": "maps-to",
1426
+ "cardinality": "many-to-many",
1427
+ "strength": "medium",
1428
+ "required": false
1429
+ },
1430
+ "data-store.field.requires.security.fieldaccesscontrol": {
1431
+ "id": "data-store.field.requires.security.fieldaccesscontrol",
1432
+ "source_spec_node_id": "data-store.field",
1433
+ "source_layer": "data-store",
1434
+ "destination_spec_node_id": "security.fieldaccesscontrol",
1435
+ "destination_layer": "security",
1436
+ "predicate": "requires",
1437
+ "cardinality": "many-to-many",
1438
+ "strength": "medium",
1439
+ "required": false
1440
+ },
1441
+ "data-store.field.satisfies.security.dataclassification": {
1442
+ "id": "data-store.field.satisfies.security.dataclassification",
1443
+ "source_spec_node_id": "data-store.field",
1444
+ "source_layer": "data-store",
1445
+ "destination_spec_node_id": "security.dataclassification",
1446
+ "destination_layer": "security",
1447
+ "predicate": "satisfies",
1448
+ "cardinality": "many-to-many",
1449
+ "strength": "medium",
1450
+ "required": false
1451
+ },
1452
+ "data-store.field.triggers.data-store.eventhandler": {
1453
+ "id": "data-store.field.triggers.data-store.eventhandler",
1454
+ "source_spec_node_id": "data-store.field",
1455
+ "source_layer": "data-store",
1456
+ "destination_spec_node_id": "data-store.eventhandler",
1457
+ "destination_layer": "data-store",
1458
+ "predicate": "triggers",
1459
+ "cardinality": "many-to-many",
1460
+ "strength": "medium",
1461
+ "required": false
1462
+ },
1463
+ "data-store.field.triggers.data-store.storedlogic": {
1464
+ "id": "data-store.field.triggers.data-store.storedlogic",
1465
+ "source_spec_node_id": "data-store.field",
1466
+ "source_layer": "data-store",
1467
+ "destination_spec_node_id": "data-store.storedlogic",
1468
+ "destination_layer": "data-store",
1469
+ "predicate": "triggers",
1470
+ "cardinality": "many-to-many",
1471
+ "strength": "medium",
1472
+ "required": false
1473
+ },
1474
+ "data-store.field.triggers.data-store.validationrule": {
1475
+ "id": "data-store.field.triggers.data-store.validationrule",
1476
+ "source_spec_node_id": "data-store.field",
1477
+ "source_layer": "data-store",
1478
+ "destination_spec_node_id": "data-store.validationrule",
1479
+ "destination_layer": "data-store",
1480
+ "predicate": "triggers",
1481
+ "cardinality": "many-to-many",
1482
+ "strength": "medium",
1483
+ "required": false
1484
+ },
1485
+ "data-store.index.aggregates.data-store.field": {
1486
+ "id": "data-store.index.aggregates.data-store.field",
1487
+ "source_spec_node_id": "data-store.index",
1488
+ "source_layer": "data-store",
1489
+ "destination_spec_node_id": "data-store.field",
1490
+ "destination_layer": "data-store",
1491
+ "predicate": "aggregates",
1492
+ "cardinality": "many-to-many",
1493
+ "strength": "medium",
1494
+ "required": false
1495
+ },
1496
+ "data-store.index.optimizes.data-store.accesspattern": {
1497
+ "id": "data-store.index.optimizes.data-store.accesspattern",
1498
+ "source_spec_node_id": "data-store.index",
1499
+ "source_layer": "data-store",
1500
+ "destination_spec_node_id": "data-store.accesspattern",
1501
+ "destination_layer": "data-store",
1502
+ "predicate": "optimizes",
1503
+ "cardinality": "many-to-many",
1504
+ "strength": "medium",
1505
+ "required": false
1506
+ },
1507
+ "data-store.namespace.composes.data-store.collection": {
1508
+ "id": "data-store.namespace.composes.data-store.collection",
1509
+ "source_spec_node_id": "data-store.namespace",
1510
+ "source_layer": "data-store",
1511
+ "destination_spec_node_id": "data-store.collection",
1512
+ "destination_layer": "data-store",
1513
+ "predicate": "composes",
1514
+ "cardinality": "many-to-many",
1515
+ "strength": "medium",
1516
+ "required": false
1517
+ },
1518
+ "data-store.namespace.composes.data-store.field": {
1519
+ "id": "data-store.namespace.composes.data-store.field",
1520
+ "source_spec_node_id": "data-store.namespace",
1521
+ "source_layer": "data-store",
1522
+ "destination_spec_node_id": "data-store.field",
1523
+ "destination_layer": "data-store",
1524
+ "predicate": "composes",
1525
+ "cardinality": "many-to-many",
1526
+ "strength": "medium",
1527
+ "required": false
1528
+ },
1529
+ "data-store.namespace.composes.data-store.index": {
1530
+ "id": "data-store.namespace.composes.data-store.index",
1531
+ "source_spec_node_id": "data-store.namespace",
1532
+ "source_layer": "data-store",
1533
+ "destination_spec_node_id": "data-store.index",
1534
+ "destination_layer": "data-store",
1535
+ "predicate": "composes",
1536
+ "cardinality": "many-to-many",
1537
+ "strength": "medium",
1538
+ "required": false
1539
+ },
1540
+ "data-store.namespace.composes.data-store.namespace": {
1541
+ "id": "data-store.namespace.composes.data-store.namespace",
1542
+ "source_spec_node_id": "data-store.namespace",
1543
+ "source_layer": "data-store",
1544
+ "destination_spec_node_id": "data-store.namespace",
1545
+ "destination_layer": "data-store",
1546
+ "predicate": "composes",
1547
+ "cardinality": "many-to-many",
1548
+ "strength": "medium",
1549
+ "required": false
1550
+ },
1551
+ "data-store.namespace.composes.storedlogic": {
1552
+ "id": "data-store.namespace.composes.storedlogic",
1553
+ "source_spec_node_id": "data-store.namespace",
1554
+ "source_layer": "data-store",
1555
+ "destination_spec_node_id": "data-store.storedlogic",
1556
+ "destination_layer": "data-store",
1557
+ "predicate": "composes",
1558
+ "cardinality": "one-to-many",
1559
+ "strength": "high",
1560
+ "required": false
1561
+ },
1562
+ "data-store.namespace.composes.data-store.validationrule": {
1563
+ "id": "data-store.namespace.composes.data-store.validationrule",
1564
+ "source_spec_node_id": "data-store.namespace",
1565
+ "source_layer": "data-store",
1566
+ "destination_spec_node_id": "data-store.validationrule",
1567
+ "destination_layer": "data-store",
1568
+ "predicate": "composes",
1569
+ "cardinality": "many-to-many",
1570
+ "strength": "medium",
1571
+ "required": false
1572
+ },
1573
+ "data-store.namespace.composes.data-store.view": {
1574
+ "id": "data-store.namespace.composes.data-store.view",
1575
+ "source_spec_node_id": "data-store.namespace",
1576
+ "source_layer": "data-store",
1577
+ "destination_spec_node_id": "data-store.view",
1578
+ "destination_layer": "data-store",
1579
+ "predicate": "composes",
1580
+ "cardinality": "many-to-many",
1581
+ "strength": "medium",
1582
+ "required": false
1583
+ },
1584
+ "data-store.retentionpolicy.aggregates.data-store.collection": {
1585
+ "id": "data-store.retentionpolicy.aggregates.data-store.collection",
1586
+ "source_spec_node_id": "data-store.retentionpolicy",
1587
+ "source_layer": "data-store",
1588
+ "destination_spec_node_id": "data-store.collection",
1589
+ "destination_layer": "data-store",
1590
+ "predicate": "aggregates",
1591
+ "cardinality": "many-to-many",
1592
+ "strength": "medium",
1593
+ "required": false
1594
+ },
1595
+ "data-store.retentionpolicy.aggregates.data-store.namespace": {
1596
+ "id": "data-store.retentionpolicy.aggregates.data-store.namespace",
1597
+ "source_spec_node_id": "data-store.retentionpolicy",
1598
+ "source_layer": "data-store",
1599
+ "destination_spec_node_id": "data-store.namespace",
1600
+ "destination_layer": "data-store",
1601
+ "predicate": "aggregates",
1602
+ "cardinality": "many-to-many",
1603
+ "strength": "medium",
1604
+ "required": false
1605
+ },
1606
+ "data-store.retentionpolicy.archives-to.data-store.collection": {
1607
+ "id": "data-store.retentionpolicy.archives-to.data-store.collection",
1608
+ "source_spec_node_id": "data-store.retentionpolicy",
1609
+ "source_layer": "data-store",
1610
+ "destination_spec_node_id": "data-store.collection",
1611
+ "destination_layer": "data-store",
1612
+ "predicate": "archives-to",
1613
+ "cardinality": "many-to-many",
1614
+ "strength": "medium",
1615
+ "required": false
1616
+ },
1617
+ "data-store.retentionpolicy.governs.data-store.collection": {
1618
+ "id": "data-store.retentionpolicy.governs.data-store.collection",
1619
+ "source_spec_node_id": "data-store.retentionpolicy",
1620
+ "source_layer": "data-store",
1621
+ "destination_spec_node_id": "data-store.collection",
1622
+ "destination_layer": "data-store",
1623
+ "predicate": "governs",
1624
+ "cardinality": "many-to-many",
1625
+ "strength": "medium",
1626
+ "required": false
1627
+ },
1628
+ "data-store.retentionpolicy.governs.data-store.namespace": {
1629
+ "id": "data-store.retentionpolicy.governs.data-store.namespace",
1630
+ "source_spec_node_id": "data-store.retentionpolicy",
1631
+ "source_layer": "data-store",
1632
+ "destination_spec_node_id": "data-store.namespace",
1633
+ "destination_layer": "data-store",
1634
+ "predicate": "governs",
1635
+ "cardinality": "many-to-many",
1636
+ "strength": "medium",
1637
+ "required": false
1638
+ },
1639
+ "data-store.retentionpolicy.satisfies.motivation.constraint": {
1640
+ "id": "data-store.retentionpolicy.satisfies.motivation.constraint",
1641
+ "source_spec_node_id": "data-store.retentionpolicy",
1642
+ "source_layer": "data-store",
1643
+ "destination_spec_node_id": "motivation.constraint",
1644
+ "destination_layer": "motivation",
1645
+ "predicate": "satisfies",
1646
+ "cardinality": "many-to-many",
1647
+ "strength": "medium",
1648
+ "required": false
1649
+ },
1650
+ "data-store.retentionpolicy.satisfies.business.contract": {
1651
+ "id": "data-store.retentionpolicy.satisfies.business.contract",
1652
+ "source_spec_node_id": "data-store.retentionpolicy",
1653
+ "source_layer": "data-store",
1654
+ "destination_spec_node_id": "business.contract",
1655
+ "destination_layer": "business",
1656
+ "predicate": "satisfies",
1657
+ "cardinality": "many-to-many",
1658
+ "strength": "medium",
1659
+ "required": false
1660
+ },
1661
+ "data-store.retentionpolicy.satisfies.motivation.principle": {
1662
+ "id": "data-store.retentionpolicy.satisfies.motivation.principle",
1663
+ "source_spec_node_id": "data-store.retentionpolicy",
1664
+ "source_layer": "data-store",
1665
+ "destination_spec_node_id": "motivation.principle",
1666
+ "destination_layer": "motivation",
1667
+ "predicate": "satisfies",
1668
+ "cardinality": "many-to-many",
1669
+ "strength": "medium",
1670
+ "required": false
1671
+ },
1672
+ "data-store.retentionpolicy.satisfies.motivation.requirement": {
1673
+ "id": "data-store.retentionpolicy.satisfies.motivation.requirement",
1674
+ "source_spec_node_id": "data-store.retentionpolicy",
1675
+ "source_layer": "data-store",
1676
+ "destination_spec_node_id": "motivation.requirement",
1677
+ "destination_layer": "motivation",
1678
+ "predicate": "satisfies",
1679
+ "cardinality": "many-to-many",
1680
+ "strength": "medium",
1681
+ "required": false
1682
+ },
1683
+ "data-store.retentionpolicy.satisfies.security.retentionpolicy": {
1684
+ "id": "data-store.retentionpolicy.satisfies.security.retentionpolicy",
1685
+ "source_spec_node_id": "data-store.retentionpolicy",
1686
+ "source_layer": "data-store",
1687
+ "destination_spec_node_id": "security.retentionpolicy",
1688
+ "destination_layer": "security",
1689
+ "predicate": "satisfies",
1690
+ "cardinality": "many-to-many",
1691
+ "strength": "medium",
1692
+ "required": false
1693
+ },
1694
+ "data-store.retentionpolicy.triggers.data-store.eventhandler": {
1695
+ "id": "data-store.retentionpolicy.triggers.data-store.eventhandler",
1696
+ "source_spec_node_id": "data-store.retentionpolicy",
1697
+ "source_layer": "data-store",
1698
+ "destination_spec_node_id": "data-store.eventhandler",
1699
+ "destination_layer": "data-store",
1700
+ "predicate": "triggers",
1701
+ "cardinality": "many-to-many",
1702
+ "strength": "medium",
1703
+ "required": false
1704
+ },
1705
+ "data-store.retentionpolicy.triggers.data-store.storedlogic": {
1706
+ "id": "data-store.retentionpolicy.triggers.data-store.storedlogic",
1707
+ "source_spec_node_id": "data-store.retentionpolicy",
1708
+ "source_layer": "data-store",
1709
+ "destination_spec_node_id": "data-store.storedlogic",
1710
+ "destination_layer": "data-store",
1711
+ "predicate": "triggers",
1712
+ "cardinality": "many-to-many",
1713
+ "strength": "medium",
1714
+ "required": false
1715
+ },
1716
+ "data-store.retentionpolicy.uses.technology.technologyservice": {
1717
+ "id": "data-store.retentionpolicy.uses.technology.technologyservice",
1718
+ "source_spec_node_id": "data-store.retentionpolicy",
1719
+ "source_layer": "data-store",
1720
+ "destination_spec_node_id": "technology.technologyservice",
1721
+ "destination_layer": "technology",
1722
+ "predicate": "uses",
1723
+ "cardinality": "many-to-many",
1724
+ "strength": "medium",
1725
+ "required": false
1726
+ },
1727
+ "data-store.storedlogic.accesses.data-store.collection": {
1728
+ "id": "data-store.storedlogic.accesses.data-store.collection",
1729
+ "source_spec_node_id": "data-store.storedlogic",
1730
+ "source_layer": "data-store",
1731
+ "destination_spec_node_id": "data-store.collection",
1732
+ "destination_layer": "data-store",
1733
+ "predicate": "accesses",
1734
+ "cardinality": "many-to-many",
1735
+ "strength": "medium",
1736
+ "required": false
1737
+ },
1738
+ "data-store.storedlogic.aggregates.data-store.collection": {
1739
+ "id": "data-store.storedlogic.aggregates.data-store.collection",
1740
+ "source_spec_node_id": "data-store.storedlogic",
1741
+ "source_layer": "data-store",
1742
+ "destination_spec_node_id": "data-store.collection",
1743
+ "destination_layer": "data-store",
1744
+ "predicate": "aggregates",
1745
+ "cardinality": "many-to-many",
1746
+ "strength": "medium",
1747
+ "required": false
1748
+ },
1749
+ "data-store.storedlogic.aggregates.data-store.field": {
1750
+ "id": "data-store.storedlogic.aggregates.data-store.field",
1751
+ "source_spec_node_id": "data-store.storedlogic",
1752
+ "source_layer": "data-store",
1753
+ "destination_spec_node_id": "data-store.field",
1754
+ "destination_layer": "data-store",
1755
+ "predicate": "aggregates",
1756
+ "cardinality": "many-to-many",
1757
+ "strength": "medium",
1758
+ "required": false
1759
+ },
1760
+ "data-store.storedlogic.composes.data-store.storedlogic": {
1761
+ "id": "data-store.storedlogic.composes.data-store.storedlogic",
1762
+ "source_spec_node_id": "data-store.storedlogic",
1763
+ "source_layer": "data-store",
1764
+ "destination_spec_node_id": "data-store.storedlogic",
1765
+ "destination_layer": "data-store",
1766
+ "predicate": "composes",
1767
+ "cardinality": "many-to-many",
1768
+ "strength": "medium",
1769
+ "required": false
1770
+ },
1771
+ "data-store.storedlogic.composes.data-store.validationrule": {
1772
+ "id": "data-store.storedlogic.composes.data-store.validationrule",
1773
+ "source_spec_node_id": "data-store.storedlogic",
1774
+ "source_layer": "data-store",
1775
+ "destination_spec_node_id": "data-store.validationrule",
1776
+ "destination_layer": "data-store",
1777
+ "predicate": "composes",
1778
+ "cardinality": "many-to-many",
1779
+ "strength": "medium",
1780
+ "required": false
1781
+ },
1782
+ "data-store.storedlogic.depends-on.technology.systemsoftware": {
1783
+ "id": "data-store.storedlogic.depends-on.technology.systemsoftware",
1784
+ "source_spec_node_id": "data-store.storedlogic",
1785
+ "source_layer": "data-store",
1786
+ "destination_spec_node_id": "technology.systemsoftware",
1787
+ "destination_layer": "technology",
1788
+ "predicate": "depends-on",
1789
+ "cardinality": "many-to-many",
1790
+ "strength": "medium",
1791
+ "required": false
1792
+ },
1793
+ "data-store.storedlogic.implements.application.applicationfunction": {
1794
+ "id": "data-store.storedlogic.implements.application.applicationfunction",
1795
+ "source_spec_node_id": "data-store.storedlogic",
1796
+ "source_layer": "data-store",
1797
+ "destination_spec_node_id": "application.applicationfunction",
1798
+ "destination_layer": "application",
1799
+ "predicate": "implements",
1800
+ "cardinality": "many-to-many",
1801
+ "strength": "medium",
1802
+ "required": false
1803
+ },
1804
+ "data-store.storedlogic.migrates.data-store.collection": {
1805
+ "id": "data-store.storedlogic.migrates.data-store.collection",
1806
+ "source_spec_node_id": "data-store.storedlogic",
1807
+ "source_layer": "data-store",
1808
+ "destination_spec_node_id": "data-store.collection",
1809
+ "destination_layer": "data-store",
1810
+ "predicate": "migrates",
1811
+ "cardinality": "many-to-many",
1812
+ "strength": "medium",
1813
+ "required": false
1814
+ },
1815
+ "data-store.storedlogic.realizes.business.businessfunction": {
1816
+ "id": "data-store.storedlogic.realizes.business.businessfunction",
1817
+ "source_spec_node_id": "data-store.storedlogic",
1818
+ "source_layer": "data-store",
1819
+ "destination_spec_node_id": "business.businessfunction",
1820
+ "destination_layer": "business",
1821
+ "predicate": "realizes",
1822
+ "cardinality": "many-to-many",
1823
+ "strength": "medium",
1824
+ "required": false
1825
+ },
1826
+ "data-store.storedlogic.satisfies.security.securitypolicy": {
1827
+ "id": "data-store.storedlogic.satisfies.security.securitypolicy",
1828
+ "source_spec_node_id": "data-store.storedlogic",
1829
+ "source_layer": "data-store",
1830
+ "destination_spec_node_id": "security.securitypolicy",
1831
+ "destination_layer": "security",
1832
+ "predicate": "satisfies",
1833
+ "cardinality": "many-to-many",
1834
+ "strength": "medium",
1835
+ "required": false
1836
+ },
1837
+ "data-store.storedlogic.serves.application.applicationservice": {
1838
+ "id": "data-store.storedlogic.serves.application.applicationservice",
1839
+ "source_spec_node_id": "data-store.storedlogic",
1840
+ "source_layer": "data-store",
1841
+ "destination_spec_node_id": "application.applicationservice",
1842
+ "destination_layer": "application",
1843
+ "predicate": "serves",
1844
+ "cardinality": "many-to-many",
1845
+ "strength": "medium",
1846
+ "required": false
1847
+ },
1848
+ "data-store.storedlogic.serves.api.operation": {
1849
+ "id": "data-store.storedlogic.serves.api.operation",
1850
+ "source_spec_node_id": "data-store.storedlogic",
1851
+ "source_layer": "data-store",
1852
+ "destination_spec_node_id": "api.operation",
1853
+ "destination_layer": "api",
1854
+ "predicate": "serves",
1855
+ "cardinality": "many-to-many",
1856
+ "strength": "medium",
1857
+ "required": false
1858
+ },
1859
+ "data-store.storedlogic.triggers.data-store.storedlogic": {
1860
+ "id": "data-store.storedlogic.triggers.data-store.storedlogic",
1861
+ "source_spec_node_id": "data-store.storedlogic",
1862
+ "source_layer": "data-store",
1863
+ "destination_spec_node_id": "data-store.storedlogic",
1864
+ "destination_layer": "data-store",
1865
+ "predicate": "triggers",
1866
+ "cardinality": "many-to-many",
1867
+ "strength": "medium",
1868
+ "required": false
1869
+ },
1870
+ "data-store.storedlogic.triggers.data-store.view": {
1871
+ "id": "data-store.storedlogic.triggers.data-store.view",
1872
+ "source_spec_node_id": "data-store.storedlogic",
1873
+ "source_layer": "data-store",
1874
+ "destination_spec_node_id": "data-store.view",
1875
+ "destination_layer": "data-store",
1876
+ "predicate": "triggers",
1877
+ "cardinality": "many-to-many",
1878
+ "strength": "medium",
1879
+ "required": false
1880
+ },
1881
+ "data-store.storedlogic.uses.technology.technologyservice": {
1882
+ "id": "data-store.storedlogic.uses.technology.technologyservice",
1883
+ "source_spec_node_id": "data-store.storedlogic",
1884
+ "source_layer": "data-store",
1885
+ "destination_spec_node_id": "technology.technologyservice",
1886
+ "destination_layer": "technology",
1887
+ "predicate": "uses",
1888
+ "cardinality": "many-to-many",
1889
+ "strength": "medium",
1890
+ "required": false
1891
+ },
1892
+ "data-store.storedlogic.validates.data-store.collection": {
1893
+ "id": "data-store.storedlogic.validates.data-store.collection",
1894
+ "source_spec_node_id": "data-store.storedlogic",
1895
+ "source_layer": "data-store",
1896
+ "destination_spec_node_id": "data-store.collection",
1897
+ "destination_layer": "data-store",
1898
+ "predicate": "validates",
1899
+ "cardinality": "many-to-many",
1900
+ "strength": "medium",
1901
+ "required": false
1902
+ },
1903
+ "data-store.validationrule.aggregates.data-store.field": {
1904
+ "id": "data-store.validationrule.aggregates.data-store.field",
1905
+ "source_spec_node_id": "data-store.validationrule",
1906
+ "source_layer": "data-store",
1907
+ "destination_spec_node_id": "data-store.field",
1908
+ "destination_layer": "data-store",
1909
+ "predicate": "aggregates",
1910
+ "cardinality": "many-to-many",
1911
+ "strength": "medium",
1912
+ "required": false
1913
+ },
1914
+ "data-store.validationrule.cascades-to.data-store.collection": {
1915
+ "id": "data-store.validationrule.cascades-to.data-store.collection",
1916
+ "source_spec_node_id": "data-store.validationrule",
1917
+ "source_layer": "data-store",
1918
+ "destination_spec_node_id": "data-store.collection",
1919
+ "destination_layer": "data-store",
1920
+ "predicate": "cascades-to",
1921
+ "cardinality": "many-to-many",
1922
+ "strength": "medium",
1923
+ "required": false
1924
+ },
1925
+ "data-store.validationrule.satisfies.motivation.requirement": {
1926
+ "id": "data-store.validationrule.satisfies.motivation.requirement",
1927
+ "source_spec_node_id": "data-store.validationrule",
1928
+ "source_layer": "data-store",
1929
+ "destination_spec_node_id": "motivation.requirement",
1930
+ "destination_layer": "motivation",
1931
+ "predicate": "satisfies",
1932
+ "cardinality": "many-to-many",
1933
+ "strength": "medium",
1934
+ "required": false
1935
+ },
1936
+ "data-store.view.aggregates.data-store.collection": {
1937
+ "id": "data-store.view.aggregates.data-store.collection",
1938
+ "source_spec_node_id": "data-store.view",
1939
+ "source_layer": "data-store",
1940
+ "destination_spec_node_id": "data-store.collection",
1941
+ "destination_layer": "data-store",
1942
+ "predicate": "aggregates",
1943
+ "cardinality": "many-to-many",
1944
+ "strength": "medium",
1945
+ "required": false
1946
+ },
1947
+ "data-store.view.aggregates.data-store.field": {
1948
+ "id": "data-store.view.aggregates.data-store.field",
1949
+ "source_spec_node_id": "data-store.view",
1950
+ "source_layer": "data-store",
1951
+ "destination_spec_node_id": "data-store.field",
1952
+ "destination_layer": "data-store",
1953
+ "predicate": "aggregates",
1954
+ "cardinality": "many-to-many",
1955
+ "strength": "medium",
1956
+ "required": false
1957
+ },
1958
+ "data-store.view.composes.data-store.index": {
1959
+ "id": "data-store.view.composes.data-store.index",
1960
+ "source_spec_node_id": "data-store.view",
1961
+ "source_layer": "data-store",
1962
+ "destination_spec_node_id": "data-store.index",
1963
+ "destination_layer": "data-store",
1964
+ "predicate": "composes",
1965
+ "cardinality": "many-to-many",
1966
+ "strength": "medium",
1967
+ "required": false
1968
+ },
1969
+ "data-store.view.derives-from.data-store.collection": {
1970
+ "id": "data-store.view.derives-from.data-store.collection",
1971
+ "source_spec_node_id": "data-store.view",
1972
+ "source_layer": "data-store",
1973
+ "destination_spec_node_id": "data-store.collection",
1974
+ "destination_layer": "data-store",
1975
+ "predicate": "derives-from",
1976
+ "cardinality": "many-to-many",
1977
+ "strength": "medium",
1978
+ "required": false
1979
+ },
1980
+ "data-store.view.derives-from.data-store.view": {
1981
+ "id": "data-store.view.derives-from.data-store.view",
1982
+ "source_spec_node_id": "data-store.view",
1983
+ "source_layer": "data-store",
1984
+ "destination_spec_node_id": "data-store.view",
1985
+ "destination_layer": "data-store",
1986
+ "predicate": "derives-from",
1987
+ "cardinality": "many-to-many",
1988
+ "strength": "medium",
1989
+ "required": false
1990
+ },
1991
+ "data-store.view.realizes.api.response": {
1992
+ "id": "data-store.view.realizes.api.response",
1993
+ "source_spec_node_id": "data-store.view",
1994
+ "source_layer": "data-store",
1995
+ "destination_spec_node_id": "api.response",
1996
+ "destination_layer": "api",
1997
+ "predicate": "realizes",
1998
+ "cardinality": "many-to-many",
1999
+ "strength": "medium",
2000
+ "required": false
2001
+ },
2002
+ "data-store.view.serves.application.applicationservice": {
2003
+ "id": "data-store.view.serves.application.applicationservice",
2004
+ "source_spec_node_id": "data-store.view",
2005
+ "source_layer": "data-store",
2006
+ "destination_spec_node_id": "application.applicationservice",
2007
+ "destination_layer": "application",
2008
+ "predicate": "serves",
2009
+ "cardinality": "many-to-many",
2010
+ "strength": "medium",
2011
+ "required": false
2012
+ },
2013
+ "data-store.view.serves.business.businessservice": {
2014
+ "id": "data-store.view.serves.business.businessservice",
2015
+ "source_spec_node_id": "data-store.view",
2016
+ "source_layer": "data-store",
2017
+ "destination_spec_node_id": "business.businessservice",
2018
+ "destination_layer": "business",
2019
+ "predicate": "serves",
2020
+ "cardinality": "many-to-many",
2021
+ "strength": "medium",
2022
+ "required": false
2023
+ }
2024
+ }
2025
+ }