@memoarchitect/ontology 0.13.2 → 0.15.1

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 (315) hide show
  1. package/README.md +5 -3
  2. package/examples/connected-patient-monitor/memo.identity.yaml +34 -0
  3. package/examples/connected-patient-monitor/memo.package.yaml +3 -1
  4. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +17 -12
  5. package/examples/connected-patient-monitor/model/{catalog → methodology}/project.sysml +4 -5
  6. package/examples/embedded-infusion-pump/memo.package.yaml +3 -1
  7. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +6 -6
  8. package/examples/embedded-infusion-pump/model/{catalog → methodology}/project.sysml +4 -5
  9. package/examples/functional-logical-physical/memo.identity.yaml +28 -0
  10. package/examples/functional-logical-physical/memo.package.yaml +3 -1
  11. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
  12. package/examples/functional-logical-physical/model/{catalog → methodology}/project.sysml +4 -5
  13. package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +40 -139
  14. package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +38 -290
  15. package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +47 -217
  16. package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +50 -191
  17. package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +42 -181
  18. package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +40 -164
  19. package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +51 -172
  20. package/examples/gpca-pump/analysis/Samples/README.md +15 -9
  21. package/examples/gpca-pump/analysis/memo_model.py +243 -0
  22. package/examples/gpca-pump/memo.identity.yaml +521 -26
  23. package/examples/gpca-pump/memo.package.yaml +3 -1
  24. package/examples/gpca-pump/methodology/gpca_profiles.sysml +56 -47
  25. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +51 -78
  26. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +359 -357
  27. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +9 -9
  28. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +56 -69
  29. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +44 -59
  30. package/examples/gpca-pump/model/catalog/gpca_context.sysml +23 -35
  31. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +33 -40
  32. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +62 -63
  33. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +362 -483
  34. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +45 -70
  35. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +6 -12
  36. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +173 -169
  37. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +139 -225
  38. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +43 -47
  39. package/examples/gpca-pump/model/catalog/gpca_system.sysml +68 -65
  40. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +147 -116
  41. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +65 -90
  42. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +4 -6
  43. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +4 -6
  44. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +4 -6
  45. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +4 -6
  46. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +2 -4
  47. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +7 -6
  48. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +4 -6
  49. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -6
  50. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
  51. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +4 -6
  52. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +4 -6
  53. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +3 -5
  54. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +3 -5
  55. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +4 -6
  56. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +2 -4
  57. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +3 -5
  58. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +2 -4
  59. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +4 -6
  60. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -6
  61. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
  62. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +4 -6
  63. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +4 -6
  64. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
  65. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -6
  66. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +3 -5
  67. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
  68. package/examples/gpca-pump/model/{catalog → methodology}/project.sysml +8 -6
  69. package/examples/ivd-laboratory-system/memo.package.yaml +3 -1
  70. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +12 -9
  71. package/examples/ivd-laboratory-system/model/{catalog → methodology}/project.sysml +4 -5
  72. package/examples/manual-surgical-instrument/memo.package.yaml +3 -1
  73. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +2 -6
  74. package/examples/manual-surgical-instrument/model/{catalog → methodology}/project.sysml +4 -5
  75. package/examples/multidimensional-layers/memo.package.yaml +3 -1
  76. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +2 -4
  77. package/examples/multidimensional-layers/model/{catalog → methodology}/project.sysml +4 -5
  78. package/examples/nested-architecture-dsm/memo.identity.yaml +93 -0
  79. package/examples/nested-architecture-dsm/memo.package.yaml +3 -1
  80. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +30 -30
  81. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +28 -28
  82. package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +2 -4
  83. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +4 -4
  84. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +7 -7
  85. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +8 -8
  86. package/examples/nested-architecture-dsm/model/{catalog → methodology}/project.sysml +4 -5
  87. package/examples/reusable-instrument/memo.package.yaml +3 -1
  88. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -7
  89. package/examples/reusable-instrument/model/{catalog → methodology}/project.sysml +4 -5
  90. package/examples/robot-cell-family/README.md +34 -0
  91. package/examples/robot-cell-family/memo.identity.yaml +142 -0
  92. package/examples/robot-cell-family/memo.package.yaml +7 -0
  93. package/examples/robot-cell-family/model/methodology/project.sysml +30 -0
  94. package/examples/robot-cell-family/model/shared/shared.sysml +53 -0
  95. package/examples/robot-cell-family/model/sos/chains.sysml +36 -0
  96. package/examples/robot-cell-family/model/sos/icds.sysml +29 -0
  97. package/examples/robot-cell-family/model/sos/sos.sysml +31 -0
  98. package/examples/robot-cell-family/model/sos/use_cases.sysml +25 -0
  99. package/examples/robot-cell-family/model/systems/manipulation/manipulation_system.sysml +35 -0
  100. package/examples/robot-cell-family/model/systems/navigation/navigation_system.sysml +46 -0
  101. package/examples/robot-cell-family/model/systems/perception/perception_system.sysml +37 -0
  102. package/examples/robot-platform/memo.package.yaml +3 -0
  103. package/examples/robot-platform/model/platform.sysml +15 -0
  104. package/examples/ros-mobile-robot/README.md +5 -4
  105. package/examples/ros-mobile-robot/memo.identity.yaml +94 -0
  106. package/examples/ros-mobile-robot/memo.package.yaml +3 -1
  107. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +26 -29
  108. package/examples/ros-mobile-robot/model/{catalog → methodology}/project.sysml +8 -14
  109. package/examples/software-only-medical-device/memo.package.yaml +3 -1
  110. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +9 -10
  111. package/examples/software-only-medical-device/model/{catalog → methodology}/project.sysml +8 -9
  112. package/examples/surgical-closure-workflow/memo.package.yaml +3 -1
  113. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +23 -26
  114. package/examples/surgical-closure-workflow/model/{catalog → methodology}/project.sysml +7 -5
  115. package/examples/surgical-robot/memo.package.yaml +3 -1
  116. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +14 -12
  117. package/examples/surgical-robot/model/{catalog → methodology}/project.sysml +4 -5
  118. package/examples/sysml-diagram-samples/README.md +1 -0
  119. package/examples/sysml-diagram-samples/memo.identity.yaml +459 -0
  120. package/examples/sysml-diagram-samples/memo.package.yaml +3 -1
  121. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +10 -20
  122. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +5 -5
  123. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +10 -13
  124. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +11 -7
  125. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +63 -8
  126. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/drill_down_view.sysml +88 -0
  127. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +25 -25
  128. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +6 -6
  129. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +15 -17
  130. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +21 -21
  131. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +7 -7
  132. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +5 -5
  133. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +14 -14
  134. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +16 -17
  135. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +9 -9
  136. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +7 -14
  137. package/examples/sysml-diagram-samples/model/{catalog → methodology}/project.sysml +5 -5
  138. package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +1 -1
  139. package/examples/temperature-alarm/memo.identity.yaml +6 -0
  140. package/examples/temperature-alarm/memo.package.yaml +3 -1
  141. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +43 -21
  142. package/examples/temperature-alarm/model/{catalog → methodology}/project.sysml +4 -5
  143. package/examples/ui-screen-regions/memo.identity.yaml +33 -0
  144. package/examples/ui-screen-regions/memo.package.yaml +3 -1
  145. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +12 -12
  146. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +18 -18
  147. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +6 -6
  148. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +3 -3
  149. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +1 -1
  150. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +1 -1
  151. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +10 -10
  152. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +1 -1
  153. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
  154. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +15 -15
  155. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +6 -6
  156. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -2
  157. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
  158. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
  159. package/examples/ui-screen-regions/model/{catalog → methodology}/project.sysml +4 -5
  160. package/extensions/README.md +65 -16
  161. package/extensions/aadl/memo.package.yaml +1 -1
  162. package/extensions/aadl/src/aadl_extension.sysml +5 -2
  163. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +29 -50
  164. package/extensions/clinical/memo.package.yaml +1 -1
  165. package/extensions/clinical/src/clinical_extension.sysml +2 -0
  166. package/extensions/cloud/memo.package.yaml +1 -1
  167. package/extensions/container/memo.package.yaml +1 -1
  168. package/extensions/messaging/memo.package.yaml +1 -1
  169. package/extensions/messaging/src/messaging_extension.sysml +2 -2
  170. package/extensions/ros/memo.package.yaml +1 -1
  171. package/extensions/ros/src/ros_extension.sysml +25 -24
  172. package/extensions/template/memo.package.yaml +1 -1
  173. package/extensions/template/model/extension.sysml +25 -0
  174. package/memo.manifest.yaml +1 -7
  175. package/methodologies/default/memo.package.yaml +1 -1
  176. package/methodologies/gpca/memo.package.yaml +1 -1
  177. package/ontology/memo.package.yaml +1 -1
  178. package/package.json +6 -4
  179. package/profile/memo.package.yaml +1 -1
  180. package/src/architecture/decisions/memo_decisions.sysml +9 -2
  181. package/src/architecture/functional/behavior/memo_behavior.sysml +27 -7
  182. package/src/architecture/functional/functions/memo_functions.sysml +45 -31
  183. package/src/architecture/functional/memo_architecture_functional.sysml +14 -0
  184. package/src/architecture/implementation/memo_architecture_implementation.sysml +21 -0
  185. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +7 -0
  186. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +58 -17
  187. package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
  188. package/src/architecture/logical/interfaces/memo_interfaces.sysml +67 -58
  189. package/src/architecture/logical/memo_architecture_logical.sysml +13 -0
  190. package/src/architecture/logical/structure/memo_logical_structure.sysml +27 -8
  191. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +4 -1
  192. package/src/architecture/operational/memo_architecture_operational.sysml +19 -0
  193. package/src/architecture/operational/scenarios/memo_scenarios.sysml +9 -8
  194. package/src/architecture/operational/structure/memo_operational.sysml +5 -2
  195. package/src/architecture/operational/use_cases/memo_use_cases.sysml +16 -8
  196. package/src/architecture/realization/deployment/memo_deployment.sysml +30 -10
  197. package/src/architecture/realization/memo_architecture_realization.sysml +13 -0
  198. package/src/architecture/realization/physical/memo_physical_architecture.sysml +61 -0
  199. package/src/architecture/variability/memo_variability.sysml +87 -0
  200. package/src/artifacts/configuration_management/memo_configuration_management.sysml +95 -3
  201. package/src/artifacts/core/memo_controlled_artifacts.sysml +4 -2
  202. package/src/artifacts/standards/cfr_21_820.sysml +12 -24
  203. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +13 -20
  204. package/src/artifacts/standards/iec_60601_1.sysml +16 -32
  205. package/src/artifacts/standards/iec_60601_1_2.sysml +5 -10
  206. package/src/artifacts/standards/iec_60812.sysml +4 -8
  207. package/src/artifacts/standards/iec_62304.sysml +607 -47
  208. package/src/artifacts/standards/iec_62366_1.sysml +12 -24
  209. package/src/artifacts/standards/iec_81001_5_1.sysml +8 -16
  210. package/src/artifacts/standards/iso_13485.sysml +12 -24
  211. package/src/artifacts/standards/iso_14971.sysml +118 -20
  212. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +3 -6
  213. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +14 -4
  214. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +1 -2
  215. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +1 -2
  216. package/src/artifacts/templates/dhf/iec-62304/sad.md +1 -2
  217. package/src/artifacts/templates/dhf/iec-62304/sbom.md +1 -2
  218. package/src/artifacts/templates/dhf/iec-62304/sdp.md +1 -2
  219. package/src/artifacts/templates/dhf/iec-62304/soup.md +3 -5
  220. package/src/artifacts/templates/dhf/system/sad.md +1 -1
  221. package/src/artifacts/templates/dhf/system/standards-checklist.md +2 -2
  222. package/src/artifacts/templates/dhf/system/standards-traceability.md +1 -1
  223. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +339 -13
  224. package/src/assurance/human_factors/memo_human_factors.sysml +6 -2
  225. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +7 -3
  226. package/src/assurance/safety_risk/memo_risk.sysml +39 -1
  227. package/src/core/common/memo_common.sysml +61 -68
  228. package/src/core/enumerations/memo_enumerations.sysml +93 -9
  229. package/src/core/relationships/memo_relationships.sysml +17 -11
  230. package/src/core/relationships/memo_workspace_membership.sysml +284 -0
  231. package/src/core/semantics/semantics.sysml +58 -0
  232. package/src/core/terminology/terminology.sysml +7 -0
  233. package/src/memo_namespaces.sysml +6 -0
  234. package/src/methodology/archetypes/memo_archetypes.sysml +8 -16
  235. package/src/methodology/core/memo_core.sysml +85 -29
  236. package/src/methodology/profiles/memo_profiles.sysml +217 -61
  237. package/src/methodology/workflow/memo_workflow.sysml +28 -0
  238. package/src/rules/closure/closure_rules.sysml +250 -4
  239. package/src/rules/crosslayer/cross_layer_rules.sysml +11 -0
  240. package/src/rules/ontology/ontology_invariants.sysml +288 -48
  241. package/src/rules/quantitative/quantitative_rules.sysml +4 -0
  242. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +28 -28
  243. package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
  244. package/src/viewpoints/context/context_viewpoint.sysml +2 -3
  245. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
  246. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -3
  247. package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
  248. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +0 -4
  249. package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
  250. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -4
  251. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -4
  252. package/src/viewpoints/logical/logical_viewpoint.sysml +2 -3
  253. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
  254. package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
  255. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
  256. package/src/viewpoints/physical/physical_viewpoint.sysml +2 -3
  257. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +2 -4
  258. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +2 -4
  259. package/src/viewpoints/rendering/memo_rendering.sysml +50 -98
  260. package/src/viewpoints/requirements/requirements_viewpoint.sysml +2 -3
  261. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
  262. package/src/viewpoints/risk/risk_viewpoint.sysml +2 -3
  263. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
  264. package/src/viewpoints/software/software_viewpoint.sysml +2 -3
  265. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
  266. package/src/viewpoints/stakeholders_concerns/memo_stakeholders_concerns.sysml +11 -29
  267. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
  268. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
  269. package/src/viewpoints/usability/usability_viewpoint.sysml +2 -3
  270. package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
  271. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -4
  272. package/stage1/syside-67f92dc96ba75cd05b5c8d13.ids.gz +0 -0
  273. package/stage1/syside-67f92dc96ba75cd05b5c8d13.json.gz +0 -0
  274. package/templates/default/memo.package.yaml +6 -1
  275. package/templates/default/model/catalog/architecture/system.sysml +7 -3
  276. package/templates/default/model/{catalog → methodology}/project.sysml +3 -4
  277. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +0 -47
  278. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +0 -94
  279. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +0 -13
  280. package/examples/ui-screen-regions/model/catalog/relationships.sysml +0 -8
  281. package/extensions/aadl/src/methodology/aadl_methodology.sysml +0 -19
  282. package/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -24
  283. package/extensions/cloud/src/methodology/cloud_methodology.sysml +0 -19
  284. package/extensions/container/src/methodology/container_methodology.sysml +0 -19
  285. package/extensions/messaging/src/methodology/messaging_methodology.sysml +0 -19
  286. package/extensions/ros/src/methodology/ros_methodology.sysml +0 -27
  287. package/extensions/template/src/extension.sysml +0 -39
  288. package/templates/connected-device/memo.package.yaml +0 -13
  289. package/templates/connected-device/model/catalog/architecture/system.sysml +0 -5
  290. package/templates/connected-device/model/catalog/artifacts/catalog.sysml +0 -5
  291. package/templates/connected-device/model/catalog/assurance/requirements.sysml +0 -7
  292. package/templates/connected-device/model/catalog/project.sysml +0 -30
  293. package/templates/connected-device/package.json +0 -8
  294. package/templates/connected-device/syside.toml +0 -13
  295. package/templates/infusion-pump/memo.package.yaml +0 -13
  296. package/templates/infusion-pump/model/catalog/architecture/system.sysml +0 -5
  297. package/templates/infusion-pump/model/catalog/artifacts/catalog.sysml +0 -5
  298. package/templates/infusion-pump/model/catalog/assurance/requirements.sysml +0 -7
  299. package/templates/infusion-pump/model/catalog/project.sysml +0 -30
  300. package/templates/infusion-pump/package.json +0 -8
  301. package/templates/infusion-pump/syside.toml +0 -13
  302. package/templates/monitoring-device/memo.package.yaml +0 -13
  303. package/templates/monitoring-device/model/catalog/architecture/system.sysml +0 -5
  304. package/templates/monitoring-device/model/catalog/artifacts/catalog.sysml +0 -5
  305. package/templates/monitoring-device/model/catalog/assurance/requirements.sysml +0 -7
  306. package/templates/monitoring-device/model/catalog/project.sysml +0 -30
  307. package/templates/monitoring-device/package.json +0 -8
  308. package/templates/monitoring-device/syside.toml +0 -13
  309. package/templates/samd/memo.package.yaml +0 -13
  310. package/templates/samd/model/catalog/architecture/system.sysml +0 -5
  311. package/templates/samd/model/catalog/artifacts/catalog.sysml +0 -5
  312. package/templates/samd/model/catalog/assurance/requirements.sysml +0 -7
  313. package/templates/samd/model/catalog/project.sysml +0 -30
  314. package/templates/samd/package.json +0 -8
  315. package/templates/samd/syside.toml +0 -13
