@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,3411 @@
1
+ {
2
+ "specVersion": "0.8.4",
3
+ "layer": {
4
+ "id": "api",
5
+ "number": 6,
6
+ "name": "API Layer",
7
+ "description": "Layer 6: API Layer",
8
+ "inspired_by": {
9
+ "standard": "OpenAPI 3.0",
10
+ "version": "3.0",
11
+ "url": "https://spec.openapis.org/oas/v3.0.0"
12
+ },
13
+ "node_types": [
14
+ "api.callback",
15
+ "api.components",
16
+ "api.contact",
17
+ "api.encoding",
18
+ "api.example",
19
+ "api.externaldocumentation",
20
+ "api.header",
21
+ "api.info",
22
+ "api.license",
23
+ "api.link",
24
+ "api.mediatype",
25
+ "api.oauthflow",
26
+ "api.oauthflows",
27
+ "api.openapidocument",
28
+ "api.operation",
29
+ "api.parameter",
30
+ "api.pathitem",
31
+ "api.ratelimit",
32
+ "api.paths",
33
+ "api.requestbody",
34
+ "api.response",
35
+ "api.responses",
36
+ "api.schema",
37
+ "api.securityscheme",
38
+ "api.server",
39
+ "api.servervariable",
40
+ "api.tag"
41
+ ]
42
+ },
43
+ "nodeSchemas": {
44
+ "callback": {
45
+ "$schema": "http://json-schema.org/draft-07/schema#",
46
+ "title": "Callback",
47
+ "description": "Defines a callback where the API sends asynchronous notifications to an external URL derived at runtime. A callback maps a Runtime Expression (e.g., $request.body#/callbackUrl) to a full PathItem object, meaning the callback specifies the complete HTTP interaction — method, headers, and expected response — not just a target URL. Enables event-driven integrations and async workflows.",
48
+ "allOf": [
49
+ {
50
+ "$ref": "urn:dr:spec:base:spec-node"
51
+ }
52
+ ],
53
+ "properties": {
54
+ "spec_node_id": {
55
+ "const": "api.callback"
56
+ },
57
+ "layer_id": {
58
+ "const": "api"
59
+ },
60
+ "type": {
61
+ "const": "callback"
62
+ },
63
+ "attributes": {
64
+ "type": "object",
65
+ "properties": {
66
+ "expression": {
67
+ "type": "string",
68
+ "description": "OpenAPI 3.0 Runtime Expression (e.g., $request.body#/callbackUrl) resolved at runtime against the triggering request to determine the callback target URL."
69
+ }
70
+ },
71
+ "additionalProperties": false
72
+ }
73
+ },
74
+ "$id": "urn:dr:spec:node:api.callback"
75
+ },
76
+ "components": {
77
+ "$schema": "http://json-schema.org/draft-07/schema#",
78
+ "title": "Components",
79
+ "description": "A named registry for reusable API definition objects (schemas, responses, parameters, examples, requestBodies, headers, securitySchemes, links, callbacks) that enables $ref referencing throughout the specification. Component entries are not rendered directly — they must be referenced by operations, parameters, or schemas to take effect. Component name keys must match the pattern ^[a-zA-Z0-9.\\-_]+$ per OpenAPI 3.0 — arbitrary strings are not valid component identifiers.",
80
+ "allOf": [
81
+ {
82
+ "$ref": "urn:dr:spec:base:spec-node"
83
+ }
84
+ ],
85
+ "properties": {
86
+ "spec_node_id": {
87
+ "const": "api.components"
88
+ },
89
+ "layer_id": {
90
+ "const": "api"
91
+ },
92
+ "type": {
93
+ "const": "components"
94
+ },
95
+ "attributes": {
96
+ "type": "object",
97
+ "properties": {},
98
+ "additionalProperties": false
99
+ }
100
+ },
101
+ "$id": "urn:dr:spec:node:api.components"
102
+ },
103
+ "contact": {
104
+ "$schema": "http://json-schema.org/draft-07/schema#",
105
+ "title": "Contact",
106
+ "description": "Contact information for the API owner or maintainer, including name, email, and URL. Enables consumers to reach out for support or collaboration.",
107
+ "allOf": [
108
+ {
109
+ "$ref": "urn:dr:spec:base:spec-node"
110
+ }
111
+ ],
112
+ "properties": {
113
+ "spec_node_id": {
114
+ "const": "api.contact"
115
+ },
116
+ "layer_id": {
117
+ "const": "api"
118
+ },
119
+ "type": {
120
+ "const": "contact"
121
+ },
122
+ "attributes": {
123
+ "type": "object",
124
+ "properties": {
125
+ "url": {
126
+ "type": "string"
127
+ },
128
+ "email": {
129
+ "type": "string"
130
+ }
131
+ },
132
+ "required": [],
133
+ "additionalProperties": false
134
+ }
135
+ },
136
+ "$id": "urn:dr:spec:node:api.contact"
137
+ },
138
+ "encoding": {
139
+ "$schema": "http://json-schema.org/draft-07/schema#",
140
+ "title": "Encoding",
141
+ "description": "Specifies serialization details for multipart request body properties, including content-type, headers, and encoding style. Handles complex content negotiation. Note: a Content-Type header placed in the Encoding object's 'headers' map is ignored — use the 'contentType' attribute to set the MIME type for a multipart section.",
142
+ "allOf": [
143
+ {
144
+ "$ref": "urn:dr:spec:base:spec-node"
145
+ }
146
+ ],
147
+ "properties": {
148
+ "spec_node_id": {
149
+ "const": "api.encoding"
150
+ },
151
+ "layer_id": {
152
+ "const": "api"
153
+ },
154
+ "type": {
155
+ "const": "encoding"
156
+ },
157
+ "attributes": {
158
+ "type": "object",
159
+ "properties": {
160
+ "propertyName": {
161
+ "type": "string"
162
+ },
163
+ "contentType": {
164
+ "type": "string"
165
+ },
166
+ "style": {
167
+ "type": "string",
168
+ "enum": [
169
+ "matrix",
170
+ "label",
171
+ "form",
172
+ "simple",
173
+ "spaceDelimited",
174
+ "pipeDelimited",
175
+ "deepObject"
176
+ ],
177
+ "description": "Serialization style for the encoding (only applicable to multipart/form-data and application/x-www-form-urlencoded)"
178
+ },
179
+ "explode": {
180
+ "type": "boolean"
181
+ },
182
+ "allowReserved": {
183
+ "type": "boolean",
184
+ "description": "Allows reserved characters in field values without percent-encoding. Only applies when style is 'form' and the content type is 'application/x-www-form-urlencoded'."
185
+ }
186
+ },
187
+ "required": [],
188
+ "additionalProperties": false
189
+ }
190
+ },
191
+ "$id": "urn:dr:spec:node:api.encoding"
192
+ },
193
+ "example": {
194
+ "$schema": "http://json-schema.org/draft-07/schema#",
195
+ "title": "Example",
196
+ "description": "Provides sample values for request bodies, responses, or parameters. Improves documentation clarity and enables automated testing or mocking.",
197
+ "allOf": [
198
+ {
199
+ "$ref": "urn:dr:spec:base:spec-node"
200
+ }
201
+ ],
202
+ "properties": {
203
+ "spec_node_id": {
204
+ "const": "api.example"
205
+ },
206
+ "layer_id": {
207
+ "const": "api"
208
+ },
209
+ "type": {
210
+ "const": "example"
211
+ },
212
+ "attributes": {
213
+ "type": "object",
214
+ "properties": {
215
+ "summary": {
216
+ "type": "string"
217
+ },
218
+ "description": {
219
+ "type": "string"
220
+ },
221
+ "value": {
222
+ "type": "string",
223
+ "description": "Inline example value. Mutually exclusive with externalValue — only one may be set per Example."
224
+ },
225
+ "externalValue": {
226
+ "type": "string",
227
+ "description": "URL pointing to an external example. Mutually exclusive with value — only one may be set per Example."
228
+ }
229
+ },
230
+ "required": [],
231
+ "additionalProperties": false
232
+ }
233
+ },
234
+ "$id": "urn:dr:spec:node:api.example"
235
+ },
236
+ "externaldocumentation": {
237
+ "$schema": "http://json-schema.org/draft-07/schema#",
238
+ "title": "ExternalDocumentation",
239
+ "description": "A reference to external documentation resources (URLs, wikis, guides) that provide additional context beyond the inline API specification. Can be attached to the root OpenAPI document, individual Tags, Operations, and Schema objects.",
240
+ "allOf": [
241
+ {
242
+ "$ref": "urn:dr:spec:base:spec-node"
243
+ }
244
+ ],
245
+ "properties": {
246
+ "spec_node_id": {
247
+ "const": "api.externaldocumentation"
248
+ },
249
+ "layer_id": {
250
+ "const": "api"
251
+ },
252
+ "type": {
253
+ "const": "externaldocumentation"
254
+ },
255
+ "attributes": {
256
+ "type": "object",
257
+ "properties": {
258
+ "description": {
259
+ "type": "string"
260
+ },
261
+ "url": {
262
+ "type": "string"
263
+ }
264
+ },
265
+ "required": ["url"],
266
+ "additionalProperties": false
267
+ }
268
+ },
269
+ "$id": "urn:dr:spec:node:api.externaldocumentation"
270
+ },
271
+ "header": {
272
+ "$schema": "http://json-schema.org/draft-07/schema#",
273
+ "title": "Header",
274
+ "description": "Defines a reusable HTTP header for responses or request components. The header name is derived from its map key — the OpenAPI 3.0 Header Object does not include a 'name' field (use the 'name' attribute as a local identifier only). The 'in' location is implicitly 'header' and must not be specified, distinguishing Header from Parameter.",
275
+ "allOf": [
276
+ {
277
+ "$ref": "urn:dr:spec:base:spec-node"
278
+ }
279
+ ],
280
+ "properties": {
281
+ "spec_node_id": {
282
+ "const": "api.header"
283
+ },
284
+ "layer_id": {
285
+ "const": "api"
286
+ },
287
+ "type": {
288
+ "const": "header"
289
+ },
290
+ "attributes": {
291
+ "type": "object",
292
+ "properties": {
293
+ "description": {
294
+ "type": "string"
295
+ },
296
+ "required": {
297
+ "type": "boolean"
298
+ },
299
+ "deprecated": {
300
+ "type": "boolean"
301
+ },
302
+ "schema": {
303
+ "type": "object",
304
+ "description": "The schema defining the type and constraints for the header value"
305
+ },
306
+ "style": {
307
+ "type": "string",
308
+ "enum": [
309
+ "matrix",
310
+ "label",
311
+ "form",
312
+ "simple",
313
+ "spaceDelimited",
314
+ "pipeDelimited",
315
+ "deepObject"
316
+ ],
317
+ "description": "Serialization style for the header value. Default is 'simple' for header parameters."
318
+ },
319
+ "explode": {
320
+ "type": "boolean",
321
+ "description": "When true, array/object values generate separate header instances for each element. Default: false."
322
+ },
323
+ "allowEmptyValue": {
324
+ "type": "boolean",
325
+ "description": "Allows the header to be sent with an empty value."
326
+ },
327
+ "allowReserved": {
328
+ "type": "boolean",
329
+ "description": "Allows reserved characters in the header value without percent-encoding."
330
+ },
331
+ "example": {
332
+ "description": "An example value for the header. Mutually exclusive with 'examples'."
333
+ },
334
+ "examples": {
335
+ "type": "object",
336
+ "description": "Map of named Example objects for the header. Mutually exclusive with 'example'."
337
+ }
338
+ },
339
+ "additionalProperties": false
340
+ }
341
+ },
342
+ "$id": "urn:dr:spec:node:api.header"
343
+ },
344
+ "info": {
345
+ "$schema": "http://json-schema.org/draft-07/schema#",
346
+ "title": "Info",
347
+ "description": "Required root-level metadata describing the API identity, version, legal terms, and maintainer contact. The 'title' and 'version' fields are required per OpenAPI 3.0. Consumed by documentation generators, API gateways, and developer portals.",
348
+ "allOf": [
349
+ {
350
+ "$ref": "urn:dr:spec:base:spec-node"
351
+ }
352
+ ],
353
+ "properties": {
354
+ "spec_node_id": {
355
+ "const": "api.info"
356
+ },
357
+ "layer_id": {
358
+ "const": "api"
359
+ },
360
+ "type": {
361
+ "const": "info"
362
+ },
363
+ "attributes": {
364
+ "type": "object",
365
+ "properties": {
366
+ "title": {
367
+ "type": "string"
368
+ },
369
+ "description": {
370
+ "type": "string",
371
+ "description": "Supports CommonMark (Markdown) syntax per OpenAPI 3.0."
372
+ },
373
+ "version": {
374
+ "type": "string"
375
+ },
376
+ "termsOfService": {
377
+ "type": "string"
378
+ },
379
+ "contact": {
380
+ "type": "string",
381
+ "description": "Reference to an api.contact node providing maintainer contact details."
382
+ },
383
+ "license": {
384
+ "type": "string",
385
+ "description": "Reference to an api.license node specifying the API's license terms."
386
+ }
387
+ },
388
+ "required": ["title", "version"],
389
+ "additionalProperties": false
390
+ }
391
+ },
392
+ "$id": "urn:dr:spec:node:api.info"
393
+ },
394
+ "license": {
395
+ "$schema": "http://json-schema.org/draft-07/schema#",
396
+ "title": "License",
397
+ "description": "Specifies the legal license under which the API is provided, including license name and URL to full terms. Clarifies usage rights for API consumers.",
398
+ "allOf": [
399
+ {
400
+ "$ref": "urn:dr:spec:base:spec-node"
401
+ }
402
+ ],
403
+ "properties": {
404
+ "spec_node_id": {
405
+ "const": "api.license"
406
+ },
407
+ "layer_id": {
408
+ "const": "api"
409
+ },
410
+ "type": {
411
+ "const": "license"
412
+ },
413
+ "attributes": {
414
+ "type": "object",
415
+ "properties": {
416
+ "url": {
417
+ "type": "string"
418
+ }
419
+ },
420
+ "required": ["name"],
421
+ "additionalProperties": false
422
+ }
423
+ },
424
+ "$id": "urn:dr:spec:node:api.license"
425
+ },
426
+ "link": {
427
+ "$schema": "http://json-schema.org/draft-07/schema#",
428
+ "title": "Link",
429
+ "description": "Describes a relationship between API responses and subsequent operations, enabling hypermedia-driven API navigation. Supports HATEOAS design patterns.",
430
+ "allOf": [
431
+ {
432
+ "$ref": "urn:dr:spec:base:spec-node"
433
+ }
434
+ ],
435
+ "properties": {
436
+ "spec_node_id": {
437
+ "const": "api.link"
438
+ },
439
+ "layer_id": {
440
+ "const": "api"
441
+ },
442
+ "type": {
443
+ "const": "link"
444
+ },
445
+ "attributes": {
446
+ "type": "object",
447
+ "properties": {
448
+ "operationId": {
449
+ "type": "string",
450
+ "description": "The operationId of the target operation within this document. Mutually exclusive with 'operationRef' — only one may be specified per Link."
451
+ },
452
+ "operationRef": {
453
+ "type": "string",
454
+ "description": "A relative or absolute URL reference to an operation. Mutually exclusive with 'operationId' — only one may be specified per Link."
455
+ },
456
+ "description": {
457
+ "type": "string"
458
+ },
459
+ "parameters": {
460
+ "type": "object",
461
+ "description": "Map of parameter names to runtime expressions or literal values passed to the linked operation"
462
+ },
463
+ "requestBody": {
464
+ "type": "string",
465
+ "description": "Runtime expression or literal value for the linked operation's request body"
466
+ }
467
+ },
468
+ "required": [],
469
+ "additionalProperties": false
470
+ }
471
+ },
472
+ "$id": "urn:dr:spec:node:api.link"
473
+ },
474
+ "mediatype": {
475
+ "$schema": "http://json-schema.org/draft-07/schema#",
476
+ "title": "MediaType",
477
+ "description": "Describes the schema, examples, and encoding for a specific MIME type within a request body or response content map. Keyed by media type string (e.g., application/json).",
478
+ "allOf": [
479
+ {
480
+ "$ref": "urn:dr:spec:base:spec-node"
481
+ }
482
+ ],
483
+ "properties": {
484
+ "spec_node_id": {
485
+ "const": "api.mediatype"
486
+ },
487
+ "layer_id": {
488
+ "const": "api"
489
+ },
490
+ "type": {
491
+ "const": "mediatype"
492
+ },
493
+ "attributes": {
494
+ "type": "object",
495
+ "properties": {
496
+ "contentType": {
497
+ "type": "string"
498
+ },
499
+ "example": {
500
+ "type": "string",
501
+ "description": "An inline example value. Mutually exclusive with 'examples' — only one may be specified per MediaType."
502
+ }
503
+ },
504
+ "required": ["contentType"],
505
+ "additionalProperties": false
506
+ }
507
+ },
508
+ "$id": "urn:dr:spec:node:api.mediatype"
509
+ },
510
+ "oauthflow": {
511
+ "$schema": "http://json-schema.org/draft-07/schema#",
512
+ "title": "OAuthFlow",
513
+ "description": "Configuration for a single OAuth 2.0 grant type (implicit, password, clientCredentials, or authorizationCode). authorizationUrl is required for implicit and authorizationCode flows; tokenUrl is required for password, clientCredentials, and authorizationCode flows; scopes is required for all flows. The flow type is not an explicit field — it is implied by which attribute of the parent OAuthFlows object references this OAuthFlow.",
514
+ "allOf": [
515
+ {
516
+ "$ref": "urn:dr:spec:base:spec-node"
517
+ }
518
+ ],
519
+ "properties": {
520
+ "spec_node_id": {
521
+ "const": "api.oauthflow"
522
+ },
523
+ "layer_id": {
524
+ "const": "api"
525
+ },
526
+ "type": {
527
+ "const": "oauthflow"
528
+ },
529
+ "attributes": {
530
+ "type": "object",
531
+ "properties": {
532
+ "authorizationUrl": {
533
+ "type": "string"
534
+ },
535
+ "tokenUrl": {
536
+ "type": "string"
537
+ },
538
+ "refreshUrl": {
539
+ "type": "string"
540
+ },
541
+ "scopes": {
542
+ "type": "object",
543
+ "description": "Map of scope name to human-readable description string"
544
+ }
545
+ },
546
+ "required": ["scopes"],
547
+ "additionalProperties": false
548
+ }
549
+ },
550
+ "$id": "urn:dr:spec:node:api.oauthflow"
551
+ },
552
+ "oauthflows": {
553
+ "$schema": "http://json-schema.org/draft-07/schema#",
554
+ "title": "OAuthFlows",
555
+ "description": "Configuration for OAuth 2.0 authentication flows (implicit, password, clientCredentials, authorizationCode), specifying authorization URLs, token URLs, and scopes. At least one flow attribute must be specified. Always nested within a SecurityScheme where type is 'oauth2' — cannot be used independently.",
556
+ "allOf": [
557
+ {
558
+ "$ref": "urn:dr:spec:base:spec-node"
559
+ }
560
+ ],
561
+ "properties": {
562
+ "spec_node_id": {
563
+ "const": "api.oauthflows"
564
+ },
565
+ "layer_id": {
566
+ "const": "api"
567
+ },
568
+ "type": {
569
+ "const": "oauthflows"
570
+ },
571
+ "attributes": {
572
+ "type": "object",
573
+ "properties": {},
574
+ "additionalProperties": false
575
+ }
576
+ },
577
+ "$id": "urn:dr:spec:node:api.oauthflows"
578
+ },
579
+ "openapidocument": {
580
+ "$schema": "http://json-schema.org/draft-07/schema#",
581
+ "title": "OpenAPIDocument",
582
+ "description": "The root document object of an OpenAPI 3.0 specification. Required fields are openapi (semver string, e.g. '3.0.3'), info, and paths. Serves as the entry point for all tooling, gateways, and documentation generators.",
583
+ "allOf": [
584
+ {
585
+ "$ref": "urn:dr:spec:base:spec-node"
586
+ }
587
+ ],
588
+ "properties": {
589
+ "spec_node_id": {
590
+ "const": "api.openapidocument"
591
+ },
592
+ "layer_id": {
593
+ "const": "api"
594
+ },
595
+ "type": {
596
+ "const": "openapidocument"
597
+ },
598
+ "attributes": {
599
+ "type": "object",
600
+ "properties": {
601
+ "openapi": {
602
+ "type": "string"
603
+ },
604
+ "info": {
605
+ "type": "string"
606
+ },
607
+ "servers": {
608
+ "type": "string"
609
+ },
610
+ "paths": {
611
+ "type": "string",
612
+ "description": "Required per OpenAPI 3.0 but may be an empty object ({}) when the document is used solely to define reusable components."
613
+ },
614
+ "components": {
615
+ "type": "string"
616
+ },
617
+ "security": {
618
+ "type": "string",
619
+ "description": "Defines default security requirements applied to all operations. Individual operations can override or remove it by setting their own 'security' to an empty array ([])."
620
+ },
621
+ "tags": {
622
+ "type": "string"
623
+ },
624
+ "externalDocs": {
625
+ "type": "string"
626
+ }
627
+ },
628
+ "required": ["openapi", "info", "paths"],
629
+ "additionalProperties": false
630
+ }
631
+ },
632
+ "$id": "urn:dr:spec:node:api.openapidocument"
633
+ },
634
+ "operation": {
635
+ "$schema": "http://json-schema.org/draft-07/schema#",
636
+ "title": "Operation",
637
+ "description": "Defines a single HTTP method bound to a path, specifying its contract: parameters, request body, possible responses, security requirements, and tags. Operation-level security overrides global API security requirements; an empty security array ([]) explicitly removes all security enforcement for the operation. The primary unit of API surface area in OpenAPI 3.0.",
638
+ "allOf": [
639
+ {
640
+ "$ref": "urn:dr:spec:base:spec-node"
641
+ }
642
+ ],
643
+ "properties": {
644
+ "spec_node_id": {
645
+ "const": "api.operation"
646
+ },
647
+ "layer_id": {
648
+ "const": "api"
649
+ },
650
+ "type": {
651
+ "const": "operation"
652
+ },
653
+ "attributes": {
654
+ "type": "object",
655
+ "properties": {
656
+ "operationId": {
657
+ "type": "string",
658
+ "description": "Unique identifier for this operation across the entire API document"
659
+ },
660
+ "summary": {
661
+ "type": "string"
662
+ },
663
+ "description": {
664
+ "type": "string"
665
+ },
666
+ "tags": {
667
+ "type": "string"
668
+ },
669
+ "deprecated": {
670
+ "type": "boolean"
671
+ },
672
+ "http_method": {
673
+ "type": "string",
674
+ "description": "HTTP method for this operation",
675
+ "enum": [
676
+ "GET",
677
+ "POST",
678
+ "PUT",
679
+ "DELETE",
680
+ "PATCH",
681
+ "HEAD",
682
+ "OPTIONS",
683
+ "TRACE"
684
+ ]
685
+ },
686
+ "http_path": {
687
+ "type": "string",
688
+ "description": "URL path template for this operation (e.g. '/api/taxonomies/{id}')",
689
+ "pattern": "^/"
690
+ }
691
+ },
692
+ "required": ["operationId", "summary", "tags"],
693
+ "additionalProperties": false
694
+ }
695
+ },
696
+ "$id": "urn:dr:spec:node:api.operation"
697
+ },
698
+ "parameter": {
699
+ "$schema": "http://json-schema.org/draft-07/schema#",
700
+ "title": "Parameter",
701
+ "description": "Defines an input to an API operation by location, name, and schema. Parameters can appear in four locations: 'path' (always required, name must match the {placeholder} in the path template), 'query' (case-sensitive name, appended to the URL), 'header' (case-insensitive name), and 'cookie'. The 'schema' and 'content' attributes are mutually exclusive; 'content' requires exactly one map entry.",
702
+ "allOf": [
703
+ {
704
+ "$ref": "urn:dr:spec:base:spec-node"
705
+ }
706
+ ],
707
+ "properties": {
708
+ "spec_node_id": {
709
+ "const": "api.parameter"
710
+ },
711
+ "layer_id": {
712
+ "const": "api"
713
+ },
714
+ "type": {
715
+ "const": "parameter"
716
+ },
717
+ "attributes": {
718
+ "type": "object",
719
+ "properties": {
720
+ "in": {
721
+ "type": "string",
722
+ "enum": ["query", "header", "path", "cookie"],
723
+ "description": "Location of the parameter. Path parameters must always have required: true. Default serialization style: 'form' for query/cookie, 'simple' for path/header."
724
+ },
725
+ "description": {
726
+ "type": "string"
727
+ },
728
+ "required": {
729
+ "type": "boolean"
730
+ },
731
+ "deprecated": {
732
+ "type": "boolean"
733
+ },
734
+ "allowEmptyValue": {
735
+ "type": "boolean"
736
+ },
737
+ "style": {
738
+ "type": "string",
739
+ "enum": [
740
+ "matrix",
741
+ "label",
742
+ "form",
743
+ "simple",
744
+ "spaceDelimited",
745
+ "pipeDelimited",
746
+ "deepObject"
747
+ ],
748
+ "description": "Serialization style for the parameter value. Defaults: 'form' for query and cookie, 'simple' for path and header."
749
+ },
750
+ "schema": {
751
+ "type": "object",
752
+ "description": "The schema defining the type and constraints for the parameter value"
753
+ },
754
+ "explode": {
755
+ "type": "boolean",
756
+ "description": "When true, array/object values generate separate parameters for each element. Default: true when style is 'form', false otherwise."
757
+ },
758
+ "allowReserved": {
759
+ "type": "boolean",
760
+ "description": "Allows reserved characters in query parameter values without percent-encoding. Only applies to 'query' parameters."
761
+ },
762
+ "example": {
763
+ "description": "An example value for the parameter. Mutually exclusive with 'examples'."
764
+ },
765
+ "examples": {
766
+ "type": "object",
767
+ "description": "Map of named Example objects for the parameter. Mutually exclusive with 'example'."
768
+ },
769
+ "content": {
770
+ "type": "object",
771
+ "description": "Alternative to 'schema' for complex serialization. Mutually exclusive with 'schema'; must contain exactly one map entry keyed by media type string."
772
+ }
773
+ },
774
+ "required": ["in"],
775
+ "additionalProperties": false
776
+ }
777
+ },
778
+ "$id": "urn:dr:spec:node:api.parameter"
779
+ },
780
+ "pathitem": {
781
+ "$schema": "http://json-schema.org/draft-07/schema#",
782
+ "title": "PathItem",
783
+ "description": "Groups all HTTP operations available under a single URL path pattern (e.g., /users/{userId}). Path-level parameters apply to all operations under the path and can be overridden by matching name+in at the operation level, but cannot be removed. Individual HTTP methods are represented as operation references. Supports $ref at the PathItem level, enabling shared path definitions to be reused across multiple OpenAPI specifications.",
784
+ "allOf": [
785
+ {
786
+ "$ref": "urn:dr:spec:base:spec-node"
787
+ }
788
+ ],
789
+ "properties": {
790
+ "spec_node_id": {
791
+ "const": "api.pathitem"
792
+ },
793
+ "layer_id": {
794
+ "const": "api"
795
+ },
796
+ "type": {
797
+ "const": "pathitem"
798
+ },
799
+ "attributes": {
800
+ "type": "object",
801
+ "properties": {
802
+ "summary": {
803
+ "type": "string"
804
+ },
805
+ "description": {
806
+ "type": "string"
807
+ }
808
+ },
809
+ "required": [],
810
+ "additionalProperties": false
811
+ }
812
+ },
813
+ "$id": "urn:dr:spec:node:api.pathitem"
814
+ },
815
+ "paths": {
816
+ "$schema": "http://json-schema.org/draft-07/schema#",
817
+ "title": "Paths",
818
+ "description": "A map of URL path patterns to PathItem objects defining the API surface. Path keys use OpenAPI path templating (e.g., /users/{id}) and must begin with '/'. Individual path entries are modeled as relationships to api.pathitem nodes.",
819
+ "allOf": [
820
+ {
821
+ "$ref": "urn:dr:spec:base:spec-node"
822
+ }
823
+ ],
824
+ "properties": {
825
+ "spec_node_id": {
826
+ "const": "api.paths"
827
+ },
828
+ "layer_id": {
829
+ "const": "api"
830
+ },
831
+ "type": {
832
+ "const": "paths"
833
+ },
834
+ "attributes": {
835
+ "type": "object",
836
+ "properties": {},
837
+ "additionalProperties": false
838
+ }
839
+ },
840
+ "$id": "urn:dr:spec:node:api.paths"
841
+ },
842
+ "ratelimit": {
843
+ "$schema": "http://json-schema.org/draft-07/schema#",
844
+ "title": "RateLimit",
845
+ "description": "Defines throttling constraints for API or service access, specifying maximum request counts, time windows, and actions to take when limits are exceeded. Protects resources from abuse and ensures fair usage across consumers.",
846
+ "allOf": [
847
+ {
848
+ "$ref": "urn:dr:spec:base:spec-node"
849
+ }
850
+ ],
851
+ "properties": {
852
+ "spec_node_id": {
853
+ "const": "api.ratelimit"
854
+ },
855
+ "layer_id": {
856
+ "const": "api"
857
+ },
858
+ "type": {
859
+ "const": "ratelimit"
860
+ },
861
+ "attributes": {
862
+ "type": "object",
863
+ "properties": {
864
+ "requests": {
865
+ "type": "integer",
866
+ "description": "Maximum number of requests permitted within the specified time window."
867
+ },
868
+ "window": {
869
+ "type": "string",
870
+ "description": "Duration of the rate limit window (e.g., '1m', '1h', '24h'). Requests are counted and reset per window."
871
+ },
872
+ "scope": {
873
+ "type": "string",
874
+ "enum": ["global", "per-user", "per-ip", "per-api-key"],
875
+ "description": "Scope at which the rate limit is applied."
876
+ },
877
+ "action": {
878
+ "type": "string",
879
+ "enum": ["block", "throttle", "queue", "log", "challenge"],
880
+ "description": "Action taken when the rate limit is exceeded, per NIST SC-5 (Denial-of-Service Protection)."
881
+ },
882
+ "keyBy": {
883
+ "type": "string",
884
+ "description": "Attribute used to identify and group requests for rate limit counting (e.g., 'user.id', 'request.ip', 'api-key')."
885
+ },
886
+ "source": {
887
+ "type": "object",
888
+ "description": "Source code reference"
889
+ }
890
+ },
891
+ "required": ["requests", "window", "keyBy"],
892
+ "additionalProperties": false
893
+ }
894
+ },
895
+ "$id": "urn:dr:spec:node:api.ratelimit"
896
+ },
897
+ "requestbody": {
898
+ "$schema": "http://json-schema.org/draft-07/schema#",
899
+ "title": "RequestBody",
900
+ "description": "Defines the request body for an operation as a map of MIME types to MediaType objects. The 'content' field is required and must contain at least one entry per OpenAPI 3.0. The 'required' field defaults to false. Can be placed in api.components requestBodies and referenced via $ref for reuse across multiple operations.",
901
+ "allOf": [
902
+ {
903
+ "$ref": "urn:dr:spec:base:spec-node"
904
+ }
905
+ ],
906
+ "properties": {
907
+ "spec_node_id": {
908
+ "const": "api.requestbody"
909
+ },
910
+ "layer_id": {
911
+ "const": "api"
912
+ },
913
+ "type": {
914
+ "const": "requestbody"
915
+ },
916
+ "attributes": {
917
+ "type": "object",
918
+ "properties": {
919
+ "description": {
920
+ "type": "string"
921
+ },
922
+ "required": {
923
+ "type": "boolean"
924
+ }
925
+ },
926
+ "additionalProperties": false
927
+ }
928
+ },
929
+ "$id": "urn:dr:spec:node:api.requestbody"
930
+ },
931
+ "response": {
932
+ "$schema": "http://json-schema.org/draft-07/schema#",
933
+ "title": "Response",
934
+ "description": "Defines a single HTTP response returned by an operation, including its description, body content (keyed by MIME type), response headers, and optional hypermedia links. The 'content' field may be omitted entirely for responses with no body (e.g., 204 No Content). Header map keys are case-insensitive per the HTTP specification.",
935
+ "allOf": [
936
+ {
937
+ "$ref": "urn:dr:spec:base:spec-node"
938
+ }
939
+ ],
940
+ "properties": {
941
+ "spec_node_id": {
942
+ "const": "api.response"
943
+ },
944
+ "layer_id": {
945
+ "const": "api"
946
+ },
947
+ "type": {
948
+ "const": "response"
949
+ },
950
+ "attributes": {
951
+ "type": "object",
952
+ "properties": {
953
+ "description": {
954
+ "type": "string"
955
+ }
956
+ },
957
+ "required": ["description"],
958
+ "additionalProperties": false
959
+ }
960
+ },
961
+ "$id": "urn:dr:spec:node:api.response"
962
+ },
963
+ "responses": {
964
+ "$schema": "http://json-schema.org/draft-07/schema#",
965
+ "title": "Responses",
966
+ "description": "A map of HTTP status codes (e.g., 200, 404, default) to Response objects describing each possible outcome of an operation. At least one response must be defined per OpenAPI 3.0. Status code ranges (e.g., 2XX) are not supported — only specific numeric codes and 'default' are valid keys.",
967
+ "allOf": [
968
+ {
969
+ "$ref": "urn:dr:spec:base:spec-node"
970
+ }
971
+ ],
972
+ "properties": {
973
+ "spec_node_id": {
974
+ "const": "api.responses"
975
+ },
976
+ "layer_id": {
977
+ "const": "api"
978
+ },
979
+ "type": {
980
+ "const": "responses"
981
+ },
982
+ "attributes": {
983
+ "type": "object",
984
+ "properties": {},
985
+ "additionalProperties": false
986
+ }
987
+ },
988
+ "$id": "urn:dr:spec:node:api.responses"
989
+ },
990
+ "schema": {
991
+ "$schema": "http://json-schema.org/draft-07/schema#",
992
+ "title": "Schema",
993
+ "description": "Inline data type definition using a subset of JSON Schema Draft 7, used within API operations to describe request/response data shapes. For reusable canonical types, reference data-model layer entities instead. OpenAPI 3.0 restriction: a '$ref' within a Schema ignores all sibling keywords — unlike JSON Schema where $ref can be merged with other constraints.",
994
+ "allOf": [
995
+ {
996
+ "$ref": "urn:dr:spec:base:spec-node"
997
+ }
998
+ ],
999
+ "properties": {
1000
+ "spec_node_id": {
1001
+ "const": "api.schema"
1002
+ },
1003
+ "layer_id": {
1004
+ "const": "api"
1005
+ },
1006
+ "type": {
1007
+ "const": "schema"
1008
+ },
1009
+ "attributes": {
1010
+ "type": "object",
1011
+ "properties": {
1012
+ "type": {
1013
+ "type": "string"
1014
+ },
1015
+ "title": {
1016
+ "type": "string"
1017
+ },
1018
+ "description": {
1019
+ "type": "string"
1020
+ },
1021
+ "format": {
1022
+ "type": "string"
1023
+ },
1024
+ "default": {
1025
+ "type": "string"
1026
+ },
1027
+ "enum": {
1028
+ "type": "string"
1029
+ },
1030
+ "nullable": {
1031
+ "type": "boolean"
1032
+ },
1033
+ "properties": {
1034
+ "type": "object",
1035
+ "description": "Map of property names to schema definitions for object types"
1036
+ },
1037
+ "items": {
1038
+ "type": "object",
1039
+ "description": "Schema definition for array element types"
1040
+ },
1041
+ "required": {
1042
+ "type": "array",
1043
+ "description": "List of required property names for object types"
1044
+ },
1045
+ "allOf": {
1046
+ "type": "array",
1047
+ "description": "Composed schema: value must be valid against all listed schemas"
1048
+ },
1049
+ "oneOf": {
1050
+ "type": "array",
1051
+ "description": "Composed schema: value must be valid against exactly one of the listed schemas"
1052
+ },
1053
+ "anyOf": {
1054
+ "type": "array",
1055
+ "description": "Composed schema: value must be valid against one or more of the listed schemas"
1056
+ },
1057
+ "$ref": {
1058
+ "type": "string",
1059
+ "description": "JSON Reference to another schema definition. In OpenAPI 3.0, sibling keywords are ignored when $ref is present."
1060
+ },
1061
+ "readOnly": {
1062
+ "type": "boolean",
1063
+ "description": "Indicates the property is read-only and should not be sent in request bodies."
1064
+ },
1065
+ "writeOnly": {
1066
+ "type": "boolean",
1067
+ "description": "Indicates the property is write-only and should not be included in response bodies."
1068
+ },
1069
+ "deprecated": {
1070
+ "type": "boolean",
1071
+ "description": "Marks the schema as deprecated. Consumers should migrate away from using it."
1072
+ },
1073
+ "discriminator": {
1074
+ "type": "object",
1075
+ "description": "Adds support for polymorphism by specifying the property name that determines the subtype (propertyName) and an optional mapping of values to schema references."
1076
+ },
1077
+ "xml": {
1078
+ "type": "object",
1079
+ "description": "XML serialization metadata for this schema when producing XML representations."
1080
+ },
1081
+ "externalDocs": {
1082
+ "type": "object",
1083
+ "description": "Reference to an api.externaldocumentation node providing additional documentation for this schema."
1084
+ }
1085
+ },
1086
+ "required": [],
1087
+ "additionalProperties": false
1088
+ }
1089
+ },
1090
+ "$id": "urn:dr:spec:node:api.schema"
1091
+ },
1092
+ "securityscheme": {
1093
+ "$schema": "http://json-schema.org/draft-07/schema#",
1094
+ "title": "SecurityScheme",
1095
+ "description": "Defines an authentication/authorization mechanism for the API. Supports four scheme types: apiKey (name+in required), http (scheme required), oauth2 (flows required), and openIdConnect (openIdConnectUrl required). Only 'type' is universally required. Note: SecurityScheme defines the mechanism; it is referenced by name string key in Operation.security or the root security array — those references are security requirement objects, not SecurityScheme instances.",
1096
+ "allOf": [
1097
+ {
1098
+ "$ref": "urn:dr:spec:base:spec-node"
1099
+ }
1100
+ ],
1101
+ "properties": {
1102
+ "spec_node_id": {
1103
+ "const": "api.securityscheme"
1104
+ },
1105
+ "layer_id": {
1106
+ "const": "api"
1107
+ },
1108
+ "type": {
1109
+ "const": "securityscheme"
1110
+ },
1111
+ "attributes": {
1112
+ "type": "object",
1113
+ "properties": {
1114
+ "type": {
1115
+ "type": "string",
1116
+ "enum": ["apiKey", "http", "oauth2", "openIdConnect"],
1117
+ "description": "Type of security scheme"
1118
+ },
1119
+ "description": {
1120
+ "type": "string"
1121
+ },
1122
+ "in": {
1123
+ "type": "string"
1124
+ },
1125
+ "scheme": {
1126
+ "type": "string"
1127
+ },
1128
+ "bearerFormat": {
1129
+ "type": "string"
1130
+ },
1131
+ "openIdConnectUrl": {
1132
+ "type": "string",
1133
+ "description": "OpenID Connect discovery URL, required when type is openIdConnect"
1134
+ }
1135
+ },
1136
+ "required": ["type"],
1137
+ "additionalProperties": false
1138
+ }
1139
+ },
1140
+ "$id": "urn:dr:spec:node:api.securityscheme"
1141
+ },
1142
+ "server": {
1143
+ "$schema": "http://json-schema.org/draft-07/schema#",
1144
+ "title": "Server",
1145
+ "description": "Defines a server URL (optionally templated with {variable} placeholders) where the API is deployed. Supports multiple server entries for different environments (production, staging, dev). The 'url' field is required. A 'servers' array can appear at three levels: root document, PathItem, and Operation — each level overrides the previous for that scope.",
1146
+ "allOf": [
1147
+ {
1148
+ "$ref": "urn:dr:spec:base:spec-node"
1149
+ }
1150
+ ],
1151
+ "properties": {
1152
+ "spec_node_id": {
1153
+ "const": "api.server"
1154
+ },
1155
+ "layer_id": {
1156
+ "const": "api"
1157
+ },
1158
+ "type": {
1159
+ "const": "server"
1160
+ },
1161
+ "attributes": {
1162
+ "type": "object",
1163
+ "properties": {
1164
+ "url": {
1165
+ "type": "string"
1166
+ },
1167
+ "description": {
1168
+ "type": "string"
1169
+ },
1170
+ "variables": {
1171
+ "type": "string",
1172
+ "description": "Map of {placeholder} names (from the url template) to api.servervariable nodes defining allowed values and defaults."
1173
+ }
1174
+ },
1175
+ "required": ["url"],
1176
+ "additionalProperties": false
1177
+ }
1178
+ },
1179
+ "$id": "urn:dr:spec:node:api.server"
1180
+ },
1181
+ "servervariable": {
1182
+ "$schema": "http://json-schema.org/draft-07/schema#",
1183
+ "title": "ServerVariable",
1184
+ "description": "A variable placeholder in server URL templates that can be substituted at runtime. Enables dynamic server addressing for different environments or tenants.",
1185
+ "allOf": [
1186
+ {
1187
+ "$ref": "urn:dr:spec:base:spec-node"
1188
+ }
1189
+ ],
1190
+ "properties": {
1191
+ "spec_node_id": {
1192
+ "const": "api.servervariable"
1193
+ },
1194
+ "layer_id": {
1195
+ "const": "api"
1196
+ },
1197
+ "type": {
1198
+ "const": "servervariable"
1199
+ },
1200
+ "attributes": {
1201
+ "type": "object",
1202
+ "properties": {
1203
+ "default": {
1204
+ "type": "string",
1205
+ "description": "Required default value for the variable. When 'enum' is specified, this value must be one of the listed enum values."
1206
+ },
1207
+ "enum": {
1208
+ "type": "string",
1209
+ "description": "Restricts the variable to a specific set of allowed values. The 'default' value must be one of these values when enum is present. The variable name (the map key in Server.variables) must exactly match a {placeholder} token in the parent server's URL string."
1210
+ },
1211
+ "description": {
1212
+ "type": "string"
1213
+ }
1214
+ },
1215
+ "required": ["default"],
1216
+ "additionalProperties": false
1217
+ }
1218
+ },
1219
+ "$id": "urn:dr:spec:node:api.servervariable"
1220
+ },
1221
+ "tag": {
1222
+ "$schema": "http://json-schema.org/draft-07/schema#",
1223
+ "title": "Tag",
1224
+ "description": "A metadata label used to group and categorize API operations for documentation organization. Root-level Tag objects provide supplementary metadata (description, externalDocs) for tag names referenced in operations — they do not control which tags are permitted. Tags used in operations but not declared at root level are implicitly valid in OpenAPI 3.0 but will lack descriptions and externalDocs. Duplicate tag names at root level are invalid per OpenAPI 3.0.",
1225
+ "allOf": [
1226
+ {
1227
+ "$ref": "urn:dr:spec:base:spec-node"
1228
+ }
1229
+ ],
1230
+ "properties": {
1231
+ "spec_node_id": {
1232
+ "const": "api.tag"
1233
+ },
1234
+ "layer_id": {
1235
+ "const": "api"
1236
+ },
1237
+ "type": {
1238
+ "const": "tag"
1239
+ },
1240
+ "attributes": {
1241
+ "type": "object",
1242
+ "properties": {
1243
+ "description": {
1244
+ "type": "string"
1245
+ }
1246
+ },
1247
+ "additionalProperties": false
1248
+ }
1249
+ },
1250
+ "$id": "urn:dr:spec:node:api.tag"
1251
+ }
1252
+ },
1253
+ "relationshipSchemas": {
1254
+ "api.callback.aggregates.api.pathitem": {
1255
+ "id": "api.callback.aggregates.api.pathitem",
1256
+ "source_spec_node_id": "api.callback",
1257
+ "source_layer": "api",
1258
+ "destination_spec_node_id": "api.pathitem",
1259
+ "destination_layer": "api",
1260
+ "predicate": "aggregates",
1261
+ "cardinality": "many-to-many",
1262
+ "strength": "medium",
1263
+ "required": false
1264
+ },
1265
+ "api.callback.uses.api.server": {
1266
+ "id": "api.callback.uses.api.server",
1267
+ "source_spec_node_id": "api.callback",
1268
+ "source_layer": "api",
1269
+ "destination_spec_node_id": "api.server",
1270
+ "destination_layer": "api",
1271
+ "predicate": "uses",
1272
+ "cardinality": "many-to-many",
1273
+ "strength": "medium",
1274
+ "required": false
1275
+ },
1276
+ "api.components.aggregates.callback": {
1277
+ "id": "api.components.aggregates.callback",
1278
+ "source_spec_node_id": "api.components",
1279
+ "source_layer": "api",
1280
+ "destination_spec_node_id": "api.callback",
1281
+ "destination_layer": "api",
1282
+ "predicate": "aggregates",
1283
+ "cardinality": "many-to-many",
1284
+ "strength": "medium",
1285
+ "required": false
1286
+ },
1287
+ "api.components.aggregates.api.example": {
1288
+ "id": "api.components.aggregates.api.example",
1289
+ "source_spec_node_id": "api.components",
1290
+ "source_layer": "api",
1291
+ "destination_spec_node_id": "api.example",
1292
+ "destination_layer": "api",
1293
+ "predicate": "aggregates",
1294
+ "cardinality": "many-to-many",
1295
+ "strength": "medium",
1296
+ "required": false
1297
+ },
1298
+ "api.components.aggregates.link": {
1299
+ "id": "api.components.aggregates.link",
1300
+ "source_spec_node_id": "api.components",
1301
+ "source_layer": "api",
1302
+ "destination_spec_node_id": "api.link",
1303
+ "destination_layer": "api",
1304
+ "predicate": "aggregates",
1305
+ "cardinality": "many-to-many",
1306
+ "strength": "medium",
1307
+ "required": false
1308
+ },
1309
+ "api.components.aggregates.requestbody": {
1310
+ "id": "api.components.aggregates.requestbody",
1311
+ "source_spec_node_id": "api.components",
1312
+ "source_layer": "api",
1313
+ "destination_spec_node_id": "api.requestbody",
1314
+ "destination_layer": "api",
1315
+ "predicate": "aggregates",
1316
+ "cardinality": "many-to-many",
1317
+ "strength": "medium",
1318
+ "required": false
1319
+ },
1320
+ "api.components.aggregates.api.response": {
1321
+ "id": "api.components.aggregates.api.response",
1322
+ "source_spec_node_id": "api.components",
1323
+ "source_layer": "api",
1324
+ "destination_spec_node_id": "api.response",
1325
+ "destination_layer": "api",
1326
+ "predicate": "aggregates",
1327
+ "cardinality": "many-to-many",
1328
+ "strength": "medium",
1329
+ "required": false
1330
+ },
1331
+ "api.components.composes.api.header": {
1332
+ "id": "api.components.composes.api.header",
1333
+ "source_spec_node_id": "api.components",
1334
+ "source_layer": "api",
1335
+ "destination_spec_node_id": "api.header",
1336
+ "destination_layer": "api",
1337
+ "predicate": "composes",
1338
+ "cardinality": "many-to-many",
1339
+ "strength": "medium",
1340
+ "required": false
1341
+ },
1342
+ "api.components.composes.api.parameter": {
1343
+ "id": "api.components.composes.api.parameter",
1344
+ "source_spec_node_id": "api.components",
1345
+ "source_layer": "api",
1346
+ "destination_spec_node_id": "api.parameter",
1347
+ "destination_layer": "api",
1348
+ "predicate": "composes",
1349
+ "cardinality": "many-to-many",
1350
+ "strength": "medium",
1351
+ "required": false
1352
+ },
1353
+ "api.components.composes.api.paths": {
1354
+ "id": "api.components.composes.api.paths",
1355
+ "source_spec_node_id": "api.components",
1356
+ "source_layer": "api",
1357
+ "destination_spec_node_id": "api.paths",
1358
+ "destination_layer": "api",
1359
+ "predicate": "composes",
1360
+ "cardinality": "many-to-many",
1361
+ "strength": "medium",
1362
+ "required": false
1363
+ },
1364
+ "api.components.composes.api.response": {
1365
+ "id": "api.components.composes.api.response",
1366
+ "source_spec_node_id": "api.components",
1367
+ "source_layer": "api",
1368
+ "destination_spec_node_id": "api.response",
1369
+ "destination_layer": "api",
1370
+ "predicate": "composes",
1371
+ "cardinality": "many-to-many",
1372
+ "strength": "medium",
1373
+ "required": false
1374
+ },
1375
+ "api.components.composes.api.responses": {
1376
+ "id": "api.components.composes.api.responses",
1377
+ "source_spec_node_id": "api.components",
1378
+ "source_layer": "api",
1379
+ "destination_spec_node_id": "api.responses",
1380
+ "destination_layer": "api",
1381
+ "predicate": "composes",
1382
+ "cardinality": "many-to-many",
1383
+ "strength": "medium",
1384
+ "required": false
1385
+ },
1386
+ "api.components.composes.api.schema": {
1387
+ "id": "api.components.composes.api.schema",
1388
+ "source_spec_node_id": "api.components",
1389
+ "source_layer": "api",
1390
+ "destination_spec_node_id": "api.schema",
1391
+ "destination_layer": "api",
1392
+ "predicate": "composes",
1393
+ "cardinality": "many-to-many",
1394
+ "strength": "medium",
1395
+ "required": false
1396
+ },
1397
+ "api.components.composes.api.securityscheme": {
1398
+ "id": "api.components.composes.api.securityscheme",
1399
+ "source_spec_node_id": "api.components",
1400
+ "source_layer": "api",
1401
+ "destination_spec_node_id": "api.securityscheme",
1402
+ "destination_layer": "api",
1403
+ "predicate": "composes",
1404
+ "cardinality": "many-to-many",
1405
+ "strength": "medium",
1406
+ "required": false
1407
+ },
1408
+ "api.contact.associated-with.api.openapidocument": {
1409
+ "id": "api.contact.associated-with.api.openapidocument",
1410
+ "source_spec_node_id": "api.contact",
1411
+ "source_layer": "api",
1412
+ "destination_spec_node_id": "api.openapidocument",
1413
+ "destination_layer": "api",
1414
+ "predicate": "associated-with",
1415
+ "cardinality": "many-to-many",
1416
+ "strength": "medium",
1417
+ "required": false
1418
+ },
1419
+ "api.encoding.associated-with.api.mediatype": {
1420
+ "id": "api.encoding.associated-with.api.mediatype",
1421
+ "source_spec_node_id": "api.encoding",
1422
+ "source_layer": "api",
1423
+ "destination_spec_node_id": "api.mediatype",
1424
+ "destination_layer": "api",
1425
+ "predicate": "associated-with",
1426
+ "cardinality": "many-to-many",
1427
+ "strength": "medium",
1428
+ "required": false
1429
+ },
1430
+ "api.encoding.associated-with.api.parameter": {
1431
+ "id": "api.encoding.associated-with.api.parameter",
1432
+ "source_spec_node_id": "api.encoding",
1433
+ "source_layer": "api",
1434
+ "destination_spec_node_id": "api.parameter",
1435
+ "destination_layer": "api",
1436
+ "predicate": "associated-with",
1437
+ "cardinality": "many-to-many",
1438
+ "strength": "medium",
1439
+ "required": false
1440
+ },
1441
+ "api.encoding.composes.api.header": {
1442
+ "id": "api.encoding.composes.api.header",
1443
+ "source_spec_node_id": "api.encoding",
1444
+ "source_layer": "api",
1445
+ "destination_spec_node_id": "api.header",
1446
+ "destination_layer": "api",
1447
+ "predicate": "composes",
1448
+ "cardinality": "many-to-many",
1449
+ "strength": "medium",
1450
+ "required": false
1451
+ },
1452
+ "api.encoding.references.api.header": {
1453
+ "id": "api.encoding.references.api.header",
1454
+ "source_spec_node_id": "api.encoding",
1455
+ "source_layer": "api",
1456
+ "destination_spec_node_id": "api.header",
1457
+ "destination_layer": "api",
1458
+ "predicate": "references",
1459
+ "cardinality": "many-to-many",
1460
+ "strength": "medium",
1461
+ "required": false
1462
+ },
1463
+ "api.encoding.references.api.schema": {
1464
+ "id": "api.encoding.references.api.schema",
1465
+ "source_spec_node_id": "api.encoding",
1466
+ "source_layer": "api",
1467
+ "destination_spec_node_id": "api.schema",
1468
+ "destination_layer": "api",
1469
+ "predicate": "references",
1470
+ "cardinality": "many-to-many",
1471
+ "strength": "medium",
1472
+ "required": false
1473
+ },
1474
+ "api.example.associated-with.api.operation": {
1475
+ "id": "api.example.associated-with.api.operation",
1476
+ "source_spec_node_id": "api.example",
1477
+ "source_layer": "api",
1478
+ "destination_spec_node_id": "api.operation",
1479
+ "destination_layer": "api",
1480
+ "predicate": "associated-with",
1481
+ "cardinality": "many-to-many",
1482
+ "strength": "medium",
1483
+ "required": false
1484
+ },
1485
+ "api.example.references.api.schema": {
1486
+ "id": "api.example.references.api.schema",
1487
+ "source_spec_node_id": "api.example",
1488
+ "source_layer": "api",
1489
+ "destination_spec_node_id": "api.schema",
1490
+ "destination_layer": "api",
1491
+ "predicate": "references",
1492
+ "cardinality": "many-to-many",
1493
+ "strength": "medium",
1494
+ "required": false
1495
+ },
1496
+ "api.externaldocumentation.associated-with.api.info": {
1497
+ "id": "api.externaldocumentation.associated-with.api.info",
1498
+ "source_spec_node_id": "api.externaldocumentation",
1499
+ "source_layer": "api",
1500
+ "destination_spec_node_id": "api.info",
1501
+ "destination_layer": "api",
1502
+ "predicate": "associated-with",
1503
+ "cardinality": "many-to-many",
1504
+ "strength": "medium",
1505
+ "required": false
1506
+ },
1507
+ "api.externaldocumentation.serves.api.openapidocument": {
1508
+ "id": "api.externaldocumentation.serves.api.openapidocument",
1509
+ "source_spec_node_id": "api.externaldocumentation",
1510
+ "source_layer": "api",
1511
+ "destination_spec_node_id": "api.openapidocument",
1512
+ "destination_layer": "api",
1513
+ "predicate": "serves",
1514
+ "cardinality": "many-to-many",
1515
+ "strength": "medium",
1516
+ "required": false
1517
+ },
1518
+ "api.externaldocumentation.serves.api.operation": {
1519
+ "id": "api.externaldocumentation.serves.api.operation",
1520
+ "source_spec_node_id": "api.externaldocumentation",
1521
+ "source_layer": "api",
1522
+ "destination_spec_node_id": "api.operation",
1523
+ "destination_layer": "api",
1524
+ "predicate": "serves",
1525
+ "cardinality": "many-to-many",
1526
+ "strength": "medium",
1527
+ "required": false
1528
+ },
1529
+ "api.externaldocumentation.serves.api.schema": {
1530
+ "id": "api.externaldocumentation.serves.api.schema",
1531
+ "source_spec_node_id": "api.externaldocumentation",
1532
+ "source_layer": "api",
1533
+ "destination_spec_node_id": "api.schema",
1534
+ "destination_layer": "api",
1535
+ "predicate": "serves",
1536
+ "cardinality": "many-to-many",
1537
+ "strength": "medium",
1538
+ "required": false
1539
+ },
1540
+ "api.header.associated-with.api.securityscheme": {
1541
+ "id": "api.header.associated-with.api.securityscheme",
1542
+ "source_spec_node_id": "api.header",
1543
+ "source_layer": "api",
1544
+ "destination_spec_node_id": "api.securityscheme",
1545
+ "destination_layer": "api",
1546
+ "predicate": "associated-with",
1547
+ "cardinality": "many-to-many",
1548
+ "strength": "medium",
1549
+ "required": false
1550
+ },
1551
+ "api.header.references.api.example": {
1552
+ "id": "api.header.references.api.example",
1553
+ "source_spec_node_id": "api.header",
1554
+ "source_layer": "api",
1555
+ "destination_spec_node_id": "api.example",
1556
+ "destination_layer": "api",
1557
+ "predicate": "references",
1558
+ "cardinality": "many-to-many",
1559
+ "strength": "medium",
1560
+ "required": false
1561
+ },
1562
+ "api.header.references.api.schema": {
1563
+ "id": "api.header.references.api.schema",
1564
+ "source_spec_node_id": "api.header",
1565
+ "source_layer": "api",
1566
+ "destination_spec_node_id": "api.schema",
1567
+ "destination_layer": "api",
1568
+ "predicate": "references",
1569
+ "cardinality": "many-to-many",
1570
+ "strength": "medium",
1571
+ "required": false
1572
+ },
1573
+ "api.header.specializes.api.parameter": {
1574
+ "id": "api.header.specializes.api.parameter",
1575
+ "source_spec_node_id": "api.header",
1576
+ "source_layer": "api",
1577
+ "destination_spec_node_id": "api.parameter",
1578
+ "destination_layer": "api",
1579
+ "predicate": "specializes",
1580
+ "cardinality": "many-to-many",
1581
+ "strength": "medium",
1582
+ "required": false
1583
+ },
1584
+ "api.info.aggregates.api.contact": {
1585
+ "id": "api.info.aggregates.api.contact",
1586
+ "source_spec_node_id": "api.info",
1587
+ "source_layer": "api",
1588
+ "destination_spec_node_id": "api.contact",
1589
+ "destination_layer": "api",
1590
+ "predicate": "aggregates",
1591
+ "cardinality": "many-to-many",
1592
+ "strength": "medium",
1593
+ "required": false
1594
+ },
1595
+ "api.info.aggregates.api.license": {
1596
+ "id": "api.info.aggregates.api.license",
1597
+ "source_spec_node_id": "api.info",
1598
+ "source_layer": "api",
1599
+ "destination_spec_node_id": "api.license",
1600
+ "destination_layer": "api",
1601
+ "predicate": "aggregates",
1602
+ "cardinality": "many-to-many",
1603
+ "strength": "medium",
1604
+ "required": false
1605
+ },
1606
+ "api.info.associated-with.api.openapidocument": {
1607
+ "id": "api.info.associated-with.api.openapidocument",
1608
+ "source_spec_node_id": "api.info",
1609
+ "source_layer": "api",
1610
+ "destination_spec_node_id": "api.openapidocument",
1611
+ "destination_layer": "api",
1612
+ "predicate": "associated-with",
1613
+ "cardinality": "many-to-many",
1614
+ "strength": "medium",
1615
+ "required": false
1616
+ },
1617
+ "api.license.associated-with.api.openapidocument": {
1618
+ "id": "api.license.associated-with.api.openapidocument",
1619
+ "source_spec_node_id": "api.license",
1620
+ "source_layer": "api",
1621
+ "destination_spec_node_id": "api.openapidocument",
1622
+ "destination_layer": "api",
1623
+ "predicate": "associated-with",
1624
+ "cardinality": "many-to-many",
1625
+ "strength": "medium",
1626
+ "required": false
1627
+ },
1628
+ "api.link.references.api.operation": {
1629
+ "id": "api.link.references.api.operation",
1630
+ "source_spec_node_id": "api.link",
1631
+ "source_layer": "api",
1632
+ "destination_spec_node_id": "api.operation",
1633
+ "destination_layer": "api",
1634
+ "predicate": "references",
1635
+ "cardinality": "many-to-many",
1636
+ "strength": "medium",
1637
+ "required": false
1638
+ },
1639
+ "api.link.references.api.schema": {
1640
+ "id": "api.link.references.api.schema",
1641
+ "source_spec_node_id": "api.link",
1642
+ "source_layer": "api",
1643
+ "destination_spec_node_id": "api.schema",
1644
+ "destination_layer": "api",
1645
+ "predicate": "references",
1646
+ "cardinality": "many-to-many",
1647
+ "strength": "medium",
1648
+ "required": false
1649
+ },
1650
+ "api.link.references.api.tag": {
1651
+ "id": "api.link.references.api.tag",
1652
+ "source_spec_node_id": "api.link",
1653
+ "source_layer": "api",
1654
+ "destination_spec_node_id": "api.tag",
1655
+ "destination_layer": "api",
1656
+ "predicate": "references",
1657
+ "cardinality": "many-to-many",
1658
+ "strength": "medium",
1659
+ "required": false
1660
+ },
1661
+ "api.link.uses.api.server": {
1662
+ "id": "api.link.uses.api.server",
1663
+ "source_spec_node_id": "api.link",
1664
+ "source_layer": "api",
1665
+ "destination_spec_node_id": "api.server",
1666
+ "destination_layer": "api",
1667
+ "predicate": "uses",
1668
+ "cardinality": "many-to-many",
1669
+ "strength": "medium",
1670
+ "required": false
1671
+ },
1672
+ "api.mediatype.aggregates.api.encoding": {
1673
+ "id": "api.mediatype.aggregates.api.encoding",
1674
+ "source_spec_node_id": "api.mediatype",
1675
+ "source_layer": "api",
1676
+ "destination_spec_node_id": "api.encoding",
1677
+ "destination_layer": "api",
1678
+ "predicate": "aggregates",
1679
+ "cardinality": "many-to-many",
1680
+ "strength": "medium",
1681
+ "required": false
1682
+ },
1683
+ "api.mediatype.aggregates.api.example": {
1684
+ "id": "api.mediatype.aggregates.api.example",
1685
+ "source_spec_node_id": "api.mediatype",
1686
+ "source_layer": "api",
1687
+ "destination_spec_node_id": "api.example",
1688
+ "destination_layer": "api",
1689
+ "predicate": "aggregates",
1690
+ "cardinality": "many-to-many",
1691
+ "strength": "medium",
1692
+ "required": false
1693
+ },
1694
+ "api.mediatype.associated-with.api.header": {
1695
+ "id": "api.mediatype.associated-with.api.header",
1696
+ "source_spec_node_id": "api.mediatype",
1697
+ "source_layer": "api",
1698
+ "destination_spec_node_id": "api.header",
1699
+ "destination_layer": "api",
1700
+ "predicate": "associated-with",
1701
+ "cardinality": "many-to-many",
1702
+ "strength": "medium",
1703
+ "required": false
1704
+ },
1705
+ "api.mediatype.composes.api.encoding": {
1706
+ "id": "api.mediatype.composes.api.encoding",
1707
+ "source_spec_node_id": "api.mediatype",
1708
+ "source_layer": "api",
1709
+ "destination_spec_node_id": "api.encoding",
1710
+ "destination_layer": "api",
1711
+ "predicate": "composes",
1712
+ "cardinality": "many-to-many",
1713
+ "strength": "medium",
1714
+ "required": false
1715
+ },
1716
+ "api.mediatype.composes.api.schema": {
1717
+ "id": "api.mediatype.composes.api.schema",
1718
+ "source_spec_node_id": "api.mediatype",
1719
+ "source_layer": "api",
1720
+ "destination_spec_node_id": "api.schema",
1721
+ "destination_layer": "api",
1722
+ "predicate": "composes",
1723
+ "cardinality": "many-to-many",
1724
+ "strength": "medium",
1725
+ "required": false
1726
+ },
1727
+ "api.mediatype.references.api.example": {
1728
+ "id": "api.mediatype.references.api.example",
1729
+ "source_spec_node_id": "api.mediatype",
1730
+ "source_layer": "api",
1731
+ "destination_spec_node_id": "api.example",
1732
+ "destination_layer": "api",
1733
+ "predicate": "references",
1734
+ "cardinality": "many-to-many",
1735
+ "strength": "medium",
1736
+ "required": false
1737
+ },
1738
+ "api.mediatype.references.api.schema": {
1739
+ "id": "api.mediatype.references.api.schema",
1740
+ "source_spec_node_id": "api.mediatype",
1741
+ "source_layer": "api",
1742
+ "destination_spec_node_id": "api.schema",
1743
+ "destination_layer": "api",
1744
+ "predicate": "references",
1745
+ "cardinality": "many-to-many",
1746
+ "strength": "medium",
1747
+ "required": false
1748
+ },
1749
+ "api.mediatype.serves.api.requestbody": {
1750
+ "id": "api.mediatype.serves.api.requestbody",
1751
+ "source_spec_node_id": "api.mediatype",
1752
+ "source_layer": "api",
1753
+ "destination_spec_node_id": "api.requestbody",
1754
+ "destination_layer": "api",
1755
+ "predicate": "serves",
1756
+ "cardinality": "many-to-many",
1757
+ "strength": "medium",
1758
+ "required": false
1759
+ },
1760
+ "api.mediatype.serves.api.response": {
1761
+ "id": "api.mediatype.serves.api.response",
1762
+ "source_spec_node_id": "api.mediatype",
1763
+ "source_layer": "api",
1764
+ "destination_spec_node_id": "api.response",
1765
+ "destination_layer": "api",
1766
+ "predicate": "serves",
1767
+ "cardinality": "many-to-many",
1768
+ "strength": "medium",
1769
+ "required": false
1770
+ },
1771
+ "api.oauthflow.aggregates.api.tag": {
1772
+ "id": "api.oauthflow.aggregates.api.tag",
1773
+ "source_spec_node_id": "api.oauthflow",
1774
+ "source_layer": "api",
1775
+ "destination_spec_node_id": "api.tag",
1776
+ "destination_layer": "api",
1777
+ "predicate": "aggregates",
1778
+ "cardinality": "many-to-many",
1779
+ "strength": "medium",
1780
+ "required": false
1781
+ },
1782
+ "api.oauthflow.associated-with.api.oauthflows": {
1783
+ "id": "api.oauthflow.associated-with.api.oauthflows",
1784
+ "source_spec_node_id": "api.oauthflow",
1785
+ "source_layer": "api",
1786
+ "destination_spec_node_id": "api.oauthflows",
1787
+ "destination_layer": "api",
1788
+ "predicate": "associated-with",
1789
+ "cardinality": "many-to-many",
1790
+ "strength": "medium",
1791
+ "required": false
1792
+ },
1793
+ "api.oauthflow.associated-with.api.ratelimit": {
1794
+ "id": "api.oauthflow.associated-with.api.ratelimit",
1795
+ "source_spec_node_id": "api.oauthflow",
1796
+ "source_layer": "api",
1797
+ "destination_spec_node_id": "api.ratelimit",
1798
+ "destination_layer": "api",
1799
+ "predicate": "associated-with",
1800
+ "cardinality": "many-to-many",
1801
+ "strength": "medium",
1802
+ "required": false
1803
+ },
1804
+ "api.oauthflow.references.api.server": {
1805
+ "id": "api.oauthflow.references.api.server",
1806
+ "source_spec_node_id": "api.oauthflow",
1807
+ "source_layer": "api",
1808
+ "destination_spec_node_id": "api.server",
1809
+ "destination_layer": "api",
1810
+ "predicate": "references",
1811
+ "cardinality": "many-to-many",
1812
+ "strength": "medium",
1813
+ "required": false
1814
+ },
1815
+ "api.oauthflow.serves.api.operation": {
1816
+ "id": "api.oauthflow.serves.api.operation",
1817
+ "source_spec_node_id": "api.oauthflow",
1818
+ "source_layer": "api",
1819
+ "destination_spec_node_id": "api.operation",
1820
+ "destination_layer": "api",
1821
+ "predicate": "serves",
1822
+ "cardinality": "many-to-many",
1823
+ "strength": "medium",
1824
+ "required": false
1825
+ },
1826
+ "api.oauthflow.serves.api.securityscheme": {
1827
+ "id": "api.oauthflow.serves.api.securityscheme",
1828
+ "source_spec_node_id": "api.oauthflow",
1829
+ "source_layer": "api",
1830
+ "destination_spec_node_id": "api.securityscheme",
1831
+ "destination_layer": "api",
1832
+ "predicate": "serves",
1833
+ "cardinality": "many-to-many",
1834
+ "strength": "medium",
1835
+ "required": false
1836
+ },
1837
+ "api.oauthflows.aggregates.api.oauthflow": {
1838
+ "id": "api.oauthflows.aggregates.api.oauthflow",
1839
+ "source_spec_node_id": "api.oauthflows",
1840
+ "source_layer": "api",
1841
+ "destination_spec_node_id": "api.oauthflow",
1842
+ "destination_layer": "api",
1843
+ "predicate": "aggregates",
1844
+ "cardinality": "many-to-many",
1845
+ "strength": "medium",
1846
+ "required": false
1847
+ },
1848
+ "api.oauthflows.associated-with.api.components": {
1849
+ "id": "api.oauthflows.associated-with.api.components",
1850
+ "source_spec_node_id": "api.oauthflows",
1851
+ "source_layer": "api",
1852
+ "destination_spec_node_id": "api.components",
1853
+ "destination_layer": "api",
1854
+ "predicate": "associated-with",
1855
+ "cardinality": "many-to-many",
1856
+ "strength": "medium",
1857
+ "required": false
1858
+ },
1859
+ "api.oauthflows.associated-with.api.operation": {
1860
+ "id": "api.oauthflows.associated-with.api.operation",
1861
+ "source_spec_node_id": "api.oauthflows",
1862
+ "source_layer": "api",
1863
+ "destination_spec_node_id": "api.operation",
1864
+ "destination_layer": "api",
1865
+ "predicate": "associated-with",
1866
+ "cardinality": "many-to-many",
1867
+ "strength": "medium",
1868
+ "required": false
1869
+ },
1870
+ "api.oauthflows.composes.api.oauthflow": {
1871
+ "id": "api.oauthflows.composes.api.oauthflow",
1872
+ "source_spec_node_id": "api.oauthflows",
1873
+ "source_layer": "api",
1874
+ "destination_spec_node_id": "api.oauthflow",
1875
+ "destination_layer": "api",
1876
+ "predicate": "composes",
1877
+ "cardinality": "many-to-many",
1878
+ "strength": "medium",
1879
+ "required": false
1880
+ },
1881
+ "api.oauthflows.serves.api.securityscheme": {
1882
+ "id": "api.oauthflows.serves.api.securityscheme",
1883
+ "source_spec_node_id": "api.oauthflows",
1884
+ "source_layer": "api",
1885
+ "destination_spec_node_id": "api.securityscheme",
1886
+ "destination_layer": "api",
1887
+ "predicate": "serves",
1888
+ "cardinality": "many-to-many",
1889
+ "strength": "medium",
1890
+ "required": false
1891
+ },
1892
+ "api.openapidocument.aggregates.api.server": {
1893
+ "id": "api.openapidocument.aggregates.api.server",
1894
+ "source_spec_node_id": "api.openapidocument",
1895
+ "source_layer": "api",
1896
+ "destination_spec_node_id": "api.server",
1897
+ "destination_layer": "api",
1898
+ "predicate": "aggregates",
1899
+ "cardinality": "many-to-many",
1900
+ "strength": "medium",
1901
+ "required": false
1902
+ },
1903
+ "api.openapidocument.aggregates.api.tag": {
1904
+ "id": "api.openapidocument.aggregates.api.tag",
1905
+ "source_spec_node_id": "api.openapidocument",
1906
+ "source_layer": "api",
1907
+ "destination_spec_node_id": "api.tag",
1908
+ "destination_layer": "api",
1909
+ "predicate": "aggregates",
1910
+ "cardinality": "many-to-many",
1911
+ "strength": "medium",
1912
+ "required": false
1913
+ },
1914
+ "api.openapidocument.composes.api.components": {
1915
+ "id": "api.openapidocument.composes.api.components",
1916
+ "source_spec_node_id": "api.openapidocument",
1917
+ "source_layer": "api",
1918
+ "destination_spec_node_id": "api.components",
1919
+ "destination_layer": "api",
1920
+ "predicate": "composes",
1921
+ "cardinality": "many-to-many",
1922
+ "strength": "medium",
1923
+ "required": false
1924
+ },
1925
+ "api.openapidocument.composes.api.info": {
1926
+ "id": "api.openapidocument.composes.api.info",
1927
+ "source_spec_node_id": "api.openapidocument",
1928
+ "source_layer": "api",
1929
+ "destination_spec_node_id": "api.info",
1930
+ "destination_layer": "api",
1931
+ "predicate": "composes",
1932
+ "cardinality": "many-to-many",
1933
+ "strength": "medium",
1934
+ "required": false
1935
+ },
1936
+ "api.openapidocument.composes.api.paths": {
1937
+ "id": "api.openapidocument.composes.api.paths",
1938
+ "source_spec_node_id": "api.openapidocument",
1939
+ "source_layer": "api",
1940
+ "destination_spec_node_id": "api.paths",
1941
+ "destination_layer": "api",
1942
+ "predicate": "composes",
1943
+ "cardinality": "many-to-many",
1944
+ "strength": "medium",
1945
+ "required": false
1946
+ },
1947
+ "api.openapidocument.composes.api.responses": {
1948
+ "id": "api.openapidocument.composes.api.responses",
1949
+ "source_spec_node_id": "api.openapidocument",
1950
+ "source_layer": "api",
1951
+ "destination_spec_node_id": "api.responses",
1952
+ "destination_layer": "api",
1953
+ "predicate": "composes",
1954
+ "cardinality": "many-to-many",
1955
+ "strength": "medium",
1956
+ "required": false
1957
+ },
1958
+ "api.openapidocument.composes.api.schema": {
1959
+ "id": "api.openapidocument.composes.api.schema",
1960
+ "source_spec_node_id": "api.openapidocument",
1961
+ "source_layer": "api",
1962
+ "destination_spec_node_id": "api.schema",
1963
+ "destination_layer": "api",
1964
+ "predicate": "composes",
1965
+ "cardinality": "many-to-many",
1966
+ "strength": "medium",
1967
+ "required": false
1968
+ },
1969
+ "api.openapidocument.depends-on.technology.technologyservice": {
1970
+ "id": "api.openapidocument.depends-on.technology.technologyservice",
1971
+ "source_spec_node_id": "api.openapidocument",
1972
+ "source_layer": "api",
1973
+ "destination_spec_node_id": "technology.technologyservice",
1974
+ "destination_layer": "technology",
1975
+ "predicate": "depends-on",
1976
+ "cardinality": "many-to-many",
1977
+ "strength": "medium",
1978
+ "required": false
1979
+ },
1980
+ "api.openapidocument.realizes.application.applicationservice": {
1981
+ "id": "api.openapidocument.realizes.application.applicationservice",
1982
+ "source_spec_node_id": "api.openapidocument",
1983
+ "source_layer": "api",
1984
+ "destination_spec_node_id": "application.applicationservice",
1985
+ "destination_layer": "application",
1986
+ "predicate": "realizes",
1987
+ "cardinality": "many-to-many",
1988
+ "strength": "medium",
1989
+ "required": false
1990
+ },
1991
+ "api.openapidocument.realizes.business.businessservice": {
1992
+ "id": "api.openapidocument.realizes.business.businessservice",
1993
+ "source_spec_node_id": "api.openapidocument",
1994
+ "source_layer": "api",
1995
+ "destination_spec_node_id": "business.businessservice",
1996
+ "destination_layer": "business",
1997
+ "predicate": "realizes",
1998
+ "cardinality": "many-to-many",
1999
+ "strength": "medium",
2000
+ "required": false
2001
+ },
2002
+ "api.openapidocument.references.api.externaldocumentation": {
2003
+ "id": "api.openapidocument.references.api.externaldocumentation",
2004
+ "source_spec_node_id": "api.openapidocument",
2005
+ "source_layer": "api",
2006
+ "destination_spec_node_id": "api.externaldocumentation",
2007
+ "destination_layer": "api",
2008
+ "predicate": "references",
2009
+ "cardinality": "many-to-many",
2010
+ "strength": "medium",
2011
+ "required": false
2012
+ },
2013
+ "api.openapidocument.requires.api.securityscheme": {
2014
+ "id": "api.openapidocument.requires.api.securityscheme",
2015
+ "source_spec_node_id": "api.openapidocument",
2016
+ "source_layer": "api",
2017
+ "destination_spec_node_id": "api.securityscheme",
2018
+ "destination_layer": "api",
2019
+ "predicate": "requires",
2020
+ "cardinality": "many-to-many",
2021
+ "strength": "medium",
2022
+ "required": false
2023
+ },
2024
+ "api.openapidocument.serves.application.applicationcomponent": {
2025
+ "id": "api.openapidocument.serves.application.applicationcomponent",
2026
+ "source_spec_node_id": "api.openapidocument",
2027
+ "source_layer": "api",
2028
+ "destination_spec_node_id": "application.applicationcomponent",
2029
+ "destination_layer": "application",
2030
+ "predicate": "serves",
2031
+ "cardinality": "many-to-many",
2032
+ "strength": "medium",
2033
+ "required": false
2034
+ },
2035
+ "api.openapidocument.serves.motivation.stakeholder": {
2036
+ "id": "api.openapidocument.serves.motivation.stakeholder",
2037
+ "source_spec_node_id": "api.openapidocument",
2038
+ "source_layer": "api",
2039
+ "destination_spec_node_id": "motivation.stakeholder",
2040
+ "destination_layer": "motivation",
2041
+ "predicate": "serves",
2042
+ "cardinality": "many-to-many",
2043
+ "strength": "medium",
2044
+ "required": false
2045
+ },
2046
+ "api.operation.aggregates.api.parameter": {
2047
+ "id": "api.operation.aggregates.api.parameter",
2048
+ "source_spec_node_id": "api.operation",
2049
+ "source_layer": "api",
2050
+ "destination_spec_node_id": "api.parameter",
2051
+ "destination_layer": "api",
2052
+ "predicate": "aggregates",
2053
+ "cardinality": "many-to-many",
2054
+ "strength": "medium",
2055
+ "required": false
2056
+ },
2057
+ "api.operation.aggregates.api.requestbody": {
2058
+ "id": "api.operation.aggregates.api.requestbody",
2059
+ "source_spec_node_id": "api.operation",
2060
+ "source_layer": "api",
2061
+ "destination_spec_node_id": "api.requestbody",
2062
+ "destination_layer": "api",
2063
+ "predicate": "aggregates",
2064
+ "cardinality": "many-to-many",
2065
+ "strength": "medium",
2066
+ "required": false
2067
+ },
2068
+ "api.operation.aggregates.api.server": {
2069
+ "id": "api.operation.aggregates.api.server",
2070
+ "source_spec_node_id": "api.operation",
2071
+ "source_layer": "api",
2072
+ "destination_spec_node_id": "api.server",
2073
+ "destination_layer": "api",
2074
+ "predicate": "aggregates",
2075
+ "cardinality": "many-to-many",
2076
+ "strength": "medium",
2077
+ "required": false
2078
+ },
2079
+ "api.operation.aggregates.api.tag": {
2080
+ "id": "api.operation.aggregates.api.tag",
2081
+ "source_spec_node_id": "api.operation",
2082
+ "source_layer": "api",
2083
+ "destination_spec_node_id": "api.tag",
2084
+ "destination_layer": "api",
2085
+ "predicate": "aggregates",
2086
+ "cardinality": "many-to-many",
2087
+ "strength": "medium",
2088
+ "required": false
2089
+ },
2090
+ "api.operation.composes.api.paths": {
2091
+ "id": "api.operation.composes.api.paths",
2092
+ "source_spec_node_id": "api.operation",
2093
+ "source_layer": "api",
2094
+ "destination_spec_node_id": "api.paths",
2095
+ "destination_layer": "api",
2096
+ "predicate": "composes",
2097
+ "cardinality": "many-to-many",
2098
+ "strength": "medium",
2099
+ "required": false
2100
+ },
2101
+ "api.operation.composes.api.responses": {
2102
+ "id": "api.operation.composes.api.responses",
2103
+ "source_spec_node_id": "api.operation",
2104
+ "source_layer": "api",
2105
+ "destination_spec_node_id": "api.responses",
2106
+ "destination_layer": "api",
2107
+ "predicate": "composes",
2108
+ "cardinality": "many-to-many",
2109
+ "strength": "medium",
2110
+ "required": false
2111
+ },
2112
+ "api.operation.composes.api.schema": {
2113
+ "id": "api.operation.composes.api.schema",
2114
+ "source_spec_node_id": "api.operation",
2115
+ "source_layer": "api",
2116
+ "destination_spec_node_id": "api.schema",
2117
+ "destination_layer": "api",
2118
+ "predicate": "composes",
2119
+ "cardinality": "many-to-many",
2120
+ "strength": "medium",
2121
+ "required": false
2122
+ },
2123
+ "api.operation.delivers.api.response": {
2124
+ "id": "api.operation.delivers.api.response",
2125
+ "source_spec_node_id": "api.operation",
2126
+ "source_layer": "api",
2127
+ "destination_spec_node_id": "api.response",
2128
+ "destination_layer": "api",
2129
+ "predicate": "delivers",
2130
+ "cardinality": "many-to-many",
2131
+ "strength": "medium",
2132
+ "required": false
2133
+ },
2134
+ "api.operation.realizes.application.applicationfunction": {
2135
+ "id": "api.operation.realizes.application.applicationfunction",
2136
+ "source_spec_node_id": "api.operation",
2137
+ "source_layer": "api",
2138
+ "destination_spec_node_id": "application.applicationfunction",
2139
+ "destination_layer": "application",
2140
+ "predicate": "realizes",
2141
+ "cardinality": "many-to-many",
2142
+ "strength": "medium",
2143
+ "required": false
2144
+ },
2145
+ "api.operation.realizes.business.businessprocess": {
2146
+ "id": "api.operation.realizes.business.businessprocess",
2147
+ "source_spec_node_id": "api.operation",
2148
+ "source_layer": "api",
2149
+ "destination_spec_node_id": "business.businessprocess",
2150
+ "destination_layer": "business",
2151
+ "predicate": "realizes",
2152
+ "cardinality": "many-to-many",
2153
+ "strength": "medium",
2154
+ "required": false
2155
+ },
2156
+ "api.operation.realizes.motivation.goal": {
2157
+ "id": "api.operation.realizes.motivation.goal",
2158
+ "source_spec_node_id": "api.operation",
2159
+ "source_layer": "api",
2160
+ "destination_spec_node_id": "motivation.goal",
2161
+ "destination_layer": "motivation",
2162
+ "predicate": "realizes",
2163
+ "cardinality": "many-to-many",
2164
+ "strength": "medium",
2165
+ "required": false
2166
+ },
2167
+ "api.operation.realizes.motivation.outcome": {
2168
+ "id": "api.operation.realizes.motivation.outcome",
2169
+ "source_spec_node_id": "api.operation",
2170
+ "source_layer": "api",
2171
+ "destination_spec_node_id": "motivation.outcome",
2172
+ "destination_layer": "motivation",
2173
+ "predicate": "realizes",
2174
+ "cardinality": "many-to-many",
2175
+ "strength": "medium",
2176
+ "required": false
2177
+ },
2178
+ "api.operation.references.application.applicationservice": {
2179
+ "id": "api.operation.references.application.applicationservice",
2180
+ "source_spec_node_id": "api.operation",
2181
+ "source_layer": "api",
2182
+ "destination_spec_node_id": "application.applicationservice",
2183
+ "destination_layer": "application",
2184
+ "predicate": "references",
2185
+ "cardinality": "many-to-many",
2186
+ "strength": "medium",
2187
+ "required": false
2188
+ },
2189
+ "api.operation.references.business.businessinterface": {
2190
+ "id": "api.operation.references.business.businessinterface",
2191
+ "source_spec_node_id": "api.operation",
2192
+ "source_layer": "api",
2193
+ "destination_spec_node_id": "business.businessinterface",
2194
+ "destination_layer": "business",
2195
+ "predicate": "references",
2196
+ "cardinality": "many-to-many",
2197
+ "strength": "medium",
2198
+ "required": false
2199
+ },
2200
+ "api.operation.references.business.businessservice": {
2201
+ "id": "api.operation.references.business.businessservice",
2202
+ "source_spec_node_id": "api.operation",
2203
+ "source_layer": "api",
2204
+ "destination_spec_node_id": "business.businessservice",
2205
+ "destination_layer": "business",
2206
+ "predicate": "references",
2207
+ "cardinality": "many-to-many",
2208
+ "strength": "medium",
2209
+ "required": false
2210
+ },
2211
+ "api.operation.references.api.externaldocumentation": {
2212
+ "id": "api.operation.references.api.externaldocumentation",
2213
+ "source_spec_node_id": "api.operation",
2214
+ "source_layer": "api",
2215
+ "destination_spec_node_id": "api.externaldocumentation",
2216
+ "destination_layer": "api",
2217
+ "predicate": "references",
2218
+ "cardinality": "many-to-many",
2219
+ "strength": "medium",
2220
+ "required": false
2221
+ },
2222
+ "api.operation.references.api.operation": {
2223
+ "id": "api.operation.references.api.operation",
2224
+ "source_spec_node_id": "api.operation",
2225
+ "source_layer": "api",
2226
+ "destination_spec_node_id": "api.operation",
2227
+ "destination_layer": "api",
2228
+ "predicate": "references",
2229
+ "cardinality": "many-to-many",
2230
+ "strength": "medium",
2231
+ "required": false
2232
+ },
2233
+ "api.operation.references.api.schema": {
2234
+ "id": "api.operation.references.api.schema",
2235
+ "source_spec_node_id": "api.operation",
2236
+ "source_layer": "api",
2237
+ "destination_spec_node_id": "api.schema",
2238
+ "destination_layer": "api",
2239
+ "predicate": "references",
2240
+ "cardinality": "many-to-many",
2241
+ "strength": "medium",
2242
+ "required": false
2243
+ },
2244
+ "api.operation.references.security.secureresource": {
2245
+ "id": "api.operation.references.security.secureresource",
2246
+ "source_spec_node_id": "api.operation",
2247
+ "source_layer": "api",
2248
+ "destination_spec_node_id": "security.secureresource",
2249
+ "destination_layer": "security",
2250
+ "predicate": "references",
2251
+ "cardinality": "many-to-many",
2252
+ "strength": "medium",
2253
+ "required": false
2254
+ },
2255
+ "api.operation.references.api.tag": {
2256
+ "id": "api.operation.references.api.tag",
2257
+ "source_spec_node_id": "api.operation",
2258
+ "source_layer": "api",
2259
+ "destination_spec_node_id": "api.tag",
2260
+ "destination_layer": "api",
2261
+ "predicate": "references",
2262
+ "cardinality": "many-to-many",
2263
+ "strength": "medium",
2264
+ "required": false
2265
+ },
2266
+ "api.operation.references.security.threat": {
2267
+ "id": "api.operation.references.security.threat",
2268
+ "source_spec_node_id": "api.operation",
2269
+ "source_layer": "api",
2270
+ "destination_spec_node_id": "security.threat",
2271
+ "destination_layer": "security",
2272
+ "predicate": "references",
2273
+ "cardinality": "many-to-many",
2274
+ "strength": "medium",
2275
+ "required": false
2276
+ },
2277
+ "api.operation.references.apm.traceconfiguration": {
2278
+ "id": "api.operation.references.apm.traceconfiguration",
2279
+ "source_spec_node_id": "api.operation",
2280
+ "source_layer": "api",
2281
+ "destination_spec_node_id": "apm.traceconfiguration",
2282
+ "destination_layer": "apm",
2283
+ "predicate": "references",
2284
+ "cardinality": "many-to-many",
2285
+ "strength": "medium",
2286
+ "required": false
2287
+ },
2288
+ "api.operation.requires.security.permission": {
2289
+ "id": "api.operation.requires.security.permission",
2290
+ "source_spec_node_id": "api.operation",
2291
+ "source_layer": "api",
2292
+ "destination_spec_node_id": "security.permission",
2293
+ "destination_layer": "security",
2294
+ "predicate": "requires",
2295
+ "cardinality": "many-to-many",
2296
+ "strength": "medium",
2297
+ "required": false
2298
+ },
2299
+ "api.operation.requires.security.securitypolicy": {
2300
+ "id": "api.operation.requires.security.securitypolicy",
2301
+ "source_spec_node_id": "api.operation",
2302
+ "source_layer": "api",
2303
+ "destination_spec_node_id": "security.securitypolicy",
2304
+ "destination_layer": "security",
2305
+ "predicate": "requires",
2306
+ "cardinality": "many-to-many",
2307
+ "strength": "medium",
2308
+ "required": false
2309
+ },
2310
+ "api.operation.satisfies.motivation.constraint": {
2311
+ "id": "api.operation.satisfies.motivation.constraint",
2312
+ "source_spec_node_id": "api.operation",
2313
+ "source_layer": "api",
2314
+ "destination_spec_node_id": "motivation.constraint",
2315
+ "destination_layer": "motivation",
2316
+ "predicate": "satisfies",
2317
+ "cardinality": "many-to-many",
2318
+ "strength": "medium",
2319
+ "required": false
2320
+ },
2321
+ "api.operation.satisfies.security.countermeasure": {
2322
+ "id": "api.operation.satisfies.security.countermeasure",
2323
+ "source_spec_node_id": "api.operation",
2324
+ "source_layer": "api",
2325
+ "destination_spec_node_id": "security.countermeasure",
2326
+ "destination_layer": "security",
2327
+ "predicate": "satisfies",
2328
+ "cardinality": "many-to-many",
2329
+ "strength": "medium",
2330
+ "required": false
2331
+ },
2332
+ "api.operation.satisfies.motivation.requirement": {
2333
+ "id": "api.operation.satisfies.motivation.requirement",
2334
+ "source_spec_node_id": "api.operation",
2335
+ "source_layer": "api",
2336
+ "destination_spec_node_id": "motivation.requirement",
2337
+ "destination_layer": "motivation",
2338
+ "predicate": "satisfies",
2339
+ "cardinality": "many-to-many",
2340
+ "strength": "medium",
2341
+ "required": false
2342
+ },
2343
+ "api.operation.serves.business.businessrole": {
2344
+ "id": "api.operation.serves.business.businessrole",
2345
+ "source_spec_node_id": "api.operation",
2346
+ "source_layer": "api",
2347
+ "destination_spec_node_id": "business.businessrole",
2348
+ "destination_layer": "business",
2349
+ "predicate": "serves",
2350
+ "cardinality": "many-to-many",
2351
+ "strength": "medium",
2352
+ "required": false
2353
+ },
2354
+ "api.operation.triggers.application.applicationevent": {
2355
+ "id": "api.operation.triggers.application.applicationevent",
2356
+ "source_spec_node_id": "api.operation",
2357
+ "source_layer": "api",
2358
+ "destination_spec_node_id": "application.applicationevent",
2359
+ "destination_layer": "application",
2360
+ "predicate": "triggers",
2361
+ "cardinality": "many-to-many",
2362
+ "strength": "medium",
2363
+ "required": false
2364
+ },
2365
+ "api.operation.triggers.business.businessprocess": {
2366
+ "id": "api.operation.triggers.business.businessprocess",
2367
+ "source_spec_node_id": "api.operation",
2368
+ "source_layer": "api",
2369
+ "destination_spec_node_id": "business.businessprocess",
2370
+ "destination_layer": "business",
2371
+ "predicate": "triggers",
2372
+ "cardinality": "many-to-many",
2373
+ "strength": "medium",
2374
+ "required": false
2375
+ },
2376
+ "api.operation.triggers.api.callback": {
2377
+ "id": "api.operation.triggers.api.callback",
2378
+ "source_spec_node_id": "api.operation",
2379
+ "source_layer": "api",
2380
+ "destination_spec_node_id": "api.callback",
2381
+ "destination_layer": "api",
2382
+ "predicate": "triggers",
2383
+ "cardinality": "many-to-many",
2384
+ "strength": "medium",
2385
+ "required": false
2386
+ },
2387
+ "api.operation.uses.application.applicationinterface": {
2388
+ "id": "api.operation.uses.application.applicationinterface",
2389
+ "source_spec_node_id": "api.operation",
2390
+ "source_layer": "api",
2391
+ "destination_spec_node_id": "application.applicationinterface",
2392
+ "destination_layer": "application",
2393
+ "predicate": "uses",
2394
+ "cardinality": "many-to-many",
2395
+ "strength": "medium",
2396
+ "required": false
2397
+ },
2398
+ "api.operation.uses.api.securityscheme": {
2399
+ "id": "api.operation.uses.api.securityscheme",
2400
+ "source_spec_node_id": "api.operation",
2401
+ "source_layer": "api",
2402
+ "destination_spec_node_id": "api.securityscheme",
2403
+ "destination_layer": "api",
2404
+ "predicate": "uses",
2405
+ "cardinality": "many-to-many",
2406
+ "strength": "medium",
2407
+ "required": false
2408
+ },
2409
+ "api.operation.uses.technology.technologyservice": {
2410
+ "id": "api.operation.uses.technology.technologyservice",
2411
+ "source_spec_node_id": "api.operation",
2412
+ "source_layer": "api",
2413
+ "destination_spec_node_id": "technology.technologyservice",
2414
+ "destination_layer": "technology",
2415
+ "predicate": "uses",
2416
+ "cardinality": "many-to-many",
2417
+ "strength": "medium",
2418
+ "required": false
2419
+ },
2420
+ "api.parameter.references.api.example": {
2421
+ "id": "api.parameter.references.api.example",
2422
+ "source_spec_node_id": "api.parameter",
2423
+ "source_layer": "api",
2424
+ "destination_spec_node_id": "api.example",
2425
+ "destination_layer": "api",
2426
+ "predicate": "references",
2427
+ "cardinality": "many-to-many",
2428
+ "strength": "medium",
2429
+ "required": false
2430
+ },
2431
+ "api.parameter.references.api.operation": {
2432
+ "id": "api.parameter.references.api.operation",
2433
+ "source_spec_node_id": "api.parameter",
2434
+ "source_layer": "api",
2435
+ "destination_spec_node_id": "api.operation",
2436
+ "destination_layer": "api",
2437
+ "predicate": "references",
2438
+ "cardinality": "many-to-many",
2439
+ "strength": "medium",
2440
+ "required": false
2441
+ },
2442
+ "api.parameter.references.api.schema": {
2443
+ "id": "api.parameter.references.api.schema",
2444
+ "source_spec_node_id": "api.parameter",
2445
+ "source_layer": "api",
2446
+ "destination_spec_node_id": "api.schema",
2447
+ "destination_layer": "api",
2448
+ "predicate": "references",
2449
+ "cardinality": "many-to-many",
2450
+ "strength": "medium",
2451
+ "required": false
2452
+ },
2453
+ "api.parameter.references.api.tag": {
2454
+ "id": "api.parameter.references.api.tag",
2455
+ "source_spec_node_id": "api.parameter",
2456
+ "source_layer": "api",
2457
+ "destination_spec_node_id": "api.tag",
2458
+ "destination_layer": "api",
2459
+ "predicate": "references",
2460
+ "cardinality": "many-to-many",
2461
+ "strength": "medium",
2462
+ "required": false
2463
+ },
2464
+ "api.pathitem.aggregates.api.parameter": {
2465
+ "id": "api.pathitem.aggregates.api.parameter",
2466
+ "source_spec_node_id": "api.pathitem",
2467
+ "source_layer": "api",
2468
+ "destination_spec_node_id": "api.parameter",
2469
+ "destination_layer": "api",
2470
+ "predicate": "aggregates",
2471
+ "cardinality": "many-to-many",
2472
+ "strength": "medium",
2473
+ "required": false
2474
+ },
2475
+ "api.pathitem.aggregates.api.server": {
2476
+ "id": "api.pathitem.aggregates.api.server",
2477
+ "source_spec_node_id": "api.pathitem",
2478
+ "source_layer": "api",
2479
+ "destination_spec_node_id": "api.server",
2480
+ "destination_layer": "api",
2481
+ "predicate": "aggregates",
2482
+ "cardinality": "many-to-many",
2483
+ "strength": "medium",
2484
+ "required": false
2485
+ },
2486
+ "api.pathitem.composes.api.operation": {
2487
+ "id": "api.pathitem.composes.api.operation",
2488
+ "source_spec_node_id": "api.pathitem",
2489
+ "source_layer": "api",
2490
+ "destination_spec_node_id": "api.operation",
2491
+ "destination_layer": "api",
2492
+ "predicate": "composes",
2493
+ "cardinality": "many-to-many",
2494
+ "strength": "medium",
2495
+ "required": false
2496
+ },
2497
+ "api.pathitem.depends-on.technology.technologyservice": {
2498
+ "id": "api.pathitem.depends-on.technology.technologyservice",
2499
+ "source_spec_node_id": "api.pathitem",
2500
+ "source_layer": "api",
2501
+ "destination_spec_node_id": "technology.technologyservice",
2502
+ "destination_layer": "technology",
2503
+ "predicate": "depends-on",
2504
+ "cardinality": "many-to-many",
2505
+ "strength": "medium",
2506
+ "required": false
2507
+ },
2508
+ "api.pathitem.realizes.business.businessfunction": {
2509
+ "id": "api.pathitem.realizes.business.businessfunction",
2510
+ "source_spec_node_id": "api.pathitem",
2511
+ "source_layer": "api",
2512
+ "destination_spec_node_id": "business.businessfunction",
2513
+ "destination_layer": "business",
2514
+ "predicate": "realizes",
2515
+ "cardinality": "many-to-many",
2516
+ "strength": "medium",
2517
+ "required": false
2518
+ },
2519
+ "api.pathitem.references.api.externaldocumentation": {
2520
+ "id": "api.pathitem.references.api.externaldocumentation",
2521
+ "source_spec_node_id": "api.pathitem",
2522
+ "source_layer": "api",
2523
+ "destination_spec_node_id": "api.externaldocumentation",
2524
+ "destination_layer": "api",
2525
+ "predicate": "references",
2526
+ "cardinality": "many-to-many",
2527
+ "strength": "medium",
2528
+ "required": false
2529
+ },
2530
+ "api.pathitem.references.api.pathitem": {
2531
+ "id": "api.pathitem.references.api.pathitem",
2532
+ "source_spec_node_id": "api.pathitem",
2533
+ "source_layer": "api",
2534
+ "destination_spec_node_id": "api.pathitem",
2535
+ "destination_layer": "api",
2536
+ "predicate": "references",
2537
+ "cardinality": "many-to-many",
2538
+ "strength": "medium",
2539
+ "required": false
2540
+ },
2541
+ "api.pathitem.requires.security.securitypolicy": {
2542
+ "id": "api.pathitem.requires.security.securitypolicy",
2543
+ "source_spec_node_id": "api.pathitem",
2544
+ "source_layer": "api",
2545
+ "destination_spec_node_id": "security.securitypolicy",
2546
+ "destination_layer": "security",
2547
+ "predicate": "requires",
2548
+ "cardinality": "many-to-many",
2549
+ "strength": "medium",
2550
+ "required": false
2551
+ },
2552
+ "api.pathitem.serves.application.applicationcomponent": {
2553
+ "id": "api.pathitem.serves.application.applicationcomponent",
2554
+ "source_spec_node_id": "api.pathitem",
2555
+ "source_layer": "api",
2556
+ "destination_spec_node_id": "application.applicationcomponent",
2557
+ "destination_layer": "application",
2558
+ "predicate": "serves",
2559
+ "cardinality": "many-to-many",
2560
+ "strength": "medium",
2561
+ "required": false
2562
+ },
2563
+ "api.paths.aggregates.api.pathitem": {
2564
+ "id": "api.paths.aggregates.api.pathitem",
2565
+ "source_spec_node_id": "api.paths",
2566
+ "source_layer": "api",
2567
+ "destination_spec_node_id": "api.pathitem",
2568
+ "destination_layer": "api",
2569
+ "predicate": "aggregates",
2570
+ "cardinality": "many-to-many",
2571
+ "strength": "medium",
2572
+ "required": false
2573
+ },
2574
+ "api.paths.aggregates.api.server": {
2575
+ "id": "api.paths.aggregates.api.server",
2576
+ "source_spec_node_id": "api.paths",
2577
+ "source_layer": "api",
2578
+ "destination_spec_node_id": "api.server",
2579
+ "destination_layer": "api",
2580
+ "predicate": "aggregates",
2581
+ "cardinality": "many-to-many",
2582
+ "strength": "medium",
2583
+ "required": false
2584
+ },
2585
+ "api.paths.associated-with.api.ratelimit": {
2586
+ "id": "api.paths.associated-with.api.ratelimit",
2587
+ "source_spec_node_id": "api.paths",
2588
+ "source_layer": "api",
2589
+ "destination_spec_node_id": "api.ratelimit",
2590
+ "destination_layer": "api",
2591
+ "predicate": "associated-with",
2592
+ "cardinality": "many-to-many",
2593
+ "strength": "medium",
2594
+ "required": false
2595
+ },
2596
+ "api.paths.composes.api.pathitem": {
2597
+ "id": "api.paths.composes.api.pathitem",
2598
+ "source_spec_node_id": "api.paths",
2599
+ "source_layer": "api",
2600
+ "destination_spec_node_id": "api.pathitem",
2601
+ "destination_layer": "api",
2602
+ "predicate": "composes",
2603
+ "cardinality": "many-to-many",
2604
+ "strength": "medium",
2605
+ "required": false
2606
+ },
2607
+ "api.paths.references.api.externaldocumentation": {
2608
+ "id": "api.paths.references.api.externaldocumentation",
2609
+ "source_spec_node_id": "api.paths",
2610
+ "source_layer": "api",
2611
+ "destination_spec_node_id": "api.externaldocumentation",
2612
+ "destination_layer": "api",
2613
+ "predicate": "references",
2614
+ "cardinality": "many-to-many",
2615
+ "strength": "medium",
2616
+ "required": false
2617
+ },
2618
+ "api.paths.references.api.tag": {
2619
+ "id": "api.paths.references.api.tag",
2620
+ "source_spec_node_id": "api.paths",
2621
+ "source_layer": "api",
2622
+ "destination_spec_node_id": "api.tag",
2623
+ "destination_layer": "api",
2624
+ "predicate": "references",
2625
+ "cardinality": "many-to-many",
2626
+ "strength": "medium",
2627
+ "required": false
2628
+ },
2629
+ "api.paths.serves.api.operation": {
2630
+ "id": "api.paths.serves.api.operation",
2631
+ "source_spec_node_id": "api.paths",
2632
+ "source_layer": "api",
2633
+ "destination_spec_node_id": "api.operation",
2634
+ "destination_layer": "api",
2635
+ "predicate": "serves",
2636
+ "cardinality": "many-to-many",
2637
+ "strength": "medium",
2638
+ "required": false
2639
+ },
2640
+ "api.ratelimit.associated-with.api.header": {
2641
+ "id": "api.ratelimit.associated-with.api.header",
2642
+ "source_spec_node_id": "api.ratelimit",
2643
+ "source_layer": "api",
2644
+ "destination_spec_node_id": "api.header",
2645
+ "destination_layer": "api",
2646
+ "predicate": "associated-with",
2647
+ "cardinality": "many-to-many",
2648
+ "strength": "medium",
2649
+ "required": false
2650
+ },
2651
+ "api.ratelimit.associated-with.api.securityscheme": {
2652
+ "id": "api.ratelimit.associated-with.api.securityscheme",
2653
+ "source_spec_node_id": "api.ratelimit",
2654
+ "source_layer": "api",
2655
+ "destination_spec_node_id": "api.securityscheme",
2656
+ "destination_layer": "api",
2657
+ "predicate": "associated-with",
2658
+ "cardinality": "many-to-many",
2659
+ "strength": "medium",
2660
+ "required": false
2661
+ },
2662
+ "api.ratelimit.governs.api.operation": {
2663
+ "id": "api.ratelimit.governs.api.operation",
2664
+ "source_spec_node_id": "api.ratelimit",
2665
+ "source_layer": "api",
2666
+ "destination_spec_node_id": "api.operation",
2667
+ "destination_layer": "api",
2668
+ "predicate": "governs",
2669
+ "cardinality": "many-to-many",
2670
+ "strength": "medium",
2671
+ "required": false
2672
+ },
2673
+ "api.ratelimit.implements.security.countermeasure": {
2674
+ "id": "api.ratelimit.implements.security.countermeasure",
2675
+ "source_spec_node_id": "api.ratelimit",
2676
+ "source_layer": "api",
2677
+ "destination_spec_node_id": "security.countermeasure",
2678
+ "destination_layer": "security",
2679
+ "predicate": "implements",
2680
+ "cardinality": "many-to-many",
2681
+ "strength": "medium",
2682
+ "required": false
2683
+ },
2684
+ "api.ratelimit.satisfies.motivation.constraint": {
2685
+ "id": "api.ratelimit.satisfies.motivation.constraint",
2686
+ "source_spec_node_id": "api.ratelimit",
2687
+ "source_layer": "api",
2688
+ "destination_spec_node_id": "motivation.constraint",
2689
+ "destination_layer": "motivation",
2690
+ "predicate": "satisfies",
2691
+ "cardinality": "many-to-many",
2692
+ "strength": "medium",
2693
+ "required": false
2694
+ },
2695
+ "api.ratelimit.serves.api.operation": {
2696
+ "id": "api.ratelimit.serves.api.operation",
2697
+ "source_spec_node_id": "api.ratelimit",
2698
+ "source_layer": "api",
2699
+ "destination_spec_node_id": "api.operation",
2700
+ "destination_layer": "api",
2701
+ "predicate": "serves",
2702
+ "cardinality": "many-to-many",
2703
+ "strength": "medium",
2704
+ "required": false
2705
+ },
2706
+ "api.ratelimit.serves.api.pathitem": {
2707
+ "id": "api.ratelimit.serves.api.pathitem",
2708
+ "source_spec_node_id": "api.ratelimit",
2709
+ "source_layer": "api",
2710
+ "destination_spec_node_id": "api.pathitem",
2711
+ "destination_layer": "api",
2712
+ "predicate": "serves",
2713
+ "cardinality": "many-to-many",
2714
+ "strength": "medium",
2715
+ "required": false
2716
+ },
2717
+ "api.ratelimit.specializes.api.ratelimit": {
2718
+ "id": "api.ratelimit.specializes.api.ratelimit",
2719
+ "source_spec_node_id": "api.ratelimit",
2720
+ "source_layer": "api",
2721
+ "destination_spec_node_id": "api.ratelimit",
2722
+ "destination_layer": "api",
2723
+ "predicate": "specializes",
2724
+ "cardinality": "many-to-many",
2725
+ "strength": "medium",
2726
+ "required": false
2727
+ },
2728
+ "api.ratelimit.triggers.api.response": {
2729
+ "id": "api.ratelimit.triggers.api.response",
2730
+ "source_spec_node_id": "api.ratelimit",
2731
+ "source_layer": "api",
2732
+ "destination_spec_node_id": "api.response",
2733
+ "destination_layer": "api",
2734
+ "predicate": "triggers",
2735
+ "cardinality": "many-to-many",
2736
+ "strength": "medium",
2737
+ "required": false
2738
+ },
2739
+ "api.ratelimit.uses.technology.systemsoftware": {
2740
+ "id": "api.ratelimit.uses.technology.systemsoftware",
2741
+ "source_spec_node_id": "api.ratelimit",
2742
+ "source_layer": "api",
2743
+ "destination_spec_node_id": "technology.systemsoftware",
2744
+ "destination_layer": "technology",
2745
+ "predicate": "uses",
2746
+ "cardinality": "many-to-many",
2747
+ "strength": "medium",
2748
+ "required": false
2749
+ },
2750
+ "api.requestbody.aggregates.api.example": {
2751
+ "id": "api.requestbody.aggregates.api.example",
2752
+ "source_spec_node_id": "api.requestbody",
2753
+ "source_layer": "api",
2754
+ "destination_spec_node_id": "api.example",
2755
+ "destination_layer": "api",
2756
+ "predicate": "aggregates",
2757
+ "cardinality": "many-to-many",
2758
+ "strength": "medium",
2759
+ "required": false
2760
+ },
2761
+ "api.requestbody.aggregates.api.mediatype": {
2762
+ "id": "api.requestbody.aggregates.api.mediatype",
2763
+ "source_spec_node_id": "api.requestbody",
2764
+ "source_layer": "api",
2765
+ "destination_spec_node_id": "api.mediatype",
2766
+ "destination_layer": "api",
2767
+ "predicate": "aggregates",
2768
+ "cardinality": "many-to-many",
2769
+ "strength": "medium",
2770
+ "required": false
2771
+ },
2772
+ "api.requestbody.associated-with.api.encoding": {
2773
+ "id": "api.requestbody.associated-with.api.encoding",
2774
+ "source_spec_node_id": "api.requestbody",
2775
+ "source_layer": "api",
2776
+ "destination_spec_node_id": "api.encoding",
2777
+ "destination_layer": "api",
2778
+ "predicate": "associated-with",
2779
+ "cardinality": "many-to-many",
2780
+ "strength": "medium",
2781
+ "required": false
2782
+ },
2783
+ "api.requestbody.composes.api.mediatype": {
2784
+ "id": "api.requestbody.composes.api.mediatype",
2785
+ "source_spec_node_id": "api.requestbody",
2786
+ "source_layer": "api",
2787
+ "destination_spec_node_id": "api.mediatype",
2788
+ "destination_layer": "api",
2789
+ "predicate": "composes",
2790
+ "cardinality": "many-to-many",
2791
+ "strength": "medium",
2792
+ "required": false
2793
+ },
2794
+ "api.requestbody.maps-to.business.businessobject": {
2795
+ "id": "api.requestbody.maps-to.business.businessobject",
2796
+ "source_spec_node_id": "api.requestbody",
2797
+ "source_layer": "api",
2798
+ "destination_spec_node_id": "business.businessobject",
2799
+ "destination_layer": "business",
2800
+ "predicate": "maps-to",
2801
+ "cardinality": "many-to-many",
2802
+ "strength": "medium",
2803
+ "required": false
2804
+ },
2805
+ "api.requestbody.references.api.schema": {
2806
+ "id": "api.requestbody.references.api.schema",
2807
+ "source_spec_node_id": "api.requestbody",
2808
+ "source_layer": "api",
2809
+ "destination_spec_node_id": "api.schema",
2810
+ "destination_layer": "api",
2811
+ "predicate": "references",
2812
+ "cardinality": "many-to-many",
2813
+ "strength": "medium",
2814
+ "required": false
2815
+ },
2816
+ "api.requestbody.serves.api.operation": {
2817
+ "id": "api.requestbody.serves.api.operation",
2818
+ "source_spec_node_id": "api.requestbody",
2819
+ "source_layer": "api",
2820
+ "destination_spec_node_id": "api.operation",
2821
+ "destination_layer": "api",
2822
+ "predicate": "serves",
2823
+ "cardinality": "many-to-many",
2824
+ "strength": "medium",
2825
+ "required": false
2826
+ },
2827
+ "api.response.aggregates.api.header": {
2828
+ "id": "api.response.aggregates.api.header",
2829
+ "source_spec_node_id": "api.response",
2830
+ "source_layer": "api",
2831
+ "destination_spec_node_id": "api.header",
2832
+ "destination_layer": "api",
2833
+ "predicate": "aggregates",
2834
+ "cardinality": "many-to-many",
2835
+ "strength": "medium",
2836
+ "required": false
2837
+ },
2838
+ "api.response.aggregates.api.mediatype": {
2839
+ "id": "api.response.aggregates.api.mediatype",
2840
+ "source_spec_node_id": "api.response",
2841
+ "source_layer": "api",
2842
+ "destination_spec_node_id": "api.mediatype",
2843
+ "destination_layer": "api",
2844
+ "predicate": "aggregates",
2845
+ "cardinality": "many-to-many",
2846
+ "strength": "medium",
2847
+ "required": false
2848
+ },
2849
+ "api.response.aggregates.api.schema": {
2850
+ "id": "api.response.aggregates.api.schema",
2851
+ "source_spec_node_id": "api.response",
2852
+ "source_layer": "api",
2853
+ "destination_spec_node_id": "api.schema",
2854
+ "destination_layer": "api",
2855
+ "predicate": "aggregates",
2856
+ "cardinality": "many-to-many",
2857
+ "strength": "medium",
2858
+ "required": false
2859
+ },
2860
+ "api.response.composes.api.header": {
2861
+ "id": "api.response.composes.api.header",
2862
+ "source_spec_node_id": "api.response",
2863
+ "source_layer": "api",
2864
+ "destination_spec_node_id": "api.header",
2865
+ "destination_layer": "api",
2866
+ "predicate": "composes",
2867
+ "cardinality": "many-to-many",
2868
+ "strength": "medium",
2869
+ "required": false
2870
+ },
2871
+ "api.response.composes.api.link": {
2872
+ "id": "api.response.composes.api.link",
2873
+ "source_spec_node_id": "api.response",
2874
+ "source_layer": "api",
2875
+ "destination_spec_node_id": "api.link",
2876
+ "destination_layer": "api",
2877
+ "predicate": "composes",
2878
+ "cardinality": "many-to-many",
2879
+ "strength": "medium",
2880
+ "required": false
2881
+ },
2882
+ "api.response.composes.api.mediatype": {
2883
+ "id": "api.response.composes.api.mediatype",
2884
+ "source_spec_node_id": "api.response",
2885
+ "source_layer": "api",
2886
+ "destination_spec_node_id": "api.mediatype",
2887
+ "destination_layer": "api",
2888
+ "predicate": "composes",
2889
+ "cardinality": "many-to-many",
2890
+ "strength": "medium",
2891
+ "required": false
2892
+ },
2893
+ "api.response.references.api.example": {
2894
+ "id": "api.response.references.api.example",
2895
+ "source_spec_node_id": "api.response",
2896
+ "source_layer": "api",
2897
+ "destination_spec_node_id": "api.example",
2898
+ "destination_layer": "api",
2899
+ "predicate": "references",
2900
+ "cardinality": "many-to-many",
2901
+ "strength": "medium",
2902
+ "required": false
2903
+ },
2904
+ "api.response.references.api.schema": {
2905
+ "id": "api.response.references.api.schema",
2906
+ "source_spec_node_id": "api.response",
2907
+ "source_layer": "api",
2908
+ "destination_spec_node_id": "api.schema",
2909
+ "destination_layer": "api",
2910
+ "predicate": "references",
2911
+ "cardinality": "many-to-many",
2912
+ "strength": "medium",
2913
+ "required": false
2914
+ },
2915
+ "api.responses.aggregates.api.header": {
2916
+ "id": "api.responses.aggregates.api.header",
2917
+ "source_spec_node_id": "api.responses",
2918
+ "source_layer": "api",
2919
+ "destination_spec_node_id": "api.header",
2920
+ "destination_layer": "api",
2921
+ "predicate": "aggregates",
2922
+ "cardinality": "many-to-many",
2923
+ "strength": "medium",
2924
+ "required": false
2925
+ },
2926
+ "api.responses.aggregates.api.schema": {
2927
+ "id": "api.responses.aggregates.api.schema",
2928
+ "source_spec_node_id": "api.responses",
2929
+ "source_layer": "api",
2930
+ "destination_spec_node_id": "api.schema",
2931
+ "destination_layer": "api",
2932
+ "predicate": "aggregates",
2933
+ "cardinality": "many-to-many",
2934
+ "strength": "medium",
2935
+ "required": false
2936
+ },
2937
+ "api.responses.associated-with.api.ratelimit": {
2938
+ "id": "api.responses.associated-with.api.ratelimit",
2939
+ "source_spec_node_id": "api.responses",
2940
+ "source_layer": "api",
2941
+ "destination_spec_node_id": "api.ratelimit",
2942
+ "destination_layer": "api",
2943
+ "predicate": "associated-with",
2944
+ "cardinality": "many-to-many",
2945
+ "strength": "medium",
2946
+ "required": false
2947
+ },
2948
+ "api.responses.composes.api.response": {
2949
+ "id": "api.responses.composes.api.response",
2950
+ "source_spec_node_id": "api.responses",
2951
+ "source_layer": "api",
2952
+ "destination_spec_node_id": "api.response",
2953
+ "destination_layer": "api",
2954
+ "predicate": "composes",
2955
+ "cardinality": "many-to-many",
2956
+ "strength": "medium",
2957
+ "required": false
2958
+ },
2959
+ "api.responses.references.api.link": {
2960
+ "id": "api.responses.references.api.link",
2961
+ "source_spec_node_id": "api.responses",
2962
+ "source_layer": "api",
2963
+ "destination_spec_node_id": "api.link",
2964
+ "destination_layer": "api",
2965
+ "predicate": "references",
2966
+ "cardinality": "many-to-many",
2967
+ "strength": "medium",
2968
+ "required": false
2969
+ },
2970
+ "api.responses.references.api.schema": {
2971
+ "id": "api.responses.references.api.schema",
2972
+ "source_spec_node_id": "api.responses",
2973
+ "source_layer": "api",
2974
+ "destination_spec_node_id": "api.schema",
2975
+ "destination_layer": "api",
2976
+ "predicate": "references",
2977
+ "cardinality": "many-to-many",
2978
+ "strength": "medium",
2979
+ "required": false
2980
+ },
2981
+ "api.schema.maps-to.business.businessobject": {
2982
+ "id": "api.schema.maps-to.business.businessobject",
2983
+ "source_spec_node_id": "api.schema",
2984
+ "source_layer": "api",
2985
+ "destination_spec_node_id": "business.businessobject",
2986
+ "destination_layer": "business",
2987
+ "predicate": "maps-to",
2988
+ "cardinality": "many-to-many",
2989
+ "strength": "medium",
2990
+ "required": false
2991
+ },
2992
+ "api.schema.maps-to.data-store.collection": {
2993
+ "id": "api.schema.maps-to.data-store.collection",
2994
+ "source_spec_node_id": "api.schema",
2995
+ "source_layer": "api",
2996
+ "destination_spec_node_id": "data-store.collection",
2997
+ "destination_layer": "data-store",
2998
+ "predicate": "maps-to",
2999
+ "cardinality": "many-to-many",
3000
+ "strength": "medium",
3001
+ "required": false
3002
+ },
3003
+ "api.schema.maps-to.data-store.field": {
3004
+ "id": "api.schema.maps-to.data-store.field",
3005
+ "source_spec_node_id": "api.schema",
3006
+ "source_layer": "api",
3007
+ "destination_spec_node_id": "data-store.field",
3008
+ "destination_layer": "data-store",
3009
+ "predicate": "maps-to",
3010
+ "cardinality": "many-to-many",
3011
+ "strength": "medium",
3012
+ "required": false
3013
+ },
3014
+ "api.schema.references.api.operation": {
3015
+ "id": "api.schema.references.api.operation",
3016
+ "source_spec_node_id": "api.schema",
3017
+ "source_layer": "api",
3018
+ "destination_spec_node_id": "api.operation",
3019
+ "destination_layer": "api",
3020
+ "predicate": "references",
3021
+ "cardinality": "many-to-many",
3022
+ "strength": "medium",
3023
+ "required": false
3024
+ },
3025
+ "api.schema.references.api.schema": {
3026
+ "id": "api.schema.references.api.schema",
3027
+ "source_spec_node_id": "api.schema",
3028
+ "source_layer": "api",
3029
+ "destination_spec_node_id": "api.schema",
3030
+ "destination_layer": "api",
3031
+ "predicate": "references",
3032
+ "cardinality": "many-to-many",
3033
+ "strength": "medium",
3034
+ "required": false
3035
+ },
3036
+ "api.schema.references.api.tag": {
3037
+ "id": "api.schema.references.api.tag",
3038
+ "source_spec_node_id": "api.schema",
3039
+ "source_layer": "api",
3040
+ "destination_spec_node_id": "api.tag",
3041
+ "destination_layer": "api",
3042
+ "predicate": "references",
3043
+ "cardinality": "many-to-many",
3044
+ "strength": "medium",
3045
+ "required": false
3046
+ },
3047
+ "api.schema.specializes.api.schema": {
3048
+ "id": "api.schema.specializes.api.schema",
3049
+ "source_spec_node_id": "api.schema",
3050
+ "source_layer": "api",
3051
+ "destination_spec_node_id": "api.schema",
3052
+ "destination_layer": "api",
3053
+ "predicate": "specializes",
3054
+ "cardinality": "many-to-many",
3055
+ "strength": "medium",
3056
+ "required": false
3057
+ },
3058
+ "api.securityscheme.composes.oauthflows": {
3059
+ "id": "api.securityscheme.composes.oauthflows",
3060
+ "source_spec_node_id": "api.securityscheme",
3061
+ "source_layer": "api",
3062
+ "destination_spec_node_id": "api.oauthflows",
3063
+ "destination_layer": "api",
3064
+ "predicate": "composes",
3065
+ "cardinality": "one-to-one",
3066
+ "strength": "high",
3067
+ "required": false
3068
+ },
3069
+ "api.securityscheme.implements.security.securitypolicy": {
3070
+ "id": "api.securityscheme.implements.security.securitypolicy",
3071
+ "source_spec_node_id": "api.securityscheme",
3072
+ "source_layer": "api",
3073
+ "destination_spec_node_id": "security.securitypolicy",
3074
+ "destination_layer": "security",
3075
+ "predicate": "implements",
3076
+ "cardinality": "many-to-many",
3077
+ "strength": "medium",
3078
+ "required": false
3079
+ },
3080
+ "api.securityscheme.maps-to.security.actor": {
3081
+ "id": "api.securityscheme.maps-to.security.actor",
3082
+ "source_spec_node_id": "api.securityscheme",
3083
+ "source_layer": "api",
3084
+ "destination_spec_node_id": "security.actor",
3085
+ "destination_layer": "security",
3086
+ "predicate": "maps-to",
3087
+ "cardinality": "many-to-many",
3088
+ "strength": "medium",
3089
+ "required": false
3090
+ },
3091
+ "api.securityscheme.maps-to.data-store.collection": {
3092
+ "id": "api.securityscheme.maps-to.data-store.collection",
3093
+ "source_spec_node_id": "api.securityscheme",
3094
+ "source_layer": "api",
3095
+ "destination_spec_node_id": "data-store.collection",
3096
+ "destination_layer": "data-store",
3097
+ "predicate": "maps-to",
3098
+ "cardinality": "many-to-many",
3099
+ "strength": "medium",
3100
+ "required": false
3101
+ },
3102
+ "api.securityscheme.references.application.applicationcomponent": {
3103
+ "id": "api.securityscheme.references.application.applicationcomponent",
3104
+ "source_spec_node_id": "api.securityscheme",
3105
+ "source_layer": "api",
3106
+ "destination_spec_node_id": "application.applicationcomponent",
3107
+ "destination_layer": "application",
3108
+ "predicate": "references",
3109
+ "cardinality": "many-to-many",
3110
+ "strength": "medium",
3111
+ "required": false
3112
+ },
3113
+ "api.securityscheme.references.application.applicationservice": {
3114
+ "id": "api.securityscheme.references.application.applicationservice",
3115
+ "source_spec_node_id": "api.securityscheme",
3116
+ "source_layer": "api",
3117
+ "destination_spec_node_id": "application.applicationservice",
3118
+ "destination_layer": "application",
3119
+ "predicate": "references",
3120
+ "cardinality": "many-to-many",
3121
+ "strength": "medium",
3122
+ "required": false
3123
+ },
3124
+ "api.securityscheme.references.business.businessinterface": {
3125
+ "id": "api.securityscheme.references.business.businessinterface",
3126
+ "source_spec_node_id": "api.securityscheme",
3127
+ "source_layer": "api",
3128
+ "destination_spec_node_id": "business.businessinterface",
3129
+ "destination_layer": "business",
3130
+ "predicate": "references",
3131
+ "cardinality": "many-to-many",
3132
+ "strength": "medium",
3133
+ "required": false
3134
+ },
3135
+ "api.securityscheme.references.business.businessservice": {
3136
+ "id": "api.securityscheme.references.business.businessservice",
3137
+ "source_spec_node_id": "api.securityscheme",
3138
+ "source_layer": "api",
3139
+ "destination_spec_node_id": "business.businessservice",
3140
+ "destination_layer": "business",
3141
+ "predicate": "references",
3142
+ "cardinality": "many-to-many",
3143
+ "strength": "medium",
3144
+ "required": false
3145
+ },
3146
+ "api.securityscheme.references.security.secureresource": {
3147
+ "id": "api.securityscheme.references.security.secureresource",
3148
+ "source_spec_node_id": "api.securityscheme",
3149
+ "source_layer": "api",
3150
+ "destination_spec_node_id": "security.secureresource",
3151
+ "destination_layer": "security",
3152
+ "predicate": "references",
3153
+ "cardinality": "many-to-many",
3154
+ "strength": "medium",
3155
+ "required": false
3156
+ },
3157
+ "api.securityscheme.requires.security.permission": {
3158
+ "id": "api.securityscheme.requires.security.permission",
3159
+ "source_spec_node_id": "api.securityscheme",
3160
+ "source_layer": "api",
3161
+ "destination_spec_node_id": "security.permission",
3162
+ "destination_layer": "security",
3163
+ "predicate": "requires",
3164
+ "cardinality": "many-to-many",
3165
+ "strength": "medium",
3166
+ "required": false
3167
+ },
3168
+ "api.securityscheme.satisfies.motivation.principle": {
3169
+ "id": "api.securityscheme.satisfies.motivation.principle",
3170
+ "source_spec_node_id": "api.securityscheme",
3171
+ "source_layer": "api",
3172
+ "destination_spec_node_id": "motivation.principle",
3173
+ "destination_layer": "motivation",
3174
+ "predicate": "satisfies",
3175
+ "cardinality": "many-to-many",
3176
+ "strength": "medium",
3177
+ "required": false
3178
+ },
3179
+ "api.securityscheme.satisfies.motivation.requirement": {
3180
+ "id": "api.securityscheme.satisfies.motivation.requirement",
3181
+ "source_spec_node_id": "api.securityscheme",
3182
+ "source_layer": "api",
3183
+ "destination_spec_node_id": "motivation.requirement",
3184
+ "destination_layer": "motivation",
3185
+ "predicate": "satisfies",
3186
+ "cardinality": "many-to-many",
3187
+ "strength": "medium",
3188
+ "required": false
3189
+ },
3190
+ "api.securityscheme.serves.business.businessrole": {
3191
+ "id": "api.securityscheme.serves.business.businessrole",
3192
+ "source_spec_node_id": "api.securityscheme",
3193
+ "source_layer": "api",
3194
+ "destination_spec_node_id": "business.businessrole",
3195
+ "destination_layer": "business",
3196
+ "predicate": "serves",
3197
+ "cardinality": "many-to-many",
3198
+ "strength": "medium",
3199
+ "required": false
3200
+ },
3201
+ "api.securityscheme.serves.api.operation": {
3202
+ "id": "api.securityscheme.serves.api.operation",
3203
+ "source_spec_node_id": "api.securityscheme",
3204
+ "source_layer": "api",
3205
+ "destination_spec_node_id": "api.operation",
3206
+ "destination_layer": "api",
3207
+ "predicate": "serves",
3208
+ "cardinality": "many-to-many",
3209
+ "strength": "medium",
3210
+ "required": false
3211
+ },
3212
+ "api.securityscheme.uses.technology.systemsoftware": {
3213
+ "id": "api.securityscheme.uses.technology.systemsoftware",
3214
+ "source_spec_node_id": "api.securityscheme",
3215
+ "source_layer": "api",
3216
+ "destination_spec_node_id": "technology.systemsoftware",
3217
+ "destination_layer": "technology",
3218
+ "predicate": "uses",
3219
+ "cardinality": "many-to-many",
3220
+ "strength": "medium",
3221
+ "required": false
3222
+ },
3223
+ "api.server.aggregates.api.servervariable": {
3224
+ "id": "api.server.aggregates.api.servervariable",
3225
+ "source_spec_node_id": "api.server",
3226
+ "source_layer": "api",
3227
+ "destination_spec_node_id": "api.servervariable",
3228
+ "destination_layer": "api",
3229
+ "predicate": "aggregates",
3230
+ "cardinality": "many-to-many",
3231
+ "strength": "medium",
3232
+ "required": false
3233
+ },
3234
+ "api.server.associated-with.api.ratelimit": {
3235
+ "id": "api.server.associated-with.api.ratelimit",
3236
+ "source_spec_node_id": "api.server",
3237
+ "source_layer": "api",
3238
+ "destination_spec_node_id": "api.ratelimit",
3239
+ "destination_layer": "api",
3240
+ "predicate": "associated-with",
3241
+ "cardinality": "many-to-many",
3242
+ "strength": "medium",
3243
+ "required": false
3244
+ },
3245
+ "api.server.depends-on.technology.node": {
3246
+ "id": "api.server.depends-on.technology.node",
3247
+ "source_spec_node_id": "api.server",
3248
+ "source_layer": "api",
3249
+ "destination_spec_node_id": "technology.node",
3250
+ "destination_layer": "technology",
3251
+ "predicate": "depends-on",
3252
+ "cardinality": "many-to-many",
3253
+ "strength": "medium",
3254
+ "required": false
3255
+ },
3256
+ "api.server.references.api.securityscheme": {
3257
+ "id": "api.server.references.api.securityscheme",
3258
+ "source_spec_node_id": "api.server",
3259
+ "source_layer": "api",
3260
+ "destination_spec_node_id": "api.securityscheme",
3261
+ "destination_layer": "api",
3262
+ "predicate": "references",
3263
+ "cardinality": "many-to-many",
3264
+ "strength": "medium",
3265
+ "required": false
3266
+ },
3267
+ "api.server.satisfies.security.securitypolicy": {
3268
+ "id": "api.server.satisfies.security.securitypolicy",
3269
+ "source_spec_node_id": "api.server",
3270
+ "source_layer": "api",
3271
+ "destination_spec_node_id": "security.securitypolicy",
3272
+ "destination_layer": "security",
3273
+ "predicate": "satisfies",
3274
+ "cardinality": "many-to-many",
3275
+ "strength": "medium",
3276
+ "required": false
3277
+ },
3278
+ "api.server.serves.application.applicationcomponent": {
3279
+ "id": "api.server.serves.application.applicationcomponent",
3280
+ "source_spec_node_id": "api.server",
3281
+ "source_layer": "api",
3282
+ "destination_spec_node_id": "application.applicationcomponent",
3283
+ "destination_layer": "application",
3284
+ "predicate": "serves",
3285
+ "cardinality": "many-to-many",
3286
+ "strength": "medium",
3287
+ "required": false
3288
+ },
3289
+ "api.server.serves.api.pathitem": {
3290
+ "id": "api.server.serves.api.pathitem",
3291
+ "source_spec_node_id": "api.server",
3292
+ "source_layer": "api",
3293
+ "destination_spec_node_id": "api.pathitem",
3294
+ "destination_layer": "api",
3295
+ "predicate": "serves",
3296
+ "cardinality": "many-to-many",
3297
+ "strength": "medium",
3298
+ "required": false
3299
+ },
3300
+ "api.server.uses.technology.systemsoftware": {
3301
+ "id": "api.server.uses.technology.systemsoftware",
3302
+ "source_spec_node_id": "api.server",
3303
+ "source_layer": "api",
3304
+ "destination_spec_node_id": "technology.systemsoftware",
3305
+ "destination_layer": "technology",
3306
+ "predicate": "uses",
3307
+ "cardinality": "many-to-many",
3308
+ "strength": "medium",
3309
+ "required": false
3310
+ },
3311
+ "api.servervariable.associated-with.api.parameter": {
3312
+ "id": "api.servervariable.associated-with.api.parameter",
3313
+ "source_spec_node_id": "api.servervariable",
3314
+ "source_layer": "api",
3315
+ "destination_spec_node_id": "api.parameter",
3316
+ "destination_layer": "api",
3317
+ "predicate": "associated-with",
3318
+ "cardinality": "many-to-many",
3319
+ "strength": "medium",
3320
+ "required": false
3321
+ },
3322
+ "api.servervariable.governs.api.server": {
3323
+ "id": "api.servervariable.governs.api.server",
3324
+ "source_spec_node_id": "api.servervariable",
3325
+ "source_layer": "api",
3326
+ "destination_spec_node_id": "api.server",
3327
+ "destination_layer": "api",
3328
+ "predicate": "governs",
3329
+ "cardinality": "many-to-many",
3330
+ "strength": "medium",
3331
+ "required": false
3332
+ },
3333
+ "api.servervariable.references.api.example": {
3334
+ "id": "api.servervariable.references.api.example",
3335
+ "source_spec_node_id": "api.servervariable",
3336
+ "source_layer": "api",
3337
+ "destination_spec_node_id": "api.example",
3338
+ "destination_layer": "api",
3339
+ "predicate": "references",
3340
+ "cardinality": "many-to-many",
3341
+ "strength": "medium",
3342
+ "required": false
3343
+ },
3344
+ "api.servervariable.serves.api.operation": {
3345
+ "id": "api.servervariable.serves.api.operation",
3346
+ "source_spec_node_id": "api.servervariable",
3347
+ "source_layer": "api",
3348
+ "destination_spec_node_id": "api.operation",
3349
+ "destination_layer": "api",
3350
+ "predicate": "serves",
3351
+ "cardinality": "many-to-many",
3352
+ "strength": "medium",
3353
+ "required": false
3354
+ },
3355
+ "api.tag.aggregates.api.operation": {
3356
+ "id": "api.tag.aggregates.api.operation",
3357
+ "source_spec_node_id": "api.tag",
3358
+ "source_layer": "api",
3359
+ "destination_spec_node_id": "api.operation",
3360
+ "destination_layer": "api",
3361
+ "predicate": "aggregates",
3362
+ "cardinality": "many-to-many",
3363
+ "strength": "medium",
3364
+ "required": false
3365
+ },
3366
+ "api.tag.associated-with.api.schema": {
3367
+ "id": "api.tag.associated-with.api.schema",
3368
+ "source_spec_node_id": "api.tag",
3369
+ "source_layer": "api",
3370
+ "destination_spec_node_id": "api.schema",
3371
+ "destination_layer": "api",
3372
+ "predicate": "associated-with",
3373
+ "cardinality": "many-to-many",
3374
+ "strength": "medium",
3375
+ "required": false
3376
+ },
3377
+ "api.tag.associated-with.api.securityscheme": {
3378
+ "id": "api.tag.associated-with.api.securityscheme",
3379
+ "source_spec_node_id": "api.tag",
3380
+ "source_layer": "api",
3381
+ "destination_spec_node_id": "api.securityscheme",
3382
+ "destination_layer": "api",
3383
+ "predicate": "associated-with",
3384
+ "cardinality": "many-to-many",
3385
+ "strength": "medium",
3386
+ "required": false
3387
+ },
3388
+ "api.tag.references.api.externaldocumentation": {
3389
+ "id": "api.tag.references.api.externaldocumentation",
3390
+ "source_spec_node_id": "api.tag",
3391
+ "source_layer": "api",
3392
+ "destination_spec_node_id": "api.externaldocumentation",
3393
+ "destination_layer": "api",
3394
+ "predicate": "references",
3395
+ "cardinality": "many-to-many",
3396
+ "strength": "medium",
3397
+ "required": false
3398
+ },
3399
+ "api.tag.serves.api.operation": {
3400
+ "id": "api.tag.serves.api.operation",
3401
+ "source_spec_node_id": "api.tag",
3402
+ "source_layer": "api",
3403
+ "destination_spec_node_id": "api.operation",
3404
+ "destination_layer": "api",
3405
+ "predicate": "serves",
3406
+ "cardinality": "many-to-many",
3407
+ "strength": "medium",
3408
+ "required": false
3409
+ }
3410
+ }
3411
+ }