@documentation-robotics/cli 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/README.md +46 -16
  2. package/dist/analysis/relationship-classifier.js +2 -9
  3. package/dist/analysis/relationship-classifier.js.map +2 -2
  4. package/dist/analyzers/active-analyzer.js +62 -0
  5. package/dist/analyzers/active-analyzer.js.map +7 -0
  6. package/dist/analyzers/call-graph-utils.js +2 -2
  7. package/dist/analyzers/call-graph-utils.js.map +2 -2
  8. package/dist/analyzers/cards/build.js +191 -0
  9. package/dist/analyzers/cards/build.js.map +7 -0
  10. package/dist/analyzers/cards/classify.js +42 -0
  11. package/dist/analyzers/cards/classify.js.map +7 -0
  12. package/dist/analyzers/cards/edge-index.js +44 -0
  13. package/dist/analyzers/cards/edge-index.js.map +7 -0
  14. package/dist/analyzers/cards/extract.js +138 -0
  15. package/dist/analyzers/cards/extract.js.map +7 -0
  16. package/dist/analyzers/cards/facts.js +46 -0
  17. package/dist/analyzers/cards/facts.js.map +7 -0
  18. package/dist/analyzers/cards/graph.js +42 -0
  19. package/dist/analyzers/cards/graph.js.map +7 -0
  20. package/dist/analyzers/cards/index.js +8 -0
  21. package/dist/analyzers/cards/index.js.map +7 -0
  22. package/dist/analyzers/cards/routes.js +96 -0
  23. package/dist/analyzers/cards/routes.js.map +7 -0
  24. package/dist/analyzers/cards/tier0.js +18 -0
  25. package/dist/analyzers/cards/tier0.js.map +7 -0
  26. package/dist/analyzers/cards/types.js +1 -0
  27. package/dist/analyzers/cards/types.js.map +7 -0
  28. package/dist/analyzers/cbm-analyzer.js +270 -174
  29. package/dist/analyzers/cbm-analyzer.js.map +2 -2
  30. package/dist/analyzers/cbm-responses.js +342 -0
  31. package/dist/analyzers/cbm-responses.js.map +7 -0
  32. package/dist/analyzers/code-changes.js +159 -0
  33. package/dist/analyzers/code-changes.js.map +7 -0
  34. package/dist/analyzers/edge-relationships.js +49 -0
  35. package/dist/analyzers/edge-relationships.js.map +7 -0
  36. package/dist/analyzers/extraction-plan.js +541 -0
  37. package/dist/analyzers/extraction-plan.js.map +7 -0
  38. package/dist/analyzers/index-job.js +229 -0
  39. package/dist/analyzers/index-job.js.map +7 -0
  40. package/dist/analyzers/mapping-loader.js +9 -0
  41. package/dist/analyzers/mapping-loader.js.map +2 -2
  42. package/dist/analyzers/tier0-rules.js +153 -0
  43. package/dist/analyzers/tier0-rules.js.map +7 -0
  44. package/dist/analyzers/types.js.map +1 -1
  45. package/dist/audit/relationships/ai/prompts.js +10 -10
  46. package/dist/audit/relationships/ai/prompts.js.map +2 -2
  47. package/dist/audit/relationships/analysis/layer-templates.js +52 -52
  48. package/dist/audit/relationships/analysis/layer-templates.js.map +1 -1
  49. package/dist/cli.js +23 -11
  50. package/dist/cli.js.map +2 -2
  51. package/dist/coding-agents/default-permissions.js +31 -1
  52. package/dist/coding-agents/default-permissions.js.map +2 -2
  53. package/dist/coding-agents/drbot-mcp.js +269 -0
  54. package/dist/coding-agents/drbot-mcp.js.map +7 -0
  55. package/dist/commands/add.js +7 -4
  56. package/dist/commands/add.js.map +2 -2
  57. package/dist/commands/analyzer.js +143 -40
  58. package/dist/commands/analyzer.js.map +2 -2
  59. package/dist/commands/changeset-verify.js +63 -0
  60. package/dist/commands/changeset-verify.js.map +7 -0
  61. package/dist/commands/changeset.js +80 -29
  62. package/dist/commands/changeset.js.map +2 -2
  63. package/dist/commands/delete.js +10 -4
  64. package/dist/commands/delete.js.map +2 -2
  65. package/dist/commands/farm.js +176 -60
  66. package/dist/commands/farm.js.map +2 -2
  67. package/dist/commands/init.js +9 -26
  68. package/dist/commands/init.js.map +2 -2
  69. package/dist/commands/mcp.js +40 -21
  70. package/dist/commands/mcp.js.map +3 -3
  71. package/dist/commands/relationship.js +208 -37
  72. package/dist/commands/relationship.js.map +2 -2
  73. package/dist/commands/reports.js +3 -3
  74. package/dist/commands/reports.js.map +2 -2
  75. package/dist/commands/update.js +52 -32
  76. package/dist/commands/update.js.map +2 -2
  77. package/dist/commands/upgrade.js +99 -103
  78. package/dist/commands/upgrade.js.map +3 -3
  79. package/dist/commands/validate.js +19 -3
  80. package/dist/commands/validate.js.map +2 -2
  81. package/dist/commands/version.js +1 -1
  82. package/dist/commands/visualize.js +34 -15
  83. package/dist/commands/visualize.js.map +2 -2
  84. package/dist/core/annotation-store.js +15 -5
  85. package/dist/core/annotation-store.js.map +2 -2
  86. package/dist/core/catalog-migration.js +34 -0
  87. package/dist/core/catalog-migration.js.map +7 -0
  88. package/dist/core/changeset-analysis.js +421 -0
  89. package/dist/core/changeset-analysis.js.map +7 -0
  90. package/dist/core/changeset-base-index.js +160 -0
  91. package/dist/core/changeset-base-index.js.map +7 -0
  92. package/dist/core/changeset-brief-compact.js +256 -0
  93. package/dist/core/changeset-brief-compact.js.map +7 -0
  94. package/dist/core/changeset-brief-delta.js +102 -0
  95. package/dist/core/changeset-brief-delta.js.map +7 -0
  96. package/dist/core/changeset-graph.js +281 -0
  97. package/dist/core/changeset-graph.js.map +7 -0
  98. package/dist/core/changeset-only-guard.js +32 -0
  99. package/dist/core/changeset-only-guard.js.map +7 -0
  100. package/dist/core/changeset-summary.js +68 -0
  101. package/dist/core/changeset-summary.js.map +7 -0
  102. package/dist/core/changeset-validator.js +66 -20
  103. package/dist/core/changeset-validator.js.map +2 -2
  104. package/dist/core/changeset-verify.js +848 -0
  105. package/dist/core/changeset-verify.js.map +7 -0
  106. package/dist/core/changeset.js +56 -9
  107. package/dist/core/changeset.js.map +2 -2
  108. package/dist/core/element-type-migration.js +145 -0
  109. package/dist/core/element-type-migration.js.map +7 -0
  110. package/dist/core/extraction-observability.js +161 -0
  111. package/dist/core/extraction-observability.js.map +7 -0
  112. package/dist/core/farm-manifest.js +12 -6
  113. package/dist/core/farm-manifest.js.map +2 -2
  114. package/dist/core/farm-sync-engine.js +1 -1
  115. package/dist/core/farm-sync-engine.js.map +2 -2
  116. package/dist/core/farm-sync-state.js +10 -2
  117. package/dist/core/farm-sync-state.js.map +2 -2
  118. package/dist/core/migration-registry.js +88 -47
  119. package/dist/core/migration-registry.js.map +2 -2
  120. package/dist/core/model-upgrade.js +102 -0
  121. package/dist/core/model-upgrade.js.map +7 -0
  122. package/dist/core/model.js +82 -30
  123. package/dist/core/model.js.map +2 -2
  124. package/dist/core/mutation-handler.js +71 -6
  125. package/dist/core/mutation-handler.js.map +2 -2
  126. package/dist/core/project-init.js +53 -0
  127. package/dist/core/project-init.js.map +7 -0
  128. package/dist/core/relationship-migration-table.js +6639 -0
  129. package/dist/core/relationship-migration-table.js.map +7 -0
  130. package/dist/core/relationship-migration.js +272 -0
  131. package/dist/core/relationship-migration.js.map +7 -0
  132. package/dist/core/relationship-prune.js +49 -0
  133. package/dist/core/relationship-prune.js.map +7 -0
  134. package/dist/core/relationship-staging.js +161 -0
  135. package/dist/core/relationship-staging.js.map +7 -0
  136. package/dist/core/relationships.js +26 -4
  137. package/dist/core/relationships.js.map +2 -2
  138. package/dist/core/report-data-model.js +7 -13
  139. package/dist/core/report-data-model.js.map +2 -2
  140. package/dist/core/staged-changeset-storage.js +145 -18
  141. package/dist/core/staged-changeset-storage.js.map +2 -2
  142. package/dist/core/staged-source-reference.js +28 -0
  143. package/dist/core/staged-source-reference.js.map +7 -0
  144. package/dist/core/staging-area.js +166 -24
  145. package/dist/core/staging-area.js.map +2 -2
  146. package/dist/core/upgrade-plan.js +117 -0
  147. package/dist/core/upgrade-plan.js.map +7 -0
  148. package/dist/core/virtual-projection.js +13 -5
  149. package/dist/core/virtual-projection.js.map +2 -2
  150. package/dist/export/archimate-exporter.js +1 -0
  151. package/dist/export/archimate-exporter.js.map +2 -2
  152. package/dist/generated/compiled-validators.js +2 -2
  153. package/dist/generated/compiled-validators.js.map +2 -2
  154. package/dist/generated/layer-registry.js +16 -16
  155. package/dist/generated/layer-registry.js.map +2 -2
  156. package/dist/generated/node-types.js +186 -168
  157. package/dist/generated/node-types.js.map +2 -2
  158. package/dist/generated/relationship-index.js +2468 -7913
  159. package/dist/generated/relationship-index.js.map +2 -2
  160. package/dist/integrations/claude_code/.claude-plugin/plugin.json +24 -0
  161. package/dist/integrations/claude_code/agents/dr-architect.md +30 -3
  162. package/dist/integrations/claude_code/agents/dr-extractor.md +8 -2
  163. package/dist/integrations/claude_code/commands/dr-analyzer.md +565 -0
  164. package/dist/integrations/claude_code/commands/dr-changeset.md +2 -1
  165. package/dist/integrations/claude_code/commands/dr-map.md +20 -1
  166. package/dist/integrations/claude_code/commands/dr-plan.md +66 -0
  167. package/dist/integrations/claude_code/commands/dr-relate.md +106 -96
  168. package/dist/integrations/claude_code/commands/dr-verify.md +45 -2
  169. package/dist/integrations/claude_code/docs/END_TO_END_WALKTHROUGH.md +14 -0
  170. package/dist/integrations/claude_code/docs/MCP_SERVER.md +47 -26
  171. package/dist/integrations/claude_code/docs/QUICK_START.md +37 -8
  172. package/dist/integrations/claude_code/docs/README.md +68 -2
  173. package/dist/integrations/claude_code/plugin-agents/dr-advisor.md +255 -0
  174. package/dist/integrations/claude_code/plugin-agents/dr-architect.md +306 -0
  175. package/dist/integrations/claude_code/skills/dr_01_motivation_layer/SKILL.md +93 -72
  176. package/dist/integrations/claude_code/skills/dr_02_business_layer/SKILL.md +163 -126
  177. package/dist/integrations/claude_code/skills/dr_03_product_layer/SKILL.md +161 -126
  178. package/dist/integrations/claude_code/skills/dr_04_security_layer/SKILL.md +153 -133
  179. package/dist/integrations/claude_code/skills/dr_05_application_layer/SKILL.md +129 -100
  180. package/dist/integrations/claude_code/skills/dr_06_technology_layer/SKILL.md +111 -94
  181. package/dist/integrations/claude_code/skills/dr_07_api_layer/SKILL.md +143 -157
  182. package/dist/integrations/claude_code/skills/dr_08_data_model_layer/SKILL.md +117 -33
  183. package/dist/integrations/claude_code/skills/dr_09_dataset_layer/SKILL.md +74 -25
  184. package/dist/integrations/claude_code/skills/dr_10_ux_layer/SKILL.md +88 -12
  185. package/dist/integrations/claude_code/skills/dr_11_navigation_layer/SKILL.md +83 -24
  186. package/dist/integrations/claude_code/skills/dr_12_apm_layer/SKILL.md +57 -12
  187. package/dist/integrations/claude_code/skills/dr_13_testing_layer/SKILL.md +95 -15
  188. package/dist/integrations/claude_code/skills/dr_change_planning/SKILL.md +178 -0
  189. package/dist/integrations/claude_code/skills/dr_changeset_reviewer/SKILL.md +8 -0
  190. package/dist/integrations/claude_code/skills/dr_engineering_guide/SKILL.md +6 -1
  191. package/dist/integrations/github_copilot/agents/dr-architect.md +3 -1
  192. package/dist/integrations/github_copilot/skills/dr_01_motivation_layer/SKILL.md +182 -102
  193. package/dist/integrations/github_copilot/skills/dr_02_business_layer/SKILL.md +266 -148
  194. package/dist/integrations/github_copilot/skills/dr_03_product_layer/SKILL.md +547 -86
  195. package/dist/integrations/github_copilot/skills/dr_04_security_layer/SKILL.md +164 -169
  196. package/dist/integrations/github_copilot/skills/dr_05_application_layer/SKILL.md +420 -150
  197. package/dist/integrations/github_copilot/skills/dr_06_technology_layer/SKILL.md +331 -138
  198. package/dist/integrations/github_copilot/skills/dr_07_api_layer/SKILL.md +265 -201
  199. package/dist/integrations/github_copilot/skills/dr_08_data_model_layer/SKILL.md +181 -58
  200. package/dist/integrations/github_copilot/skills/dr_09_dataset_layer/SKILL.md +209 -57
  201. package/dist/integrations/github_copilot/skills/dr_10_ux_layer/SKILL.md +277 -112
  202. package/dist/integrations/github_copilot/skills/dr_11_navigation_layer/SKILL.md +219 -70
  203. package/dist/integrations/github_copilot/skills/dr_12_apm_layer/SKILL.md +189 -105
  204. package/dist/integrations/github_copilot/skills/dr_13_testing_layer/SKILL.md +225 -102
  205. package/dist/integrations/github_copilot/skills/dr_change_planning/SKILL.md +177 -0
  206. package/dist/integrations/github_copilot/skills/dr_changeset_reviewer/SKILL.md +3 -0
  207. package/dist/integrations/hash-utils.js.map +2 -2
  208. package/dist/mcp/api-key-manager.js +14 -1
  209. package/dist/mcp/api-key-manager.js.map +2 -2
  210. package/dist/mcp/changeset-only.js +45 -0
  211. package/dist/mcp/changeset-only.js.map +7 -0
  212. package/dist/mcp/project-root.js +85 -0
  213. package/dist/mcp/project-root.js.map +7 -0
  214. package/dist/mcp/server-instructions.js +27 -0
  215. package/dist/mcp/server-instructions.js.map +7 -0
  216. package/dist/mcp/strict-schema.js +52 -0
  217. package/dist/mcp/strict-schema.js.map +7 -0
  218. package/dist/mcp/tool-registry.js +55 -5
  219. package/dist/mcp/tool-registry.js.map +2 -2
  220. package/dist/mcp/tools/changeset-analysis-tools.js +98 -0
  221. package/dist/mcp/tools/changeset-analysis-tools.js.map +7 -0
  222. package/dist/mcp/tools/changeset-commit.js +224 -0
  223. package/dist/mcp/tools/changeset-commit.js.map +7 -0
  224. package/dist/mcp/tools/changeset-editing.js +260 -0
  225. package/dist/mcp/tools/changeset-editing.js.map +7 -0
  226. package/dist/mcp/tools/changeset-lifecycle.js +83 -0
  227. package/dist/mcp/tools/changeset-lifecycle.js.map +7 -0
  228. package/dist/mcp/tools/changeset-shared.js +31 -0
  229. package/dist/mcp/tools/changeset-shared.js.map +7 -0
  230. package/dist/mcp/tools/changeset-show.js +17 -1
  231. package/dist/mcp/tools/changeset-show.js.map +2 -2
  232. package/dist/mcp/tools/changeset-verify.js +49 -0
  233. package/dist/mcp/tools/changeset-verify.js.map +7 -0
  234. package/dist/mcp/tools/codebase-extract.js +836 -0
  235. package/dist/mcp/tools/codebase-extract.js.map +7 -0
  236. package/dist/mcp/tools/codebase-index.js +125 -0
  237. package/dist/mcp/tools/codebase-index.js.map +7 -0
  238. package/dist/mcp/tools/codebase-shared.js +265 -0
  239. package/dist/mcp/tools/codebase-shared.js.map +7 -0
  240. package/dist/mcp/tools/codebase-verify.js +48 -0
  241. package/dist/mcp/tools/codebase-verify.js.map +7 -0
  242. package/dist/mcp/tools/index.js +34 -1
  243. package/dist/mcp/tools/index.js.map +2 -2
  244. package/dist/mcp/tools/model-add.js +191 -74
  245. package/dist/mcp/tools/model-add.js.map +2 -2
  246. package/dist/mcp/tools/model-delete.js +2 -2
  247. package/dist/mcp/tools/model-delete.js.map +2 -2
  248. package/dist/mcp/tools/model-search.js +14 -0
  249. package/dist/mcp/tools/model-search.js.map +2 -2
  250. package/dist/mcp/tools/model-show.js +29 -2
  251. package/dist/mcp/tools/model-show.js.map +2 -2
  252. package/dist/mcp/tools/model-trace.js +93 -30
  253. package/dist/mcp/tools/model-trace.js.map +2 -2
  254. package/dist/mcp/tools/model-update.js +46 -26
  255. package/dist/mcp/tools/model-update.js.map +2 -2
  256. package/dist/mcp/tools/model-validate.js +46 -4
  257. package/dist/mcp/tools/model-validate.js.map +2 -2
  258. package/dist/mcp/tools/project-status-collectors.js +381 -0
  259. package/dist/mcp/tools/project-status-collectors.js.map +7 -0
  260. package/dist/mcp/tools/project-status.js +237 -0
  261. package/dist/mcp/tools/project-status.js.map +7 -0
  262. package/dist/mcp/tools/project-tools.js +505 -0
  263. package/dist/mcp/tools/project-tools.js.map +7 -0
  264. package/dist/mcp/tools/relationship-tools.js +167 -0
  265. package/dist/mcp/tools/relationship-tools.js.map +7 -0
  266. package/dist/mcp/tools/review-open.js +210 -0
  267. package/dist/mcp/tools/review-open.js.map +7 -0
  268. package/dist/mcp/tools/shared.js +35 -4
  269. package/dist/mcp/tools/shared.js.map +2 -2
  270. package/dist/mcp/tools/spec-type.js +90 -0
  271. package/dist/mcp/tools/spec-type.js.map +7 -0
  272. package/dist/reports/model-report-orchestrator.js +31 -2
  273. package/dist/reports/model-report-orchestrator.js.map +2 -2
  274. package/dist/schemas/bundled/analyzers/cbm.json +1200 -70
  275. package/dist/schemas/bundled/analyzers/manifest.json +2 -2
  276. package/dist/schemas/bundled/api.json +1029 -1658
  277. package/dist/schemas/bundled/apm.json +499 -734
  278. package/dist/schemas/bundled/application.json +735 -371
  279. package/dist/schemas/bundled/base.json +3 -220
  280. package/dist/schemas/bundled/business.json +452 -366
  281. package/dist/schemas/bundled/data-model.json +395 -411
  282. package/dist/schemas/bundled/data-store.json +334 -558
  283. package/dist/schemas/bundled/manifest.json +18 -18
  284. package/dist/schemas/bundled/motivation.json +349 -368
  285. package/dist/schemas/bundled/navigation.json +415 -731
  286. package/dist/schemas/bundled/product.json +325 -159
  287. package/dist/schemas/bundled/security.json +864 -1232
  288. package/dist/schemas/bundled/technology.json +574 -703
  289. package/dist/schemas/bundled/testing.json +865 -1646
  290. package/dist/schemas/bundled/ux.json +739 -1352
  291. package/dist/server/schemas.js +8 -0
  292. package/dist/server/schemas.js.map +2 -2
  293. package/dist/server/server.js +686 -231
  294. package/dist/server/server.js.map +3 -3
  295. package/dist/server/viewer-registry.js +264 -0
  296. package/dist/server/viewer-registry.js.map +7 -0
  297. package/dist/server-entry.js +2 -1
  298. package/dist/server-entry.js.map +2 -2
  299. package/dist/telemetry/index.js +1 -1
  300. package/dist/utils/ansi-suppressor.js +6 -8
  301. package/dist/utils/ansi-suppressor.js.map +2 -2
  302. package/dist/utils/attribute-patch.js +41 -0
  303. package/dist/utils/attribute-patch.js.map +7 -0
  304. package/dist/utils/error-hints.js +29 -0
  305. package/dist/utils/error-hints.js.map +7 -0
  306. package/dist/utils/errors.js +9 -3
  307. package/dist/utils/errors.js.map +2 -2
  308. package/dist/utils/id-generator.js +5 -2
  309. package/dist/utils/id-generator.js.map +2 -2
  310. package/dist/utils/project-paths.js +26 -1
  311. package/dist/utils/project-paths.js.map +2 -2
  312. package/dist/utils/source-reference.js +64 -31
  313. package/dist/utils/source-reference.js.map +2 -2
  314. package/dist/utils/spec-version.js +2 -2
  315. package/dist/utils/spec-version.js.map +1 -1
  316. package/dist/validators/composed-reference-validator.js +5 -27
  317. package/dist/validators/composed-reference-validator.js.map +2 -2
  318. package/dist/validators/model-warnings.js +28 -0
  319. package/dist/validators/model-warnings.js.map +7 -0
  320. package/dist/validators/reference-validator.js +0 -7
  321. package/dist/validators/reference-validator.js.map +2 -2
  322. package/dist/validators/relationship-schema-validator.js +3 -3
  323. package/dist/validators/relationship-schema-validator.js.map +2 -2
  324. package/dist/validators/schema-validator.js +27 -9
  325. package/dist/validators/schema-validator.js.map +2 -2
  326. package/dist/validators/types.js.map +1 -1
  327. package/dist/viewer/README.md +6 -6
  328. package/dist/viewer/assets/main-CUOQGGRA.css +1 -0
  329. package/dist/viewer/assets/main-DvH3gYrI.js +84 -0
  330. package/dist/viewer/index.html +2 -2
  331. package/dist/viewer/manifest.json +10 -10
  332. package/dist/viewer/version.json +1 -1
  333. package/package.json +2 -1
  334. package/dist/viewer/assets/main-B7AOQXXX.js +0 -81
  335. package/dist/viewer/assets/main-vdrFrG7q.css +0 -1