@@ -9,69 +9,96 @@ package memo_rules_closure {
9
9
 
10
10
  private import memo_core_common::*;
11
11
  private import memo_core_common::MemoIdentity;
12
+ private import memo_artifacts_standards_traceability::EnforcesClause;
13
+ private import memo_artifacts_standards_fda_cybersecurity_2023::*;
14
+ private import memo_artifacts_standards_iec_62304::*;
15
+ private import memo_artifacts_standards_iec_62366_1::*;
16
+ private import memo_artifacts_standards_iso_13485::*;
17
+ private import memo_artifacts_standards_iso_14971::*;
12
18
  // ─── Risk Layer Rules ────────────────────────────────────────────────
13
19
 
14
20
  constraint def HazardMitigationRule :> MemoConsistencyRule {
15
21
  @MemoIdentity { :>> providedId = "CR-MED-001"; }
16
22
  attribute tailoring = RuleTailoringKind::assurance;
23
+ attribute domain = RuleDomainKind::medicalDevice;
24
+ attribute obligation = RuleObligationKind::required;
17
25
  attribute appliesTo = "Hazard";
18
26
  attribute severity = RuleSeverityKind::error;
19
27
  attribute rationaleText = "ISO 14971 requires each identified hazard to have risk control measures.";
20
28
  attribute predicateExpression = "mitigates->size() >= 1";
21
29
  constraint { true }
22
30
  }
31
+ #EnforcesClause dependency from HazardMitigationRule to iso14971::iso14971Clause7::iso14971Clause7_1;
23
32
 
24
33
  constraint def HazardSeverityRule :> MemoConsistencyRule {
25
34
  @MemoIdentity { :>> providedId = "CR-MED-002"; }
26
35
  attribute tailoring = RuleTailoringKind::assurance;
36
+ attribute domain = RuleDomainKind::medicalDevice;
37
+ attribute obligation = RuleObligationKind::required;
27
38
  attribute appliesTo = "Hazard";
28
39
  attribute severity = RuleSeverityKind::error;
29
40
  attribute rationaleText = "Hazard severity is required for risk estimation per ISO 14971.";
30
41
  attribute predicateExpression = "attributes.severity != ''";
31
42
  constraint { true }
32
43
  }
44
+ #EnforcesClause dependency from HazardSeverityRule to iso14971::iso14971Clause5::iso14971Clause5_5;
33
45
 
34
46
  constraint def RiskControlVerificationRule :> MemoConsistencyRule {
35
47
  @MemoIdentity { :>> providedId = "CR-MED-003"; }
36
48
  attribute tailoring = RuleTailoringKind::assurance;
49
+ attribute domain = RuleDomainKind::medicalDevice;
50
+ attribute obligation = RuleObligationKind::required;
51
+ // Note: ISO 14971:2019 puts verification of the implementation and effectiveness of a risk control measure in 7.2; the rule text used to say 7.4, which is benefit-risk analysis.
37
52
  attribute appliesTo = "RiskControlMeasure";
38
53
  attribute severity = RuleSeverityKind::error;
39
- attribute rationaleText = "Risk controls shall be verified per ISO 14971 clause 7.4.";
54
+ attribute rationaleText = "Risk controls shall be verified per ISO 14971 clause 7.2.";
40
55
  attribute predicateExpression = "verifiedBy->size() >= 1";
41
56
  constraint { true }
42
57
  }
58
+ #EnforcesClause dependency from RiskControlVerificationRule to iso14971::iso14971Clause7::iso14971Clause7_2;
43
59
 
44
60
  constraint def InitialRiskMatrixRule :> MemoConsistencyRule {
45
61
  @MemoIdentity { :>> providedId = "CR-MED-004"; }
46
62
  attribute tailoring = RuleTailoringKind::assurance;
63
+ attribute domain = RuleDomainKind::medicalDevice;
64
+ attribute obligation = RuleObligationKind::required;
65
+ // To confirm: inferred from the clause scope, the rule text names no clause; confirm.
47
66
  attribute appliesTo = "Risk";
48
67
  attribute severity = RuleSeverityKind::warning;
49
68
  attribute rationaleText = "Pre-mitigation risk must be assessed against a risk acceptability matrix.";
50
69
  attribute predicateExpression = "assessedAgainst->size() >= 1";
51
70
  constraint { true }
52
71
  }
72
+ #EnforcesClause dependency from InitialRiskMatrixRule to iso14971::iso14971Clause6;
53
73
 
54
74
  // ─── Requirements Layer Rules ────────────────────────────────────────
55
75
 
56
76
  constraint def SysReqTraceRule :> MemoConsistencyRule {
57
77
  @MemoIdentity { :>> providedId = "CR-MED-010"; }
58
78
  attribute tailoring = RuleTailoringKind::assurance;
79
+ attribute domain = RuleDomainKind::medicalDevice;
80
+ attribute obligation = RuleObligationKind::required;
81
+ // To confirm: inferred from the clause scope; confirm.
59
82
  attribute appliesTo = "Requirement[requirementType=system]";
60
83
  attribute severity = RuleSeverityKind::error;
61
84
  attribute rationaleText = "Requirements shall be traceable to stakeholder needs per ISO 13485.";
62
85
  attribute predicateExpression = "derivesFrom->size() >= 1";
63
86
  constraint { true }
64
87
  }
88
+ #EnforcesClause dependency from SysReqTraceRule to iso13485::iso13485Clause7::iso13485Clause7_3::iso13485Clause7_3_3;
65
89
 
66
90
  constraint def SwReqTraceRule :> MemoConsistencyRule {
67
91
  @MemoIdentity { :>> providedId = "CR-MED-011"; }
68
92
  attribute tailoring = RuleTailoringKind::assurance;
93
+ attribute domain = RuleDomainKind::medicalDevice;
94
+ attribute obligation = RuleObligationKind::required;
69
95
  attribute appliesTo = "Requirement[requirementType=software]";
70
96
  attribute severity = RuleSeverityKind::error;
71
97
  attribute rationaleText = "Software requirements derive from system requirements per IEC 62304.";
72
98
  attribute predicateExpression = "derivesFrom->size() >= 1";
73
99
  constraint { true }
74
100
  }
101
+ #EnforcesClause dependency from SwReqTraceRule to iec62304::iec62304Clause5::iec62304Clause5_2::iec62304Clause5_2_1;
75
102
 
76
103
  // CR-MED-012 (RequirementIdMustBeUnique) is intentionally omitted from the native
77
104
  // constraint set: cross-element uniqueness is not a single-subject predicate and
@@ -84,16 +111,21 @@ package memo_rules_closure {
84
111
  constraint def SwComponentSafetyClassRule :> MemoConsistencyRule {
85
112
  @MemoIdentity { :>> providedId = "CR-MED-020"; }
86
113
  attribute tailoring = RuleTailoringKind::assurance;
114
+ attribute domain = RuleDomainKind::medicalDevice;
115
+ attribute obligation = RuleObligationKind::required;
87
116
  attribute appliesTo = "SoftwareModule";
88
117
  attribute severity = RuleSeverityKind::error;
89
118
  attribute rationaleText = "IEC 62304 requires safety classification for all software items.";
90
119
  attribute predicateExpression = "attributes.safetyClass != ''";
91
120
  constraint { true }
92
121
  }
122
+ #EnforcesClause dependency from SwComponentSafetyClassRule to iec62304::iec62304Clause4::iec62304Clause4_3;
93
123
 
94
124
  constraint def SwComponentReqRule :> MemoConsistencyRule {
95
125
  @MemoIdentity { :>> providedId = "CR-MED-021"; }
96
126
  attribute tailoring = RuleTailoringKind::assurance;
127
+ attribute domain = RuleDomainKind::medicalDevice;
128
+ attribute obligation = RuleObligationKind::recommended;
97
129
  attribute appliesTo = "SoftwareModule";
98
130
  attribute severity = RuleSeverityKind::warning;
99
131
  attribute rationaleText = "Software items shall be linked to their requirements per IEC 62304.";
@@ -104,6 +136,8 @@ package memo_rules_closure {
104
136
  constraint def LogicalFunctionAllocationRule :> MemoConsistencyRule {
105
137
  @MemoIdentity { :>> providedId = "CR-MED-022"; }
106
138
  attribute tailoring = RuleTailoringKind::assurance;
139
+ attribute domain = RuleDomainKind::modelling;
140
+ attribute obligation = RuleObligationKind::recommended;
107
141
  attribute appliesTo = "SystemFunction";
108
142
  attribute severity = RuleSeverityKind::warning;
109
143
  attribute rationaleText = "Functions should be allocated to implementation elements.";
@@ -120,14 +154,22 @@ package memo_rules_closure {
120
154
  constraint def FunctionInChainRule :> MemoConsistencyRule {
121
155
  @MemoIdentity { :>> providedId = "CR-MED-023"; }
122
156
  attribute tailoring = RuleTailoringKind::assurance;
157
+ attribute domain = RuleDomainKind::modelling;
158
+ attribute obligation = RuleObligationKind::recommended;
123
159
  attribute appliesTo = "MemoFunction";
124
160
  attribute severity = RuleSeverityKind::warning;
125
- attribute rationaleText = "A function participates in the functional chain through a flow or a succession, or through the functions it decomposes into. One that participates in none of them is unreachable behaviour: nothing triggers it and nothing consumes what it produces.";
161
+ attribute rationaleText = "A function participates in the functional chain through a flow or a succession, through the functions it decomposes into, or by being performed — by a functional chain, or by the action that triggers it. One that participates in none of them is unreachable behaviour: nothing triggers it and nothing consumes what it produces.";
126
162
  // `downstream` and not a bare `composes`: the relation navigates both
127
163
  // ways, so a bare name would exempt every child on the strength of
128
164
  // having a parent. A decomposed function participates through its
129
165
  // parts; a leaf has to be reached by an edge of its own.
130
- attribute predicateExpression = "flow->size() >= 1 or succession->size() >= 1 or downstream(composes)->size() >= 1";
166
+ //
167
+ // `upstream(performs)`: a `perform` IS participation. A functional
168
+ // chain names its steps that way, and a UI action performing a
169
+ // function is what triggers it. Without it the rule reported gpca-pump's
170
+ // startup chain's own two steps, and ui-screen-regions' two functions
171
+ // that a control invokes, as reached by nothing.
172
+ attribute predicateExpression = "flow->size() >= 1 or succession->size() >= 1 or downstream(composes)->size() >= 1 or upstream(performs)->size() >= 1";
131
173
  constraint { true }
132
174
  }
133
175
 
@@ -138,18 +180,23 @@ package memo_rules_closure {
138
180
  constraint def UserNeedIdentifiesUserRule :> MemoConsistencyRule {
139
181
  @MemoIdentity { :>> providedId = "CR-MED-024"; }
140
182
  attribute tailoring = RuleTailoringKind::assurance;
183
+ attribute domain = RuleDomainKind::medicalDevice;
184
+ attribute obligation = RuleObligationKind::required;
141
185
  attribute appliesTo = "Need";
142
186
  attribute severity = RuleSeverityKind::warning;
143
187
  attribute rationaleText = "A user need is a need someone has. Which users a device serves, and what they can be assumed to see, know and do, is the input a usability engineering file is built from (IEC 62366-1 5.1); a need that names no user leaves that input to prose.";
144
188
  attribute predicateExpression = "not(needKind == 'user' or needKind == 'clinicalUser' or needKind == 'patientUser') or heldBy->size() >= 1";
145
189
  constraint { true }
146
190
  }
191
+ #EnforcesClause dependency from UserNeedIdentifiesUserRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_1;
147
192
 
148
193
  // ─── Verification Layer Rules ────────────────────────────────────────
149
194
 
150
195
  constraint def VerificationCaseMethodRule :> MemoConsistencyRule {
151
196
  @MemoIdentity { :>> providedId = "CR-MED-030"; }
152
197
  attribute tailoring = RuleTailoringKind::assurance;
198
+ attribute domain = RuleDomainKind::medicalDevice;
199
+ attribute obligation = RuleObligationKind::recommended;
153
200
  attribute appliesTo = "VerificationCase";
154
201
  attribute severity = RuleSeverityKind::error;
155
202
  attribute rationaleText = "Verification method (test, analysis, inspection, demonstration) required per IEC 62304.";
@@ -160,6 +207,8 @@ package memo_rules_closure {
160
207
  constraint def VerificationCaseTargetRule :> MemoConsistencyRule {
161
208
  @MemoIdentity { :>> providedId = "CR-MED-031"; }
162
209
  attribute tailoring = RuleTailoringKind::assurance;
210
+ attribute domain = RuleDomainKind::medicalDevice;
211
+ attribute obligation = RuleObligationKind::recommended;
163
212
  attribute appliesTo = "VerificationCase";
164
213
  attribute severity = RuleSeverityKind::error;
165
214
  attribute rationaleText = "Verification cases must be linked to verifiable items.";
@@ -170,6 +219,8 @@ package memo_rules_closure {
170
219
  constraint def EvidenceProductionRule :> MemoConsistencyRule {
171
220
  @MemoIdentity { :>> providedId = "CR-MED-032"; }
172
221
  attribute tailoring = RuleTailoringKind::assurance;
222
+ attribute domain = RuleDomainKind::medicalDevice;
223
+ attribute obligation = RuleObligationKind::recommended;
173
224
  attribute appliesTo = "VerificationCase";
174
225
  attribute severity = RuleSeverityKind::warning;
175
226
  attribute rationaleText = "Verification results should be documented as evidence records.";
@@ -182,32 +233,42 @@ package memo_rules_closure {
182
233
  constraint def ThreatMitigationRule :> MemoConsistencyRule {
183
234
  @MemoIdentity { :>> providedId = "CR-MED-040"; }
184
235
  attribute tailoring = RuleTailoringKind::assurance;
236
+ attribute domain = RuleDomainKind::medicalDevice;
237
+ attribute obligation = RuleObligationKind::required;
238
+ // To confirm: inferred from the section scope; confirm.
185
239
  attribute appliesTo = "Threat";
186
240
  attribute severity = RuleSeverityKind::error;
187
241
  attribute rationaleText = "FDA cybersecurity guidance requires threat mitigation.";
188
242
  attribute predicateExpression = "derivesCyberRequirement->size() >= 1";
189
243
  constraint { true }
190
244
  }
245
+ #EnforcesClause dependency from ThreatMitigationRule to fdaCybersecurity2023::fdaCyberSection5::fdaCyberSection5A;
191
246
 
192
247
  constraint def AssetThreatLinkRule :> MemoConsistencyRule {
193
248
  @MemoIdentity { :>> providedId = "CR-MED-041"; }
194
249
  attribute tailoring = RuleTailoringKind::assurance;
250
+ attribute domain = RuleDomainKind::medicalDevice;
251
+ attribute obligation = RuleObligationKind::required;
252
+ // To confirm: inferred from the section scope; confirm.
195
253
  attribute appliesTo = "CybersecurityAsset";
196
254
  attribute severity = RuleSeverityKind::warning;
197
255
  attribute rationaleText = "Assets should have threat analysis per FDA cybersecurity guidance.";
198
256
  attribute predicateExpression = "threatenedBy->size() >= 1";
199
257
  constraint { true }
200
258
  }
259
+ #EnforcesClause dependency from AssetThreatLinkRule to fdaCybersecurity2023::fdaCyberSection5::fdaCyberSection5A;
201
260
 
202
261
  // ─── Interface Rules ─────────────────────────────────────────────────
203
262
 
204
263
  constraint def LogicalInterfaceDirectionRule :> MemoConsistencyRule {
205
264
  @MemoIdentity { :>> providedId = "CR-MED-050"; }
206
265
  attribute tailoring = RuleTailoringKind::assurance;
266
+ attribute domain = RuleDomainKind::modelling;
267
+ attribute obligation = RuleObligationKind::recommended;
207
268
  attribute appliesTo = "Interface";
208
269
  attribute severity = RuleSeverityKind::error;
209
270
  attribute rationaleText = "Interface direction required for integration analysis.";
210
- attribute predicateExpression = "attributes.direction != '' or attributes.directionality != ''";
271
+ attribute predicateExpression = "attributes.direction != ''";
211
272
  constraint { true }
212
273
  }
213
274
 
@@ -216,12 +277,16 @@ package memo_rules_closure {
216
277
  constraint def SafetyClassCVerificationRule :> MemoConsistencyRule {
217
278
  @MemoIdentity { :>> providedId = "CR-MED-101"; }
218
279
  attribute tailoring = RuleTailoringKind::assurance;
280
+ attribute domain = RuleDomainKind::medicalDevice;
281
+ attribute obligation = RuleObligationKind::required;
219
282
  attribute appliesTo = "SoftwareModule";
220
283
  attribute severity = RuleSeverityKind::error;
221
284
  attribute rationaleText = "IEC 62304 requires rigorous verification for Class C software.";
222
285
  attribute predicateExpression = "not(attributes.safetyClass == 'C') or verifiedBy->size() >= 1";
286
+ // To confirm: inferred: 5.5.4 and 5.5.5 are the unit verification clauses that Class C adds to; confirm.
223
287
  constraint { true }
224
288
  }
289
+ #EnforcesClause dependency from SafetyClassCVerificationRule to iec62304::iec62304Clause5::iec62304Clause5_5::iec62304Clause5_5_4, iec62304::iec62304Clause5::iec62304Clause5_5::iec62304Clause5_5_5;
225
290
 
226
291
  // ─── UI Layout Rules ─────────────────────────────────────────────────
227
292
  //
@@ -241,6 +306,8 @@ package memo_rules_closure {
241
306
  constraint def UiElementDesignRecordRule :> MemoConsistencyRule {
242
307
  @MemoIdentity { :>> providedId = "CR-MED-110"; }
243
308
  attribute tailoring = RuleTailoringKind::assurance;
309
+ attribute domain = RuleDomainKind::modelling;
310
+ attribute obligation = RuleObligationKind::recommended;
244
311
  attribute appliesTo = "UIElement";
245
312
  attribute severity = RuleSeverityKind::error;
246
313
  attribute rationaleText = "Every functional UI element must have a design record — a requirement it satisfies or an action it triggers. Elements with formKind `decoration` are chrome and are exempt.";
@@ -255,6 +322,8 @@ package memo_rules_closure {
255
322
  constraint def ControlInvokesFunctionRule :> MemoConsistencyRule {
256
323
  @MemoIdentity { :>> providedId = "CR-MED-111"; }
257
324
  attribute tailoring = RuleTailoringKind::assurance;
325
+ attribute domain = RuleDomainKind::modelling;
326
+ attribute obligation = RuleObligationKind::recommended;
258
327
  attribute appliesTo = "UIElement";
259
328
  attribute severity = RuleSeverityKind::warning;
260
329
  attribute rationaleText = "An interactive UI element (button, selector, slider, field) should trigger a UIAction that invokes a system function; otherwise the control's purpose is not in the model. Physical controls are OperatorInterfaceElement and are covered separately.";
@@ -268,6 +337,8 @@ package memo_rules_closure {
268
337
  constraint def BoundsDetectionConfirmedRule :> MemoConsistencyRule {
269
338
  @MemoIdentity { :>> providedId = "CR-MED-112"; }
270
339
  attribute tailoring = RuleTailoringKind::assurance;
340
+ attribute domain = RuleDomainKind::modelling;
341
+ attribute obligation = RuleObligationKind::recommended;
271
342
  attribute appliesTo = "UIElement";
272
343
  attribute severity = RuleSeverityKind::warning;
273
344
  attribute rationaleText = "Automatically detected bounds are a proposal until a reviewer confirms them; released UI documentation should contain no unconfirmed automatic bounds.";
@@ -280,10 +351,185 @@ package memo_rules_closure {
280
351
  constraint def ScreenCaptureProvenanceRule :> MemoConsistencyRule {
281
352
  @MemoIdentity { :>> providedId = "CR-MED-113"; }
282
353
  attribute tailoring = RuleTailoringKind::assurance;
354
+ attribute domain = RuleDomainKind::modelling;
355
+ attribute obligation = RuleObligationKind::recommended;
283
356
  attribute appliesTo = "ScreenCapture";
284
357
  attribute severity = RuleSeverityKind::error;
285
358
  attribute rationaleText = "A screen capture used as design or usability evidence must identify the build it was taken from and hash the image bytes, or it cannot be relied on in the DHF.";
286
359
  attribute predicateExpression = "attributes.capturedBuild != '' and attributes.imageHash != ''";
287
360
  constraint { true }
288
361
  }
362
+
363
+ // ─── Risk analysis and software lifecycle rules (clause by clause) ─────
364
+ // Written from the classification in plans/memo-rules-domain-trace-and-editor.md
365
+ // (Step 5): each checks a property the model carries, and each traces to the clause it enforces.
366
+
367
+ constraint def HazardHasSituationRule :> MemoConsistencyRule {
368
+ @MemoIdentity { :>> providedId = "CR-MED-005"; }
369
+ attribute tailoring = RuleTailoringKind::assurance;
370
+ attribute domain = RuleDomainKind::medicalDevice;
371
+ attribute obligation = RuleObligationKind::required;
372
+ attribute appliesTo = "Hazard";
373
+ attribute severity = RuleSeverityKind::warning;
374
+ attribute rationaleText = "A hazard is analysed through the hazardous situations it can lead to: a hazard that reaches no hazardous situation has not been analysed far enough to estimate a risk.";
375
+ attribute predicateExpression = "downstream(tracesRisk)->exists(conformsTo(HazardousSituation))";
376
+ constraint { true }
377
+ }
378
+ #EnforcesClause dependency from HazardHasSituationRule to iso14971::iso14971Clause5::iso14971Clause5_4;
379
+
380
+ constraint def SituationLeadsToHarmRule :> MemoConsistencyRule {
381
+ @MemoIdentity { :>> providedId = "CR-MED-006"; }
382
+ attribute tailoring = RuleTailoringKind::assurance;
383
+ attribute domain = RuleDomainKind::medicalDevice;
384
+ attribute obligation = RuleObligationKind::required;
385
+ attribute appliesTo = "HazardousSituation";
386
+ attribute severity = RuleSeverityKind::warning;
387
+ attribute rationaleText = "A hazardous situation is described by the harm it can cause; one that reaches no harm leaves the severity of the risk unestimated.";
388
+ attribute predicateExpression = "downstream(tracesRisk)->exists(conformsTo(Harm))";
389
+ constraint { true }
390
+ }
391
+ #EnforcesClause dependency from SituationLeadsToHarmRule to iso14971::iso14971Clause5::iso14971Clause5_4;
392
+
393
+ constraint def RiskEstimateRule :> MemoConsistencyRule {
394
+ @MemoIdentity { :>> providedId = "CR-MED-007"; }
395
+ attribute tailoring = RuleTailoringKind::assurance;
396
+ attribute domain = RuleDomainKind::medicalDevice;
397
+ attribute obligation = RuleObligationKind::required;
398
+ attribute appliesTo = "Risk";
399
+ attribute severity = RuleSeverityKind::warning;
400
+ attribute rationaleText = "A risk is estimated from the probability of occurrence and the severity of the harm; a risk missing either has no estimate.";
401
+ attribute predicateExpression = "attributes.probabilityEstimate != '' and attributes.severityEstimate != ''";
402
+ constraint { true }
403
+ }
404
+ #EnforcesClause dependency from RiskEstimateRule to iso14971::iso14971Clause5::iso14971Clause5_5;
405
+
406
+ constraint def RiskAcceptabilityRule :> MemoConsistencyRule {
407
+ @MemoIdentity { :>> providedId = "CR-MED-008"; }
408
+ attribute tailoring = RuleTailoringKind::assurance;
409
+ attribute domain = RuleDomainKind::medicalDevice;
410
+ attribute obligation = RuleObligationKind::required;
411
+ attribute appliesTo = "Risk";
412
+ attribute severity = RuleSeverityKind::warning;
413
+ attribute rationaleText = "Each estimated risk is evaluated against the acceptability criteria, so a risk states whether it is acceptable.";
414
+ attribute predicateExpression = "attributes.acceptability != ''";
415
+ constraint { true }
416
+ }
417
+ #EnforcesClause dependency from RiskAcceptabilityRule to iso14971::iso14971Clause6;
418
+
419
+ constraint def ResidualRiskAcceptabilityRule :> MemoConsistencyRule {
420
+ @MemoIdentity { :>> providedId = "CR-MED-009"; }
421
+ attribute tailoring = RuleTailoringKind::assurance;
422
+ attribute domain = RuleDomainKind::medicalDevice;
423
+ attribute obligation = RuleObligationKind::required;
424
+ attribute appliesTo = "ResidualRisk";
425
+ attribute severity = RuleSeverityKind::warning;
426
+ attribute rationaleText = "After risk control the residual risk is evaluated: it follows a control and states whether it is acceptable.";
427
+ attribute predicateExpression = "reducedBy->size() >= 1 and attributes.acceptability != ''";
428
+ constraint { true }
429
+ }
430
+ #EnforcesClause dependency from ResidualRiskAcceptabilityRule to iso14971::iso14971Clause7::iso14971Clause7_3;
431
+
432
+ constraint def ResidualRiskEvaluatedRule :> MemoConsistencyRule {
433
+ @MemoIdentity { :>> providedId = "CR-MED-014"; }
434
+ attribute tailoring = RuleTailoringKind::assurance;
435
+ attribute domain = RuleDomainKind::medicalDevice;
436
+ attribute obligation = RuleObligationKind::required;
437
+ attribute appliesTo = "ResidualRisk";
438
+ attribute severity = RuleSeverityKind::warning;
439
+ attribute rationaleText = "The overall residual risk is evaluated from the individual residual risks, so each residual risk is an input to that evaluation.";
440
+ attribute predicateExpression = "evaluatedIn->size() >= 1";
441
+ constraint { true }
442
+ }
443
+ #EnforcesClause dependency from ResidualRiskEvaluatedRule to iso14971::iso14971Clause8;
444
+
445
+ constraint def SoupAnomaliesRule :> MemoConsistencyRule {
446
+ @MemoIdentity { :>> providedId = "CR-MED-015"; }
447
+ attribute tailoring = RuleTailoringKind::assurance;
448
+ attribute domain = RuleDomainKind::medicalDevice;
449
+ attribute obligation = RuleObligationKind::required;
450
+ attribute appliesTo = "SOUPSoftwareModule";
451
+ attribute severity = RuleSeverityKind::warning;
452
+ attribute rationaleText = "The published anomaly list of a SOUP item is evaluated for anomalies that could lead to a hazardous situation, and the result is recorded on the item.";
453
+ attribute predicateExpression = "attributes.knownAnomalies != ''";
454
+ constraint { true }
455
+ }
456
+ #EnforcesClause dependency from SoupAnomaliesRule to iec62304::iec62304Clause7::iec62304Clause7_1::iec62304Clause7_1_3;
457
+
458
+ constraint def SoupIdentifiedRule :> MemoConsistencyRule {
459
+ @MemoIdentity { :>> providedId = "CR-MED-016"; }
460
+ attribute tailoring = RuleTailoringKind::assurance;
461
+ attribute domain = RuleDomainKind::medicalDevice;
462
+ attribute obligation = RuleObligationKind::required;
463
+ attribute appliesTo = "SOUPSoftwareModule";
464
+ attribute severity = RuleSeverityKind::warning;
465
+ attribute rationaleText = "A SOUP item is identified under configuration management by its title, manufacturer and version, so a SOUP item states a vendor and a version.";
466
+ attribute predicateExpression = "attributes.version != '' and attributes.supplier != ''";
467
+ constraint { true }
468
+ }
469
+ #EnforcesClause dependency from SoupIdentifiedRule to iec62304::iec62304Clause8::iec62304Clause8_1::iec62304Clause8_1_2;
470
+
471
+ constraint def SoupRequirementRule :> MemoConsistencyRule {
472
+ @MemoIdentity { :>> providedId = "CR-MED-017"; }
473
+ attribute tailoring = RuleTailoringKind::assurance;
474
+ attribute domain = RuleDomainKind::medicalDevice;
475
+ attribute obligation = RuleObligationKind::required;
476
+ attribute appliesTo = "SOUPSoftwareModule";
477
+ attribute severity = RuleSeverityKind::warning;
478
+ attribute rationaleText = "The functional and performance a software item needs from a SOUP item are stated as requirements, so a SOUP item is the subject of at least one requirement.";
479
+ attribute predicateExpression = "satisfiedBy->size() >= 1";
480
+ constraint { true }
481
+ }
482
+ #EnforcesClause dependency from SoupRequirementRule to iec62304::iec62304Clause5::iec62304Clause5_3::iec62304Clause5_3_3;
483
+
484
+ constraint def UnitDecompositionRule :> MemoConsistencyRule {
485
+ @MemoIdentity { :>> providedId = "CR-MED-018"; }
486
+ attribute tailoring = RuleTailoringKind::assurance;
487
+ attribute domain = RuleDomainKind::medicalDevice;
488
+ attribute obligation = RuleObligationKind::required;
489
+ attribute appliesTo = "SoftwareModule";
490
+ attribute severity = RuleSeverityKind::warning;
491
+ attribute rationaleText = "A software item of safety class B or C is subdivided into software units, so such an item contains at least one module of kind unit.";
492
+ attribute predicateExpression = "not(attributes.moduleKind == 'item' and (attributes.safetyClass == 'B' or attributes.safetyClass == 'C')) or downstream(composes)->exists(attributes.moduleKind == 'unit')";
493
+ constraint { true }
494
+ }
495
+ #EnforcesClause dependency from UnitDecompositionRule to iec62304::iec62304Clause5::iec62304Clause5_4::iec62304Clause5_4_1;
496
+
497
+ constraint def ChangeImpactRule :> MemoConsistencyRule {
498
+ @MemoIdentity { :>> providedId = "CR-MED-019"; }
499
+ attribute tailoring = RuleTailoringKind::assurance;
500
+ attribute domain = RuleDomainKind::medicalDevice;
501
+ attribute obligation = RuleObligationKind::required;
502
+ attribute appliesTo = "ChangeRequest";
503
+ attribute severity = RuleSeverityKind::warning;
504
+ attribute rationaleText = "A change request is analysed for its effect on the organisation, the released software and the systems that interface with it, and the analysis is recorded on the request.";
505
+ attribute predicateExpression = "attributes.impactAssessment != ''";
506
+ constraint { true }
507
+ }
508
+ #EnforcesClause dependency from ChangeImpactRule to iec62304::iec62304Clause6::iec62304Clause6_2::iec62304Clause6_2_3;
509
+
510
+ constraint def ChangeApprovalRule :> MemoConsistencyRule {
511
+ @MemoIdentity { :>> providedId = "CR-MED-025"; }
512
+ attribute tailoring = RuleTailoringKind::assurance;
513
+ attribute domain = RuleDomainKind::medicalDevice;
514
+ attribute obligation = RuleObligationKind::required;
515
+ attribute appliesTo = "ChangeRequest";
516
+ attribute severity = RuleSeverityKind::warning;
517
+ attribute rationaleText = "A change request records whether it was approved before the change is made.";
518
+ attribute predicateExpression = "attributes.approvalStatus != ''";
519
+ constraint { true }
520
+ }
521
+ #EnforcesClause dependency from ChangeApprovalRule to iec62304::iec62304Clause6::iec62304Clause6_2::iec62304Clause6_2_4, iec62304::iec62304Clause8::iec62304Clause8_2::iec62304Clause8_2_1;
522
+
523
+ constraint def ChangeTraceRule :> MemoConsistencyRule {
524
+ @MemoIdentity { :>> providedId = "CR-MED-026"; }
525
+ attribute tailoring = RuleTailoringKind::assurance;
526
+ attribute domain = RuleDomainKind::medicalDevice;
527
+ attribute obligation = RuleObligationKind::required;
528
+ attribute appliesTo = "ChangeRequest";
529
+ attribute severity = RuleSeverityKind::warning;
530
+ attribute rationaleText = "A change request is traceable to the items it changes, so it has a changes relation to at least one element.";
531
+ attribute predicateExpression = "changes->size() >= 1";
532
+ constraint { true }
533
+ }
534
+ #EnforcesClause dependency from ChangeTraceRule to iec62304::iec62304Clause8::iec62304Clause8_2::iec62304Clause8_2_4;
289
535
  }
@@ -8,24 +8,35 @@ package memo_rules_crosslayer {
8
8
 
9
9
  private import memo_core_common::*;
10
10
  private import memo_core_common::MemoIdentity;
11
+ private import memo_artifacts_standards_traceability::EnforcesClause;
12
+ private import memo_artifacts_standards_iec_62304::*;
13
+ private import memo_artifacts_standards_iso_14971::*;
11
14
  constraint def RiskToReqTraceRule :> MemoConsistencyRule {
12
15
  @MemoIdentity { :>> providedId = "XL-001"; }
13
16
  attribute tailoring = RuleTailoringKind::assurance;
17
+ attribute domain = RuleDomainKind::medicalDevice;
18
+ attribute obligation = RuleObligationKind::required;
19
+ // To confirm: inferred from the clause scopes; confirm.
14
20
  attribute appliesTo = "Hazard";
15
21
  attribute severity = RuleSeverityKind::warning;
16
22
  attribute rationaleText = "Risk-requirement traceability required for regulatory submissions.";
17
23
  attribute predicateExpression = "derivesFrom->size() >= 1";
18
24
  constraint { true }
19
25
  }
26
+ #EnforcesClause dependency from RiskToReqTraceRule to iso14971::iso14971Clause7::iso14971Clause7_2, iec62304::iec62304Clause5::iec62304Clause5_2::iec62304Clause5_2_3;
20
27
 
21
28
  constraint def ReqToArchTraceRule :> MemoConsistencyRule {
22
29
  @MemoIdentity { :>> providedId = "XL-002"; }
23
30
  attribute tailoring = RuleTailoringKind::assurance;
31
+ attribute domain = RuleDomainKind::medicalDevice;
32
+ attribute obligation = RuleObligationKind::required;
33
+ // To confirm: inferred from the clause scope; confirm.
24
34
  attribute appliesTo = "Requirement[requirementType=system]";
25
35
  attribute severity = RuleSeverityKind::warning;
26
36
  attribute rationaleText = "Requirements-to-architecture traceability per IEC 62304.";
27
37
  attribute predicateExpression = "satisfiedBy->size() >= 1";
28
38
  constraint { true }
29
39
  }
40
+ #EnforcesClause dependency from ReqToArchTraceRule to iec62304::iec62304Clause5::iec62304Clause5_3::iec62304Clause5_3_1;
30
41
 
31
42
  }