@memoarchitect/ontology 0.7.0 → 0.8.24

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 (270) hide show
  1. package/README.md +4 -2
  2. package/examples/connected-patient-monitor/memo.package.yaml +3 -0
  3. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
  4. package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/views/connected_patient_monitor_overview.sysml +1 -1
  5. package/examples/embedded-infusion-pump/memo.package.yaml +3 -0
  6. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +8 -6
  7. package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/views/embedded_infusion_pump_overview.sysml +1 -1
  8. package/examples/functional-logical-physical/memo.package.yaml +3 -0
  9. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +6 -6
  10. package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/views/functional_logical_physical_overview.sysml +1 -1
  11. package/examples/gpca-pump/memo.package.yaml +3 -0
  12. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +18 -8
  13. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +341 -99
  14. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +25 -11
  15. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +328 -271
  16. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +52 -11
  17. package/examples/gpca-pump/model/catalog/gpca_context.sysml +14 -3
  18. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +8 -5
  19. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +175 -259
  20. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +97 -103
  21. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +5 -10
  22. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +101 -100
  23. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
  24. package/examples/gpca-pump/model/catalog/gpca_system.sysml +17 -17
  25. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +274 -334
  26. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +115 -35
  27. package/examples/gpca-pump/model/catalog/project.sysml +5 -0
  28. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +2 -4
  29. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +2 -4
  30. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +1 -4
  31. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +2 -5
  32. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +1 -3
  33. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +1 -3
  34. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +1 -3
  35. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -7
  36. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
  37. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +1 -3
  38. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +2 -4
  39. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +1 -3
  40. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +2 -4
  41. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +2 -4
  42. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +1 -3
  43. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +5 -8
  44. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +1 -3
  45. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +6 -6
  46. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +5 -6
  47. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
  48. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +1 -3
  49. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +2 -5
  50. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
  51. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +5 -6
  52. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +5 -6
  53. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
  54. package/examples/ivd-laboratory-system/memo.package.yaml +3 -0
  55. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +1 -1
  56. package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/views/ivd_laboratory_system_overview.sysml +1 -1
  57. package/examples/manual-surgical-instrument/memo.package.yaml +3 -0
  58. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +4 -3
  59. package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/views/manual_surgical_instrument_overview.sysml +1 -1
  60. package/examples/multidimensional-layers/memo.package.yaml +3 -0
  61. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
  62. package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/views/multidimensional_layers_overview.sysml +0 -1
  63. package/examples/nested-architecture-dsm/memo.package.yaml +3 -0
  64. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +133 -128
  65. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +139 -157
  66. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +56 -33
  67. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +25 -26
  68. package/examples/reusable-instrument/memo.package.yaml +3 -0
  69. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +16 -23
  70. package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/views/reusable_instrument_overview.sysml +0 -1
  71. package/examples/ros-mobile-robot/README.md +40 -0
  72. package/examples/ros-mobile-robot/memo.package.yaml +3 -0
  73. package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
  74. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
  75. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
  76. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +12 -0
  77. package/examples/software-only-medical-device/memo.package.yaml +3 -0
  78. package/examples/software-only-medical-device/model/catalog/project.sysml +4 -0
  79. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +12 -6
  80. package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/views/software_only_medical_device_overview.sysml +0 -1
  81. package/examples/surgical-closure-workflow/memo.package.yaml +3 -0
  82. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +58 -75
  83. package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/views/surgical_closure_workflow_overview.sysml +0 -1
  84. package/examples/surgical-robot/memo.package.yaml +3 -0
  85. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +1 -1
  86. package/examples/surgical-robot/model/catalog/viewpoints/unassigned/views/surgical_robot_overview.sysml +0 -1
  87. package/examples/sysml-diagram-samples/memo.package.yaml +2 -0
  88. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +12 -18
  89. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +8 -11
  90. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +43 -68
  91. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +57 -68
  92. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +40 -70
  93. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +4 -8
  94. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +1 -20
  95. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +52 -84
  96. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +22 -33
  97. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +13 -10
  98. package/examples/temperature-alarm/memo.package.yaml +3 -0
  99. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +28 -25
  100. package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/views/temperature_alarm_overview.sysml +0 -1
  101. package/examples/ui-screen-regions/memo.package.yaml +3 -0
  102. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +57 -33
  103. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +102 -79
  104. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +5 -5
  105. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +21 -6
  106. package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
  107. package/examples/ui-screen-regions/model/catalog/traces.sysml +28 -125
  108. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +2 -3
  109. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
  110. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
  111. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +1 -2
  112. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +1 -2
  113. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +1 -2
  114. package/extensions/LICENSES/MIT.txt +19 -0
  115. package/extensions/README.md +94 -0
  116. package/extensions/aadl/memo.package.yaml +18 -0
  117. package/extensions/aadl/src/aadl_extension.sysml +6 -0
  118. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
  119. package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
  120. package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
  121. package/extensions/cloud/memo.package.yaml +18 -0
  122. package/extensions/cloud/src/cloud_extension.sysml +44 -0
  123. package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
  124. package/extensions/container/memo.package.yaml +18 -0
  125. package/extensions/container/src/container_extension.sysml +37 -0
  126. package/extensions/container/src/methodology/container_methodology.sysml +17 -0
  127. package/extensions/messaging/memo.package.yaml +18 -0
  128. package/extensions/messaging/src/messaging_extension.sysml +64 -0
  129. package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
  130. package/extensions/ros/memo.package.yaml +18 -0
  131. package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
  132. package/extensions/ros/src/ros_extension.sysml +200 -0
  133. package/extensions/template/src/extension.sysml +37 -0
  134. package/memo.manifest.yaml +13 -2
  135. package/methodologies/default/memo.package.yaml +1 -1
  136. package/methodologies/gpca/memo.package.yaml +1 -1
  137. package/ontology/memo.package.yaml +1 -1
  138. package/package.json +5 -3
  139. package/profile/memo.package.yaml +1 -1
  140. package/src/architecture/decisions/memo_decisions.sysml +23 -2
  141. package/src/architecture/functional/behavior/memo_behavior.sysml +51 -23
  142. package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
  143. package/src/architecture/functional/functions/memo_functions.sysml +93 -36
  144. package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +2 -2
  145. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -22
  146. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +40 -13
  147. package/src/architecture/implementation/ui/memo_ui.sysml +83 -43
  148. package/src/architecture/logical/interfaces/memo_interfaces.sysml +64 -12
  149. package/src/architecture/logical/structure/memo_logical_structure.sysml +26 -25
  150. package/src/architecture/operational/activities/memo_activities.sysml +27 -29
  151. package/src/architecture/operational/context/actors/memo_actors.sysml +8 -10
  152. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +16 -33
  153. package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -17
  154. package/src/architecture/operational/scenarios/memo_scenarios.sysml +36 -84
  155. package/src/architecture/operational/structure/memo_operational.sysml +42 -13
  156. package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -27
  157. package/src/architecture/operational/workflows/memo_workflows.sysml +45 -28
  158. package/src/architecture/realization/deployment/memo_deployment.sysml +115 -20
  159. package/src/architecture/realization/physical/memo_physical_architecture.sysml +29 -4
  160. package/src/artifacts/configuration_management/memo_configuration_management.sysml +16 -0
  161. package/src/artifacts/core/memo_controlled_artifacts.sysml +3 -1
  162. package/src/artifacts/standards/cfr_21_820.sysml +116 -0
  163. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
  164. package/src/artifacts/standards/iec_60601_1.sysml +149 -0
  165. package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
  166. package/src/artifacts/standards/iec_60812.sysml +51 -0
  167. package/src/artifacts/standards/iec_62304.sysml +210 -0
  168. package/src/artifacts/standards/iec_62366_1.sysml +113 -0
  169. package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
  170. package/src/artifacts/standards/iso_13485.sysml +113 -0
  171. package/src/artifacts/standards/iso_14971.sysml +94 -0
  172. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
  173. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
  174. package/src/artifacts/templates/dhf/21cfr820/design-input.md +1 -1
  175. package/src/artifacts/templates/dhf/21cfr820/design-output.md +5 -5
  176. package/src/artifacts/templates/dhf/21cfr820/design-review.md +1 -1
  177. package/src/artifacts/templates/dhf/21cfr820/design-validation.md +2 -2
  178. package/src/artifacts/templates/dhf/21cfr820/design-verification.md +2 -2
  179. package/src/artifacts/templates/dhf/21cfr820/dhf-index.md +2 -2
  180. package/src/artifacts/templates/dhf/21cfr820/transfer-plan.md +1 -1
  181. package/src/artifacts/templates/dhf/21cfr820/user-needs.md +1 -1
  182. package/src/artifacts/templates/dhf/21cfr820/vv-plan.md +3 -3
  183. package/src/artifacts/templates/dhf/21cfr820/vv-report.md +4 -4
  184. package/src/artifacts/templates/dhf/fda-cybersecurity/incident-response.md +1 -1
  185. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +3 -2
  186. package/src/artifacts/templates/dhf/fda-cybersecurity/security-arch.md +2 -2
  187. package/src/artifacts/templates/dhf/fda-cybersecurity/threat-model.md +4 -4
  188. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +4 -3
  189. package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
  190. package/src/artifacts/templates/dhf/iec-62304/detailed-design.md +1 -1
  191. package/src/artifacts/templates/dhf/iec-62304/integration-test.md +3 -3
  192. package/src/artifacts/templates/dhf/iec-62304/sad.md +6 -5
  193. package/src/artifacts/templates/dhf/iec-62304/sbom.md +3 -2
  194. package/src/artifacts/templates/dhf/iec-62304/sdp.md +5 -4
  195. package/src/artifacts/templates/dhf/iec-62304/soup.md +4 -2
  196. package/src/artifacts/templates/dhf/iec-62304/srs.md +54 -20
  197. package/src/artifacts/templates/dhf/iec-62304/sw-traceability.md +3 -3
  198. package/src/artifacts/templates/dhf/iec-62304/system-test.md +1 -1
  199. package/src/artifacts/templates/dhf/iec-62366/summative-eval.md +1 -1
  200. package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +40 -4
  201. package/src/artifacts/templates/dhf/iec-62366/ue-plan.md +1 -1
  202. package/src/artifacts/templates/dhf/iec-62366/urra.md +3 -3
  203. package/src/artifacts/templates/dhf/iso-14971/fmea.md +42 -19
  204. package/src/artifacts/templates/dhf/iso-14971/har.md +3 -3
  205. package/src/artifacts/templates/dhf/iso-14971/rmp.md +2 -2
  206. package/src/artifacts/templates/dhf/system/sad.md +173 -0
  207. package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
  208. package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
  209. package/src/artifacts/templates/dhf/system/syrs.md +128 -0
  210. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +40 -21
  211. package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
  212. package/src/assurance/requirements/memo_requirements.sysml +7 -20
  213. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  214. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
  215. package/src/assurance/safety_risk/memo_risk.sysml +90 -7
  216. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +16 -0
  217. package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
  218. package/src/core/annotations/memo_annotations.sysml +25 -6
  219. package/src/core/common/memo_common.sysml +130 -21
  220. package/src/core/consistency_rules/consistency_rules.sysml +1 -1
  221. package/src/core/dimensions/dimensions.sysml +12 -0
  222. package/src/core/enumerations/memo_enumerations.sysml +60 -14
  223. package/src/core/relationships/memo_relationships.sysml +199 -196
  224. package/src/memo_namespaces.sysml +30 -0
  225. package/src/methodology/core/memo_core.sysml +24 -0
  226. package/src/methodology/profiles/memo_profiles.sysml +1 -1
  227. package/src/methodology/workflow/memo_workflow.sysml +5 -5
  228. package/src/rules/closure/closure_rules.sysml +20 -20
  229. package/src/rules/crosslayer/cross_layer_rules.sysml +2 -2
  230. package/src/rules/ontology/ontology_invariants.sysml +223 -11
  231. package/src/rules/quantitative/quantitative_rules.sysml +2 -2
  232. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +30 -30
  233. package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
  234. package/src/viewpoints/context/context_viewpoint.sysml +2 -3
  235. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +1 -2
  236. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -4
  237. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +46 -3
  238. package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
  239. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -3
  240. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -3
  241. package/src/viewpoints/logical/logical_viewpoint.sysml +1 -2
  242. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +1 -2
  243. package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
  244. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +2 -3
  245. package/src/viewpoints/physical/physical_viewpoint.sysml +1 -2
  246. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +1 -2
  247. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +1 -2
  248. package/src/viewpoints/requirements/requirements_viewpoint.sysml +1 -2
  249. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +1 -2
  250. package/src/viewpoints/risk/risk_viewpoint.sysml +1 -2
  251. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +1 -2
  252. package/src/viewpoints/software/software_viewpoint.sysml +1 -2
  253. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +1 -2
  254. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
  255. package/src/viewpoints/usability/usability_viewpoint.sysml +1 -2
  256. package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
  257. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -3
  258. package/templates/connected-device/memo.package.yaml +2 -0
  259. package/templates/default/memo.package.yaml +2 -0
  260. package/templates/infusion-pump/memo.package.yaml +2 -0
  261. package/templates/monitoring-device/memo.package.yaml +2 -0
  262. package/templates/samd/memo.package.yaml +2 -0
  263. package/examples/extensions/README.md +0 -16
  264. package/examples/extensions/template/src/extension.sysml +0 -15
  265. package/examples/gpca-pump/gpca-pump.kpar +0 -0
  266. /package/{examples/extensions → extensions}/clinical/memo.package.yaml +0 -0
  267. /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
  268. /package/{examples/extensions → extensions}/clinical/src/methodology/clinical_methodology.sysml +0 -0
  269. /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
  270. /package/{examples/extensions → extensions}/template/memo.package.yaml +0 -0
