@memoarchitect/ontology 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/README.md +1 -1
  2. package/examples/connected-patient-monitor/model/catalog/project.sysml +24 -0
  3. package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  4. package/examples/connected-patient-monitor/model/{viewpoints → catalog/viewpoints/unassigned/views}/connected_patient_monitor_overview.sysml +1 -1
  5. package/examples/embedded-infusion-pump/model/catalog/project.sysml +24 -0
  6. package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  7. package/examples/embedded-infusion-pump/model/{viewpoints → catalog/viewpoints/unassigned/views}/embedded_infusion_pump_overview.sysml +1 -1
  8. package/examples/extensions/clinical/memo.package.yaml +18 -9
  9. package/examples/extensions/clinical/src/methodology/clinical_methodology.sysml +10 -2
  10. package/examples/extensions/template/memo.package.yaml +17 -9
  11. package/examples/functional-logical-physical/model/catalog/project.sysml +24 -0
  12. package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  13. package/examples/functional-logical-physical/model/{viewpoints → catalog/viewpoints/unassigned/views}/functional_logical_physical_overview.sysml +1 -1
  14. package/examples/gpca-pump/gpca-pump.kpar +0 -0
  15. package/examples/gpca-pump/methodology/gpca_methodology.sysml +7 -8
  16. package/examples/gpca-pump/methodology/gpca_profiles.sysml +89 -11
  17. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +1 -1
  18. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +1 -1
  19. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +2 -2
  20. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +1 -1
  21. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +5 -5
  22. package/examples/gpca-pump/model/catalog/gpca_context.sysml +3 -8
  23. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +6 -6
  24. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +1 -15
  25. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +7 -6
  26. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +19 -8
  27. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +2 -2
  28. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +1 -1
  29. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +1 -1
  30. package/examples/gpca-pump/model/catalog/gpca_system.sysml +34 -30
  31. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +27 -23
  32. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +1 -1
  33. package/examples/gpca-pump/model/catalog/project.sysml +21 -0
  34. package/examples/gpca-pump/model/catalog/viewpoints/context/viewpoint.sysml +8 -0
  35. package/examples/gpca-pump/model/{views → catalog/viewpoints/context/views}/context_system_context_view.sysml +3 -3
  36. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/viewpoint.sysml +8 -0
  37. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/cybersecurity_cybersecurity_view.sysml +3 -3
  38. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/document_cyber_assessment_view.sysml +4 -4
  39. package/examples/gpca-pump/model/{views → catalog/viewpoints/cybersecurity/views}/document_threat_model_view.sysml +4 -4
  40. package/examples/gpca-pump/model/catalog/viewpoints/functional/viewpoint.sysml +8 -0
  41. package/examples/gpca-pump/model/{views → catalog/viewpoints/functional/views}/functional_function_allocation_view.sysml +2 -2
  42. package/examples/gpca-pump/model/{views → catalog/viewpoints/functional/views}/functional_function_browser_view.sysml +3 -3
  43. package/examples/gpca-pump/model/catalog/viewpoints/logical/viewpoint.sysml +8 -0
  44. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/behavior_action_flow_view.sysml +3 -3
  45. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/document_architecture_description_view.sysml +7 -7
  46. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_device_interconnect_view.sysml +3 -3
  47. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_logical_architecture_view.sysml +3 -3
  48. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_mode_state_view.sysml +3 -3
  49. package/examples/gpca-pump/model/{views → catalog/viewpoints/logical/views}/logical_system_decomposition_view.sysml +3 -3
  50. package/examples/gpca-pump/model/catalog/viewpoints/operational/viewpoint.sysml +8 -0
  51. package/examples/gpca-pump/model/{views → catalog/viewpoints/operational/views}/operational_scenario_sequence_view.sysml +2 -2
  52. package/examples/gpca-pump/model/{views → catalog/viewpoints/operational/views}/operational_use_case_view.sysml +3 -3
  53. package/examples/gpca-pump/model/catalog/viewpoints/physical/viewpoint.sysml +8 -0
  54. package/examples/gpca-pump/model/{views → catalog/viewpoints/physical/views}/physical_physical_bom_view.sysml +2 -2
  55. package/examples/gpca-pump/model/catalog/viewpoints/requirements/viewpoint.sysml +8 -0
  56. package/examples/gpca-pump/model/{views → catalog/viewpoints/requirements/views}/document_dhf_index_view.sysml +6 -6
  57. package/examples/gpca-pump/model/{views → catalog/viewpoints/requirements/views}/requirements_requirements_trace_view.sysml +2 -2
  58. package/examples/gpca-pump/model/catalog/viewpoints/risk/viewpoint.sysml +8 -0
  59. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/document_hazard_analysis_view.sysml +3 -3
  60. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/document_rmf_view.sysml +3 -3
  61. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/risk_fmea_view.sysml +2 -2
  62. package/examples/gpca-pump/model/{views → catalog/viewpoints/risk/views}/risk_risk_chain_view.sysml +3 -3
  63. package/examples/gpca-pump/model/catalog/viewpoints/software/viewpoint.sysml +8 -0
  64. package/examples/gpca-pump/model/{views → catalog/viewpoints/software/views}/document_sdd_view.sysml +3 -3
  65. package/examples/gpca-pump/model/{views → catalog/viewpoints/software/views}/software_software_architecture_view.sysml +3 -3
  66. package/examples/gpca-pump/model/catalog/viewpoints/usability/viewpoint.sysml +8 -0
  67. package/examples/gpca-pump/model/{views → catalog/viewpoints/usability/views}/document_usability_view.sysml +4 -4
  68. package/examples/gpca-pump/model/catalog/viewpoints/verification/viewpoint.sysml +8 -0
  69. package/examples/gpca-pump/model/{views → catalog/viewpoints/verification/views}/document_vv_view.sysml +3 -3
  70. package/examples/gpca-pump/model/{views → catalog/viewpoints/verification/views}/verification_verification_coverage_view.sysml +2 -2
  71. package/examples/ivd-laboratory-system/model/catalog/project.sysml +24 -0
  72. package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  73. package/examples/ivd-laboratory-system/model/{viewpoints → catalog/viewpoints/unassigned/views}/ivd_laboratory_system_overview.sysml +1 -1
  74. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +1 -0
  75. package/examples/manual-surgical-instrument/model/catalog/project.sysml +24 -0
  76. package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  77. package/examples/manual-surgical-instrument/model/{viewpoints → catalog/viewpoints/unassigned/views}/manual_surgical_instrument_overview.sysml +1 -1
  78. package/examples/multidimensional-layers/model/catalog/project.sysml +24 -0
  79. package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  80. package/examples/multidimensional-layers/model/{viewpoints → catalog/viewpoints/unassigned/views}/multidimensional_layers_overview.sysml +1 -1
  81. package/examples/nested-architecture-dsm/README.md +49 -0
  82. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +174 -0
  83. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +183 -0
  84. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +53 -0
  85. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +89 -0
  86. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +90 -0
  87. package/examples/nested-architecture-dsm/model/catalog/project.sysml +28 -0
  88. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +49 -0
  89. package/examples/reusable-instrument/model/catalog/project.sysml +24 -0
  90. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -6
  91. package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  92. package/examples/reusable-instrument/model/{viewpoints → catalog/viewpoints/unassigned/views}/reusable_instrument_overview.sysml +1 -1
  93. package/examples/software-only-medical-device/model/catalog/project.sysml +24 -0
  94. package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  95. package/examples/software-only-medical-device/model/{viewpoints → catalog/viewpoints/unassigned/views}/software_only_medical_device_overview.sysml +1 -1
  96. package/examples/surgical-closure-workflow/model/catalog/project.sysml +24 -0
  97. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +23 -19
  98. package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  99. package/examples/surgical-closure-workflow/model/{viewpoints → catalog/viewpoints/unassigned/views}/surgical_closure_workflow_overview.sysml +1 -1
  100. package/examples/surgical-robot/model/catalog/project.sysml +24 -0
  101. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +5 -3
  102. package/examples/surgical-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  103. package/examples/surgical-robot/model/{viewpoints → catalog/viewpoints/unassigned/views}/surgical_robot_overview.sysml +1 -1
  104. package/examples/sysml-diagram-samples/README.md +7 -0
  105. package/examples/sysml-diagram-samples/dhf/documents/DOC-HAR-001.md +11 -0
  106. package/examples/sysml-diagram-samples/memo.package.yaml +11 -5
  107. package/examples/sysml-diagram-samples/model/catalog/project.sysml +33 -0
  108. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  109. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/action_flow_view.sysml +18 -10
  110. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/context_view.sysml +4 -2
  111. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +47 -0
  112. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/functional_flow_view.sysml +23 -20
  113. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/interconnection_view.sysml +17 -14
  114. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +94 -0
  115. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/operational_behaviour_view.sysml +23 -20
  116. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +13 -0
  117. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/requirements_view.sysml +3 -1
  118. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +51 -0
  119. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/state_transition_view.sysml +3 -1
  120. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/tree_view.sysml +3 -1
  121. package/examples/sysml-diagram-samples/model/{samples → catalog/viewpoints/unassigned/views}/use_case_view.sysml +3 -1
  122. package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +93 -0
  123. package/examples/temperature-alarm/model/catalog/project.sysml +24 -0
  124. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +2 -1
  125. package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/viewpoint.sysml +9 -0
  126. package/examples/temperature-alarm/model/{viewpoints → catalog/viewpoints/unassigned/views}/temperature_alarm_overview.sysml +1 -1
  127. package/examples/ui-screen-regions/README.md +117 -0
  128. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +60 -0
  129. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +189 -0
  130. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +61 -0
  131. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/drugSelectorRegion/drug-selector-expanded-2.4.1.png +0 -0
  132. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/mainScreenLayout/main-screen-2.4.1.png +0 -0
  133. package/examples/ui-screen-regions/model/catalog/artifacts/assets/screen-captures/settingsScreenLayout/settings-screen-2.4.1.png +0 -0
  134. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +51 -0
  135. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +27 -0
  136. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +27 -0
  137. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +59 -0
  138. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +25 -0
  139. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +178 -0
  140. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +93 -0
  141. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +60 -0
  142. package/examples/ui-screen-regions/model/catalog/project.sysml +45 -0
  143. package/examples/ui-screen-regions/model/catalog/traces.sysml +276 -0
  144. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/viewpoint.sysml +8 -0
  145. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +62 -0
  146. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/viewpoint.sysml +8 -0
  147. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +62 -0
  148. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/viewpoint.sysml +8 -0
  149. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +62 -0
  150. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/viewpoint.sysml +8 -0
  151. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +57 -0
  152. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +52 -0
  153. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +54 -0
  154. package/memo.manifest.yaml +2 -0
  155. package/methodologies/default/memo.package.yaml +19 -9
  156. package/methodologies/gpca/memo.package.yaml +18 -9
  157. package/ontology/memo.package.yaml +23 -8
  158. package/package.json +2 -4
  159. package/profile/memo.package.yaml +18 -9
  160. package/src/architecture/decisions/memo_decisions.sysml +7 -0
  161. package/src/architecture/functional/behavior/memo_behavior.sysml +1 -1
  162. package/src/architecture/functional/functions/memo_functions.sysml +5 -12
  163. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +1 -3
  164. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +18 -5
  165. package/src/architecture/implementation/ui/memo_ui.sysml +210 -27
  166. package/src/architecture/logical/interfaces/memo_interfaces.sysml +1 -2
  167. package/src/architecture/logical/structure/memo_logical_structure.sysml +71 -15
  168. package/src/architecture/operational/activities/memo_activities.sysml +0 -1
  169. package/src/architecture/operational/scenarios/memo_scenarios.sysml +2 -2
  170. package/src/architecture/operational/workflows/memo_workflows.sysml +0 -6
  171. package/src/{compliance/change/memo_change.sysml → artifacts/configuration_management/memo_configuration_management.sysml} +5 -3
  172. package/src/artifacts/core/memo_controlled_artifacts.sysml +33 -0
  173. package/src/artifacts/documents/risk_management/memo_risk_management.sysml +12 -0
  174. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +1 -1
  175. package/src/assurance/human_factors/memo_human_factors.sysml +1 -1
  176. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +11 -0
  177. package/src/assurance/verification_validation/clinical_evaluation/memo_clinical_evaluation.sysml +11 -0
  178. package/src/assurance/verification_validation/memo_assurance.sysml +1 -1
  179. package/src/core/annotations/memo_annotations.sysml +77 -0
  180. package/src/core/common/memo_common.sysml +20 -3
  181. package/src/core/consistency_rules/consistency_rules.sysml +7 -0
  182. package/src/core/dimensions/dimensions.sysml +5 -1
  183. package/src/core/enumerations/memo_enumerations.sysml +41 -6
  184. package/src/core/methodology_scope/methodology_scope.sysml +7 -15
  185. package/src/core/relationships/memo_relationships.sysml +4 -2
  186. package/src/memo_namespaces.sysml +97 -67
  187. package/src/methodology/core/memo_core.sysml +45 -2
  188. package/src/methodology/profiles/memo_profiles.sysml +30 -40
  189. package/src/methodology/workflow/memo_workflow.sysml +7 -2
  190. package/src/rules/closure/closure_rules.sysml +104 -31
  191. package/src/rules/coverage/coverage_rules.sysml +4 -256
  192. package/src/rules/crosslayer/cross_layer_rules.sysml +6 -15
  193. package/src/rules/lifecycle/lifecycle_rules.sysml +4 -39
  194. package/src/rules/ontology/ontology_invariants.sysml +30 -73
  195. package/src/rules/quantitative/quantitative_rules.sysml +8 -8
  196. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +7 -0
  197. package/src/viewpoints/clinical/clinical_viewpoint.sysml +3 -1
  198. package/src/viewpoints/clinical/{clinical_evidence_view → views/clinical_evidence_view}/clinical_evidence_view.sysml +2 -2
  199. package/src/viewpoints/context/context_viewpoint.sysml +3 -1
  200. package/src/viewpoints/context/{system_context_view → views/system_context_view}/system_context_view.sysml +2 -2
  201. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +3 -1
  202. package/src/viewpoints/cybersecurity/{cybersecurity_assessment_view → views/cybersecurity_assessment_view}/cybersecurity_assessment_view.sysml +2 -2
  203. package/src/viewpoints/cybersecurity/{threat_model_view → views/threat_model_view}/threat_model_view.sysml +2 -2
  204. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +4 -0
  205. package/src/viewpoints/functional/functional_viewpoint.sysml +3 -1
  206. package/src/viewpoints/functional/{function_allocation_view → views/function_allocation_view}/function_allocation_view.sysml +2 -2
  207. package/src/viewpoints/functional/{system_functional_tree_view → views/system_functional_tree_view}/system_functional_tree_view.sysml +2 -2
  208. package/src/viewpoints/logical/logical_viewpoint.sysml +3 -1
  209. package/src/viewpoints/logical/{logical_architecture_view → views/logical_architecture_view}/logical_architecture_view.sysml +2 -2
  210. package/src/viewpoints/operational/operational_viewpoint.sysml +3 -1
  211. package/src/viewpoints/operational/{use_case_view → views/use_case_view}/use_case_view.sysml +2 -2
  212. package/src/viewpoints/physical/physical_viewpoint.sysml +3 -1
  213. package/src/viewpoints/physical/{network_topology_view → views/network_topology_view}/network_topology_view.sysml +2 -2
  214. package/src/viewpoints/physical/{physical_bom_view → views/physical_bom_view}/physical_bom_view.sysml +2 -2
  215. package/src/viewpoints/rendering/memo_rendering.sysml +354 -0
  216. package/src/viewpoints/requirements/requirements_viewpoint.sysml +3 -1
  217. package/src/viewpoints/requirements/{requirements_traceability_view → views/requirements_traceability_view}/requirements_traceability_view.sysml +2 -2
  218. package/src/viewpoints/risk/risk_viewpoint.sysml +3 -1
  219. package/src/viewpoints/risk/{risk_chain_view → views/risk_chain_view}/risk_chain_view.sysml +2 -2
  220. package/src/viewpoints/software/software_viewpoint.sysml +3 -1
  221. package/src/viewpoints/software/{software_architecture_view → views/software_architecture_view}/software_architecture_view.sysml +2 -2
  222. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +28 -0
  223. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +23 -0
  224. package/src/viewpoints/usability/usability_viewpoint.sysml +3 -1
  225. package/src/viewpoints/usability/{usability_engineering_view → views/usability_engineering_view}/usability_engineering_view.sysml +2 -2
  226. package/src/viewpoints/verification/verification_viewpoint.sysml +3 -1
  227. package/src/viewpoints/verification/{verification_coverage_view → views/verification_coverage_view}/verification_coverage_view.sysml +2 -2
  228. package/templates/connected-device/memo.package.yaml +11 -5
  229. package/templates/connected-device/model/catalog/project.sysml +28 -0
  230. package/templates/connected-device/syside.toml +1 -1
  231. package/templates/default/memo.package.yaml +11 -5
  232. package/templates/default/model/catalog/project.sysml +28 -0
  233. package/templates/default/syside.toml +1 -1
  234. package/templates/infusion-pump/memo.package.yaml +11 -5
  235. package/templates/infusion-pump/model/catalog/project.sysml +28 -0
  236. package/templates/infusion-pump/syside.toml +1 -1
  237. package/templates/monitoring-device/memo.package.yaml +11 -5
  238. package/templates/monitoring-device/model/catalog/project.sysml +28 -0
  239. package/templates/monitoring-device/syside.toml +1 -1
  240. package/templates/samd/memo.package.yaml +11 -5
  241. package/templates/samd/model/catalog/project.sysml +28 -0
  242. package/templates/samd/syside.toml +1 -1
  243. package/examples/connected-patient-monitor/model/connected_patient_monitor.sysml +0 -3
  244. package/examples/embedded-infusion-pump/model/embedded_infusion_pump.sysml +0 -3
  245. package/examples/functional-logical-physical/model/functional_logical_physical.sysml +0 -3
  246. package/examples/gpca-pump/memo.config.yaml +0 -9
  247. package/examples/gpca-pump/methodology/gpca_scope.sysml +0 -25
  248. package/examples/ivd-laboratory-system/model/ivd_laboratory_system.sysml +0 -3
  249. package/examples/manual-surgical-instrument/model/manual_surgical_instrument.sysml +0 -3
  250. package/examples/multidimensional-layers/model/multidimensional_layers.sysml +0 -4
  251. package/examples/reusable-instrument/model/reusable_instrument.sysml +0 -4
  252. package/examples/software-only-medical-device/model/software_only_medical_device.sysml +0 -4
  253. package/examples/surgical-closure-workflow/model/surgical_closure_workflow.sysml +0 -4
  254. package/examples/surgical-robot/model/surgical_robot.sysml +0 -4
  255. package/examples/temperature-alarm/model/temperature_alarm.sysml +0 -4
  256. package/ontology/memo.rendering.yaml +0 -84
  257. package/src/compliance/artifacts/memo_artifacts.sysml +0 -12
  258. package/src/compliance/document_views/memo_document_views.sysml +0 -7
  259. package/src/compliance/iso14971/risk_management_file.sysml +0 -16
  260. package/src/compliance/postmarket/memo_postmarket.sysml +0 -16
  261. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/change-record.md +0 -0
  262. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-input.md +0 -0
  263. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-output.md +0 -0
  264. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-review.md +0 -0
  265. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-validation.md +0 -0
  266. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/design-verification.md +0 -0
  267. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/dhf-index.md +0 -0
  268. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/transfer-plan.md +0 -0
  269. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/user-needs.md +0 -0
  270. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/vv-plan.md +0 -0
  271. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/21cfr820/vv-report.md +0 -0
  272. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/incident-response.md +0 -0
  273. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/postmarket-surveillance.md +0 -0
  274. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/security-arch.md +0 -0
  275. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/threat-model.md +0 -0
  276. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/fda-cybersecurity/vuln-assessment.md +0 -0
  277. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/change-control.md +0 -0
  278. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/detailed-design.md +0 -0
  279. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/integration-test.md +0 -0
  280. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sad.md +0 -0
  281. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sbom.md +0 -0
  282. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sdp.md +0 -0
  283. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/soup.md +0 -0
  284. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/srs.md +0 -0
  285. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/sw-traceability.md +0 -0
  286. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62304/system-test.md +0 -0
  287. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/formative-eval.md +0 -0
  288. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/summative-eval.md +0 -0
  289. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/task-analysis.md +0 -0
  290. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/ue-plan.md +0 -0
  291. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/ui-spec.md +0 -0
  292. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/urra.md +0 -0
  293. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iec-62366/use-spec.md +0 -0
  294. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/fmea.md +0 -0
  295. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/fta.md +0 -0
  296. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/har.md +0 -0
  297. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/risk-benefit.md +0 -0
  298. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/risk-matrix.md +0 -0
  299. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/rmp.md +0 -0
  300. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/iso-14971/rmr.md +0 -0
  301. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/approval-block.md +0 -0
  302. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/document-control-header.md +0 -0
  303. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/references-section.md +0 -0
  304. /package/src/{compliance/dhf-templates → artifacts/templates/dhf}/shared/snippets/revision-history-table.md +0 -0
  305. /package/templates/connected-device/{src → model/catalog}/architecture/system.sysml +0 -0
  306. /package/templates/connected-device/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  307. /package/templates/connected-device/{src → model/catalog}/assurance/requirements.sysml +0 -0
  308. /package/templates/default/{src → model/catalog}/architecture/system.sysml +0 -0
  309. /package/templates/default/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  310. /package/templates/default/{src → model/catalog}/assurance/requirements.sysml +0 -0
  311. /package/templates/infusion-pump/{src → model/catalog}/architecture/system.sysml +0 -0
  312. /package/templates/infusion-pump/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  313. /package/templates/infusion-pump/{src → model/catalog}/assurance/requirements.sysml +0 -0
  314. /package/templates/monitoring-device/{src → model/catalog}/architecture/system.sysml +0 -0
  315. /package/templates/monitoring-device/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  316. /package/templates/monitoring-device/{src → model/catalog}/assurance/requirements.sysml +0 -0
  317. /package/templates/samd/{src → model/catalog}/architecture/system.sysml +0 -0
  318. /package/templates/samd/{src/artifacts/artifacts.sysml → model/catalog/artifacts/catalog.sysml} +0 -0
  319. /package/templates/samd/{src → model/catalog}/assurance/requirements.sysml +0 -0