@@ -1,10 +1,10 @@
1
1
  {
2
- "specVersion": "0.10.0",
2
+ "specVersion": "0.12.0",
3
3
  "layer": {
4
4
  "id": "testing",
5
5
  "number": 13,
6
6
  "name": "Testing Layer",
7
- "description": "Layer 13: Testing Layer",
7
+ "description": "Describes how the system is verified: test strategies and plans, suites and cases, fixtures and test data, mocks and stubs, coverage targets and summaries, and the environments tests run in (IEEE 829-2008 test documentation). Test files, fixtures and test configuration are evidence for elements here; the production code under test belongs to the layer it implements. Modelling rules: each testing type has one composing parent. A test coverage model composes its coverage targets, input space partitions, context variations, environment factors, exclusions and coverage summary; a coverage target composes its target input fields, outcome categories, coverage requirements and test case sketches; a coverage requirement composes its input partition selections; a partition composes its values; a test case sketch composes its input selections. A test case sketch validates the one coverage requirement it exercises and references the context variation and outcome category it combines; each input selection references the partition value it picks. A coverage requirement references the context variations and outcome categories it needs, and reaches partition values only through its selections. A target input field references its partition and the field under test (an API parameter, schema property or UX component), so partitions stay reusable across fields; a selection references the values it picks, and a partition dependency references its trigger value and the partition it affects. Summaries report and never validate: a coverage summary aggregates the per-target summaries, a target coverage summary references its target, and both reference the gaps and exclusions they count. Gaps and exclusions reference the requirement or target they concern, and an exclusion references the gap it waives. Context variations reference the environment factors they fix, and environment factors reference only technology nodes and system software. A coverage target covers the production artifact it names; a test case sketch tests what it exercises, requires the software it runs on and accesses the stores holding its fixture data; the model covers only the application component, UX application or API document it is for. Requirements and summaries reach no other layer. The model carries the plan-level motivation links (it supports goals, satisfies principles, constraints and requirements, and measures outcomes), and test case sketches satisfy the requirements they verify.",
8
8
  "inspired_by": {
9
9
  "standard": "IEEE 829-2008",
10
10
  "version": "2008",
@@ -34,7 +34,7 @@
34
34
  "contextvariation": {
35
35
  "$schema": "http://json-schema.org/draft-07/schema#",
36
36
  "title": "ContextVariation",
37
- "description": "A distinct test type or environmental context under which a coverage target may be invoked, used to parameterize test design across different execution conditions (functional correctness, load behavior, security posture, regression state). Maps to environmental needs documented in IEEE 829-2008 test design specifications.",
37
+ "description": "A named test-design condition, classified by test type (functional, load, security, regression, smoke, exploratory), under which a TestCoverageTarget is to be exercised, optionally bound to a set of EnvironmentFactors that fix the concrete environment for that condition. It names the whole execution context. It does not name a single environmental variable or an input value. Use EnvironmentFactor instead when the element is a single concrete environmental variable and its value (e.g. 'Ubuntu 22.04', 'en-US', 'latency < 100ms'), not a named test context that groups such variables. Use CoverageRequirement instead when the element states coverage criteria (pairwise, boundary-values, MC/DC) that must be met, possibly across several contexts, rather than defining one context. Use InputSpacePartition instead when the variation is in the data fed to the target (an input field's equivalence classes), not in the type of test or the execution environment. Use OutcomeCategory instead when the element classifies the expected result (success, timeout, validation-error), not the conditions under which the test runs.",
38
38
  "allOf": [
39
39
  {
40
40
  "$ref": "urn:dr:spec:base:spec-node"
@@ -54,7 +54,8 @@
54
54
  "type": "object",
55
55
  "properties": {
56
56
  "description": {
57
- "type": "string"
57
+ "type": "string",
58
+ "description": "Free-text explanation of the execution condition this variation represents: its purpose, scope and how it differs from other contexts applied to the same target, such as 'peak-load run at 500 rps against staging'. Set it whenever the contextType alone does not identify the context uniquely."
58
59
  },
59
60
  "contextType": {
60
61
  "type": "string",
@@ -77,12 +78,24 @@
77
78
  "additionalProperties": false
78
79
  }
79
80
  },
81
+ "x-dr-standard": "IEEE 829-2008 Test Design Specification – Approach refinements and Environmental needs (Clause 9 Level Test Plan: environmental needs)",
82
+ "x-dr-evidence": [
83
+ "Separate test suites or directories split by test type, such as tests/load, tests/security, tests/smoke, or pytest markers / JUnit @Tag('smoke'|'regression') used to select runs",
84
+ "CI pipeline jobs or matrix entries that run the same targets under named contexts, e.g. a 'load' job invoking k6/JMeter or a 'security' job invoking OWASP ZAP, each with its own environment variables",
85
+ "Test configuration profiles bundling environment settings per context, e.g. playwright.config projects, tox envs, or application-test-load.yml, that set OS, locale, network throttling or dependency versions"
86
+ ],
87
+ "x-dr-distinguish": {
88
+ "testing.environmentfactor": "the element is a single concrete environmental variable and its value (e.g. 'Ubuntu 22.04', 'en-US', 'latency < 100ms'), not a named test context that groups such variables",
89
+ "testing.coveragerequirement": "the element states coverage criteria (pairwise, boundary-values, MC/DC) that must be met, possibly across several contexts, rather than defining one context",
90
+ "testing.inputspacepartition": "the variation is in the data fed to the target (an input field's equivalence classes), not in the type of test or the execution environment",
91
+ "testing.outcomecategory": "the element classifies the expected result (success, timeout, validation-error), not the conditions under which the test runs"
92
+ },
80
93
  "$id": "urn:dr:spec:node:testing.contextvariation"
81
94
  },
82
95
  "coverageexclusion": {
83
96
  "$schema": "http://json-schema.org/draft-07/schema#",
84
97
  "title": "CoverageExclusion",
85
- "description": "A formally approved exclusion of a coverage target or requirement from the test coverage model, documenting the rationale, accepted risk, and accountable approver per test plan scope documentation in IEEE 829-2008.",
98
+ "description": "A recorded governance decision that removes a specific coverage target or coverage requirement from the coverage that must be achieved. It names the excluded item, gives the rationale, states whether the residual risk is accepted, and identifies the accountable approver. It exists only once someone has explicitly decided and signed off on not testing the item, not merely when the item is observed to be untested. Use CoverageGap instead when the missing coverage has been detected (e.g. in a summary report) but no one has yet approved leaving it untested; a gap may later flow into an exclusion. Use InputPartitionSelection instead when specific partition values are carved out of a single requirement's selection as a test-design choice (excludeValues), without a formal waiver, approver or risk acceptance. Use CoverageRequirement instead when the element states coverage criteria that must be satisfied rather than a sanctioned decision not to satisfy them. Use TestCaseSketch instead when an individual designed test case is being retired (status deprecated) rather than an entire target or requirement being waived from coverage.",
86
99
  "allOf": [
87
100
  {
88
101
  "$ref": "urn:dr:spec:base:spec-node"
@@ -102,16 +115,20 @@
102
115
  "type": "object",
103
116
  "properties": {
104
117
  "description": {
105
- "type": "string"
118
+ "type": "string",
119
+ "description": "Free-text summary of what is excluded and the scope of the exclusion; set it when the reason alone does not make the boundary of the excluded item clear."
106
120
  },
107
121
  "reason": {
108
- "type": "string"
122
+ "type": "string",
123
+ "description": "Plain-language justification for excluding the item from coverage (e.g. 'third-party code', 'deprecated endpoint scheduled for removal', 'not testable in CI environment'); always required."
109
124
  },
110
125
  "riskAccepted": {
111
- "type": "boolean"
126
+ "type": "boolean",
127
+ "description": "True when the approver has explicitly accepted the residual risk of the item going untested. False when the exclusion rests on the item having no meaningful risk (e.g. dead or generated code)."
112
128
  },
113
129
  "approvedBy": {
114
- "type": "string"
130
+ "type": "string",
131
+ "description": "Name, role or identity reference of the person or body accountable for authorising the exclusion (e.g. 'QA Lead', 'jane.doe', 'Change Advisory Board'); always required."
115
132
  },
116
133
  "affectedTargetRef": {
117
134
  "type": "string",
@@ -127,12 +144,24 @@
127
144
  "additionalProperties": false
128
145
  }
129
146
  },
147
+ "x-dr-standard": "IEEE 829-2008 Clause 9 Level Test Plan: features not to be tested (with risk justification under risks and contingencies)",
148
+ "x-dr-evidence": [
149
+ "A coverage-tool ignore entry with a justification comment that cites an approval or ticket, such as a `# pragma: no cover` or `/* istanbul ignore next */` line, `omit` in .coveragerc, or `coveragePathIgnorePatterns` in jest.config.",
150
+ "A test-waiver or exclusions file (YAML, JSON or Markdown) listing excluded endpoints, workflows or requirements with fields such as reason, approver and date.",
151
+ "A skipped or disabled test annotation that carries a reason and a waiver reference, such as `@pytest.mark.skip(reason=\"waived per QA-123, approved by J. Doe\")` or `@Disabled(\"Excluded: risk accepted, see ADR-12\")`."
152
+ ],
153
+ "x-dr-distinguish": {
154
+ "testing.coveragegap": "the missing coverage has been detected (e.g. in a summary report) but no one has yet approved leaving it untested; a gap may later flow into an exclusion.",
155
+ "testing.inputpartitionselection": "specific partition values are carved out of a single requirement's selection as a test-design choice (excludeValues), without a formal waiver, approver or risk acceptance.",
156
+ "testing.coveragerequirement": "the element states coverage criteria that must be satisfied rather than a sanctioned decision not to satisfy them.",
157
+ "testing.testcasesketch": "an individual designed test case is being retired (status deprecated) rather than an entire target or requirement being waived from coverage."
158
+ },
130
159
  "$id": "urn:dr:spec:node:testing.coverageexclusion"
131
160
  },
132
161
  "coveragegap": {
133
162
  "$schema": "http://json-schema.org/draft-07/schema#",
134
163
  "title": "CoverageGap",
135
- "description": "An identified deficit between required and achieved test coverage for a target or requirement, typically surfaced during test summary reporting per IEEE 829-2008. Gaps require remediation, risk acceptance (CoverageExclusion), or deferral.",
164
+ "description": "A recorded finding that a specific coverage requirement or coverage target lacks the implemented or executed tests it needs. It names what is uncovered, how severe the gap is, and where it stands in remediation. It records a shortfall against required coverage, not a deliberate, approved scope decision and not an aggregate metric. Use CoverageExclusion instead when the uncovered item has been formally approved as out of scope, with a rationale, accepted risk and a named approver, rather than merely found to be missing coverage. Use TargetCoverageSummary instead when you are recording counts or percentages of sketches and implemented tests for a target, rather than a specific uncovered requirement that needs action. Use CoverageSummary instead when the artifact aggregates coverage totals across the whole model instead of describing one identified deficit. Use CoverageRequirement instead when you are specifying the criteria that must be met, rather than recording that those criteria are currently unmet.",
136
165
  "allOf": [
137
166
  {
138
167
  "$ref": "urn:dr:spec:base:spec-node"
@@ -152,7 +181,8 @@
152
181
  "type": "object",
153
182
  "properties": {
154
183
  "description": {
155
- "type": "string"
184
+ "type": "string",
185
+ "description": "Free-text explanation of what is not covered (for example, missing partitions, contexts or outcome categories) and how the gap was detected. Set it whenever the severity and affected requirement alone do not make the gap clear."
156
186
  },
157
187
  "severity": {
158
188
  "type": "string",
@@ -177,12 +207,24 @@
177
207
  "additionalProperties": false
178
208
  }
179
209
  },
210
+ "x-dr-standard": "IEEE 829-2008 Clause 16 Level Test Report / Clause 17 Master Test Report (the Test Summary Report in IEEE 829-1998): comprehensive assessment and variances, i.e. identification of features or combinations not sufficiently tested",
211
+ "x-dr-evidence": [
212
+ "Coverage tool output (e.g. lcov, JaCoCo, coverage.py) or a CI gate failure listing files or endpoints below a configured threshold such as `fail_under` or `coverageThreshold`.",
213
+ "Test files carrying skip or todo markers (`@pytest.mark.skip`, `it.todo`, `xit`, `@Disabled`) with a comment or ticket ID explaining that a requirement or partition is not yet tested.",
214
+ "Issue-tracker items or TEST_GAPS / test-report markdown entries labelled 'coverage gap' or 'missing tests', naming an endpoint or requirement ID and a severity."
215
+ ],
216
+ "x-dr-distinguish": {
217
+ "testing.coverageexclusion": "the uncovered item has been formally approved as out of scope, with a rationale, accepted risk and a named approver, rather than merely found to be missing coverage",
218
+ "testing.targetcoveragesummary": "you are recording counts or percentages of sketches and implemented tests for a target, rather than a specific uncovered requirement that needs action",
219
+ "testing.coveragesummary": "the artifact aggregates coverage totals across the whole model instead of describing one identified deficit",
220
+ "testing.coveragerequirement": "you are specifying the criteria that must be met, rather than recording that those criteria are currently unmet"
221
+ },
180
222
  "$id": "urn:dr:spec:node:testing.coveragegap"
181
223
  },
182
224
  "coveragerequirement": {
183
225
  "$schema": "http://json-schema.org/draft-07/schema#",
184
226
  "title": "CoverageRequirement",
185
- "description": "A specification of coverage criteria that must be satisfied for a TestCoverageTarget, defining which input partitions, context variations, and outcome categories must be exercised per IEEE 829-2008 test design specification requirements. The specific partitions, context variations, and outcome categories are associated via relationships (to InputPartitionSelection, ContextVariation, and OutcomeCategory nodes) rather than direct attributes.",
227
+ "description": "A test design rule attached to one TestCoverageTarget that names a combinatorial or structural coverage criterion (e.g. boundary-values, pairwise, MC/DC) which the target's test cases must satisfy across selected input partitions, context variations and outcome categories. It states what must be exercised. It is not a test case, not the target itself, and not a measured result. Use TestCoverageTarget instead when the element identifies the endpoint, workflow, component or job that needs testing, rather than the criterion its tests must meet. Use InputPartitionSelection instead when the element lists which specific values of one InputSpacePartition are included or excluded, rather than the overall coverage strategy that uses those selections. Use TestCaseSketch instead when the element is one designed or implemented test case choosing concrete partition values, rather than the rule that a set of such cases must satisfy. Use CoverageGap instead when the element records a measured shortfall against a requirement found during reporting, rather than the requirement itself.",
186
228
  "allOf": [
187
229
  {
188
230
  "$ref": "urn:dr:spec:base:spec-node"
@@ -202,7 +244,8 @@
202
244
  "type": "object",
203
245
  "properties": {
204
246
  "description": {
205
- "type": "string"
247
+ "type": "string",
248
+ "description": "Free-text statement of what this requirement demands for its target, naming the partitions, contexts or outcomes in scope and any rationale. Set it whenever the coverageCriteria value alone does not make the scope evident."
206
249
  },
207
250
  "coverageCriteria": {
208
251
  "type": "string",
@@ -226,12 +269,24 @@
226
269
  "additionalProperties": false
227
270
  }
228
271
  },
272
+ "x-dr-standard": "IEEE 829-2008 Clause 10 Level Test Design (test design specification: approach refinements and feature pass/fail criteria)",
273
+ "x-dr-evidence": [
274
+ "A combinatorial test model file, such as a PICT .txt model, an allpairs config or a hypothesis/fast-check strategy, scoped to one endpoint or function, that declares parameters and an order or strategy like pairwise.",
275
+ "A parametrized test table (pytest.mark.parametrize, test.each, JUnit @ParameterizedTest/@CsvSource) whose rows enumerate boundary and invalid classes for one target, with a comment or docstring naming the criterion (e.g. 'boundary values for quantity').",
276
+ "A test plan or test design Markdown/YAML entry that states, per feature or endpoint, a required criterion and priority (e.g. 'POST /orders: all-partitions over status × role, must cover validation-error and authorization-error outcomes')."
277
+ ],
278
+ "x-dr-distinguish": {
279
+ "testing.testcoveragetarget": "the element identifies the endpoint, workflow, component or job that needs testing, rather than the criterion its tests must meet",
280
+ "testing.inputpartitionselection": "the element lists which specific values of one InputSpacePartition are included or excluded, rather than the overall coverage strategy that uses those selections",
281
+ "testing.testcasesketch": "the element is one designed or implemented test case choosing concrete partition values, rather than the rule that a set of such cases must satisfy",
282
+ "testing.coveragegap": "the element records a measured shortfall against a requirement found during reporting, rather than the requirement itself"
283
+ },
229
284
  "$id": "urn:dr:spec:node:testing.coveragerequirement"
230
285
  },
231
286
  "coveragesummary": {
232
287
  "$schema": "http://json-schema.org/draft-07/schema#",
233
288
  "title": "CoverageSummary",
234
- "description": "Aggregated coverage status across all targets and requirements within a test coverage model, suitable for test summary reporting.",
289
+ "description": "A model-wide test summary report record that totals the coverage targets, coverage requirements and test case sketches of exactly one TestCoverageModel at a point in time. Per-target figures are rolled up from the model's TargetCoverageSummary records. Use TargetCoverageSummary instead when the metrics (sketch, implemented and automated counts or a percentage) describe a single TestCoverageTarget rather than the whole model. Use CoverageGap instead when the artifact records one specific shortfall between required and achieved coverage, with a severity and a remediation status, rather than aggregate totals. Use TestCoverageModel instead when the artifact is the coverage specification itself, holding the targets, partitions and requirements, rather than a generated report about it. Use CoverageExclusion instead when the artifact is an approved decision to leave a target or requirement uncovered, rather than a count of what is covered.",
235
290
  "allOf": [
236
291
  {
237
292
  "$ref": "urn:dr:spec:base:spec-node"
@@ -255,28 +310,44 @@
255
310
  "description": "ID of the testing.testcoveragemodel this summary aggregates"
256
311
  },
257
312
  "generatedAt": {
258
- "type": "string"
313
+ "type": "string",
314
+ "description": "ISO 8601 date-time at which the summary was computed; set it every time the summary is regenerated so stale reports can be detected."
259
315
  },
260
316
  "totalTargets": {
261
- "type": "integer"
317
+ "type": "integer",
318
+ "description": "Non-negative count of TestCoverageTarget nodes in the referenced model at generation time, including targets that have exclusions or gaps."
262
319
  },
263
320
  "totalRequirements": {
264
- "type": "integer"
321
+ "type": "integer",
322
+ "description": "Non-negative count of CoverageRequirement nodes across all targets in the referenced model at generation time."
265
323
  },
266
324
  "totalSketches": {
267
- "type": "integer"
325
+ "type": "integer",
326
+ "description": "Non-negative count of TestCaseSketch nodes across all targets in the model regardless of status; this equals the sum of sketchCount over the model's TargetCoverageSummary records."
268
327
  }
269
328
  },
270
329
  "required": ["totalTargets", "totalRequirements", "totalSketches"],
271
330
  "additionalProperties": false
272
331
  }
273
332
  },
333
+ "x-dr-standard": "IEEE 829-2008 Clause 17 Master Test Report / Clause 16 Level Test Report (overview and summary of results; the Test Summary Report in IEEE 829-1998)",
334
+ "x-dr-evidence": [
335
+ "A script or CI job that loads the test coverage model (YAML or JSON) and emits totals of targets, requirements and test cases with a generation timestamp.",
336
+ "A generated report artifact (e.g. coverage-model-summary.json or a Markdown table in docs/testing) that lists overall counts per model and links to per-target summaries.",
337
+ "A test-reporting dashboard or README section that publishes model-level totals of covered features, requirements and designed test cases for a named application."
338
+ ],
339
+ "x-dr-distinguish": {
340
+ "testing.targetcoveragesummary": "the metrics (sketch, implemented and automated counts or a percentage) describe a single TestCoverageTarget rather than the whole model.",
341
+ "testing.coveragegap": "the artifact records one specific shortfall between required and achieved coverage, with a severity and a remediation status, rather than aggregate totals.",
342
+ "testing.testcoveragemodel": "the artifact is the coverage specification itself, holding the targets, partitions and requirements, rather than a generated report about it.",
343
+ "testing.coverageexclusion": "the artifact is an approved decision to leave a target or requirement uncovered, rather than a count of what is covered."
344
+ },
274
345
  "$id": "urn:dr:spec:node:testing.coveragesummary"
275
346
  },
276
347
  "environmentfactor": {
277
348
  "$schema": "http://json-schema.org/draft-07/schema#",
278
349
  "title": "EnvironmentFactor",
279
- "description": "A specific environmental variable (OS version, network latency, locale setting, hardware configuration, dependency version) documented as affecting test behavior. Used to parameterize ContextVariation instances with concrete environmental constraints per IEEE 829-2008 environmental needs specification.",
350
+ "description": "A single named environmental condition of a test run (operating system, network characteristic, locale, hardware configuration or dependency version) pinned to a concrete value or constraint and recorded because it changes how tests behave. It describes one factor of the execution environment, not the test type that bundles factors together nor any input supplied to the system under test. Use ContextVariation instead when the thing being modelled is a named test context (functional, load, security, regression, smoke, exploratory) that groups several environmental constraints, rather than one variable with one value. Use PartitionValue instead when the value is an equivalence class of an input field passed to the system under test (request parameter, form field, data property), not a property of the runtime environment. Use InputSpacePartition instead when an input dimension is being divided into equivalence classes. Do this even if that dimension is a locale or OS selector. A single fixed environmental setting is not a partition.",
280
351
  "allOf": [
281
352
  {
282
353
  "$ref": "urn:dr:spec:base:spec-node"
@@ -319,19 +390,31 @@
319
390
  "description": "Description of how variations in this factor are expected to affect test behavior or outcomes."
320
391
  },
321
392
  "description": {
322
- "type": "string"
393
+ "type": "string",
394
+ "description": "Free-text explanation of what this environmental factor is and why it is pinned for testing, for example 'Server-side timezone forced to UTC to make date-boundary tests deterministic'. Set it whenever the factorType and value alone do not make the factor's purpose clear."
323
395
  }
324
396
  },
325
397
  "required": ["factorType", "value"],
326
398
  "additionalProperties": false
327
399
  }
328
400
  },
401
+ "x-dr-standard": "IEEE 829-2008 Test Design Specification / Test Plan §'Environmental needs' (hardware, software, communications and tool characteristics of the test environment)",
402
+ "x-dr-evidence": [
403
+ "A CI matrix entry pinning an environment axis, such as a GitHub Actions `strategy.matrix` with `os: [ubuntu-22.04, windows-2022]` or `node-version: [18.x, 20.x]`, or a tox/nox env list over Python versions.",
404
+ "Test setup that forces an environmental condition, such as setting `TZ`/`LANG`/`LC_ALL` environment variables, network-throttling or latency-injection config (toxiproxy, tc netem, Playwright `emulateNetworkConditions`), or a docker-compose test service pinned to a specific image tag.",
405
+ "Conditional test guards keyed on the environment, such as `@pytest.mark.skipif(sys.platform == 'win32')`, Jest `testEnvironment`, or an engines/`.nvmrc`/`.tool-versions` file referenced by test configuration."
406
+ ],
407
+ "x-dr-distinguish": {
408
+ "testing.contextvariation": "the thing being modelled is a named test context (functional, load, security, regression, smoke, exploratory) that groups several environmental constraints, rather than one variable with one value.",
409
+ "testing.partitionvalue": "the value is an equivalence class of an input field passed to the system under test (request parameter, form field, data property), not a property of the runtime environment.",
410
+ "testing.inputspacepartition": "an input dimension is being divided into equivalence classes. Do this even if that dimension is a locale or OS selector. A single fixed environmental setting is not a partition."
411
+ },
329
412
  "$id": "urn:dr:spec:node:testing.environmentfactor"
330
413
  },
331
414
  "inputpartitionselection": {
332
415
  "$schema": "http://json-schema.org/draft-07/schema#",
333
416
  "title": "InputPartitionSelection",
334
- "description": "A specification of which values from an InputSpacePartition must be exercised within a CoverageRequirement, supporting selective coverage of equivalence classes per IEEE 829-2008 test design specification. When coverAllCategories is true, all partition values are included except those in excludeValues; otherwise, only the values listed in coverValues are included.",
417
+ "description": "A coverage-scope rule within a CoverageRequirement that names exactly one InputSpacePartition and declares which of its PartitionValues must be exercised. The rule takes one of two forms: an explicit include list, or all values minus an exclude list. It selects equivalence classes and never binds concrete test data. Use InputSelection instead when a single partition value is bound to a concrete test datum for one specific TestCaseSketch, rather than a set of classes being declared in scope for a requirement. Use PartitionValue instead when you are defining the equivalence class itself (its label, constraint and representative value), not choosing which classes to cover. Use PartitionDependency instead when the inclusion or exclusion of values in one field is conditional on a value chosen in another field. Use CoverageRequirement instead when you are stating the overall criterion (pairwise, boundary-values, MC/DC) and priority, rather than the per-partition value subset it draws on.",
335
418
  "allOf": [
336
419
  {
337
420
  "$ref": "urn:dr:spec:base:spec-node"
@@ -376,12 +459,24 @@
376
459
  "additionalProperties": false
377
460
  }
378
461
  },
462
+ "x-dr-standard": "IEEE 829-2008 Level Test Design Specification (Clause 10), approach refinements: selection of equivalence classes to be exercised",
463
+ "x-dr-evidence": [
464
+ "A combinatorial test model file (e.g. a PICT .txt or ACTS model) that lists one parameter with only a subset of its defined value classes.",
465
+ "A test-design YAML/JSON block keyed by an input field or partition name, with include/exclude lists or an 'all: true, except: [...]' form.",
466
+ "A parametrized test (pytest.mark.parametrize, it.each, @EnumSource(mode = EXCLUDE)) iterating over one field's enum or equivalence classes, with specific classes deliberately omitted or excluded."
467
+ ],
468
+ "x-dr-distinguish": {
469
+ "testing.inputselection": "a single partition value is bound to a concrete test datum for one specific TestCaseSketch, rather than a set of classes being declared in scope for a requirement.",
470
+ "testing.partitionvalue": "you are defining the equivalence class itself (its label, constraint and representative value), not choosing which classes to cover.",
471
+ "testing.partitiondependency": "the inclusion or exclusion of values in one field is conditional on a value chosen in another field.",
472
+ "testing.coveragerequirement": "you are stating the overall criterion (pairwise, boundary-values, MC/DC) and priority, rather than the per-partition value subset it draws on."
473
+ },
379
474
  "$id": "urn:dr:spec:node:testing.inputpartitionselection"
380
475
  },
381
476
  "inputselection": {
382
477
  "$schema": "http://json-schema.org/draft-07/schema#",
383
478
  "title": "InputSelection",
384
- "description": "A concrete input value assignment for a TestCaseSketch, binding an abstract partition representative value (selectedValue) to a specific concrete test datum (concreteValue), per test case input specification in IEEE 829-2008.",
479
+ "description": "A single input binding inside one TestCaseSketch that assigns, for one partitioned input field, the chosen equivalence class (a PartitionValue) and the exact datum the test will submit for it. It is owned by exactly one test case, so it records the data that one test actually uses rather than a coverage obligation. Use InputPartitionSelection instead when the element states which partition values a CoverageRequirement obliges tests to exercise (cover/exclude lists), without fixing a concrete datum for any particular test case. Use PartitionValue instead when the element defines an equivalence class itself (label, constraint, category, representative value) independent of any test case that uses it. Use TestCaseSketch instead when the element is the whole test case design (status, implementation format, source) that groups several input bindings. Use TargetInputField instead when the element only associates an input field of the target with its InputSpacePartition, without choosing a value for a specific test.",
385
480
  "allOf": [
386
481
  {
387
482
  "$ref": "urn:dr:spec:base:spec-node"
@@ -401,13 +496,16 @@
401
496
  "type": "object",
402
497
  "properties": {
403
498
  "partitionRef": {
404
- "type": "string"
499
+ "type": "string",
500
+ "description": "ID of the testing.inputspacepartition whose input field this binding supplies a value for; set it on every selection so the concrete value can be traced to its input dimension."
405
501
  },
406
502
  "selectedValue": {
407
- "type": "string"
503
+ "type": "string",
504
+ "description": "Label or ID of the testing.partitionvalue (equivalence class) chosen from that partition for this test case, e.g. 'boundary-max' or 'null-empty'."
408
505
  },
409
506
  "concreteValue": {
410
- "type": "string"
507
+ "type": "string",
508
+ "description": "The exact datum the test submits for the field, serialized as a string (literal, JSON fragment, or fixture key), e.g. '255', '\"\"', or 'fixtures/user_admin.json'."
411
509
  },
412
510
  "valueSource": {
413
511
  "type": "string",
@@ -424,12 +522,24 @@
424
522
  "additionalProperties": false
425
523
  }
426
524
  },
525
+ "x-dr-standard": "IEEE 829-2008 Clause 11 Level Test Case: inputs",
526
+ "x-dr-evidence": [
527
+ "A row in a parametrized test table (e.g. pytest.mark.parametrize, JUnit @CsvSource, Jest test.each) that supplies a specific literal for one argument, often named or commented after its class, such as 'age=-1 # invalid: negative'",
528
+ "A test-data file (CSV/JSON/YAML) with one column per input field and one row per test case, consumed by a data-driven runner",
529
+ "A fixture or factory call inside a single test that builds a specific value for a request field, e.g. build_user(email='a@b') or a Faker/hypothesis strategy pinned to a boundary such as max length 255"
530
+ ],
531
+ "x-dr-distinguish": {
532
+ "testing.inputpartitionselection": "the element states which partition values a CoverageRequirement obliges tests to exercise (cover/exclude lists), without fixing a concrete datum for any particular test case",
533
+ "testing.partitionvalue": "the element defines an equivalence class itself (label, constraint, category, representative value) independent of any test case that uses it",
534
+ "testing.testcasesketch": "the element is the whole test case design (status, implementation format, source) that groups several input bindings",
535
+ "testing.targetinputfield": "the element only associates an input field of the target with its InputSpacePartition, without choosing a value for a specific test"
536
+ },
427
537
  "$id": "urn:dr:spec:node:testing.inputselection"
428
538
  },
429
539
  "inputspacepartition": {
430
540
  "$schema": "http://json-schema.org/draft-07/schema#",
431
541
  "title": "InputSpacePartition",
432
- "description": "Partitioning of an input dimension into testable equivalence classes, where each class groups values expected to behave identically under test. Enables systematic, structured coverage analysis per IEEE 829-2008 equivalence partitioning guidance by ensuring distinct behavioral categories are explicitly identified before test case selection.",
542
+ "description": "A test-design artifact that divides the domain of a single input field (an API parameter, schema property, or stored collection attribute) into a named set of equivalence classes (PartitionValues), each grouping values expected to produce the same behaviour under test. It also states whether that field must be present in test inputs. Use PartitionValue instead when the element is one individual equivalence class (label, constraint, representative value) rather than the whole set of classes for a field. Use InputPartitionSelection instead when the element chooses which classes of an existing partition a CoverageRequirement must exercise, rather than defining the classes themselves. Use TargetInputField instead when the element only binds a field of a specific TestCoverageTarget to a partition and records its relevance, without enumerating classes. Use PartitionDependency instead when the element expresses a constraint linking a class in one field's partition to the allowed classes of another field.",
433
543
  "allOf": [
434
544
  {
435
545
  "$ref": "urn:dr:spec:base:spec-node"
@@ -449,10 +559,12 @@
449
559
  "type": "object",
450
560
  "properties": {
451
561
  "description": {
452
- "type": "string"
562
+ "type": "string",
563
+ "description": "Free-text explanation of the input dimension being partitioned and the basis on which its equivalence classes were derived (e.g. specification rule, data type limits); set whenever the partitioning rationale is not obvious from the field name."
453
564
  },
454
565
  "fieldRef": {
455
- "type": "string"
566
+ "type": "string",
567
+ "description": "Cross-layer ID of the input field this partition divides, typically an api.parameter, data-model.schemaproperty, data-model.jsonschema or data-store.collection element; always set to the single field whose value domain is being partitioned."
456
568
  },
457
569
  "presenceRule": {
458
570
  "type": "string",
@@ -470,12 +582,24 @@
470
582
  "additionalProperties": false
471
583
  }
472
584
  },
585
+ "x-dr-standard": "IEEE 829-2008 Level Test Design Specification (test approach refinements / features to be tested); equivalence partitioning technique as defined in ISO/IEC/IEEE 29119-4 §5.2.1",
586
+ "x-dr-evidence": [
587
+ "a parametrized test table (e.g. pytest.mark.parametrize, JUnit @ParameterizedTest with @MethodSource, Jest test.each) for one input field whose cases carry class ids such as 'valid', 'empty', 'too_long', 'negative'",
588
+ "a test-data module, enum or factory that enumerates named valid/invalid/boundary value groups for a single request parameter or schema property (e.g. EMAIL_CASES = {valid: [...], malformed: [...], null: [...]})",
589
+ "a property-based generator per field built from named sub-strategies (e.g. hypothesis st.one_of(valid_emails(), malformed_emails())), or a test-design document table listing equivalence classes per parameter"
590
+ ],
591
+ "x-dr-distinguish": {
592
+ "testing.partitionvalue": "the element is one individual equivalence class (label, constraint, representative value) rather than the whole set of classes for a field",
593
+ "testing.inputpartitionselection": "the element chooses which classes of an existing partition a CoverageRequirement must exercise, rather than defining the classes themselves",
594
+ "testing.targetinputfield": "the element only binds a field of a specific TestCoverageTarget to a partition and records its relevance, without enumerating classes",
595
+ "testing.partitiondependency": "the element expresses a constraint linking a class in one field's partition to the allowed classes of another field"
596
+ },
473
597
  "$id": "urn:dr:spec:node:testing.inputspacepartition"
474
598
  },
475
599
  "outcomecategory": {
476
600
  "$schema": "http://json-schema.org/draft-07/schema#",
477
601
  "title": "OutcomeCategory",
478
- "description": "An abstract category of observable outcomes (e.g., success, validation error, authorization error, timeout) associated with a TestCoverageTarget, used during test design to organize expected results before test case specification per IEEE 829-2008. Distinguished from specific assertions — OutcomeCategory defines the class of outcome, not the exact expected value.",
602
+ "description": "A test-design classification of the observable result a TestCoverageTarget can produce (success, validation error, authorization error, not-found, server error, exception, timeout), stated at the level of result class rather than exact expected value. Coverage requirements must exercise it, and test case sketches are grouped under it. Use PartitionValue instead when the category classifies an input value (e.g. an invalid or null-empty equivalence class) rather than the result the target returns. Use ContextVariation instead when the category describes the test type or execution condition (functional, load, security, regression) under which the target is exercised, not what it returns. Use TestCaseSketch instead when the element specifies a particular case with concrete inputs and a specific expected value or assertion, rather than a class of outcomes. Use EnvironmentFactor instead when the element is the environmental condition (e.g. network latency) that provokes an outcome such as a timeout, rather than the outcome itself.",
479
603
  "allOf": [
480
604
  {
481
605
  "$ref": "urn:dr:spec:base:spec-node"
@@ -495,7 +619,8 @@
495
619
  "type": "object",
496
620
  "properties": {
497
621
  "description": {
498
- "type": "string"
622
+ "type": "string",
623
+ "description": "Free-text explanation of what observable behaviour qualifies as this outcome for the target, e.g. 'HTTP 422 with field-level error list'. Set it whenever the outcomeType alone does not identify the signal tests should check."
499
624
  },
500
625
  "outcomeType": {
501
626
  "type": "string",
@@ -515,12 +640,24 @@
515
640
  "additionalProperties": false
516
641
  }
517
642
  },
643
+ "x-dr-standard": "IEEE 829-2008 Level Test Design Specification (feature pass/fail criteria) and Level Test Case Specification (outputs specification)",
644
+ "x-dr-evidence": [
645
+ "test describe/context blocks or test names grouped by result class, e.g. 'returns 404 when resource missing', 'rejects unauthorized caller with 403', 'times out after 5s'",
646
+ "parameterized test tables or fixtures with an expected-outcome column (expected_status, expected_error, expectedOutcome) whose values are status classes or error types rather than exact payloads",
647
+ "assertions that check outcome class rather than exact value, e.g. expect(res.status).toBe(400), pytest.raises(ValidationError), assertThrows(AccessDeniedException), or OpenAPI response codes enumerated per operation in test plans"
648
+ ],
649
+ "x-dr-distinguish": {
650
+ "testing.partitionvalue": "the category classifies an input value (e.g. an invalid or null-empty equivalence class) rather than the result the target returns",
651
+ "testing.contextvariation": "the category describes the test type or execution condition (functional, load, security, regression) under which the target is exercised, not what it returns",
652
+ "testing.testcasesketch": "the element specifies a particular case with concrete inputs and a specific expected value or assertion, rather than a class of outcomes",
653
+ "testing.environmentfactor": "the element is the environmental condition (e.g. network latency) that provokes an outcome such as a timeout, rather than the outcome itself"
654
+ },
518
655
  "$id": "urn:dr:spec:node:testing.outcomecategory"
519
656
  },
520
657
  "partitiondependency": {
521
658
  "$schema": "http://json-schema.org/draft-07/schema#",
522
659
  "title": "PartitionDependency",
523
- "description": "A constraint specifying how selection of a partition value in one field affects valid or available partition values in another field, enabling combinatorial test design to avoid invalid input combinations per IEEE 829-2008 test design specification.",
660
+ "description": "A cross-field constraint in combinatorial test design stating that when a specific partition value (the trigger) is selected in one InputSpacePartition, the availability of named partition values in another input field is excluded, required, restricted, or re-ranged, so that generated combinations omit invalid inputs. Use PartitionValue instead when the condition bounds a single field's own equivalence class (its constraintExpression) and does not depend on the value chosen for any other field. Use InputPartitionSelection instead when the restriction is a per-CoverageRequirement choice of which values of one partition to cover or exclude (coverValues/excludeValues), not a rule that applies whenever another field takes a given value. Use InputSpacePartition instead when you are describing the input dimension itself and its presenceRule (including a plain 'conditional' flag), rather than the specific trigger value and affected values that make it conditional. Use CoverageExclusion instead when a target or requirement is deliberately removed from coverage with an approver and accepted risk, rather than a combination being logically invalid.",
524
661
  "allOf": [
525
662
  {
526
663
  "$ref": "urn:dr:spec:base:spec-node"
@@ -562,7 +699,8 @@
562
699
  "description": "Comma-separated labels or IDs of the partition values in the dependent field whose availability is modified by this dependency (e.g., values that are excluded, required, or restricted when the trigger value is selected)."
563
700
  },
564
701
  "description": {
565
- "type": "string"
702
+ "type": "string",
703
+ "description": "Free-text explanation of the business or technical reason the trigger value constrains the affected values (e.g. 'guest accounts cannot hold admin role'); set whenever the rule is not self-evident from effect and affectedValues."
566
704
  }
567
705
  },
568
706
  "required": [
@@ -574,12 +712,24 @@
574
712
  "additionalProperties": false
575
713
  }
576
714
  },
715
+ "x-dr-standard": "IEEE 829-2008 Level Test Design Specification (test design refinements: feature/input combinations to be tested); conceptually the category-partition method's selector constraints (Ostrand & Balcer)",
716
+ "x-dr-evidence": [
717
+ "A constraint line in a combinatorial test model file, e.g. a PICT/ACTS model containing 'IF [PaymentMethod] = \"invoice\" THEN [Country] IN {\"DE\",\"AT\"};'",
718
+ "A parametrized test generator (e.g. pytest_generate_tests, JUnit ArgumentsProvider, itertools.product filter) that drops or skips tuples when one parameter has a specific value and another has a listed value",
719
+ "A property-based test calling assume()/filter() that ties one generated argument's allowed values to another argument's value, e.g. 'assume(not (account_type == \"guest\" and role == \"admin\"))'"
720
+ ],
721
+ "x-dr-distinguish": {
722
+ "testing.partitionvalue": "the condition bounds a single field's own equivalence class (its constraintExpression) and does not depend on the value chosen for any other field.",
723
+ "testing.inputpartitionselection": "the restriction is a per-CoverageRequirement choice of which values of one partition to cover or exclude (coverValues/excludeValues), not a rule that applies whenever another field takes a given value.",
724
+ "testing.inputspacepartition": "you are describing the input dimension itself and its presenceRule (including a plain 'conditional' flag), rather than the specific trigger value and affected values that make it conditional.",
725
+ "testing.coverageexclusion": "a target or requirement is deliberately removed from coverage with an approver and accepted risk, rather than a combination being logically invalid."
726
+ },
577
727
  "$id": "urn:dr:spec:node:testing.partitiondependency"
578
728
  },
579
729
  "partitionvalue": {
580
730
  "$schema": "http://json-schema.org/draft-07/schema#",
581
731
  "title": "PartitionValue",
582
- "description": "An individual equivalence class within an InputSpacePartition, characterized by a label, representative value, and optional constraint expression, used to enumerate the testable categories of an input dimension per IEEE 829-2008 test design specification.",
732
+ "description": "A single equivalence class or boundary class of one input dimension, owned by exactly one InputSpacePartition. It is defined by a boundary condition and by a representative value that stands for every value in the class during test design. Use InputSpacePartition instead when you are modelling the whole input field or dimension and its complete set of classes, rather than one class within it. Use InputSelection instead when you are binding a specific concrete test datum, used by a particular TestCaseSketch, to one of the partition's classes. Use InputPartitionSelection instead when you are stating which classes of a partition a CoverageRequirement must or must not exercise. Use OutcomeCategory instead when the category classifies expected results (success, validation error, timeout) rather than input values.",
583
733
  "allOf": [
584
734
  {
585
735
  "$ref": "urn:dr:spec:base:spec-node"
@@ -599,10 +749,12 @@
599
749
  "type": "object",
600
750
  "properties": {
601
751
  "label": {
602
- "type": "string"
752
+ "type": "string",
753
+ "description": "Short identifier for the class, unique within its parent partition (e.g. 'empty-string', 'above-max'); other nodes cite it in coverValues, excludeValues and affectedValues, so it is always set."
603
754
  },
604
755
  "description": {
605
- "type": "string"
756
+ "type": "string",
757
+ "description": "Optional free-text explanation of why values in this class are expected to behave alike and what behaviour they probe; set it when the label and constraint alone do not make the intent clear."
606
758
  },
607
759
  "constraint": {
608
760
  "type": "string",
@@ -625,7 +777,8 @@
625
777
  "description": "Equivalence partition category for this value"
626
778
  },
627
779
  "representativeValue": {
628
- "type": "string"
780
+ "type": "string",
781
+ "description": "One abstract value, written as a string, that stands for the whole class in test design (e.g. '101' for above-max, '' for null-empty); it is distinct from the concrete datum later bound in InputSelection.concreteValue."
629
782
  }
630
783
  },
631
784
  "required": [
@@ -638,12 +791,24 @@
638
791
  "additionalProperties": false
639
792
  }
640
793
  },
794
+ "x-dr-standard": "IEEE 829-2008 Level Test Design Specification, features and input specification refinement; equivalence partitioning and boundary value analysis per ISO/IEC/IEEE 29119-4 §5.2.1 and §5.2.3",
795
+ "x-dr-evidence": [
796
+ "A parametrized test table for a single argument whose case ids name input classes, e.g. @pytest.mark.parametrize ids=['valid','empty','too_long','negative'] or a JUnit @ValueSource/@CsvSource grouped by class.",
797
+ "Test data constants or builder functions named after a class of one field and mirroring a schema constraint, e.g. MAX_LEN_BOUNDARY = 255, invalid_email(), or a 'min - 1' value derived from a minimum declared in the OpenAPI or JSON Schema.",
798
+ "A property-based generator restricted to one class of an input, e.g. a Hypothesis strategy such as st.integers(min_value=0, max_value=100) or a fast-check arbitrary filtered by a regex predicate."
799
+ ],
800
+ "x-dr-distinguish": {
801
+ "testing.inputspacepartition": "you are modelling the whole input field or dimension and its complete set of classes, rather than one class within it.",
802
+ "testing.inputselection": "you are binding a specific concrete test datum, used by a particular TestCaseSketch, to one of the partition's classes.",
803
+ "testing.inputpartitionselection": "you are stating which classes of a partition a CoverageRequirement must or must not exercise.",
804
+ "testing.outcomecategory": "the category classifies expected results (success, validation error, timeout) rather than input values."
805
+ },
641
806
  "$id": "urn:dr:spec:node:testing.partitionvalue"
642
807
  },
643
808
  "targetcoveragesummary": {
644
809
  "$schema": "http://json-schema.org/draft-07/schema#",
645
810
  "title": "TargetCoverageSummary",
646
- "description": "Coverage metrics summary for a single test coverage target",
811
+ "description": "A per-target coverage report record that states, for exactly one TestCoverageTarget, the counts of designed, implemented and automated test case sketches and the share of that target's coverage requirements exercised by at least one implemented test. It reports measured status, not required criteria or identified deficits. Use CoverageSummary instead when the record aggregates totals across all targets and requirements of a whole TestCoverageModel rather than metrics for one target. Use CoverageGap instead when the element records a specific uncovered requirement with severity and remediation status, rather than numeric coverage counts. Use CoverageRequirement instead when the element specifies the coverage criteria a target must satisfy, rather than reporting how far they are satisfied. Use TestCoverageTarget instead when the element identifies the endpoint, workflow or component in scope for testing, rather than its coverage metrics.",
647
812
  "allOf": [
648
813
  {
649
814
  "$ref": "urn:dr:spec:base:spec-node"
@@ -692,12 +857,24 @@
692
857
  "additionalProperties": false
693
858
  }
694
859
  },
860
+ "x-dr-standard": "IEEE 829-2008 Clause 16 Level Test Report (summary of results and comprehensiveness assessment; the Test Summary Report in IEEE 829-1998), per-feature scope",
861
+ "x-dr-evidence": [
862
+ "A generated coverage report file (e.g. coverage-summary.json, a JUnit/Allure per-endpoint section) keyed by a single endpoint, route or feature ID with counts of planned, implemented and automated tests",
863
+ "A CI script or reporting job that groups test results by target (e.g. by OpenAPI operationId or tag) and computes a percentage of requirements with passing implemented tests",
864
+ "A traceability matrix row or markdown table in test documentation listing one feature/endpoint alongside sketch count, implemented count, automated count and coverage %"
865
+ ],
866
+ "x-dr-distinguish": {
867
+ "testing.coveragesummary": "the record aggregates totals across all targets and requirements of a whole TestCoverageModel rather than metrics for one target.",
868
+ "testing.coveragegap": "the element records a specific uncovered requirement with severity and remediation status, rather than numeric coverage counts.",
869
+ "testing.coveragerequirement": "the element specifies the coverage criteria a target must satisfy, rather than reporting how far they are satisfied.",
870
+ "testing.testcoveragetarget": "the element identifies the endpoint, workflow or component in scope for testing, rather than its coverage metrics."
871
+ },
695
872
  "$id": "urn:dr:spec:node:testing.targetcoveragesummary"
696
873
  },
697
874
  "targetinputfield": {
698
875
  "$schema": "http://json-schema.org/draft-07/schema#",
699
876
  "title": "TargetInputField",
700
- "description": "An association between a TestCoverageTarget and a specific input field of the target artifact, defining which InputSpacePartition applies to that field and documenting its coverage relevance per IEEE 829-2008 test case specification.",
877
+ "description": "A test-design association that binds one input field of a TestCoverageTarget's artifact (an API parameter, data-model property or UI input) to the InputSpacePartition used to divide that field into equivalence classes. It also records whether the field must appear in test inputs for that target. Use InputSpacePartition instead when you are defining the equivalence classes of an input dimension itself, independent of which target or field uses them. Use InputPartitionSelection instead when you are stating which values of a partition a specific CoverageRequirement must exercise, rather than which partition governs a target's field. Use InputSelection instead when you are binding a concrete test datum to a partition value for an individual TestCaseSketch. Use TestCoverageTarget instead when the symbol represents the endpoint, workflow or component under test as a whole, not one of its input fields.",
701
878
  "allOf": [
702
879
  {
703
880
  "$ref": "urn:dr:spec:base:spec-node"
@@ -725,7 +902,8 @@
725
902
  "description": "ID of the testing.inputspacepartition that defines the equivalence classes or boundary values for this input field."
726
903
  },
727
904
  "description": {
728
- "type": "string"
905
+ "type": "string",
906
+ "description": "Free-text note on why this field matters for testing the target, such as validation rules or known defect history. Set it when the field's relevance or chosen partition is not self-evident from fieldRef and partitionRef."
729
907
  },
730
908
  "relevance": {
731
909
  "type": "string",
@@ -737,12 +915,24 @@
737
915
  "additionalProperties": false
738
916
  }
739
917
  },
918
+ "x-dr-standard": "IEEE 829-2008 Clause 11 Level Test Case, inputs, informed by Level Test Design equivalence-partitioning features",
919
+ "x-dr-evidence": [
920
+ "A parameterized test (pytest.mark.parametrize, JUnit @ParameterizedTest/@MethodSource) whose parameter is named after one request field of the endpoint under test, with value sets grouped as valid/invalid/boundary.",
921
+ "A per-endpoint test-data map or fixture keyed by request field name (e.g. {\"email\": EMAIL_CASES, \"age\": AGE_BOUNDARIES}) that pairs each field with a reusable case list.",
922
+ "A property-based or schema-driven generator bound to a single DTO/OpenAPI parameter (Hypothesis st.builds field override, fast-check arbitrary, Schemathesis hook for one parameter)."
923
+ ],
924
+ "x-dr-distinguish": {
925
+ "testing.inputspacepartition": "you are defining the equivalence classes of an input dimension itself, independent of which target or field uses them.",
926
+ "testing.inputpartitionselection": "you are stating which values of a partition a specific CoverageRequirement must exercise, rather than which partition governs a target's field.",
927
+ "testing.inputselection": "you are binding a concrete test datum to a partition value for an individual TestCaseSketch.",
928
+ "testing.testcoveragetarget": "the symbol represents the endpoint, workflow or component under test as a whole, not one of its input fields."
929
+ },
740
930
  "$id": "urn:dr:spec:node:testing.targetinputfield"
741
931
  },
742
932
  "testcasesketch": {
743
933
  "$schema": "http://json-schema.org/draft-07/schema#",
744
934
  "title": "TestCaseSketch",
745
- "description": "A design-time test case specification that selects concrete input partition values for a CoverageRequirement, serving as the bridge between test design (InputPartitionSelection) and executable test case specification per IEEE 829-2008. Exists in sketch (unimplemented) or implemented status — not yet tied to a specific test runner or execution framework.",
935
+ "description": "A single test case design that combines specific input selections (one chosen value per relevant partition), a context variation and an expected outcome category to exercise one CoverageRequirement of a TestCoverageTarget. It may remain unimplemented or be linked through source to the individual test function, parameterized row or scenario that realizes it. Use CoverageRequirement instead when the element states which partitions, contexts or outcomes must be covered (the criterion), rather than one specific combination chosen to satisfy it. Use InputSelection instead when the element is one field's binding of a partition representative to a concrete datum inside a test case, not the whole test case. Use InputPartitionSelection instead when the element lists which partition values a coverage requirement demands across all its tests, rather than the values one test case uses. Use TestCoverageTarget instead when the element identifies the endpoint, component or workflow under test, which anchors many test cases, rather than an individual test case against it.",
746
936
  "allOf": [
747
937
  {
748
938
  "$ref": "urn:dr:spec:base:spec-node"
@@ -762,7 +952,8 @@
762
952
  "type": "object",
763
953
  "properties": {
764
954
  "description": {
765
- "type": "string"
955
+ "type": "string",
956
+ "description": "Free-text summary of the scenario this sketch exercises: preconditions, the input combination chosen and the expected observable outcome. Set it whenever the name alone does not make the intent clear."
766
957
  },
767
958
  "status": {
768
959
  "type": "string",
@@ -794,12 +985,24 @@
794
985
  "additionalProperties": false
795
986
  }
796
987
  },
988
+ "x-dr-standard": "IEEE 829-2008 Clause 11 Level Test Case (test case specification: inputs, expected outcomes, environmental needs)",
989
+ "x-dr-evidence": [
990
+ "An individual test function or method (pytest test_*, Jest it()/test(), JUnit @Test) whose name, docstring or tag cites a requirement or partition, e.g. 'rejects quantity below zero'.",
991
+ "A single row of a parameterized test, such as a pytest.mark.parametrize id, a JUnit @CsvSource line or a Gherkin 'Scenario Outline' Examples row, binding concrete inputs to an expected result.",
992
+ "A test-case entry in a test plan, spreadsheet or test-management export (TestRail, Xray, Zephyr) with an ID, preconditions, input values, expected result and a status such as Draft or Approved."
993
+ ],
994
+ "x-dr-distinguish": {
995
+ "testing.coveragerequirement": "the element states which partitions, contexts or outcomes must be covered (the criterion), rather than one specific combination chosen to satisfy it.",
996
+ "testing.inputselection": "the element is one field's binding of a partition representative to a concrete datum inside a test case, not the whole test case.",
997
+ "testing.inputpartitionselection": "the element lists which partition values a coverage requirement demands across all its tests, rather than the values one test case uses.",
998
+ "testing.testcoveragetarget": "the element identifies the endpoint, component or workflow under test, which anchors many test cases, rather than an individual test case against it."
999
+ },
797
1000
  "$id": "urn:dr:spec:node:testing.testcasesketch"
798
1001
  },
799
1002
  "testcoveragemodel": {
800
1003
  "$schema": "http://json-schema.org/draft-07/schema#",
801
1004
  "title": "TestCoverageModel",
802
- "description": "The root artifact of a testing layer coverage specification, aggregating all TestCoverageTargets, InputSpacePartitions, ContextVariations, CoverageRequirements, and TestCaseSketches for an application. Corresponds to the test plan document structure in IEEE 829-2008, providing a single point of reference for coverage governance.",
1005
+ "description": "A versioned, application-scoped coverage specification that acts as the root container for the coverage targets, input partitions, context variations, coverage requirements, exclusions and test case sketches of exactly one application or API. It corresponds to a test plan as a whole, not to any individual target, test, suite or results report. Use TestCoverageTarget instead when the element identifies one endpoint, workflow, UI component, job or integration flow that needs coverage, rather than the whole application's coverage specification. Use CoverageSummary instead when the element reports aggregated counts or status across a model's targets, requirements and sketches, rather than defining the coverage scope itself. Use CoverageRequirement instead when the element states the criteria (partitions, contexts, outcomes, coverage strategy) that a single target must satisfy, rather than containing all targets and requirements.",
803
1006
  "allOf": [
804
1007
  {
805
1008
  "$ref": "urn:dr:spec:base:spec-node"
@@ -819,14 +1022,16 @@
819
1022
  "type": "object",
820
1023
  "properties": {
821
1024
  "version": {
822
- "type": "string"
1025
+ "type": "string",
1026
+ "description": "Version identifier of this coverage model, as a semantic version or date stamp (e.g. '1.2.0' or '2024-05-01'); increment it whenever targets, requirements or exclusions are added, removed or changed."
823
1027
  },
824
1028
  "application": {
825
1029
  "type": "string",
826
1030
  "description": "Cross-layer reference ID to the application or API element (application layer or api layer) being covered by this model"
827
1031
  },
828
1032
  "description": {
829
- "type": "string"
1033
+ "type": "string",
1034
+ "description": "Free-text summary of the model's scope, the application release or test level it addresses, and any overall test approach; set it whenever the scope is not obvious from the application reference."
830
1035
  },
831
1036
  "source": {
832
1037
  "type": "object",
@@ -837,12 +1042,23 @@
837
1042
  "additionalProperties": false
838
1043
  }
839
1044
  },
1045
+ "x-dr-standard": "IEEE 829-2008 Clause 8 Master Test Plan / Clause 9 Level Test Plan",
1046
+ "x-dr-evidence": [
1047
+ "A top-level test plan or coverage manifest file (e.g. test-plan.yaml, coverage-model.json) carrying a version and an application or service identifier, and listing the endpoints or features to be tested.",
1048
+ "A TEST_PLAN.md or docs/testing/plan document for one service that has 'Features to be tested', 'Approach' and 'Pass/fail criteria' sections.",
1049
+ "A test-generation configuration that imports one OpenAPI document or application spec (e.g. a schemathesis, dredd or contract-test config pointing at openapi.yaml) and produces the set of coverage targets for that application."
1050
+ ],
1051
+ "x-dr-distinguish": {
1052
+ "testing.testcoveragetarget": "the element identifies one endpoint, workflow, UI component, job or integration flow that needs coverage, rather than the whole application's coverage specification.",
1053
+ "testing.coveragesummary": "the element reports aggregated counts or status across a model's targets, requirements and sketches, rather than defining the coverage scope itself.",
1054
+ "testing.coveragerequirement": "the element states the criteria (partitions, contexts, outcomes, coverage strategy) that a single target must satisfy, rather than containing all targets and requirements."
1055
+ },
840
1056
  "$id": "urn:dr:spec:node:testing.testcoveragemodel"
841
1057
  },
842
1058
  "testcoveragetarget": {
843
1059
  "$schema": "http://json-schema.org/draft-07/schema#",
844
1060
  "title": "TestCoverageTarget",
845
- "description": "The primary unit of test scope governance in a TestCoverageModel, identifying an artifact or functionality that requires test coverage per IEEE 829-2008 Section 5.2.3 (Features to be tested). A target may represent an API endpoint, UI component, business workflow, or integration point — each anchoring a set of CoverageRequirements and TestCaseSketches.",
1061
+ "description": "A test-scope entry in a TestCoverageModel that names one production artifact or capability (an API operation, UI view, business workflow, data migration, integration flow or scheduled job) whose behaviour must be verified. It is the anchor to which input fields, outcome categories, coverage requirements and test case sketches for that artifact attach. It records what is in scope, not the production code itself. Use CoverageRequirement instead when the element states the criteria (e.g. boundary-values, pairwise) that must be exercised for a target, rather than naming the thing to be tested. Use TestCaseSketch instead when the element is an individual designed or implemented test case selecting specific partition values, rather than the artifact those cases exercise. Use TestCoverageModel instead when the element is the application-wide root aggregating many targets, partitions and requirements, rather than a single artifact in scope. Use TargetCoverageSummary instead when the element reports sketch, implemented or automated counts and a percentage for a target, rather than defining the target.",
846
1062
  "allOf": [
847
1063
  {
848
1064
  "$ref": "urn:dr:spec:base:spec-node"
@@ -862,7 +1078,8 @@
862
1078
  "type": "object",
863
1079
  "properties": {
864
1080
  "description": {
865
- "type": "string"
1081
+ "type": "string",
1082
+ "description": "Free-text summary of the artifact or functionality in scope and the testing concerns it raises. Set it whenever the target name and targetType alone do not make the boundary of what must be verified clear."
866
1083
  },
867
1084
  "targetType": {
868
1085
  "type": "string",
@@ -890,21 +1107,22 @@
890
1107
  "additionalProperties": false
891
1108
  }
892
1109
  },
1110
+ "x-dr-standard": "IEEE 829-2008 Clause 8 Master Test Plan / Clause 9 Level Test Plan: features to be tested (with test items)",
1111
+ "x-dr-evidence": [
1112
+ "A test suite block (describe/class/@Nested) named after a specific endpoint, component, job or workflow, e.g. describe('POST /orders'), whose tests all import or call that one production symbol",
1113
+ "A test plan, coverage manifest or traceability file (YAML/JSON/Markdown) listing 'features to be tested' entries keyed by operationId, route, component or job name, with a priority",
1114
+ "Coverage tool configuration that scopes include patterns or thresholds to a named module, endpoint handler or scheduled-job entry point (e.g. per-path thresholds in jest/istanbul or a JaCoCo include rule)"
1115
+ ],
1116
+ "x-dr-distinguish": {
1117
+ "testing.coveragerequirement": "the element states the criteria (e.g. boundary-values, pairwise) that must be exercised for a target, rather than naming the thing to be tested",
1118
+ "testing.testcasesketch": "the element is an individual designed or implemented test case selecting specific partition values, rather than the artifact those cases exercise",
1119
+ "testing.testcoveragemodel": "the element is the application-wide root aggregating many targets, partitions and requirements, rather than a single artifact in scope",
1120
+ "testing.targetcoveragesummary": "the element reports sketch, implemented or automated counts and a percentage for a target, rather than defining the target"
1121
+ },
893
1122
  "$id": "urn:dr:spec:node:testing.testcoveragetarget"
894
1123
  }
895
1124
  },
896
1125
  "relationshipSchemas": {
897
- "testing.contextvariation.depends-on.testing.contextvariation": {
898
- "id": "testing.contextvariation.depends-on.testing.contextvariation",
899
- "source_spec_node_id": "testing.contextvariation",
900
- "source_layer": "testing",
901
- "destination_spec_node_id": "testing.contextvariation",
902
- "destination_layer": "testing",
903
- "predicate": "depends-on",
904
- "cardinality": "many-to-many",
905
- "strength": "medium",
906
- "required": false
907
- },
908
1126
  "testing.contextvariation.references.testing.environmentfactor": {
909
1127
  "id": "testing.contextvariation.references.testing.environmentfactor",
910
1128
  "source_spec_node_id": "testing.contextvariation",
@@ -914,18 +1132,8 @@
914
1132
  "predicate": "references",
915
1133
  "cardinality": "many-to-many",
916
1134
  "strength": "medium",
917
- "required": false
918
- },
919
- "testing.contextvariation.serves.testing.testcoveragetarget": {
920
- "id": "testing.contextvariation.serves.testing.testcoveragetarget",
921
- "source_spec_node_id": "testing.contextvariation",
922
- "source_layer": "testing",
923
- "destination_spec_node_id": "testing.testcoveragetarget",
924
- "destination_layer": "testing",
925
- "predicate": "serves",
926
- "cardinality": "many-to-many",
927
- "strength": "medium",
928
- "required": false
1135
+ "required": false,
1136
+ "description": "The context variation fixes the environment factor, such as a load context pinned to a given network latency."
929
1137
  },
930
1138
  "testing.coverageexclusion.references.testing.coveragegap": {
931
1139
  "id": "testing.coverageexclusion.references.testing.coveragegap",
@@ -936,7 +1144,8 @@
936
1144
  "predicate": "references",
937
1145
  "cardinality": "many-to-many",
938
1146
  "strength": "medium",
939
- "required": false
1147
+ "required": false,
1148
+ "description": "The exclusion waives the gap, accepting the risk instead of closing it."
940
1149
  },
941
1150
  "testing.coverageexclusion.references.testing.coveragerequirement": {
942
1151
  "id": "testing.coverageexclusion.references.testing.coveragerequirement",
@@ -947,7 +1156,8 @@
947
1156
  "predicate": "references",
948
1157
  "cardinality": "many-to-many",
949
1158
  "strength": "medium",
950
- "required": false
1159
+ "required": false,
1160
+ "description": "The exclusion removes the coverage requirement from the coverage that must be achieved."
951
1161
  },
952
1162
  "testing.coverageexclusion.references.testing.testcoveragetarget": {
953
1163
  "id": "testing.coverageexclusion.references.testing.testcoveragetarget",
@@ -958,18 +1168,8 @@
958
1168
  "predicate": "references",
959
1169
  "cardinality": "many-to-many",
960
1170
  "strength": "medium",
961
- "required": false
962
- },
963
- "testing.coveragegap.flows-to.testing.coverageexclusion": {
964
- "id": "testing.coveragegap.flows-to.testing.coverageexclusion",
965
- "source_spec_node_id": "testing.coveragegap",
966
- "source_layer": "testing",
967
- "destination_spec_node_id": "testing.coverageexclusion",
968
- "destination_layer": "testing",
969
- "predicate": "flows-to",
970
- "cardinality": "many-to-many",
971
- "strength": "medium",
972
- "required": false
1171
+ "required": false,
1172
+ "description": "The exclusion removes the whole target from the coverage that must be achieved."
973
1173
  },
974
1174
  "testing.coveragegap.references.testing.coveragerequirement": {
975
1175
  "id": "testing.coveragegap.references.testing.coveragerequirement",
@@ -980,7 +1180,8 @@
980
1180
  "predicate": "references",
981
1181
  "cardinality": "many-to-many",
982
1182
  "strength": "medium",
983
- "required": false
1183
+ "required": false,
1184
+ "description": "The gap records that the coverage requirement lacks the tests it needs."
984
1185
  },
985
1186
  "testing.coveragegap.references.testing.testcoveragetarget": {
986
1187
  "id": "testing.coveragegap.references.testing.testcoveragetarget",
@@ -991,1151 +1192,296 @@
991
1192
  "predicate": "references",
992
1193
  "cardinality": "many-to-many",
993
1194
  "strength": "medium",
994
- "required": false
1195
+ "required": false,
1196
+ "description": "The gap records that the target lacks the tests it needs."
995
1197
  },
996
- "testing.coveragegap.triggers.testing.coveragerequirement": {
997
- "id": "testing.coveragegap.triggers.testing.coveragerequirement",
998
- "source_spec_node_id": "testing.coveragegap",
1198
+ "testing.coveragerequirement.composes.testing.inputpartitionselection": {
1199
+ "id": "testing.coveragerequirement.composes.testing.inputpartitionselection",
1200
+ "source_spec_node_id": "testing.coveragerequirement",
999
1201
  "source_layer": "testing",
1000
- "destination_spec_node_id": "testing.coveragerequirement",
1202
+ "destination_spec_node_id": "testing.inputpartitionselection",
1001
1203
  "destination_layer": "testing",
1002
- "predicate": "triggers",
1204
+ "predicate": "composes",
1003
1205
  "cardinality": "many-to-many",
1004
1206
  "strength": "medium",
1005
- "required": false
1207
+ "required": false,
1208
+ "description": "The selection states which partition values the requirement must exercise and exists only within it."
1006
1209
  },
1007
- "testing.coveragegap.triggers.testing.partitionvalue": {
1008
- "id": "testing.coveragegap.triggers.testing.partitionvalue",
1009
- "source_spec_node_id": "testing.coveragegap",
1210
+ "testing.coveragerequirement.references.testing.contextvariation": {
1211
+ "id": "testing.coveragerequirement.references.testing.contextvariation",
1212
+ "source_spec_node_id": "testing.coveragerequirement",
1010
1213
  "source_layer": "testing",
1011
- "destination_spec_node_id": "testing.partitionvalue",
1214
+ "destination_spec_node_id": "testing.contextvariation",
1012
1215
  "destination_layer": "testing",
1013
- "predicate": "triggers",
1216
+ "predicate": "references",
1014
1217
  "cardinality": "many-to-many",
1015
1218
  "strength": "medium",
1016
- "required": false
1219
+ "required": false,
1220
+ "description": "The requirement must be met under the context variation, such as also under a security context."
1017
1221
  },
1018
- "testing.coveragerequirement.accesses.testing.inputpartitionselection": {
1019
- "id": "testing.coveragerequirement.accesses.testing.inputpartitionselection",
1222
+ "testing.coveragerequirement.references.testing.coveragerequirement": {
1223
+ "id": "testing.coveragerequirement.references.testing.coveragerequirement",
1020
1224
  "source_spec_node_id": "testing.coveragerequirement",
1021
1225
  "source_layer": "testing",
1022
- "destination_spec_node_id": "testing.inputpartitionselection",
1226
+ "destination_spec_node_id": "testing.coveragerequirement",
1023
1227
  "destination_layer": "testing",
1024
- "predicate": "accesses",
1228
+ "predicate": "references",
1025
1229
  "cardinality": "many-to-many",
1026
1230
  "strength": "medium",
1027
- "required": false
1231
+ "required": false,
1232
+ "description": "The requirement builds on or refines another requirement, such as pairwise coverage extending boundary-value coverage."
1028
1233
  },
1029
- "testing.coveragerequirement.accesses.testing.inputselection": {
1030
- "id": "testing.coveragerequirement.accesses.testing.inputselection",
1234
+ "testing.coveragerequirement.references.testing.outcomecategory": {
1235
+ "id": "testing.coveragerequirement.references.testing.outcomecategory",
1031
1236
  "source_spec_node_id": "testing.coveragerequirement",
1032
1237
  "source_layer": "testing",
1033
- "destination_spec_node_id": "testing.inputselection",
1238
+ "destination_spec_node_id": "testing.outcomecategory",
1034
1239
  "destination_layer": "testing",
1035
- "predicate": "accesses",
1240
+ "predicate": "references",
1036
1241
  "cardinality": "many-to-many",
1037
1242
  "strength": "medium",
1038
- "required": false
1243
+ "required": false,
1244
+ "description": "The requirement must exercise the outcome category, such as every validation error."
1039
1245
  },
1040
- "testing.coveragerequirement.aggregates.testing.contextvariation": {
1041
- "id": "testing.coveragerequirement.aggregates.testing.contextvariation",
1042
- "source_spec_node_id": "testing.coveragerequirement",
1246
+ "testing.coveragesummary.aggregates.testing.targetcoveragesummary": {
1247
+ "id": "testing.coveragesummary.aggregates.testing.targetcoveragesummary",
1248
+ "source_spec_node_id": "testing.coveragesummary",
1043
1249
  "source_layer": "testing",
1044
- "destination_spec_node_id": "testing.contextvariation",
1250
+ "destination_spec_node_id": "testing.targetcoveragesummary",
1045
1251
  "destination_layer": "testing",
1046
1252
  "predicate": "aggregates",
1047
1253
  "cardinality": "many-to-many",
1048
1254
  "strength": "medium",
1049
- "required": false
1255
+ "required": false,
1256
+ "description": "The model summary rolls up the per-target summary."
1050
1257
  },
1051
- "testing.coveragerequirement.aggregates.testing.coverageexclusion": {
1052
- "id": "testing.coveragerequirement.aggregates.testing.coverageexclusion",
1053
- "source_spec_node_id": "testing.coveragerequirement",
1258
+ "testing.coveragesummary.references.testing.coverageexclusion": {
1259
+ "id": "testing.coveragesummary.references.testing.coverageexclusion",
1260
+ "source_spec_node_id": "testing.coveragesummary",
1054
1261
  "source_layer": "testing",
1055
1262
  "destination_spec_node_id": "testing.coverageexclusion",
1056
1263
  "destination_layer": "testing",
1057
- "predicate": "aggregates",
1264
+ "predicate": "references",
1058
1265
  "cardinality": "many-to-many",
1059
1266
  "strength": "medium",
1060
- "required": false
1267
+ "required": false,
1268
+ "description": "The summary counts the exclusion among the accepted waivers."
1061
1269
  },
1062
- "testing.coveragerequirement.aggregates.testing.partitionvalue": {
1063
- "id": "testing.coveragerequirement.aggregates.testing.partitionvalue",
1064
- "source_spec_node_id": "testing.coveragerequirement",
1270
+ "testing.coveragesummary.references.testing.coveragegap": {
1271
+ "id": "testing.coveragesummary.references.testing.coveragegap",
1272
+ "source_spec_node_id": "testing.coveragesummary",
1065
1273
  "source_layer": "testing",
1066
- "destination_spec_node_id": "testing.partitionvalue",
1274
+ "destination_spec_node_id": "testing.coveragegap",
1067
1275
  "destination_layer": "testing",
1068
- "predicate": "aggregates",
1276
+ "predicate": "references",
1069
1277
  "cardinality": "many-to-many",
1070
1278
  "strength": "medium",
1071
- "required": false
1279
+ "required": false,
1280
+ "description": "The summary counts the gap among the open shortfalls."
1072
1281
  },
1073
- "testing.coveragerequirement.composes.testing.inputpartitionselection": {
1074
- "id": "testing.coveragerequirement.composes.testing.inputpartitionselection",
1075
- "source_spec_node_id": "testing.coveragerequirement",
1282
+ "testing.environmentfactor.references.technology.node": {
1283
+ "id": "testing.environmentfactor.references.technology.node",
1284
+ "source_spec_node_id": "testing.environmentfactor",
1076
1285
  "source_layer": "testing",
1077
- "destination_spec_node_id": "testing.inputpartitionselection",
1078
- "destination_layer": "testing",
1079
- "predicate": "composes",
1286
+ "destination_spec_node_id": "technology.node",
1287
+ "destination_layer": "technology",
1288
+ "predicate": "references",
1080
1289
  "cardinality": "many-to-many",
1081
1290
  "strength": "medium",
1082
- "required": false
1291
+ "required": false,
1292
+ "description": "The factor pins the host, container or device tests run on."
1083
1293
  },
1084
- "testing.coveragerequirement.composes.testing.outcomecategory": {
1085
- "id": "testing.coveragerequirement.composes.testing.outcomecategory",
1086
- "source_spec_node_id": "testing.coveragerequirement",
1294
+ "testing.environmentfactor.references.technology.systemsoftware": {
1295
+ "id": "testing.environmentfactor.references.technology.systemsoftware",
1296
+ "source_spec_node_id": "testing.environmentfactor",
1087
1297
  "source_layer": "testing",
1088
- "destination_spec_node_id": "testing.outcomecategory",
1089
- "destination_layer": "testing",
1090
- "predicate": "composes",
1298
+ "destination_spec_node_id": "technology.systemsoftware",
1299
+ "destination_layer": "technology",
1300
+ "predicate": "references",
1091
1301
  "cardinality": "many-to-many",
1092
1302
  "strength": "medium",
1093
- "required": false
1303
+ "required": false,
1304
+ "description": "The factor pins a runtime, browser or dependency version tests run against."
1094
1305
  },
1095
- "testing.coveragerequirement.composes.testing.testcoveragetarget": {
1096
- "id": "testing.coveragerequirement.composes.testing.testcoveragetarget",
1097
- "source_spec_node_id": "testing.coveragerequirement",
1306
+ "testing.inputpartitionselection.references.testing.partitionvalue": {
1307
+ "id": "testing.inputpartitionselection.references.testing.partitionvalue",
1308
+ "source_spec_node_id": "testing.inputpartitionselection",
1098
1309
  "source_layer": "testing",
1099
- "destination_spec_node_id": "testing.testcoveragetarget",
1310
+ "destination_spec_node_id": "testing.partitionvalue",
1100
1311
  "destination_layer": "testing",
1101
- "predicate": "composes",
1102
- "cardinality": "many-to-many",
1103
- "strength": "medium",
1104
- "required": false
1105
- },
1106
- "testing.coveragerequirement.constrained-by.motivation.constraint": {
1107
- "id": "testing.coveragerequirement.constrained-by.motivation.constraint",
1108
- "source_spec_node_id": "testing.coveragerequirement",
1109
- "source_layer": "testing",
1110
- "destination_spec_node_id": "motivation.constraint",
1111
- "destination_layer": "motivation",
1112
- "predicate": "constrained-by",
1312
+ "predicate": "references",
1113
1313
  "cardinality": "many-to-many",
1114
1314
  "strength": "medium",
1115
- "required": false
1315
+ "required": false,
1316
+ "description": "The selection includes or excludes the partition value."
1116
1317
  },
1117
- "testing.coveragerequirement.covers.application.applicationfunction": {
1118
- "id": "testing.coveragerequirement.covers.application.applicationfunction",
1119
- "source_spec_node_id": "testing.coveragerequirement",
1318
+ "testing.inputselection.references.testing.partitionvalue": {
1319
+ "id": "testing.inputselection.references.testing.partitionvalue",
1320
+ "source_spec_node_id": "testing.inputselection",
1120
1321
  "source_layer": "testing",
1121
- "destination_spec_node_id": "application.applicationfunction",
1122
- "destination_layer": "application",
1123
- "predicate": "covers",
1322
+ "destination_spec_node_id": "testing.partitionvalue",
1323
+ "destination_layer": "testing",
1324
+ "predicate": "references",
1124
1325
  "cardinality": "many-to-many",
1125
1326
  "strength": "medium",
1126
- "required": false
1327
+ "required": false,
1328
+ "description": "The input selection picks the partition value as the class its datum stands for."
1127
1329
  },
1128
- "testing.coveragerequirement.covers.ux.experiencestate": {
1129
- "id": "testing.coveragerequirement.covers.ux.experiencestate",
1130
- "source_spec_node_id": "testing.coveragerequirement",
1330
+ "testing.inputspacepartition.composes.testing.partitionvalue": {
1331
+ "id": "testing.inputspacepartition.composes.testing.partitionvalue",
1332
+ "source_spec_node_id": "testing.inputspacepartition",
1131
1333
  "source_layer": "testing",
1132
- "destination_spec_node_id": "ux.experiencestate",
1133
- "destination_layer": "ux",
1134
- "predicate": "covers",
1135
- "cardinality": "many-to-many",
1136
- "strength": "medium",
1137
- "required": false
1334
+ "destination_spec_node_id": "testing.partitionvalue",
1335
+ "destination_layer": "testing",
1336
+ "predicate": "composes",
1337
+ "cardinality": "one-to-many",
1338
+ "strength": "high",
1339
+ "required": false,
1340
+ "description": "The value is one equivalence or boundary class of the partition and exists only within it."
1138
1341
  },
1139
- "testing.coveragerequirement.covers.navigation.navigationguard": {
1140
- "id": "testing.coveragerequirement.covers.navigation.navigationguard",
1141
- "source_spec_node_id": "testing.coveragerequirement",
1342
+ "testing.partitiondependency.references.testing.inputspacepartition": {
1343
+ "id": "testing.partitiondependency.references.testing.inputspacepartition",
1344
+ "source_spec_node_id": "testing.partitiondependency",
1142
1345
  "source_layer": "testing",
1143
- "destination_spec_node_id": "navigation.navigationguard",
1144
- "destination_layer": "navigation",
1145
- "predicate": "covers",
1346
+ "destination_spec_node_id": "testing.inputspacepartition",
1347
+ "destination_layer": "testing",
1348
+ "predicate": "references",
1146
1349
  "cardinality": "many-to-many",
1147
1350
  "strength": "medium",
1148
- "required": false
1351
+ "required": false,
1352
+ "description": "The dependency restricts the values available in the partition."
1149
1353
  },
1150
- "testing.coveragerequirement.covers.data-model.schemaproperty": {
1151
- "id": "testing.coveragerequirement.covers.data-model.schemaproperty",
1152
- "source_spec_node_id": "testing.coveragerequirement",
1354
+ "testing.partitiondependency.references.testing.partitionvalue": {
1355
+ "id": "testing.partitiondependency.references.testing.partitionvalue",
1356
+ "source_spec_node_id": "testing.partitiondependency",
1153
1357
  "source_layer": "testing",
1154
- "destination_spec_node_id": "data-model.schemaproperty",
1155
- "destination_layer": "data-model",
1156
- "predicate": "covers",
1358
+ "destination_spec_node_id": "testing.partitionvalue",
1359
+ "destination_layer": "testing",
1360
+ "predicate": "references",
1157
1361
  "cardinality": "many-to-many",
1158
1362
  "strength": "medium",
1159
- "required": false
1363
+ "required": false,
1364
+ "description": "The value triggers the dependency when it is selected."
1160
1365
  },
1161
- "testing.coveragerequirement.depends-on.testing.contextvariation": {
1162
- "id": "testing.coveragerequirement.depends-on.testing.contextvariation",
1163
- "source_spec_node_id": "testing.coveragerequirement",
1366
+ "testing.targetcoveragesummary.references.testing.coverageexclusion": {
1367
+ "id": "testing.targetcoveragesummary.references.testing.coverageexclusion",
1368
+ "source_spec_node_id": "testing.targetcoveragesummary",
1164
1369
  "source_layer": "testing",
1165
- "destination_spec_node_id": "testing.contextvariation",
1370
+ "destination_spec_node_id": "testing.coverageexclusion",
1166
1371
  "destination_layer": "testing",
1167
- "predicate": "depends-on",
1372
+ "predicate": "references",
1168
1373
  "cardinality": "many-to-many",
1169
1374
  "strength": "medium",
1170
- "required": false
1375
+ "required": false,
1376
+ "description": "The target summary counts the exclusion among the target's waivers."
1171
1377
  },
1172
- "testing.coveragerequirement.depends-on.testing.inputspacepartition": {
1173
- "id": "testing.coveragerequirement.depends-on.testing.inputspacepartition",
1174
- "source_spec_node_id": "testing.coveragerequirement",
1378
+ "testing.targetcoveragesummary.references.testing.coveragegap": {
1379
+ "id": "testing.targetcoveragesummary.references.testing.coveragegap",
1380
+ "source_spec_node_id": "testing.targetcoveragesummary",
1175
1381
  "source_layer": "testing",
1176
- "destination_spec_node_id": "testing.inputspacepartition",
1382
+ "destination_spec_node_id": "testing.coveragegap",
1177
1383
  "destination_layer": "testing",
1178
- "predicate": "depends-on",
1384
+ "predicate": "references",
1179
1385
  "cardinality": "many-to-many",
1180
1386
  "strength": "medium",
1181
- "required": false
1387
+ "required": false,
1388
+ "description": "The target summary counts the gap among the target's open shortfalls."
1182
1389
  },
1183
- "testing.coveragerequirement.depends-on.testing.outcomecategory": {
1184
- "id": "testing.coveragerequirement.depends-on.testing.outcomecategory",
1185
- "source_spec_node_id": "testing.coveragerequirement",
1390
+ "testing.targetcoveragesummary.references.testing.testcoveragetarget": {
1391
+ "id": "testing.targetcoveragesummary.references.testing.testcoveragetarget",
1392
+ "source_spec_node_id": "testing.targetcoveragesummary",
1186
1393
  "source_layer": "testing",
1187
- "destination_spec_node_id": "testing.outcomecategory",
1394
+ "destination_spec_node_id": "testing.testcoveragetarget",
1188
1395
  "destination_layer": "testing",
1189
- "predicate": "depends-on",
1396
+ "predicate": "references",
1190
1397
  "cardinality": "many-to-many",
1191
1398
  "strength": "medium",
1192
- "required": false
1399
+ "required": false,
1400
+ "description": "The summary reports coverage for the target."
1193
1401
  },
1194
- "testing.coveragerequirement.flows-to.testing.coveragerequirement": {
1195
- "id": "testing.coveragerequirement.flows-to.testing.coveragerequirement",
1196
- "source_spec_node_id": "testing.coveragerequirement",
1402
+ "testing.targetinputfield.references.ux.actioncomponent": {
1403
+ "id": "testing.targetinputfield.references.ux.actioncomponent",
1404
+ "source_spec_node_id": "testing.targetinputfield",
1197
1405
  "source_layer": "testing",
1198
- "destination_spec_node_id": "testing.coveragerequirement",
1199
- "destination_layer": "testing",
1200
- "predicate": "flows-to",
1406
+ "destination_spec_node_id": "ux.actioncomponent",
1407
+ "destination_layer": "ux",
1408
+ "predicate": "references",
1201
1409
  "cardinality": "many-to-many",
1202
1410
  "strength": "medium",
1203
- "required": false
1411
+ "required": false,
1412
+ "description": "The field under test is the UX component's input."
1204
1413
  },
1205
- "testing.coveragerequirement.flows-to.testing.testcasesketch": {
1206
- "id": "testing.coveragerequirement.flows-to.testing.testcasesketch",
1207
- "source_spec_node_id": "testing.coveragerequirement",
1414
+ "testing.targetinputfield.references.testing.inputspacepartition": {
1415
+ "id": "testing.targetinputfield.references.testing.inputspacepartition",
1416
+ "source_spec_node_id": "testing.targetinputfield",
1208
1417
  "source_layer": "testing",
1209
- "destination_spec_node_id": "testing.testcasesketch",
1418
+ "destination_spec_node_id": "testing.inputspacepartition",
1210
1419
  "destination_layer": "testing",
1211
- "predicate": "flows-to",
1420
+ "predicate": "references",
1212
1421
  "cardinality": "many-to-many",
1213
1422
  "strength": "medium",
1214
- "required": false
1423
+ "required": false,
1424
+ "description": "The partition divides the field's domain into classes."
1215
1425
  },
1216
- "testing.coveragerequirement.fulfills-requirements.motivation.requirement": {
1217
- "id": "testing.coveragerequirement.fulfills-requirements.motivation.requirement",
1218
- "source_spec_node_id": "testing.coveragerequirement",
1426
+ "testing.targetinputfield.references.api.parameter": {
1427
+ "id": "testing.targetinputfield.references.api.parameter",
1428
+ "source_spec_node_id": "testing.targetinputfield",
1219
1429
  "source_layer": "testing",
1220
- "destination_spec_node_id": "motivation.requirement",
1221
- "destination_layer": "motivation",
1222
- "predicate": "fulfills-requirements",
1430
+ "destination_spec_node_id": "api.parameter",
1431
+ "destination_layer": "api",
1432
+ "predicate": "references",
1223
1433
  "cardinality": "many-to-many",
1224
- "strength": "high",
1225
- "required": false
1434
+ "strength": "medium",
1435
+ "required": false,
1436
+ "description": "The field under test is the API parameter."
1226
1437
  },
1227
- "testing.coveragerequirement.references.business.businessfunction": {
1228
- "id": "testing.coveragerequirement.references.business.businessfunction",
1229
- "source_spec_node_id": "testing.coveragerequirement",
1438
+ "testing.targetinputfield.references.data-model.schemaproperty": {
1439
+ "id": "testing.targetinputfield.references.data-model.schemaproperty",
1440
+ "source_spec_node_id": "testing.targetinputfield",
1230
1441
  "source_layer": "testing",
1231
- "destination_spec_node_id": "business.businessfunction",
1232
- "destination_layer": "business",
1442
+ "destination_spec_node_id": "data-model.schemaproperty",
1443
+ "destination_layer": "data-model",
1233
1444
  "predicate": "references",
1234
1445
  "cardinality": "many-to-many",
1235
1446
  "strength": "medium",
1236
- "required": false
1237
- },
1238
- "testing.coveragerequirement.references.testing.coveragerequirement": {
1239
- "id": "testing.coveragerequirement.references.testing.coveragerequirement",
1240
- "source_spec_node_id": "testing.coveragerequirement",
1241
- "source_layer": "testing",
1242
- "destination_spec_node_id": "testing.coveragerequirement",
1243
- "destination_layer": "testing",
1244
- "predicate": "references",
1245
- "cardinality": "many-to-many",
1246
- "strength": "medium",
1247
- "required": false
1248
- },
1249
- "testing.coveragerequirement.references.apm.metricinstrument": {
1250
- "id": "testing.coveragerequirement.references.apm.metricinstrument",
1251
- "source_spec_node_id": "testing.coveragerequirement",
1252
- "source_layer": "testing",
1253
- "destination_spec_node_id": "apm.metricinstrument",
1254
- "destination_layer": "apm",
1255
- "predicate": "references",
1256
- "cardinality": "many-to-many",
1257
- "strength": "medium",
1258
- "required": false
1259
- },
1260
- "testing.coveragerequirement.references.api.operation": {
1261
- "id": "testing.coveragerequirement.references.api.operation",
1262
- "source_spec_node_id": "testing.coveragerequirement",
1263
- "source_layer": "testing",
1264
- "destination_spec_node_id": "api.operation",
1265
- "destination_layer": "api",
1266
- "predicate": "references",
1267
- "cardinality": "many-to-many",
1268
- "strength": "medium",
1269
- "required": false
1270
- },
1271
- "testing.coveragerequirement.references.testing.partitionvalue": {
1272
- "id": "testing.coveragerequirement.references.testing.partitionvalue",
1273
- "source_spec_node_id": "testing.coveragerequirement",
1274
- "source_layer": "testing",
1275
- "destination_spec_node_id": "testing.partitionvalue",
1276
- "destination_layer": "testing",
1277
- "predicate": "references",
1278
- "cardinality": "many-to-many",
1279
- "strength": "medium",
1280
- "required": false
1281
- },
1282
- "testing.coveragerequirement.references.security.securitypolicy": {
1283
- "id": "testing.coveragerequirement.references.security.securitypolicy",
1284
- "source_spec_node_id": "testing.coveragerequirement",
1285
- "source_layer": "testing",
1286
- "destination_spec_node_id": "security.securitypolicy",
1287
- "destination_layer": "security",
1288
- "predicate": "references",
1289
- "cardinality": "many-to-many",
1290
- "strength": "medium",
1291
- "required": false
1292
- },
1293
- "testing.coveragerequirement.references.testing.testcoveragetarget": {
1294
- "id": "testing.coveragerequirement.references.testing.testcoveragetarget",
1295
- "source_spec_node_id": "testing.coveragerequirement",
1296
- "source_layer": "testing",
1297
- "destination_spec_node_id": "testing.testcoveragetarget",
1298
- "destination_layer": "testing",
1299
- "predicate": "references",
1300
- "cardinality": "many-to-many",
1301
- "strength": "medium",
1302
- "required": false
1303
- },
1304
- "testing.coveragerequirement.supports-goals.motivation.goal": {
1305
- "id": "testing.coveragerequirement.supports-goals.motivation.goal",
1306
- "source_spec_node_id": "testing.coveragerequirement",
1307
- "source_layer": "testing",
1308
- "destination_spec_node_id": "motivation.goal",
1309
- "destination_layer": "motivation",
1310
- "predicate": "supports-goals",
1311
- "cardinality": "many-to-many",
1312
- "strength": "medium",
1313
- "required": false
1314
- },
1315
- "testing.coveragesummary.aggregates.testing.coveragerequirement": {
1316
- "id": "testing.coveragesummary.aggregates.testing.coveragerequirement",
1317
- "source_spec_node_id": "testing.coveragesummary",
1318
- "source_layer": "testing",
1319
- "destination_spec_node_id": "testing.coveragerequirement",
1320
- "destination_layer": "testing",
1321
- "predicate": "aggregates",
1322
- "cardinality": "many-to-many",
1323
- "strength": "medium",
1324
- "required": false
1325
- },
1326
- "testing.coveragesummary.aggregates.testing.targetcoveragesummary": {
1327
- "id": "testing.coveragesummary.aggregates.testing.targetcoveragesummary",
1328
- "source_spec_node_id": "testing.coveragesummary",
1329
- "source_layer": "testing",
1330
- "destination_spec_node_id": "testing.targetcoveragesummary",
1331
- "destination_layer": "testing",
1332
- "predicate": "aggregates",
1333
- "cardinality": "many-to-many",
1334
- "strength": "medium",
1335
- "required": false
1336
- },
1337
- "testing.coveragesummary.aggregates.testing.testcasesketch": {
1338
- "id": "testing.coveragesummary.aggregates.testing.testcasesketch",
1339
- "source_spec_node_id": "testing.coveragesummary",
1340
- "source_layer": "testing",
1341
- "destination_spec_node_id": "testing.testcasesketch",
1342
- "destination_layer": "testing",
1343
- "predicate": "aggregates",
1344
- "cardinality": "many-to-many",
1345
- "strength": "medium",
1346
- "required": false
1347
- },
1348
- "testing.coveragesummary.aggregates.testing.testcoveragemodel": {
1349
- "id": "testing.coveragesummary.aggregates.testing.testcoveragemodel",
1350
- "source_spec_node_id": "testing.coveragesummary",
1351
- "source_layer": "testing",
1352
- "destination_spec_node_id": "testing.testcoveragemodel",
1353
- "destination_layer": "testing",
1354
- "predicate": "aggregates",
1355
- "cardinality": "many-to-many",
1356
- "strength": "medium",
1357
- "required": false
1358
- },
1359
- "testing.coveragesummary.depends-on.testing.testcoveragetarget": {
1360
- "id": "testing.coveragesummary.depends-on.testing.testcoveragetarget",
1361
- "source_spec_node_id": "testing.coveragesummary",
1362
- "source_layer": "testing",
1363
- "destination_spec_node_id": "testing.testcoveragetarget",
1364
- "destination_layer": "testing",
1365
- "predicate": "depends-on",
1366
- "cardinality": "many-to-many",
1367
- "strength": "medium",
1368
- "required": false
1369
- },
1370
- "testing.coveragesummary.fulfills-requirements.motivation.requirement": {
1371
- "id": "testing.coveragesummary.fulfills-requirements.motivation.requirement",
1372
- "source_spec_node_id": "testing.coveragesummary",
1373
- "source_layer": "testing",
1374
- "destination_spec_node_id": "motivation.requirement",
1375
- "destination_layer": "motivation",
1376
- "predicate": "fulfills-requirements",
1377
- "cardinality": "many-to-many",
1378
- "strength": "medium",
1379
- "required": false
1380
- },
1381
- "testing.coveragesummary.measures-outcome.motivation.outcome": {
1382
- "id": "testing.coveragesummary.measures-outcome.motivation.outcome",
1383
- "source_spec_node_id": "testing.coveragesummary",
1384
- "source_layer": "testing",
1385
- "destination_spec_node_id": "motivation.outcome",
1386
- "destination_layer": "motivation",
1387
- "predicate": "measures-outcome",
1388
- "cardinality": "many-to-many",
1389
- "strength": "medium",
1390
- "required": false
1391
- },
1392
- "testing.coveragesummary.references.business.businessprocess": {
1393
- "id": "testing.coveragesummary.references.business.businessprocess",
1394
- "source_spec_node_id": "testing.coveragesummary",
1395
- "source_layer": "testing",
1396
- "destination_spec_node_id": "business.businessprocess",
1397
- "destination_layer": "business",
1398
- "predicate": "references",
1399
- "cardinality": "many-to-many",
1400
- "strength": "medium",
1401
- "required": false
1402
- },
1403
- "testing.coveragesummary.references.testing.coverageexclusion": {
1404
- "id": "testing.coveragesummary.references.testing.coverageexclusion",
1405
- "source_spec_node_id": "testing.coveragesummary",
1406
- "source_layer": "testing",
1407
- "destination_spec_node_id": "testing.coverageexclusion",
1408
- "destination_layer": "testing",
1409
- "predicate": "references",
1410
- "cardinality": "many-to-many",
1411
- "strength": "medium",
1412
- "required": false
1413
- },
1414
- "testing.coveragesummary.references.testing.coveragegap": {
1415
- "id": "testing.coveragesummary.references.testing.coveragegap",
1416
- "source_spec_node_id": "testing.coveragesummary",
1417
- "source_layer": "testing",
1418
- "destination_spec_node_id": "testing.coveragegap",
1419
- "destination_layer": "testing",
1420
- "predicate": "references",
1421
- "cardinality": "many-to-many",
1422
- "strength": "medium",
1423
- "required": false
1424
- },
1425
- "testing.coveragesummary.references.testing.testcoveragemodel": {
1426
- "id": "testing.coveragesummary.references.testing.testcoveragemodel",
1427
- "source_spec_node_id": "testing.coveragesummary",
1428
- "source_layer": "testing",
1429
- "destination_spec_node_id": "testing.testcoveragemodel",
1430
- "destination_layer": "testing",
1431
- "predicate": "references",
1432
- "cardinality": "many-to-many",
1433
- "strength": "medium",
1434
- "required": false
1435
- },
1436
- "testing.coveragesummary.serves.testing.testcoveragemodel": {
1437
- "id": "testing.coveragesummary.serves.testing.testcoveragemodel",
1438
- "source_spec_node_id": "testing.coveragesummary",
1439
- "source_layer": "testing",
1440
- "destination_spec_node_id": "testing.testcoveragemodel",
1441
- "destination_layer": "testing",
1442
- "predicate": "serves",
1443
- "cardinality": "many-to-many",
1444
- "strength": "medium",
1445
- "required": false
1446
- },
1447
- "testing.coveragesummary.validates.testing.coveragerequirement": {
1448
- "id": "testing.coveragesummary.validates.testing.coveragerequirement",
1449
- "source_spec_node_id": "testing.coveragesummary",
1450
- "source_layer": "testing",
1451
- "destination_spec_node_id": "testing.coveragerequirement",
1452
- "destination_layer": "testing",
1453
- "predicate": "validates",
1454
- "cardinality": "many-to-many",
1455
- "strength": "medium",
1456
- "required": false
1457
- },
1458
- "testing.environmentfactor.composes.testing.contextvariation": {
1459
- "id": "testing.environmentfactor.composes.testing.contextvariation",
1460
- "source_spec_node_id": "testing.environmentfactor",
1461
- "source_layer": "testing",
1462
- "destination_spec_node_id": "testing.contextvariation",
1463
- "destination_layer": "testing",
1464
- "predicate": "composes",
1465
- "cardinality": "many-to-many",
1466
- "strength": "medium",
1467
- "required": false
1468
- },
1469
- "testing.environmentfactor.composes.testing.inputspacepartition": {
1470
- "id": "testing.environmentfactor.composes.testing.inputspacepartition",
1471
- "source_spec_node_id": "testing.environmentfactor",
1472
- "source_layer": "testing",
1473
- "destination_spec_node_id": "testing.inputspacepartition",
1474
- "destination_layer": "testing",
1475
- "predicate": "composes",
1476
- "cardinality": "many-to-many",
1477
- "strength": "medium",
1478
- "required": false
1479
- },
1480
- "testing.environmentfactor.flows-to.testing.coveragesummary": {
1481
- "id": "testing.environmentfactor.flows-to.testing.coveragesummary",
1482
- "source_spec_node_id": "testing.environmentfactor",
1483
- "source_layer": "testing",
1484
- "destination_spec_node_id": "testing.coveragesummary",
1485
- "destination_layer": "testing",
1486
- "predicate": "flows-to",
1487
- "cardinality": "many-to-many",
1488
- "strength": "medium",
1489
- "required": false
1490
- },
1491
- "testing.environmentfactor.references.apm.instrumentationconfig": {
1492
- "id": "testing.environmentfactor.references.apm.instrumentationconfig",
1493
- "source_spec_node_id": "testing.environmentfactor",
1494
- "source_layer": "testing",
1495
- "destination_spec_node_id": "apm.instrumentationconfig",
1496
- "destination_layer": "apm",
1497
- "predicate": "references",
1498
- "cardinality": "many-to-many",
1499
- "strength": "medium",
1500
- "required": false
1501
- },
1502
- "testing.environmentfactor.references.technology.node": {
1503
- "id": "testing.environmentfactor.references.technology.node",
1504
- "source_spec_node_id": "testing.environmentfactor",
1505
- "source_layer": "testing",
1506
- "destination_spec_node_id": "technology.node",
1507
- "destination_layer": "technology",
1508
- "predicate": "references",
1509
- "cardinality": "many-to-many",
1510
- "strength": "medium",
1511
- "required": false
1512
- },
1513
- "testing.environmentfactor.references.testing.partitionvalue": {
1514
- "id": "testing.environmentfactor.references.testing.partitionvalue",
1515
- "source_spec_node_id": "testing.environmentfactor",
1516
- "source_layer": "testing",
1517
- "destination_spec_node_id": "testing.partitionvalue",
1518
- "destination_layer": "testing",
1519
- "predicate": "references",
1520
- "cardinality": "many-to-many",
1521
- "strength": "medium",
1522
- "required": false
1523
- },
1524
- "testing.environmentfactor.references.security.securitypolicy": {
1525
- "id": "testing.environmentfactor.references.security.securitypolicy",
1526
- "source_spec_node_id": "testing.environmentfactor",
1527
- "source_layer": "testing",
1528
- "destination_spec_node_id": "security.securitypolicy",
1529
- "destination_layer": "security",
1530
- "predicate": "references",
1531
- "cardinality": "many-to-many",
1532
- "strength": "medium",
1533
- "required": false
1534
- },
1535
- "testing.environmentfactor.references.technology.systemsoftware": {
1536
- "id": "testing.environmentfactor.references.technology.systemsoftware",
1537
- "source_spec_node_id": "testing.environmentfactor",
1538
- "source_layer": "testing",
1539
- "destination_spec_node_id": "technology.systemsoftware",
1540
- "destination_layer": "technology",
1541
- "predicate": "references",
1542
- "cardinality": "many-to-many",
1543
- "strength": "medium",
1544
- "required": false
1545
- },
1546
- "testing.environmentfactor.serves.testing.coveragerequirement": {
1547
- "id": "testing.environmentfactor.serves.testing.coveragerequirement",
1548
- "source_spec_node_id": "testing.environmentfactor",
1549
- "source_layer": "testing",
1550
- "destination_spec_node_id": "testing.coveragerequirement",
1551
- "destination_layer": "testing",
1552
- "predicate": "serves",
1553
- "cardinality": "many-to-many",
1554
- "strength": "medium",
1555
- "required": false
1556
- },
1557
- "testing.environmentfactor.serves.testing.testcasesketch": {
1558
- "id": "testing.environmentfactor.serves.testing.testcasesketch",
1559
- "source_spec_node_id": "testing.environmentfactor",
1560
- "source_layer": "testing",
1561
- "destination_spec_node_id": "testing.testcasesketch",
1562
- "destination_layer": "testing",
1563
- "predicate": "serves",
1564
- "cardinality": "many-to-many",
1565
- "strength": "medium",
1566
- "required": false
1567
- },
1568
- "testing.environmentfactor.serves.testing.testcoveragemodel": {
1569
- "id": "testing.environmentfactor.serves.testing.testcoveragemodel",
1570
- "source_spec_node_id": "testing.environmentfactor",
1571
- "source_layer": "testing",
1572
- "destination_spec_node_id": "testing.testcoveragemodel",
1573
- "destination_layer": "testing",
1574
- "predicate": "serves",
1575
- "cardinality": "many-to-many",
1576
- "strength": "medium",
1577
- "required": false
1578
- },
1579
- "testing.inputpartitionselection.aggregates.testing.contextvariation": {
1580
- "id": "testing.inputpartitionselection.aggregates.testing.contextvariation",
1581
- "source_spec_node_id": "testing.inputpartitionselection",
1582
- "source_layer": "testing",
1583
- "destination_spec_node_id": "testing.contextvariation",
1584
- "destination_layer": "testing",
1585
- "predicate": "aggregates",
1586
- "cardinality": "many-to-many",
1587
- "strength": "medium",
1588
- "required": false
1589
- },
1590
- "testing.inputpartitionselection.aggregates.testing.partitionvalue": {
1591
- "id": "testing.inputpartitionselection.aggregates.testing.partitionvalue",
1592
- "source_spec_node_id": "testing.inputpartitionselection",
1593
- "source_layer": "testing",
1594
- "destination_spec_node_id": "testing.partitionvalue",
1595
- "destination_layer": "testing",
1596
- "predicate": "aggregates",
1597
- "cardinality": "many-to-many",
1598
- "strength": "medium",
1599
- "required": false
1600
- },
1601
- "testing.inputselection.references.testing.coveragerequirement": {
1602
- "id": "testing.inputselection.references.testing.coveragerequirement",
1603
- "source_spec_node_id": "testing.inputselection",
1604
- "source_layer": "testing",
1605
- "destination_spec_node_id": "testing.coveragerequirement",
1606
- "destination_layer": "testing",
1607
- "predicate": "references",
1608
- "cardinality": "many-to-many",
1609
- "strength": "medium",
1610
- "required": false
1611
- },
1612
- "testing.inputselection.references.testing.partitionvalue": {
1613
- "id": "testing.inputselection.references.testing.partitionvalue",
1614
- "source_spec_node_id": "testing.inputselection",
1615
- "source_layer": "testing",
1616
- "destination_spec_node_id": "testing.partitionvalue",
1617
- "destination_layer": "testing",
1618
- "predicate": "references",
1619
- "cardinality": "many-to-many",
1620
- "strength": "medium",
1621
- "required": false
1622
- },
1623
- "testing.inputselection.references.testing.testcoveragetarget": {
1624
- "id": "testing.inputselection.references.testing.testcoveragetarget",
1625
- "source_spec_node_id": "testing.inputselection",
1626
- "source_layer": "testing",
1627
- "destination_spec_node_id": "testing.testcoveragetarget",
1628
- "destination_layer": "testing",
1629
- "predicate": "references",
1630
- "cardinality": "many-to-many",
1631
- "strength": "medium",
1632
- "required": false
1633
- },
1634
- "testing.inputspacepartition.composes.partitionvalue": {
1635
- "id": "testing.inputspacepartition.composes.partitionvalue",
1636
- "source_spec_node_id": "testing.inputspacepartition",
1637
- "source_layer": "testing",
1638
- "destination_spec_node_id": "testing.partitionvalue",
1639
- "destination_layer": "testing",
1640
- "predicate": "composes",
1641
- "cardinality": "one-to-many",
1642
- "strength": "high",
1643
- "required": false
1644
- },
1645
- "testing.inputspacepartition.depends-on.inputspacepartition": {
1646
- "id": "testing.inputspacepartition.depends-on.inputspacepartition",
1647
- "source_spec_node_id": "testing.inputspacepartition",
1648
- "source_layer": "testing",
1649
- "destination_spec_node_id": "testing.inputspacepartition",
1650
- "destination_layer": "testing",
1651
- "predicate": "depends-on",
1652
- "cardinality": "many-to-many",
1653
- "strength": "medium",
1654
- "required": false
1655
- },
1656
- "testing.inputspacepartition.references.data-store.collection": {
1657
- "id": "testing.inputspacepartition.references.data-store.collection",
1658
- "source_spec_node_id": "testing.inputspacepartition",
1659
- "source_layer": "testing",
1660
- "destination_spec_node_id": "data-store.collection",
1661
- "destination_layer": "data-store",
1662
- "predicate": "references",
1663
- "cardinality": "many-to-many",
1664
- "strength": "medium",
1665
- "required": false
1666
- },
1667
- "testing.inputspacepartition.references.data-model.jsonschema": {
1668
- "id": "testing.inputspacepartition.references.data-model.jsonschema",
1669
- "source_spec_node_id": "testing.inputspacepartition",
1670
- "source_layer": "testing",
1671
- "destination_spec_node_id": "data-model.jsonschema",
1672
- "destination_layer": "data-model",
1673
- "predicate": "references",
1674
- "cardinality": "many-to-many",
1675
- "strength": "medium",
1676
- "required": false
1677
- },
1678
- "testing.inputspacepartition.references.api.parameter": {
1679
- "id": "testing.inputspacepartition.references.api.parameter",
1680
- "source_spec_node_id": "testing.inputspacepartition",
1681
- "source_layer": "testing",
1682
- "destination_spec_node_id": "api.parameter",
1683
- "destination_layer": "api",
1684
- "predicate": "references",
1685
- "cardinality": "many-to-many",
1686
- "strength": "medium",
1687
- "required": false
1688
- },
1689
- "testing.inputspacepartition.references.data-model.schemaproperty": {
1690
- "id": "testing.inputspacepartition.references.data-model.schemaproperty",
1691
- "source_spec_node_id": "testing.inputspacepartition",
1692
- "source_layer": "testing",
1693
- "destination_spec_node_id": "data-model.schemaproperty",
1694
- "destination_layer": "data-model",
1695
- "predicate": "references",
1696
- "cardinality": "many-to-many",
1697
- "strength": "medium",
1698
- "required": false
1699
- },
1700
- "testing.inputspacepartition.serves.testing.testcoveragetarget": {
1701
- "id": "testing.inputspacepartition.serves.testing.testcoveragetarget",
1702
- "source_spec_node_id": "testing.inputspacepartition",
1703
- "source_layer": "testing",
1704
- "destination_spec_node_id": "testing.testcoveragetarget",
1705
- "destination_layer": "testing",
1706
- "predicate": "serves",
1707
- "cardinality": "many-to-many",
1708
- "strength": "medium",
1709
- "required": false
1710
- },
1711
- "testing.outcomecategory.aggregates.testing.testcasesketch": {
1712
- "id": "testing.outcomecategory.aggregates.testing.testcasesketch",
1713
- "source_spec_node_id": "testing.outcomecategory",
1714
- "source_layer": "testing",
1715
- "destination_spec_node_id": "testing.testcasesketch",
1716
- "destination_layer": "testing",
1717
- "predicate": "aggregates",
1718
- "cardinality": "many-to-many",
1719
- "strength": "medium",
1720
- "required": false
1721
- },
1722
- "testing.outcomecategory.constrained-by.testing.environmentfactor": {
1723
- "id": "testing.outcomecategory.constrained-by.testing.environmentfactor",
1724
- "source_spec_node_id": "testing.outcomecategory",
1725
- "source_layer": "testing",
1726
- "destination_spec_node_id": "testing.environmentfactor",
1727
- "destination_layer": "testing",
1728
- "predicate": "constrained-by",
1729
- "cardinality": "many-to-many",
1730
- "strength": "medium",
1731
- "required": false
1732
- },
1733
- "testing.outcomecategory.flows-to.testing.coveragesummary": {
1734
- "id": "testing.outcomecategory.flows-to.testing.coveragesummary",
1735
- "source_spec_node_id": "testing.outcomecategory",
1736
- "source_layer": "testing",
1737
- "destination_spec_node_id": "testing.coveragesummary",
1738
- "destination_layer": "testing",
1739
- "predicate": "flows-to",
1740
- "cardinality": "many-to-many",
1741
- "strength": "medium",
1742
- "required": false
1743
- },
1744
- "testing.outcomecategory.references.testing.targetinputfield": {
1745
- "id": "testing.outcomecategory.references.testing.targetinputfield",
1746
- "source_spec_node_id": "testing.outcomecategory",
1747
- "source_layer": "testing",
1748
- "destination_spec_node_id": "testing.targetinputfield",
1749
- "destination_layer": "testing",
1750
- "predicate": "references",
1751
- "cardinality": "many-to-many",
1752
- "strength": "medium",
1753
- "required": false
1754
- },
1755
- "testing.outcomecategory.serves.testing.coveragerequirement": {
1756
- "id": "testing.outcomecategory.serves.testing.coveragerequirement",
1757
- "source_spec_node_id": "testing.outcomecategory",
1758
- "source_layer": "testing",
1759
- "destination_spec_node_id": "testing.coveragerequirement",
1760
- "destination_layer": "testing",
1761
- "predicate": "serves",
1762
- "cardinality": "many-to-many",
1763
- "strength": "medium",
1764
- "required": false
1765
- },
1766
- "testing.partitiondependency.constrained-by.testing.inputpartitionselection": {
1767
- "id": "testing.partitiondependency.constrained-by.testing.inputpartitionselection",
1768
- "source_spec_node_id": "testing.partitiondependency",
1769
- "source_layer": "testing",
1770
- "destination_spec_node_id": "testing.inputpartitionselection",
1771
- "destination_layer": "testing",
1772
- "predicate": "constrained-by",
1773
- "cardinality": "many-to-many",
1774
- "strength": "medium",
1775
- "required": false
1776
- },
1777
- "testing.partitiondependency.references.testing.inputspacepartition": {
1778
- "id": "testing.partitiondependency.references.testing.inputspacepartition",
1779
- "source_spec_node_id": "testing.partitiondependency",
1780
- "source_layer": "testing",
1781
- "destination_spec_node_id": "testing.inputspacepartition",
1782
- "destination_layer": "testing",
1783
- "predicate": "references",
1784
- "cardinality": "many-to-many",
1785
- "strength": "medium",
1786
- "required": false
1787
- },
1788
- "testing.partitiondependency.triggers.testing.coveragerequirement": {
1789
- "id": "testing.partitiondependency.triggers.testing.coveragerequirement",
1790
- "source_spec_node_id": "testing.partitiondependency",
1791
- "source_layer": "testing",
1792
- "destination_spec_node_id": "testing.coveragerequirement",
1793
- "destination_layer": "testing",
1794
- "predicate": "triggers",
1795
- "cardinality": "many-to-many",
1796
- "strength": "medium",
1797
- "required": false
1798
- },
1799
- "testing.partitiondependency.triggers.testing.partitionvalue": {
1800
- "id": "testing.partitiondependency.triggers.testing.partitionvalue",
1801
- "source_spec_node_id": "testing.partitiondependency",
1802
- "source_layer": "testing",
1803
- "destination_spec_node_id": "testing.partitionvalue",
1804
- "destination_layer": "testing",
1805
- "predicate": "triggers",
1806
- "cardinality": "many-to-many",
1807
- "strength": "medium",
1808
- "required": false
1809
- },
1810
- "testing.partitionvalue.composes.testing.inputspacepartition": {
1811
- "id": "testing.partitionvalue.composes.testing.inputspacepartition",
1812
- "source_spec_node_id": "testing.partitionvalue",
1813
- "source_layer": "testing",
1814
- "destination_spec_node_id": "testing.inputspacepartition",
1815
- "destination_layer": "testing",
1816
- "predicate": "composes",
1817
- "cardinality": "many-to-many",
1818
- "strength": "medium",
1819
- "required": false
1820
- },
1821
- "testing.partitionvalue.constrained-by.testing.coveragerequirement": {
1822
- "id": "testing.partitionvalue.constrained-by.testing.coveragerequirement",
1823
- "source_spec_node_id": "testing.partitionvalue",
1824
- "source_layer": "testing",
1825
- "destination_spec_node_id": "testing.coveragerequirement",
1826
- "destination_layer": "testing",
1827
- "predicate": "constrained-by",
1828
- "cardinality": "many-to-many",
1829
- "strength": "medium",
1830
- "required": false
1831
- },
1832
- "testing.partitionvalue.depends-on.testing.environmentfactor": {
1833
- "id": "testing.partitionvalue.depends-on.testing.environmentfactor",
1834
- "source_spec_node_id": "testing.partitionvalue",
1835
- "source_layer": "testing",
1836
- "destination_spec_node_id": "testing.environmentfactor",
1837
- "destination_layer": "testing",
1838
- "predicate": "depends-on",
1839
- "cardinality": "many-to-many",
1840
- "strength": "medium",
1841
- "required": false
1842
- },
1843
- "testing.partitionvalue.flows-to.testing.outcomecategory": {
1844
- "id": "testing.partitionvalue.flows-to.testing.outcomecategory",
1845
- "source_spec_node_id": "testing.partitionvalue",
1846
- "source_layer": "testing",
1847
- "destination_spec_node_id": "testing.outcomecategory",
1848
- "destination_layer": "testing",
1849
- "predicate": "flows-to",
1850
- "cardinality": "many-to-many",
1851
- "strength": "medium",
1852
- "required": false
1853
- },
1854
- "testing.partitionvalue.references.testing.coverageexclusion": {
1855
- "id": "testing.partitionvalue.references.testing.coverageexclusion",
1856
- "source_spec_node_id": "testing.partitionvalue",
1857
- "source_layer": "testing",
1858
- "destination_spec_node_id": "testing.coverageexclusion",
1859
- "destination_layer": "testing",
1860
- "predicate": "references",
1861
- "cardinality": "many-to-many",
1862
- "strength": "medium",
1863
- "required": false
1864
- },
1865
- "testing.partitionvalue.triggers.testing.coveragegap": {
1866
- "id": "testing.partitionvalue.triggers.testing.coveragegap",
1867
- "source_spec_node_id": "testing.partitionvalue",
1868
- "source_layer": "testing",
1869
- "destination_spec_node_id": "testing.coveragegap",
1870
- "destination_layer": "testing",
1871
- "predicate": "triggers",
1872
- "cardinality": "many-to-many",
1873
- "strength": "medium",
1874
- "required": false
1875
- },
1876
- "testing.targetcoveragesummary.aggregates.testing.testcasesketch": {
1877
- "id": "testing.targetcoveragesummary.aggregates.testing.testcasesketch",
1878
- "source_spec_node_id": "testing.targetcoveragesummary",
1879
- "source_layer": "testing",
1880
- "destination_spec_node_id": "testing.testcasesketch",
1881
- "destination_layer": "testing",
1882
- "predicate": "aggregates",
1883
- "cardinality": "many-to-many",
1884
- "strength": "medium",
1885
- "required": false
1886
- },
1887
- "testing.targetcoveragesummary.references.testing.coverageexclusion": {
1888
- "id": "testing.targetcoveragesummary.references.testing.coverageexclusion",
1889
- "source_spec_node_id": "testing.targetcoveragesummary",
1890
- "source_layer": "testing",
1891
- "destination_spec_node_id": "testing.coverageexclusion",
1892
- "destination_layer": "testing",
1893
- "predicate": "references",
1894
- "cardinality": "many-to-many",
1895
- "strength": "medium",
1896
- "required": false
1897
- },
1898
- "testing.targetcoveragesummary.references.testing.coveragegap": {
1899
- "id": "testing.targetcoveragesummary.references.testing.coveragegap",
1900
- "source_spec_node_id": "testing.targetcoveragesummary",
1901
- "source_layer": "testing",
1902
- "destination_spec_node_id": "testing.coveragegap",
1903
- "destination_layer": "testing",
1904
- "predicate": "references",
1905
- "cardinality": "many-to-many",
1906
- "strength": "medium",
1907
- "required": false
1908
- },
1909
- "testing.targetcoveragesummary.validates.testing.coveragerequirement": {
1910
- "id": "testing.targetcoveragesummary.validates.testing.coveragerequirement",
1911
- "source_spec_node_id": "testing.targetcoveragesummary",
1912
- "source_layer": "testing",
1913
- "destination_spec_node_id": "testing.coveragerequirement",
1914
- "destination_layer": "testing",
1915
- "predicate": "validates",
1916
- "cardinality": "many-to-many",
1917
- "strength": "medium",
1918
- "required": false
1919
- },
1920
- "testing.targetcoveragesummary.validates.testing.testcoveragetarget": {
1921
- "id": "testing.targetcoveragesummary.validates.testing.testcoveragetarget",
1922
- "source_spec_node_id": "testing.targetcoveragesummary",
1923
- "source_layer": "testing",
1924
- "destination_spec_node_id": "testing.testcoveragetarget",
1925
- "destination_layer": "testing",
1926
- "predicate": "validates",
1927
- "cardinality": "many-to-many",
1928
- "strength": "medium",
1929
- "required": false
1930
- },
1931
- "testing.targetinputfield.aggregates.testing.partitionvalue": {
1932
- "id": "testing.targetinputfield.aggregates.testing.partitionvalue",
1933
- "source_spec_node_id": "testing.targetinputfield",
1934
- "source_layer": "testing",
1935
- "destination_spec_node_id": "testing.partitionvalue",
1936
- "destination_layer": "testing",
1937
- "predicate": "aggregates",
1938
- "cardinality": "many-to-many",
1939
- "strength": "medium",
1940
- "required": false
1941
- },
1942
- "testing.targetinputfield.constrained-by.testing.coveragerequirement": {
1943
- "id": "testing.targetinputfield.constrained-by.testing.coveragerequirement",
1944
- "source_spec_node_id": "testing.targetinputfield",
1945
- "source_layer": "testing",
1946
- "destination_spec_node_id": "testing.coveragerequirement",
1947
- "destination_layer": "testing",
1948
- "predicate": "constrained-by",
1949
- "cardinality": "many-to-many",
1950
- "strength": "medium",
1951
- "required": false
1952
- },
1953
- "testing.targetinputfield.depends-on.testing.contextvariation": {
1954
- "id": "testing.targetinputfield.depends-on.testing.contextvariation",
1955
- "source_spec_node_id": "testing.targetinputfield",
1956
- "source_layer": "testing",
1957
- "destination_spec_node_id": "testing.contextvariation",
1958
- "destination_layer": "testing",
1959
- "predicate": "depends-on",
1960
- "cardinality": "many-to-many",
1961
- "strength": "medium",
1962
- "required": false
1963
- },
1964
- "testing.targetinputfield.flows-to.testing.inputpartitionselection": {
1965
- "id": "testing.targetinputfield.flows-to.testing.inputpartitionselection",
1966
- "source_spec_node_id": "testing.targetinputfield",
1967
- "source_layer": "testing",
1968
- "destination_spec_node_id": "testing.inputpartitionselection",
1969
- "destination_layer": "testing",
1970
- "predicate": "flows-to",
1971
- "cardinality": "many-to-many",
1972
- "strength": "medium",
1973
- "required": false
1974
- },
1975
- "testing.targetinputfield.maps-to.ux.actioncomponent": {
1976
- "id": "testing.targetinputfield.maps-to.ux.actioncomponent",
1977
- "source_spec_node_id": "testing.targetinputfield",
1978
- "source_layer": "testing",
1979
- "destination_spec_node_id": "ux.actioncomponent",
1980
- "destination_layer": "ux",
1981
- "predicate": "maps-to",
1982
- "cardinality": "many-to-many",
1983
- "strength": "medium",
1984
- "required": false
1985
- },
1986
- "testing.targetinputfield.references.testing.inputspacepartition": {
1987
- "id": "testing.targetinputfield.references.testing.inputspacepartition",
1988
- "source_spec_node_id": "testing.targetinputfield",
1989
- "source_layer": "testing",
1990
- "destination_spec_node_id": "testing.inputspacepartition",
1991
- "destination_layer": "testing",
1992
- "predicate": "references",
1993
- "cardinality": "many-to-many",
1994
- "strength": "medium",
1995
- "required": false
1996
- },
1997
- "testing.targetinputfield.references.api.parameter": {
1998
- "id": "testing.targetinputfield.references.api.parameter",
1999
- "source_spec_node_id": "testing.targetinputfield",
2000
- "source_layer": "testing",
2001
- "destination_spec_node_id": "api.parameter",
2002
- "destination_layer": "api",
2003
- "predicate": "references",
2004
- "cardinality": "many-to-many",
2005
- "strength": "medium",
2006
- "required": false
2007
- },
2008
- "testing.targetinputfield.references.data-model.schemaproperty": {
2009
- "id": "testing.targetinputfield.references.data-model.schemaproperty",
2010
- "source_spec_node_id": "testing.targetinputfield",
2011
- "source_layer": "testing",
2012
- "destination_spec_node_id": "data-model.schemaproperty",
2013
- "destination_layer": "data-model",
2014
- "predicate": "references",
2015
- "cardinality": "many-to-many",
2016
- "strength": "medium",
2017
- "required": false
2018
- },
2019
- "testing.targetinputfield.references.testing.testcoveragetarget": {
2020
- "id": "testing.targetinputfield.references.testing.testcoveragetarget",
2021
- "source_spec_node_id": "testing.targetinputfield",
2022
- "source_layer": "testing",
2023
- "destination_spec_node_id": "testing.testcoveragetarget",
2024
- "destination_layer": "testing",
2025
- "predicate": "references",
2026
- "cardinality": "many-to-many",
2027
- "strength": "medium",
2028
- "required": false
1447
+ "required": false,
1448
+ "description": "The field under test is the schema property."
2029
1449
  },
2030
1450
  "testing.testcasesketch.accesses.data-store.collection": {
2031
- "id": "testing.testcasesketch.accesses.data-store.collection",
2032
- "source_spec_node_id": "testing.testcasesketch",
2033
- "source_layer": "testing",
2034
- "destination_spec_node_id": "data-store.collection",
2035
- "destination_layer": "data-store",
2036
- "predicate": "accesses",
2037
- "cardinality": "many-to-many",
2038
- "strength": "medium",
2039
- "required": false
2040
- },
2041
- "testing.testcasesketch.accesses.testing.inputpartitionselection": {
2042
- "id": "testing.testcasesketch.accesses.testing.inputpartitionselection",
2043
- "source_spec_node_id": "testing.testcasesketch",
2044
- "source_layer": "testing",
2045
- "destination_spec_node_id": "testing.inputpartitionselection",
2046
- "destination_layer": "testing",
2047
- "predicate": "accesses",
2048
- "cardinality": "many-to-many",
2049
- "strength": "medium",
2050
- "required": false
2051
- },
2052
- "testing.testcasesketch.accesses.testing.inputselection": {
2053
- "id": "testing.testcasesketch.accesses.testing.inputselection",
2054
- "source_spec_node_id": "testing.testcasesketch",
2055
- "source_layer": "testing",
2056
- "destination_spec_node_id": "testing.inputselection",
2057
- "destination_layer": "testing",
2058
- "predicate": "accesses",
2059
- "cardinality": "many-to-many",
2060
- "strength": "medium",
2061
- "required": false
2062
- },
2063
- "testing.testcasesketch.accesses.api.requestbody": {
2064
- "id": "testing.testcasesketch.accesses.api.requestbody",
2065
- "source_spec_node_id": "testing.testcasesketch",
2066
- "source_layer": "testing",
2067
- "destination_spec_node_id": "api.requestbody",
2068
- "destination_layer": "api",
2069
- "predicate": "accesses",
2070
- "cardinality": "many-to-many",
2071
- "strength": "medium",
2072
- "required": false
2073
- },
2074
- "testing.testcasesketch.accesses.data-store.view": {
2075
- "id": "testing.testcasesketch.accesses.data-store.view",
2076
- "source_spec_node_id": "testing.testcasesketch",
2077
- "source_layer": "testing",
2078
- "destination_spec_node_id": "data-store.view",
2079
- "destination_layer": "data-store",
2080
- "predicate": "accesses",
2081
- "cardinality": "many-to-many",
2082
- "strength": "medium",
2083
- "required": false
2084
- },
2085
- "testing.testcasesketch.composes.testing.inputselection": {
2086
- "id": "testing.testcasesketch.composes.testing.inputselection",
2087
- "source_spec_node_id": "testing.testcasesketch",
2088
- "source_layer": "testing",
2089
- "destination_spec_node_id": "testing.inputselection",
2090
- "destination_layer": "testing",
2091
- "predicate": "composes",
2092
- "cardinality": "many-to-many",
2093
- "strength": "medium",
2094
- "required": false
2095
- },
2096
- "testing.testcasesketch.constrained-by.motivation.constraint": {
2097
- "id": "testing.testcasesketch.constrained-by.motivation.constraint",
2098
- "source_spec_node_id": "testing.testcasesketch",
2099
- "source_layer": "testing",
2100
- "destination_spec_node_id": "motivation.constraint",
2101
- "destination_layer": "motivation",
2102
- "predicate": "constrained-by",
2103
- "cardinality": "many-to-many",
2104
- "strength": "medium",
2105
- "required": false
2106
- },
2107
- "testing.testcasesketch.depends-on.testing.contextvariation": {
2108
- "id": "testing.testcasesketch.depends-on.testing.contextvariation",
1451
+ "id": "testing.testcasesketch.accesses.data-store.collection",
2109
1452
  "source_spec_node_id": "testing.testcasesketch",
2110
1453
  "source_layer": "testing",
2111
- "destination_spec_node_id": "testing.contextvariation",
2112
- "destination_layer": "testing",
2113
- "predicate": "depends-on",
1454
+ "destination_spec_node_id": "data-store.collection",
1455
+ "destination_layer": "data-store",
1456
+ "predicate": "accesses",
2114
1457
  "cardinality": "many-to-many",
2115
1458
  "strength": "medium",
2116
- "required": false
1459
+ "required": false,
1460
+ "description": "The test seeds or reads fixture data in the collection."
2117
1461
  },
2118
- "testing.testcasesketch.depends-on.testing.inputspacepartition": {
2119
- "id": "testing.testcasesketch.depends-on.testing.inputspacepartition",
1462
+ "testing.testcasesketch.accesses.data-store.view": {
1463
+ "id": "testing.testcasesketch.accesses.data-store.view",
2120
1464
  "source_spec_node_id": "testing.testcasesketch",
2121
1465
  "source_layer": "testing",
2122
- "destination_spec_node_id": "testing.inputspacepartition",
2123
- "destination_layer": "testing",
2124
- "predicate": "depends-on",
1466
+ "destination_spec_node_id": "data-store.view",
1467
+ "destination_layer": "data-store",
1468
+ "predicate": "accesses",
2125
1469
  "cardinality": "many-to-many",
2126
1470
  "strength": "medium",
2127
- "required": false
1471
+ "required": false,
1472
+ "description": "The test reads fixture data through the view."
2128
1473
  },
2129
- "testing.testcasesketch.depends-on.testing.outcomecategory": {
2130
- "id": "testing.testcasesketch.depends-on.testing.outcomecategory",
1474
+ "testing.testcasesketch.composes.testing.inputselection": {
1475
+ "id": "testing.testcasesketch.composes.testing.inputselection",
2131
1476
  "source_spec_node_id": "testing.testcasesketch",
2132
1477
  "source_layer": "testing",
2133
- "destination_spec_node_id": "testing.outcomecategory",
1478
+ "destination_spec_node_id": "testing.inputselection",
2134
1479
  "destination_layer": "testing",
2135
- "predicate": "depends-on",
1480
+ "predicate": "composes",
2136
1481
  "cardinality": "many-to-many",
2137
1482
  "strength": "medium",
2138
- "required": false
1483
+ "required": false,
1484
+ "description": "The input selection binds one field of this test case and exists only within it."
2139
1485
  },
2140
1486
  "testing.testcasesketch.depends-on.testing.testcasesketch": {
2141
1487
  "id": "testing.testcasesketch.depends-on.testing.testcasesketch",
@@ -2146,73 +1492,32 @@
2146
1492
  "predicate": "depends-on",
2147
1493
  "cardinality": "many-to-many",
2148
1494
  "strength": "medium",
2149
- "required": false
2150
- },
2151
- "testing.testcasesketch.fulfills-requirements.motivation.requirement": {
2152
- "id": "testing.testcasesketch.fulfills-requirements.motivation.requirement",
2153
- "source_spec_node_id": "testing.testcasesketch",
2154
- "source_layer": "testing",
2155
- "destination_spec_node_id": "motivation.requirement",
2156
- "destination_layer": "motivation",
2157
- "predicate": "fulfills-requirements",
2158
- "cardinality": "many-to-many",
2159
- "strength": "high",
2160
- "required": false
2161
- },
2162
- "testing.testcasesketch.references.testing.coveragerequirement": {
2163
- "id": "testing.testcasesketch.references.testing.coveragerequirement",
2164
- "source_spec_node_id": "testing.testcasesketch",
2165
- "source_layer": "testing",
2166
- "destination_spec_node_id": "testing.coveragerequirement",
2167
- "destination_layer": "testing",
2168
- "predicate": "references",
2169
- "cardinality": "many-to-many",
2170
- "strength": "medium",
2171
- "required": false
2172
- },
2173
- "testing.testcasesketch.references.apm.logconfiguration": {
2174
- "id": "testing.testcasesketch.references.apm.logconfiguration",
2175
- "source_spec_node_id": "testing.testcasesketch",
2176
- "source_layer": "testing",
2177
- "destination_spec_node_id": "apm.logconfiguration",
2178
- "destination_layer": "apm",
2179
- "predicate": "references",
2180
- "cardinality": "many-to-many",
2181
- "strength": "medium",
2182
- "required": false
1495
+ "required": false,
1496
+ "description": "The test case needs the other one run first, such as a setup case that creates its data."
2183
1497
  },
2184
- "testing.testcasesketch.references.testing.partitionvalue": {
2185
- "id": "testing.testcasesketch.references.testing.partitionvalue",
1498
+ "testing.testcasesketch.references.testing.contextvariation": {
1499
+ "id": "testing.testcasesketch.references.testing.contextvariation",
2186
1500
  "source_spec_node_id": "testing.testcasesketch",
2187
1501
  "source_layer": "testing",
2188
- "destination_spec_node_id": "testing.partitionvalue",
1502
+ "destination_spec_node_id": "testing.contextvariation",
2189
1503
  "destination_layer": "testing",
2190
1504
  "predicate": "references",
2191
1505
  "cardinality": "many-to-many",
2192
1506
  "strength": "medium",
2193
- "required": false
2194
- },
2195
- "testing.testcasesketch.references.apm.span": {
2196
- "id": "testing.testcasesketch.references.apm.span",
2197
- "source_spec_node_id": "testing.testcasesketch",
2198
- "source_layer": "testing",
2199
- "destination_spec_node_id": "apm.span",
2200
- "destination_layer": "apm",
2201
- "predicate": "references",
2202
- "cardinality": "many-to-many",
2203
- "strength": "medium",
2204
- "required": false
1507
+ "required": false,
1508
+ "description": "The test case runs under the context variation."
2205
1509
  },
2206
- "testing.testcasesketch.references.testing.testcoveragetarget": {
2207
- "id": "testing.testcasesketch.references.testing.testcoveragetarget",
1510
+ "testing.testcasesketch.references.testing.outcomecategory": {
1511
+ "id": "testing.testcasesketch.references.testing.outcomecategory",
2208
1512
  "source_spec_node_id": "testing.testcasesketch",
2209
1513
  "source_layer": "testing",
2210
- "destination_spec_node_id": "testing.testcoveragetarget",
1514
+ "destination_spec_node_id": "testing.outcomecategory",
2211
1515
  "destination_layer": "testing",
2212
1516
  "predicate": "references",
2213
1517
  "cardinality": "many-to-many",
2214
1518
  "strength": "medium",
2215
- "required": false
1519
+ "required": false,
1520
+ "description": "The test case expects the outcome category."
2216
1521
  },
2217
1522
  "testing.testcasesketch.requires.technology.systemsoftware": {
2218
1523
  "id": "testing.testcasesketch.requires.technology.systemsoftware",
@@ -2223,18 +1528,32 @@
2223
1528
  "predicate": "requires",
2224
1529
  "cardinality": "many-to-many",
2225
1530
  "strength": "medium",
2226
- "required": false
1531
+ "required": false,
1532
+ "description": "The test case needs the software to run, such as a browser driver or test database."
2227
1533
  },
2228
- "testing.testcasesketch.supports-goals.motivation.goal": {
2229
- "id": "testing.testcasesketch.supports-goals.motivation.goal",
1534
+ "testing.testcasesketch.satisfies.motivation.requirement": {
1535
+ "id": "testing.testcasesketch.satisfies.motivation.requirement",
2230
1536
  "source_spec_node_id": "testing.testcasesketch",
2231
1537
  "source_layer": "testing",
2232
- "destination_spec_node_id": "motivation.goal",
1538
+ "destination_spec_node_id": "motivation.requirement",
2233
1539
  "destination_layer": "motivation",
2234
- "predicate": "supports-goals",
1540
+ "predicate": "satisfies",
2235
1541
  "cardinality": "many-to-many",
2236
1542
  "strength": "high",
2237
- "required": false
1543
+ "required": false,
1544
+ "description": "The test case verifies the requirement, so passing it is evidence that the requirement is met."
1545
+ },
1546
+ "testing.testcasesketch.tests.data-store.accesspattern": {
1547
+ "id": "testing.testcasesketch.tests.data-store.accesspattern",
1548
+ "source_spec_node_id": "testing.testcasesketch",
1549
+ "source_layer": "testing",
1550
+ "destination_spec_node_id": "data-store.accesspattern",
1551
+ "destination_layer": "data-store",
1552
+ "predicate": "tests",
1553
+ "cardinality": "many-to-many",
1554
+ "strength": "medium",
1555
+ "required": false,
1556
+ "description": "The test case exercises the access pattern."
2238
1557
  },
2239
1558
  "testing.testcasesketch.tests.ux.actioncomponent": {
2240
1559
  "id": "testing.testcasesketch.tests.ux.actioncomponent",
@@ -2245,7 +1564,20 @@
2245
1564
  "predicate": "tests",
2246
1565
  "cardinality": "many-to-many",
2247
1566
  "strength": "medium",
2248
- "required": false
1567
+ "required": false,
1568
+ "description": "The test case exercises the action component, such as clicking a button."
1569
+ },
1570
+ "testing.testcasesketch.tests.application.applicationcomponent": {
1571
+ "id": "testing.testcasesketch.tests.application.applicationcomponent",
1572
+ "source_spec_node_id": "testing.testcasesketch",
1573
+ "source_layer": "testing",
1574
+ "destination_spec_node_id": "application.applicationcomponent",
1575
+ "destination_layer": "application",
1576
+ "predicate": "tests",
1577
+ "cardinality": "many-to-many",
1578
+ "strength": "medium",
1579
+ "required": false,
1580
+ "description": "The test case exercises the application component."
2249
1581
  },
2250
1582
  "testing.testcasesketch.tests.application.applicationfunction": {
2251
1583
  "id": "testing.testcasesketch.tests.application.applicationfunction",
@@ -2256,7 +1588,8 @@
2256
1588
  "predicate": "tests",
2257
1589
  "cardinality": "many-to-many",
2258
1590
  "strength": "medium",
2259
- "required": false
1591
+ "required": false,
1592
+ "description": "The test case exercises the application function."
2260
1593
  },
2261
1594
  "testing.testcasesketch.tests.application.applicationinterface": {
2262
1595
  "id": "testing.testcasesketch.tests.application.applicationinterface",
@@ -2267,7 +1600,20 @@
2267
1600
  "predicate": "tests",
2268
1601
  "cardinality": "many-to-many",
2269
1602
  "strength": "medium",
2270
- "required": false
1603
+ "required": false,
1604
+ "description": "The test case exercises the application interface, such as a contract test."
1605
+ },
1606
+ "testing.testcasesketch.tests.application.applicationprocess": {
1607
+ "id": "testing.testcasesketch.tests.application.applicationprocess",
1608
+ "source_spec_node_id": "testing.testcasesketch",
1609
+ "source_layer": "testing",
1610
+ "destination_spec_node_id": "application.applicationprocess",
1611
+ "destination_layer": "application",
1612
+ "predicate": "tests",
1613
+ "cardinality": "many-to-many",
1614
+ "strength": "medium",
1615
+ "required": false,
1616
+ "description": "The test case exercises the application process."
2271
1617
  },
2272
1618
  "testing.testcasesketch.tests.application.applicationservice": {
2273
1619
  "id": "testing.testcasesketch.tests.application.applicationservice",
@@ -2278,7 +1624,20 @@
2278
1624
  "predicate": "tests",
2279
1625
  "cardinality": "many-to-many",
2280
1626
  "strength": "medium",
2281
- "required": false
1627
+ "required": false,
1628
+ "description": "The test case exercises the application service."
1629
+ },
1630
+ "testing.testcasesketch.tests.security.authenticationconfig": {
1631
+ "id": "testing.testcasesketch.tests.security.authenticationconfig",
1632
+ "source_spec_node_id": "testing.testcasesketch",
1633
+ "source_layer": "testing",
1634
+ "destination_spec_node_id": "security.authenticationconfig",
1635
+ "destination_layer": "security",
1636
+ "predicate": "tests",
1637
+ "cardinality": "many-to-many",
1638
+ "strength": "medium",
1639
+ "required": false,
1640
+ "description": "The test case exercises the authentication configuration."
2282
1641
  },
2283
1642
  "testing.testcasesketch.tests.business.businessprocess": {
2284
1643
  "id": "testing.testcasesketch.tests.business.businessprocess",
@@ -2289,7 +1648,8 @@
2289
1648
  "predicate": "tests",
2290
1649
  "cardinality": "many-to-many",
2291
1650
  "strength": "medium",
2292
- "required": false
1651
+ "required": false,
1652
+ "description": "The test case exercises the business process end to end."
2293
1653
  },
2294
1654
  "testing.testcasesketch.tests.business.businessservice": {
2295
1655
  "id": "testing.testcasesketch.tests.business.businessservice",
@@ -2300,7 +1660,8 @@
2300
1660
  "predicate": "tests",
2301
1661
  "cardinality": "many-to-many",
2302
1662
  "strength": "medium",
2303
- "required": false
1663
+ "required": false,
1664
+ "description": "The test case exercises the business service, such as an acceptance test."
2304
1665
  },
2305
1666
  "testing.testcasesketch.tests.security.countermeasure": {
2306
1667
  "id": "testing.testcasesketch.tests.security.countermeasure",
@@ -2311,18 +1672,20 @@
2311
1672
  "predicate": "tests",
2312
1673
  "cardinality": "many-to-many",
2313
1674
  "strength": "medium",
2314
- "required": false
1675
+ "required": false,
1676
+ "description": "The test case checks that the countermeasure works."
2315
1677
  },
2316
- "testing.testcasesketch.tests.testing.coveragerequirement": {
2317
- "id": "testing.testcasesketch.tests.testing.coveragerequirement",
1678
+ "testing.testcasesketch.tests.product.feature": {
1679
+ "id": "testing.testcasesketch.tests.product.feature",
2318
1680
  "source_spec_node_id": "testing.testcasesketch",
2319
1681
  "source_layer": "testing",
2320
- "destination_spec_node_id": "testing.coveragerequirement",
2321
- "destination_layer": "testing",
1682
+ "destination_spec_node_id": "product.feature",
1683
+ "destination_layer": "product",
2322
1684
  "predicate": "tests",
2323
1685
  "cardinality": "many-to-many",
2324
1686
  "strength": "medium",
2325
- "required": false
1687
+ "required": false,
1688
+ "description": "The test case exercises the feature."
2326
1689
  },
2327
1690
  "testing.testcasesketch.tests.ux.librarycomponent": {
2328
1691
  "id": "testing.testcasesketch.tests.ux.librarycomponent",
@@ -2333,7 +1696,8 @@
2333
1696
  "predicate": "tests",
2334
1697
  "cardinality": "many-to-many",
2335
1698
  "strength": "medium",
2336
- "required": false
1699
+ "required": false,
1700
+ "description": "The test case exercises the library component, such as a component test."
2337
1701
  },
2338
1702
  "testing.testcasesketch.tests.apm.metricinstrument": {
2339
1703
  "id": "testing.testcasesketch.tests.apm.metricinstrument",
@@ -2344,7 +1708,8 @@
2344
1708
  "predicate": "tests",
2345
1709
  "cardinality": "many-to-many",
2346
1710
  "strength": "medium",
2347
- "required": false
1711
+ "required": false,
1712
+ "description": "The test case checks that the metric is emitted with the expected values."
2348
1713
  },
2349
1714
  "testing.testcasesketch.tests.navigation.navigationflow": {
2350
1715
  "id": "testing.testcasesketch.tests.navigation.navigationflow",
@@ -2355,7 +1720,8 @@
2355
1720
  "predicate": "tests",
2356
1721
  "cardinality": "many-to-many",
2357
1722
  "strength": "medium",
2358
- "required": false
1723
+ "required": false,
1724
+ "description": "The test case walks through the navigation flow."
2359
1725
  },
2360
1726
  "testing.testcasesketch.tests.navigation.navigationguard": {
2361
1727
  "id": "testing.testcasesketch.tests.navigation.navigationguard",
@@ -2366,7 +1732,32 @@
2366
1732
  "predicate": "tests",
2367
1733
  "cardinality": "many-to-many",
2368
1734
  "strength": "medium",
2369
- "required": false
1735
+ "required": false,
1736
+ "description": "The test case checks that the guard allows or blocks navigation."
1737
+ },
1738
+ "testing.testcasesketch.tests.navigation.navigationtransition": {
1739
+ "id": "testing.testcasesketch.tests.navigation.navigationtransition",
1740
+ "source_spec_node_id": "testing.testcasesketch",
1741
+ "source_layer": "testing",
1742
+ "destination_spec_node_id": "navigation.navigationtransition",
1743
+ "destination_layer": "navigation",
1744
+ "predicate": "tests",
1745
+ "cardinality": "many-to-many",
1746
+ "strength": "medium",
1747
+ "required": false,
1748
+ "description": "The test case exercises the navigation transition."
1749
+ },
1750
+ "testing.testcasesketch.tests.data-model.objectschema": {
1751
+ "id": "testing.testcasesketch.tests.data-model.objectschema",
1752
+ "source_spec_node_id": "testing.testcasesketch",
1753
+ "source_layer": "testing",
1754
+ "destination_spec_node_id": "data-model.objectschema",
1755
+ "destination_layer": "data-model",
1756
+ "predicate": "tests",
1757
+ "cardinality": "many-to-many",
1758
+ "strength": "medium",
1759
+ "required": false,
1760
+ "description": "The test case exercises the object schema."
2370
1761
  },
2371
1762
  "testing.testcasesketch.tests.api.operation": {
2372
1763
  "id": "testing.testcasesketch.tests.api.operation",
@@ -2377,7 +1768,20 @@
2377
1768
  "predicate": "tests",
2378
1769
  "cardinality": "many-to-many",
2379
1770
  "strength": "medium",
2380
- "required": false
1771
+ "required": false,
1772
+ "description": "The test case calls the operation."
1773
+ },
1774
+ "testing.testcasesketch.tests.api.response": {
1775
+ "id": "testing.testcasesketch.tests.api.response",
1776
+ "source_spec_node_id": "testing.testcasesketch",
1777
+ "source_layer": "testing",
1778
+ "destination_spec_node_id": "api.response",
1779
+ "destination_layer": "api",
1780
+ "predicate": "tests",
1781
+ "cardinality": "many-to-many",
1782
+ "strength": "medium",
1783
+ "required": false,
1784
+ "description": "The test case checks the operation returns the response, such as its status and body shape."
2381
1785
  },
2382
1786
  "testing.testcasesketch.tests.navigation.route": {
2383
1787
  "id": "testing.testcasesketch.tests.navigation.route",
@@ -2388,7 +1792,8 @@
2388
1792
  "predicate": "tests",
2389
1793
  "cardinality": "many-to-many",
2390
1794
  "strength": "medium",
2391
- "required": false
1795
+ "required": false,
1796
+ "description": "The test case navigates to the route."
2392
1797
  },
2393
1798
  "testing.testcasesketch.tests.data-model.schemadefinition": {
2394
1799
  "id": "testing.testcasesketch.tests.data-model.schemadefinition",
@@ -2399,304 +1804,224 @@
2399
1804
  "predicate": "tests",
2400
1805
  "cardinality": "many-to-many",
2401
1806
  "strength": "medium",
2402
- "required": false
1807
+ "required": false,
1808
+ "description": "The test case checks values against the schema definition."
2403
1809
  },
2404
- "testing.testcasesketch.tests.security.threat": {
2405
- "id": "testing.testcasesketch.tests.security.threat",
1810
+ "testing.testcasesketch.tests.security.secureresource": {
1811
+ "id": "testing.testcasesketch.tests.security.secureresource",
2406
1812
  "source_spec_node_id": "testing.testcasesketch",
2407
1813
  "source_layer": "testing",
2408
- "destination_spec_node_id": "security.threat",
1814
+ "destination_spec_node_id": "security.secureresource",
2409
1815
  "destination_layer": "security",
2410
1816
  "predicate": "tests",
2411
1817
  "cardinality": "many-to-many",
2412
1818
  "strength": "medium",
2413
- "required": false
1819
+ "required": false,
1820
+ "description": "The test case exercises access control on the secure resource."
2414
1821
  },
2415
- "testing.testcasesketch.tests.data-store.validationrule": {
2416
- "id": "testing.testcasesketch.tests.data-store.validationrule",
1822
+ "testing.testcasesketch.tests.security.securitypolicy": {
1823
+ "id": "testing.testcasesketch.tests.security.securitypolicy",
2417
1824
  "source_spec_node_id": "testing.testcasesketch",
2418
1825
  "source_layer": "testing",
2419
- "destination_spec_node_id": "data-store.validationrule",
2420
- "destination_layer": "data-store",
1826
+ "destination_spec_node_id": "security.securitypolicy",
1827
+ "destination_layer": "security",
2421
1828
  "predicate": "tests",
2422
1829
  "cardinality": "many-to-many",
2423
1830
  "strength": "medium",
2424
- "required": false
1831
+ "required": false,
1832
+ "description": "The test case checks that the security policy is enforced."
2425
1833
  },
2426
- "testing.testcasesketch.tests.ux.view": {
2427
- "id": "testing.testcasesketch.tests.ux.view",
1834
+ "testing.testcasesketch.tests.apm.span": {
1835
+ "id": "testing.testcasesketch.tests.apm.span",
2428
1836
  "source_spec_node_id": "testing.testcasesketch",
2429
1837
  "source_layer": "testing",
2430
- "destination_spec_node_id": "ux.view",
2431
- "destination_layer": "ux",
1838
+ "destination_spec_node_id": "apm.span",
1839
+ "destination_layer": "apm",
2432
1840
  "predicate": "tests",
2433
1841
  "cardinality": "many-to-many",
2434
1842
  "strength": "medium",
2435
- "required": false
1843
+ "required": false,
1844
+ "description": "The test case exercises the span."
2436
1845
  },
2437
- "testing.testcasesketch.validates.testing.coveragerequirement": {
2438
- "id": "testing.testcasesketch.validates.testing.coveragerequirement",
1846
+ "testing.testcasesketch.tests.data-store.storedlogic": {
1847
+ "id": "testing.testcasesketch.tests.data-store.storedlogic",
2439
1848
  "source_spec_node_id": "testing.testcasesketch",
2440
1849
  "source_layer": "testing",
2441
- "destination_spec_node_id": "testing.coveragerequirement",
2442
- "destination_layer": "testing",
2443
- "predicate": "validates",
1850
+ "destination_spec_node_id": "data-store.storedlogic",
1851
+ "destination_layer": "data-store",
1852
+ "predicate": "tests",
2444
1853
  "cardinality": "many-to-many",
2445
1854
  "strength": "medium",
2446
- "required": false
1855
+ "required": false,
1856
+ "description": "The test case exercises the stored logic."
2447
1857
  },
2448
- "testing.testcasesketch.validates.api.response": {
2449
- "id": "testing.testcasesketch.validates.api.response",
1858
+ "testing.testcasesketch.tests.ux.subview": {
1859
+ "id": "testing.testcasesketch.tests.ux.subview",
2450
1860
  "source_spec_node_id": "testing.testcasesketch",
2451
1861
  "source_layer": "testing",
2452
- "destination_spec_node_id": "api.response",
2453
- "destination_layer": "api",
2454
- "predicate": "validates",
1862
+ "destination_spec_node_id": "ux.subview",
1863
+ "destination_layer": "ux",
1864
+ "predicate": "tests",
2455
1865
  "cardinality": "many-to-many",
2456
1866
  "strength": "medium",
2457
- "required": false
1867
+ "required": false,
1868
+ "description": "The test case exercises the subview."
2458
1869
  },
2459
- "testing.testcasesketch.validates.security.securitypolicy": {
2460
- "id": "testing.testcasesketch.validates.security.securitypolicy",
1870
+ "testing.testcasesketch.tests.security.threat": {
1871
+ "id": "testing.testcasesketch.tests.security.threat",
2461
1872
  "source_spec_node_id": "testing.testcasesketch",
2462
1873
  "source_layer": "testing",
2463
- "destination_spec_node_id": "security.securitypolicy",
1874
+ "destination_spec_node_id": "security.threat",
2464
1875
  "destination_layer": "security",
2465
- "predicate": "validates",
1876
+ "predicate": "tests",
2466
1877
  "cardinality": "many-to-many",
2467
1878
  "strength": "medium",
2468
- "required": false
1879
+ "required": false,
1880
+ "description": "The test case attempts the threat, such as a penetration test."
2469
1881
  },
2470
- "testing.testcasesketch.validates.testing.testcoveragetarget": {
2471
- "id": "testing.testcasesketch.validates.testing.testcoveragetarget",
1882
+ "testing.testcasesketch.tests.product.userworkflow": {
1883
+ "id": "testing.testcasesketch.tests.product.userworkflow",
2472
1884
  "source_spec_node_id": "testing.testcasesketch",
2473
1885
  "source_layer": "testing",
2474
- "destination_spec_node_id": "testing.testcoveragetarget",
2475
- "destination_layer": "testing",
2476
- "predicate": "validates",
1886
+ "destination_spec_node_id": "product.userworkflow",
1887
+ "destination_layer": "product",
1888
+ "predicate": "tests",
2477
1889
  "cardinality": "many-to-many",
2478
1890
  "strength": "medium",
2479
- "required": false
2480
- },
2481
- "testing.testcoveragemodel.aggregates.contextvariation": {
2482
- "id": "testing.testcoveragemodel.aggregates.contextvariation",
2483
- "source_spec_node_id": "testing.testcoveragemodel",
2484
- "source_layer": "testing",
2485
- "destination_spec_node_id": "testing.contextvariation",
2486
- "destination_layer": "testing",
2487
- "predicate": "aggregates",
2488
- "cardinality": "one-to-many",
2489
- "strength": "medium",
2490
- "required": false
2491
- },
2492
- "testing.testcoveragemodel.aggregates.inputspacepartition": {
2493
- "id": "testing.testcoveragemodel.aggregates.inputspacepartition",
2494
- "source_spec_node_id": "testing.testcoveragemodel",
2495
- "source_layer": "testing",
2496
- "destination_spec_node_id": "testing.inputspacepartition",
2497
- "destination_layer": "testing",
2498
- "predicate": "aggregates",
2499
- "cardinality": "one-to-many",
2500
- "strength": "medium",
2501
- "required": false
2502
- },
2503
- "testing.testcoveragemodel.aggregates.testcasesketch": {
2504
- "id": "testing.testcoveragemodel.aggregates.testcasesketch",
2505
- "source_spec_node_id": "testing.testcoveragemodel",
2506
- "source_layer": "testing",
2507
- "destination_spec_node_id": "testing.testcasesketch",
2508
- "destination_layer": "testing",
2509
- "predicate": "aggregates",
2510
- "cardinality": "one-to-many",
2511
- "strength": "medium",
2512
- "required": false
1891
+ "required": false,
1892
+ "description": "The test case exercises the user workflow."
2513
1893
  },
2514
- "testing.testcoveragemodel.aggregates.testing.testcoveragetarget": {
2515
- "id": "testing.testcoveragemodel.aggregates.testing.testcoveragetarget",
2516
- "source_spec_node_id": "testing.testcoveragemodel",
1894
+ "testing.testcasesketch.tests.data-store.validationrule": {
1895
+ "id": "testing.testcasesketch.tests.data-store.validationrule",
1896
+ "source_spec_node_id": "testing.testcasesketch",
2517
1897
  "source_layer": "testing",
2518
- "destination_spec_node_id": "testing.testcoveragetarget",
2519
- "destination_layer": "testing",
2520
- "predicate": "aggregates",
1898
+ "destination_spec_node_id": "data-store.validationrule",
1899
+ "destination_layer": "data-store",
1900
+ "predicate": "tests",
2521
1901
  "cardinality": "many-to-many",
2522
1902
  "strength": "medium",
2523
- "required": false
1903
+ "required": false,
1904
+ "description": "The test case checks that the store enforces the validation rule."
2524
1905
  },
2525
- "testing.testcoveragemodel.composes.testing.coverageexclusion": {
2526
- "id": "testing.testcoveragemodel.composes.testing.coverageexclusion",
2527
- "source_spec_node_id": "testing.testcoveragemodel",
1906
+ "testing.testcasesketch.tests.ux.view": {
1907
+ "id": "testing.testcasesketch.tests.ux.view",
1908
+ "source_spec_node_id": "testing.testcasesketch",
2528
1909
  "source_layer": "testing",
2529
- "destination_spec_node_id": "testing.coverageexclusion",
2530
- "destination_layer": "testing",
2531
- "predicate": "composes",
1910
+ "destination_spec_node_id": "ux.view",
1911
+ "destination_layer": "ux",
1912
+ "predicate": "tests",
2532
1913
  "cardinality": "many-to-many",
2533
1914
  "strength": "medium",
2534
- "required": false
1915
+ "required": false,
1916
+ "description": "The test case renders or interacts with the view."
2535
1917
  },
2536
- "testing.testcoveragemodel.composes.testing.coveragerequirement": {
2537
- "id": "testing.testcoveragemodel.composes.testing.coveragerequirement",
2538
- "source_spec_node_id": "testing.testcoveragemodel",
1918
+ "testing.testcasesketch.validates.testing.coveragerequirement": {
1919
+ "id": "testing.testcasesketch.validates.testing.coveragerequirement",
1920
+ "source_spec_node_id": "testing.testcasesketch",
2539
1921
  "source_layer": "testing",
2540
1922
  "destination_spec_node_id": "testing.coveragerequirement",
2541
1923
  "destination_layer": "testing",
2542
- "predicate": "composes",
2543
- "cardinality": "many-to-many",
2544
- "strength": "medium",
2545
- "required": false
2546
- },
2547
- "testing.testcoveragemodel.composes.testing.coveragesummary": {
2548
- "id": "testing.testcoveragemodel.composes.testing.coveragesummary",
2549
- "source_spec_node_id": "testing.testcoveragemodel",
2550
- "source_layer": "testing",
2551
- "destination_spec_node_id": "testing.coveragesummary",
2552
- "destination_layer": "testing",
2553
- "predicate": "composes",
2554
- "cardinality": "many-to-many",
2555
- "strength": "medium",
2556
- "required": false
2557
- },
2558
- "testing.testcoveragemodel.composes.testing.inputpartitionselection": {
2559
- "id": "testing.testcoveragemodel.composes.testing.inputpartitionselection",
2560
- "source_spec_node_id": "testing.testcoveragemodel",
2561
- "source_layer": "testing",
2562
- "destination_spec_node_id": "testing.inputpartitionselection",
2563
- "destination_layer": "testing",
2564
- "predicate": "composes",
2565
- "cardinality": "many-to-many",
2566
- "strength": "medium",
2567
- "required": false
2568
- },
2569
- "testing.testcoveragemodel.composes.testing.outcomecategory": {
2570
- "id": "testing.testcoveragemodel.composes.testing.outcomecategory",
2571
- "source_spec_node_id": "testing.testcoveragemodel",
2572
- "source_layer": "testing",
2573
- "destination_spec_node_id": "testing.outcomecategory",
2574
- "destination_layer": "testing",
2575
- "predicate": "composes",
2576
- "cardinality": "many-to-many",
2577
- "strength": "medium",
2578
- "required": false
2579
- },
2580
- "testing.testcoveragemodel.composes.testing.testcoveragetarget": {
2581
- "id": "testing.testcoveragemodel.composes.testing.testcoveragetarget",
2582
- "source_spec_node_id": "testing.testcoveragemodel",
2583
- "source_layer": "testing",
2584
- "destination_spec_node_id": "testing.testcoveragetarget",
2585
- "destination_layer": "testing",
2586
- "predicate": "composes",
2587
- "cardinality": "many-to-many",
2588
- "strength": "medium",
2589
- "required": false
2590
- },
2591
- "testing.testcoveragemodel.constrained-by.motivation.constraint": {
2592
- "id": "testing.testcoveragemodel.constrained-by.motivation.constraint",
2593
- "source_spec_node_id": "testing.testcoveragemodel",
2594
- "source_layer": "testing",
2595
- "destination_spec_node_id": "motivation.constraint",
2596
- "destination_layer": "motivation",
2597
- "predicate": "constrained-by",
2598
- "cardinality": "many-to-many",
2599
- "strength": "medium",
2600
- "required": false
2601
- },
2602
- "testing.testcoveragemodel.covers.application.applicationcomponent": {
2603
- "id": "testing.testcoveragemodel.covers.application.applicationcomponent",
2604
- "source_spec_node_id": "testing.testcoveragemodel",
2605
- "source_layer": "testing",
2606
- "destination_spec_node_id": "application.applicationcomponent",
2607
- "destination_layer": "application",
2608
- "predicate": "covers",
1924
+ "predicate": "validates",
2609
1925
  "cardinality": "many-to-many",
2610
1926
  "strength": "medium",
2611
- "required": false
1927
+ "required": false,
1928
+ "description": "The test case exercises the coverage requirement, counting toward it when implemented."
2612
1929
  },
2613
- "testing.testcoveragemodel.covers.application.applicationservice": {
2614
- "id": "testing.testcoveragemodel.covers.application.applicationservice",
1930
+ "testing.testcoveragemodel.composes.testing.contextvariation": {
1931
+ "id": "testing.testcoveragemodel.composes.testing.contextvariation",
2615
1932
  "source_spec_node_id": "testing.testcoveragemodel",
2616
1933
  "source_layer": "testing",
2617
- "destination_spec_node_id": "application.applicationservice",
2618
- "destination_layer": "application",
2619
- "predicate": "covers",
2620
- "cardinality": "many-to-many",
1934
+ "destination_spec_node_id": "testing.contextvariation",
1935
+ "destination_layer": "testing",
1936
+ "predicate": "composes",
1937
+ "cardinality": "one-to-many",
2621
1938
  "strength": "medium",
2622
- "required": false
1939
+ "required": false,
1940
+ "description": "The context variation is defined in the model and shared by its targets, requirements and test cases."
2623
1941
  },
2624
- "testing.testcoveragemodel.covers.business.businessfunction": {
2625
- "id": "testing.testcoveragemodel.covers.business.businessfunction",
1942
+ "testing.testcoveragemodel.composes.testing.coverageexclusion": {
1943
+ "id": "testing.testcoveragemodel.composes.testing.coverageexclusion",
2626
1944
  "source_spec_node_id": "testing.testcoveragemodel",
2627
1945
  "source_layer": "testing",
2628
- "destination_spec_node_id": "business.businessfunction",
2629
- "destination_layer": "business",
2630
- "predicate": "covers",
1946
+ "destination_spec_node_id": "testing.coverageexclusion",
1947
+ "destination_layer": "testing",
1948
+ "predicate": "composes",
2631
1949
  "cardinality": "many-to-many",
2632
1950
  "strength": "medium",
2633
- "required": false
1951
+ "required": false,
1952
+ "description": "The exclusion is a governance decision recorded in the model."
2634
1953
  },
2635
- "testing.testcoveragemodel.covers.business.businessprocess": {
2636
- "id": "testing.testcoveragemodel.covers.business.businessprocess",
1954
+ "testing.testcoveragemodel.composes.testing.coveragesummary": {
1955
+ "id": "testing.testcoveragemodel.composes.testing.coveragesummary",
2637
1956
  "source_spec_node_id": "testing.testcoveragemodel",
2638
1957
  "source_layer": "testing",
2639
- "destination_spec_node_id": "business.businessprocess",
2640
- "destination_layer": "business",
2641
- "predicate": "covers",
1958
+ "destination_spec_node_id": "testing.coveragesummary",
1959
+ "destination_layer": "testing",
1960
+ "predicate": "composes",
2642
1961
  "cardinality": "many-to-many",
2643
1962
  "strength": "medium",
2644
- "required": false
1963
+ "required": false,
1964
+ "description": "The summary reports on the model at a point in time."
2645
1965
  },
2646
- "testing.testcoveragemodel.covers.business.businessservice": {
2647
- "id": "testing.testcoveragemodel.covers.business.businessservice",
1966
+ "testing.testcoveragemodel.composes.testing.environmentfactor": {
1967
+ "id": "testing.testcoveragemodel.composes.testing.environmentfactor",
2648
1968
  "source_spec_node_id": "testing.testcoveragemodel",
2649
1969
  "source_layer": "testing",
2650
- "destination_spec_node_id": "business.businessservice",
2651
- "destination_layer": "business",
2652
- "predicate": "covers",
1970
+ "destination_spec_node_id": "testing.environmentfactor",
1971
+ "destination_layer": "testing",
1972
+ "predicate": "composes",
2653
1973
  "cardinality": "many-to-many",
2654
1974
  "strength": "medium",
2655
- "required": false
1975
+ "required": false,
1976
+ "description": "The environment factor is defined in the model and shared by its context variations."
2656
1977
  },
2657
- "testing.testcoveragemodel.covers.data-model.objectschema": {
2658
- "id": "testing.testcoveragemodel.covers.data-model.objectschema",
1978
+ "testing.testcoveragemodel.composes.testing.inputspacepartition": {
1979
+ "id": "testing.testcoveragemodel.composes.testing.inputspacepartition",
2659
1980
  "source_spec_node_id": "testing.testcoveragemodel",
2660
1981
  "source_layer": "testing",
2661
- "destination_spec_node_id": "data-model.objectschema",
2662
- "destination_layer": "data-model",
2663
- "predicate": "covers",
2664
- "cardinality": "many-to-many",
1982
+ "destination_spec_node_id": "testing.inputspacepartition",
1983
+ "destination_layer": "testing",
1984
+ "predicate": "composes",
1985
+ "cardinality": "one-to-many",
2665
1986
  "strength": "medium",
2666
- "required": false
1987
+ "required": false,
1988
+ "description": "The partition is defined in the model and shared by the target input fields that use it."
2667
1989
  },
2668
- "testing.testcoveragemodel.covers.api.openapidocument": {
2669
- "id": "testing.testcoveragemodel.covers.api.openapidocument",
1990
+ "testing.testcoveragemodel.composes.testing.testcoveragetarget": {
1991
+ "id": "testing.testcoveragemodel.composes.testing.testcoveragetarget",
2670
1992
  "source_spec_node_id": "testing.testcoveragemodel",
2671
1993
  "source_layer": "testing",
2672
- "destination_spec_node_id": "api.openapidocument",
2673
- "destination_layer": "api",
2674
- "predicate": "covers",
1994
+ "destination_spec_node_id": "testing.testcoveragetarget",
1995
+ "destination_layer": "testing",
1996
+ "predicate": "composes",
2675
1997
  "cardinality": "many-to-many",
2676
1998
  "strength": "medium",
2677
- "required": false
1999
+ "required": false,
2000
+ "description": "The target is in the model's test scope."
2678
2001
  },
2679
- "testing.testcoveragemodel.covers.navigation.route": {
2680
- "id": "testing.testcoveragemodel.covers.navigation.route",
2002
+ "testing.testcoveragemodel.covers.application.applicationcomponent": {
2003
+ "id": "testing.testcoveragemodel.covers.application.applicationcomponent",
2681
2004
  "source_spec_node_id": "testing.testcoveragemodel",
2682
2005
  "source_layer": "testing",
2683
- "destination_spec_node_id": "navigation.route",
2684
- "destination_layer": "navigation",
2006
+ "destination_spec_node_id": "application.applicationcomponent",
2007
+ "destination_layer": "application",
2685
2008
  "predicate": "covers",
2686
2009
  "cardinality": "many-to-many",
2687
2010
  "strength": "medium",
2688
- "required": false
2011
+ "required": false,
2012
+ "description": "The model is the coverage plan for the application component."
2689
2013
  },
2690
- "testing.testcoveragemodel.covers.security.securitypolicy": {
2691
- "id": "testing.testcoveragemodel.covers.security.securitypolicy",
2014
+ "testing.testcoveragemodel.covers.api.openapidocument": {
2015
+ "id": "testing.testcoveragemodel.covers.api.openapidocument",
2692
2016
  "source_spec_node_id": "testing.testcoveragemodel",
2693
2017
  "source_layer": "testing",
2694
- "destination_spec_node_id": "security.securitypolicy",
2695
- "destination_layer": "security",
2018
+ "destination_spec_node_id": "api.openapidocument",
2019
+ "destination_layer": "api",
2696
2020
  "predicate": "covers",
2697
2021
  "cardinality": "many-to-many",
2698
2022
  "strength": "medium",
2699
- "required": false
2023
+ "required": false,
2024
+ "description": "The model is the coverage plan for the API document."
2700
2025
  },
2701
2026
  "testing.testcoveragemodel.covers.ux.uxapplication": {
2702
2027
  "id": "testing.testcoveragemodel.covers.ux.uxapplication",
@@ -2707,29 +2032,8 @@
2707
2032
  "predicate": "covers",
2708
2033
  "cardinality": "many-to-many",
2709
2034
  "strength": "medium",
2710
- "required": false
2711
- },
2712
- "testing.testcoveragemodel.fulfills-requirements.motivation.requirement": {
2713
- "id": "testing.testcoveragemodel.fulfills-requirements.motivation.requirement",
2714
- "source_spec_node_id": "testing.testcoveragemodel",
2715
- "source_layer": "testing",
2716
- "destination_spec_node_id": "motivation.requirement",
2717
- "destination_layer": "motivation",
2718
- "predicate": "fulfills-requirements",
2719
- "cardinality": "many-to-many",
2720
- "strength": "high",
2721
- "required": false
2722
- },
2723
- "testing.testcoveragemodel.governed-by-principles.motivation.principle": {
2724
- "id": "testing.testcoveragemodel.governed-by-principles.motivation.principle",
2725
- "source_spec_node_id": "testing.testcoveragemodel",
2726
- "source_layer": "testing",
2727
- "destination_spec_node_id": "motivation.principle",
2728
- "destination_layer": "motivation",
2729
- "predicate": "governed-by-principles",
2730
- "cardinality": "many-to-many",
2731
- "strength": "high",
2732
- "required": false
2035
+ "required": false,
2036
+ "description": "The model is the coverage plan for the UX application."
2733
2037
  },
2734
2038
  "testing.testcoveragemodel.measures-outcome.motivation.outcome": {
2735
2039
  "id": "testing.testcoveragemodel.measures-outcome.motivation.outcome",
@@ -2740,106 +2044,56 @@
2740
2044
  "predicate": "measures-outcome",
2741
2045
  "cardinality": "many-to-many",
2742
2046
  "strength": "medium",
2743
- "required": false
2744
- },
2745
- "testing.testcoveragemodel.references.data-store.database": {
2746
- "id": "testing.testcoveragemodel.references.data-store.database",
2747
- "source_spec_node_id": "testing.testcoveragemodel",
2748
- "source_layer": "testing",
2749
- "destination_spec_node_id": "data-store.database",
2750
- "destination_layer": "data-store",
2751
- "predicate": "references",
2752
- "cardinality": "many-to-many",
2753
- "strength": "medium",
2754
- "required": false
2047
+ "required": false,
2048
+ "description": "The model's coverage shows progress toward the outcome, such as 'no untested payment paths'."
2755
2049
  },
2756
- "testing.testcoveragemodel.references.motivation.driver": {
2757
- "id": "testing.testcoveragemodel.references.motivation.driver",
2050
+ "testing.testcoveragemodel.satisfies.motivation.constraint": {
2051
+ "id": "testing.testcoveragemodel.satisfies.motivation.constraint",
2758
2052
  "source_spec_node_id": "testing.testcoveragemodel",
2759
2053
  "source_layer": "testing",
2760
- "destination_spec_node_id": "motivation.driver",
2054
+ "destination_spec_node_id": "motivation.constraint",
2761
2055
  "destination_layer": "motivation",
2762
- "predicate": "references",
2763
- "cardinality": "many-to-many",
2764
- "strength": "medium",
2765
- "required": false
2766
- },
2767
- "testing.testcoveragemodel.references.apm.instrumentationscope": {
2768
- "id": "testing.testcoveragemodel.references.apm.instrumentationscope",
2769
- "source_spec_node_id": "testing.testcoveragemodel",
2770
- "source_layer": "testing",
2771
- "destination_spec_node_id": "apm.instrumentationscope",
2772
- "destination_layer": "apm",
2773
- "predicate": "references",
2056
+ "predicate": "satisfies",
2774
2057
  "cardinality": "many-to-many",
2775
2058
  "strength": "medium",
2776
- "required": false
2059
+ "required": false,
2060
+ "description": "The coverage model respects the constraint, such as a deadline or budget that bounds how much is tested."
2777
2061
  },
2778
- "testing.testcoveragemodel.references.security.threat": {
2779
- "id": "testing.testcoveragemodel.references.security.threat",
2062
+ "testing.testcoveragemodel.satisfies.motivation.principle": {
2063
+ "id": "testing.testcoveragemodel.satisfies.motivation.principle",
2780
2064
  "source_spec_node_id": "testing.testcoveragemodel",
2781
2065
  "source_layer": "testing",
2782
- "destination_spec_node_id": "security.threat",
2783
- "destination_layer": "security",
2784
- "predicate": "references",
2066
+ "destination_spec_node_id": "motivation.principle",
2067
+ "destination_layer": "motivation",
2068
+ "predicate": "satisfies",
2785
2069
  "cardinality": "many-to-many",
2786
- "strength": "medium",
2787
- "required": false
2070
+ "strength": "high",
2071
+ "required": false,
2072
+ "description": "The coverage model follows the principle, such as 'test at the boundary' guiding which partitions it defines."
2788
2073
  },
2789
- "testing.testcoveragemodel.references.apm.traceconfiguration": {
2790
- "id": "testing.testcoveragemodel.references.apm.traceconfiguration",
2074
+ "testing.testcoveragemodel.satisfies.motivation.requirement": {
2075
+ "id": "testing.testcoveragemodel.satisfies.motivation.requirement",
2791
2076
  "source_spec_node_id": "testing.testcoveragemodel",
2792
2077
  "source_layer": "testing",
2793
- "destination_spec_node_id": "apm.traceconfiguration",
2794
- "destination_layer": "apm",
2795
- "predicate": "references",
2078
+ "destination_spec_node_id": "motivation.requirement",
2079
+ "destination_layer": "motivation",
2080
+ "predicate": "satisfies",
2796
2081
  "cardinality": "many-to-many",
2797
- "strength": "medium",
2798
- "required": false
2082
+ "strength": "high",
2083
+ "required": false,
2084
+ "description": "The coverage model plans the testing that shows the requirement is met."
2799
2085
  },
2800
- "testing.testcoveragemodel.supports-goals.motivation.goal": {
2801
- "id": "testing.testcoveragemodel.supports-goals.motivation.goal",
2086
+ "testing.testcoveragemodel.supports.motivation.goal": {
2087
+ "id": "testing.testcoveragemodel.supports.motivation.goal",
2802
2088
  "source_spec_node_id": "testing.testcoveragemodel",
2803
2089
  "source_layer": "testing",
2804
2090
  "destination_spec_node_id": "motivation.goal",
2805
2091
  "destination_layer": "motivation",
2806
- "predicate": "supports-goals",
2092
+ "predicate": "supports",
2807
2093
  "cardinality": "many-to-many",
2808
2094
  "strength": "high",
2809
- "required": false
2810
- },
2811
- "testing.testcoveragemodel.tests.technology.systemsoftware": {
2812
- "id": "testing.testcoveragemodel.tests.technology.systemsoftware",
2813
- "source_spec_node_id": "testing.testcoveragemodel",
2814
- "source_layer": "testing",
2815
- "destination_spec_node_id": "technology.systemsoftware",
2816
- "destination_layer": "technology",
2817
- "predicate": "tests",
2818
- "cardinality": "many-to-many",
2819
- "strength": "medium",
2820
- "required": false
2821
- },
2822
- "testing.testcoveragemodel.tests.technology.technologyservice": {
2823
- "id": "testing.testcoveragemodel.tests.technology.technologyservice",
2824
- "source_spec_node_id": "testing.testcoveragemodel",
2825
- "source_layer": "testing",
2826
- "destination_spec_node_id": "technology.technologyservice",
2827
- "destination_layer": "technology",
2828
- "predicate": "tests",
2829
- "cardinality": "many-to-many",
2830
- "strength": "medium",
2831
- "required": false
2832
- },
2833
- "testing.testcoveragetarget.aggregates.contextvariation": {
2834
- "id": "testing.testcoveragetarget.aggregates.contextvariation",
2835
- "source_spec_node_id": "testing.testcoveragetarget",
2836
- "source_layer": "testing",
2837
- "destination_spec_node_id": "testing.contextvariation",
2838
- "destination_layer": "testing",
2839
- "predicate": "aggregates",
2840
- "cardinality": "many-to-many",
2841
- "strength": "medium",
2842
- "required": false
2095
+ "required": false,
2096
+ "description": "The coverage plan contributes to the goal, such as release confidence."
2843
2097
  },
2844
2098
  "testing.testcoveragetarget.composes.testing.coveragerequirement": {
2845
2099
  "id": "testing.testcoveragetarget.composes.testing.coveragerequirement",
@@ -2850,18 +2104,8 @@
2850
2104
  "predicate": "composes",
2851
2105
  "cardinality": "many-to-many",
2852
2106
  "strength": "medium",
2853
- "required": false
2854
- },
2855
- "testing.testcoveragetarget.composes.testing.inputpartitionselection": {
2856
- "id": "testing.testcoveragetarget.composes.testing.inputpartitionselection",
2857
- "source_spec_node_id": "testing.testcoveragetarget",
2858
- "source_layer": "testing",
2859
- "destination_spec_node_id": "testing.inputpartitionselection",
2860
- "destination_layer": "testing",
2861
- "predicate": "composes",
2862
- "cardinality": "many-to-many",
2863
- "strength": "medium",
2864
- "required": false
2107
+ "required": false,
2108
+ "description": "The requirement states a coverage criterion for the target and exists only within it."
2865
2109
  },
2866
2110
  "testing.testcoveragetarget.composes.testing.outcomecategory": {
2867
2111
  "id": "testing.testcoveragetarget.composes.testing.outcomecategory",
@@ -2872,7 +2116,8 @@
2872
2116
  "predicate": "composes",
2873
2117
  "cardinality": "many-to-many",
2874
2118
  "strength": "medium",
2875
- "required": false
2119
+ "required": false,
2120
+ "description": "The outcome category is a result class the target can produce."
2876
2121
  },
2877
2122
  "testing.testcoveragetarget.composes.testing.targetinputfield": {
2878
2123
  "id": "testing.testcoveragetarget.composes.testing.targetinputfield",
@@ -2883,238 +2128,212 @@
2883
2128
  "predicate": "composes",
2884
2129
  "cardinality": "many-to-many",
2885
2130
  "strength": "medium",
2886
- "required": false
2131
+ "required": false,
2132
+ "description": "The input field belongs to the target's artifact."
2887
2133
  },
2888
- "testing.testcoveragetarget.composes.testing.testcoveragetarget": {
2889
- "id": "testing.testcoveragetarget.composes.testing.testcoveragetarget",
2134
+ "testing.testcoveragetarget.composes.testing.testcasesketch": {
2135
+ "id": "testing.testcoveragetarget.composes.testing.testcasesketch",
2890
2136
  "source_spec_node_id": "testing.testcoveragetarget",
2891
2137
  "source_layer": "testing",
2892
- "destination_spec_node_id": "testing.testcoveragetarget",
2138
+ "destination_spec_node_id": "testing.testcasesketch",
2893
2139
  "destination_layer": "testing",
2894
2140
  "predicate": "composes",
2895
2141
  "cardinality": "many-to-many",
2896
2142
  "strength": "medium",
2897
- "required": false
2143
+ "required": false,
2144
+ "description": "The test case is designed for the target."
2898
2145
  },
2899
- "testing.testcoveragetarget.covers.application.applicationservice": {
2900
- "id": "testing.testcoveragetarget.covers.application.applicationservice",
2146
+ "testing.testcoveragetarget.covers.application.applicationcomponent": {
2147
+ "id": "testing.testcoveragetarget.covers.application.applicationcomponent",
2901
2148
  "source_spec_node_id": "testing.testcoveragetarget",
2902
2149
  "source_layer": "testing",
2903
- "destination_spec_node_id": "application.applicationservice",
2150
+ "destination_spec_node_id": "application.applicationcomponent",
2904
2151
  "destination_layer": "application",
2905
2152
  "predicate": "covers",
2906
2153
  "cardinality": "many-to-many",
2907
2154
  "strength": "medium",
2908
- "required": false
2155
+ "required": false,
2156
+ "description": "The target puts the application component in test scope."
2909
2157
  },
2910
- "testing.testcoveragetarget.covers.data-model.objectschema": {
2911
- "id": "testing.testcoveragetarget.covers.data-model.objectschema",
2158
+ "testing.testcoveragetarget.covers.application.applicationservice": {
2159
+ "id": "testing.testcoveragetarget.covers.application.applicationservice",
2912
2160
  "source_spec_node_id": "testing.testcoveragetarget",
2913
2161
  "source_layer": "testing",
2914
- "destination_spec_node_id": "data-model.objectschema",
2915
- "destination_layer": "data-model",
2162
+ "destination_spec_node_id": "application.applicationservice",
2163
+ "destination_layer": "application",
2916
2164
  "predicate": "covers",
2917
2165
  "cardinality": "many-to-many",
2918
2166
  "strength": "medium",
2919
- "required": false
2167
+ "required": false,
2168
+ "description": "The target puts the application service in test scope."
2920
2169
  },
2921
- "testing.testcoveragetarget.covers.ux.subview": {
2922
- "id": "testing.testcoveragetarget.covers.ux.subview",
2170
+ "testing.testcoveragetarget.covers.business.businessprocess": {
2171
+ "id": "testing.testcoveragetarget.covers.business.businessprocess",
2923
2172
  "source_spec_node_id": "testing.testcoveragetarget",
2924
2173
  "source_layer": "testing",
2925
- "destination_spec_node_id": "ux.subview",
2926
- "destination_layer": "ux",
2174
+ "destination_spec_node_id": "business.businessprocess",
2175
+ "destination_layer": "business",
2927
2176
  "predicate": "covers",
2928
2177
  "cardinality": "many-to-many",
2929
2178
  "strength": "medium",
2930
- "required": false
2179
+ "required": false,
2180
+ "description": "The target puts the business workflow in test scope."
2931
2181
  },
2932
- "testing.testcoveragetarget.covers.ux.view": {
2933
- "id": "testing.testcoveragetarget.covers.ux.view",
2182
+ "testing.testcoveragetarget.covers.data-store.collection": {
2183
+ "id": "testing.testcoveragetarget.covers.data-store.collection",
2934
2184
  "source_spec_node_id": "testing.testcoveragetarget",
2935
2185
  "source_layer": "testing",
2936
- "destination_spec_node_id": "ux.view",
2937
- "destination_layer": "ux",
2186
+ "destination_spec_node_id": "data-store.collection",
2187
+ "destination_layer": "data-store",
2938
2188
  "predicate": "covers",
2939
2189
  "cardinality": "many-to-many",
2940
2190
  "strength": "medium",
2941
- "required": false
2191
+ "required": false,
2192
+ "description": "The target puts the collection in test scope, such as a data migration."
2942
2193
  },
2943
- "testing.testcoveragetarget.flows-to.testing.coveragerequirement": {
2944
- "id": "testing.testcoveragetarget.flows-to.testing.coveragerequirement",
2194
+ "testing.testcoveragetarget.covers.product.feature": {
2195
+ "id": "testing.testcoveragetarget.covers.product.feature",
2945
2196
  "source_spec_node_id": "testing.testcoveragetarget",
2946
2197
  "source_layer": "testing",
2947
- "destination_spec_node_id": "testing.coveragerequirement",
2948
- "destination_layer": "testing",
2949
- "predicate": "flows-to",
2950
- "cardinality": "many-to-many",
2951
- "strength": "medium",
2952
- "required": false
2953
- },
2954
- "testing.testcoveragetarget.flows-to.testing.testcasesketch": {
2955
- "id": "testing.testcoveragetarget.flows-to.testing.testcasesketch",
2956
- "source_spec_node_id": "testing.testcoveragetarget",
2957
- "source_layer": "testing",
2958
- "destination_spec_node_id": "testing.testcasesketch",
2959
- "destination_layer": "testing",
2960
- "predicate": "flows-to",
2961
- "cardinality": "many-to-many",
2962
- "strength": "medium",
2963
- "required": false
2964
- },
2965
- "testing.testcoveragetarget.fulfills-requirements.motivation.requirement": {
2966
- "id": "testing.testcoveragetarget.fulfills-requirements.motivation.requirement",
2967
- "source_spec_node_id": "testing.testcoveragetarget",
2968
- "source_layer": "testing",
2969
- "destination_spec_node_id": "motivation.requirement",
2970
- "destination_layer": "motivation",
2971
- "predicate": "fulfills-requirements",
2198
+ "destination_spec_node_id": "product.feature",
2199
+ "destination_layer": "product",
2200
+ "predicate": "covers",
2972
2201
  "cardinality": "many-to-many",
2973
2202
  "strength": "medium",
2974
- "required": false
2203
+ "required": false,
2204
+ "description": "The target puts the feature in test scope."
2975
2205
  },
2976
- "testing.testcoveragetarget.references.business.businessprocess": {
2977
- "id": "testing.testcoveragetarget.references.business.businessprocess",
2206
+ "testing.testcoveragetarget.covers.ux.librarycomponent": {
2207
+ "id": "testing.testcoveragetarget.covers.ux.librarycomponent",
2978
2208
  "source_spec_node_id": "testing.testcoveragetarget",
2979
2209
  "source_layer": "testing",
2980
- "destination_spec_node_id": "business.businessprocess",
2981
- "destination_layer": "business",
2982
- "predicate": "references",
2210
+ "destination_spec_node_id": "ux.librarycomponent",
2211
+ "destination_layer": "ux",
2212
+ "predicate": "covers",
2983
2213
  "cardinality": "many-to-many",
2984
2214
  "strength": "medium",
2985
- "required": false
2215
+ "required": false,
2216
+ "description": "The target puts the library component in test scope."
2986
2217
  },
2987
- "testing.testcoveragetarget.references.apm.metricinstrument": {
2988
- "id": "testing.testcoveragetarget.references.apm.metricinstrument",
2218
+ "testing.testcoveragetarget.covers.data-model.objectschema": {
2219
+ "id": "testing.testcoveragetarget.covers.data-model.objectschema",
2989
2220
  "source_spec_node_id": "testing.testcoveragetarget",
2990
2221
  "source_layer": "testing",
2991
- "destination_spec_node_id": "apm.metricinstrument",
2992
- "destination_layer": "apm",
2993
- "predicate": "references",
2222
+ "destination_spec_node_id": "data-model.objectschema",
2223
+ "destination_layer": "data-model",
2224
+ "predicate": "covers",
2994
2225
  "cardinality": "many-to-many",
2995
2226
  "strength": "medium",
2996
- "required": false
2227
+ "required": false,
2228
+ "description": "The target puts the object schema in test scope, such as its validation."
2997
2229
  },
2998
- "testing.testcoveragetarget.references.technology.node": {
2999
- "id": "testing.testcoveragetarget.references.technology.node",
2230
+ "testing.testcoveragetarget.covers.api.operation": {
2231
+ "id": "testing.testcoveragetarget.covers.api.operation",
3000
2232
  "source_spec_node_id": "testing.testcoveragetarget",
3001
2233
  "source_layer": "testing",
3002
- "destination_spec_node_id": "technology.node",
3003
- "destination_layer": "technology",
3004
- "predicate": "references",
2234
+ "destination_spec_node_id": "api.operation",
2235
+ "destination_layer": "api",
2236
+ "predicate": "covers",
3005
2237
  "cardinality": "many-to-many",
3006
2238
  "strength": "medium",
3007
- "required": false
2239
+ "required": false,
2240
+ "description": "The target puts the operation in test scope."
3008
2241
  },
3009
- "testing.testcoveragetarget.references.navigation.route": {
3010
- "id": "testing.testcoveragetarget.references.navigation.route",
2242
+ "testing.testcoveragetarget.covers.navigation.route": {
2243
+ "id": "testing.testcoveragetarget.covers.navigation.route",
3011
2244
  "source_spec_node_id": "testing.testcoveragetarget",
3012
2245
  "source_layer": "testing",
3013
2246
  "destination_spec_node_id": "navigation.route",
3014
2247
  "destination_layer": "navigation",
3015
- "predicate": "references",
2248
+ "predicate": "covers",
3016
2249
  "cardinality": "many-to-many",
3017
2250
  "strength": "medium",
3018
- "required": false
2251
+ "required": false,
2252
+ "description": "The target puts the route in test scope."
3019
2253
  },
3020
- "testing.testcoveragetarget.references.security.secureresource": {
3021
- "id": "testing.testcoveragetarget.references.security.secureresource",
2254
+ "testing.testcoveragetarget.covers.security.secureresource": {
2255
+ "id": "testing.testcoveragetarget.covers.security.secureresource",
3022
2256
  "source_spec_node_id": "testing.testcoveragetarget",
3023
2257
  "source_layer": "testing",
3024
2258
  "destination_spec_node_id": "security.secureresource",
3025
2259
  "destination_layer": "security",
3026
- "predicate": "references",
3027
- "cardinality": "many-to-many",
3028
- "strength": "medium",
3029
- "required": false
3030
- },
3031
- "testing.testcoveragetarget.references.technology.systemsoftware": {
3032
- "id": "testing.testcoveragetarget.references.technology.systemsoftware",
3033
- "source_spec_node_id": "testing.testcoveragetarget",
3034
- "source_layer": "testing",
3035
- "destination_spec_node_id": "technology.systemsoftware",
3036
- "destination_layer": "technology",
3037
- "predicate": "references",
3038
- "cardinality": "many-to-many",
3039
- "strength": "medium",
3040
- "required": false
3041
- },
3042
- "testing.testcoveragetarget.references.technology.technologyservice": {
3043
- "id": "testing.testcoveragetarget.references.technology.technologyservice",
3044
- "source_spec_node_id": "testing.testcoveragetarget",
3045
- "source_layer": "testing",
3046
- "destination_spec_node_id": "technology.technologyservice",
3047
- "destination_layer": "technology",
3048
- "predicate": "references",
2260
+ "predicate": "covers",
3049
2261
  "cardinality": "many-to-many",
3050
2262
  "strength": "medium",
3051
- "required": false
2263
+ "required": false,
2264
+ "description": "The target puts the protected resource in test scope, such as its access rules."
3052
2265
  },
3053
- "testing.testcoveragetarget.supports-goals.motivation.goal": {
3054
- "id": "testing.testcoveragetarget.supports-goals.motivation.goal",
2266
+ "testing.testcoveragetarget.covers.data-store.storedlogic": {
2267
+ "id": "testing.testcoveragetarget.covers.data-store.storedlogic",
3055
2268
  "source_spec_node_id": "testing.testcoveragetarget",
3056
2269
  "source_layer": "testing",
3057
- "destination_spec_node_id": "motivation.goal",
3058
- "destination_layer": "motivation",
3059
- "predicate": "supports-goals",
2270
+ "destination_spec_node_id": "data-store.storedlogic",
2271
+ "destination_layer": "data-store",
2272
+ "predicate": "covers",
3060
2273
  "cardinality": "many-to-many",
3061
2274
  "strength": "medium",
3062
- "required": false
2275
+ "required": false,
2276
+ "description": "The target puts the stored procedure or trigger in test scope."
3063
2277
  },
3064
- "testing.testcoveragetarget.tests.application.applicationcomponent": {
3065
- "id": "testing.testcoveragetarget.tests.application.applicationcomponent",
2278
+ "testing.testcoveragetarget.covers.ux.subview": {
2279
+ "id": "testing.testcoveragetarget.covers.ux.subview",
3066
2280
  "source_spec_node_id": "testing.testcoveragetarget",
3067
2281
  "source_layer": "testing",
3068
- "destination_spec_node_id": "application.applicationcomponent",
3069
- "destination_layer": "application",
3070
- "predicate": "tests",
2282
+ "destination_spec_node_id": "ux.subview",
2283
+ "destination_layer": "ux",
2284
+ "predicate": "covers",
3071
2285
  "cardinality": "many-to-many",
3072
2286
  "strength": "medium",
3073
- "required": false
2287
+ "required": false,
2288
+ "description": "The target puts the subview in test scope."
3074
2289
  },
3075
- "testing.testcoveragetarget.tests.data-store.collection": {
3076
- "id": "testing.testcoveragetarget.tests.data-store.collection",
2290
+ "testing.testcoveragetarget.covers.technology.systemsoftware": {
2291
+ "id": "testing.testcoveragetarget.covers.technology.systemsoftware",
3077
2292
  "source_spec_node_id": "testing.testcoveragetarget",
3078
2293
  "source_layer": "testing",
3079
- "destination_spec_node_id": "data-store.collection",
3080
- "destination_layer": "data-store",
3081
- "predicate": "tests",
2294
+ "destination_spec_node_id": "technology.systemsoftware",
2295
+ "destination_layer": "technology",
2296
+ "predicate": "covers",
3082
2297
  "cardinality": "many-to-many",
3083
2298
  "strength": "medium",
3084
- "required": false
2299
+ "required": false,
2300
+ "description": "The target puts the library or runtime in test scope, such as a shared client library."
3085
2301
  },
3086
- "testing.testcoveragetarget.tests.api.operation": {
3087
- "id": "testing.testcoveragetarget.tests.api.operation",
2302
+ "testing.testcoveragetarget.covers.technology.technologyservice": {
2303
+ "id": "testing.testcoveragetarget.covers.technology.technologyservice",
3088
2304
  "source_spec_node_id": "testing.testcoveragetarget",
3089
2305
  "source_layer": "testing",
3090
- "destination_spec_node_id": "api.operation",
3091
- "destination_layer": "api",
3092
- "predicate": "tests",
2306
+ "destination_spec_node_id": "technology.technologyservice",
2307
+ "destination_layer": "technology",
2308
+ "predicate": "covers",
3093
2309
  "cardinality": "many-to-many",
3094
2310
  "strength": "medium",
3095
- "required": false
2311
+ "required": false,
2312
+ "description": "The target puts the platform service in test scope, such as an integration with a queue."
3096
2313
  },
3097
- "testing.testcoveragetarget.tests.data-store.storedlogic": {
3098
- "id": "testing.testcoveragetarget.tests.data-store.storedlogic",
2314
+ "testing.testcoveragetarget.covers.ux.view": {
2315
+ "id": "testing.testcoveragetarget.covers.ux.view",
3099
2316
  "source_spec_node_id": "testing.testcoveragetarget",
3100
2317
  "source_layer": "testing",
3101
- "destination_spec_node_id": "data-store.storedlogic",
3102
- "destination_layer": "data-store",
3103
- "predicate": "tests",
2318
+ "destination_spec_node_id": "ux.view",
2319
+ "destination_layer": "ux",
2320
+ "predicate": "covers",
3104
2321
  "cardinality": "many-to-many",
3105
2322
  "strength": "medium",
3106
- "required": false
2323
+ "required": false,
2324
+ "description": "The target puts the view in test scope."
3107
2325
  },
3108
- "testing.testcoveragetarget.tests.data-store.view": {
3109
- "id": "testing.testcoveragetarget.tests.data-store.view",
2326
+ "testing.testcoveragetarget.references.testing.contextvariation": {
2327
+ "id": "testing.testcoveragetarget.references.testing.contextvariation",
3110
2328
  "source_spec_node_id": "testing.testcoveragetarget",
3111
2329
  "source_layer": "testing",
3112
- "destination_spec_node_id": "data-store.view",
3113
- "destination_layer": "data-store",
3114
- "predicate": "tests",
2330
+ "destination_spec_node_id": "testing.contextvariation",
2331
+ "destination_layer": "testing",
2332
+ "predicate": "references",
3115
2333
  "cardinality": "many-to-many",
3116
2334
  "strength": "medium",
3117
- "required": false
2335
+ "required": false,
2336
+ "description": "The target is exercised under the context variation."
3118
2337
  }
3119
2338
  }
3120
2339
  }