@@ -6,7 +6,6 @@ package memo_examples_reusable_instrument_viewpoints_unassigned_views_reusable_i
6
6
  view reusableInstrumentOverview : MemoDiagramView {
7
7
  expose memo_examples_reusable_instrument::*;
8
8
  attribute depth = 2;
9
- attribute :>> title = "Reusable Instrument Overview";
10
9
  attribute :>> viewKind = DiagramViewKind::actionflow;
11
10
  attribute :>> diagramType = "ofd";
12
11
  }
@@ -0,0 +1,40 @@
1
+ # ROS mobile robot
2
+
3
+ A focused MEMO example that demonstrates **using an extension**. The subject is
4
+ a ROS 2 mobile logistics robot; the point is the mechanism.
5
+
6
+ Extensions are a way to model, so they live in [`extensions/`](../../extensions),
7
+ beside the ontology. This project is one of their consumers.
8
+
9
+ - `model/catalog/project.sysml` — the binding. It lists three extension modules
10
+ (`memo_extension_messaging`, `memo_extension_container`, `memo_extension_ros`)
11
+ in `includedModule`. That is how extensions compose: at the project binding,
12
+ never by chaining methodologies.
13
+ - `model/catalog/ros_mobile_robot.sysml` — the model.
14
+ - `model/catalog/viewpoints/` — diagram views over that catalog.
15
+
16
+ ## What it shows
17
+
18
+ 1. **Extension types are used exactly like base types.** `RosNode` specializes
19
+ `SoftwareComponent`, so it inherits period, WCET, priority, safety class and
20
+ fault containment, and every base rule still applies to it. The three nodes
21
+ set `runtimeKind` individually — two composed into one container process,
22
+ the safety monitor in its own — because that is a design decision the
23
+ extension type must not make for the modeller.
24
+ 2. **Publish and subscribe use native SysML.** A ROS message is an item
25
+ definition, a named topic is its item usage, nodes own `out` publisher and
26
+ `in` subscriber ports, and native interfaces/flows connect those ports. The
27
+ extension declares no publish/subscribe relation.
28
+ 3. **Deployment reuses the base relations unchanged.** `BuildsInto`,
29
+ `DeploysTo` and `ProvidesEnvironment` carry the whole chain from source
30
+ module to container image to compute unit to ROS runtime, with no
31
+ ROS-specific relation anywhere in it. That is the evidence the base is
32
+ factored correctly.
33
+ 4. **QoS is a typed profile, not a property bag.** Publisher ports carry an
34
+ offered `RosQosProfile` and subscriber ports a requested one, so the incompatibility
35
+ that silently delivers nothing at runtime is two adjacent values in the
36
+ model. This is why the `PropertySet` stub was deleted rather than made real.
37
+ 5. **Services and actions are different native interface contracts.** A service
38
+ has one request and one correlated response. An action has goal,
39
+ acceptance, feedback, cancellation, result, and status features plus a
40
+ native execution-state family.
@@ -0,0 +1,3 @@
1
+ name: ros-mobile-robot
2
+ entrypoint: model/catalog/project.sysml
3
+ include: [model]
@@ -0,0 +1,33 @@
1
+ // ROS Mobile Robot — project identity and method binding.
2
+ //
3
+ // The native entrypoint. The imports name what this project contains and the
4
+ // binding names the methodology it is governed by. No YAML file participates.
5
+ package memo_examples_ros_mobile_robot_project {
6
+ private import ScalarValues::*;
7
+
8
+ private import memo_core_enumerations::*;
9
+ private import memo_methodology_core::*;
10
+ private import memo_methodology_profiles::*;
11
+
12
+ // The project's own content, imported so the catalog is one reachable
13
+ // closure from a single entrypoint.
14
+ private import memo_examples_ros_mobile_robot_viewpoints_unassigned::*;
15
+ private import memo_examples_ros_mobile_robot_viewpoints_unassigned_views_ros_mobile_robot_overview::*;
16
+
17
+ part projectBinding : ProjectMethodBinding {
18
+ attribute :>> id = "PMB-ROS-MOBILE-ROBOT-001";
19
+ attribute :>> name = "RosMobileRobotProjectMethodBinding";
20
+ attribute :>> projectName = "ROS Mobile Robot";
21
+ ref :>> selectedMethodology = mdDefaultDefinition;
22
+ attribute :>> scopeMode = ScopeModeKind::explicit;
23
+ // This is the composition mechanism: three independent extensions,
24
+ // listed here. `includedModule` is [0..*] on both MethodologyDefinition
25
+ // and ProjectMethodBinding, while `baseMethodology` is [0..1] — so
26
+ // extensions combine at the binding and never by chaining.
27
+ attribute :>> includedModule = (
28
+ "memo_extension_messaging",
29
+ "memo_extension_container",
30
+ "memo_extension_ros"
31
+ );
32
+ }
33
+ }
@@ -0,0 +1,296 @@
1
+ // Focused example: a ROS 2 mobile logistics robot, modelled with the ROS
2
+ // extension. The point of the example is the MECHANISM, not the robot — it
3
+ // demonstrates how an extension is used, and it is deliberately the only place
4
+ // ROS vocabulary appears outside `extensions/ros`.
5
+ //
6
+ // Three things it shows:
7
+ // 1. Extension types are used exactly like base types. `RosNode` is a
8
+ // `SoftwareComponent`, so period, WCET, safety class and the rest are
9
+ // inherited and every base rule still applies to it.
10
+ // 2. ROS communication uses native item definitions/usages, directional
11
+ // ports, interfaces, and flows — no publish/subscribe relation is added.
12
+ // 3. Deployment reuses the BASE relations unchanged — `BuildsInto`,
13
+ // `DeploysTo`, `ProvidesEnvironment` — with no ROS-specific relation
14
+ // anywhere in the chain.
15
+ package memo_examples_ros_mobile_robot {
16
+ private import ScalarValues::*;
17
+ private import ModelingMetadata::*;
18
+
19
+ private import memo_core_enumerations::*;
20
+ private import memo_core_relationships::*;
21
+ private import memo_architecture_implementation_software_structure::*;
22
+ private import memo_architecture_implementation_software_runtime::*;
23
+ private import memo_architecture_functional_behavior::*;
24
+ private import memo_architecture_realization_deployment::*;
25
+ private import memo_architecture_realization_physical::*;
26
+ private import memo_extension_messaging::*;
27
+ private import memo_extension_container::*;
28
+ private import memo_extension_ros::*;
29
+
30
+ // ── Message definitions and named topic instances ──────────────────
31
+ // The definition is the ROS message contract. A named usage is the topic
32
+ // deployed in this system; publisher/subscriber ports reference that same
33
+ // usage and native flows carry its message type.
34
+ item def LaserScan specializes RosMessage {
35
+ attribute :>> rosTypeName = "sensor_msgs/msg/LaserScan";
36
+ attribute :>> messageSchema = "ranges[], intensities[], angle_min, angle_max, scan_time";
37
+ }
38
+ item def VelocityCommand specializes RosMessage {
39
+ attribute :>> rosTypeName = "geometry_msgs/msg/Twist";
40
+ attribute :>> messageSchema = "linear.x, angular.z";
41
+ }
42
+ item def EmergencyStop specializes RosMessage {
43
+ attribute :>> rosTypeName = "std_msgs/msg/Bool";
44
+ attribute :>> messageSchema = "data (true = stop asserted)";
45
+ }
46
+
47
+ item topicScan : LaserScan {
48
+ attribute :>> id = "RMR-TP-001"; attribute :>> name = "ScanTopic";
49
+ }
50
+ item topicCmdVel : VelocityCommand {
51
+ attribute :>> id = "RMR-TP-002"; attribute :>> name = "CmdVelTopic";
52
+ }
53
+ item topicEstop : EmergencyStop {
54
+ attribute :>> id = "RMR-TP-003"; attribute :>> name = "EmergencyStopTopic";
55
+ }
56
+
57
+ // ── Code ────────────────────────────────────────────────────────────
58
+ part swPerception : SoftwareModule {
59
+ attribute :>> moduleKind = ModuleKind::unit;
60
+ attribute :>> id = "RMR-SW-001"; attribute :>> name = "PerceptionStack";
61
+ attribute :>> responsibility = "Lidar driver and obstacle segmentation.";
62
+ attribute :>> safetyClass = SafetyClassKind::B;
63
+ }
64
+ part swNavigation : SoftwareModule {
65
+ attribute :>> moduleKind = ModuleKind::unit;
66
+ attribute :>> id = "RMR-SW-002"; attribute :>> name = "NavigationStack";
67
+ attribute :>> responsibility = "Global and local planning; velocity command generation.";
68
+ attribute :>> safetyClass = SafetyClassKind::B;
69
+ }
70
+ part swSafety : SoftwareModule {
71
+ attribute :>> moduleKind = ModuleKind::unit;
72
+ attribute :>> id = "RMR-SW-003"; attribute :>> name = "SafetyMonitor";
73
+ attribute :>> responsibility = "Independent watchdog: stops the base on obstacle proximity or missing heartbeat.";
74
+ attribute :>> safetyClass = SafetyClassKind::C;
75
+ }
76
+
77
+ // ── Nodes ───────────────────────────────────────────────────────────
78
+ //
79
+ // `runtimeKind` is set per node rather than by the type: the first two are
80
+ // composed into one container process, the safety monitor runs as its own
81
+ // process so a fault in navigation cannot take it down. That distinction
82
+ // is exactly what an extension type must NOT decide for the modeller.
83
+ part nodeLidar : RosNode {
84
+ attribute :>> runtimeKind = RuntimeKind::thread;
85
+ attribute :>> id = "RMR-ND-001"; attribute :>> name = "LidarDriverNode";
86
+ attribute :>> nodeNamespace = "/robot/perception";
87
+ attribute :>> lifecycleManaged = true;
88
+ attribute :>> executorModel = "single-threaded executor, composed";
89
+ attribute :>> periodMs = 50.0;
90
+ attribute :>> wcetMs = 8.0;
91
+ attribute :>> safetyClass = SafetyClassKind::B;
92
+ out port scanPublisher : RosPublisher {
93
+ ref :>> topic = topicScan;
94
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
95
+ attribute :>> publishRateHz = 20.0;
96
+ attribute :>> offeredQos {
97
+ attribute :>> reliability = RosReliabilityKind::bestEffort;
98
+ attribute :>> durability = RosDurabilityKind::volatile;
99
+ attribute :>> deadlineMs = 60.0;
100
+ attribute :>> livelinessLeaseMs = 200.0;
101
+ attribute :>> historyDepth = 5;
102
+ }
103
+ }
104
+ }
105
+ part nodeNavigation : RosNode {
106
+ attribute :>> runtimeKind = RuntimeKind::thread;
107
+ attribute :>> id = "RMR-ND-002"; attribute :>> name = "NavigationNode";
108
+ attribute :>> nodeNamespace = "/robot/navigation";
109
+ attribute :>> lifecycleManaged = true;
110
+ attribute :>> executorModel = "multi-threaded executor, composed";
111
+ attribute :>> periodMs = 100.0;
112
+ attribute :>> wcetMs = 35.0;
113
+ attribute :>> safetyClass = SafetyClassKind::B;
114
+ in port scanSubscriber : RosSubscriber {
115
+ ref :>> topic = topicScan;
116
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
117
+ attribute :>> lossBehaviour = "hold the last costmap for 200 ms, then command zero velocity";
118
+ attribute :>> requestedQos {
119
+ attribute :>> reliability = RosReliabilityKind::bestEffort;
120
+ attribute :>> durability = RosDurabilityKind::volatile;
121
+ attribute :>> deadlineMs = 60.0;
122
+ attribute :>> livelinessLeaseMs = 200.0;
123
+ attribute :>> historyDepth = 5;
124
+ }
125
+ }
126
+ out port cmdVelPublisher : RosPublisher {
127
+ ref :>> topic = topicCmdVel;
128
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
129
+ attribute :>> publishRateHz = 10.0;
130
+ attribute :>> offeredQos {
131
+ attribute :>> reliability = RosReliabilityKind::reliable;
132
+ attribute :>> durability = RosDurabilityKind::volatile;
133
+ attribute :>> deadlineMs = 150.0;
134
+ attribute :>> livelinessLeaseMs = 300.0;
135
+ attribute :>> historyDepth = 1;
136
+ }
137
+ }
138
+ in port estopSubscriber : RosSubscriber {
139
+ ref :>> topic = topicEstop;
140
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
141
+ attribute :>> lossBehaviour = "no publisher within the liveliness lease is treated as stop asserted";
142
+ attribute :>> requestedQos {
143
+ attribute :>> reliability = RosReliabilityKind::reliable;
144
+ attribute :>> durability = RosDurabilityKind::transientLocal;
145
+ attribute :>> deadlineMs = 100.0;
146
+ attribute :>> livelinessLeaseMs = 200.0;
147
+ attribute :>> historyDepth = 1;
148
+ }
149
+ }
150
+ inout port setModeClient : RosServiceClient {
151
+ attribute :>> serviceName = "/robot/safety/set_mode";
152
+ attribute :>> timeoutMs = 500.0;
153
+ }
154
+ inout port navigateActionServer : RosActionServer {
155
+ attribute :>> actionName = "/robot/navigation/navigate_to_pose";
156
+ }
157
+ }
158
+ part nodeSafetyMonitor : RosNode {
159
+ attribute :>> runtimeKind = RuntimeKind::process;
160
+ attribute :>> id = "RMR-ND-003"; attribute :>> name = "SafetyMonitorNode";
161
+ attribute :>> nodeNamespace = "/robot/safety";
162
+ attribute :>> lifecycleManaged = false;
163
+ attribute :>> executorModel = "own process, real-time priority";
164
+ attribute :>> periodMs = 20.0;
165
+ attribute :>> deadlineMs = 20.0;
166
+ attribute :>> wcetMs = 3.0;
167
+ attribute :>> priority = 90;
168
+ attribute :>> safetyClass = SafetyClassKind::C;
169
+ attribute :>> faultContainment = "separate process; watchdog-fed; stops the base on its own timeout";
170
+ in port scanSubscriber : RosSubscriber {
171
+ ref :>> topic = topicScan;
172
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atMostOnce;
173
+ attribute :>> lossBehaviour = "two consecutive misses assert the stop";
174
+ }
175
+ in port cmdVelSubscriber : RosSubscriber {
176
+ ref :>> topic = topicCmdVel;
177
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
178
+ attribute :>> lossBehaviour = "missing velocity commands assert the stop";
179
+ }
180
+ out port estopPublisher : RosPublisher {
181
+ ref :>> topic = topicEstop;
182
+ attribute :>> deliverySemantics = MessagingDeliveryKind::atLeastOnce;
183
+ attribute :>> publishRateHz = 50.0;
184
+ attribute :>> offeredQos {
185
+ attribute :>> reliability = RosReliabilityKind::reliable;
186
+ attribute :>> durability = RosDurabilityKind::transientLocal;
187
+ attribute :>> deadlineMs = 100.0;
188
+ attribute :>> livelinessLeaseMs = 200.0;
189
+ attribute :>> historyDepth = 1;
190
+ }
191
+ }
192
+ inout port setModeServer : RosServiceServer {
193
+ attribute :>> serviceName = "/robot/safety/set_mode";
194
+ }
195
+ inout port navigateActionClient : RosActionClient {
196
+ attribute :>> actionName = "/robot/navigation/navigate_to_pose";
197
+ }
198
+ }
199
+
200
+ // Cross-view mappings: SEI module-view implementation units are distinct
201
+ // from component-and-connector runtime elements. A runtime node realizes
202
+ // the module whose code it executes; it is not the same model element.
203
+ #refinement dependency nodeLidar to swPerception;
204
+ #refinement dependency nodeNavigation to swNavigation;
205
+ #refinement dependency nodeSafetyMonitor to swSafety;
206
+
207
+ // ── Native topic, service, and action interfaces ───────────────────
208
+ interface scanToNavigation : RosTopicInterface
209
+ connect nodeLidar.scanPublisher to nodeNavigation.scanSubscriber {
210
+ attribute :>> direction = DirectionKind::output;
211
+ }
212
+ interface scanToSafety : RosTopicInterface
213
+ connect nodeLidar.scanPublisher to nodeSafetyMonitor.scanSubscriber {
214
+ attribute :>> direction = DirectionKind::output;
215
+ }
216
+ interface cmdVelToSafety : RosTopicInterface
217
+ connect nodeNavigation.cmdVelPublisher to nodeSafetyMonitor.cmdVelSubscriber {
218
+ attribute :>> direction = DirectionKind::output;
219
+ }
220
+ interface estopToNavigation : RosTopicInterface
221
+ connect nodeSafetyMonitor.estopPublisher to nodeNavigation.estopSubscriber {
222
+ attribute :>> direction = DirectionKind::output;
223
+ }
224
+
225
+ flow of LaserScan from nodeLidar.scanPublisher.payload to nodeNavigation.scanSubscriber.payload;
226
+ flow of LaserScan from nodeLidar.scanPublisher.payload to nodeSafetyMonitor.scanSubscriber.payload;
227
+ flow of VelocityCommand from nodeNavigation.cmdVelPublisher.payload to nodeSafetyMonitor.cmdVelSubscriber.payload;
228
+ flow of EmergencyStop from nodeSafetyMonitor.estopPublisher.payload to nodeNavigation.estopSubscriber.payload;
229
+
230
+ interface setModeService : RosServiceInterface
231
+ connect nodeNavigation.setModeClient to nodeSafetyMonitor.setModeServer {
232
+ attribute :>> direction = DirectionKind::inputOutput;
233
+ }
234
+ interface navigateAction : RosActionInterface
235
+ connect nodeSafetyMonitor.navigateActionClient to nodeNavigation.navigateActionServer {
236
+ attribute :>> direction = DirectionKind::inputOutput;
237
+ }
238
+
239
+ // ── Deployment: base relations, unchanged ───────────────────────────
240
+ part imageRuntime : RosContainerImage {
241
+ attribute :>> id = "RMR-DU-001"; attribute :>> name = "RobotRuntimeImage";
242
+ attribute :>> unitKind = "OCI container image";
243
+ attribute :>> imageReference = "registry.example.com/robot-runtime:2.3.0";
244
+ attribute :>> registry = "registry.example.com";
245
+ attribute :>> digest = "sha256:9f2c1ad4e0b7";
246
+ attribute :>> baseImage = "ros:jazzy-ros-base";
247
+ attribute :>> rosDistribution = "jazzy";
248
+ attribute :>> workspaceOverlay = "/opt/robot_ws";
249
+ attribute :>> integrityProtection = "image signature + SBOM attestation";
250
+ }
251
+ part imageSafety : RosContainerImage {
252
+ attribute :>> id = "RMR-DU-002"; attribute :>> name = "SafetyMonitorImage";
253
+ attribute :>> unitKind = "OCI container image";
254
+ attribute :>> imageReference = "registry.example.com/safety-monitor:2.3.0";
255
+ attribute :>> registry = "registry.example.com";
256
+ attribute :>> digest = "sha256:41bb7c0e5d92";
257
+ attribute :>> baseImage = "ros:jazzy-ros-core";
258
+ attribute :>> rosDistribution = "jazzy";
259
+ attribute :>> workspaceOverlay = "/opt/safety_ws";
260
+ attribute :>> integrityProtection = "image signature + SBOM attestation";
261
+ }
262
+ connection : BuildsInto connect module ::> swPerception to deploymentUnit ::> imageRuntime;
263
+ connection : BuildsInto connect module ::> swNavigation to deploymentUnit ::> imageRuntime;
264
+ connection : BuildsInto connect module ::> swSafety to deploymentUnit ::> imageSafety;
265
+
266
+ part nodeComputeUnit : ProcessingNode {
267
+ attribute :>> id = "RMR-HW-001"; attribute :>> name = "OnboardComputeUnit";
268
+ attribute :>> nodeKind = ProcessingNodeKind::SoC;
269
+ attribute :>> processorArchitecture = "arm64, 8 core";
270
+ attribute :>> memoryMB = "16384";
271
+ attribute :>> operatingSystem = "Linux with PREEMPT_RT";
272
+ attribute :>> supportsContainerization = true;
273
+ attribute :>> realTimeCapable = true;
274
+ }
275
+ allocation runtimeImageDeployment : DeploysTo allocate imageRuntime to nodeComputeUnit {
276
+ attribute :>> deploymentKind = DeploymentKind::containerized;
277
+ }
278
+ allocation safetyImageDeployment : DeploysTo allocate imageSafety to nodeComputeUnit {
279
+ attribute :>> deploymentKind = DeploymentKind::containerized;
280
+ }
281
+
282
+ part rosRuntime : RosContainerRuntime {
283
+ attribute :>> id = "RMR-RT-001"; attribute :>> name = "OnboardRosRuntime";
284
+ attribute :>> environmentKind = "container runtime";
285
+ attribute :>> osOrRtos = "Linux with PREEMPT_RT";
286
+ attribute :>> orchestrationPlatform = "systemd-managed compose, no cluster orchestrator";
287
+ attribute :>> runtimeEngine = "containerd";
288
+ attribute :>> rosDistribution = "jazzy";
289
+ attribute :>> rmwImplementation = "rmw_cyclonedds_cpp";
290
+ // Fixed per robot. Two robots sharing a domain would see each other's
291
+ // topics, which is a hazard on a shared network and is visible in no
292
+ // single node.
293
+ attribute :>> rosDomainId = 42;
294
+ }
295
+ connection : ProvidesEnvironment connect node ::> nodeComputeUnit to environment ::> rosRuntime;
296
+ }
@@ -0,0 +1,7 @@
1
+ // unassigned viewpoint.
2
+ //
3
+ // This project does not define its own viewpoint here; it binds the reusable
4
+ // MEMO viewpoint that frames these concerns. The views it governs sit beneath
5
+ // `views/`.
6
+ package memo_examples_ros_mobile_robot_viewpoints_unassigned {
7
+ }
@@ -0,0 +1,12 @@
1
+ package memo_examples_ros_mobile_robot_viewpoints_unassigned_views_ros_mobile_robot_overview {
2
+ private import memo_examples_ros_mobile_robot::*;
3
+ private import memo_viewpoints_definitions::*;
4
+ private import memo_core_enumerations::*;
5
+
6
+ view rosMobileRobotOverview : MemoDiagramView {
7
+ expose memo_examples_ros_mobile_robot::*;
8
+ attribute depth = 2;
9
+ attribute :>> viewKind = DiagramViewKind::general;
10
+ attribute :>> diagramType = "bdd";
11
+ }
12
+ }
@@ -0,0 +1,3 @@
1
+ name: software-only-medical-device
2
+ entrypoint: model/catalog/project.sysml
3
+ include: [model]
@@ -20,5 +20,9 @@ package memo_examples_software_only_medical_device_project {
20
20
  attribute :>> projectName = "Software Only Medical Device";
21
21
  ref :>> selectedMethodology = mdDefaultDefinition;
22
22
  attribute :>> scopeMode = ScopeModeKind::explicit;
23
+ // Composition happens here, not by chaining methodologies. The cloud
24
+ // extension supplies CloudService, which is what the grading service
25
+ // is.
26
+ attribute :>> includedModule = "memo_extension_cloud";
23
27
  }
