@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,3488 @@
1
+ {
2
+ "specVersion": "0.8.4",
3
+ "layer": {
4
+ "id": "security",
5
+ "number": 3,
6
+ "name": "Security Layer",
7
+ "description": "Layer 3: Security Layer",
8
+ "inspired_by": {
9
+ "standard": "NIST SP 800-53",
10
+ "version": "5.1",
11
+ "url": "https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-53r5.pdf"
12
+ },
13
+ "node_types": [
14
+ "security.accesscondition",
15
+ "security.accountabilityrequirement",
16
+ "security.actor",
17
+ "security.auditconfig",
18
+ "security.authenticationconfig",
19
+ "security.bindingofduty",
20
+ "security.condition",
21
+ "security.countermeasure",
22
+ "security.dataclassification",
23
+ "security.delegation",
24
+ "security.evidence",
25
+ "security.fieldaccesscontrol",
26
+ "security.informationentity",
27
+ "security.informationright",
28
+ "security.needtoknow",
29
+ "security.passwordpolicy",
30
+ "security.permission",
31
+ "security.policyaction",
32
+ "security.policyrule",
33
+ "security.resourceoperation",
34
+ "security.retentionpolicy",
35
+ "security.role",
36
+ "security.secureresource",
37
+ "security.securityconstraints",
38
+ "security.securitymodel",
39
+ "security.securitypolicy",
40
+ "security.separationofduty",
41
+ "security.threat",
42
+ "security.validationrule"
43
+ ]
44
+ },
45
+ "nodeSchemas": {
46
+ "accesscondition": {
47
+ "$schema": "http://json-schema.org/draft-07/schema#",
48
+ "title": "AccessCondition",
49
+ "description": "Defines a single boolean predicate evaluated against a request context attribute (field), comparing the runtime value using a specified operator. Composed inside a PolicyRule condition chain to form compound access control expressions.",
50
+ "allOf": [
51
+ {
52
+ "$ref": "urn:dr:spec:base:spec-node"
53
+ }
54
+ ],
55
+ "properties": {
56
+ "spec_node_id": {
57
+ "const": "security.accesscondition"
58
+ },
59
+ "layer_id": {
60
+ "const": "security"
61
+ },
62
+ "type": {
63
+ "const": "accesscondition"
64
+ },
65
+ "attributes": {
66
+ "type": "object",
67
+ "properties": {
68
+ "field": {
69
+ "type": "string"
70
+ },
71
+ "operator": {
72
+ "type": "string",
73
+ "enum": [
74
+ "eq",
75
+ "neq",
76
+ "gt",
77
+ "lt",
78
+ "in",
79
+ "contains",
80
+ "matches",
81
+ "exists"
82
+ ],
83
+ "description": "Comparison operator applied to the field value, per XACML 3.0 match function semantics."
84
+ },
85
+ "value": {
86
+ "type": "string"
87
+ },
88
+ "message": {
89
+ "type": "string"
90
+ },
91
+ "source": {
92
+ "type": "string"
93
+ }
94
+ },
95
+ "required": ["field", "operator", "value", "message", "source"],
96
+ "additionalProperties": false
97
+ }
98
+ },
99
+ "$id": "urn:dr:spec:node:security.accesscondition"
100
+ },
101
+ "accountabilityrequirement": {
102
+ "$schema": "http://json-schema.org/draft-07/schema#",
103
+ "title": "AccountabilityRequirement",
104
+ "description": "Expresses who is obligated to provide evidence that a specific action occurred and under what conditions that evidence can be challenged. Distinct from AuditConfig, which defines what events are captured — this node defines the obligation to prove an action took place. Implements NIST SP 800-53 AU-10 non-repudiation.",
105
+ "allOf": [
106
+ {
107
+ "$ref": "urn:dr:spec:base:spec-node"
108
+ }
109
+ ],
110
+ "properties": {
111
+ "spec_node_id": {
112
+ "const": "security.accountabilityrequirement"
113
+ },
114
+ "layer_id": {
115
+ "const": "security"
116
+ },
117
+ "type": {
118
+ "const": "accountabilityrequirement"
119
+ },
120
+ "attributes": {
121
+ "type": "object",
122
+ "properties": {
123
+ "action": {
124
+ "type": "string"
125
+ },
126
+ "resource": {
127
+ "type": "string"
128
+ },
129
+ "nonRepudiation": {
130
+ "type": "boolean"
131
+ },
132
+ "purposeDeclaration": {
133
+ "type": "string"
134
+ },
135
+ "challengeable": {
136
+ "type": "boolean"
137
+ }
138
+ },
139
+ "required": [
140
+ "action",
141
+ "resource",
142
+ "nonRepudiation",
143
+ "purposeDeclaration",
144
+ "challengeable"
145
+ ],
146
+ "additionalProperties": false
147
+ }
148
+ },
149
+ "$id": "urn:dr:spec:node:security.accountabilityrequirement"
150
+ },
151
+ "actor": {
152
+ "$schema": "http://json-schema.org/draft-07/schema#",
153
+ "title": "Actor",
154
+ "description": "A named principal — human user, service account, automated system, or external entity — whose identity and trust level govern what operations it may perform. Associates with Roles for permission grouping and with SeparationOfDuty and Delegation controls, per NIST SP 800-53 AC-2 (Account Management) and SP 800-207 (Zero Trust Architecture).",
155
+ "allOf": [
156
+ {
157
+ "$ref": "urn:dr:spec:base:spec-node"
158
+ }
159
+ ],
160
+ "properties": {
161
+ "spec_node_id": {
162
+ "const": "security.actor"
163
+ },
164
+ "layer_id": {
165
+ "const": "security"
166
+ },
167
+ "type": {
168
+ "const": "actor"
169
+ },
170
+ "attributes": {
171
+ "type": "object",
172
+ "properties": {
173
+ "type": {
174
+ "type": "string",
175
+ "enum": ["human", "service", "system", "external-entity"],
176
+ "description": "Category of actor, per NIST AC-2 (Account Management) subject classification."
177
+ },
178
+ "description": {
179
+ "type": "string"
180
+ },
181
+ "trustLevel": {
182
+ "type": "string",
183
+ "enum": ["zero", "low", "medium", "high", "full"],
184
+ "description": "Zero-trust assurance level assigned to this actor, per NIST SP 800-207."
185
+ },
186
+ "objectives": {
187
+ "type": "array",
188
+ "description": "References nodes describing this actor's goals or intended behaviors (e.g., for threat modeling or trust analysis)."
189
+ },
190
+ "dependencies": {
191
+ "type": "array",
192
+ "description": "References actor or delegation nodes this actor depends on for trust chain or access delegation analysis."
193
+ }
194
+ },
195
+ "required": ["type"],
196
+ "additionalProperties": false
197
+ }
198
+ },
199
+ "$id": "urn:dr:spec:node:security.actor"
200
+ },
201
+ "auditconfig": {
202
+ "$schema": "http://json-schema.org/draft-07/schema#",
203
+ "title": "AuditConfig",
204
+ "description": "Configuration for security audit logging, specifying what events to capture, retention periods, storage destinations, and compliance requirements. Enables security monitoring and forensic analysis.",
205
+ "allOf": [
206
+ {
207
+ "$ref": "urn:dr:spec:base:spec-node"
208
+ }
209
+ ],
210
+ "properties": {
211
+ "spec_node_id": {
212
+ "const": "security.auditconfig"
213
+ },
214
+ "layer_id": {
215
+ "const": "security"
216
+ },
217
+ "type": {
218
+ "const": "auditconfig"
219
+ },
220
+ "attributes": {
221
+ "type": "object",
222
+ "properties": {
223
+ "enabled": {
224
+ "type": "boolean"
225
+ },
226
+ "level": {
227
+ "type": "string",
228
+ "enum": ["none", "basic", "standard", "detailed", "verbose"],
229
+ "description": "Verbosity of audit event capture, from no logging to full payload-level tracing, per NIST SP 800-53 AU-2 Event Logging."
230
+ },
231
+ "includePayload": {
232
+ "type": "boolean"
233
+ },
234
+ "includeHeaders": {
235
+ "type": "boolean"
236
+ },
237
+ "sanitizeFields": {
238
+ "type": "string"
239
+ },
240
+ "source": {
241
+ "type": "object",
242
+ "description": "Source code reference"
243
+ }
244
+ },
245
+ "required": ["level", "sanitizeFields"],
246
+ "additionalProperties": false
247
+ }
248
+ },
249
+ "$id": "urn:dr:spec:node:security.auditconfig"
250
+ },
251
+ "authenticationconfig": {
252
+ "$schema": "http://json-schema.org/draft-07/schema#",
253
+ "title": "AuthenticationConfig",
254
+ "description": "Specifies how principals are verified before accessing protected resources, including the identity provider, multi-factor requirements, session lifetime, and credential policy references. Scoped per application or service. Maps to NIST SP 800-53 IA-2, IA-5, and IA-11.",
255
+ "allOf": [
256
+ {
257
+ "$ref": "urn:dr:spec:base:spec-node"
258
+ }
259
+ ],
260
+ "properties": {
261
+ "spec_node_id": {
262
+ "const": "security.authenticationconfig"
263
+ },
264
+ "layer_id": {
265
+ "const": "security"
266
+ },
267
+ "type": {
268
+ "const": "authenticationconfig"
269
+ },
270
+ "attributes": {
271
+ "type": "object",
272
+ "properties": {
273
+ "provider": {
274
+ "type": "string",
275
+ "enum": [
276
+ "oauth2",
277
+ "saml",
278
+ "ldap",
279
+ "openid-connect",
280
+ "local",
281
+ "fido2"
282
+ ],
283
+ "description": "Authentication protocol or provider type."
284
+ },
285
+ "verificationLevel": {
286
+ "type": "string",
287
+ "enum": ["ial1", "ial2", "ial3"],
288
+ "description": "Identity Assurance Level, per NIST SP 800-63A: IAL1 (self-asserted), IAL2 (remote identity proofing), IAL3 (in-person proofing)."
289
+ },
290
+ "sessionTimeout": {
291
+ "type": "integer"
292
+ },
293
+ "mfaRequired": {
294
+ "type": "boolean"
295
+ },
296
+ "passwordPolicy": {
297
+ "type": "string"
298
+ },
299
+ "source": {
300
+ "type": "object",
301
+ "description": "Source code reference"
302
+ }
303
+ },
304
+ "required": ["provider", "sessionTimeout"],
305
+ "additionalProperties": false
306
+ }
307
+ },
308
+ "$id": "urn:dr:spec:node:security.authenticationconfig"
309
+ },
310
+ "bindingofduty": {
311
+ "$schema": "http://json-schema.org/draft-07/schema#",
312
+ "title": "BindingOfDuty",
313
+ "description": "Obligation control requiring that a single actor who initiates a task must also complete it, preventing task hijacking or inconsistent workflow state that could be exploited by a different actor. Complements SeparationOfDuty by enforcing task continuity rather than task segregation. Anchored to NIST SP 800-53 CM-5 (Access Restrictions for Change) and workflow integrity controls.",
314
+ "allOf": [
315
+ {
316
+ "$ref": "urn:dr:spec:base:spec-node"
317
+ }
318
+ ],
319
+ "properties": {
320
+ "spec_node_id": {
321
+ "const": "security.bindingofduty"
322
+ },
323
+ "layer_id": {
324
+ "const": "security"
325
+ },
326
+ "type": {
327
+ "const": "bindingofduty"
328
+ },
329
+ "attributes": {
330
+ "type": "object",
331
+ "properties": {
332
+ "description": {
333
+ "type": "string"
334
+ },
335
+ "message": {
336
+ "type": "string"
337
+ },
338
+ "scope": {
339
+ "type": "string",
340
+ "description": "Organizational or operational boundary within which this binding of duty constraint applies (e.g., a project, department, or system)."
341
+ }
342
+ },
343
+ "required": ["message"],
344
+ "additionalProperties": false
345
+ }
346
+ },
347
+ "$id": "urn:dr:spec:node:security.bindingofduty"
348
+ },
349
+ "condition": {
350
+ "$schema": "http://json-schema.org/draft-07/schema#",
351
+ "title": "Condition",
352
+ "description": "A reusable logical expression evaluated against request context (time, location, user attributes, resource state) to determine when a SecurityPolicy rule applies. Distinct from AccessCondition, which is a concrete field+operator+value predicate composed inside a PolicyRule condition chain.",
353
+ "allOf": [
354
+ {
355
+ "$ref": "urn:dr:spec:base:spec-node"
356
+ }
357
+ ],
358
+ "properties": {
359
+ "spec_node_id": {
360
+ "const": "security.condition"
361
+ },
362
+ "layer_id": {
363
+ "const": "security"
364
+ },
365
+ "type": {
366
+ "const": "condition"
367
+ },
368
+ "attributes": {
369
+ "type": "object",
370
+ "properties": {
371
+ "expression": {
372
+ "type": "string"
373
+ },
374
+ "description": {
375
+ "type": "string"
376
+ },
377
+ "operator": {
378
+ "type": "string",
379
+ "enum": ["eq", "neq", "gt", "lt", "in", "contains", "matches"],
380
+ "description": "Comparison operator for the condition expression, aligned with XACML MatchType values."
381
+ },
382
+ "evaluationType": {
383
+ "type": "string",
384
+ "enum": ["static", "dynamic", "runtime", "compile-time"],
385
+ "description": "When the condition is evaluated: at build time, at policy load, or at runtime during access enforcement."
386
+ },
387
+ "source": {
388
+ "type": "object",
389
+ "description": "Source code reference"
390
+ }
391
+ },
392
+ "required": ["expression"],
393
+ "additionalProperties": false
394
+ }
395
+ },
396
+ "$id": "urn:dr:spec:node:security.condition"
397
+ },
398
+ "countermeasure": {
399
+ "$schema": "http://json-schema.org/draft-07/schema#",
400
+ "title": "Countermeasure",
401
+ "description": "A security control or mitigation technique that reduces the likelihood or impact of a specific threat. Maps to NIST SP 800-53 controls by type (technical, operational, management) and tracks implementation status and residual risk.",
402
+ "allOf": [
403
+ {
404
+ "$ref": "urn:dr:spec:base:spec-node"
405
+ }
406
+ ],
407
+ "properties": {
408
+ "spec_node_id": {
409
+ "const": "security.countermeasure"
410
+ },
411
+ "layer_id": {
412
+ "const": "security"
413
+ },
414
+ "type": {
415
+ "const": "countermeasure"
416
+ },
417
+ "attributes": {
418
+ "type": "object",
419
+ "properties": {
420
+ "type": {
421
+ "type": "string",
422
+ "enum": ["technical", "operational", "management", "physical"],
423
+ "description": "NIST SP 800-53 control family classification: technical (hardware/software mechanisms), operational (people and procedures), management (governance), or physical (facility/environmental)."
424
+ },
425
+ "description": {
426
+ "type": "string"
427
+ },
428
+ "effectiveness": {
429
+ "type": "string",
430
+ "enum": ["high", "medium", "low", "unknown"],
431
+ "description": "Assessed effectiveness of the countermeasure in reducing threat risk, per NIST SP 800-30 risk treatment evaluation."
432
+ },
433
+ "implemented": {
434
+ "type": "boolean"
435
+ },
436
+ "source": {
437
+ "type": "object",
438
+ "description": "Source code reference"
439
+ }
440
+ },
441
+ "required": ["type"],
442
+ "additionalProperties": false
443
+ }
444
+ },
445
+ "$id": "urn:dr:spec:node:security.countermeasure"
446
+ },
447
+ "dataclassification": {
448
+ "$schema": "http://json-schema.org/draft-07/schema#",
449
+ "title": "DataClassification",
450
+ "description": "Data classification and protection policies",
451
+ "allOf": [
452
+ {
453
+ "$ref": "urn:dr:spec:base:spec-node"
454
+ }
455
+ ],
456
+ "properties": {
457
+ "spec_node_id": {
458
+ "const": "security.dataclassification"
459
+ },
460
+ "layer_id": {
461
+ "const": "security"
462
+ },
463
+ "type": {
464
+ "const": "dataclassification"
465
+ },
466
+ "attributes": {
467
+ "type": "object",
468
+ "properties": {
469
+ "version": {
470
+ "type": "string"
471
+ },
472
+ "encryptionRequirement": {
473
+ "type": "string",
474
+ "enum": [
475
+ "none",
476
+ "in-transit",
477
+ "at-rest",
478
+ "end-to-end",
479
+ "field-level"
480
+ ],
481
+ "description": "Minimum encryption obligation for data within this classification scheme, per NIST SP 800-53 SC-28 and SC-8 controls."
482
+ },
483
+ "classificationLevel": {
484
+ "type": "string",
485
+ "enum": [
486
+ "public",
487
+ "internal",
488
+ "confidential",
489
+ "restricted",
490
+ "top-secret"
491
+ ],
492
+ "description": "Data sensitivity tier applied by this scheme, aligned with NIST FIPS 199 security categorization levels."
493
+ }
494
+ },
495
+ "additionalProperties": false
496
+ }
497
+ },
498
+ "$id": "urn:dr:spec:node:security.dataclassification"
499
+ },
500
+ "delegation": {
501
+ "$schema": "http://json-schema.org/draft-07/schema#",
502
+ "title": "Delegation",
503
+ "description": "Explicit transfer of permissions or authority from a delegator to a delegatee, subject to scope constraints and optional time bounds. Supports least-privilege enforcement (NIST AC-6) by enabling time-limited privilege elevation rather than permanent role assignment.",
504
+ "allOf": [
505
+ {
506
+ "$ref": "urn:dr:spec:base:spec-node"
507
+ }
508
+ ],
509
+ "properties": {
510
+ "spec_node_id": {
511
+ "const": "security.delegation"
512
+ },
513
+ "layer_id": {
514
+ "const": "security"
515
+ },
516
+ "type": {
517
+ "const": "delegation"
518
+ },
519
+ "attributes": {
520
+ "type": "object",
521
+ "properties": {
522
+ "delegator": {
523
+ "type": "string"
524
+ },
525
+ "delegatee": {
526
+ "type": "string"
527
+ },
528
+ "delegationType": {
529
+ "type": "string",
530
+ "enum": [
531
+ "full",
532
+ "partial",
533
+ "temporary",
534
+ "conditional",
535
+ "revocable"
536
+ ],
537
+ "description": "Scope and constraints of the delegation grant, per OAuth 2.0 token delegation and NIST SP 800-162 attribute delegation models."
538
+ },
539
+ "validUntil": {
540
+ "type": "string",
541
+ "description": "ISO 8601 datetime after which this delegation automatically expires. Required for delegationType 'temporary' and recommended for 'conditional' to enforce time-bounded privilege grants per AC-6."
542
+ },
543
+ "description": {
544
+ "type": "string"
545
+ }
546
+ },
547
+ "required": ["delegator", "delegatee", "delegationType"],
548
+ "additionalProperties": false
549
+ }
550
+ },
551
+ "$id": "urn:dr:spec:node:security.delegation"
552
+ },
553
+ "evidence": {
554
+ "$schema": "http://json-schema.org/draft-07/schema#",
555
+ "title": "Evidence",
556
+ "description": "An artifact that provides verifiable proof of an action or event for non-repudiation and audit purposes. Anchored to NIST SP 800-53 AU-10 (Non-repudiation), evidence types range from cryptographic signatures to plain audit log entries, with strength characterizing the assurance level per NIST SP 800-63-3.",
557
+ "allOf": [
558
+ {
559
+ "$ref": "urn:dr:spec:base:spec-node"
560
+ }
561
+ ],
562
+ "properties": {
563
+ "spec_node_id": {
564
+ "const": "security.evidence"
565
+ },
566
+ "layer_id": {
567
+ "const": "security"
568
+ },
569
+ "type": {
570
+ "const": "evidence"
571
+ },
572
+ "attributes": {
573
+ "type": "object",
574
+ "properties": {
575
+ "type": {
576
+ "type": "string",
577
+ "enum": [
578
+ "log",
579
+ "signature",
580
+ "timestamp",
581
+ "hash",
582
+ "certificate",
583
+ "audit-trail"
584
+ ],
585
+ "description": "Category of evidence artifact, per NIST AU-10 (Non-repudiation)."
586
+ },
587
+ "strength": {
588
+ "type": "string",
589
+ "enum": ["strong", "moderate", "weak", "cryptographic"],
590
+ "description": "Assurance strength of the evidence, per NIST SP 800-63-3 assurance levels."
591
+ },
592
+ "source": {
593
+ "type": "string",
594
+ "description": "Origin or location of this evidence artifact, such as a system identifier, log stream name, or storage URI."
595
+ }
596
+ },
597
+ "required": ["type", "source"],
598
+ "additionalProperties": false
599
+ }
600
+ },
601
+ "$id": "urn:dr:spec:node:security.evidence"
602
+ },
603
+ "fieldaccesscontrol": {
604
+ "$schema": "http://json-schema.org/draft-07/schema#",
605
+ "title": "FieldAccessControl",
606
+ "description": "Defines access restrictions and transformation rules for a specific data field, controlling how sensitive values are masked or redacted when exposed to unauthorized principals. Used within SecureResource fieldAccess to enforce field-level data protection per NIST SP 800-53 AC-3 and SC-28.",
607
+ "allOf": [
608
+ {
609
+ "$ref": "urn:dr:spec:base:spec-node"
610
+ }
611
+ ],
612
+ "properties": {
613
+ "spec_node_id": {
614
+ "const": "security.fieldaccesscontrol"
615
+ },
616
+ "layer_id": {
617
+ "const": "security"
618
+ },
619
+ "type": {
620
+ "const": "fieldaccesscontrol"
621
+ },
622
+ "attributes": {
623
+ "type": "object",
624
+ "properties": {
625
+ "field": {
626
+ "type": "string"
627
+ },
628
+ "maskingStrategy": {
629
+ "type": "string",
630
+ "enum": [
631
+ "redact",
632
+ "hash",
633
+ "tokenize",
634
+ "truncate",
635
+ "blur",
636
+ "none"
637
+ ],
638
+ "description": "Technique used to protect sensitive field values when exposed to unauthorized principals, per NIST SP 800-53 SC-28 data-at-rest protection controls."
639
+ },
640
+ "description": {
641
+ "type": "string"
642
+ }
643
+ },
644
+ "required": ["field"],
645
+ "additionalProperties": false
646
+ }
647
+ },
648
+ "$id": "urn:dr:spec:node:security.fieldaccesscontrol"
649
+ },
650
+ "informationentity": {
651
+ "$schema": "http://json-schema.org/draft-07/schema#",
652
+ "title": "InformationEntity",
653
+ "description": "Named information asset subject to fine-grained access rights and data classification. Represents a logical grouping of data (e.g., customer PII, financial records) whose access is governed by associated InformationRight grants and AccountabilityRequirements, per NIST SP 800-53 AC-3 and IP-1.",
654
+ "allOf": [
655
+ {
656
+ "$ref": "urn:dr:spec:base:spec-node"
657
+ }
658
+ ],
659
+ "properties": {
660
+ "spec_node_id": {
661
+ "const": "security.informationentity"
662
+ },
663
+ "layer_id": {
664
+ "const": "security"
665
+ },
666
+ "type": {
667
+ "const": "informationentity"
668
+ },
669
+ "attributes": {
670
+ "type": "object",
671
+ "properties": {
672
+ "description": {
673
+ "type": "string"
674
+ },
675
+ "classification": {
676
+ "type": "string",
677
+ "description": "Sensitivity classification of this information asset. Use classificationLevel values: public, internal, confidential, restricted, or top-secret."
678
+ },
679
+ "authorizationRequirements": {
680
+ "type": "array",
681
+ "description": "References InformationRight nodes defining which actors may access this entity and under what constraints."
682
+ }
683
+ },
684
+ "required": ["classification"],
685
+ "additionalProperties": false
686
+ }
687
+ },
688
+ "$id": "urn:dr:spec:node:security.informationentity"
689
+ },
690
+ "informationright": {
691
+ "$schema": "http://json-schema.org/draft-07/schema#",
692
+ "title": "InformationRight",
693
+ "description": "A granular access grant specifying which operations a named actor may perform on an InformationEntity, subject to a qualifying constraint expression. Implements attribute-based access control (ABAC) at the information asset level, per NIST SP 800-162 (ABAC Guide) and NIST SP 800-53 AC-3(14).",
694
+ "allOf": [
695
+ {
696
+ "$ref": "urn:dr:spec:base:spec-node"
697
+ }
698
+ ],
699
+ "properties": {
700
+ "spec_node_id": {
701
+ "const": "security.informationright"
702
+ },
703
+ "layer_id": {
704
+ "const": "security"
705
+ },
706
+ "type": {
707
+ "const": "informationright"
708
+ },
709
+ "attributes": {
710
+ "type": "object",
711
+ "properties": {
712
+ "actor": {
713
+ "type": "string",
714
+ "description": "Identifier of the actor (security.actor) to whom this right is granted."
715
+ },
716
+ "constraint": {
717
+ "type": "string",
718
+ "description": "Boolean constraint expression that must evaluate to true for the right to apply (e.g., 'actor.department == resource.ownerDepartment')."
719
+ },
720
+ "operations": {
721
+ "type": "array",
722
+ "items": {
723
+ "type": "string",
724
+ "enum": [
725
+ "read",
726
+ "write",
727
+ "delete",
728
+ "share",
729
+ "export",
730
+ "approve"
731
+ ]
732
+ },
733
+ "description": "Permitted operations on the information entity granted by this right."
734
+ }
735
+ },
736
+ "required": ["actor", "constraint"],
737
+ "additionalProperties": false
738
+ }
739
+ },
740
+ "$id": "urn:dr:spec:node:security.informationright"
741
+ },
742
+ "needtoknow": {
743
+ "$schema": "http://json-schema.org/draft-07/schema#",
744
+ "title": "NeedToKnow",
745
+ "description": "Restricts access to a resource to only those actors whose stated purpose requires it, implementing the NIST SP 800-53 AC-3(3) mandatory access control principle. JustificationRequired enforces that actors must declare their purpose before access is granted.",
746
+ "allOf": [
747
+ {
748
+ "$ref": "urn:dr:spec:base:spec-node"
749
+ }
750
+ ],
751
+ "properties": {
752
+ "spec_node_id": {
753
+ "const": "security.needtoknow"
754
+ },
755
+ "layer_id": {
756
+ "const": "security"
757
+ },
758
+ "type": {
759
+ "const": "needtoknow"
760
+ },
761
+ "attributes": {
762
+ "type": "object",
763
+ "properties": {
764
+ "resource": {
765
+ "type": "string"
766
+ },
767
+ "objective": {
768
+ "type": "string",
769
+ "description": "A free-text statement of the business or operational purpose that justifies access. This is a purpose declaration string, not a reference to an ActorObjective node."
770
+ },
771
+ "message": {
772
+ "type": "string"
773
+ },
774
+ "justificationRequired": {
775
+ "type": "boolean"
776
+ }
777
+ },
778
+ "required": [
779
+ "resource",
780
+ "objective",
781
+ "message",
782
+ "justificationRequired"
783
+ ],
784
+ "additionalProperties": false
785
+ }
786
+ },
787
+ "$id": "urn:dr:spec:node:security.needtoknow"
788
+ },
789
+ "passwordpolicy": {
790
+ "$schema": "http://json-schema.org/draft-07/schema#",
791
+ "title": "PasswordPolicy",
792
+ "description": "Defines password complexity, rotation, and lockout requirements for credential-based authentication. Implements NIST SP 800-53 IA-5(1) controls including minimum length, character class requirements, history enforcement, and brute-force lockout thresholds.",
793
+ "allOf": [
794
+ {
795
+ "$ref": "urn:dr:spec:base:spec-node"
796
+ }
797
+ ],
798
+ "properties": {
799
+ "spec_node_id": {
800
+ "const": "security.passwordpolicy"
801
+ },
802
+ "layer_id": {
803
+ "const": "security"
804
+ },
805
+ "type": {
806
+ "const": "passwordpolicy"
807
+ },
808
+ "attributes": {
809
+ "type": "object",
810
+ "properties": {
811
+ "minLength": {
812
+ "type": "integer"
813
+ },
814
+ "maxLength": {
815
+ "type": "integer"
816
+ },
817
+ "requireUppercase": {
818
+ "type": "boolean"
819
+ },
820
+ "requireLowercase": {
821
+ "type": "boolean"
822
+ },
823
+ "requireNumbers": {
824
+ "type": "boolean"
825
+ },
826
+ "requireSpecialChars": {
827
+ "type": "boolean"
828
+ },
829
+ "preventReuse": {
830
+ "type": "integer"
831
+ },
832
+ "expiryDays": {
833
+ "type": "integer"
834
+ },
835
+ "lockoutAttempts": {
836
+ "type": "integer"
837
+ },
838
+ "lockoutDuration": {
839
+ "type": "integer"
840
+ }
841
+ },
842
+ "required": ["expiryDays"],
843
+ "additionalProperties": false
844
+ }
845
+ },
846
+ "$id": "urn:dr:spec:node:security.passwordpolicy"
847
+ },
848
+ "permission": {
849
+ "$schema": "http://json-schema.org/draft-07/schema#",
850
+ "title": "Permission",
851
+ "description": "An atomic grant authorizing a specific action (e.g., read, write, execute) on a resource within a defined scope. Permissions are assigned to Roles and enforced by SecureResource access control lists. Implements NIST SP 800-53 AC-3 access enforcement and AC-6 least privilege.",
852
+ "allOf": [
853
+ {
854
+ "$ref": "urn:dr:spec:base:spec-node"
855
+ }
856
+ ],
857
+ "properties": {
858
+ "spec_node_id": {
859
+ "const": "security.permission"
860
+ },
861
+ "layer_id": {
862
+ "const": "security"
863
+ },
864
+ "type": {
865
+ "const": "permission"
866
+ },
867
+ "attributes": {
868
+ "type": "object",
869
+ "properties": {
870
+ "description": {
871
+ "type": "string"
872
+ },
873
+ "scope": {
874
+ "type": "string",
875
+ "enum": [
876
+ "read-only",
877
+ "write",
878
+ "admin",
879
+ "delegated",
880
+ "conditional"
881
+ ],
882
+ "description": "Access level granted by this permission, ranging from read-only to full administrative control."
883
+ },
884
+ "resource": {
885
+ "type": "string"
886
+ },
887
+ "action": {
888
+ "type": "string",
889
+ "enum": ["create", "read", "update", "delete", "execute", "list"],
890
+ "description": "CRUD-plus operation type this permission governs, per NIST SP 800-53 AC-3 Access Enforcement."
891
+ }
892
+ },
893
+ "required": ["scope", "resource", "action"],
894
+ "additionalProperties": false
895
+ }
896
+ },
897
+ "$id": "urn:dr:spec:node:security.permission"
898
+ },
899
+ "policyaction": {
900
+ "$schema": "http://json-schema.org/draft-07/schema#",
901
+ "title": "PolicyAction",
902
+ "description": "The enforcement action executed when a SecurityPolicy rule condition is met. Defines the system response to a policy match (allow, deny, remediation, notification), ensuring consistent policy enforcement across the security model per NIST SP 800-53 CA-9 (Internal System Connections) and SI-3 (Malicious Code Protection).",
903
+ "allOf": [
904
+ {
905
+ "$ref": "urn:dr:spec:base:spec-node"
906
+ }
907
+ ],
908
+ "properties": {
909
+ "spec_node_id": {
910
+ "const": "security.policyaction"
911
+ },
912
+ "layer_id": {
913
+ "const": "security"
914
+ },
915
+ "type": {
916
+ "const": "policyaction"
917
+ },
918
+ "attributes": {
919
+ "type": "object",
920
+ "properties": {
921
+ "type": {
922
+ "type": "string",
923
+ "enum": [
924
+ "allow",
925
+ "deny",
926
+ "log",
927
+ "alert",
928
+ "redirect",
929
+ "rate-limit",
930
+ "challenge",
931
+ "quarantine",
932
+ "notify",
933
+ "mask",
934
+ "encrypt"
935
+ ],
936
+ "description": "Enforcement action type applied when the parent policy rule fires."
937
+ },
938
+ "parameters": {
939
+ "type": "object",
940
+ "description": "Key-value configuration for the action (e.g., redirect URL, notification recipient, masking pattern)."
941
+ },
942
+ "source": {
943
+ "type": "object",
944
+ "description": "Source code reference"
945
+ }
946
+ },
947
+ "required": ["type", "parameters"],
948
+ "additionalProperties": false
949
+ }
950
+ },
951
+ "$id": "urn:dr:spec:node:security.policyaction"
952
+ },
953
+ "policyrule": {
954
+ "$schema": "http://json-schema.org/draft-07/schema#",
955
+ "title": "PolicyRule",
956
+ "description": "An atomic policy evaluation unit consisting of a condition predicate and an enforcement effect (PERMIT or DENY), with optional obligation actions executed upon match. Multiple PolicyRules compose a SecurityPolicy evaluated in priority order.",
957
+ "allOf": [
958
+ {
959
+ "$ref": "urn:dr:spec:base:spec-node"
960
+ }
961
+ ],
962
+ "properties": {
963
+ "spec_node_id": {
964
+ "const": "security.policyrule"
965
+ },
966
+ "layer_id": {
967
+ "const": "security"
968
+ },
969
+ "type": {
970
+ "const": "policyrule"
971
+ },
972
+ "attributes": {
973
+ "type": "object",
974
+ "properties": {
975
+ "condition": {
976
+ "type": "string"
977
+ },
978
+ "effect": {
979
+ "type": "string",
980
+ "enum": ["permit", "deny", "indeterminate", "not-applicable"],
981
+ "description": "Policy decision outcome, per XACML 3.0 Rule element effect values."
982
+ },
983
+ "message": {
984
+ "type": "string"
985
+ },
986
+ "source": {
987
+ "type": "object",
988
+ "description": "Source code reference"
989
+ }
990
+ },
991
+ "required": ["condition", "effect"],
992
+ "additionalProperties": false
993
+ }
994
+ },
995
+ "$id": "urn:dr:spec:node:security.policyrule"
996
+ },
997
+ "resourceoperation": {
998
+ "$schema": "http://json-schema.org/draft-07/schema#",
999
+ "title": "ResourceOperation",
1000
+ "description": "A permitted operation that an actor may perform on a secured resource, forming the verb component of a subject-verb-object access control policy. Bound to AccessConditions, RateLimits, and AuditConfig nodes via the security policy model, per NIST SP 800-53 AC-3 (Access Enforcement).",
1001
+ "allOf": [
1002
+ {
1003
+ "$ref": "urn:dr:spec:base:spec-node"
1004
+ }
1005
+ ],
1006
+ "properties": {
1007
+ "spec_node_id": {
1008
+ "const": "security.resourceoperation"
1009
+ },
1010
+ "layer_id": {
1011
+ "const": "security"
1012
+ },
1013
+ "type": {
1014
+ "const": "resourceoperation"
1015
+ },
1016
+ "attributes": {
1017
+ "type": "object",
1018
+ "properties": {
1019
+ "operation": {
1020
+ "type": "string",
1021
+ "enum": [
1022
+ "create",
1023
+ "read",
1024
+ "update",
1025
+ "delete",
1026
+ "list",
1027
+ "execute",
1028
+ "approve",
1029
+ "share",
1030
+ "export",
1031
+ "import"
1032
+ ],
1033
+ "description": "Permitted operation type on the secured resource."
1034
+ },
1035
+ "description": {
1036
+ "type": "string"
1037
+ },
1038
+ "conditions": {
1039
+ "type": "array",
1040
+ "description": "References AccessCondition nodes that must be satisfied before this operation is authorized."
1041
+ },
1042
+ "rateLimit": {
1043
+ "type": "array",
1044
+ "description": "References RateLimit nodes (api.ratelimit) applied to this operation."
1045
+ },
1046
+ "audit": {
1047
+ "type": "array",
1048
+ "description": "References AuditConfig nodes specifying how this operation is logged for accountability."
1049
+ }
1050
+ },
1051
+ "required": ["operation"],
1052
+ "additionalProperties": false
1053
+ }
1054
+ },
1055
+ "$id": "urn:dr:spec:node:security.resourceoperation"
1056
+ },
1057
+ "retentionpolicy": {
1058
+ "$schema": "http://json-schema.org/draft-07/schema#",
1059
+ "title": "RetentionPolicy",
1060
+ "description": "Defines how long security-related data (audit logs, access records, encryption keys) must be retained, archival strategies, and secure deletion procedures. Ensures compliance with regulatory requirements.",
1061
+ "allOf": [
1062
+ {
1063
+ "$ref": "urn:dr:spec:base:spec-node"
1064
+ }
1065
+ ],
1066
+ "properties": {
1067
+ "spec_node_id": {
1068
+ "const": "security.retentionpolicy"
1069
+ },
1070
+ "layer_id": {
1071
+ "const": "security"
1072
+ },
1073
+ "type": {
1074
+ "const": "retentionpolicy"
1075
+ },
1076
+ "attributes": {
1077
+ "type": "object",
1078
+ "properties": {
1079
+ "period": {
1080
+ "type": "string"
1081
+ },
1082
+ "destination": {
1083
+ "type": "string",
1084
+ "enum": [
1085
+ "siem",
1086
+ "database",
1087
+ "file",
1088
+ "cloud",
1089
+ "stream",
1090
+ "archive"
1091
+ ],
1092
+ "description": "Storage or forwarding target for retained security data, per NIST SP 800-53 AU-9 Protection of Audit Information."
1093
+ },
1094
+ "deletionMethod": {
1095
+ "type": "string",
1096
+ "enum": [
1097
+ "secure-erase",
1098
+ "crypto-shred",
1099
+ "overwrite",
1100
+ "logical-delete",
1101
+ "archive"
1102
+ ],
1103
+ "description": "Secure disposal technique applied when data reaches end of retention period, per NIST SP 800-88 Guidelines for Media Sanitization."
1104
+ },
1105
+ "description": {
1106
+ "type": "string"
1107
+ }
1108
+ },
1109
+ "required": ["period"],
1110
+ "additionalProperties": false
1111
+ }
1112
+ },
1113
+ "$id": "urn:dr:spec:node:security.retentionpolicy"
1114
+ },
1115
+ "role": {
1116
+ "$schema": "http://json-schema.org/draft-07/schema#",
1117
+ "title": "Role",
1118
+ "description": "A named collection of Permissions implementing RBAC per NIST SP 800-53 AC-2 and AC-6. Roles can inherit from parent roles (role hierarchy), accumulating permissions transitively. The level attribute defines the role privilege tier for least-privilege enforcement.",
1119
+ "allOf": [
1120
+ {
1121
+ "$ref": "urn:dr:spec:base:spec-node"
1122
+ }
1123
+ ],
1124
+ "properties": {
1125
+ "spec_node_id": {
1126
+ "const": "security.role"
1127
+ },
1128
+ "layer_id": {
1129
+ "const": "security"
1130
+ },
1131
+ "type": {
1132
+ "const": "role"
1133
+ },
1134
+ "attributes": {
1135
+ "type": "object",
1136
+ "properties": {
1137
+ "displayName": {
1138
+ "type": "string"
1139
+ },
1140
+ "description": {
1141
+ "type": "string"
1142
+ },
1143
+ "level": {
1144
+ "type": "integer"
1145
+ },
1146
+ "inheritsFrom": {
1147
+ "type": "string",
1148
+ "description": "Name of the parent role this role inherits permissions from. Supports single inheritance; the child accumulates all permissions of the referenced role in addition to its own."
1149
+ }
1150
+ },
1151
+ "required": ["displayName", "level", "inheritsFrom"],
1152
+ "additionalProperties": false
1153
+ }
1154
+ },
1155
+ "$id": "urn:dr:spec:node:security.role"
1156
+ },
1157
+ "secureresource": {
1158
+ "$schema": "http://json-schema.org/draft-07/schema#",
1159
+ "title": "SecureResource",
1160
+ "description": "Represents a named resource subject to security controls, defining the operations that can be performed on it and optional field-level access restrictions. Acts as the resource component in subject-action-resource access control triples per NIST SP 800-53 AC-3.",
1161
+ "allOf": [
1162
+ {
1163
+ "$ref": "urn:dr:spec:base:spec-node"
1164
+ }
1165
+ ],
1166
+ "properties": {
1167
+ "spec_node_id": {
1168
+ "const": "security.secureresource"
1169
+ },
1170
+ "layer_id": {
1171
+ "const": "security"
1172
+ },
1173
+ "type": {
1174
+ "const": "secureresource"
1175
+ },
1176
+ "attributes": {
1177
+ "type": "object",
1178
+ "properties": {
1179
+ "resource": {
1180
+ "type": "string"
1181
+ },
1182
+ "type": {
1183
+ "type": "string",
1184
+ "enum": ["api", "database", "file", "service", "ui", "stream"],
1185
+ "description": "Category of protected resource, used to apply appropriate access control and audit policies per NIST SP 800-53 AC-3."
1186
+ },
1187
+ "description": {
1188
+ "type": "string"
1189
+ }
1190
+ },
1191
+ "required": ["resource", "type"],
1192
+ "additionalProperties": false
1193
+ }
1194
+ },
1195
+ "$id": "urn:dr:spec:node:security.secureresource"
1196
+ },
1197
+ "securityconstraints": {
1198
+ "$schema": "http://json-schema.org/draft-07/schema#",
1199
+ "title": "SecurityConstraints",
1200
+ "description": "An aggregate container defining the procedural access control constraints for an application, grouping SeparationOfDuty, BindingOfDuty, and NeedToKnow rules. Applied within SecurityModel to enforce AC-5 and workflow integrity controls.",
1201
+ "allOf": [
1202
+ {
1203
+ "$ref": "urn:dr:spec:base:spec-node"
1204
+ }
1205
+ ],
1206
+ "properties": {
1207
+ "spec_node_id": {
1208
+ "const": "security.securityconstraints"
1209
+ },
1210
+ "layer_id": {
1211
+ "const": "security"
1212
+ },
1213
+ "type": {
1214
+ "const": "securityconstraints"
1215
+ },
1216
+ "attributes": {
1217
+ "type": "object",
1218
+ "properties": {
1219
+ "version": {
1220
+ "type": "string"
1221
+ }
1222
+ },
1223
+ "additionalProperties": false
1224
+ }
1225
+ },
1226
+ "$id": "urn:dr:spec:node:security.securityconstraints"
1227
+ },
1228
+ "securitymodel": {
1229
+ "$schema": "http://json-schema.org/draft-07/schema#",
1230
+ "title": "SecurityModel",
1231
+ "description": "The root aggregate for an application's security posture, composing authentication, authorization (roles, permissions, resources), threat model, data classification, accountability requirements, and policies into a unified security specification. Scoped to a single application or bounded context.",
1232
+ "allOf": [
1233
+ {
1234
+ "$ref": "urn:dr:spec:base:spec-node"
1235
+ }
1236
+ ],
1237
+ "properties": {
1238
+ "spec_node_id": {
1239
+ "const": "security.securitymodel"
1240
+ },
1241
+ "layer_id": {
1242
+ "const": "security"
1243
+ },
1244
+ "type": {
1245
+ "const": "securitymodel"
1246
+ },
1247
+ "attributes": {
1248
+ "type": "object",
1249
+ "properties": {
1250
+ "version": {
1251
+ "type": "string"
1252
+ },
1253
+ "application": {
1254
+ "type": "string",
1255
+ "description": "Name or identifier of the application this security model governs. Used to scope the security posture to a single application or bounded context."
1256
+ },
1257
+ "accessControlModel": {
1258
+ "type": "string",
1259
+ "enum": ["dac", "mac", "rbac", "abac", "rebac"],
1260
+ "description": "Access control paradigm in use: DAC (discretionary), MAC (mandatory), RBAC (role-based), ABAC (attribute-based), ReBAC (relationship-based). Per NIST SP 800-162 and SP 800-207."
1261
+ }
1262
+ },
1263
+ "required": ["version", "application"],
1264
+ "additionalProperties": false
1265
+ }
1266
+ },
1267
+ "$id": "urn:dr:spec:node:security.securitymodel"
1268
+ },
1269
+ "securitypolicy": {
1270
+ "$schema": "http://json-schema.org/draft-07/schema#",
1271
+ "title": "SecurityPolicy",
1272
+ "description": "A named, prioritized security policy containing ordered evaluation rules that determine access control decisions for targeted resources or operations. Policies are evaluated in priority order with the highest-priority matching policy determining the outcome. Implements NIST SP 800-53 AC-1 policy requirements.",
1273
+ "allOf": [
1274
+ {
1275
+ "$ref": "urn:dr:spec:base:spec-node"
1276
+ }
1277
+ ],
1278
+ "properties": {
1279
+ "spec_node_id": {
1280
+ "const": "security.securitypolicy"
1281
+ },
1282
+ "layer_id": {
1283
+ "const": "security"
1284
+ },
1285
+ "type": {
1286
+ "const": "securitypolicy"
1287
+ },
1288
+ "attributes": {
1289
+ "type": "object",
1290
+ "properties": {
1291
+ "description": {
1292
+ "type": "string"
1293
+ },
1294
+ "enabled": {
1295
+ "type": "boolean"
1296
+ },
1297
+ "priority": {
1298
+ "type": "integer"
1299
+ },
1300
+ "target": {
1301
+ "type": "string",
1302
+ "enum": [
1303
+ "endpoint",
1304
+ "service",
1305
+ "data",
1306
+ "user",
1307
+ "role",
1308
+ "resource"
1309
+ ],
1310
+ "description": "The category of entity this policy governs, aligned with XACML target element semantics."
1311
+ },
1312
+ "requirementLevel": {
1313
+ "type": "string",
1314
+ "enum": ["mandatory", "recommended", "optional", "conditional"],
1315
+ "description": "Compliance obligation of this policy, indicating whether enforcement is required by regulation, recommended best practice, or situationally applicable."
1316
+ },
1317
+ "source": {
1318
+ "type": "object",
1319
+ "description": "Source code reference"
1320
+ }
1321
+ },
1322
+ "required": ["priority", "target"],
1323
+ "additionalProperties": false
1324
+ }
1325
+ },
1326
+ "$id": "urn:dr:spec:node:security.securitypolicy"
1327
+ },
1328
+ "separationofduty": {
1329
+ "$schema": "http://json-schema.org/draft-07/schema#",
1330
+ "title": "SeparationOfDuty",
1331
+ "description": "Enforces NIST SP 800-53 AC-5 by requiring that sensitive tasks (e.g., request + approval, initiate + authorize) are performed by different actors or roles, preventing fraud, collusion, and undetected errors. MutuallyExclusive indicates roles that cannot be assigned to the same individual.",
1332
+ "allOf": [
1333
+ {
1334
+ "$ref": "urn:dr:spec:base:spec-node"
1335
+ }
1336
+ ],
1337
+ "properties": {
1338
+ "spec_node_id": {
1339
+ "const": "security.separationofduty"
1340
+ },
1341
+ "layer_id": {
1342
+ "const": "security"
1343
+ },
1344
+ "type": {
1345
+ "const": "separationofduty"
1346
+ },
1347
+ "attributes": {
1348
+ "type": "object",
1349
+ "properties": {
1350
+ "description": {
1351
+ "type": "string"
1352
+ },
1353
+ "message": {
1354
+ "type": "string"
1355
+ },
1356
+ "mutuallyExclusive": {
1357
+ "type": "boolean",
1358
+ "description": "When true, the roles in this constraint cannot be held simultaneously by the same subject. Enforces strict role exclusivity within the separation of duty rule."
1359
+ }
1360
+ },
1361
+ "required": ["message"],
1362
+ "additionalProperties": false
1363
+ }
1364
+ },
1365
+ "$id": "urn:dr:spec:node:security.separationofduty"
1366
+ },
1367
+ "threat": {
1368
+ "$schema": "http://json-schema.org/draft-07/schema#",
1369
+ "title": "Threat",
1370
+ "description": "Represents an identified security threat with assessed likelihood and impact, targeting specific resources or controls. Linked to Countermeasures that reduce exposure. Supports NIST SP 800-53 RA-3 risk assessment and enables residual risk tracking.",
1371
+ "allOf": [
1372
+ {
1373
+ "$ref": "urn:dr:spec:base:spec-node"
1374
+ }
1375
+ ],
1376
+ "properties": {
1377
+ "spec_node_id": {
1378
+ "const": "security.threat"
1379
+ },
1380
+ "layer_id": {
1381
+ "const": "security"
1382
+ },
1383
+ "type": {
1384
+ "const": "threat"
1385
+ },
1386
+ "attributes": {
1387
+ "type": "object",
1388
+ "properties": {
1389
+ "description": {
1390
+ "type": "string"
1391
+ },
1392
+ "threatens": {
1393
+ "type": "string"
1394
+ },
1395
+ "likelihood": {
1396
+ "type": "string",
1397
+ "enum": ["low", "moderate", "high"],
1398
+ "description": "Probability the threat will be exploited, per NIST SP 800-30 Table E-2."
1399
+ },
1400
+ "impact": {
1401
+ "type": "string",
1402
+ "enum": ["low", "moderate", "high"],
1403
+ "description": "Potential adverse impact if the threat is realized, per NIST FIPS 199."
1404
+ },
1405
+ "criticality": {
1406
+ "type": "string",
1407
+ "enum": ["low", "medium", "high", "critical"],
1408
+ "description": "Combined severity rating reflecting both likelihood and impact for prioritization."
1409
+ },
1410
+ "source": {
1411
+ "type": "object",
1412
+ "description": "Source code reference"
1413
+ }
1414
+ },
1415
+ "required": ["threatens", "likelihood", "impact"],
1416
+ "additionalProperties": false
1417
+ }
1418
+ },
1419
+ "$id": "urn:dr:spec:node:security.threat"
1420
+ },
1421
+ "validationrule": {
1422
+ "$schema": "http://json-schema.org/draft-07/schema#",
1423
+ "title": "ValidationRule",
1424
+ "description": "Specifies data validation constraints for FieldAccessControl, defining allowed patterns, value ranges, or transformations applied when accessing protected fields. Prevents data corruption and enforces field-level integrity.",
1425
+ "allOf": [
1426
+ {
1427
+ "$ref": "urn:dr:spec:base:spec-node"
1428
+ }
1429
+ ],
1430
+ "properties": {
1431
+ "spec_node_id": {
1432
+ "const": "security.validationrule"
1433
+ },
1434
+ "layer_id": {
1435
+ "const": "security"
1436
+ },
1437
+ "type": {
1438
+ "const": "validationrule"
1439
+ },
1440
+ "attributes": {
1441
+ "type": "object",
1442
+ "properties": {
1443
+ "type": {
1444
+ "type": "string",
1445
+ "enum": ["regex", "range", "length", "enum", "custom"],
1446
+ "description": "Validation mechanism type, per NIST SI-10 (Information Input Validation)."
1447
+ },
1448
+ "value": {
1449
+ "type": "string",
1450
+ "description": "Validation constraint value whose meaning depends on `type`: a regex pattern string, a numeric range expression (e.g. '1-100'), a maximum character count, a pipe-delimited list of allowed enum values, or a custom expression string."
1451
+ },
1452
+ "message": {
1453
+ "type": "string",
1454
+ "description": "Human-readable violation message shown to the user or logged when this validation rule fails."
1455
+ },
1456
+ "severity": {
1457
+ "type": "string",
1458
+ "enum": ["error", "warning", "info"],
1459
+ "description": "Severity of a validation rule violation."
1460
+ },
1461
+ "source": {
1462
+ "type": "object",
1463
+ "description": "Source code reference"
1464
+ }
1465
+ },
1466
+ "required": ["type", "value", "message"],
1467
+ "additionalProperties": false
1468
+ }
1469
+ },
1470
+ "$id": "urn:dr:spec:node:security.validationrule"
1471
+ }
1472
+ },
1473
+ "relationshipSchemas": {
1474
+ "security.accesscondition.composes.security.policyrule": {
1475
+ "id": "security.accesscondition.composes.security.policyrule",
1476
+ "source_spec_node_id": "security.accesscondition",
1477
+ "source_layer": "security",
1478
+ "destination_spec_node_id": "security.policyrule",
1479
+ "destination_layer": "security",
1480
+ "predicate": "composes",
1481
+ "cardinality": "many-to-many",
1482
+ "strength": "medium",
1483
+ "required": false
1484
+ },
1485
+ "security.accesscondition.constrains.security.permission": {
1486
+ "id": "security.accesscondition.constrains.security.permission",
1487
+ "source_spec_node_id": "security.accesscondition",
1488
+ "source_layer": "security",
1489
+ "destination_spec_node_id": "security.permission",
1490
+ "destination_layer": "security",
1491
+ "predicate": "constrains",
1492
+ "cardinality": "many-to-many",
1493
+ "strength": "medium",
1494
+ "required": false
1495
+ },
1496
+ "security.accesscondition.governs.security.fieldaccesscontrol": {
1497
+ "id": "security.accesscondition.governs.security.fieldaccesscontrol",
1498
+ "source_spec_node_id": "security.accesscondition",
1499
+ "source_layer": "security",
1500
+ "destination_spec_node_id": "security.fieldaccesscontrol",
1501
+ "destination_layer": "security",
1502
+ "predicate": "governs",
1503
+ "cardinality": "many-to-many",
1504
+ "strength": "medium",
1505
+ "required": false
1506
+ },
1507
+ "security.accesscondition.references.security.secureresource": {
1508
+ "id": "security.accesscondition.references.security.secureresource",
1509
+ "source_spec_node_id": "security.accesscondition",
1510
+ "source_layer": "security",
1511
+ "destination_spec_node_id": "security.secureresource",
1512
+ "destination_layer": "security",
1513
+ "predicate": "references",
1514
+ "cardinality": "many-to-many",
1515
+ "strength": "medium",
1516
+ "required": false
1517
+ },
1518
+ "security.accesscondition.uses.security.validationrule": {
1519
+ "id": "security.accesscondition.uses.security.validationrule",
1520
+ "source_spec_node_id": "security.accesscondition",
1521
+ "source_layer": "security",
1522
+ "destination_spec_node_id": "security.validationrule",
1523
+ "destination_layer": "security",
1524
+ "predicate": "uses",
1525
+ "cardinality": "many-to-many",
1526
+ "strength": "medium",
1527
+ "required": false
1528
+ },
1529
+ "security.accountabilityrequirement.constrains.security.actor": {
1530
+ "id": "security.accountabilityrequirement.constrains.security.actor",
1531
+ "source_spec_node_id": "security.accountabilityrequirement",
1532
+ "source_layer": "security",
1533
+ "destination_spec_node_id": "security.actor",
1534
+ "destination_layer": "security",
1535
+ "predicate": "constrains",
1536
+ "cardinality": "many-to-many",
1537
+ "strength": "medium",
1538
+ "required": false
1539
+ },
1540
+ "security.accountabilityrequirement.requires.security.auditconfig": {
1541
+ "id": "security.accountabilityrequirement.requires.security.auditconfig",
1542
+ "source_spec_node_id": "security.accountabilityrequirement",
1543
+ "source_layer": "security",
1544
+ "destination_spec_node_id": "security.auditconfig",
1545
+ "destination_layer": "security",
1546
+ "predicate": "requires",
1547
+ "cardinality": "many-to-many",
1548
+ "strength": "medium",
1549
+ "required": false
1550
+ },
1551
+ "security.accountabilityrequirement.requires.security.evidence": {
1552
+ "id": "security.accountabilityrequirement.requires.security.evidence",
1553
+ "source_spec_node_id": "security.accountabilityrequirement",
1554
+ "source_layer": "security",
1555
+ "destination_spec_node_id": "security.evidence",
1556
+ "destination_layer": "security",
1557
+ "predicate": "requires",
1558
+ "cardinality": "many-to-many",
1559
+ "strength": "medium",
1560
+ "required": false
1561
+ },
1562
+ "security.accountabilityrequirement.requires.security.retentionpolicy": {
1563
+ "id": "security.accountabilityrequirement.requires.security.retentionpolicy",
1564
+ "source_spec_node_id": "security.accountabilityrequirement",
1565
+ "source_layer": "security",
1566
+ "destination_spec_node_id": "security.retentionpolicy",
1567
+ "destination_layer": "security",
1568
+ "predicate": "requires",
1569
+ "cardinality": "many-to-many",
1570
+ "strength": "medium",
1571
+ "required": false
1572
+ },
1573
+ "security.accountabilityrequirement.satisfies.motivation.requirement": {
1574
+ "id": "security.accountabilityrequirement.satisfies.motivation.requirement",
1575
+ "source_spec_node_id": "security.accountabilityrequirement",
1576
+ "source_layer": "security",
1577
+ "destination_spec_node_id": "motivation.requirement",
1578
+ "destination_layer": "motivation",
1579
+ "predicate": "satisfies",
1580
+ "cardinality": "many-to-many",
1581
+ "strength": "medium",
1582
+ "required": false
1583
+ },
1584
+ "security.actor.accesses.security.secureresource": {
1585
+ "id": "security.actor.accesses.security.secureresource",
1586
+ "source_spec_node_id": "security.actor",
1587
+ "source_layer": "security",
1588
+ "destination_spec_node_id": "security.secureresource",
1589
+ "destination_layer": "security",
1590
+ "predicate": "accesses",
1591
+ "cardinality": "many-to-many",
1592
+ "strength": "medium",
1593
+ "required": false
1594
+ },
1595
+ "security.actor.assigned-to.security.role": {
1596
+ "id": "security.actor.assigned-to.security.role",
1597
+ "source_spec_node_id": "security.actor",
1598
+ "source_layer": "security",
1599
+ "destination_spec_node_id": "security.role",
1600
+ "destination_layer": "security",
1601
+ "predicate": "assigned-to",
1602
+ "cardinality": "many-to-many",
1603
+ "strength": "medium",
1604
+ "required": false
1605
+ },
1606
+ "security.actor.associated-with.security.delegation": {
1607
+ "id": "security.actor.associated-with.security.delegation",
1608
+ "source_spec_node_id": "security.actor",
1609
+ "source_layer": "security",
1610
+ "destination_spec_node_id": "security.delegation",
1611
+ "destination_layer": "security",
1612
+ "predicate": "associated-with",
1613
+ "cardinality": "many-to-many",
1614
+ "strength": "medium",
1615
+ "required": false
1616
+ },
1617
+ "security.actor.associated-with.security.threat": {
1618
+ "id": "security.actor.associated-with.security.threat",
1619
+ "source_spec_node_id": "security.actor",
1620
+ "source_layer": "security",
1621
+ "destination_spec_node_id": "security.threat",
1622
+ "destination_layer": "security",
1623
+ "predicate": "associated-with",
1624
+ "cardinality": "many-to-many",
1625
+ "strength": "medium",
1626
+ "required": false
1627
+ },
1628
+ "security.actor.constrained-by.security.securityconstraints": {
1629
+ "id": "security.actor.constrained-by.security.securityconstraints",
1630
+ "source_spec_node_id": "security.actor",
1631
+ "source_layer": "security",
1632
+ "destination_spec_node_id": "security.securityconstraints",
1633
+ "destination_layer": "security",
1634
+ "predicate": "constrained-by",
1635
+ "cardinality": "many-to-many",
1636
+ "strength": "medium",
1637
+ "required": false
1638
+ },
1639
+ "security.actor.governed-by.security.authenticationconfig": {
1640
+ "id": "security.actor.governed-by.security.authenticationconfig",
1641
+ "source_spec_node_id": "security.actor",
1642
+ "source_layer": "security",
1643
+ "destination_spec_node_id": "security.authenticationconfig",
1644
+ "destination_layer": "security",
1645
+ "predicate": "governed-by",
1646
+ "cardinality": "many-to-many",
1647
+ "strength": "medium",
1648
+ "required": false
1649
+ },
1650
+ "security.actor.references.security.delegation": {
1651
+ "id": "security.actor.references.security.delegation",
1652
+ "source_spec_node_id": "security.actor",
1653
+ "source_layer": "security",
1654
+ "destination_spec_node_id": "security.delegation",
1655
+ "destination_layer": "security",
1656
+ "predicate": "references",
1657
+ "cardinality": "many-to-many",
1658
+ "strength": "medium",
1659
+ "required": false
1660
+ },
1661
+ "security.actor.requires.security.authenticationconfig": {
1662
+ "id": "security.actor.requires.security.authenticationconfig",
1663
+ "source_spec_node_id": "security.actor",
1664
+ "source_layer": "security",
1665
+ "destination_spec_node_id": "security.authenticationconfig",
1666
+ "destination_layer": "security",
1667
+ "predicate": "requires",
1668
+ "cardinality": "many-to-many",
1669
+ "strength": "medium",
1670
+ "required": false
1671
+ },
1672
+ "security.auditconfig.depends-on.security.retentionpolicy": {
1673
+ "id": "security.auditconfig.depends-on.security.retentionpolicy",
1674
+ "source_spec_node_id": "security.auditconfig",
1675
+ "source_layer": "security",
1676
+ "destination_spec_node_id": "security.retentionpolicy",
1677
+ "destination_layer": "security",
1678
+ "predicate": "depends-on",
1679
+ "cardinality": "many-to-many",
1680
+ "strength": "medium",
1681
+ "required": false
1682
+ },
1683
+ "security.auditconfig.fulfills.security.accountabilityrequirement": {
1684
+ "id": "security.auditconfig.fulfills.security.accountabilityrequirement",
1685
+ "source_spec_node_id": "security.auditconfig",
1686
+ "source_layer": "security",
1687
+ "destination_spec_node_id": "security.accountabilityrequirement",
1688
+ "destination_layer": "security",
1689
+ "predicate": "fulfills",
1690
+ "cardinality": "many-to-many",
1691
+ "strength": "medium",
1692
+ "required": false
1693
+ },
1694
+ "security.auditconfig.governs.security.retentionpolicy": {
1695
+ "id": "security.auditconfig.governs.security.retentionpolicy",
1696
+ "source_spec_node_id": "security.auditconfig",
1697
+ "source_layer": "security",
1698
+ "destination_spec_node_id": "security.retentionpolicy",
1699
+ "destination_layer": "security",
1700
+ "predicate": "governs",
1701
+ "cardinality": "many-to-many",
1702
+ "strength": "medium",
1703
+ "required": false
1704
+ },
1705
+ "security.auditconfig.governs.security.secureresource": {
1706
+ "id": "security.auditconfig.governs.security.secureresource",
1707
+ "source_spec_node_id": "security.auditconfig",
1708
+ "source_layer": "security",
1709
+ "destination_spec_node_id": "security.secureresource",
1710
+ "destination_layer": "security",
1711
+ "predicate": "governs",
1712
+ "cardinality": "many-to-many",
1713
+ "strength": "medium",
1714
+ "required": false
1715
+ },
1716
+ "security.auditconfig.mitigates.security.threat": {
1717
+ "id": "security.auditconfig.mitigates.security.threat",
1718
+ "source_spec_node_id": "security.auditconfig",
1719
+ "source_layer": "security",
1720
+ "destination_spec_node_id": "security.threat",
1721
+ "destination_layer": "security",
1722
+ "predicate": "mitigates",
1723
+ "cardinality": "many-to-many",
1724
+ "strength": "medium",
1725
+ "required": false
1726
+ },
1727
+ "security.auditconfig.monitors.security.secureresource": {
1728
+ "id": "security.auditconfig.monitors.security.secureresource",
1729
+ "source_spec_node_id": "security.auditconfig",
1730
+ "source_layer": "security",
1731
+ "destination_spec_node_id": "security.secureresource",
1732
+ "destination_layer": "security",
1733
+ "predicate": "monitors",
1734
+ "cardinality": "many-to-many",
1735
+ "strength": "medium",
1736
+ "required": false
1737
+ },
1738
+ "security.auditconfig.triggers.security.evidence": {
1739
+ "id": "security.auditconfig.triggers.security.evidence",
1740
+ "source_spec_node_id": "security.auditconfig",
1741
+ "source_layer": "security",
1742
+ "destination_spec_node_id": "security.evidence",
1743
+ "destination_layer": "security",
1744
+ "predicate": "triggers",
1745
+ "cardinality": "many-to-many",
1746
+ "strength": "medium",
1747
+ "required": false
1748
+ },
1749
+ "security.authenticationconfig.authenticates.security.actor": {
1750
+ "id": "security.authenticationconfig.authenticates.security.actor",
1751
+ "source_spec_node_id": "security.authenticationconfig",
1752
+ "source_layer": "security",
1753
+ "destination_spec_node_id": "security.actor",
1754
+ "destination_layer": "security",
1755
+ "predicate": "authenticates",
1756
+ "cardinality": "many-to-many",
1757
+ "strength": "medium",
1758
+ "required": false
1759
+ },
1760
+ "security.authenticationconfig.constrained-by.security.securitypolicy": {
1761
+ "id": "security.authenticationconfig.constrained-by.security.securitypolicy",
1762
+ "source_spec_node_id": "security.authenticationconfig",
1763
+ "source_layer": "security",
1764
+ "destination_spec_node_id": "security.securitypolicy",
1765
+ "destination_layer": "security",
1766
+ "predicate": "constrained-by",
1767
+ "cardinality": "many-to-many",
1768
+ "strength": "medium",
1769
+ "required": false
1770
+ },
1771
+ "security.authenticationconfig.depends-on.security.auditconfig": {
1772
+ "id": "security.authenticationconfig.depends-on.security.auditconfig",
1773
+ "source_spec_node_id": "security.authenticationconfig",
1774
+ "source_layer": "security",
1775
+ "destination_spec_node_id": "security.auditconfig",
1776
+ "destination_layer": "security",
1777
+ "predicate": "depends-on",
1778
+ "cardinality": "many-to-many",
1779
+ "strength": "medium",
1780
+ "required": false
1781
+ },
1782
+ "security.authenticationconfig.protects.security.secureresource": {
1783
+ "id": "security.authenticationconfig.protects.security.secureresource",
1784
+ "source_spec_node_id": "security.authenticationconfig",
1785
+ "source_layer": "security",
1786
+ "destination_spec_node_id": "security.secureresource",
1787
+ "destination_layer": "security",
1788
+ "predicate": "protects",
1789
+ "cardinality": "many-to-many",
1790
+ "strength": "medium",
1791
+ "required": false
1792
+ },
1793
+ "security.authenticationconfig.references.security.passwordpolicy": {
1794
+ "id": "security.authenticationconfig.references.security.passwordpolicy",
1795
+ "source_spec_node_id": "security.authenticationconfig",
1796
+ "source_layer": "security",
1797
+ "destination_spec_node_id": "security.passwordpolicy",
1798
+ "destination_layer": "security",
1799
+ "predicate": "references",
1800
+ "cardinality": "many-to-many",
1801
+ "strength": "medium",
1802
+ "required": false
1803
+ },
1804
+ "security.authenticationconfig.uses.security.passwordpolicy": {
1805
+ "id": "security.authenticationconfig.uses.security.passwordpolicy",
1806
+ "source_spec_node_id": "security.authenticationconfig",
1807
+ "source_layer": "security",
1808
+ "destination_spec_node_id": "security.passwordpolicy",
1809
+ "destination_layer": "security",
1810
+ "predicate": "uses",
1811
+ "cardinality": "many-to-many",
1812
+ "strength": "medium",
1813
+ "required": false
1814
+ },
1815
+ "security.bindingofduty.associated-with.security.separationofduty": {
1816
+ "id": "security.bindingofduty.associated-with.security.separationofduty",
1817
+ "source_spec_node_id": "security.bindingofduty",
1818
+ "source_layer": "security",
1819
+ "destination_spec_node_id": "security.separationofduty",
1820
+ "destination_layer": "security",
1821
+ "predicate": "associated-with",
1822
+ "cardinality": "many-to-many",
1823
+ "strength": "medium",
1824
+ "required": false
1825
+ },
1826
+ "security.bindingofduty.constrains.security.role": {
1827
+ "id": "security.bindingofduty.constrains.security.role",
1828
+ "source_spec_node_id": "security.bindingofduty",
1829
+ "source_layer": "security",
1830
+ "destination_spec_node_id": "security.role",
1831
+ "destination_layer": "security",
1832
+ "predicate": "constrains",
1833
+ "cardinality": "many-to-many",
1834
+ "strength": "medium",
1835
+ "required": false
1836
+ },
1837
+ "security.bindingofduty.governs.security.resourceoperation": {
1838
+ "id": "security.bindingofduty.governs.security.resourceoperation",
1839
+ "source_spec_node_id": "security.bindingofduty",
1840
+ "source_layer": "security",
1841
+ "destination_spec_node_id": "security.resourceoperation",
1842
+ "destination_layer": "security",
1843
+ "predicate": "governs",
1844
+ "cardinality": "many-to-many",
1845
+ "strength": "medium",
1846
+ "required": false
1847
+ },
1848
+ "security.bindingofduty.requires.security.evidence": {
1849
+ "id": "security.bindingofduty.requires.security.evidence",
1850
+ "source_spec_node_id": "security.bindingofduty",
1851
+ "source_layer": "security",
1852
+ "destination_spec_node_id": "security.evidence",
1853
+ "destination_layer": "security",
1854
+ "predicate": "requires",
1855
+ "cardinality": "many-to-many",
1856
+ "strength": "medium",
1857
+ "required": false
1858
+ },
1859
+ "security.bindingofduty.supports.security.accountabilityrequirement": {
1860
+ "id": "security.bindingofduty.supports.security.accountabilityrequirement",
1861
+ "source_spec_node_id": "security.bindingofduty",
1862
+ "source_layer": "security",
1863
+ "destination_spec_node_id": "security.accountabilityrequirement",
1864
+ "destination_layer": "security",
1865
+ "predicate": "supports",
1866
+ "cardinality": "many-to-many",
1867
+ "strength": "medium",
1868
+ "required": false
1869
+ },
1870
+ "security.condition.composes.security.accesscondition": {
1871
+ "id": "security.condition.composes.security.accesscondition",
1872
+ "source_spec_node_id": "security.condition",
1873
+ "source_layer": "security",
1874
+ "destination_spec_node_id": "security.accesscondition",
1875
+ "destination_layer": "security",
1876
+ "predicate": "composes",
1877
+ "cardinality": "many-to-many",
1878
+ "strength": "medium",
1879
+ "required": false
1880
+ },
1881
+ "security.condition.constrains.security.policyrule": {
1882
+ "id": "security.condition.constrains.security.policyrule",
1883
+ "source_spec_node_id": "security.condition",
1884
+ "source_layer": "security",
1885
+ "destination_spec_node_id": "security.policyrule",
1886
+ "destination_layer": "security",
1887
+ "predicate": "constrains",
1888
+ "cardinality": "many-to-many",
1889
+ "strength": "medium",
1890
+ "required": false
1891
+ },
1892
+ "security.condition.constrains.security.securitypolicy": {
1893
+ "id": "security.condition.constrains.security.securitypolicy",
1894
+ "source_spec_node_id": "security.condition",
1895
+ "source_layer": "security",
1896
+ "destination_spec_node_id": "security.securitypolicy",
1897
+ "destination_layer": "security",
1898
+ "predicate": "constrains",
1899
+ "cardinality": "many-to-many",
1900
+ "strength": "medium",
1901
+ "required": false
1902
+ },
1903
+ "security.condition.triggers.security.policyaction": {
1904
+ "id": "security.condition.triggers.security.policyaction",
1905
+ "source_spec_node_id": "security.condition",
1906
+ "source_layer": "security",
1907
+ "destination_spec_node_id": "security.policyaction",
1908
+ "destination_layer": "security",
1909
+ "predicate": "triggers",
1910
+ "cardinality": "many-to-many",
1911
+ "strength": "medium",
1912
+ "required": false
1913
+ },
1914
+ "security.countermeasure.fulfills.security.securityconstraints": {
1915
+ "id": "security.countermeasure.fulfills.security.securityconstraints",
1916
+ "source_spec_node_id": "security.countermeasure",
1917
+ "source_layer": "security",
1918
+ "destination_spec_node_id": "security.securityconstraints",
1919
+ "destination_layer": "security",
1920
+ "predicate": "fulfills",
1921
+ "cardinality": "many-to-many",
1922
+ "strength": "medium",
1923
+ "required": false
1924
+ },
1925
+ "security.countermeasure.implements.security.securitypolicy": {
1926
+ "id": "security.countermeasure.implements.security.securitypolicy",
1927
+ "source_spec_node_id": "security.countermeasure",
1928
+ "source_layer": "security",
1929
+ "destination_spec_node_id": "security.securitypolicy",
1930
+ "destination_layer": "security",
1931
+ "predicate": "implements",
1932
+ "cardinality": "many-to-many",
1933
+ "strength": "medium",
1934
+ "required": false
1935
+ },
1936
+ "security.countermeasure.mitigates.security.threat": {
1937
+ "id": "security.countermeasure.mitigates.security.threat",
1938
+ "source_spec_node_id": "security.countermeasure",
1939
+ "source_layer": "security",
1940
+ "destination_spec_node_id": "security.threat",
1941
+ "destination_layer": "security",
1942
+ "predicate": "mitigates",
1943
+ "cardinality": "many-to-many",
1944
+ "strength": "medium",
1945
+ "required": false
1946
+ },
1947
+ "security.countermeasure.monitors.security.secureresource": {
1948
+ "id": "security.countermeasure.monitors.security.secureresource",
1949
+ "source_spec_node_id": "security.countermeasure",
1950
+ "source_layer": "security",
1951
+ "destination_spec_node_id": "security.secureresource",
1952
+ "destination_layer": "security",
1953
+ "predicate": "monitors",
1954
+ "cardinality": "many-to-many",
1955
+ "strength": "medium",
1956
+ "required": false
1957
+ },
1958
+ "security.countermeasure.protects.business.businessprocess": {
1959
+ "id": "security.countermeasure.protects.business.businessprocess",
1960
+ "source_spec_node_id": "security.countermeasure",
1961
+ "source_layer": "security",
1962
+ "destination_spec_node_id": "business.businessprocess",
1963
+ "destination_layer": "business",
1964
+ "predicate": "protects",
1965
+ "cardinality": "many-to-many",
1966
+ "strength": "medium",
1967
+ "required": false
1968
+ },
1969
+ "security.countermeasure.protects.security.secureresource": {
1970
+ "id": "security.countermeasure.protects.security.secureresource",
1971
+ "source_spec_node_id": "security.countermeasure",
1972
+ "source_layer": "security",
1973
+ "destination_spec_node_id": "security.secureresource",
1974
+ "destination_layer": "security",
1975
+ "predicate": "protects",
1976
+ "cardinality": "many-to-many",
1977
+ "strength": "medium",
1978
+ "required": false
1979
+ },
1980
+ "security.countermeasure.realizes.motivation.goal": {
1981
+ "id": "security.countermeasure.realizes.motivation.goal",
1982
+ "source_spec_node_id": "security.countermeasure",
1983
+ "source_layer": "security",
1984
+ "destination_spec_node_id": "motivation.goal",
1985
+ "destination_layer": "motivation",
1986
+ "predicate": "realizes",
1987
+ "cardinality": "many-to-many",
1988
+ "strength": "medium",
1989
+ "required": false
1990
+ },
1991
+ "security.countermeasure.requires.security.evidence": {
1992
+ "id": "security.countermeasure.requires.security.evidence",
1993
+ "source_spec_node_id": "security.countermeasure",
1994
+ "source_layer": "security",
1995
+ "destination_spec_node_id": "security.evidence",
1996
+ "destination_layer": "security",
1997
+ "predicate": "requires",
1998
+ "cardinality": "many-to-many",
1999
+ "strength": "medium",
2000
+ "required": false
2001
+ },
2002
+ "security.countermeasure.satisfies.motivation.requirement": {
2003
+ "id": "security.countermeasure.satisfies.motivation.requirement",
2004
+ "source_spec_node_id": "security.countermeasure",
2005
+ "source_layer": "security",
2006
+ "destination_spec_node_id": "motivation.requirement",
2007
+ "destination_layer": "motivation",
2008
+ "predicate": "satisfies",
2009
+ "cardinality": "many-to-many",
2010
+ "strength": "medium",
2011
+ "required": false
2012
+ },
2013
+ "security.dataclassification.governs.security.fieldaccesscontrol": {
2014
+ "id": "security.dataclassification.governs.security.fieldaccesscontrol",
2015
+ "source_spec_node_id": "security.dataclassification",
2016
+ "source_layer": "security",
2017
+ "destination_spec_node_id": "security.fieldaccesscontrol",
2018
+ "destination_layer": "security",
2019
+ "predicate": "governs",
2020
+ "cardinality": "many-to-many",
2021
+ "strength": "medium",
2022
+ "required": false
2023
+ },
2024
+ "security.dataclassification.governs.security.informationentity": {
2025
+ "id": "security.dataclassification.governs.security.informationentity",
2026
+ "source_spec_node_id": "security.dataclassification",
2027
+ "source_layer": "security",
2028
+ "destination_spec_node_id": "security.informationentity",
2029
+ "destination_layer": "security",
2030
+ "predicate": "governs",
2031
+ "cardinality": "many-to-many",
2032
+ "strength": "medium",
2033
+ "required": false
2034
+ },
2035
+ "security.dataclassification.governs.security.retentionpolicy": {
2036
+ "id": "security.dataclassification.governs.security.retentionpolicy",
2037
+ "source_spec_node_id": "security.dataclassification",
2038
+ "source_layer": "security",
2039
+ "destination_spec_node_id": "security.retentionpolicy",
2040
+ "destination_layer": "security",
2041
+ "predicate": "governs",
2042
+ "cardinality": "many-to-many",
2043
+ "strength": "medium",
2044
+ "required": false
2045
+ },
2046
+ "security.dataclassification.governs.security.secureresource": {
2047
+ "id": "security.dataclassification.governs.security.secureresource",
2048
+ "source_spec_node_id": "security.dataclassification",
2049
+ "source_layer": "security",
2050
+ "destination_spec_node_id": "security.secureresource",
2051
+ "destination_layer": "security",
2052
+ "predicate": "governs",
2053
+ "cardinality": "many-to-many",
2054
+ "strength": "medium",
2055
+ "required": false
2056
+ },
2057
+ "security.dataclassification.requires.security.countermeasure": {
2058
+ "id": "security.dataclassification.requires.security.countermeasure",
2059
+ "source_spec_node_id": "security.dataclassification",
2060
+ "source_layer": "security",
2061
+ "destination_spec_node_id": "security.countermeasure",
2062
+ "destination_layer": "security",
2063
+ "predicate": "requires",
2064
+ "cardinality": "many-to-many",
2065
+ "strength": "medium",
2066
+ "required": false
2067
+ },
2068
+ "security.dataclassification.supports.security.securitypolicy": {
2069
+ "id": "security.dataclassification.supports.security.securitypolicy",
2070
+ "source_spec_node_id": "security.dataclassification",
2071
+ "source_layer": "security",
2072
+ "destination_spec_node_id": "security.securitypolicy",
2073
+ "destination_layer": "security",
2074
+ "predicate": "supports",
2075
+ "cardinality": "many-to-many",
2076
+ "strength": "medium",
2077
+ "required": false
2078
+ },
2079
+ "security.delegation.authorizes.security.role": {
2080
+ "id": "security.delegation.authorizes.security.role",
2081
+ "source_spec_node_id": "security.delegation",
2082
+ "source_layer": "security",
2083
+ "destination_spec_node_id": "security.role",
2084
+ "destination_layer": "security",
2085
+ "predicate": "authorizes",
2086
+ "cardinality": "many-to-many",
2087
+ "strength": "medium",
2088
+ "required": false
2089
+ },
2090
+ "security.delegation.constrained-by.security.securitypolicy": {
2091
+ "id": "security.delegation.constrained-by.security.securitypolicy",
2092
+ "source_spec_node_id": "security.delegation",
2093
+ "source_layer": "security",
2094
+ "destination_spec_node_id": "security.securitypolicy",
2095
+ "destination_layer": "security",
2096
+ "predicate": "constrained-by",
2097
+ "cardinality": "many-to-many",
2098
+ "strength": "medium",
2099
+ "required": false
2100
+ },
2101
+ "security.delegation.requires.security.actor": {
2102
+ "id": "security.delegation.requires.security.actor",
2103
+ "source_spec_node_id": "security.delegation",
2104
+ "source_layer": "security",
2105
+ "destination_spec_node_id": "security.actor",
2106
+ "destination_layer": "security",
2107
+ "predicate": "requires",
2108
+ "cardinality": "many-to-many",
2109
+ "strength": "medium",
2110
+ "required": false
2111
+ },
2112
+ "security.delegation.triggers.security.evidence": {
2113
+ "id": "security.delegation.triggers.security.evidence",
2114
+ "source_spec_node_id": "security.delegation",
2115
+ "source_layer": "security",
2116
+ "destination_spec_node_id": "security.evidence",
2117
+ "destination_layer": "security",
2118
+ "predicate": "triggers",
2119
+ "cardinality": "many-to-many",
2120
+ "strength": "medium",
2121
+ "required": false
2122
+ },
2123
+ "security.evidence.mitigates.security.threat": {
2124
+ "id": "security.evidence.mitigates.security.threat",
2125
+ "source_spec_node_id": "security.evidence",
2126
+ "source_layer": "security",
2127
+ "destination_spec_node_id": "security.threat",
2128
+ "destination_layer": "security",
2129
+ "predicate": "mitigates",
2130
+ "cardinality": "many-to-many",
2131
+ "strength": "medium",
2132
+ "required": false
2133
+ },
2134
+ "security.evidence.realizes.security.auditconfig": {
2135
+ "id": "security.evidence.realizes.security.auditconfig",
2136
+ "source_spec_node_id": "security.evidence",
2137
+ "source_layer": "security",
2138
+ "destination_spec_node_id": "security.auditconfig",
2139
+ "destination_layer": "security",
2140
+ "predicate": "realizes",
2141
+ "cardinality": "many-to-many",
2142
+ "strength": "medium",
2143
+ "required": false
2144
+ },
2145
+ "security.evidence.supports.security.accountabilityrequirement": {
2146
+ "id": "security.evidence.supports.security.accountabilityrequirement",
2147
+ "source_spec_node_id": "security.evidence",
2148
+ "source_layer": "security",
2149
+ "destination_spec_node_id": "security.accountabilityrequirement",
2150
+ "destination_layer": "security",
2151
+ "predicate": "supports",
2152
+ "cardinality": "many-to-many",
2153
+ "strength": "medium",
2154
+ "required": false
2155
+ },
2156
+ "security.evidence.validates.security.policyrule": {
2157
+ "id": "security.evidence.validates.security.policyrule",
2158
+ "source_spec_node_id": "security.evidence",
2159
+ "source_layer": "security",
2160
+ "destination_spec_node_id": "security.policyrule",
2161
+ "destination_layer": "security",
2162
+ "predicate": "validates",
2163
+ "cardinality": "many-to-many",
2164
+ "strength": "medium",
2165
+ "required": false
2166
+ },
2167
+ "security.fieldaccesscontrol.constrained-by.security.accesscondition": {
2168
+ "id": "security.fieldaccesscontrol.constrained-by.security.accesscondition",
2169
+ "source_spec_node_id": "security.fieldaccesscontrol",
2170
+ "source_layer": "security",
2171
+ "destination_spec_node_id": "security.accesscondition",
2172
+ "destination_layer": "security",
2173
+ "predicate": "constrained-by",
2174
+ "cardinality": "many-to-many",
2175
+ "strength": "medium",
2176
+ "required": false
2177
+ },
2178
+ "security.fieldaccesscontrol.constrained-by.security.dataclassification": {
2179
+ "id": "security.fieldaccesscontrol.constrained-by.security.dataclassification",
2180
+ "source_spec_node_id": "security.fieldaccesscontrol",
2181
+ "source_layer": "security",
2182
+ "destination_spec_node_id": "security.dataclassification",
2183
+ "destination_layer": "security",
2184
+ "predicate": "constrained-by",
2185
+ "cardinality": "many-to-many",
2186
+ "strength": "medium",
2187
+ "required": false
2188
+ },
2189
+ "security.fieldaccesscontrol.governs.security.secureresource": {
2190
+ "id": "security.fieldaccesscontrol.governs.security.secureresource",
2191
+ "source_spec_node_id": "security.fieldaccesscontrol",
2192
+ "source_layer": "security",
2193
+ "destination_spec_node_id": "security.secureresource",
2194
+ "destination_layer": "security",
2195
+ "predicate": "governs",
2196
+ "cardinality": "many-to-many",
2197
+ "strength": "medium",
2198
+ "required": false
2199
+ },
2200
+ "security.fieldaccesscontrol.implements.security.policyrule": {
2201
+ "id": "security.fieldaccesscontrol.implements.security.policyrule",
2202
+ "source_spec_node_id": "security.fieldaccesscontrol",
2203
+ "source_layer": "security",
2204
+ "destination_spec_node_id": "security.policyrule",
2205
+ "destination_layer": "security",
2206
+ "predicate": "implements",
2207
+ "cardinality": "many-to-many",
2208
+ "strength": "medium",
2209
+ "required": false
2210
+ },
2211
+ "security.fieldaccesscontrol.protects.security.secureresource": {
2212
+ "id": "security.fieldaccesscontrol.protects.security.secureresource",
2213
+ "source_spec_node_id": "security.fieldaccesscontrol",
2214
+ "source_layer": "security",
2215
+ "destination_spec_node_id": "security.secureresource",
2216
+ "destination_layer": "security",
2217
+ "predicate": "protects",
2218
+ "cardinality": "many-to-many",
2219
+ "strength": "medium",
2220
+ "required": false
2221
+ },
2222
+ "security.fieldaccesscontrol.requires.security.permission": {
2223
+ "id": "security.fieldaccesscontrol.requires.security.permission",
2224
+ "source_spec_node_id": "security.fieldaccesscontrol",
2225
+ "source_layer": "security",
2226
+ "destination_spec_node_id": "security.permission",
2227
+ "destination_layer": "security",
2228
+ "predicate": "requires",
2229
+ "cardinality": "many-to-many",
2230
+ "strength": "medium",
2231
+ "required": false
2232
+ },
2233
+ "security.informationentity.constrained-by.security.dataclassification": {
2234
+ "id": "security.informationentity.constrained-by.security.dataclassification",
2235
+ "source_spec_node_id": "security.informationentity",
2236
+ "source_layer": "security",
2237
+ "destination_spec_node_id": "security.dataclassification",
2238
+ "destination_layer": "security",
2239
+ "predicate": "constrained-by",
2240
+ "cardinality": "many-to-many",
2241
+ "strength": "medium",
2242
+ "required": false
2243
+ },
2244
+ "security.informationentity.constrained-by.security.retentionpolicy": {
2245
+ "id": "security.informationentity.constrained-by.security.retentionpolicy",
2246
+ "source_spec_node_id": "security.informationentity",
2247
+ "source_layer": "security",
2248
+ "destination_spec_node_id": "security.retentionpolicy",
2249
+ "destination_layer": "security",
2250
+ "predicate": "constrained-by",
2251
+ "cardinality": "many-to-many",
2252
+ "strength": "medium",
2253
+ "required": false
2254
+ },
2255
+ "security.informationentity.governs.security.informationright": {
2256
+ "id": "security.informationentity.governs.security.informationright",
2257
+ "source_spec_node_id": "security.informationentity",
2258
+ "source_layer": "security",
2259
+ "destination_spec_node_id": "security.informationright",
2260
+ "destination_layer": "security",
2261
+ "predicate": "governs",
2262
+ "cardinality": "many-to-many",
2263
+ "strength": "medium",
2264
+ "required": false
2265
+ },
2266
+ "security.informationentity.requires.security.accountabilityrequirement": {
2267
+ "id": "security.informationentity.requires.security.accountabilityrequirement",
2268
+ "source_spec_node_id": "security.informationentity",
2269
+ "source_layer": "security",
2270
+ "destination_spec_node_id": "security.accountabilityrequirement",
2271
+ "destination_layer": "security",
2272
+ "predicate": "requires",
2273
+ "cardinality": "many-to-many",
2274
+ "strength": "medium",
2275
+ "required": false
2276
+ },
2277
+ "security.informationright.accesses.security.informationentity": {
2278
+ "id": "security.informationright.accesses.security.informationentity",
2279
+ "source_spec_node_id": "security.informationright",
2280
+ "source_layer": "security",
2281
+ "destination_spec_node_id": "security.informationentity",
2282
+ "destination_layer": "security",
2283
+ "predicate": "accesses",
2284
+ "cardinality": "many-to-many",
2285
+ "strength": "medium",
2286
+ "required": false
2287
+ },
2288
+ "security.informationright.assigned-to.security.actor": {
2289
+ "id": "security.informationright.assigned-to.security.actor",
2290
+ "source_spec_node_id": "security.informationright",
2291
+ "source_layer": "security",
2292
+ "destination_spec_node_id": "security.actor",
2293
+ "destination_layer": "security",
2294
+ "predicate": "assigned-to",
2295
+ "cardinality": "many-to-many",
2296
+ "strength": "medium",
2297
+ "required": false
2298
+ },
2299
+ "security.informationright.constrained-by.security.accesscondition": {
2300
+ "id": "security.informationright.constrained-by.security.accesscondition",
2301
+ "source_spec_node_id": "security.informationright",
2302
+ "source_layer": "security",
2303
+ "destination_spec_node_id": "security.accesscondition",
2304
+ "destination_layer": "security",
2305
+ "predicate": "constrained-by",
2306
+ "cardinality": "many-to-many",
2307
+ "strength": "medium",
2308
+ "required": false
2309
+ },
2310
+ "security.informationright.governs.security.informationentity": {
2311
+ "id": "security.informationright.governs.security.informationentity",
2312
+ "source_spec_node_id": "security.informationright",
2313
+ "source_layer": "security",
2314
+ "destination_spec_node_id": "security.informationentity",
2315
+ "destination_layer": "security",
2316
+ "predicate": "governs",
2317
+ "cardinality": "many-to-many",
2318
+ "strength": "medium",
2319
+ "required": false
2320
+ },
2321
+ "security.informationright.implements.security.permission": {
2322
+ "id": "security.informationright.implements.security.permission",
2323
+ "source_spec_node_id": "security.informationright",
2324
+ "source_layer": "security",
2325
+ "destination_spec_node_id": "security.permission",
2326
+ "destination_layer": "security",
2327
+ "predicate": "implements",
2328
+ "cardinality": "many-to-many",
2329
+ "strength": "medium",
2330
+ "required": false
2331
+ },
2332
+ "security.needtoknow.associated-with.security.role": {
2333
+ "id": "security.needtoknow.associated-with.security.role",
2334
+ "source_spec_node_id": "security.needtoknow",
2335
+ "source_layer": "security",
2336
+ "destination_spec_node_id": "security.role",
2337
+ "destination_layer": "security",
2338
+ "predicate": "associated-with",
2339
+ "cardinality": "many-to-many",
2340
+ "strength": "medium",
2341
+ "required": false
2342
+ },
2343
+ "security.needtoknow.constrained-by.security.dataclassification": {
2344
+ "id": "security.needtoknow.constrained-by.security.dataclassification",
2345
+ "source_spec_node_id": "security.needtoknow",
2346
+ "source_layer": "security",
2347
+ "destination_spec_node_id": "security.dataclassification",
2348
+ "destination_layer": "security",
2349
+ "predicate": "constrained-by",
2350
+ "cardinality": "many-to-many",
2351
+ "strength": "medium",
2352
+ "required": false
2353
+ },
2354
+ "security.needtoknow.constrains.security.permission": {
2355
+ "id": "security.needtoknow.constrains.security.permission",
2356
+ "source_spec_node_id": "security.needtoknow",
2357
+ "source_layer": "security",
2358
+ "destination_spec_node_id": "security.permission",
2359
+ "destination_layer": "security",
2360
+ "predicate": "constrains",
2361
+ "cardinality": "many-to-many",
2362
+ "strength": "medium",
2363
+ "required": false
2364
+ },
2365
+ "security.needtoknow.implements.security.policyrule": {
2366
+ "id": "security.needtoknow.implements.security.policyrule",
2367
+ "source_spec_node_id": "security.needtoknow",
2368
+ "source_layer": "security",
2369
+ "destination_spec_node_id": "security.policyrule",
2370
+ "destination_layer": "security",
2371
+ "predicate": "implements",
2372
+ "cardinality": "many-to-many",
2373
+ "strength": "medium",
2374
+ "required": false
2375
+ },
2376
+ "security.needtoknow.protects.security.informationentity": {
2377
+ "id": "security.needtoknow.protects.security.informationentity",
2378
+ "source_spec_node_id": "security.needtoknow",
2379
+ "source_layer": "security",
2380
+ "destination_spec_node_id": "security.informationentity",
2381
+ "destination_layer": "security",
2382
+ "predicate": "protects",
2383
+ "cardinality": "many-to-many",
2384
+ "strength": "medium",
2385
+ "required": false
2386
+ },
2387
+ "security.passwordpolicy.constrains.security.authenticationconfig": {
2388
+ "id": "security.passwordpolicy.constrains.security.authenticationconfig",
2389
+ "source_spec_node_id": "security.passwordpolicy",
2390
+ "source_layer": "security",
2391
+ "destination_spec_node_id": "security.authenticationconfig",
2392
+ "destination_layer": "security",
2393
+ "predicate": "constrains",
2394
+ "cardinality": "many-to-many",
2395
+ "strength": "medium",
2396
+ "required": false
2397
+ },
2398
+ "security.passwordpolicy.mandates.security.countermeasure": {
2399
+ "id": "security.passwordpolicy.mandates.security.countermeasure",
2400
+ "source_spec_node_id": "security.passwordpolicy",
2401
+ "source_layer": "security",
2402
+ "destination_spec_node_id": "security.countermeasure",
2403
+ "destination_layer": "security",
2404
+ "predicate": "mandates",
2405
+ "cardinality": "many-to-many",
2406
+ "strength": "medium",
2407
+ "required": false
2408
+ },
2409
+ "security.passwordpolicy.mitigates.security.threat": {
2410
+ "id": "security.passwordpolicy.mitigates.security.threat",
2411
+ "source_spec_node_id": "security.passwordpolicy",
2412
+ "source_layer": "security",
2413
+ "destination_spec_node_id": "security.threat",
2414
+ "destination_layer": "security",
2415
+ "predicate": "mitigates",
2416
+ "cardinality": "many-to-many",
2417
+ "strength": "medium",
2418
+ "required": false
2419
+ },
2420
+ "security.passwordpolicy.requires.security.auditconfig": {
2421
+ "id": "security.passwordpolicy.requires.security.auditconfig",
2422
+ "source_spec_node_id": "security.passwordpolicy",
2423
+ "source_layer": "security",
2424
+ "destination_spec_node_id": "security.auditconfig",
2425
+ "destination_layer": "security",
2426
+ "predicate": "requires",
2427
+ "cardinality": "many-to-many",
2428
+ "strength": "medium",
2429
+ "required": false
2430
+ },
2431
+ "security.passwordpolicy.requires.security.countermeasure": {
2432
+ "id": "security.passwordpolicy.requires.security.countermeasure",
2433
+ "source_spec_node_id": "security.passwordpolicy",
2434
+ "source_layer": "security",
2435
+ "destination_spec_node_id": "security.countermeasure",
2436
+ "destination_layer": "security",
2437
+ "predicate": "requires",
2438
+ "cardinality": "many-to-many",
2439
+ "strength": "medium",
2440
+ "required": false
2441
+ },
2442
+ "security.passwordpolicy.uses.security.validationrule": {
2443
+ "id": "security.passwordpolicy.uses.security.validationrule",
2444
+ "source_spec_node_id": "security.passwordpolicy",
2445
+ "source_layer": "security",
2446
+ "destination_spec_node_id": "security.validationrule",
2447
+ "destination_layer": "security",
2448
+ "predicate": "uses",
2449
+ "cardinality": "many-to-many",
2450
+ "strength": "medium",
2451
+ "required": false
2452
+ },
2453
+ "security.permission.authorizes.security.resourceoperation": {
2454
+ "id": "security.permission.authorizes.security.resourceoperation",
2455
+ "source_spec_node_id": "security.permission",
2456
+ "source_layer": "security",
2457
+ "destination_spec_node_id": "security.resourceoperation",
2458
+ "destination_layer": "security",
2459
+ "predicate": "authorizes",
2460
+ "cardinality": "many-to-many",
2461
+ "strength": "medium",
2462
+ "required": false
2463
+ },
2464
+ "security.policyaction.enforces-requirement.security.policyrule": {
2465
+ "id": "security.policyaction.enforces-requirement.security.policyrule",
2466
+ "source_spec_node_id": "security.policyaction",
2467
+ "source_layer": "security",
2468
+ "destination_spec_node_id": "security.policyrule",
2469
+ "destination_layer": "security",
2470
+ "predicate": "enforces-requirement",
2471
+ "cardinality": "many-to-many",
2472
+ "strength": "medium",
2473
+ "required": false
2474
+ },
2475
+ "security.policyaction.governs.security.permission": {
2476
+ "id": "security.policyaction.governs.security.permission",
2477
+ "source_spec_node_id": "security.policyaction",
2478
+ "source_layer": "security",
2479
+ "destination_spec_node_id": "security.permission",
2480
+ "destination_layer": "security",
2481
+ "predicate": "governs",
2482
+ "cardinality": "many-to-many",
2483
+ "strength": "medium",
2484
+ "required": false
2485
+ },
2486
+ "security.policyaction.mandates.security.countermeasure": {
2487
+ "id": "security.policyaction.mandates.security.countermeasure",
2488
+ "source_spec_node_id": "security.policyaction",
2489
+ "source_layer": "security",
2490
+ "destination_spec_node_id": "security.countermeasure",
2491
+ "destination_layer": "security",
2492
+ "predicate": "mandates",
2493
+ "cardinality": "many-to-many",
2494
+ "strength": "medium",
2495
+ "required": false
2496
+ },
2497
+ "security.policyaction.mitigates.security.threat": {
2498
+ "id": "security.policyaction.mitigates.security.threat",
2499
+ "source_spec_node_id": "security.policyaction",
2500
+ "source_layer": "security",
2501
+ "destination_spec_node_id": "security.threat",
2502
+ "destination_layer": "security",
2503
+ "predicate": "mitigates",
2504
+ "cardinality": "many-to-many",
2505
+ "strength": "medium",
2506
+ "required": false
2507
+ },
2508
+ "security.policyaction.requires.security.countermeasure": {
2509
+ "id": "security.policyaction.requires.security.countermeasure",
2510
+ "source_spec_node_id": "security.policyaction",
2511
+ "source_layer": "security",
2512
+ "destination_spec_node_id": "security.countermeasure",
2513
+ "destination_layer": "security",
2514
+ "predicate": "requires",
2515
+ "cardinality": "many-to-many",
2516
+ "strength": "medium",
2517
+ "required": false
2518
+ },
2519
+ "security.policyaction.triggers.security.auditconfig": {
2520
+ "id": "security.policyaction.triggers.security.auditconfig",
2521
+ "source_spec_node_id": "security.policyaction",
2522
+ "source_layer": "security",
2523
+ "destination_spec_node_id": "security.auditconfig",
2524
+ "destination_layer": "security",
2525
+ "predicate": "triggers",
2526
+ "cardinality": "many-to-many",
2527
+ "strength": "medium",
2528
+ "required": false
2529
+ },
2530
+ "security.policyrule.authorizes.security.permission": {
2531
+ "id": "security.policyrule.authorizes.security.permission",
2532
+ "source_spec_node_id": "security.policyrule",
2533
+ "source_layer": "security",
2534
+ "destination_spec_node_id": "security.permission",
2535
+ "destination_layer": "security",
2536
+ "predicate": "authorizes",
2537
+ "cardinality": "many-to-many",
2538
+ "strength": "medium",
2539
+ "required": false
2540
+ },
2541
+ "security.policyrule.composes.security.securitypolicy": {
2542
+ "id": "security.policyrule.composes.security.securitypolicy",
2543
+ "source_spec_node_id": "security.policyrule",
2544
+ "source_layer": "security",
2545
+ "destination_spec_node_id": "security.securitypolicy",
2546
+ "destination_layer": "security",
2547
+ "predicate": "composes",
2548
+ "cardinality": "many-to-many",
2549
+ "strength": "medium",
2550
+ "required": false
2551
+ },
2552
+ "security.policyrule.generates.security.evidence": {
2553
+ "id": "security.policyrule.generates.security.evidence",
2554
+ "source_spec_node_id": "security.policyrule",
2555
+ "source_layer": "security",
2556
+ "destination_spec_node_id": "security.evidence",
2557
+ "destination_layer": "security",
2558
+ "predicate": "generates",
2559
+ "cardinality": "many-to-many",
2560
+ "strength": "medium",
2561
+ "required": false
2562
+ },
2563
+ "security.policyrule.governs.security.informationright": {
2564
+ "id": "security.policyrule.governs.security.informationright",
2565
+ "source_spec_node_id": "security.policyrule",
2566
+ "source_layer": "security",
2567
+ "destination_spec_node_id": "security.informationright",
2568
+ "destination_layer": "security",
2569
+ "predicate": "governs",
2570
+ "cardinality": "many-to-many",
2571
+ "strength": "medium",
2572
+ "required": false
2573
+ },
2574
+ "security.policyrule.mandates.security.countermeasure": {
2575
+ "id": "security.policyrule.mandates.security.countermeasure",
2576
+ "source_spec_node_id": "security.policyrule",
2577
+ "source_layer": "security",
2578
+ "destination_spec_node_id": "security.countermeasure",
2579
+ "destination_layer": "security",
2580
+ "predicate": "mandates",
2581
+ "cardinality": "many-to-many",
2582
+ "strength": "medium",
2583
+ "required": false
2584
+ },
2585
+ "security.policyrule.protects.security.secureresource": {
2586
+ "id": "security.policyrule.protects.security.secureresource",
2587
+ "source_spec_node_id": "security.policyrule",
2588
+ "source_layer": "security",
2589
+ "destination_spec_node_id": "security.secureresource",
2590
+ "destination_layer": "security",
2591
+ "predicate": "protects",
2592
+ "cardinality": "many-to-many",
2593
+ "strength": "medium",
2594
+ "required": false
2595
+ },
2596
+ "security.policyrule.requires.security.countermeasure": {
2597
+ "id": "security.policyrule.requires.security.countermeasure",
2598
+ "source_spec_node_id": "security.policyrule",
2599
+ "source_layer": "security",
2600
+ "destination_spec_node_id": "security.countermeasure",
2601
+ "destination_layer": "security",
2602
+ "predicate": "requires",
2603
+ "cardinality": "many-to-many",
2604
+ "strength": "medium",
2605
+ "required": false
2606
+ },
2607
+ "security.policyrule.triggers.security.policyaction": {
2608
+ "id": "security.policyrule.triggers.security.policyaction",
2609
+ "source_spec_node_id": "security.policyrule",
2610
+ "source_layer": "security",
2611
+ "destination_spec_node_id": "security.policyaction",
2612
+ "destination_layer": "security",
2613
+ "predicate": "triggers",
2614
+ "cardinality": "many-to-many",
2615
+ "strength": "medium",
2616
+ "required": false
2617
+ },
2618
+ "security.policyrule.uses.security.accesscondition": {
2619
+ "id": "security.policyrule.uses.security.accesscondition",
2620
+ "source_spec_node_id": "security.policyrule",
2621
+ "source_layer": "security",
2622
+ "destination_spec_node_id": "security.accesscondition",
2623
+ "destination_layer": "security",
2624
+ "predicate": "uses",
2625
+ "cardinality": "many-to-many",
2626
+ "strength": "medium",
2627
+ "required": false
2628
+ },
2629
+ "security.policyrule.uses.security.condition": {
2630
+ "id": "security.policyrule.uses.security.condition",
2631
+ "source_spec_node_id": "security.policyrule",
2632
+ "source_layer": "security",
2633
+ "destination_spec_node_id": "security.condition",
2634
+ "destination_layer": "security",
2635
+ "predicate": "uses",
2636
+ "cardinality": "many-to-many",
2637
+ "strength": "medium",
2638
+ "required": false
2639
+ },
2640
+ "security.resourceoperation.accesses.security.secureresource": {
2641
+ "id": "security.resourceoperation.accesses.security.secureresource",
2642
+ "source_spec_node_id": "security.resourceoperation",
2643
+ "source_layer": "security",
2644
+ "destination_spec_node_id": "security.secureresource",
2645
+ "destination_layer": "security",
2646
+ "predicate": "accesses",
2647
+ "cardinality": "many-to-many",
2648
+ "strength": "medium",
2649
+ "required": false
2650
+ },
2651
+ "security.resourceoperation.constrained-by.security.accesscondition": {
2652
+ "id": "security.resourceoperation.constrained-by.security.accesscondition",
2653
+ "source_spec_node_id": "security.resourceoperation",
2654
+ "source_layer": "security",
2655
+ "destination_spec_node_id": "security.accesscondition",
2656
+ "destination_layer": "security",
2657
+ "predicate": "constrained-by",
2658
+ "cardinality": "many-to-many",
2659
+ "strength": "medium",
2660
+ "required": false
2661
+ },
2662
+ "security.resourceoperation.governs.security.secureresource": {
2663
+ "id": "security.resourceoperation.governs.security.secureresource",
2664
+ "source_spec_node_id": "security.resourceoperation",
2665
+ "source_layer": "security",
2666
+ "destination_spec_node_id": "security.secureresource",
2667
+ "destination_layer": "security",
2668
+ "predicate": "governs",
2669
+ "cardinality": "many-to-many",
2670
+ "strength": "medium",
2671
+ "required": false
2672
+ },
2673
+ "security.resourceoperation.triggers.security.auditconfig": {
2674
+ "id": "security.resourceoperation.triggers.security.auditconfig",
2675
+ "source_spec_node_id": "security.resourceoperation",
2676
+ "source_layer": "security",
2677
+ "destination_spec_node_id": "security.auditconfig",
2678
+ "destination_layer": "security",
2679
+ "predicate": "triggers",
2680
+ "cardinality": "many-to-many",
2681
+ "strength": "medium",
2682
+ "required": false
2683
+ },
2684
+ "security.retentionpolicy.constrains.security.informationentity": {
2685
+ "id": "security.retentionpolicy.constrains.security.informationentity",
2686
+ "source_spec_node_id": "security.retentionpolicy",
2687
+ "source_layer": "security",
2688
+ "destination_spec_node_id": "security.informationentity",
2689
+ "destination_layer": "security",
2690
+ "predicate": "constrains",
2691
+ "cardinality": "many-to-many",
2692
+ "strength": "medium",
2693
+ "required": false
2694
+ },
2695
+ "security.retentionpolicy.governs.security.auditconfig": {
2696
+ "id": "security.retentionpolicy.governs.security.auditconfig",
2697
+ "source_spec_node_id": "security.retentionpolicy",
2698
+ "source_layer": "security",
2699
+ "destination_spec_node_id": "security.auditconfig",
2700
+ "destination_layer": "security",
2701
+ "predicate": "governs",
2702
+ "cardinality": "many-to-many",
2703
+ "strength": "medium",
2704
+ "required": false
2705
+ },
2706
+ "security.retentionpolicy.governs.security.evidence": {
2707
+ "id": "security.retentionpolicy.governs.security.evidence",
2708
+ "source_spec_node_id": "security.retentionpolicy",
2709
+ "source_layer": "security",
2710
+ "destination_spec_node_id": "security.evidence",
2711
+ "destination_layer": "security",
2712
+ "predicate": "governs",
2713
+ "cardinality": "many-to-many",
2714
+ "strength": "medium",
2715
+ "required": false
2716
+ },
2717
+ "security.retentionpolicy.mandates.security.countermeasure": {
2718
+ "id": "security.retentionpolicy.mandates.security.countermeasure",
2719
+ "source_spec_node_id": "security.retentionpolicy",
2720
+ "source_layer": "security",
2721
+ "destination_spec_node_id": "security.countermeasure",
2722
+ "destination_layer": "security",
2723
+ "predicate": "mandates",
2724
+ "cardinality": "many-to-many",
2725
+ "strength": "medium",
2726
+ "required": false
2727
+ },
2728
+ "security.retentionpolicy.requires.security.countermeasure": {
2729
+ "id": "security.retentionpolicy.requires.security.countermeasure",
2730
+ "source_spec_node_id": "security.retentionpolicy",
2731
+ "source_layer": "security",
2732
+ "destination_spec_node_id": "security.countermeasure",
2733
+ "destination_layer": "security",
2734
+ "predicate": "requires",
2735
+ "cardinality": "many-to-many",
2736
+ "strength": "medium",
2737
+ "required": false
2738
+ },
2739
+ "security.role.accesses.security.secureresource": {
2740
+ "id": "security.role.accesses.security.secureresource",
2741
+ "source_spec_node_id": "security.role",
2742
+ "source_layer": "security",
2743
+ "destination_spec_node_id": "security.secureresource",
2744
+ "destination_layer": "security",
2745
+ "predicate": "accesses",
2746
+ "cardinality": "many-to-many",
2747
+ "strength": "medium",
2748
+ "required": false
2749
+ },
2750
+ "security.role.aggregates.security.permission": {
2751
+ "id": "security.role.aggregates.security.permission",
2752
+ "source_spec_node_id": "security.role",
2753
+ "source_layer": "security",
2754
+ "destination_spec_node_id": "security.permission",
2755
+ "destination_layer": "security",
2756
+ "predicate": "aggregates",
2757
+ "cardinality": "many-to-many",
2758
+ "strength": "medium",
2759
+ "required": false
2760
+ },
2761
+ "security.role.authorizes.security.permission": {
2762
+ "id": "security.role.authorizes.security.permission",
2763
+ "source_spec_node_id": "security.role",
2764
+ "source_layer": "security",
2765
+ "destination_spec_node_id": "security.permission",
2766
+ "destination_layer": "security",
2767
+ "predicate": "authorizes",
2768
+ "cardinality": "many-to-many",
2769
+ "strength": "medium",
2770
+ "required": false
2771
+ },
2772
+ "security.role.constrained-by.security.separationofduty": {
2773
+ "id": "security.role.constrained-by.security.separationofduty",
2774
+ "source_spec_node_id": "security.role",
2775
+ "source_layer": "security",
2776
+ "destination_spec_node_id": "security.separationofduty",
2777
+ "destination_layer": "security",
2778
+ "predicate": "constrained-by",
2779
+ "cardinality": "many-to-many",
2780
+ "strength": "medium",
2781
+ "required": false
2782
+ },
2783
+ "security.role.maps-to.business.businessrole": {
2784
+ "id": "security.role.maps-to.business.businessrole",
2785
+ "source_spec_node_id": "security.role",
2786
+ "source_layer": "security",
2787
+ "destination_spec_node_id": "business.businessrole",
2788
+ "destination_layer": "business",
2789
+ "predicate": "maps-to",
2790
+ "cardinality": "many-to-many",
2791
+ "strength": "medium",
2792
+ "required": false
2793
+ },
2794
+ "security.role.provides.security.permission": {
2795
+ "id": "security.role.provides.security.permission",
2796
+ "source_spec_node_id": "security.role",
2797
+ "source_layer": "security",
2798
+ "destination_spec_node_id": "security.permission",
2799
+ "destination_layer": "security",
2800
+ "predicate": "provides",
2801
+ "cardinality": "many-to-many",
2802
+ "strength": "medium",
2803
+ "required": false
2804
+ },
2805
+ "security.role.specializes.security.role": {
2806
+ "id": "security.role.specializes.security.role",
2807
+ "source_spec_node_id": "security.role",
2808
+ "source_layer": "security",
2809
+ "destination_spec_node_id": "security.role",
2810
+ "destination_layer": "security",
2811
+ "predicate": "specializes",
2812
+ "cardinality": "many-to-many",
2813
+ "strength": "medium",
2814
+ "required": false
2815
+ },
2816
+ "security.secureresource.aggregates.security.fieldaccesscontrol": {
2817
+ "id": "security.secureresource.aggregates.security.fieldaccesscontrol",
2818
+ "source_spec_node_id": "security.secureresource",
2819
+ "source_layer": "security",
2820
+ "destination_spec_node_id": "security.fieldaccesscontrol",
2821
+ "destination_layer": "security",
2822
+ "predicate": "aggregates",
2823
+ "cardinality": "many-to-many",
2824
+ "strength": "medium",
2825
+ "required": false
2826
+ },
2827
+ "security.secureresource.aggregates.security.resourceoperation": {
2828
+ "id": "security.secureresource.aggregates.security.resourceoperation",
2829
+ "source_spec_node_id": "security.secureresource",
2830
+ "source_layer": "security",
2831
+ "destination_spec_node_id": "security.resourceoperation",
2832
+ "destination_layer": "security",
2833
+ "predicate": "aggregates",
2834
+ "cardinality": "many-to-many",
2835
+ "strength": "medium",
2836
+ "required": false
2837
+ },
2838
+ "security.secureresource.references.business.businessobject": {
2839
+ "id": "security.secureresource.references.business.businessobject",
2840
+ "source_spec_node_id": "security.secureresource",
2841
+ "source_layer": "security",
2842
+ "destination_spec_node_id": "business.businessobject",
2843
+ "destination_layer": "business",
2844
+ "predicate": "references",
2845
+ "cardinality": "many-to-many",
2846
+ "strength": "medium",
2847
+ "required": false
2848
+ },
2849
+ "security.securityconstraints.aggregates.security.bindingofduty": {
2850
+ "id": "security.securityconstraints.aggregates.security.bindingofduty",
2851
+ "source_spec_node_id": "security.securityconstraints",
2852
+ "source_layer": "security",
2853
+ "destination_spec_node_id": "security.bindingofduty",
2854
+ "destination_layer": "security",
2855
+ "predicate": "aggregates",
2856
+ "cardinality": "many-to-many",
2857
+ "strength": "medium",
2858
+ "required": false
2859
+ },
2860
+ "security.securityconstraints.aggregates.security.needtoknow": {
2861
+ "id": "security.securityconstraints.aggregates.security.needtoknow",
2862
+ "source_spec_node_id": "security.securityconstraints",
2863
+ "source_layer": "security",
2864
+ "destination_spec_node_id": "security.needtoknow",
2865
+ "destination_layer": "security",
2866
+ "predicate": "aggregates",
2867
+ "cardinality": "many-to-many",
2868
+ "strength": "medium",
2869
+ "required": false
2870
+ },
2871
+ "security.securityconstraints.aggregates.security.separationofduty": {
2872
+ "id": "security.securityconstraints.aggregates.security.separationofduty",
2873
+ "source_spec_node_id": "security.securityconstraints",
2874
+ "source_layer": "security",
2875
+ "destination_spec_node_id": "security.separationofduty",
2876
+ "destination_layer": "security",
2877
+ "predicate": "aggregates",
2878
+ "cardinality": "many-to-many",
2879
+ "strength": "medium",
2880
+ "required": false
2881
+ },
2882
+ "security.securityconstraints.constrains.security.role": {
2883
+ "id": "security.securityconstraints.constrains.security.role",
2884
+ "source_spec_node_id": "security.securityconstraints",
2885
+ "source_layer": "security",
2886
+ "destination_spec_node_id": "security.role",
2887
+ "destination_layer": "security",
2888
+ "predicate": "constrains",
2889
+ "cardinality": "many-to-many",
2890
+ "strength": "medium",
2891
+ "required": false
2892
+ },
2893
+ "security.securityconstraints.enforces.security.securitypolicy": {
2894
+ "id": "security.securityconstraints.enforces.security.securitypolicy",
2895
+ "source_spec_node_id": "security.securityconstraints",
2896
+ "source_layer": "security",
2897
+ "destination_spec_node_id": "security.securitypolicy",
2898
+ "destination_layer": "security",
2899
+ "predicate": "enforces",
2900
+ "cardinality": "many-to-many",
2901
+ "strength": "medium",
2902
+ "required": false
2903
+ },
2904
+ "security.securityconstraints.governs.security.securitypolicy": {
2905
+ "id": "security.securityconstraints.governs.security.securitypolicy",
2906
+ "source_spec_node_id": "security.securityconstraints",
2907
+ "source_layer": "security",
2908
+ "destination_spec_node_id": "security.securitypolicy",
2909
+ "destination_layer": "security",
2910
+ "predicate": "governs",
2911
+ "cardinality": "many-to-many",
2912
+ "strength": "medium",
2913
+ "required": false
2914
+ },
2915
+ "security.securityconstraints.implements.motivation.constraint": {
2916
+ "id": "security.securityconstraints.implements.motivation.constraint",
2917
+ "source_spec_node_id": "security.securityconstraints",
2918
+ "source_layer": "security",
2919
+ "destination_spec_node_id": "motivation.constraint",
2920
+ "destination_layer": "motivation",
2921
+ "predicate": "implements",
2922
+ "cardinality": "many-to-many",
2923
+ "strength": "medium",
2924
+ "required": false
2925
+ },
2926
+ "security.securitymodel.aggregates.actor": {
2927
+ "id": "security.securitymodel.aggregates.actor",
2928
+ "source_spec_node_id": "security.securitymodel",
2929
+ "source_layer": "security",
2930
+ "destination_spec_node_id": "security.actor",
2931
+ "destination_layer": "security",
2932
+ "predicate": "aggregates",
2933
+ "cardinality": "many-to-many",
2934
+ "strength": "medium",
2935
+ "required": false
2936
+ },
2937
+ "security.securitymodel.aggregates.security.authenticationconfig": {
2938
+ "id": "security.securitymodel.aggregates.security.authenticationconfig",
2939
+ "source_spec_node_id": "security.securitymodel",
2940
+ "source_layer": "security",
2941
+ "destination_spec_node_id": "security.authenticationconfig",
2942
+ "destination_layer": "security",
2943
+ "predicate": "aggregates",
2944
+ "cardinality": "many-to-many",
2945
+ "strength": "medium",
2946
+ "required": false
2947
+ },
2948
+ "security.securitymodel.aggregates.delegation": {
2949
+ "id": "security.securitymodel.aggregates.delegation",
2950
+ "source_spec_node_id": "security.securitymodel",
2951
+ "source_layer": "security",
2952
+ "destination_spec_node_id": "security.delegation",
2953
+ "destination_layer": "security",
2954
+ "predicate": "aggregates",
2955
+ "cardinality": "many-to-many",
2956
+ "strength": "medium",
2957
+ "required": false
2958
+ },
2959
+ "security.securitymodel.aggregates.informationentity": {
2960
+ "id": "security.securitymodel.aggregates.informationentity",
2961
+ "source_spec_node_id": "security.securitymodel",
2962
+ "source_layer": "security",
2963
+ "destination_spec_node_id": "security.informationentity",
2964
+ "destination_layer": "security",
2965
+ "predicate": "aggregates",
2966
+ "cardinality": "many-to-many",
2967
+ "strength": "medium",
2968
+ "required": false
2969
+ },
2970
+ "security.securitymodel.aggregates.permission": {
2971
+ "id": "security.securitymodel.aggregates.permission",
2972
+ "source_spec_node_id": "security.securitymodel",
2973
+ "source_layer": "security",
2974
+ "destination_spec_node_id": "security.permission",
2975
+ "destination_layer": "security",
2976
+ "predicate": "aggregates",
2977
+ "cardinality": "many-to-many",
2978
+ "strength": "medium",
2979
+ "required": false
2980
+ },
2981
+ "security.securitymodel.aggregates.role": {
2982
+ "id": "security.securitymodel.aggregates.role",
2983
+ "source_spec_node_id": "security.securitymodel",
2984
+ "source_layer": "security",
2985
+ "destination_spec_node_id": "security.role",
2986
+ "destination_layer": "security",
2987
+ "predicate": "aggregates",
2988
+ "cardinality": "many-to-many",
2989
+ "strength": "medium",
2990
+ "required": false
2991
+ },
2992
+ "security.securitymodel.aggregates.secureresource": {
2993
+ "id": "security.securitymodel.aggregates.secureresource",
2994
+ "source_spec_node_id": "security.securitymodel",
2995
+ "source_layer": "security",
2996
+ "destination_spec_node_id": "security.secureresource",
2997
+ "destination_layer": "security",
2998
+ "predicate": "aggregates",
2999
+ "cardinality": "many-to-many",
3000
+ "strength": "medium",
3001
+ "required": false
3002
+ },
3003
+ "security.securitymodel.aggregates.security.threat": {
3004
+ "id": "security.securitymodel.aggregates.security.threat",
3005
+ "source_spec_node_id": "security.securitymodel",
3006
+ "source_layer": "security",
3007
+ "destination_spec_node_id": "security.threat",
3008
+ "destination_layer": "security",
3009
+ "predicate": "aggregates",
3010
+ "cardinality": "many-to-many",
3011
+ "strength": "medium",
3012
+ "required": false
3013
+ },
3014
+ "security.securitymodel.composes.security.authenticationconfig": {
3015
+ "id": "security.securitymodel.composes.security.authenticationconfig",
3016
+ "source_spec_node_id": "security.securitymodel",
3017
+ "source_layer": "security",
3018
+ "destination_spec_node_id": "security.authenticationconfig",
3019
+ "destination_layer": "security",
3020
+ "predicate": "composes",
3021
+ "cardinality": "many-to-many",
3022
+ "strength": "medium",
3023
+ "required": false
3024
+ },
3025
+ "security.securitymodel.composes.security.securityconstraints": {
3026
+ "id": "security.securitymodel.composes.security.securityconstraints",
3027
+ "source_spec_node_id": "security.securitymodel",
3028
+ "source_layer": "security",
3029
+ "destination_spec_node_id": "security.securityconstraints",
3030
+ "destination_layer": "security",
3031
+ "predicate": "composes",
3032
+ "cardinality": "many-to-many",
3033
+ "strength": "medium",
3034
+ "required": false
3035
+ },
3036
+ "security.securitymodel.composes.security.securitypolicy": {
3037
+ "id": "security.securitymodel.composes.security.securitypolicy",
3038
+ "source_spec_node_id": "security.securitymodel",
3039
+ "source_layer": "security",
3040
+ "destination_spec_node_id": "security.securitypolicy",
3041
+ "destination_layer": "security",
3042
+ "predicate": "composes",
3043
+ "cardinality": "many-to-many",
3044
+ "strength": "medium",
3045
+ "required": false
3046
+ },
3047
+ "security.securitymodel.constrains.security.accountabilityrequirement": {
3048
+ "id": "security.securitymodel.constrains.security.accountabilityrequirement",
3049
+ "source_spec_node_id": "security.securitymodel",
3050
+ "source_layer": "security",
3051
+ "destination_spec_node_id": "security.accountabilityrequirement",
3052
+ "destination_layer": "security",
3053
+ "predicate": "constrains",
3054
+ "cardinality": "many-to-many",
3055
+ "strength": "medium",
3056
+ "required": false
3057
+ },
3058
+ "security.securitymodel.governs.security.dataclassification": {
3059
+ "id": "security.securitymodel.governs.security.dataclassification",
3060
+ "source_spec_node_id": "security.securitymodel",
3061
+ "source_layer": "security",
3062
+ "destination_spec_node_id": "security.dataclassification",
3063
+ "destination_layer": "security",
3064
+ "predicate": "governs",
3065
+ "cardinality": "many-to-many",
3066
+ "strength": "medium",
3067
+ "required": false
3068
+ },
3069
+ "security.securitymodel.governs.security.securitypolicy": {
3070
+ "id": "security.securitymodel.governs.security.securitypolicy",
3071
+ "source_spec_node_id": "security.securitymodel",
3072
+ "source_layer": "security",
3073
+ "destination_spec_node_id": "security.securitypolicy",
3074
+ "destination_layer": "security",
3075
+ "predicate": "governs",
3076
+ "cardinality": "many-to-many",
3077
+ "strength": "medium",
3078
+ "required": false
3079
+ },
3080
+ "security.securitymodel.manages.security.threat": {
3081
+ "id": "security.securitymodel.manages.security.threat",
3082
+ "source_spec_node_id": "security.securitymodel",
3083
+ "source_layer": "security",
3084
+ "destination_spec_node_id": "security.threat",
3085
+ "destination_layer": "security",
3086
+ "predicate": "manages",
3087
+ "cardinality": "many-to-many",
3088
+ "strength": "medium",
3089
+ "required": false
3090
+ },
3091
+ "security.securitypolicy.aggregates.security.policyrule": {
3092
+ "id": "security.securitypolicy.aggregates.security.policyrule",
3093
+ "source_spec_node_id": "security.securitypolicy",
3094
+ "source_layer": "security",
3095
+ "destination_spec_node_id": "security.policyrule",
3096
+ "destination_layer": "security",
3097
+ "predicate": "aggregates",
3098
+ "cardinality": "many-to-many",
3099
+ "strength": "medium",
3100
+ "required": false
3101
+ },
3102
+ "security.securitypolicy.constrains.business.businessprocess": {
3103
+ "id": "security.securitypolicy.constrains.business.businessprocess",
3104
+ "source_spec_node_id": "security.securitypolicy",
3105
+ "source_layer": "security",
3106
+ "destination_spec_node_id": "business.businessprocess",
3107
+ "destination_layer": "business",
3108
+ "predicate": "constrains",
3109
+ "cardinality": "many-to-many",
3110
+ "strength": "medium",
3111
+ "required": false
3112
+ },
3113
+ "security.securitypolicy.constrains.security.permission": {
3114
+ "id": "security.securitypolicy.constrains.security.permission",
3115
+ "source_spec_node_id": "security.securitypolicy",
3116
+ "source_layer": "security",
3117
+ "destination_spec_node_id": "security.permission",
3118
+ "destination_layer": "security",
3119
+ "predicate": "constrains",
3120
+ "cardinality": "many-to-many",
3121
+ "strength": "medium",
3122
+ "required": false
3123
+ },
3124
+ "security.securitypolicy.enforces-requirement.security.accesscondition": {
3125
+ "id": "security.securitypolicy.enforces-requirement.security.accesscondition",
3126
+ "source_spec_node_id": "security.securitypolicy",
3127
+ "source_layer": "security",
3128
+ "destination_spec_node_id": "security.accesscondition",
3129
+ "destination_layer": "security",
3130
+ "predicate": "enforces-requirement",
3131
+ "cardinality": "many-to-many",
3132
+ "strength": "medium",
3133
+ "required": false
3134
+ },
3135
+ "security.securitypolicy.fulfills.security.accountabilityrequirement": {
3136
+ "id": "security.securitypolicy.fulfills.security.accountabilityrequirement",
3137
+ "source_spec_node_id": "security.securitypolicy",
3138
+ "source_layer": "security",
3139
+ "destination_spec_node_id": "security.accountabilityrequirement",
3140
+ "destination_layer": "security",
3141
+ "predicate": "fulfills",
3142
+ "cardinality": "many-to-many",
3143
+ "strength": "medium",
3144
+ "required": false
3145
+ },
3146
+ "security.securitypolicy.governs.business.businessservice": {
3147
+ "id": "security.securitypolicy.governs.business.businessservice",
3148
+ "source_spec_node_id": "security.securitypolicy",
3149
+ "source_layer": "security",
3150
+ "destination_spec_node_id": "business.businessservice",
3151
+ "destination_layer": "business",
3152
+ "predicate": "governs",
3153
+ "cardinality": "many-to-many",
3154
+ "strength": "medium",
3155
+ "required": false
3156
+ },
3157
+ "security.securitypolicy.governs.security.passwordpolicy": {
3158
+ "id": "security.securitypolicy.governs.security.passwordpolicy",
3159
+ "source_spec_node_id": "security.securitypolicy",
3160
+ "source_layer": "security",
3161
+ "destination_spec_node_id": "security.passwordpolicy",
3162
+ "destination_layer": "security",
3163
+ "predicate": "governs",
3164
+ "cardinality": "many-to-many",
3165
+ "strength": "medium",
3166
+ "required": false
3167
+ },
3168
+ "security.securitypolicy.governs.security.secureresource": {
3169
+ "id": "security.securitypolicy.governs.security.secureresource",
3170
+ "source_spec_node_id": "security.securitypolicy",
3171
+ "source_layer": "security",
3172
+ "destination_spec_node_id": "security.secureresource",
3173
+ "destination_layer": "security",
3174
+ "predicate": "governs",
3175
+ "cardinality": "many-to-many",
3176
+ "strength": "medium",
3177
+ "required": false
3178
+ },
3179
+ "security.securitypolicy.mandates.security.countermeasure": {
3180
+ "id": "security.securitypolicy.mandates.security.countermeasure",
3181
+ "source_spec_node_id": "security.securitypolicy",
3182
+ "source_layer": "security",
3183
+ "destination_spec_node_id": "security.countermeasure",
3184
+ "destination_layer": "security",
3185
+ "predicate": "mandates",
3186
+ "cardinality": "many-to-many",
3187
+ "strength": "medium",
3188
+ "required": false
3189
+ },
3190
+ "security.securitypolicy.realizes.motivation.principle": {
3191
+ "id": "security.securitypolicy.realizes.motivation.principle",
3192
+ "source_spec_node_id": "security.securitypolicy",
3193
+ "source_layer": "security",
3194
+ "destination_spec_node_id": "motivation.principle",
3195
+ "destination_layer": "motivation",
3196
+ "predicate": "realizes",
3197
+ "cardinality": "many-to-many",
3198
+ "strength": "medium",
3199
+ "required": false
3200
+ },
3201
+ "security.securitypolicy.requires.security.countermeasure": {
3202
+ "id": "security.securitypolicy.requires.security.countermeasure",
3203
+ "source_spec_node_id": "security.securitypolicy",
3204
+ "source_layer": "security",
3205
+ "destination_spec_node_id": "security.countermeasure",
3206
+ "destination_layer": "security",
3207
+ "predicate": "requires",
3208
+ "cardinality": "many-to-many",
3209
+ "strength": "medium",
3210
+ "required": false
3211
+ },
3212
+ "security.securitypolicy.satisfies.motivation.requirement": {
3213
+ "id": "security.securitypolicy.satisfies.motivation.requirement",
3214
+ "source_spec_node_id": "security.securitypolicy",
3215
+ "source_layer": "security",
3216
+ "destination_spec_node_id": "motivation.requirement",
3217
+ "destination_layer": "motivation",
3218
+ "predicate": "satisfies",
3219
+ "cardinality": "many-to-many",
3220
+ "strength": "medium",
3221
+ "required": false
3222
+ },
3223
+ "security.separationofduty.associated-with.security.bindingofduty": {
3224
+ "id": "security.separationofduty.associated-with.security.bindingofduty",
3225
+ "source_spec_node_id": "security.separationofduty",
3226
+ "source_layer": "security",
3227
+ "destination_spec_node_id": "security.bindingofduty",
3228
+ "destination_layer": "security",
3229
+ "predicate": "associated-with",
3230
+ "cardinality": "many-to-many",
3231
+ "strength": "medium",
3232
+ "required": false
3233
+ },
3234
+ "security.separationofduty.constrains.business.businessrole": {
3235
+ "id": "security.separationofduty.constrains.business.businessrole",
3236
+ "source_spec_node_id": "security.separationofduty",
3237
+ "source_layer": "security",
3238
+ "destination_spec_node_id": "business.businessrole",
3239
+ "destination_layer": "business",
3240
+ "predicate": "constrains",
3241
+ "cardinality": "many-to-many",
3242
+ "strength": "medium",
3243
+ "required": false
3244
+ },
3245
+ "security.separationofduty.constrains.security.role": {
3246
+ "id": "security.separationofduty.constrains.security.role",
3247
+ "source_spec_node_id": "security.separationofduty",
3248
+ "source_layer": "security",
3249
+ "destination_spec_node_id": "security.role",
3250
+ "destination_layer": "security",
3251
+ "predicate": "constrains",
3252
+ "cardinality": "many-to-many",
3253
+ "strength": "medium",
3254
+ "required": false
3255
+ },
3256
+ "security.separationofduty.governs.security.policyrule": {
3257
+ "id": "security.separationofduty.governs.security.policyrule",
3258
+ "source_spec_node_id": "security.separationofduty",
3259
+ "source_layer": "security",
3260
+ "destination_spec_node_id": "security.policyrule",
3261
+ "destination_layer": "security",
3262
+ "predicate": "governs",
3263
+ "cardinality": "many-to-many",
3264
+ "strength": "medium",
3265
+ "required": false
3266
+ },
3267
+ "security.separationofduty.mitigates.security.threat": {
3268
+ "id": "security.separationofduty.mitigates.security.threat",
3269
+ "source_spec_node_id": "security.separationofduty",
3270
+ "source_layer": "security",
3271
+ "destination_spec_node_id": "security.threat",
3272
+ "destination_layer": "security",
3273
+ "predicate": "mitigates",
3274
+ "cardinality": "many-to-many",
3275
+ "strength": "medium",
3276
+ "required": false
3277
+ },
3278
+ "security.separationofduty.requires.security.accountabilityrequirement": {
3279
+ "id": "security.separationofduty.requires.security.accountabilityrequirement",
3280
+ "source_spec_node_id": "security.separationofduty",
3281
+ "source_layer": "security",
3282
+ "destination_spec_node_id": "security.accountabilityrequirement",
3283
+ "destination_layer": "security",
3284
+ "predicate": "requires",
3285
+ "cardinality": "many-to-many",
3286
+ "strength": "medium",
3287
+ "required": false
3288
+ },
3289
+ "security.threat.accesses.security.secureresource": {
3290
+ "id": "security.threat.accesses.security.secureresource",
3291
+ "source_spec_node_id": "security.threat",
3292
+ "source_layer": "security",
3293
+ "destination_spec_node_id": "security.secureresource",
3294
+ "destination_layer": "security",
3295
+ "predicate": "accesses",
3296
+ "cardinality": "many-to-many",
3297
+ "strength": "medium",
3298
+ "required": false
3299
+ },
3300
+ "security.threat.aggregates.countermeasure": {
3301
+ "id": "security.threat.aggregates.countermeasure",
3302
+ "source_spec_node_id": "security.threat",
3303
+ "source_layer": "security",
3304
+ "destination_spec_node_id": "security.countermeasure",
3305
+ "destination_layer": "security",
3306
+ "predicate": "aggregates",
3307
+ "cardinality": "many-to-many",
3308
+ "strength": "medium",
3309
+ "required": false
3310
+ },
3311
+ "security.threat.constrains.security.accesscondition": {
3312
+ "id": "security.threat.constrains.security.accesscondition",
3313
+ "source_spec_node_id": "security.threat",
3314
+ "source_layer": "security",
3315
+ "destination_spec_node_id": "security.accesscondition",
3316
+ "destination_layer": "security",
3317
+ "predicate": "constrains",
3318
+ "cardinality": "many-to-many",
3319
+ "strength": "medium",
3320
+ "required": false
3321
+ },
3322
+ "security.threat.influence.security.dataclassification": {
3323
+ "id": "security.threat.influence.security.dataclassification",
3324
+ "source_spec_node_id": "security.threat",
3325
+ "source_layer": "security",
3326
+ "destination_spec_node_id": "security.dataclassification",
3327
+ "destination_layer": "security",
3328
+ "predicate": "influence",
3329
+ "cardinality": "many-to-many",
3330
+ "strength": "medium",
3331
+ "required": false
3332
+ },
3333
+ "security.threat.influence.security.securitypolicy": {
3334
+ "id": "security.threat.influence.security.securitypolicy",
3335
+ "source_spec_node_id": "security.threat",
3336
+ "source_layer": "security",
3337
+ "destination_spec_node_id": "security.securitypolicy",
3338
+ "destination_layer": "security",
3339
+ "predicate": "influence",
3340
+ "cardinality": "many-to-many",
3341
+ "strength": "medium",
3342
+ "required": false
3343
+ },
3344
+ "security.threat.maps-to.motivation.requirement": {
3345
+ "id": "security.threat.maps-to.motivation.requirement",
3346
+ "source_spec_node_id": "security.threat",
3347
+ "source_layer": "security",
3348
+ "destination_spec_node_id": "motivation.requirement",
3349
+ "destination_layer": "motivation",
3350
+ "predicate": "maps-to",
3351
+ "cardinality": "many-to-many",
3352
+ "strength": "medium",
3353
+ "required": false
3354
+ },
3355
+ "security.threat.realizes.motivation.driver": {
3356
+ "id": "security.threat.realizes.motivation.driver",
3357
+ "source_spec_node_id": "security.threat",
3358
+ "source_layer": "security",
3359
+ "destination_spec_node_id": "motivation.driver",
3360
+ "destination_layer": "motivation",
3361
+ "predicate": "realizes",
3362
+ "cardinality": "many-to-many",
3363
+ "strength": "medium",
3364
+ "required": false
3365
+ },
3366
+ "security.threat.targets.business.businessprocess": {
3367
+ "id": "security.threat.targets.business.businessprocess",
3368
+ "source_spec_node_id": "security.threat",
3369
+ "source_layer": "security",
3370
+ "destination_spec_node_id": "business.businessprocess",
3371
+ "destination_layer": "business",
3372
+ "predicate": "targets",
3373
+ "cardinality": "many-to-many",
3374
+ "strength": "medium",
3375
+ "required": false
3376
+ },
3377
+ "security.threat.targets.business.businessservice": {
3378
+ "id": "security.threat.targets.business.businessservice",
3379
+ "source_spec_node_id": "security.threat",
3380
+ "source_layer": "security",
3381
+ "destination_spec_node_id": "business.businessservice",
3382
+ "destination_layer": "business",
3383
+ "predicate": "targets",
3384
+ "cardinality": "many-to-many",
3385
+ "strength": "medium",
3386
+ "required": false
3387
+ },
3388
+ "security.threat.targets.security.informationentity": {
3389
+ "id": "security.threat.targets.security.informationentity",
3390
+ "source_spec_node_id": "security.threat",
3391
+ "source_layer": "security",
3392
+ "destination_spec_node_id": "security.informationentity",
3393
+ "destination_layer": "security",
3394
+ "predicate": "targets",
3395
+ "cardinality": "many-to-many",
3396
+ "strength": "medium",
3397
+ "required": false
3398
+ },
3399
+ "security.threat.targets.security.secureresource": {
3400
+ "id": "security.threat.targets.security.secureresource",
3401
+ "source_spec_node_id": "security.threat",
3402
+ "source_layer": "security",
3403
+ "destination_spec_node_id": "security.secureresource",
3404
+ "destination_layer": "security",
3405
+ "predicate": "targets",
3406
+ "cardinality": "many-to-many",
3407
+ "strength": "medium",
3408
+ "required": false
3409
+ },
3410
+ "security.threat.triggers.security.auditconfig": {
3411
+ "id": "security.threat.triggers.security.auditconfig",
3412
+ "source_spec_node_id": "security.threat",
3413
+ "source_layer": "security",
3414
+ "destination_spec_node_id": "security.auditconfig",
3415
+ "destination_layer": "security",
3416
+ "predicate": "triggers",
3417
+ "cardinality": "many-to-many",
3418
+ "strength": "medium",
3419
+ "required": false
3420
+ },
3421
+ "security.validationrule.constrains.security.accesscondition": {
3422
+ "id": "security.validationrule.constrains.security.accesscondition",
3423
+ "source_spec_node_id": "security.validationrule",
3424
+ "source_layer": "security",
3425
+ "destination_spec_node_id": "security.accesscondition",
3426
+ "destination_layer": "security",
3427
+ "predicate": "constrains",
3428
+ "cardinality": "many-to-many",
3429
+ "strength": "medium",
3430
+ "required": false
3431
+ },
3432
+ "security.validationrule.constrains.security.fieldaccesscontrol": {
3433
+ "id": "security.validationrule.constrains.security.fieldaccesscontrol",
3434
+ "source_spec_node_id": "security.validationrule",
3435
+ "source_layer": "security",
3436
+ "destination_spec_node_id": "security.fieldaccesscontrol",
3437
+ "destination_layer": "security",
3438
+ "predicate": "constrains",
3439
+ "cardinality": "many-to-many",
3440
+ "strength": "medium",
3441
+ "required": false
3442
+ },
3443
+ "security.validationrule.enforces-requirement.security.fieldaccesscontrol": {
3444
+ "id": "security.validationrule.enforces-requirement.security.fieldaccesscontrol",
3445
+ "source_spec_node_id": "security.validationrule",
3446
+ "source_layer": "security",
3447
+ "destination_spec_node_id": "security.fieldaccesscontrol",
3448
+ "destination_layer": "security",
3449
+ "predicate": "enforces-requirement",
3450
+ "cardinality": "many-to-many",
3451
+ "strength": "medium",
3452
+ "required": false
3453
+ },
3454
+ "security.validationrule.enforces-requirement.security.securityconstraints": {
3455
+ "id": "security.validationrule.enforces-requirement.security.securityconstraints",
3456
+ "source_spec_node_id": "security.validationrule",
3457
+ "source_layer": "security",
3458
+ "destination_spec_node_id": "security.securityconstraints",
3459
+ "destination_layer": "security",
3460
+ "predicate": "enforces-requirement",
3461
+ "cardinality": "many-to-many",
3462
+ "strength": "medium",
3463
+ "required": false
3464
+ },
3465
+ "security.validationrule.realizes.security.policyrule": {
3466
+ "id": "security.validationrule.realizes.security.policyrule",
3467
+ "source_spec_node_id": "security.validationrule",
3468
+ "source_layer": "security",
3469
+ "destination_spec_node_id": "security.policyrule",
3470
+ "destination_layer": "security",
3471
+ "predicate": "realizes",
3472
+ "cardinality": "many-to-many",
3473
+ "strength": "medium",
3474
+ "required": false
3475
+ },
3476
+ "security.validationrule.supports.security.securitypolicy": {
3477
+ "id": "security.validationrule.supports.security.securitypolicy",
3478
+ "source_spec_node_id": "security.validationrule",
3479
+ "source_layer": "security",
3480
+ "destination_spec_node_id": "security.securitypolicy",
3481
+ "destination_layer": "security",
3482
+ "predicate": "supports",
3483
+ "cardinality": "many-to-many",
3484
+ "strength": "medium",
3485
+ "required": false
3486
+ }
3487
+ }
3488
+ }