@memoarchitect/ontology 0.7.0 → 0.8.22

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 (204) hide show
  1. package/README.md +4 -2
  2. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
  3. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +7 -5
  4. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
  5. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +18 -8
  6. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +341 -99
  7. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +25 -11
  8. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +328 -271
  9. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +52 -11
  10. package/examples/gpca-pump/model/catalog/gpca_context.sysml +9 -0
  11. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +9 -5
  12. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +175 -259
  13. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +82 -58
  14. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +5 -10
  15. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +101 -100
  16. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
  17. package/examples/gpca-pump/model/catalog/gpca_system.sysml +15 -2
  18. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +274 -331
  19. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +115 -35
  20. package/examples/gpca-pump/model/catalog/project.sysml +5 -0
  21. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +1 -1
  22. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +1 -1
  23. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +1 -1
  24. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +1 -1
  25. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +2 -2
  26. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +1 -1
  27. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +1 -1
  28. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +1 -1
  29. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +2 -2
  30. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +5 -2
  31. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -2
  32. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +1 -1
  33. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +1 -1
  34. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +2 -2
  35. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -2
  36. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +4 -2
  37. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +1 -1
  38. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +3 -2
  39. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
  40. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +133 -128
  41. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +139 -157
  42. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +56 -33
  43. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +25 -26
  44. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -5
  45. package/examples/ros-mobile-robot/README.md +40 -0
  46. package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
  47. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
  48. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
  49. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +13 -0
  50. package/examples/software-only-medical-device/model/catalog/project.sysml +4 -0
  51. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -5
  52. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +56 -60
  53. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +1 -1
  54. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +10 -15
  55. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +7 -9
  56. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +42 -66
  57. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +56 -66
  58. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +26 -55
  59. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +3 -6
  60. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +0 -18
  61. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +51 -82
  62. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +21 -31
  63. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +12 -8
  64. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +28 -21
  65. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +57 -33
  66. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +102 -79
  67. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +5 -5
  68. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +21 -6
  69. package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
  70. package/examples/ui-screen-regions/model/catalog/traces.sysml +28 -125
  71. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -1
  72. package/extensions/LICENSES/MIT.txt +19 -0
  73. package/extensions/README.md +94 -0
  74. package/extensions/aadl/memo.package.yaml +18 -0
  75. package/extensions/aadl/src/aadl_extension.sysml +6 -0
  76. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
  77. package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
  78. package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
  79. package/extensions/cloud/memo.package.yaml +18 -0
  80. package/extensions/cloud/src/cloud_extension.sysml +44 -0
  81. package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
  82. package/extensions/container/memo.package.yaml +18 -0
  83. package/extensions/container/src/container_extension.sysml +37 -0
  84. package/extensions/container/src/methodology/container_methodology.sysml +17 -0
  85. package/extensions/messaging/memo.package.yaml +18 -0
  86. package/extensions/messaging/src/messaging_extension.sysml +64 -0
  87. package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
  88. package/extensions/ros/memo.package.yaml +18 -0
  89. package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
  90. package/extensions/ros/src/ros_extension.sysml +200 -0
  91. package/extensions/template/src/extension.sysml +37 -0
  92. package/memo.manifest.yaml +13 -2
  93. package/methodologies/default/memo.package.yaml +1 -1
  94. package/methodologies/gpca/memo.package.yaml +1 -1
  95. package/ontology/memo.package.yaml +1 -1
  96. package/package.json +5 -3
  97. package/profile/memo.package.yaml +1 -1
  98. package/src/architecture/decisions/memo_decisions.sysml +23 -2
  99. package/src/architecture/functional/behavior/memo_behavior.sysml +49 -21
  100. package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
  101. package/src/architecture/functional/functions/memo_functions.sysml +91 -34
  102. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -22
  103. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +37 -10
  104. package/src/architecture/implementation/ui/memo_ui.sysml +78 -38
  105. package/src/architecture/logical/interfaces/memo_interfaces.sysml +63 -11
  106. package/src/architecture/logical/structure/memo_logical_structure.sysml +21 -20
  107. package/src/architecture/operational/activities/memo_activities.sysml +10 -3
  108. package/src/architecture/operational/context/actors/memo_actors.sysml +5 -8
  109. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +13 -30
  110. package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -16
  111. package/src/architecture/operational/scenarios/memo_scenarios.sysml +57 -23
  112. package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -26
  113. package/src/architecture/operational/workflows/memo_workflows.sysml +29 -10
  114. package/src/architecture/realization/deployment/memo_deployment.sysml +111 -16
  115. package/src/architecture/realization/physical/memo_physical_architecture.sysml +27 -2
  116. package/src/artifacts/configuration_management/memo_configuration_management.sysml +16 -0
  117. package/src/artifacts/core/memo_controlled_artifacts.sysml +3 -1
  118. package/src/artifacts/standards/cfr_21_820.sysml +116 -0
  119. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
  120. package/src/artifacts/standards/iec_60601_1.sysml +149 -0
  121. package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
  122. package/src/artifacts/standards/iec_60812.sysml +51 -0
  123. package/src/artifacts/standards/iec_62304.sysml +210 -0
  124. package/src/artifacts/standards/iec_62366_1.sysml +113 -0
  125. package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
  126. package/src/artifacts/standards/iso_13485.sysml +113 -0
  127. package/src/artifacts/standards/iso_14971.sysml +94 -0
  128. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
  129. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
  130. package/src/artifacts/templates/dhf/21cfr820/design-input.md +1 -1
  131. package/src/artifacts/templates/dhf/21cfr820/design-output.md +5 -5
  132. package/src/artifacts/templates/dhf/21cfr820/design-review.md +1 -1
  133. package/src/artifacts/templates/dhf/21cfr820/design-validation.md +2 -2
  134. package/src/artifacts/templates/dhf/21cfr820/design-verification.md +2 -2
  135. package/src/artifacts/templates/dhf/21cfr820/dhf-index.md +2 -2
  136. package/src/artifacts/templates/dhf/21cfr820/transfer-plan.md +1 -1
  137. package/src/artifacts/templates/dhf/21cfr820/user-needs.md +1 -1
  138. package/src/artifacts/templates/dhf/21cfr820/vv-plan.md +3 -3
  139. package/src/artifacts/templates/dhf/21cfr820/vv-report.md +4 -4
  140. package/src/artifacts/templates/dhf/fda-cybersecurity/incident-response.md +1 -1
  141. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +3 -2
  142. package/src/artifacts/templates/dhf/fda-cybersecurity/security-arch.md +2 -2
  143. package/src/artifacts/templates/dhf/fda-cybersecurity/threat-model.md +4 -4
  144. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +4 -3
  145. package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
  146. package/src/artifacts/templates/dhf/iec-62304/detailed-design.md +1 -1
  147. package/src/artifacts/templates/dhf/iec-62304/integration-test.md +3 -3
  148. package/src/artifacts/templates/dhf/iec-62304/sad.md +6 -5
  149. package/src/artifacts/templates/dhf/iec-62304/sbom.md +3 -2
  150. package/src/artifacts/templates/dhf/iec-62304/sdp.md +5 -4
  151. package/src/artifacts/templates/dhf/iec-62304/soup.md +4 -2
  152. package/src/artifacts/templates/dhf/iec-62304/srs.md +54 -20
  153. package/src/artifacts/templates/dhf/iec-62304/sw-traceability.md +3 -3
  154. package/src/artifacts/templates/dhf/iec-62304/system-test.md +1 -1
  155. package/src/artifacts/templates/dhf/iec-62366/summative-eval.md +1 -1
  156. package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +40 -4
  157. package/src/artifacts/templates/dhf/iec-62366/ue-plan.md +1 -1
  158. package/src/artifacts/templates/dhf/iec-62366/urra.md +3 -3
  159. package/src/artifacts/templates/dhf/iso-14971/fmea.md +42 -19
  160. package/src/artifacts/templates/dhf/iso-14971/har.md +3 -3
  161. package/src/artifacts/templates/dhf/iso-14971/rmp.md +2 -2
  162. package/src/artifacts/templates/dhf/system/sad.md +173 -0
  163. package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
  164. package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
  165. package/src/artifacts/templates/dhf/system/syrs.md +128 -0
  166. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +39 -20
  167. package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
  168. package/src/assurance/requirements/memo_requirements.sysml +5 -2
  169. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  170. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
  171. package/src/assurance/safety_risk/memo_risk.sysml +78 -7
  172. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +16 -0
  173. package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
  174. package/src/core/annotations/memo_annotations.sysml +25 -6
  175. package/src/core/common/memo_common.sysml +121 -16
  176. package/src/core/consistency_rules/consistency_rules.sysml +1 -1
  177. package/src/core/dimensions/dimensions.sysml +12 -0
  178. package/src/core/enumerations/memo_enumerations.sysml +60 -14
  179. package/src/core/relationships/memo_relationships.sysml +199 -196
  180. package/src/memo_namespaces.sysml +30 -0
  181. package/src/methodology/core/memo_core.sysml +24 -0
  182. package/src/methodology/profiles/memo_profiles.sysml +1 -1
  183. package/src/rules/ontology/ontology_invariants.sysml +213 -1
  184. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +3 -3
  185. package/src/viewpoints/clinical/clinical_viewpoint.sysml +1 -1
  186. package/src/viewpoints/context/context_viewpoint.sysml +1 -1
  187. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +1 -1
  188. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +1 -0
  189. package/src/viewpoints/functional/functional_viewpoint.sysml +1 -1
  190. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +1 -1
  191. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +1 -1
  192. package/src/viewpoints/operational/operational_viewpoint.sysml +1 -1
  193. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +1 -1
  194. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +1 -1
  195. package/src/viewpoints/verification/verification_viewpoint.sysml +1 -1
  196. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +1 -1
  197. package/examples/extensions/README.md +0 -16
  198. package/examples/extensions/template/src/extension.sysml +0 -15
  199. package/examples/gpca-pump/gpca-pump.kpar +0 -0
  200. /package/{examples/extensions → extensions}/clinical/memo.package.yaml +0 -0
  201. /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
  202. /package/{examples/extensions → extensions}/clinical/src/methodology/clinical_methodology.sysml +0 -0
  203. /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
  204. /package/{examples/extensions → extensions}/template/memo.package.yaml +0 -0
