@memoarchitect/ontology 0.12.1 → 0.15.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 (317) 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 -358
  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 -91
  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 +675 -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 +7 -29
  123. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +12 -36
  124. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +13 -25
  125. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +388 -0
  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 +27 -36
  128. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +8 -21
  129. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +17 -65
  130. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +23 -32
  131. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +9 -22
  132. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +7 -22
  133. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +18 -34
  134. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +2 -9
  135. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +18 -42
  136. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +11 -24
  137. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +9 -36
  138. package/examples/sysml-diagram-samples/model/methodology/project.sysml +40 -0
  139. package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +1 -1
  140. package/examples/temperature-alarm/memo.identity.yaml +6 -0
  141. package/examples/temperature-alarm/memo.package.yaml +3 -1
  142. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +43 -21
  143. package/examples/temperature-alarm/model/{catalog → methodology}/project.sysml +4 -5
  144. package/examples/ui-screen-regions/memo.identity.yaml +33 -0
  145. package/examples/ui-screen-regions/memo.package.yaml +3 -1
  146. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +12 -12
  147. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +18 -18
  148. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +6 -6
  149. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +3 -3
  150. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +1 -1
  151. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +1 -1
  152. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +10 -10
  153. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +1 -1
  154. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
  155. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +15 -15
  156. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +6 -6
  157. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -2
  158. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
  159. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
  160. package/examples/ui-screen-regions/model/{catalog → methodology}/project.sysml +4 -5
  161. package/extensions/README.md +65 -16
  162. package/extensions/aadl/memo.package.yaml +1 -1
  163. package/extensions/aadl/src/aadl_extension.sysml +5 -2
  164. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +29 -50
  165. package/extensions/clinical/memo.package.yaml +1 -1
  166. package/extensions/clinical/src/clinical_extension.sysml +2 -0
  167. package/extensions/cloud/memo.package.yaml +1 -1
  168. package/extensions/container/memo.package.yaml +1 -1
  169. package/extensions/messaging/memo.package.yaml +1 -1
  170. package/extensions/messaging/src/messaging_extension.sysml +2 -2
  171. package/extensions/ros/memo.package.yaml +1 -1
  172. package/extensions/ros/src/ros_extension.sysml +25 -24
  173. package/extensions/template/memo.package.yaml +1 -1
  174. package/extensions/template/model/extension.sysml +25 -0
  175. package/memo.manifest.yaml +1 -7
  176. package/methodologies/default/memo.package.yaml +1 -1
  177. package/methodologies/gpca/memo.package.yaml +1 -1
  178. package/ontology/memo.package.yaml +1 -1
  179. package/package.json +6 -4
  180. package/profile/memo.package.yaml +1 -1
  181. package/src/architecture/decisions/memo_decisions.sysml +9 -2
  182. package/src/architecture/functional/behavior/memo_behavior.sysml +27 -7
  183. package/src/architecture/functional/functions/memo_functions.sysml +45 -31
  184. package/src/architecture/functional/memo_architecture_functional.sysml +14 -0
  185. package/src/architecture/implementation/memo_architecture_implementation.sysml +21 -0
  186. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +7 -0
  187. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +58 -17
  188. package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
  189. package/src/architecture/logical/interfaces/memo_interfaces.sysml +67 -58
  190. package/src/architecture/logical/memo_architecture_logical.sysml +13 -0
  191. package/src/architecture/logical/structure/memo_logical_structure.sysml +27 -8
  192. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +4 -1
  193. package/src/architecture/operational/memo_architecture_operational.sysml +19 -0
  194. package/src/architecture/operational/scenarios/memo_scenarios.sysml +9 -8
  195. package/src/architecture/operational/structure/memo_operational.sysml +5 -2
  196. package/src/architecture/operational/use_cases/memo_use_cases.sysml +16 -8
  197. package/src/architecture/realization/deployment/memo_deployment.sysml +30 -10
  198. package/src/architecture/realization/memo_architecture_realization.sysml +13 -0
  199. package/src/architecture/realization/physical/memo_physical_architecture.sysml +61 -0
  200. package/src/architecture/variability/memo_variability.sysml +87 -0
  201. package/src/artifacts/configuration_management/memo_configuration_management.sysml +95 -3
  202. package/src/artifacts/core/memo_controlled_artifacts.sysml +4 -2
  203. package/src/artifacts/standards/cfr_21_820.sysml +12 -24
  204. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +13 -20
  205. package/src/artifacts/standards/iec_60601_1.sysml +16 -32
  206. package/src/artifacts/standards/iec_60601_1_2.sysml +5 -10
  207. package/src/artifacts/standards/iec_60812.sysml +4 -8
  208. package/src/artifacts/standards/iec_62304.sysml +607 -47
  209. package/src/artifacts/standards/iec_62366_1.sysml +12 -24
  210. package/src/artifacts/standards/iec_81001_5_1.sysml +8 -16
  211. package/src/artifacts/standards/iso_13485.sysml +12 -24
  212. package/src/artifacts/standards/iso_14971.sysml +118 -20
  213. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +3 -6
  214. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +14 -4
  215. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +1 -2
  216. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +1 -2
  217. package/src/artifacts/templates/dhf/iec-62304/sad.md +1 -2
  218. package/src/artifacts/templates/dhf/iec-62304/sbom.md +1 -2
  219. package/src/artifacts/templates/dhf/iec-62304/sdp.md +1 -2
  220. package/src/artifacts/templates/dhf/iec-62304/soup.md +3 -5
  221. package/src/artifacts/templates/dhf/system/sad.md +1 -1
  222. package/src/artifacts/templates/dhf/system/standards-checklist.md +2 -2
  223. package/src/artifacts/templates/dhf/system/standards-traceability.md +1 -1
  224. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +339 -13
  225. package/src/assurance/human_factors/memo_human_factors.sysml +6 -2
  226. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +7 -3
  227. package/src/assurance/safety_risk/memo_risk.sysml +39 -1
  228. package/src/core/common/memo_common.sysml +51 -68
  229. package/src/core/enumerations/memo_enumerations.sysml +93 -9
  230. package/src/core/relationships/memo_relationships.sysml +17 -11
  231. package/src/core/relationships/memo_workspace_membership.sysml +284 -0
  232. package/src/core/semantics/semantics.sysml +58 -0
  233. package/src/core/terminology/terminology.sysml +7 -0
  234. package/src/memo_namespaces.sysml +6 -0
  235. package/src/methodology/archetypes/memo_archetypes.sysml +8 -16
  236. package/src/methodology/core/memo_core.sysml +85 -29
  237. package/src/methodology/profiles/memo_profiles.sysml +217 -61
  238. package/src/methodology/workflow/memo_workflow.sysml +28 -0
  239. package/src/rules/closure/closure_rules.sysml +250 -4
  240. package/src/rules/crosslayer/cross_layer_rules.sysml +11 -0
  241. package/src/rules/ontology/ontology_invariants.sysml +288 -48
  242. package/src/rules/quantitative/quantitative_rules.sysml +4 -0
  243. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +28 -28
  244. package/src/viewpoints/clinical/clinical_viewpoint.sysml +4 -5
  245. package/src/viewpoints/context/context_viewpoint.sysml +4 -5
  246. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
  247. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +4 -5
  248. package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
  249. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +3 -5
  250. package/src/viewpoints/functional/functional_viewpoint.sysml +4 -5
  251. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -4
  252. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -4
  253. package/src/viewpoints/logical/logical_viewpoint.sysml +4 -5
  254. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
  255. package/src/viewpoints/operational/operational_viewpoint.sysml +4 -5
  256. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
  257. package/src/viewpoints/physical/physical_viewpoint.sysml +4 -5
  258. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +2 -4
  259. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +2 -4
  260. package/src/viewpoints/rendering/memo_rendering.sysml +50 -98
  261. package/src/viewpoints/requirements/requirements_viewpoint.sysml +4 -5
  262. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
  263. package/src/viewpoints/risk/risk_viewpoint.sysml +4 -5
  264. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
  265. package/src/viewpoints/software/software_viewpoint.sysml +4 -5
  266. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
  267. package/src/viewpoints/{definitions → stakeholders_concerns}/memo_stakeholders_concerns.sysml +45 -36
  268. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +4 -5
  269. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
  270. package/src/viewpoints/usability/usability_viewpoint.sysml +4 -5
  271. package/src/viewpoints/verification/verification_viewpoint.sysml +4 -5
  272. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -4
  273. package/stage1/syside-67f92dc96ba75cd05b5c8d13.ids.gz +0 -0
  274. package/stage1/syside-67f92dc96ba75cd05b5c8d13.json.gz +0 -0
  275. package/templates/default/memo.package.yaml +6 -1
  276. package/templates/default/model/catalog/architecture/system.sysml +7 -3
  277. package/templates/default/model/{catalog → methodology}/project.sysml +3 -4
  278. package/examples/sysml-diagram-samples/model/catalog/project.sysml +0 -26
  279. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +0 -47
  280. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +0 -94
  281. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +0 -13
  282. package/examples/ui-screen-regions/model/catalog/relationships.sysml +0 -8
  283. package/extensions/aadl/src/methodology/aadl_methodology.sysml +0 -19
  284. package/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -24
  285. package/extensions/cloud/src/methodology/cloud_methodology.sysml +0 -19
  286. package/extensions/container/src/methodology/container_methodology.sysml +0 -19
  287. package/extensions/messaging/src/methodology/messaging_methodology.sysml +0 -19
  288. package/extensions/ros/src/methodology/ros_methodology.sysml +0 -27
  289. package/extensions/template/src/extension.sysml +0 -39
  290. package/templates/connected-device/memo.package.yaml +0 -13
  291. package/templates/connected-device/model/catalog/architecture/system.sysml +0 -5
  292. package/templates/connected-device/model/catalog/artifacts/catalog.sysml +0 -5
  293. package/templates/connected-device/model/catalog/assurance/requirements.sysml +0 -7
  294. package/templates/connected-device/model/catalog/project.sysml +0 -30
  295. package/templates/connected-device/package.json +0 -8
  296. package/templates/connected-device/syside.toml +0 -13
  297. package/templates/infusion-pump/memo.package.yaml +0 -13
  298. package/templates/infusion-pump/model/catalog/architecture/system.sysml +0 -5
  299. package/templates/infusion-pump/model/catalog/artifacts/catalog.sysml +0 -5
  300. package/templates/infusion-pump/model/catalog/assurance/requirements.sysml +0 -7
  301. package/templates/infusion-pump/model/catalog/project.sysml +0 -30
  302. package/templates/infusion-pump/package.json +0 -8
  303. package/templates/infusion-pump/syside.toml +0 -13
  304. package/templates/monitoring-device/memo.package.yaml +0 -13
  305. package/templates/monitoring-device/model/catalog/architecture/system.sysml +0 -5
  306. package/templates/monitoring-device/model/catalog/artifacts/catalog.sysml +0 -5
  307. package/templates/monitoring-device/model/catalog/assurance/requirements.sysml +0 -7
  308. package/templates/monitoring-device/model/catalog/project.sysml +0 -30
  309. package/templates/monitoring-device/package.json +0 -8
  310. package/templates/monitoring-device/syside.toml +0 -13
  311. package/templates/samd/memo.package.yaml +0 -13
  312. package/templates/samd/model/catalog/architecture/system.sysml +0 -5
  313. package/templates/samd/model/catalog/artifacts/catalog.sysml +0 -5
  314. package/templates/samd/model/catalog/assurance/requirements.sysml +0 -7
  315. package/templates/samd/model/catalog/project.sysml +0 -30
  316. package/templates/samd/package.json +0 -8
  317. package/templates/samd/syside.toml +0 -13