@@ -0,0 +1,24 @@
1
+ // Ivd Laboratory System — 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_ivd_laboratory_system_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_ivd_laboratory_system_viewpoints_unassigned::*;
15
+ private import memo_examples_ivd_laboratory_system_viewpoints_unassigned_views_ivd_laboratory_system_overview::*;
16
+
17
+ part projectBinding : ProjectMethodBinding {
18
+ attribute :>> id = "PMB-LABORATORY-SYSTEM-001";
19
+ attribute :>> name = "IvdLaboratorySystemProjectMethodBinding";
20
+ attribute :>> projectName = "Ivd Laboratory System";
21
+ ref :>> selectedMethodology = mdDefaultDefinition;
22
+ attribute :>> scopeMode = ScopeModeKind::explicit;
23
+ }
24
+ }
@@ -0,0 +1,9 @@
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_ivd_laboratory_system_viewpoints_unassigned {
7
+ // The reusable package declaring unassigned could not be resolved during
8
+ // conversion. Import it here so the views beneath this viewpoint resolve.
9
+ }
@@ -1,4 +1,4 @@
1
- package memo_examples_ivd_laboratory_system_viewpoints {
1
+ package memo_examples_ivd_laboratory_system_viewpoints_unassigned_views_ivd_laboratory_system_overview {
2
2
  private import memo_examples_ivd_laboratory_system::*;
3
3
  private import memo_viewpoints_definitions::*;
4
4
  private import memo_core_enumerations::*;
@@ -5,6 +5,7 @@ package memo_examples_manual_surgical_instrument {
5
5
  private import ScalarValues::*;
6
6
 
7
7
  private import memo_core_enumerations::*;
8
+ private import memo_core_relationships::*;
8
9
  private import memo_architecture_operational_activities::*;
9
10
  private import memo_architecture_implementation_hardware_structure::*;
10
11
 
@@ -0,0 +1,24 @@
1
+ // Manual Surgical Instrument — 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_manual_surgical_instrument_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_manual_surgical_instrument_viewpoints_unassigned::*;
15
+ private import memo_examples_manual_surgical_instrument_viewpoints_unassigned_views_manual_surgical_instrument_overview::*;
16
+
17
+ part projectBinding : ProjectMethodBinding {
18
+ attribute :>> id = "PMB-SURGICAL-INSTRUMENT-001";
19
+ attribute :>> name = "ManualSurgicalInstrumentProjectMethodBinding";
20
+ attribute :>> projectName = "Manual Surgical Instrument";
21
+ ref :>> selectedMethodology = mdDefaultDefinition;
22
+ attribute :>> scopeMode = ScopeModeKind::explicit;
23
+ }
24
+ }
@@ -0,0 +1,9 @@
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_manual_surgical_instrument_viewpoints_unassigned {
7
+ // The reusable package declaring unassigned could not be resolved during
8
+ // conversion. Import it here so the views beneath this viewpoint resolve.
9
+ }
@@ -1,4 +1,4 @@
1
- package memo_examples_manual_surgical_instrument_viewpoints {
1
+ package memo_examples_manual_surgical_instrument_viewpoints_unassigned_views_manual_surgical_instrument_overview {
2
2
  private import memo_examples_manual_surgical_instrument::*;
3
3
  private import memo_viewpoints_definitions::*;
4
4
  private import memo_core_enumerations::*;
@@ -0,0 +1,24 @@
1
+ // Multidimensional Layers — 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_multidimensional_layers_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_multidimensional_layers_viewpoints_unassigned::*;
15
+ private import memo_examples_multidimensional_layers_viewpoints_unassigned_views_multidimensional_layers_overview::*;
16
+
17
+ part projectBinding : ProjectMethodBinding {
18
+ attribute :>> id = "PMB-MULTIDIMENSIONAL-LAYERS-001";
19
+ attribute :>> name = "MultidimensionalLayersProjectMethodBinding";
20
+ attribute :>> projectName = "Multidimensional Layers";
21
+ ref :>> selectedMethodology = mdDefaultDefinition;
22
+ attribute :>> scopeMode = ScopeModeKind::explicit;
23
+ }
24
+ }
@@ -0,0 +1,9 @@
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_multidimensional_layers_viewpoints_unassigned {
7
+ // The reusable package declaring unassigned could not be resolved during
8
+ // conversion. Import it here so the views beneath this viewpoint resolve.
9
+ }
@@ -1,4 +1,4 @@
1
- package memo_examples_multidimensional_layers_viewpoints {
1
+ package memo_examples_multidimensional_layers_viewpoints_unassigned_views_multidimensional_layers_overview {
2
2
  private import memo_examples_multidimensional_layers::*;
3
3
  private import memo_viewpoints_definitions::*;
4
4
  private import memo_core_enumerations::*;
@@ -0,0 +1,49 @@
1
+ # Nested Architecture DSM
2
+
3
+ A small infusion-pump model whose only purpose is to exercise the two matrix
4
+ analyses — the Design Structure Matrix and the Traceability Matrix — with a
5
+ hierarchy deep enough that expanding and collapsing changes what you see.
6
+
7
+ ## What is in it
8
+
9
+ | Axis material | Elements | Nesting |
10
+ | --- | --- | --- |
11
+ | Logical structure | 1 system, 5 subsystems, 12 components | 4 levels (`System → Subsystem → Subsystem → LogicalComponent`) |
12
+ | Functional architecture | 18 system functions | 3 levels, four capability trees |
13
+ | Requirements | 7 requirements | flat |
14
+
15
+ Nesting is declared with `Composes`, so both matrices build their trees from
16
+ the model rather than from a naming convention.
17
+
18
+ ## What it is set up to show
19
+
20
+ - **Roll-up.** `SafetyMonitorSubsystem` sits one level deeper than its peers, so
21
+ a collapsed `ControlSubsystem` row genuinely sums its descendants instead of
22
+ standing in for a single child.
23
+ - **Feedback.** `DriveActuator` and `MeasureDeliveredVolume` exchange in both
24
+ directions, so a partitioned DSM still shows one real feedback mark rather
25
+ than an empty lower triangle.
26
+ - **Cross-tree dependency.** `EnforceDoseLimits → DriveActuator` and
27
+ `SelectPowerSource → DriveActuator` cross capability trees, which is what a
28
+ collapsed matrix rolls into a single number between two capabilities.
29
+ - **Asymmetric axes.** Functions on the rows and blocks on the columns, joined
30
+ by `AllocatedTo` — including `MeterFluid → FluidPathSubsystem`, an allocation
31
+ made at subsystem level rather than to one component.
32
+ - **A traceability gap.** `StatusVisibility` is satisfied by nothing, so
33
+ coverage reads under 100% and there is an empty row to author a link into.
34
+
35
+ ## Suggested run
36
+
37
+ ```bash
38
+ memo-architect --example nested-architecture-dsm
39
+ ```
40
+
41
+ In **DSM**: set rows and columns to `SystemFunction`, dependency to
42
+ `exchangesWith`, and switch ordering between *Name* and *Partition* — the
43
+ feedback count drops and one mark stays below the diagonal. Then set columns to
44
+ the logical kinds and dependency to `allocatedTo` for the allocation view.
45
+
46
+ In **Traceability**: rows `Requirement`, columns `SystemFunction`, trace via
47
+ `satisfiedBy`. Turn on **Edit links** and click the empty `StatusVisibility` row
48
+ to author the missing trace; it is written back to
49
+ `model/catalog/traces.sysml`.
@@ -0,0 +1,174 @@
1
+ // Functional architecture — the row axis of the DSM.
2
+ //
3
+ // Four capability trees, each decomposed with Composes, plus the functional
4
+ // exchanges between the leaves. The exchanges are deliberately not a clean
5
+ // pipeline: DriveActuator and MeasureDeliveredVolume feed each other, so a
6
+ // partitioned DSM still shows one genuine feedback mark instead of an empty
7
+ // lower triangle.
8
+ package memo_examples_nested_architecture_dsm_architecture_functional_functions {
9
+ private import ScalarValues::*;
10
+
11
+ private import memo_core_enumerations::*;
12
+ private import memo_core_relationships::*;
13
+ private import memo_architecture_functional_functions::*;
14
+
15
+ // ── Deliver therapy ──────────────────────────────────────────
16
+ part fnDeliverTherapy : SystemFunction {
17
+ attribute :>> id = "NDS-FN-001"; attribute :>> name = "DeliverTherapy";
18
+ attribute :>> functionCategory = "therapy";
19
+ attribute :>> criticality = CriticalityKind::catastrophic;
20
+ attribute :>> concernKind = ConcernKind::safety;
21
+ attribute :>> outputSummary = "fluid delivered to the patient line at the prescribed rate";
22
+ }
23
+ part fnMeterFluid : SystemFunction {
24
+ attribute :>> id = "NDS-FN-002"; attribute :>> name = "MeterFluid";
25
+ attribute :>> functionCategory = "therapy";
26
+ attribute :>> criticality = CriticalityKind::catastrophic;
27
+ attribute :>> concernKind = ConcernKind::safety;
28
+ attribute :>> outputSummary = "measured volume displaced per control period";
29
+ }
30
+ part fnDriveActuator : SystemFunction {
31
+ attribute :>> id = "NDS-FN-003"; attribute :>> name = "DriveActuator";
32
+ attribute :>> functionCategory = "therapy";
33
+ attribute :>> criticality = CriticalityKind::catastrophic;
34
+ attribute :>> trigger = "rate command from the dose control loop";
35
+ attribute :>> concernKind = ConcernKind::safety;
36
+ }
37
+ part fnMeasureDelivered : SystemFunction {
38
+ attribute :>> id = "NDS-FN-004"; attribute :>> name = "MeasureDeliveredVolume";
39
+ attribute :>> functionCategory = "therapy";
40
+ attribute :>> criticality = CriticalityKind::high;
41
+ attribute :>> concernKind = ConcernKind::safety;
42
+ attribute :>> outputSummary = "cumulative delivered volume";
43
+ }
44
+ part fnControlDose : SystemFunction {
45
+ attribute :>> id = "NDS-FN-005"; attribute :>> name = "ControlDose";
46
+ attribute :>> functionCategory = "therapy";
47
+ attribute :>> criticality = CriticalityKind::catastrophic;
48
+ attribute :>> concernKind = ConcernKind::safety;
49
+ }
50
+ part fnComputeRate : SystemFunction {
51
+ attribute :>> id = "NDS-FN-006"; attribute :>> name = "ComputeInfusionRate";
52
+ attribute :>> functionCategory = "therapy";
53
+ attribute :>> criticality = CriticalityKind::catastrophic;
54
+ attribute :>> concernKind = ConcernKind::safety;
55
+ attribute :>> outputSummary = "rate command, saturated at the prescribed ceiling";
56
+ }
57
+ part fnValidatePrescription : SystemFunction {
58
+ attribute :>> id = "NDS-FN-007"; attribute :>> name = "ValidatePrescription";
59
+ attribute :>> functionCategory = "therapy";
60
+ attribute :>> criticality = CriticalityKind::high;
61
+ attribute :>> concernKind = ConcernKind::clinical;
62
+ attribute :>> outputSummary = "accepted or rejected prescription, with the reason";
63
+ }
64
+ connection : Composes connect parent ::> fnDeliverTherapy to child ::> fnMeterFluid;
65
+ connection : Composes connect parent ::> fnDeliverTherapy to child ::> fnControlDose;
66
+ connection : Composes connect parent ::> fnMeterFluid to child ::> fnDriveActuator;
67
+ connection : Composes connect parent ::> fnMeterFluid to child ::> fnMeasureDelivered;
68
+ connection : Composes connect parent ::> fnControlDose to child ::> fnComputeRate;
69
+ connection : Composes connect parent ::> fnControlDose to child ::> fnValidatePrescription;
70
+
71
+ // ── Ensure safety ────────────────────────────────────────────
72
+ part fnEnsureSafety : SystemFunction {
73
+ attribute :>> id = "NDS-FN-008"; attribute :>> name = "EnsureSafety";
74
+ attribute :>> functionCategory = "protection";
75
+ attribute :>> criticality = CriticalityKind::catastrophic;
76
+ attribute :>> concernKind = ConcernKind::safety;
77
+ }
78
+ part fnDetectOcclusion : SystemFunction {
79
+ attribute :>> id = "NDS-FN-009"; attribute :>> name = "DetectOcclusion";
80
+ attribute :>> functionCategory = "protection";
81
+ attribute :>> criticality = CriticalityKind::catastrophic;
82
+ attribute :>> trigger = "line pressure above the occlusion threshold";
83
+ attribute :>> concernKind = ConcernKind::safety;
84
+ }
85
+ part fnDetectAirInLine : SystemFunction {
86
+ attribute :>> id = "NDS-FN-010"; attribute :>> name = "DetectAirInLine";
87
+ attribute :>> functionCategory = "protection";
88
+ attribute :>> criticality = CriticalityKind::catastrophic;
89
+ attribute :>> trigger = "air bolus detected in the patient line";
90
+ attribute :>> concernKind = ConcernKind::safety;
91
+ }
92
+ part fnEnforceDoseLimits : SystemFunction {
93
+ attribute :>> id = "NDS-FN-011"; attribute :>> name = "EnforceDoseLimits";
94
+ attribute :>> functionCategory = "protection";
95
+ attribute :>> criticality = CriticalityKind::catastrophic;
96
+ attribute :>> concernKind = ConcernKind::safety;
97
+ attribute :>> outputSummary = "delivery stopped when the commanded dose leaves the accepted envelope";
98
+ }
99
+ connection : Composes connect parent ::> fnEnsureSafety to child ::> fnDetectOcclusion;
100
+ connection : Composes connect parent ::> fnEnsureSafety to child ::> fnDetectAirInLine;
101
+ connection : Composes connect parent ::> fnEnsureSafety to child ::> fnEnforceDoseLimits;
102
+
103
+ // ── Inform the user ──────────────────────────────────────────
104
+ part fnInformUser : SystemFunction {
105
+ attribute :>> id = "NDS-FN-012"; attribute :>> name = "InformUser";
106
+ attribute :>> functionCategory = "interaction";
107
+ attribute :>> criticality = CriticalityKind::high;
108
+ attribute :>> concernKind = ConcernKind::usability;
109
+ }
110
+ part fnRenderStatus : SystemFunction {
111
+ attribute :>> id = "NDS-FN-013"; attribute :>> name = "RenderTherapyStatus";
112
+ attribute :>> functionCategory = "interaction";
113
+ attribute :>> criticality = CriticalityKind::high;
114
+ attribute :>> concernKind = ConcernKind::usability;
115
+ attribute :>> outputSummary = "rate, volume delivered and time remaining";
116
+ }
117
+ part fnAnnunciateAlarm : SystemFunction {
118
+ attribute :>> id = "NDS-FN-014"; attribute :>> name = "AnnunciateAlarm";
119
+ attribute :>> functionCategory = "interaction";
120
+ attribute :>> criticality = CriticalityKind::catastrophic;
121
+ attribute :>> trigger = "any active alarm condition";
122
+ attribute :>> concernKind = ConcernKind::safety;
123
+ }
124
+ part fnAcceptInput : SystemFunction {
125
+ attribute :>> id = "NDS-FN-015"; attribute :>> name = "AcceptClinicianInput";
126
+ attribute :>> functionCategory = "interaction";
127
+ attribute :>> criticality = CriticalityKind::high;
128
+ attribute :>> concernKind = ConcernKind::usability;
129
+ attribute :>> outputSummary = "confirmed prescription changes";
130
+ }
131
+ connection : Composes connect parent ::> fnInformUser to child ::> fnRenderStatus;
132
+ connection : Composes connect parent ::> fnInformUser to child ::> fnAnnunciateAlarm;
133
+ connection : Composes connect parent ::> fnInformUser to child ::> fnAcceptInput;
134
+
135
+ // ── Manage power ─────────────────────────────────────────────
136
+ part fnManagePower : SystemFunction {
137
+ attribute :>> id = "NDS-FN-016"; attribute :>> name = "ManagePower";
138
+ attribute :>> functionCategory = "platform";
139
+ attribute :>> criticality = CriticalityKind::high;
140
+ attribute :>> concernKind = ConcernKind::reliability;
141
+ }
142
+ part fnMonitorBattery : SystemFunction {
143
+ attribute :>> id = "NDS-FN-017"; attribute :>> name = "MonitorBatteryState";
144
+ attribute :>> functionCategory = "platform";
145
+ attribute :>> criticality = CriticalityKind::high;
146
+ attribute :>> concernKind = ConcernKind::reliability;
147
+ attribute :>> outputSummary = "state of charge and remaining run time";
148
+ }
149
+ part fnSelectPowerSource : SystemFunction {
150
+ attribute :>> id = "NDS-FN-018"; attribute :>> name = "SelectPowerSource";
151
+ attribute :>> functionCategory = "platform";
152
+ attribute :>> criticality = CriticalityKind::high;
153
+ attribute :>> trigger = "mains loss or rail brownout";
154
+ attribute :>> concernKind = ConcernKind::reliability;
155
+ }
156
+ connection : Composes connect parent ::> fnManagePower to child ::> fnMonitorBattery;
157
+ connection : Composes connect parent ::> fnManagePower to child ::> fnSelectPowerSource;
158
+
159
+ // ── Functional exchange ──────────────────────────────────────
160
+ // Cross-tree marks are the interesting ones: they are what a collapsed DSM
161
+ // rolls up into a single number between two capabilities.
162
+ connection : ExchangesWith connect source ::> fnMeasureDelivered to target ::> fnComputeRate;
163
+ connection : ExchangesWith connect source ::> fnComputeRate to target ::> fnDriveActuator;
164
+ connection : ExchangesWith connect source ::> fnDriveActuator to target ::> fnMeasureDelivered;
165
+ connection : ExchangesWith connect source ::> fnValidatePrescription to target ::> fnComputeRate;
166
+ connection : ExchangesWith connect source ::> fnAcceptInput to target ::> fnValidatePrescription;
167
+ connection : ExchangesWith connect source ::> fnDetectOcclusion to target ::> fnEnforceDoseLimits;
168
+ connection : ExchangesWith connect source ::> fnDetectAirInLine to target ::> fnAnnunciateAlarm;
169
+ connection : ExchangesWith connect source ::> fnEnforceDoseLimits to target ::> fnDriveActuator;
170
+ connection : ExchangesWith connect source ::> fnMeasureDelivered to target ::> fnRenderStatus;
171
+ connection : ExchangesWith connect source ::> fnMonitorBattery to target ::> fnAnnunciateAlarm;
172
+ connection : ExchangesWith connect source ::> fnSelectPowerSource to target ::> fnDriveActuator;
173
+ connection : ExchangesWith connect source ::> fnDetectOcclusion to target ::> fnAnnunciateAlarm;
174
+ }
@@ -0,0 +1,183 @@
1
+ // Logical structure — the column axis of the DSM.
2
+ //
3
+ // Four levels deep on purpose (System → Subsystem → Subsystem → component),
4
+ // so expanding and collapsing the matrix has something real to do. Nesting is
5
+ // declared with Composes rather than left implicit, which is what the DSM
6
+ // reads to build the column tree.
7
+ package memo_examples_nested_architecture_dsm_architecture_logical_structure {
8
+ private import ScalarValues::*;
9
+
10
+ private import memo_core_enumerations::*;
11
+ private import memo_core_relationships::*;
12
+ private import memo_architecture_logical_structure::*;
13
+
14
+ // ── Level 0: the system ──────────────────────────────────────
15
+ part sysTherapyDelivery : System {
16
+ attribute :>> id = "NDS-SYS-001"; attribute :>> name = "TherapyDeliverySystem";
17
+ attribute :>> componentRole = ComponentRoleKind::generic;
18
+ attribute :>> systemType = SystemTypeKind::logical;
19
+ attribute :>> systemBoundaryDescription = "Everything inside the pump enclosure, including its power path and user interface.";
20
+ attribute :>> responsibility = "Deliver a prescribed infusion safely and report what it delivered.";
21
+ }
22
+
23
+ // ── Level 1: subsystems ──────────────────────────────────────
24
+ part subFluidPath : Subsystem {
25
+ attribute :>> id = "NDS-SUB-001"; attribute :>> name = "FluidPathSubsystem";
26
+ attribute :>> componentRole = ComponentRoleKind::generic;
27
+ attribute :>> systemType = SystemTypeKind::hardware;
28
+ attribute :>> responsibility = "Move fluid from the reservoir to the patient line at a commanded rate.";
29
+ }
30
+ part subControl : Subsystem {
31
+ attribute :>> id = "NDS-SUB-002"; attribute :>> name = "ControlSubsystem";
32
+ attribute :>> componentRole = ComponentRoleKind::controlElement;
33
+ attribute :>> systemType = SystemTypeKind::software;
34
+ attribute :>> responsibility = "Decide what the fluid path should do, and hold the therapy state.";
35
+ }
36
+ part subUserInterface : Subsystem {
37
+ attribute :>> id = "NDS-SUB-003"; attribute :>> name = "UserInterfaceSubsystem";
38
+ attribute :>> componentRole = ComponentRoleKind::userInterface;
39
+ attribute :>> systemType = SystemTypeKind::software;
40
+ attribute :>> responsibility = "Present therapy state to the clinician and accept their input.";
41
+ }
42
+ part subPower : Subsystem {
43
+ attribute :>> id = "NDS-SUB-004"; attribute :>> name = "PowerSubsystem";
44
+ attribute :>> componentRole = ComponentRoleKind::generic;
45
+ attribute :>> systemType = SystemTypeKind::hardware;
46
+ attribute :>> responsibility = "Supply and monitor power across mains and battery operation.";
47
+ }
48
+
49
+ connection : Composes connect parent ::> sysTherapyDelivery to child ::> subFluidPath;
50
+ connection : Composes connect parent ::> sysTherapyDelivery to child ::> subControl;
51
+ connection : Composes connect parent ::> sysTherapyDelivery to child ::> subUserInterface;
52
+ connection : Composes connect parent ::> sysTherapyDelivery to child ::> subPower;
53
+
54
+ // ── Level 2: a subsystem inside a subsystem ──────────────────
55
+ // The safety monitor is nested one level deeper than its peers, which is
56
+ // what makes a collapsed ControlSubsystem row a genuine roll-up rather
57
+ // than a rename of its children.
58
+ part subSafetyMonitor : Subsystem {
59
+ attribute :>> id = "NDS-SUB-005"; attribute :>> name = "SafetyMonitorSubsystem";
60
+ attribute :>> componentRole = ComponentRoleKind::channel;
61
+ attribute :>> systemType = SystemTypeKind::software;
62
+ attribute :>> responsibility = "Watch the control path from outside it and stop delivery on breach.";
63
+ attribute :>> safetyPartition = "monitor partition, separate MPU region from the control partition";
64
+ }
65
+ connection : Composes connect parent ::> subControl to child ::> subSafetyMonitor;
66
+
67
+ // ── Level 2/3: components ────────────────────────────────────
68
+ part lcPumpMechanism : LogicalComponent {
69
+ attribute :>> id = "NDS-LC-001"; attribute :>> name = "PumpMechanism";
70
+ attribute :>> componentRole = ComponentRoleKind::controlElement;
71
+ attribute :>> systemType = SystemTypeKind::hardware;
72
+ attribute :>> responsibility = "Displace fluid under command.";
73
+ attribute :>> controlledVariable = "delivered volume per stroke";
74
+ }
75
+ part lcOcclusionChannel : LogicalComponent {
76
+ attribute :>> id = "NDS-LC-002"; attribute :>> name = "OcclusionSensingChannel";
77
+ attribute :>> componentRole = ComponentRoleKind::channel;
78
+ attribute :>> systemType = SystemTypeKind::hardware;
79
+ attribute :>> responsibility = "Sense line pressure and air in line.";
80
+ attribute :>> channelRole = ChannelRoleKind::primary;
81
+ }
82
+ part lcReservoirInterface : LogicalComponent {
83
+ attribute :>> id = "NDS-LC-003"; attribute :>> name = "ReservoirInterface";
84
+ attribute :>> componentRole = ComponentRoleKind::generic;
85
+ attribute :>> systemType = SystemTypeKind::hardware;
86
+ attribute :>> responsibility = "Seat the reservoir and expose its remaining volume.";
87
+ }
88
+ connection : Composes connect parent ::> subFluidPath to child ::> lcPumpMechanism;
89
+ connection : Composes connect parent ::> subFluidPath to child ::> lcOcclusionChannel;
90
+ connection : Composes connect parent ::> subFluidPath to child ::> lcReservoirInterface;
91
+
92
+ part lcDoseController : LogicalComponent {
93
+ attribute :>> id = "NDS-LC-004"; attribute :>> name = "DoseController";
94
+ attribute :>> componentRole = ComponentRoleKind::controlElement;
95
+ attribute :>> systemType = SystemTypeKind::software;
96
+ attribute :>> responsibility = "Turn a prescription into rate commands.";
97
+ attribute :>> controlLaw = "closed loop on delivered volume, saturated at the prescribed limit";
98
+ attribute :>> controlledVariable = "infusion rate";
99
+ }
100
+ part lcTherapyStateStore : LogicalComponent {
101
+ attribute :>> id = "NDS-LC-005"; attribute :>> name = "TherapyStateStore";
102
+ attribute :>> componentRole = ComponentRoleKind::dataStore;
103
+ attribute :>> systemType = SystemTypeKind::software;
104
+ attribute :>> responsibility = "Hold the active therapy record across power cycles.";
105
+ attribute :>> persistenceRequirement = "survives power loss with the last completed transaction intact";
106
+ attribute :>> integrityRequirement = "CRC per record, rejected on mismatch";
107
+ }
108
+ connection : Composes connect parent ::> subControl to child ::> lcDoseController;
109
+ connection : Composes connect parent ::> subControl to child ::> lcTherapyStateStore;
110
+
111
+ part lcWatchdogChannel : LogicalComponent {
112
+ attribute :>> id = "NDS-LC-006"; attribute :>> name = "WatchdogChannel";
113
+ attribute :>> componentRole = ComponentRoleKind::channel;
114
+ attribute :>> systemType = SystemTypeKind::software;
115
+ attribute :>> responsibility = "Reset to the safe state when the control loop misses its deadline.";
116
+ attribute :>> channelRole = ChannelRoleKind::monitor;
117
+ attribute :>> diversityBasis = "independent time base from the control partition";
118
+ }
119
+ part lcPressureIntegrityChannel : LogicalComponent {
120
+ attribute :>> id = "NDS-LC-007"; attribute :>> name = "PressureIntegrityChannel";
121
+ attribute :>> componentRole = ComponentRoleKind::channel;
122
+ attribute :>> systemType = SystemTypeKind::software;
123
+ attribute :>> responsibility = "Cross-check pressure against the commanded rate and stop on divergence.";
124
+ attribute :>> channelRole = ChannelRoleKind::monitor;
125
+ attribute :>> diversityBasis = "different measurement principle from the primary occlusion channel";
126
+ }
127
+ connection : Composes connect parent ::> subSafetyMonitor to child ::> lcWatchdogChannel;
128
+ connection : Composes connect parent ::> subSafetyMonitor to child ::> lcPressureIntegrityChannel;
129
+
130
+ part lcDisplayManager : LogicalComponent {
131
+ attribute :>> id = "NDS-LC-008"; attribute :>> name = "DisplayManager";
132
+ attribute :>> componentRole = ComponentRoleKind::userInterface;
133
+ attribute :>> systemType = SystemTypeKind::software;
134
+ attribute :>> responsibility = "Render therapy state on the main screen.";
135
+ attribute :>> interactionSummary = "read-only status surface, refreshed once per second";
136
+ }
137
+ part lcAlarmAnnunciator : LogicalComponent {
138
+ attribute :>> id = "NDS-LC-009"; attribute :>> name = "AlarmAnnunciator";
139
+ attribute :>> componentRole = ComponentRoleKind::userInterface;
140
+ attribute :>> systemType = SystemTypeKind::software;
141
+ attribute :>> responsibility = "Raise audible and visible alarms by priority.";
142
+ attribute :>> interactionSummary = "IEC 60601-1-8 alarm signals";
143
+ }
144
+ part lcKeypadHandler : LogicalComponent {
145
+ attribute :>> id = "NDS-LC-010"; attribute :>> name = "KeypadHandler";
146
+ attribute :>> componentRole = ComponentRoleKind::userInterface;
147
+ attribute :>> systemType = SystemTypeKind::software;
148
+ attribute :>> responsibility = "Debounce and interpret key presses.";
149
+ attribute :>> interactionSummary = "physical keypad, confirm-before-apply for every rate change";
150
+ }
151
+ connection : Composes connect parent ::> subUserInterface to child ::> lcDisplayManager;
152
+ connection : Composes connect parent ::> subUserInterface to child ::> lcAlarmAnnunciator;
153
+ connection : Composes connect parent ::> subUserInterface to child ::> lcKeypadHandler;
154
+
155
+ part lcBatteryManager : LogicalComponent {
156
+ attribute :>> id = "NDS-LC-011"; attribute :>> name = "BatteryManager";
157
+ attribute :>> componentRole = ComponentRoleKind::generic;
158
+ attribute :>> systemType = SystemTypeKind::hardware;
159
+ attribute :>> responsibility = "Charge, gauge and protect the battery.";
160
+ }
161
+ part lcPowerRailMonitor : LogicalComponent {
162
+ attribute :>> id = "NDS-LC-012"; attribute :>> name = "PowerRailMonitor";
163
+ attribute :>> componentRole = ComponentRoleKind::channel;
164
+ attribute :>> systemType = SystemTypeKind::hardware;
165
+ attribute :>> responsibility = "Detect rail brownout and request a source switch.";
166
+ attribute :>> channelRole = ChannelRoleKind::monitor;
167
+ }
168
+ connection : Composes connect parent ::> subPower to child ::> lcBatteryManager;
169
+ connection : Composes connect parent ::> subPower to child ::> lcPowerRailMonitor;
170
+
171
+ // ── Component-to-component dependency ────────────────────────
172
+ // What the DSM plots when both axes are architecture: who needs whom.
173
+ connection : ExchangesWith connect source ::> lcOcclusionChannel to target ::> lcDoseController;
174
+ connection : ExchangesWith connect source ::> lcDoseController to target ::> lcPumpMechanism;
175
+ connection : ExchangesWith connect source ::> lcPumpMechanism to target ::> lcTherapyStateStore;
176
+ connection : ExchangesWith connect source ::> lcTherapyStateStore to target ::> lcDisplayManager;
177
+ connection : ExchangesWith connect source ::> lcWatchdogChannel to target ::> lcDoseController;
178
+ connection : ExchangesWith connect source ::> lcPressureIntegrityChannel to target ::> lcAlarmAnnunciator;
179
+ connection : ExchangesWith connect source ::> lcKeypadHandler to target ::> lcDoseController;
180
+ connection : ExchangesWith connect source ::> lcReservoirInterface to target ::> lcPumpMechanism;
181
+ connection : ExchangesWith connect source ::> lcBatteryManager to target ::> lcPowerRailMonitor;
182
+ connection : ExchangesWith connect source ::> lcPowerRailMonitor to target ::> lcAlarmAnnunciator;
183
+ }
@@ -0,0 +1,53 @@
1
+ // Stakeholder needs — the outermost row of a full trace chain.
2
+ //
3
+ // Need → Requirement → Function → VerificationCase is the chain the
4
+ // traceability view is meant to walk one hop at a time.
5
+ package memo_examples_nested_architecture_dsm_assurance_requirements_needs {
6
+ private import ScalarValues::*;
7
+
8
+ private import memo_core_enumerations::*;
9
+ private import memo_core_relationships::*;
10
+ private import memo_assurance_requirements_needs::*;
11
+ private import memo_examples_nested_architecture_dsm_assurance_requirements::*;
12
+
13
+ requirement needAccurateTherapy : Need {
14
+ attribute :>> id = "NDS-NEED-001"; attribute :>> name = "AccurateTherapyDelivery";
15
+ attribute :>> needKind = NeedKind::'stakeholder';
16
+ attribute :>> statement = "Clinicians need the delivered dose to match the prescription closely enough to be clinically safe.";
17
+ attribute :>> priority = "high";
18
+ }
19
+ requirement needProtectionFromHarm : Need {
20
+ attribute :>> id = "NDS-NEED-002"; attribute :>> name = "ProtectionFromDeliveryFaults";
21
+ attribute :>> needKind = NeedKind::'stakeholder';
22
+ attribute :>> statement = "Patients need delivery to stop before a line fault or air bolus reaches them.";
23
+ attribute :>> priority = "high";
24
+ }
25
+ requirement needUninterruptedTherapy : Need {
26
+ attribute :>> id = "NDS-NEED-003"; attribute :>> name = "UninterruptedTherapy";
27
+ attribute :>> needKind = NeedKind::operational;
28
+ attribute :>> statement = "Wards need therapy to continue through transport and mains interruptions.";
29
+ attribute :>> priority = "medium";
30
+ attribute :>> operationalContextReference = "intra-hospital transport, up to four hours off mains";
31
+ }
32
+ requirement needLegibleStatus : Need {
33
+ attribute :>> id = "NDS-NEED-004"; attribute :>> name = "LegibleTherapyStatus";
34
+ attribute :>> needKind = NeedKind::'stakeholder';
35
+ attribute :>> statement = "Clinicians need to read therapy state and alarms correctly from the bedside.";
36
+ attribute :>> priority = "high";
37
+ attribute :>> userPopulationReference = "ward nurses, including those wearing corrective lenses";
38
+ }
39
+
40
+ // Need → Requirement.
41
+ connection derAccuracy : DerivesFrom connect sourceDriver ::> needAccurateTherapy to targetRequirement ::> reqDoseAccuracy;
42
+ connection derOcclusion : DerivesFrom connect sourceDriver ::> needProtectionFromHarm to targetRequirement ::> reqOcclusionDetection;
43
+ connection derAirInLine : DerivesFrom connect sourceDriver ::> needProtectionFromHarm to targetRequirement ::> reqAirInLine;
44
+ connection derAlarm : DerivesFrom connect sourceDriver ::> needLegibleStatus to targetRequirement ::> reqAlarmAnnunciation;
45
+ connection derBattery : DerivesFrom connect sourceDriver ::> needUninterruptedTherapy to targetRequirement ::> reqBatteryEndurance;
46
+ connection derConfirmation : DerivesFrom connect sourceDriver ::> needLegibleStatus to targetRequirement ::> reqPrescriptionConfirmation;
47
+ connection derStatus : DerivesFrom connect sourceDriver ::> needLegibleStatus to targetRequirement ::> reqStatusVisibility;
48
+
49
+ // Software requirements derive from the system requirement they refine
50
+ // (IEC 62304), which is a second, requirement-to-requirement trace axis.
51
+ connection derAlarmFromSystem : DerivesFrom connect sourceDriver ::> reqOcclusionDetection to targetRequirement ::> reqAlarmAnnunciation;
52
+ connection derConfirmationFromSystem : DerivesFrom connect sourceDriver ::> reqDoseAccuracy to targetRequirement ::> reqPrescriptionConfirmation;
53
+ }