@@ -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,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,13 @@
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 :>> title = "ROS Mobile Robot Overview";
10
+ attribute :>> viewKind = DiagramViewKind::general;
11
+ attribute :>> diagramType = "bdd";
12
+ }
13
+ }
@@ -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,16 +39,16 @@ 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
53
  part duContainerImage : DeploymentUnit {
48
54
  attribute :>> id = "SMD-DU-001"; attribute :>> name = "ScreeningServiceImage";
@@ -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;
@@ -3,6 +3,7 @@
3
3
  // as context → use case → workflow → scenarios → scenario-owned activities.
4
4
  package memo_examples_surgical_closure_workflow {
5
5
  private import ScalarValues::*;
6
+ private import ModelingMetadata::*;
6
7
 
7
8
  private import memo_core_enumerations::*;
8
9
  private import memo_core_relationships::*;
@@ -39,7 +40,7 @@ package memo_examples_surgical_closure_workflow {
39
40
  }
40
41
  requirement needControlledGastricResection : Need {
41
42
  attribute :>> needKind = NeedKind::clinicalUser;
42
- attribute :>> needId = "LSG-N-001";
43
+ attribute :>> id = "LSG-N-001";
43
44
  attribute :>> statement = "The surgical team needs to perform gastric resection with controlled anatomy, haemostasis, and a checked staple line.";
44
45
  }
45
46
  use case ucPerformSleeveGastrectomy : UseCase {
@@ -53,40 +54,39 @@ package memo_examples_surgical_closure_workflow {
53
54
  ref :>> primaryUser = bariatricSurgeon;
54
55
  ref :>> supportingActors = (scrubNurse, anesthetist);
55
56
  ref :>> useContext = bariatricOr;
57
+ subject supportingSystem;
58
+ actor bariatricSurgeonInitiator = bariatricSurgeon;
56
59
  }
57
60
  connection : Motivates connect motivatingNeed ::> needControlledGastricResection to motivatedUseCase ::> ucPerformSleeveGastrectomy;
58
- connection : Initiates connect initiatingUser ::> bariatricSurgeon to initiatedUseCase ::> ucPerformSleeveGastrectomy;
59
61
 
60
62
  // ── Procedure workflow ──────────────────────────────────────
61
63
  action actTimeOutAndPosition : OperationalActivity { attribute :>> id = "LSG-ACT-001"; attribute :>> name = "ConfirmTimeOutAndPosition"; }
62
64
  action actEstablishAccess : OperationalActivity { attribute :>> id = "LSG-ACT-002"; attribute :>> name = "EstablishLaparoscopicAccess"; }
63
65
  action actMobilizeStomach : OperationalActivity { attribute :>> id = "LSG-ACT-003"; attribute :>> name = "MobilizeStomach"; }
64
- action actSizeAndCreateSleeve : OperationalActivity { attribute :>> id = "LSG-ACT-004"; attribute :>> name = "SizeAndCreateSleeve"; attribute :>> criticality = CriticalityKind::high; }
66
+ action actSizeAndCreateSleeve : OperationalActivity {
67
+ attribute :>> id = "LSG-ACT-004"; attribute :>> name = "SizeAndCreateSleeve"; attribute :>> criticality = CriticalityKind::high;
68
+
69
+ action taskCreateStapleLine : UserTask {
70
+ attribute :>> criticality = CriticalityKind::high;
71
+ attribute :>> id = "LSG-TASK-001";
72
+ attribute :>> name = "CreateAndInspectStapleLine";
73
+ attribute :>> taskGoal = "create the planned sleeve and identify bleeding or integrity concerns before completion";
74
+ attribute :>> potentialHarm = "bleeding or staple-line complication not recognized before handover";
75
+ attribute :>> severityIfFailed = SeverityKind::serious;
76
+
77
+ action stConfirmAnatomy : TaskStep { attribute :>> id = "LSG-ST-001"; attribute :>> name = "ConfirmAnatomy"; }
78
+ action stCreateStapleLine : TaskStep { attribute :>> id = "LSG-ST-002"; attribute :>> name = "CreateStapleLine"; }
79
+ action stInspectBleeding : TaskStep { attribute :>> id = "LSG-ST-003"; attribute :>> name = "InspectForBleeding"; }
80
+ action stAssessIntegrity : TaskStep { attribute :>> id = "LSG-ST-004"; attribute :>> name = "AssessStapleLineIntegrity"; }
81
+ first stConfirmAnatomy then stCreateStapleLine;
82
+ first stCreateStapleLine then stInspectBleeding;
83
+ first stInspectBleeding then stAssessIntegrity;
84
+ }
85
+ }
65
86
  action actAssessStapleLine : OperationalActivity { attribute :>> id = "LSG-ACT-005"; attribute :>> name = "AssessStapleLine"; attribute :>> criticality = CriticalityKind::high; }
66
87
  action actExtractSpecimenAndClose : OperationalActivity { attribute :>> id = "LSG-ACT-006"; attribute :>> name = "ExtractSpecimenAndClosePorts"; }
67
88
  action actHandover : OperationalActivity { attribute :>> id = "LSG-ACT-007"; attribute :>> name = "CompletePostoperativeHandover"; }
68
89
 
69
- action taskCreateStapleLine : UserTask {
70
- attribute :>> criticality = CriticalityKind::high;
71
- attribute :>> id = "LSG-TASK-001";
72
- attribute :>> name = "CreateAndInspectStapleLine";
73
- attribute :>> taskGoal = "create the planned sleeve and identify bleeding or integrity concerns before completion";
74
- attribute :>> potentialHarm = "bleeding or staple-line complication not recognized before handover";
75
- attribute :>> severityIfFailed = SeverityKind::serious;
76
- }
77
- action stConfirmAnatomy : TaskStep { attribute :>> id = "LSG-ST-001"; attribute :>> name = "ConfirmAnatomy"; }
78
- action stCreateStapleLine : TaskStep { attribute :>> id = "LSG-ST-002"; attribute :>> name = "CreateStapleLine"; }
79
- action stInspectBleeding : TaskStep { attribute :>> id = "LSG-ST-003"; attribute :>> name = "InspectForBleeding"; }
80
- action stAssessIntegrity : TaskStep { attribute :>> id = "LSG-ST-004"; attribute :>> name = "AssessStapleLineIntegrity"; }
81
- first stConfirmAnatomy then stCreateStapleLine;
82
- first stCreateStapleLine then stInspectBleeding;
83
- first stInspectBleeding then stAssessIntegrity;
84
- connection : Composes connect parent ::> actSizeAndCreateSleeve to child ::> taskCreateStapleLine;
85
- connection : Composes connect parent ::> taskCreateStapleLine to child ::> stConfirmAnatomy;
86
- connection : Composes connect parent ::> taskCreateStapleLine to child ::> stCreateStapleLine;
87
- connection : Composes connect parent ::> taskCreateStapleLine to child ::> stInspectBleeding;
88
- connection : Composes connect parent ::> taskCreateStapleLine to child ::> stAssessIntegrity;
89
-
90
90
  action wfSleeveGastrectomy : ClinicalProcedureWorkflow {
91
91
  attribute :>> id = "LSG-WF-001";
92
92
  attribute :>> name = "LaparoscopicSleeveGastrectomyWorkflow";
@@ -94,51 +94,43 @@ package memo_examples_surgical_closure_workflow {
94
94
  attribute :>> entryCondition = "patient prepared; time-out ready";
95
95
  attribute :>> completionCondition = "staple line assessed; postoperative handover complete";
96
96
  attribute :>> clinicalObjective = "create a gastric sleeve after controlled mobilisation and staple-line assessment";
97
+
98
+ action wsTimeOut : WorkflowStep { ref :>> performedActivity = actTimeOutAndPosition; }
99
+ action wsAccess : WorkflowStep { ref :>> performedActivity = actEstablishAccess; }
100
+ action wsMobilize : WorkflowStep { ref :>> performedActivity = actMobilizeStomach; }
101
+ action wsSleeve : WorkflowStep { ref :>> performedActivity = actSizeAndCreateSleeve; }
102
+ action wsAssess : WorkflowStep { ref :>> performedActivity = actAssessStapleLine; }
103
+ action wsClose : WorkflowStep { ref :>> performedActivity = actExtractSpecimenAndClose; }
104
+ action wsHandover : WorkflowStep { ref :>> performedActivity = actHandover; }
105
+ first wsTimeOut then wsAccess;
106
+ first wsAccess then wsMobilize;
107
+ first wsMobilize then wsSleeve;
108
+ first wsSleeve then wsAssess;
109
+ first wsAssess then wsClose;
110
+ first wsClose then wsHandover;
97
111
  }
98
- action wsTimeOut : WorkflowStep { ref :>> performedActivity = actTimeOutAndPosition; }
99
- action wsAccess : WorkflowStep { ref :>> performedActivity = actEstablishAccess; }
100
- action wsMobilize : WorkflowStep { ref :>> performedActivity = actMobilizeStomach; }
101
- action wsSleeve : WorkflowStep { ref :>> performedActivity = actSizeAndCreateSleeve; }
102
- action wsAssess : WorkflowStep { ref :>> performedActivity = actAssessStapleLine; }
103
- action wsClose : WorkflowStep { ref :>> performedActivity = actExtractSpecimenAndClose; }
104
- action wsHandover : WorkflowStep { ref :>> performedActivity = actHandover; }
105
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsTimeOut;
106
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsAccess;
107
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsMobilize;
108
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsSleeve;
109
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsAssess;
110
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsClose;
111
- connection : Composes connect parent ::> wfSleeveGastrectomy to child ::> wsHandover;
112
- first wsTimeOut then wsAccess;
113
- first wsAccess then wsMobilize;
114
- first wsMobilize then wsSleeve;
115
- first wsSleeve then wsAssess;
116
- first wsAssess then wsClose;
117
- first wsClose then wsHandover;
118
112
  connection : Supports { attribute :>> supportKind = SupportKind::useCase; connect supporter ::> wfSleeveGastrectomy to supported ::> ucPerformSleeveGastrectomy; }
119
113
 
120
114
  // ── Scenario paths, each with its own activity/action flow ──
121
- action oaCompleteSleeveProcedure : OperationalActivity {
122
- attribute :>> name = "CompleteNominalSleeveProcedure";
123
- action prepare; action createSleeve; action assess; action handover;
124
- first start then prepare; first prepare then createSleeve; first createSleeve then assess; first assess then handover; first handover then done;
125
- }
126
- action oaControlStapleLineBleeding : OperationalActivity {
127
- attribute :>> name = "ControlStapleLineBleeding";
128
- action recognizeBleeding; action controlBleeding; action reassessStapleLine; action escalateIfNeeded;
129
- first start then recognizeBleeding; first recognizeBleeding then controlBleeding; first controlBleeding then reassessStapleLine; first reassessStapleLine then escalateIfNeeded; first escalateIfNeeded then done;
130
- }
131
- action scNominalSleeveProcedure : OperativeScenario {
115
+ action scNominalSleeveProcedure : MemoScenario {
132
116
  attribute :>> id = "LSG-SC-001"; attribute :>> name = "NominalSleeveGastrectomy";
117
+ attribute :>> scenarioKind = ScenarioKind::operative;
133
118
  attribute :>> variantKind = ScenarioVariantKind::nominal;
134
119
  attribute :>> operationalCondition = OperationalConditionKind::normal;
135
120
  attribute :>> pathSummary = "Time-out, access, mobilisation, sleeve creation, staple-line assessment, closure, and handover complete without rework.";
136
121
  ref :>> parentWorkflow = wfSleeveGastrectomy;
137
122
  ref :>> parentUseCase = ucPerformSleeveGastrectomy;
138
123
  ref :>> activities = oaCompleteSleeveProcedure;
124
+
125
+ action oaCompleteSleeveProcedure : OperationalActivity {
126
+ attribute :>> name = "CompleteNominalSleeveProcedure";
127
+ action prepare; action createSleeve; action assess; action handover;
128
+ first start then prepare; first prepare then createSleeve; first createSleeve then assess; first assess then handover; first handover then done;
129
+ }
139
130
  }
140
- action scStapleLineBleeding : OperativeScenario {
131
+ action scStapleLineBleeding : MemoScenario {
141
132
  attribute :>> id = "LSG-SC-002"; attribute :>> name = "StapleLineBleedingRecovery";
133
+ attribute :>> scenarioKind = ScenarioKind::operative;
142
134
  attribute :>> variantKind = ScenarioVariantKind::recovery;
143
135
  attribute :>> operationalCondition = OperationalConditionKind::degraded;
144
136
  attribute :>> variationPoint = "bleeding observed during staple-line assessment";
@@ -147,9 +139,13 @@ package memo_examples_surgical_closure_workflow {
147
139
  ref :>> parentWorkflow = wfSleeveGastrectomy;
148
140
  ref :>> parentUseCase = ucPerformSleeveGastrectomy;
149
141
  ref :>> activities = oaControlStapleLineBleeding;
142
+
143
+ action oaControlStapleLineBleeding : OperationalActivity {
144
+ attribute :>> name = "ControlStapleLineBleeding";
145
+ action recognizeBleeding; action controlBleeding; action reassessStapleLine; action escalateIfNeeded;
146
+ first start then recognizeBleeding; first recognizeBleeding then controlBleeding; first controlBleeding then reassessStapleLine; first reassessStapleLine then escalateIfNeeded; first escalateIfNeeded then done;
147
+ }
150
148
  }
151
- connection : Realizes connect realizing ::> scNominalSleeveProcedure to realized ::> ucPerformSleeveGastrectomy;
152
- connection : Realizes connect realizing ::> scStapleLineBleeding to realized ::> ucPerformSleeveGastrectomy;
153
- connection : Composes connect parent ::> scNominalSleeveProcedure to child ::> oaCompleteSleeveProcedure;
154
- connection : Composes connect parent ::> scStapleLineBleeding to child ::> oaControlStapleLineBleeding;
149
+ #refinement dependency scNominalSleeveProcedure to ucPerformSleeveGastrectomy;
150
+ #refinement dependency scStapleLineBleeding to ucPerformSleeveGastrectomy;
155
151
  }
@@ -23,7 +23,7 @@ package memo_examples_surgical_robot {
23
23
  connection : IndependentOf connect channel ::> chMotionMonitor to otherChannel ::> chMotionPrimary {
24
24
  attribute :>> independenceBasis = "separate sensing, power, and processing; common-cause analysis SR-CCA-01";
25
25
  }
26
- connection : MonitorsChannel connect monitorChannel ::> chMotionMonitor to monitoredComponent ::> chMotionPrimary;
26
+ dependency chMotionMonitor to chMotionPrimary;
27
27
 
28
28
  // Interlock: instrument exchange blocked while arm is in motion.
29
29
  part chExchangeInterlock : LogicalComponent {