@@ -11,8 +11,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
11
11
  private import memo_core_common::MemoIdentity;
12
12
  // ── Logical functions ───────────────────────────────────────
13
13
  action fnAcquireSensors : SystemFunction {
14
- @MemoIdentity { :>> providedId = "FUNC-001"; }
15
- attribute :>> name = "AcquireSensorData";
14
+ @MemoIdentity { :>> providedId = "FUNC-001"; :>> label = "AcquireSensorData"; }
15
+ out sensorVectorOut : InterfaceItem;
16
16
  attribute :>> functionCategory = "sensing";
17
17
  attribute :>> trigger = "every 20 ms execution step";
18
18
  attribute :>> outputSummary = "Debounced, range-checked sensor status vector";
@@ -28,8 +28,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
28
28
  // requires — a component function allocated nowhere is a
29
29
  // responsibility nobody has accepted.
30
30
  action cfnMeasureFlowRate : ComponentFunction {
31
- @MemoIdentity { :>> providedId = "CFUN-001"; }
32
- attribute :>> name = "MeasureFlowRate";
31
+ @MemoIdentity { :>> providedId = "CFUN-001"; :>> label = "MeasureFlowRate"; }
33
32
  attribute :>> functionCategory = "sensing";
34
33
  attribute :>> actionKind = ActionKind::sense;
35
34
  attribute :>> trigger = "continuous, sampled every 20 ms execution step";
@@ -38,8 +37,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
38
37
  attribute :>> criticality = CriticalityKind::catastrophic;
39
38
  }
40
39
  action cfnDetectAirInLine : ComponentFunction {
41
- @MemoIdentity { :>> providedId = "CFUN-002"; }
42
- attribute :>> name = "DetectAirInLine";
40
+ @MemoIdentity { :>> providedId = "CFUN-002"; :>> label = "DetectAirInLine"; }
43
41
  attribute :>> functionCategory = "protection";
44
42
  attribute :>> actionKind = ActionKind::sense;
45
43
  attribute :>> trigger = "continuous, sampled every 20 ms execution step";
@@ -49,8 +47,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
49
47
  }
50
48
  // The subassembly case: a component function need not sit on a leaf part.
51
49
  action cfnAggregateSensorStatus : ComponentFunction {
52
- @MemoIdentity { :>> providedId = "CFUN-003"; }
53
- attribute :>> name = "AggregateSensorStatus";
50
+ @MemoIdentity { :>> providedId = "CFUN-003"; :>> label = "AggregateSensorStatus"; }
54
51
  attribute :>> functionCategory = "sensing";
55
52
  attribute :>> actionKind = ActionKind::transform;
56
53
  attribute :>> trigger = "every 20 ms execution step";
@@ -61,8 +58,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
61
58
  }
62
59
 
63
60
  action fnValidatePrescription : SystemFunction {
64
- @MemoIdentity { :>> providedId = "FUNC-002"; }
65
- attribute :>> name = "ValidatePrescription";
61
+ @MemoIdentity { :>> providedId = "FUNC-002"; :>> label = "ValidatePrescription"; }
62
+ in prescriptionIn : InterfaceItem;
66
63
  attribute :>> functionCategory = "configuration";
67
64
  attribute :>> trigger = "prescription entry or edit";
68
65
  attribute :>> outputSummary = "Prescription accepted (within drug-library hard/soft limits) or rejected with reason";
@@ -70,8 +67,9 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
70
67
  attribute :>> criticality = CriticalityKind::catastrophic;
71
68
  }
72
69
  action fnMonitorAlarm : SystemFunction {
73
- @MemoIdentity { :>> providedId = "FUNC-003"; }
74
- attribute :>> name = "MonitorExceptionalConditions";
70
+ @MemoIdentity { :>> providedId = "FUNC-003"; :>> label = "MonitorExceptionalConditions"; }
71
+ in sensorVectorIn : InterfaceItem;
72
+ out alarmSignalOut : InterfaceItem;
75
73
  attribute :>> functionCategory = "alarm";
76
74
  attribute :>> trigger = "every 20 ms execution step";
77
75
  attribute :>> outputSummary = "Alarm outputs and inhibition conditions";
@@ -79,8 +77,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
79
77
  attribute :>> criticality = CriticalityKind::catastrophic;
80
78
  }
81
79
  action fnAnnunciate : SystemFunction {
82
- @MemoIdentity { :>> providedId = "FUNC-004"; }
83
- attribute :>> name = "AnnunciateAlarms";
80
+ @MemoIdentity { :>> providedId = "FUNC-004"; :>> label = "AnnunciateAlarms"; }
81
+ in alarmSignalIn : InterfaceItem;
84
82
  attribute :>> functionCategory = "alarm";
85
83
  attribute :>> trigger = "alarm raised, escalated, or cleared";
86
84
  attribute :>> outputSummary = "Priority-coded audible tone and visual message";
@@ -88,8 +86,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
88
86
  attribute :>> criticality = CriticalityKind::high;
89
87
  }
90
88
  action fnManageInfusion : SystemFunction {
91
- @MemoIdentity { :>> providedId = "FUNC-005"; }
92
- attribute :>> name = "ManageInfusion";
89
+ @MemoIdentity { :>> providedId = "FUNC-005"; :>> label = "ManageInfusion"; }
90
+ out flowCommandOut : InterfaceItem;
93
91
  attribute :>> functionCategory = "infusion";
94
92
  attribute :>> trigger = "mode transitions and each execution step while therapy active";
95
93
  attribute :>> outputSummary = "Commanded flow and mode transitions";
@@ -97,8 +95,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
97
95
  attribute :>> criticality = CriticalityKind::catastrophic;
98
96
  }
99
97
  action fnEnforceLimits : SystemFunction {
100
- @MemoIdentity { :>> providedId = "FUNC-006"; }
101
- attribute :>> name = "EnforceDoseLimits";
98
+ @MemoIdentity { :>> providedId = "FUNC-006"; :>> label = "EnforceDoseLimits"; }
102
99
  attribute :>> functionCategory = "infusion";
103
100
  attribute :>> trigger = "patient bolus request or clinician square bolus command";
104
101
  attribute :>> outputSummary = "Bolus authorized or rejected against lockout interval and hourly maximum";
@@ -106,8 +103,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
106
103
  attribute :>> criticality = CriticalityKind::catastrophic;
107
104
  }
108
105
  action fnCommandPump : SystemFunction {
109
- @MemoIdentity { :>> providedId = "FUNC-007"; }
110
- attribute :>> name = "CommandPumpMotor";
106
+ @MemoIdentity { :>> providedId = "FUNC-007"; :>> label = "CommandPumpMotor"; }
107
+ in flowCommandIn : InterfaceItem;
111
108
  attribute :>> functionCategory = "actuation";
112
109
  attribute :>> trigger = "flow command update";
113
110
  attribute :>> outputSummary = "Motor step rate with enable interlock; FlowRate_Mode_macro per mode, KVO floor in PAUSED (REQ 43), zero flow in OFF/IDLE (REQ 6/14)";
@@ -115,8 +112,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
115
112
  attribute :>> criticality = CriticalityKind::catastrophic;
116
113
  }
117
114
  action fnLogEvents : SystemFunction {
118
- @MemoIdentity { :>> providedId = "FUNC-008"; }
119
- attribute :>> name = "LogTherapyEvents";
115
+ @MemoIdentity { :>> providedId = "FUNC-008"; :>> label = "LogTherapyEvents"; }
120
116
  attribute :>> functionCategory = "logging";
121
117
  attribute :>> trigger = "dose delivered, mode change, alarm, or configuration change";
122
118
  attribute :>> outputSummary = "Timestamped append-only event records";
@@ -124,8 +120,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
124
120
  attribute :>> criticality = CriticalityKind::medium;
125
121
  }
126
122
  action fnManagePower : SystemFunction {
127
- @MemoIdentity { :>> providedId = "FUNC-009"; }
128
- attribute :>> name = "ManagePower";
123
+ @MemoIdentity { :>> providedId = "FUNC-009"; :>> label = "ManagePower"; }
129
124
  attribute :>> functionCategory = "platform";
130
125
  attribute :>> trigger = "mains-loss signal or battery level change";
131
126
  attribute :>> outputSummary = "Power source selection, low/depleted battery conditions";
@@ -133,8 +128,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
133
128
  attribute :>> criticality = CriticalityKind::high;
134
129
  }
135
130
  action fnPresentStatus : SystemFunction {
136
- @MemoIdentity { :>> providedId = "FUNC-010"; }
137
- attribute :>> name = "PresentStatus";
131
+ @MemoIdentity { :>> providedId = "FUNC-010"; :>> label = "PresentStatus"; }
138
132
  attribute :>> functionCategory = "user-interface";
139
133
  attribute :>> trigger = "state or prescription change";
140
134
  attribute :>> outputSummary = "Mode, prescription, delivered dose, and alarm text on display";
@@ -142,8 +136,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
142
136
  attribute :>> criticality = CriticalityKind::high;
143
137
  }
144
138
  action fnSelfTest : SystemFunction {
145
- @MemoIdentity { :>> providedId = "FUNC-011"; }
146
- attribute :>> name = "ExecuteSelfTest";
139
+ @MemoIdentity { :>> providedId = "FUNC-011"; :>> label = "ExecuteSelfTest"; }
147
140
  attribute :>> functionCategory = "platform";
148
141
  attribute :>> trigger = "power-on and periodic in-service checks";
149
142
  attribute :>> outputSummary = "POST pass/fail; CPU, RAM, ROM, and sensor plausibility results";
@@ -152,51 +145,48 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
152
145
  }
153
146
 
154
147
  // ── Logical flows ───────────────────────────────────────────
155
- part lfSensorAcquisition : FunctionalExchange {
156
- @MemoIdentity { :>> providedId = "LF-001"; }
157
- attribute :>> name = "SensorAcquisitionFlow";
148
+ // Each exchange is the flow itself, from one function's `out` parameter
149
+ // to another's `in`. LF-004 starts outside the system: the prescription is
150
+ // what the clinician's ProgramPrescription activity (OA-003) produces, and
151
+ // CE-004 carries it from the operator keypad.
152
+ flow lfSensorAcquisition : FunctionalExchange
153
+ from fnAcquireSensors.sensorVectorOut to fnMonitorAlarm.sensorVectorIn {
154
+ @MemoIdentity { :>> providedId = "LF-001"; :>> label = "SensorAcquisitionFlow"; }
158
155
  attribute :>> flowKind = FlowKind::measurement;
159
156
  attribute :>> latencyBudgetMs = 20.0;
160
157
  attribute :>> staleAfterMs = 40.0;
161
158
  attribute :>> integrityLevel = "class C data path";
162
- ref :>> sourceFunction = fnAcquireSensors;
163
- ref :>> targetFunction = fnMonitorAlarm;
164
159
  }
165
- part lfFlowCommand : FunctionalExchange {
166
- @MemoIdentity { :>> providedId = "LF-002"; }
167
- attribute :>> name = "FlowCommandFlow";
160
+ flow lfFlowCommand : FunctionalExchange
161
+ from fnManageInfusion.flowCommandOut to fnCommandPump.flowCommandIn {
162
+ @MemoIdentity { :>> providedId = "LF-002"; :>> label = "FlowCommandFlow"; }
168
163
  attribute :>> flowKind = FlowKind::command;
169
164
  attribute :>> latencyBudgetMs = 20.0;
170
165
  attribute :>> staleAfterMs = 20.0;
171
166
  attribute :>> integrityLevel = "class C command path";
172
- ref :>> sourceFunction = fnManageInfusion;
173
- ref :>> targetFunction = fnCommandPump;
174
167
  }
175
- part lfAlarmSignal : FunctionalExchange {
176
- @MemoIdentity { :>> providedId = "LF-003"; }
177
- attribute :>> name = "AlarmSignalFlow";
168
+ flow lfAlarmSignal : FunctionalExchange
169
+ from fnMonitorAlarm.alarmSignalOut to fnAnnunciate.alarmSignalIn {
170
+ @MemoIdentity { :>> providedId = "LF-003"; :>> label = "AlarmSignalFlow"; }
178
171
  attribute :>> flowKind = FlowKind::alarm;
179
172
  attribute :>> latencyBudgetMs = 20.0;
180
173
  attribute :>> staleAfterMs = 20.0;
181
174
  attribute :>> integrityLevel = "class C alarm path; same-step delivery to infusion manager";
182
- ref :>> sourceFunction = fnMonitorAlarm;
183
- ref :>> targetFunction = fnAnnunciate;
184
175
  }
185
- part lfPrescriptionEntry : FunctionalExchange {
186
- @MemoIdentity { :>> providedId = "LF-004"; }
187
- attribute :>> name = "PrescriptionEntryFlow";
176
+ flow lfPrescriptionEntry : FunctionalExchange
177
+ from memo_examples_gpca_pump_gpca_operational::oaProgram.prescriptionOut
178
+ to fnValidatePrescription.prescriptionIn {
179
+ @MemoIdentity { :>> providedId = "LF-004"; :>> label = "PrescriptionEntryFlow"; }
188
180
  attribute :>> flowKind = FlowKind::configuration;
189
181
  attribute :>> latencyBudgetMs = 500.0;
190
182
  attribute :>> staleAfterMs = 0.0;
191
183
  attribute :>> integrityLevel = "confirmed double-entry path";
192
- ref :>> targetFunction = fnValidatePrescription;
193
184
  }
194
185
 
195
186
  // ── Exchange item definitions ───────────────────────────────
196
187
  item ddPrescription : InterfaceItem {
197
188
  attribute :>> itemKind = InterfaceItemKind::data;
198
- @MemoIdentity { :>> providedId = "DD-001"; }
199
- attribute :>> name = "PrescriptionRecord";
189
+ @MemoIdentity { :>> providedId = "DD-001"; :>> label = "PrescriptionRecord"; }
200
190
  attribute :>> semantics = "patient id, drug name, concentration, VTBI total, duration total, basal flow rate, square bolus rate/duration/interval, patient bolus rate/duration/lockout period, max boluses per hour (DD-005..DD-017)";
201
191
  attribute :>> unit = "ml/hr, ml, minutes, mg/ml, per hour";
202
192
  attribute :>> minValue = "pharmacy-database safe-value lower bounds (lo_hd)";
@@ -210,8 +200,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
210
200
  }
211
201
  item ddBolusRequest : InterfaceItem {
212
202
  attribute :>> itemKind = InterfaceItemKind::data;
213
- @MemoIdentity { :>> providedId = "DD-002"; }
214
- attribute :>> name = "BolusRequestSignal";
203
+ @MemoIdentity { :>> providedId = "DD-002"; :>> label = "BolusRequestSignal"; }
215
204
  attribute :>> semantics = "debounced patient pendant press event";
216
205
  attribute :>> encoding = "edge event with 50 ms debounce";
217
206
  attribute :>> timestampRequired = true;
@@ -221,8 +210,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
221
210
  }
222
211
  item ddSensorVector : InterfaceItem {
223
212
  attribute :>> itemKind = InterfaceItemKind::data;
224
- @MemoIdentity { :>> providedId = "DD-003"; }
225
- attribute :>> name = "SensorStatusVector";
213
+ @MemoIdentity { :>> providedId = "DD-003"; :>> label = "SensorStatusVector"; }
226
214
  attribute :>> semantics = "air-in-line, occlusion pressure, reservoir volume, door state, flow measurement, battery level, CPU/memory status";
227
215
  attribute :>> encoding = "fixed-layout status word per 20 ms step";
228
216
  attribute :>> timestampRequired = true;
@@ -232,8 +220,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
232
220
  }
233
221
  item ddEventRecord : InterfaceItem {
234
222
  attribute :>> itemKind = InterfaceItemKind::data;
235
- @MemoIdentity { :>> providedId = "DD-004"; }
236
- attribute :>> name = "TherapyEventRecord";
223
+ @MemoIdentity { :>> providedId = "DD-004"; :>> label = "TherapyEventRecord"; }
237
224
  attribute :>> semantics = "timestamped dose, alarm, mode, and configuration events";
238
225
  attribute :>> encoding = "append-only sequenced records";
239
226
  attribute :>> timestampRequired = true;
@@ -243,16 +230,14 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
243
230
  }
244
231
  item cdFlowCommand : InterfaceItem {
245
232
  attribute :>> itemKind = InterfaceItemKind::command;
246
- @MemoIdentity { :>> providedId = "CD-001"; }
247
- attribute :>> name = "FlowCommand";
233
+ @MemoIdentity { :>> providedId = "CD-001"; :>> label = "FlowCommand"; }
248
234
  attribute :>> controlType = "commanded flow rate with enable interlock";
249
235
  attribute :>> timeoutMs = 40.0;
250
236
  attribute :>> retryPolicy = "no retry; missing command forces zero flow";
251
237
  }
252
238
  item cdAlarmSignal : InterfaceItem {
253
239
  attribute :>> itemKind = InterfaceItemKind::command;
254
- @MemoIdentity { :>> providedId = "CD-002"; }
255
- attribute :>> name = "AlarmSignal";
240
+ @MemoIdentity { :>> providedId = "CD-002"; :>> label = "AlarmSignal"; }
256
241
  attribute :>> controlType = "priority-coded alarm assertion (level 1 stops infusion, level 2 warns)";
257
242
  attribute :>> timeoutMs = 20.0;
258
243
  attribute :>> retryPolicy = "latched until acknowledged and condition cleared";
@@ -13,11 +13,10 @@ package memo_examples_gpca_pump_gpca_context {
13
13
  private import memo_core_common::*;
14
14
  private import memo_core_common::MemoIdentity;
15
15
  // ── Intended use (ISO 14971 §5.2, IEC 62366-1) ──────────────
16
- part gpcaIntendedUse : IntendedUse {
16
+ requirement gpcaIntendedUse : IntendedUse {
17
17
  @MemoIdentity { :>> providedId = "IU-001"; }
18
- attribute :>> name = "GPCA_IntendedUse";
19
18
  @MemoIdentity { :>> shortDescription = "Patient-controlled analgesia infusion of prescribed opioid analgesics."; }
20
- attribute :>> description = "The GPCA pump delivers a prescribed analgesic drug intravenously at a programmed basal rate, supplemented by square boluses delivered automatically at programmed intervals and by patient-requested bolus doses, subject to lockout intervals and maximum-dose limits.";
19
+ doc /* The GPCA pump delivers a prescribed analgesic drug intravenously at a programmed basal rate, supplemented by square boluses delivered automatically at programmed intervals and by patient-requested bolus doses, subject to lockout intervals and maximum-dose limits. */
21
20
  attribute :>> indication = "Management of acute post-operative or chronic pain requiring titrated intravenous opioid analgesia.";
22
21
  attribute :>> contraindication = "Patients unable to comprehend or operate the bolus request mechanism; drugs without safe-value records in the hospital pharmacy database.";
23
22
  attribute :>> patientPopulation = "Adult in-patients under clinical supervision.";
@@ -29,10 +28,9 @@ package memo_examples_gpca_pump_gpca_context {
29
28
  @MemoIdentity { :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §2.1-2.3 (GPCA overview, system functions, user characteristics)"; }
30
29
  }
31
30
  part bolusByProxyMisuse : ReasonablyForeseeableMisuse {
32
- @MemoIdentity { :>> providedId = "RFM-001"; }
33
- attribute :>> name = "BolusRequestBySomeoneOtherThanPatient";
31
+ @MemoIdentity { :>> providedId = "RFM-001"; :>> label = "BolusRequestBySomeoneOtherThanPatient"; }
34
32
  @MemoIdentity { :>> shortDescription = "A caregiver or visitor presses the patient bolus control."; }
35
- attribute :>> description = "A person other than the patient activates the bolus request control, bypassing the intended patient self-limiting behavior.";
33
+ doc /* A person other than the patient activates the bolus request control, bypassing the intended patient self-limiting behavior. */
36
34
  attribute :>> misuseContext = "Patient-controlled analgesia in a supervised hospital setting.";
37
35
  attribute :>> foreseeableBasis = "Known PCA use pattern represented in the GPCA hazard analysis.";
38
36
  attribute :>> affectedUseContext = "UC-001";
@@ -41,8 +39,7 @@ package memo_examples_gpca_pump_gpca_context {
41
39
 
42
40
  // ── Use contexts ────────────────────────────────────────────
43
41
  part hospitalWardContext : UseContext {
44
- @MemoIdentity { :>> providedId = "UC-001"; }
45
- attribute :>> name = "HospitalWardUseContext";
42
+ @MemoIdentity { :>> providedId = "UC-001"; :>> label = "HospitalWardUseContext"; }
46
43
  attribute :>> careSetting = "acute-care hospital ward and post-anesthesia care unit";
47
44
  attribute :>> environment = "indoor clinical environment, mains power with battery backup, pole or bed-rail mounted";
48
45
  attribute :>> jurisdiction = "generic (FDA/EU reference model)";
@@ -54,18 +51,16 @@ package memo_examples_gpca_pump_gpca_context {
54
51
  // ── Actors ──────────────────────────────────────────────────
55
52
  part actorPatient : User {
56
53
  attribute :>> actorKind = ActorKind::patient;
57
- @MemoIdentity { :>> providedId = "ACT-001"; }
58
- attribute :>> name = "Patient";
54
+ @MemoIdentity { :>> providedId = "ACT-001"; :>> label = "Patient"; }
59
55
  attribute :>> trainingLevel = "instructed by clinician on bolus request button only";
60
- attribute :>> description = "Receives the infusion and requests bolus doses via the patient pendant.";
56
+ doc /* Receives the infusion and requests bolus doses via the patient pendant. */
61
57
  perform oaRequestBolus;
62
58
  }
63
59
  part actorNurse : User {
64
60
  attribute :>> actorKind = ActorKind::clinician;
65
- @MemoIdentity { :>> providedId = "ACT-002"; }
66
- attribute :>> name = "ClinicianNurse";
61
+ @MemoIdentity { :>> providedId = "ACT-002"; :>> label = "ClinicianNurse"; }
67
62
  attribute :>> trainingLevel = "trained clinical user; programs prescriptions and responds to alarms";
68
- attribute :>> description = "Loads the drug reservoir, programs and confirms the prescription, starts/stops therapy, and responds to alarms.";
63
+ doc /* Loads the drug reservoir, programs and confirms the prescription, starts/stops therapy, and responds to alarms. */
69
64
  perform oaProgram;
70
65
  perform oaStartTherapy;
71
66
  perform oaRespondAlarm;
@@ -73,64 +68,57 @@ package memo_examples_gpca_pump_gpca_context {
73
68
  }
74
69
  part actorPrescriber : User {
75
70
  attribute :>> actorKind = ActorKind::clinician;
76
- @MemoIdentity { :>> providedId = "ACT-003"; }
77
- attribute :>> name = "PrescribingPhysician";
71
+ @MemoIdentity { :>> providedId = "ACT-003"; :>> label = "PrescribingPhysician"; }
78
72
  attribute :>> trainingLevel = "licensed prescriber";
79
- attribute :>> description = "Prescribes drug, concentration, basal rate, bolus volume, lockout interval, and maximum dose limits.";
73
+ doc /* Prescribes drug, concentration, basal rate, bolus volume, lockout interval, and maximum dose limits. */
80
74
  perform oaPrescribe;
81
75
  }
82
76
  part actorPharmacist : User {
83
77
  attribute :>> actorKind = ActorKind::clinician;
84
- @MemoIdentity { :>> providedId = "ACT-004"; }
85
- attribute :>> name = "Pharmacist";
78
+ @MemoIdentity { :>> providedId = "ACT-004"; :>> label = "Pharmacist"; }
86
79
  attribute :>> trainingLevel = "licensed pharmacist";
87
- attribute :>> description = "Prepares the drug reservoir and verifies drug and concentration against the prescription.";
80
+ doc /* Prepares the drug reservoir and verifies drug and concentration against the prescription. */
88
81
  perform oaLoadReservoir;
89
82
  }
90
83
  part actorTechnician : User {
91
84
  attribute :>> actorKind = ActorKind::technician;
92
- @MemoIdentity { :>> providedId = "ACT-005"; }
93
- attribute :>> name = "BiomedicalTechnician";
85
+ @MemoIdentity { :>> providedId = "ACT-005"; :>> label = "BiomedicalTechnician"; }
94
86
  attribute :>> trainingLevel = "service-trained; authenticated service access";
95
- attribute :>> description = "Performs maintenance, battery replacement, and calibration through the service interface.";
87
+ doc /* Performs maintenance, battery replacement, and calibration through the service interface. */
96
88
  perform oaMaintain;
97
89
  }
98
90
 
99
91
  // ── Foreseeable use errors (IEC 62366-1, AAMI TIR PCA) ──────
100
92
  part ueMisprogrammedRate : UseError {
101
- @MemoIdentity { :>> providedId = "UE-001"; }
102
- attribute :>> name = "MisprogrammedInfusionParameters";
93
+ @MemoIdentity { :>> providedId = "UE-001"; :>> label = "MisprogrammedInfusionParameters"; }
103
94
  attribute :>> errorCategory = UseErrorCategoryKind::actionCategory;
104
95
  attribute :>> severity = SeverityKind::catastrophic;
105
96
  attribute :>> rootCauseType = "decimal-point / unit entry slip during prescription programming";
106
- attribute :>> description = "Clinician enters a basal rate or bolus volume an order of magnitude off (e.g. mg vs mL, misplaced decimal).";
97
+ doc /* Clinician enters a basal rate or bolus volume an order of magnitude off (e.g. mg vs mL, misplaced decimal). */
107
98
  @MemoIdentity { :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (incorrect dose settings)"; }
108
99
  }
109
100
  part ueBolusByProxy : UseError {
110
- @MemoIdentity { :>> providedId = "UE-002"; }
111
- attribute :>> name = "PCAByProxy";
101
+ @MemoIdentity { :>> providedId = "UE-002"; :>> label = "PCAByProxy"; }
112
102
  attribute :>> errorCategory = UseErrorCategoryKind::cognition;
113
103
  attribute :>> severity = SeverityKind::catastrophic;
114
104
  attribute :>> rootCauseType = "family member or caregiver presses bolus button on behalf of a sedated patient";
115
- attribute :>> description = "Bolus doses requested by someone other than the patient defeat the inherent safety of patient-limited dosing.";
105
+ doc /* Bolus doses requested by someone other than the patient defeat the inherent safety of patient-limited dosing. */
116
106
  @MemoIdentity { :>> sourceReference = "illustrative — no source"; }
117
107
  }
118
108
  part ueWrongDrugLoaded : UseError {
119
- @MemoIdentity { :>> providedId = "UE-003"; }
120
- attribute :>> name = "WrongDrugOrConcentrationLoaded";
109
+ @MemoIdentity { :>> providedId = "UE-003"; :>> label = "WrongDrugOrConcentrationLoaded"; }
121
110
  attribute :>> errorCategory = UseErrorCategoryKind::cognition;
122
111
  attribute :>> severity = SeverityKind::catastrophic;
123
112
  attribute :>> rootCauseType = "reservoir containing wrong drug or concentration mounted without verification";
124
- attribute :>> description = "Loaded drug or concentration differs from the programmed prescription, so delivered dose differs from intended dose.";
113
+ doc /* Loaded drug or concentration differs from the programmed prescription, so delivered dose differs from intended dose. */
125
114
  @MemoIdentity { :>> sourceReference = "illustrative — no source"; }
126
115
  }
127
116
  part ueAlarmDisregard : UseError {
128
- @MemoIdentity { :>> providedId = "UE-004"; }
129
- attribute :>> name = "AlarmSilencedAndForgotten";
117
+ @MemoIdentity { :>> providedId = "UE-004"; :>> label = "AlarmSilencedAndForgotten"; }
130
118
  attribute :>> errorCategory = UseErrorCategoryKind::memoryRecall;
131
119
  attribute :>> severity = SeverityKind::serious;
132
120
  attribute :>> rootCauseType = "alarm silenced during high workload and the underlying condition never resolved";
133
- attribute :>> description = "Clinician silences an alarm and does not return to resolve the underlying condition (e.g. occlusion), interrupting therapy.";
121
+ doc /* Clinician silences an alarm and does not return to resolve the underlying condition (e.g. occlusion), interrupting therapy. */
134
122
  @MemoIdentity { :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (attentional/memory failure)"; }
135
123
  }
136
124
  // Which task each use error is committed during (IEC 62366-1). This was
@@ -18,81 +18,75 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
18
18
  private import memo_core_common::MemoIdentity;
19
19
  part therapyConfigurationAsset : CybersecurityAsset {
20
20
  @MemoIdentity { :>> providedId = "AST-CYB-001"; }
21
- attribute :>> name = "TherapyConfigurationAsset";
22
21
  attribute :>> assetKind = AssetKind::configuration;
23
- attribute :>> confidentialityNeed = "medium";
24
- attribute :>> integrityNeed = "very high";
25
- attribute :>> availabilityNeed = "high";
22
+ attribute :>> confidentialityNeed = SecurityNeedKind::medium;
23
+ attribute :>> integrityNeed = SecurityNeedKind::veryHigh;
24
+ attribute :>> availabilityNeed = SecurityNeedKind::high;
26
25
  attribute :>> privacyRelevant = false;
27
26
  attribute :>> safetyRelevant = true;
28
- attribute :>> owningLayer = "software_structure";
27
+ ref :>> holder = gpcaSoftware.config;
29
28
  }
30
29
 
31
30
  part patientEventLogAsset : CybersecurityAsset {
32
31
  @MemoIdentity { :>> providedId = "AST-CYB-002"; }
33
- attribute :>> name = "PatientEventLogAsset";
34
32
  attribute :>> assetKind = AssetKind::auditRecord;
35
- attribute :>> confidentialityNeed = "high";
36
- attribute :>> integrityNeed = "high";
37
- attribute :>> availabilityNeed = "medium";
33
+ attribute :>> confidentialityNeed = SecurityNeedKind::high;
34
+ attribute :>> integrityNeed = SecurityNeedKind::high;
35
+ attribute :>> availabilityNeed = SecurityNeedKind::medium;
38
36
  attribute :>> privacyRelevant = true;
39
37
  attribute :>> safetyRelevant = false;
40
- attribute :>> owningLayer = "software_structure";
38
+ ref :>> holder = gpcaSoftware.logging;
41
39
  }
42
40
 
43
41
  part maintenancePortBoundary : TrustBoundary {
44
42
  @MemoIdentity { :>> providedId = "TB-001"; }
45
- attribute :>> name = "MaintenancePortBoundary";
46
43
  attribute :>> boundaryType = "service-access";
47
44
  attribute :>> crossingConstraint = "Boundary between service tooling and therapy controller runtime.";
48
45
  attribute :>> trustAssumption = "Service tooling on the untrusted side requires authentication before any crossing is permitted.";
49
46
  }
50
47
 
48
+ // --8<-- [start:threat]
51
49
  part unauthorizedConfigChangeThreat : Threat {
52
- @MemoIdentity { :>> providedId = "TH-001"; }
53
- attribute :>> name = "UnauthorizedTherapyConfigurationChange";
50
+ @MemoIdentity { :>> providedId = "TH-001"; :>> label = "UnauthorizedTherapyConfigurationChange"; }
54
51
  attribute :>> driverKind = "cybersecurity";
55
52
  attribute :>> threatCategory = ThreatCategoryKind::tampering;
56
53
  attribute :>> attackVector = "maintenance port";
57
54
  attribute :>> threatSource = "unauthorized actor with local access";
58
55
  attribute :>> precondition = "maintenance interface exposed without strong authentication";
59
56
  attribute :>> affectedConcern = ConcernKind::cybersecurity;
60
- attribute :>> defaultTechnique = "STRIDE tampering";
57
+ // --8<-- [end:threat]
61
58
  }
62
59
 
63
60
  part eventLogTamperingThreat : Threat {
64
- @MemoIdentity { :>> providedId = "TH-002"; }
65
- attribute :>> name = "PatientEventLogTampering";
61
+ @MemoIdentity { :>> providedId = "TH-002"; :>> label = "PatientEventLogTampering"; }
66
62
  attribute :>> driverKind = "cybersecurity";
67
63
  attribute :>> threatCategory = ThreatCategoryKind::repudiation;
68
64
  attribute :>> attackVector = "maintenance port";
69
65
  attribute :>> threatSource = "unauthorized actor with local access";
70
66
  attribute :>> precondition = "audit log writable without integrity protection";
71
67
  attribute :>> affectedConcern = ConcernKind::cybersecurity;
72
- attribute :>> defaultTechnique = "STRIDE repudiation";
73
68
  }
74
69
 
75
- part weakServiceAuthentication : Vulnerability {
70
+ // --8<-- [start:vulnerability]
71
+ item weakServiceAuthentication : Vulnerability {
76
72
  @MemoIdentity { :>> providedId = "VULN-001"; }
77
- attribute :>> name = "WeakServiceAuthentication";
78
73
  attribute :>> weakness = "service mode relies on shared default credential";
79
74
  attribute :>> exploitability = "moderate";
80
75
  attribute :>> discoveryMethod = "architecture review";
81
- attribute :>> affectedLayer = "software_structure";
76
+ ref :>> affectedElement = gpcaSoftware.config;
82
77
  attribute :>> cweReference = "CWE-798";
78
+ // --8<-- [end:vulnerability]
83
79
  }
84
80
 
85
81
  action tamperedConfigurationScenario : OperativeScenario {
86
- @MemoIdentity { :>> providedId = "SCN-001"; }
87
- attribute :>> name = "TamperedTherapyConfigurationScenario";
88
- attribute :>> description = "An attacker with local access to the maintenance port alters lockout or dose parameters, aiming to bypass safety limits; may enable unsafe therapy delivery or bypass safeguards.";
82
+ @MemoIdentity { :>> providedId = "SCN-001"; :>> label = "TamperedTherapyConfigurationScenario"; }
83
+ doc /* An attacker with local access to the maintenance port alters lockout or dose parameters, aiming to bypass safety limits; may enable unsafe therapy delivery or bypass safeguards. */
89
84
  attribute :>> actorDescription = "unauthorized actor with local access to the maintenance port";
90
85
  attribute :>> defaultCategory = ThreatCategoryKind::tampering;
91
86
  }
92
87
 
93
- part unsafeDoseCyberHazard : CyberHazard {
94
- @MemoIdentity { :>> providedId = "CHZ-001"; }
95
- attribute :>> name = "UnsafeTherapyConfigurationHazard";
88
+ item unsafeDoseCyberHazard : CyberHazard {
89
+ @MemoIdentity { :>> providedId = "CHZ-001"; :>> label = "UnsafeTherapyConfigurationHazard"; }
96
90
  attribute :>> hazardType = HazardTypeKind::drugDeliveryError;
97
91
  attribute :>> foreseeable = true;
98
92
  attribute :>> securityImpact = "loss of configuration integrity";
@@ -103,7 +97,6 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
103
97
 
104
98
  part configurationTamperingRisk : CyberRisk {
105
99
  @MemoIdentity { :>> providedId = "CRISK-001"; }
106
- attribute :>> name = "ConfigurationTamperingRisk";
107
100
  attribute :>> driverKind = "cyber risk";
108
101
  attribute :>> probabilityEstimate = ProbabilityKind::occasional;
109
102
  attribute :>> severityEstimate = SeverityKind::catastrophic;
@@ -116,8 +109,7 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
116
109
  }
117
110
 
118
111
  part strongServiceAuthentication : CyberMitigation {
119
- @MemoIdentity { :>> providedId = "CMIT-001"; }
120
- attribute :>> name = "StrongServiceAuthenticationAndAudit";
112
+ @MemoIdentity { :>> providedId = "CMIT-001"; :>> label = "StrongServiceAuthenticationAndAudit"; }
121
113
  attribute :>> controlKind = RiskControlKind::protectiveMeasure;
122
114
  attribute :>> implementationKind = RiskControlImplementationKind::softwareDesign;
123
115
  attribute :>> verificationStatus = "planned";
@@ -127,8 +119,7 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
127
119
  }
128
120
 
129
121
  requirement reqAuthenticatedServiceAccess : SecurityRequirement {
130
- @MemoIdentity { :>> providedId = "SREQ-001"; }
131
- attribute :>> name = "AuthenticatedServiceAccess";
122
+ @MemoIdentity { :>> providedId = "SREQ-001"; :>> label = "AuthenticatedServiceAccess"; }
132
123
  attribute :>> statement = "The system shall require authenticated and authorized service access before any therapy configuration parameter can be modified.";
133
124
  attribute :>> sourceKind = RequirementSourceKind::risk;
134
125
  attribute :>> concernKind = ConcernKind::cybersecurity;
@@ -139,14 +130,11 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
139
130
  attribute :>> assumptionSummary = "cryptographic identity available";
140
131
  attribute :>> guaranteeSummary = "only authorized service access can change therapy configuration";
141
132
  attribute :>> securityObjective = "integrity";
142
- attribute :>> derivedFromThreat = "TH-001";
143
- attribute :>> defaultConcern = ConcernKind::cybersecurity;
144
133
  attribute :>> safetyClass = SafetyClassKind::C;
145
134
  }
146
135
 
147
136
  verification vcAuthenticatedServiceAccess : VerificationCase {
148
- @MemoIdentity { :>> providedId = "CVER-001"; }
149
- attribute :>> name = "VerifyAuthenticatedServiceAccess";
137
+ @MemoIdentity { :>> providedId = "CVER-001"; :>> label = "VerifyAuthenticatedServiceAccess"; }
150
138
  attribute :>> methodKind = MemoVerificationMethodKind::test;
151
139
  attribute :>> acceptanceCriteria = "Only authenticated and authorized service sessions may modify therapy configuration; all attempts are logged.";
152
140
  attribute :>> status = ElementStatusKind::approved;
@@ -154,21 +142,26 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
154
142
  objective { verify reqAuthenticatedServiceAccess; }
155
143
  }
156
144
 
157
- connection : ThreatenedBy connect protectedAsset ::> therapyConfigurationAsset to realizedThreat ::> unauthorizedConfigChangeThreat;
145
+ // --8<-- [start:chain]
146
+ connection : ThreatenedBy connect protectedAsset ::> therapyConfigurationAsset to threat ::> unauthorizedConfigChangeThreat;
158
147
 
159
- connection : ThreatenedBy connect protectedAsset ::> patientEventLogAsset to realizedThreat ::> eventLogTamperingThreat;
148
+ connection : ThreatenedBy connect protectedAsset ::> patientEventLogAsset to threat ::> eventLogTamperingThreat;
160
149
 
161
- connection : Exploits connect realizedThreat ::> unauthorizedConfigChangeThreat to enablingVulnerability ::> weakServiceAuthentication;
150
+ connection : Exploits connect threat ::> unauthorizedConfigChangeThreat to enablingVulnerability ::> weakServiceAuthentication;
162
151
 
163
152
  connection : RealizedByScenario connect realizedThreat ::> unauthorizedConfigChangeThreat to scenario ::> tamperedConfigurationScenario;
153
+ // --8<-- [end:chain]
164
154
 
165
- connection : Mitigates { attribute :>> mitigationKind = MitigationKind::vulnerability; connect control ::> strongServiceAuthentication to mitigatedElement ::> weakServiceAuthentication; }
155
+ connection : Mitigates connect control ::> strongServiceAuthentication to mitigatedElement ::> weakServiceAuthentication { attribute :>> mitigationKind = MitigationKind::vulnerability; }
166
156
 
167
157
  connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> unauthorizedConfigChangeThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
168
158
 
169
159
  connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> eventLogTamperingThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
170
160
 
171
- connection : ImpactsSafety connect cyberElement ::> configurationTamperingRisk to safetyElement ::> riskBefore;
161
+ // A security risk feeds safety risk management at the hazard it can
162
+ // cause (AAMI TIR57), not at another risk's estimate: tampered therapy
163
+ // configuration is a route to over-infusion.
164
+ connection : ImpactsSafety connect cyberElement ::> configurationTamperingRisk to safetyElement ::> overdoseHazard;
172
165
 
173
166
  connection : CrossesTrustBoundary connect boundary ::> maintenancePortBoundary to crossingItem ::> therapyConfigurationAsset;
174
167