24
28
  }
@@ -4,6 +4,7 @@
4
4
  // off-the-shelf infrastructure the manufacturer does not control.
5
5
  package memo_examples_software_only_medical_device {
6
6
  private import ScalarValues::*;
7
+ private import ModelingMetadata::*;
7
8
 
8
9
  private import memo_core_enumerations::*;
9
10
  private import memo_core_relationships::*;
@@ -11,6 +12,11 @@ package memo_examples_software_only_medical_device {
11
12
  private import memo_architecture_implementation_software_runtime::*;
12
13
  private import memo_architecture_realization_deployment::*;
13
14
  private import memo_architecture_realization_physical::*;
15
+ // `serviceContract` was an optional attribute on SoftwareComponent, set
16
+ // only when runtimeKind = service. It moved to `CloudService` in the cloud
17
+ // extension, so the project that uses it includes the extension — which is
18
+ // the mechanism working as designed rather than a cost of the move.
19
+ private import memo_extension_cloud::*;
14
20
 
15
21
  part swScreeningApp : SoftwareSystem {
16
22
  attribute :>> id = "SMD-SW-001"; attribute :>> name = "ScreeningApplication";
@@ -33,18 +39,18 @@ package memo_examples_software_only_medical_device {
33
39
  attribute :>> responsibility = "Wraps the grading model behind the service API; owns input validation and result structuring.";
34
40
  attribute :>> safetyClass = SafetyClassKind::B;
35
41
  }
36
- connection : ModuleUses connect usingModule ::> swGradingModule to usedModule ::> soupInference;
42
+ dependency swGradingModule to soupInference;
37
43
 
38
- part svcGrading : SoftwareComponent {
39
- attribute :>> runtimeKind = RuntimeKind::service;
44
+ part svcGrading : CloudService {
40
45
  attribute :>> id = "SMD-RT-001"; attribute :>> name = "GradingService";
41
46
  attribute :>> serviceContract = "REST /grade: image in, structured finding out";
47
+ attribute :>> discoveryMechanism = "DNS name behind the cluster ingress";
42
48
  attribute :>> updatePolicy = "blue/green rollout";
43
49
  attribute :>> rollbackPolicy = "previous validated version retained hot";
44
50
  }
45
- connection : Realizes connect realizing ::> svcGrading to realized ::> swGradingModule;
51
+ #refinement dependency svcGrading to swGradingModule;
46
52
 
47
- part duContainerImage : DeploymentUnit {
53
+ part duContainerImage : SoftwareDeploymentUnit {
48
54
  attribute :>> id = "SMD-DU-001"; attribute :>> name = "ScreeningServiceImage";
49
55
  attribute :>> unitKind = "OCI container image";
50
56
  attribute :>> integrityProtection = "image signature + SBOM attestation";
@@ -55,7 +61,7 @@ package memo_examples_software_only_medical_device {
55
61
  attribute :>> supportsContainerization = true;
56
62
  attribute :>> realTimeCapable = false;
57
63
  }
58
- connection : DeploysTo connect deploymentUnit ::> duContainerImage to node ::> nodeCloud {
64
+ allocation duContainerImageDeployment : DeploysTo allocate duContainerImage to nodeCloud {
59
65
  attribute :>> deploymentKind = DeploymentKind::containerized;
60
66
  }
61
67
  connection : HostedBy connect hostAssembly ::> nodeCloud to processingNode ::> svcGrading;
@@ -6,7 +6,6 @@ package memo_examples_software_only_medical_device_viewpoints_unassigned_views_s
6
6
  view softwareOnlyMedicalDeviceOverview : MemoDiagramView {
7
7
  expose memo_examples_software_only_medical_device::*;
8
8
  attribute depth = 2;
9
- attribute :>> title = "Software-only Medical Device Overview";
10
9
  attribute :>> viewKind = DiagramViewKind::general;
11
10
  attribute :>> diagramType = "bdd";
12
11
  }
@@ -0,0 +1,3 @@
1
+ name: surgical-closure-workflow
2
+ entrypoint: model/catalog/project.sysml
3
+ include: [model]