@memoarchitect/ontology 0.7.0 → 0.8.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/README.md +4 -2
  2. package/examples/connected-patient-monitor/memo.package.yaml +3 -0
  3. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
  4. package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/views/connected_patient_monitor_overview.sysml +1 -1
  5. package/examples/embedded-infusion-pump/memo.package.yaml +3 -0
  6. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +8 -6
  7. package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/views/embedded_infusion_pump_overview.sysml +1 -1
  8. package/examples/functional-logical-physical/memo.package.yaml +3 -0
  9. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +6 -6
  10. package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/views/functional_logical_physical_overview.sysml +1 -1
  11. package/examples/gpca-pump/memo.package.yaml +3 -0
  12. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +18 -8
  13. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +341 -99
  14. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +25 -11
  15. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +328 -271
  16. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +52 -11
  17. package/examples/gpca-pump/model/catalog/gpca_context.sysml +14 -3
  18. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +8 -5
  19. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +175 -259
  20. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +97 -103
  21. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +5 -10
  22. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +101 -100
  23. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
  24. package/examples/gpca-pump/model/catalog/gpca_system.sysml +17 -17
  25. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +274 -334
  26. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +115 -35
  27. package/examples/gpca-pump/model/catalog/project.sysml +5 -0
  28. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +2 -4
  29. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +2 -4
  30. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +1 -4
  31. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +2 -5
  32. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +1 -3
  33. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +1 -3
  34. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +1 -3
  35. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -7
  36. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
  37. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +1 -3
  38. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +2 -4
  39. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +1 -3
  40. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +2 -4
  41. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +2 -4
  42. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +1 -3
  43. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +5 -8
  44. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +1 -3
  45. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +6 -6
  46. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +5 -6
  47. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
  48. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +1 -3
  49. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +2 -5
  50. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
  51. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +5 -6
  52. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +5 -6
  53. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
  54. package/examples/ivd-laboratory-system/memo.package.yaml +3 -0
  55. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +1 -1
  56. package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/views/ivd_laboratory_system_overview.sysml +1 -1
  57. package/examples/manual-surgical-instrument/memo.package.yaml +3 -0
  58. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +4 -3
  59. package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/views/manual_surgical_instrument_overview.sysml +1 -1
  60. package/examples/multidimensional-layers/memo.package.yaml +3 -0
  61. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
  62. package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/views/multidimensional_layers_overview.sysml +0 -1
  63. package/examples/nested-architecture-dsm/memo.package.yaml +3 -0
  64. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +133 -128
  65. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +139 -157
  66. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +56 -33
  67. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +25 -26
  68. package/examples/reusable-instrument/memo.package.yaml +3 -0
  69. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +16 -23
  70. package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/views/reusable_instrument_overview.sysml +0 -1
  71. package/examples/ros-mobile-robot/README.md +40 -0
  72. package/examples/ros-mobile-robot/memo.package.yaml +3 -0
  73. package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
  74. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
  75. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
  76. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +12 -0
  77. package/examples/software-only-medical-device/memo.package.yaml +3 -0
  78. package/examples/software-only-medical-device/model/catalog/project.sysml +4 -0
  79. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +12 -6
  80. package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/views/software_only_medical_device_overview.sysml +0 -1
  81. package/examples/surgical-closure-workflow/memo.package.yaml +3 -0
  82. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +58 -75
  83. package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/views/surgical_closure_workflow_overview.sysml +0 -1
  84. package/examples/surgical-robot/memo.package.yaml +3 -0
  85. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +1 -1
  86. package/examples/surgical-robot/model/catalog/viewpoints/unassigned/views/surgical_robot_overview.sysml +0 -1
  87. package/examples/sysml-diagram-samples/memo.package.yaml +2 -0
  88. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +12 -18
  89. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +8 -11
  90. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +43 -68
  91. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +57 -68
  92. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +40 -70
  93. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +4 -8
  94. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +1 -20
  95. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +52 -84
  96. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +22 -33
  97. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +13 -10
  98. package/examples/temperature-alarm/memo.package.yaml +3 -0
  99. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +28 -25
  100. package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/views/temperature_alarm_overview.sysml +0 -1
  101. package/examples/ui-screen-regions/memo.package.yaml +3 -0
  102. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +57 -33
  103. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +102 -79
  104. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +5 -5
  105. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +21 -6
  106. package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
  107. package/examples/ui-screen-regions/model/catalog/traces.sysml +28 -125
  108. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +2 -3
  109. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
  110. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
  111. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +1 -2
  112. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +1 -2
  113. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +1 -2
  114. package/extensions/LICENSES/MIT.txt +19 -0
  115. package/extensions/README.md +94 -0
  116. package/extensions/aadl/memo.package.yaml +18 -0
  117. package/extensions/aadl/src/aadl_extension.sysml +6 -0
  118. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
  119. package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
  120. package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
  121. package/extensions/cloud/memo.package.yaml +18 -0
  122. package/extensions/cloud/src/cloud_extension.sysml +44 -0
  123. package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
  124. package/extensions/container/memo.package.yaml +18 -0
  125. package/extensions/container/src/container_extension.sysml +37 -0
  126. package/extensions/container/src/methodology/container_methodology.sysml +17 -0
  127. package/extensions/messaging/memo.package.yaml +18 -0
  128. package/extensions/messaging/src/messaging_extension.sysml +64 -0
  129. package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
  130. package/extensions/ros/memo.package.yaml +18 -0
  131. package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
  132. package/extensions/ros/src/ros_extension.sysml +200 -0
  133. package/extensions/template/src/extension.sysml +37 -0
  134. package/memo.manifest.yaml +13 -2
  135. package/methodologies/default/memo.package.yaml +1 -1
  136. package/methodologies/gpca/memo.package.yaml +1 -1
  137. package/ontology/memo.package.yaml +1 -1
  138. package/package.json +5 -3
  139. package/profile/memo.package.yaml +1 -1
  140. package/src/architecture/decisions/memo_decisions.sysml +23 -2
  141. package/src/architecture/functional/behavior/memo_behavior.sysml +51 -23
  142. package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
  143. package/src/architecture/functional/functions/memo_functions.sysml +93 -36
  144. package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +2 -2
  145. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -22
  146. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +40 -13
  147. package/src/architecture/implementation/ui/memo_ui.sysml +83 -43
  148. package/src/architecture/logical/interfaces/memo_interfaces.sysml +64 -12
  149. package/src/architecture/logical/structure/memo_logical_structure.sysml +26 -25
  150. package/src/architecture/operational/activities/memo_activities.sysml +27 -29
  151. package/src/architecture/operational/context/actors/memo_actors.sysml +8 -10
  152. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +16 -33
  153. package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -17
  154. package/src/architecture/operational/scenarios/memo_scenarios.sysml +36 -84
  155. package/src/architecture/operational/structure/memo_operational.sysml +42 -13
  156. package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -27
  157. package/src/architecture/operational/workflows/memo_workflows.sysml +45 -28
  158. package/src/architecture/realization/deployment/memo_deployment.sysml +115 -20
  159. package/src/architecture/realization/physical/memo_physical_architecture.sysml +29 -4
  160. package/src/artifacts/configuration_management/memo_configuration_management.sysml +16 -0
  161. package/src/artifacts/core/memo_controlled_artifacts.sysml +3 -1
  162. package/src/artifacts/standards/cfr_21_820.sysml +116 -0
  163. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
  164. package/src/artifacts/standards/iec_60601_1.sysml +149 -0
  165. package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
  166. package/src/artifacts/standards/iec_60812.sysml +51 -0
  167. package/src/artifacts/standards/iec_62304.sysml +210 -0
  168. package/src/artifacts/standards/iec_62366_1.sysml +113 -0
  169. package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
  170. package/src/artifacts/standards/iso_13485.sysml +113 -0
  171. package/src/artifacts/standards/iso_14971.sysml +94 -0
  172. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
  173. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
  174. package/src/artifacts/templates/dhf/21cfr820/design-input.md +1 -1
  175. package/src/artifacts/templates/dhf/21cfr820/design-output.md +5 -5
  176. package/src/artifacts/templates/dhf/21cfr820/design-review.md +1 -1
  177. package/src/artifacts/templates/dhf/21cfr820/design-validation.md +2 -2
  178. package/src/artifacts/templates/dhf/21cfr820/design-verification.md +2 -2
  179. package/src/artifacts/templates/dhf/21cfr820/dhf-index.md +2 -2
  180. package/src/artifacts/templates/dhf/21cfr820/transfer-plan.md +1 -1
  181. package/src/artifacts/templates/dhf/21cfr820/user-needs.md +1 -1
  182. package/src/artifacts/templates/dhf/21cfr820/vv-plan.md +3 -3
  183. package/src/artifacts/templates/dhf/21cfr820/vv-report.md +4 -4
  184. package/src/artifacts/templates/dhf/fda-cybersecurity/incident-response.md +1 -1
  185. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +3 -2
  186. package/src/artifacts/templates/dhf/fda-cybersecurity/security-arch.md +2 -2
  187. package/src/artifacts/templates/dhf/fda-cybersecurity/threat-model.md +4 -4
  188. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +4 -3
  189. package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
  190. package/src/artifacts/templates/dhf/iec-62304/detailed-design.md +1 -1
  191. package/src/artifacts/templates/dhf/iec-62304/integration-test.md +3 -3
  192. package/src/artifacts/templates/dhf/iec-62304/sad.md +6 -5
  193. package/src/artifacts/templates/dhf/iec-62304/sbom.md +3 -2
  194. package/src/artifacts/templates/dhf/iec-62304/sdp.md +5 -4
  195. package/src/artifacts/templates/dhf/iec-62304/soup.md +4 -2
  196. package/src/artifacts/templates/dhf/iec-62304/srs.md +54 -20
  197. package/src/artifacts/templates/dhf/iec-62304/sw-traceability.md +3 -3
  198. package/src/artifacts/templates/dhf/iec-62304/system-test.md +1 -1
  199. package/src/artifacts/templates/dhf/iec-62366/summative-eval.md +1 -1
  200. package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +40 -4
  201. package/src/artifacts/templates/dhf/iec-62366/ue-plan.md +1 -1
  202. package/src/artifacts/templates/dhf/iec-62366/urra.md +3 -3
  203. package/src/artifacts/templates/dhf/iso-14971/fmea.md +42 -19
  204. package/src/artifacts/templates/dhf/iso-14971/har.md +3 -3
  205. package/src/artifacts/templates/dhf/iso-14971/rmp.md +2 -2
  206. package/src/artifacts/templates/dhf/system/sad.md +173 -0
  207. package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
  208. package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
  209. package/src/artifacts/templates/dhf/system/syrs.md +128 -0
  210. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +40 -21
  211. package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
  212. package/src/assurance/requirements/memo_requirements.sysml +7 -20
  213. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  214. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
  215. package/src/assurance/safety_risk/memo_risk.sysml +90 -7
  216. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +16 -0
  217. package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
  218. package/src/core/annotations/memo_annotations.sysml +25 -6
  219. package/src/core/common/memo_common.sysml +130 -21
  220. package/src/core/consistency_rules/consistency_rules.sysml +1 -1
  221. package/src/core/dimensions/dimensions.sysml +12 -0
  222. package/src/core/enumerations/memo_enumerations.sysml +60 -14
  223. package/src/core/relationships/memo_relationships.sysml +199 -196
  224. package/src/memo_namespaces.sysml +30 -0
  225. package/src/methodology/core/memo_core.sysml +24 -0
  226. package/src/methodology/profiles/memo_profiles.sysml +1 -1
  227. package/src/methodology/workflow/memo_workflow.sysml +5 -5
  228. package/src/rules/closure/closure_rules.sysml +20 -20
  229. package/src/rules/crosslayer/cross_layer_rules.sysml +2 -2
  230. package/src/rules/ontology/ontology_invariants.sysml +223 -11
  231. package/src/rules/quantitative/quantitative_rules.sysml +2 -2
  232. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +30 -30
  233. package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
  234. package/src/viewpoints/context/context_viewpoint.sysml +2 -3
  235. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +1 -2
  236. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -4
  237. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +46 -3
  238. package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
  239. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -3
  240. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -3
  241. package/src/viewpoints/logical/logical_viewpoint.sysml +1 -2
  242. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +1 -2
  243. package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
  244. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +2 -3
  245. package/src/viewpoints/physical/physical_viewpoint.sysml +1 -2
  246. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +1 -2
  247. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +1 -2
  248. package/src/viewpoints/requirements/requirements_viewpoint.sysml +1 -2
  249. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +1 -2
  250. package/src/viewpoints/risk/risk_viewpoint.sysml +1 -2
  251. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +1 -2
  252. package/src/viewpoints/software/software_viewpoint.sysml +1 -2
  253. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +1 -2
  254. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
  255. package/src/viewpoints/usability/usability_viewpoint.sysml +1 -2
  256. package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
  257. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -3
  258. package/templates/connected-device/memo.package.yaml +2 -0
  259. package/templates/default/memo.package.yaml +2 -0
  260. package/templates/infusion-pump/memo.package.yaml +2 -0
  261. package/templates/monitoring-device/memo.package.yaml +2 -0
  262. package/templates/samd/memo.package.yaml +2 -0
  263. package/examples/extensions/README.md +0 -16
  264. package/examples/extensions/template/src/extension.sysml +0 -15
  265. package/examples/gpca-pump/gpca-pump.kpar +0 -0
  266. /package/{examples/extensions → extensions}/clinical/memo.package.yaml +0 -0
  267. /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
  268. /package/{examples/extensions → extensions}/clinical/src/methodology/clinical_methodology.sysml +0 -0
  269. /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
  270. /package/{examples/extensions → extensions}/template/memo.package.yaml +0 -0
@@ -0,0 +1,200 @@
1
+ // ROS 2 (Robot Operating System 2).
2
+ //
3
+ // The acceptance test for MEMO's extension point (plan §10.3): a whole
4
+ // technology stack — nodes, messages, topics, quality of service, services,
5
+ // actions, and
6
+ // containerized deployment — landing without a single change to a base
7
+ // relation. `BuildsInto`, `DeploysTo`, and `ProvidesEnvironment` are reused
8
+ // exactly as the base declares them.
9
+ //
10
+ // Composition is by MODULE LIST, not by chaining. `baseMethodology` is [0..1],
11
+ // but `includedModule` is [0..*], so this extension's methodology names
12
+ // `memo_extension_messaging` and `memo_extension_container` alongside its own
13
+ // module. ROS communication specializes native MEMO item, port, and interface
14
+ // families; it does not invent publish/subscribe relations.
15
+ package memo_extension_ros {
16
+ private import ScalarValues::*;
17
+
18
+ private import memo_core_common::*;
19
+ private import memo_architecture_functional_behavior::*;
20
+ private import memo_architecture_logical_interfaces::*;
21
+ private import memo_architecture_implementation_software_structure::*;
22
+ private import memo_architecture_implementation_software_runtime::*;
23
+ private import memo_extension_messaging::*;
24
+ private import memo_extension_container::*;
25
+
26
+ // ── Quality of service ──────────────────────────────────────────────
27
+ //
28
+ // QoS is the first real customer for "where do per-technology properties
29
+ // live" (plan C3, open question §14.6). The answer is a typed
30
+ // `attribute def` on the extension's own types — NOT the base's
31
+ // `PropertySet` stub, which was one String field and could not say what a
32
+ // reliability setting is. A typed profile can be validated, compared
33
+ // between a publisher and a subscriber, and read by a tool; a property bag
34
+ // cannot. `PropertySet` is deleted in this session for that reason.
35
+
36
+ // ROS 2 RELIABLE resends until delivery; BEST_EFFORT does not. This is
37
+ // the delivery guarantee, so it maps onto MessagingDeliveryKind:
38
+ // bestEffort is atMostOnce, reliable is atLeastOnce.
39
+ enum def RosReliabilityKind {
40
+ enum bestEffort;
41
+ enum reliable;
42
+ }
43
+ // TRANSIENT_LOCAL replays the last samples to a late-joining subscriber;
44
+ // VOLATILE does not. The difference decides whether a node that restarts
45
+ // sees the current state or waits for the next publication — which is a
46
+ // safety-relevant fact when the topic carries a latched mode or setpoint.
47
+ enum def RosDurabilityKind {
48
+ enum volatile;
49
+ enum transientLocal;
50
+ }
51
+
52
+ attribute def RosQosProfile {
53
+ attribute reliability : RosReliabilityKind;
54
+ attribute durability : RosDurabilityKind;
55
+ // The QoS contract: a sample is expected at least this often.
56
+ attribute deadlineMs : Real;
57
+ // How long a publisher may be silent before subscribers treat it as
58
+ // lost — ROS 2 liveliness lease duration.
59
+ attribute livelinessLeaseMs : Real;
60
+ // Depth of the history buffer, KEEP_LAST(n) / KEEP_ALL.
61
+ attribute historyDepth : Integer;
62
+ }
63
+
64
+ // ── Nodes, messages, topics, and endpoint roles ────────────────────
65
+
66
+ // A ROS node. `runtimeKind` is deliberately NOT bound: a node may run as
67
+ // its own process or be composed with others into a single container
68
+ // process, and which one it is is a design decision the model should
69
+ // record rather than a fact the type can assert.
70
+ part def RosNode specializes SoftwareComponent {
71
+ attribute nodeNamespace : String;
72
+ // Whether the node implements the managed-node lifecycle
73
+ // (unconfigured / inactive / active / finalized). A lifecycle-managed
74
+ // node can be brought up in a defined order and held inactive until
75
+ // its preconditions hold, which is how a robot reaches a safe state.
76
+ attribute lifecycleManaged : Boolean;
77
+ attribute executorModel : String;
78
+ }
79
+
80
+ // A definition is the ROS message contract (`LaserScan`, `Twist`, ...).
81
+ // A named item usage of that definition is a deployed topic (`/scan`).
82
+ // Individual deliveries are native flows/messages between ports that
83
+ // reference the same topic usage.
84
+ abstract item def RosMessage specializes MessagingMessage {
85
+ attribute rosTypeName : String;
86
+ }
87
+
88
+ port def RosPublisher specializes MessagingPublisher {
89
+ attribute offeredQos : RosQosProfile;
90
+ }
91
+
92
+ port def RosSubscriber specializes MessagingSubscriber {
93
+ attribute requestedQos : RosQosProfile;
94
+ }
95
+
96
+ interface def RosTopicInterface specializes MessagingTopicInterface {
97
+ end rosPublisher : RosPublisher :>> publisher;
98
+ end rosSubscriber : RosSubscriber :>> subscriber;
99
+ }
100
+
101
+ // ── Services: one correlated request/reply contract ────────────────
102
+ abstract item def RosServiceRequest specializes RosMessage;
103
+ abstract item def RosServiceResponse specializes RosMessage;
104
+
105
+ port def RosServiceClient specializes SoftwarePort {
106
+ out item request : RosServiceRequest;
107
+ in item response : RosServiceResponse;
108
+ attribute serviceName : String;
109
+ attribute timeoutMs : Real;
110
+ }
111
+
112
+ port def RosServiceServer specializes SoftwarePort {
113
+ in item request : RosServiceRequest;
114
+ out item response : RosServiceResponse;
115
+ attribute serviceName : String;
116
+ }
117
+
118
+ interface def RosServiceInterface specializes SoftwareInterface {
119
+ end client : RosServiceClient :>> source;
120
+ end server : RosServiceServer :>> target;
121
+ flow of RosServiceRequest from client.request to server.request;
122
+ flow of RosServiceResponse from server.response to client.response;
123
+ }
124
+
125
+ // ── Actions: long-running goal protocol ─────────────────────────────
126
+ // ROS 2 realizes an action through goal/result/cancel services plus
127
+ // feedback/status topics. The port exposes those distinct native message
128
+ // features, so an action cannot be mistaken for a two-message service.
129
+ abstract item def RosActionGoal specializes RosMessage;
130
+ abstract item def RosActionAcceptance specializes RosMessage;
131
+ abstract item def RosActionFeedback specializes RosMessage;
132
+ abstract item def RosActionResult specializes RosMessage;
133
+ abstract item def RosActionCancel specializes RosMessage;
134
+ abstract item def RosActionStatus specializes RosMessage;
135
+
136
+ port def RosActionClient specializes SoftwarePort {
137
+ out item goal : RosActionGoal;
138
+ in item acceptance : RosActionAcceptance;
139
+ in item feedback : RosActionFeedback;
140
+ in item result : RosActionResult;
141
+ out item cancel : RosActionCancel;
142
+ in item actionStatus : RosActionStatus;
143
+ attribute actionName : String;
144
+ }
145
+
146
+ port def RosActionServer specializes SoftwarePort {
147
+ in item goal : RosActionGoal;
148
+ out item acceptance : RosActionAcceptance;
149
+ out item feedback : RosActionFeedback;
150
+ out item result : RosActionResult;
151
+ in item cancel : RosActionCancel;
152
+ out item actionStatus : RosActionStatus;
153
+ attribute actionName : String;
154
+ }
155
+
156
+ interface def RosActionInterface specializes SoftwareInterface {
157
+ end client : RosActionClient :>> source;
158
+ end server : RosActionServer :>> target;
159
+ flow of RosActionGoal from client.goal to server.goal;
160
+ flow of RosActionAcceptance from server.acceptance to client.acceptance;
161
+ flow of RosActionFeedback from server.feedback to client.feedback;
162
+ flow of RosActionCancel from client.cancel to server.cancel;
163
+ flow of RosActionResult from server.result to client.result;
164
+ flow of RosActionStatus from server.actionStatus to client.actionStatus;
165
+ }
166
+
167
+ abstract state def RosActionExecution specializes MemoState;
168
+ state def RosActionAccepted specializes RosActionExecution;
169
+ state def RosActionExecuting specializes RosActionExecution;
170
+ state def RosActionCanceling specializes RosActionExecution;
171
+ state def RosActionSucceeded specializes RosActionExecution;
172
+ state def RosActionCanceled specializes RosActionExecution;
173
+ state def RosActionAborted specializes RosActionExecution;
174
+
175
+ // ── Deployment ──────────────────────────────────────────────────────
176
+ //
177
+ // Nothing below declares a relation. The base's three deployment
178
+ // relations already say everything a ROS deployment needs:
179
+ // BuildsInto SoftwareModule -> RosContainerImage
180
+ // DeploysTo RosContainerImage -> ProcessingNode
181
+ // ProvidesEnvironment ProcessingNode -> RosContainerRuntime
182
+ // That is the proof the base is factored correctly.
183
+ part def RosContainerImage specializes ContainerImage {
184
+ // humble, iron, jazzy, rolling.
185
+ attribute rosDistribution : String;
186
+ // The workspace overlay the image was built from.
187
+ attribute workspaceOverlay : String;
188
+ }
189
+
190
+ part def RosContainerRuntime specializes ContainerRuntime {
191
+ attribute rosDistribution : String;
192
+ // The RMW implementation below ROS 2 — rmw_fastrtps_cpp,
193
+ // rmw_cyclonedds_cpp. QoS is enforced here, so it is part of any
194
+ // argument that a QoS profile is actually honoured.
195
+ attribute rmwImplementation : String;
196
+ // ROS_DOMAIN_ID. Two robots sharing a domain see each other's topics,
197
+ // which is a hazard on a shared network and not visible in any node.
198
+ attribute rosDomainId : Integer;
199
+ }
200
+ }
@@ -0,0 +1,37 @@
1
+ // Skeleton for a new MEMO extension. Copy the directory, rename the packages,
2
+ // and replace the prefix.
3
+ //
4
+ // Two conventions this file follows and every extension must (extensions/README.md):
5
+ //
6
+ // 1. Every definition an extension declares is prefixed with the PascalCase
7
+ // form of the extension's directory name — `template/` gives `Template`.
8
+ // Extension names share one flat namespace with the base and with each
9
+ // other, so the prefix is what keeps two independent extensions from both
10
+ // declaring `Node`.
11
+ // 2. A relation an extension declares specializes a base relation. It never
12
+ // roots independently.
13
+ //
14
+ // This package used to bind `baseMethodName = "MedicalDeviceLightDefault"` — a
15
+ // pre-flip spelling that resolves to nothing. It went unnoticed for as long as
16
+ // extensions lived under `examples/`, where the build did not check them; the
17
+ // build checks `extensions/` now, and reported it on the first run.
18
+ package memo_extension_template {
19
+ private import ScalarValues::*;
20
+ private import memo_core_enumerations::*;
21
+ private import memo_methodology_core::*;
22
+ private import memo_methodology_profiles::*;
23
+
24
+ part extensionMethod : MethodologyDefinition {
25
+ attribute :>> id = "EXT-METH-001";
26
+ attribute :>> name = "ExtensionMethod";
27
+ attribute :>> version = "0.1.0";
28
+ attribute :>> domain = "project extension";
29
+ attribute :>> description = "Adds a project or domain package to the selected MEMO methodology.";
30
+ // The base is a typed SysML reference, not a name held in sync by hand.
31
+ ref :>> baseMethodology = mdDefaultDefinition;
32
+ // An extension adds its own module to whatever its base selected;
33
+ // saying so explicitly is required now that an empty list means empty.
34
+ attribute :>> scopeMode = ScopeModeKind::explicit;
35
+ attribute :>> includedModule = "replace_with_extension_package";
36
+ }
37
+ }
@@ -19,5 +19,16 @@ examples:
19
19
  standard-sysml-diagrams: ./examples/sysml-diagram-samples
20
20
  ui-screen-regions: ./examples/ui-screen-regions
21
21
  nested-architecture-dsm: ./examples/nested-architecture-dsm
22
- extension-template: ./examples/extensions/template
23
- clinical-extension: ./examples/extensions/clinical
22
+ ros-mobile-robot: ./examples/ros-mobile-robot
23
+ # Extensions are a way to MODEL, not a thing to copy. They are reusable
24
+ # ontology packages that specialize the base, selected by a methodology or a
25
+ # project binding — so they sit beside the ontology, not under examples/.
26
+ # `examples/ros-mobile-robot` demonstrates using one; it is not the extension.
27
+ extensions:
28
+ template: ./extensions/template
29
+ clinical: ./extensions/clinical
30
+ aadl: ./extensions/aadl
31
+ cloud: ./extensions/cloud
32
+ container: ./extensions/container
33
+ messaging: ./extensions/messaging
34
+ ros: ./extensions/ros
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/methodology-default'
10
- version: 0.7.0
10
+ version: 0.8.24
11
11
  description: "MEMO default medical-device methodology \u2014 selects viewpoints/views/DHF documents from @memoarchitect/ontology and adds rules, gates, patterns, profiles, and workflow."
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/methodology-gpca'
10
- version: 0.7.0
10
+ version: 0.8.24
11
11
  description: "GPCA infusion pump methodology \u2014 subtraction-based tailoring of @memoarchitect/methodology-default for the non-networked prototype variant. Excludes cybersecurity and SOUP."
12
12
  license: MIT
13
13
  tags:
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/ontology'
10
- version: 0.7.0
10
+ version: 0.8.24
11
11
  description: "MEMO \u2014 the single canonical medical-device ontology: core semantics, the Arcadia-inspired architecture layers (context, requirements, behavior, structure, interfaces, risk, cybersecurity,\
12
12
  \ assurance, \u2026), compliance, viewpoints, views, and invariant rules. One namespace (memo::), one src/ tree."
13
13
  license: MIT
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@memoarchitect/ontology",
3
- "version": "0.7.0",
3
+ "version": "0.8.24",
4
4
  "packageManager": "pnpm@9.15.0",
5
5
  "description": "MEMO \u2014 Medical Engineering Modelling Ontology. Pure SysML v2 medical-device ontology with native constraints, portable to any conformant SysML v2 tool (SysIDE, SysON, sysand).",
6
6
  "scripts": {
7
7
  "build": "bash scripts/build-kpar.sh",
8
- "check": "bash scripts/build-kpar.sh",
8
+ "check": "bash scripts/build-kpar.sh && npm run lint",
9
+ "lint": "node ../memo-tools/packages/tools/lib/bin/memo.js dhf lint",
9
10
  "test": "node --test test/package.test.mjs",
10
11
  "docs:api": "node scripts/generate-sysml-api.mjs",
11
12
  "docs:diagrams": "node scripts/generate-reference-diagrams.mjs",
@@ -69,6 +70,7 @@
69
70
  "src/viewpoints/",
70
71
  "src/memo_namespaces.sysml",
71
72
  "templates/",
72
- "examples/"
73
+ "examples/",
74
+ "extensions/"
73
75
  ]
74
76
  }
@@ -7,7 +7,7 @@
7
7
  # (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
8
8
  # removed at the native semantic flip and are now rejected if present.
9
9
  name: '@memoarchitect/medical-modeling-profile'
10
- version: 0.7.0
10
+ version: 0.8.24
11
11
  description: Closure rules and viewpoints for medical device modeling
12
12
  license: MIT
13
13
  tags:
@@ -1,4 +1,5 @@
1
1
  package memo_architecture_decisions {
2
+ private import Metaobjects::SemanticMetadata;
2
3
  private import ScalarValues::*;
3
4
 
4
5
  private import memo_core_common::*;
@@ -13,7 +14,27 @@ package memo_architecture_decisions {
13
14
  }
14
15
 
15
16
  connection def DecisionRecordedInADR :> MemoRelationship {
16
- end decision : DesignDecision;
17
- end adr : ADRArtifact;
17
+ end decision : DesignDecision :>> source;
18
+ end adr : ADRArtifact :>> target;
19
+ }
20
+ abstract connection decisionRecordedInADRLinks : DecisionRecordedInADR[*];
21
+ metadata def <decisionRecordedInADR> DecisionRecordedInADRMetadata :> SemanticMetadata {
22
+ :> annotatedElement : SysML::ConnectionDefinition;
23
+ :> annotatedElement : SysML::ConnectionUsage;
24
+ :>> baseType = decisionRecordedInADRLinks meta SysML::Usage;
25
+ }
26
+
27
+ // ── Relations owned by this package ─────────────────────────────
28
+ // Moved out of memo_core_relationships: their ends are typed against
29
+ // types declared here, and core must not depend on a domain package.
30
+ connection def Decides :> MemoRelationship {
31
+ end decision : DesignDecision :>> source;
32
+ end affectedElement : MemoPart :>> target;
33
+ }
34
+ abstract connection decidesLinks : Decides[*];
35
+ metadata def <decides> DecidesMetadata :> SemanticMetadata {
36
+ :> annotatedElement : SysML::ConnectionDefinition;
37
+ :> annotatedElement : SysML::ConnectionUsage;
38
+ :>> baseType = decidesLinks meta SysML::Usage;
18
39
  }
19
40
  }
@@ -3,29 +3,50 @@ package memo_architecture_functional_behavior {
3
3
 
4
4
  private import memo_core_common::*;
5
5
  private import memo_core_enumerations::*;
6
+
7
+ // Typed functional execution step. Project-specific action definitions
8
+ // specialize this rather than bypassing MemoAction; ActivityFlow remains
9
+ // the composite route that sequences such steps.
10
+ abstract action def FunctionalAction specializes MemoAction;
6
11
  // State machines and their mode states are SysML v2 states (behaviours), so
7
12
  // they derive from the MemoState foundation, not the part-based
8
- // ArchitectureElement. Transitions stay part-based (below) to keep their
13
+ // MemoPart family. Transitions stay part-based (below) to keep their
9
14
  // traceable safety attributes.
10
- // State-machine vocabulary. ModeState denotes a state owned by this model.
15
+ // State machines retain their own execution semantics; individual modes
16
+ // are MemoState usages selected by stateKind.
11
17
  state def StateMachine :> MemoState {
12
18
  attribute machineKind : String;
13
19
  attribute executionSemantics : String;
14
20
  }
15
- state def ModeState :> MemoState {
16
- attribute modeKind : String;
17
- attribute entryCondition : String;
18
- attribute exitCondition : String;
21
+ // A configuration is the concrete selection made at a `variation` choice
22
+ // point. It remains separate from a mode state: it says which mode and
23
+ // elements are active in one selectable arrangement.
24
+ // The reference is typed to the shared native state family so a consumer
25
+ // can navigate from the selected configuration to its governing mode.
26
+ part def ModeConfiguration specializes MemoPart {
27
+ ref activeMode : MemoState[1];
28
+ ref activeElement : MemoPart[0..*];
19
29
  }
20
- part def Transition specializes ArchitectureElement {
30
+ // Transitions are native SysML v2 `transition` usages inside the owning
31
+ // state — there is no `part def Transition`, and its `transition` keyword
32
+ // collision is why. A transition usage's definition is always implicit, so
33
+ // it has no MEMO supertype to carry the identification core; this record
34
+ // carries it instead, applied with `@TransitionRecord`.
35
+ //
36
+ // `trigger`, `guardSummary`, and `effectSummary` are prose summaries, not
37
+ // executable semantics: a guard reading "none in source (MEMO extension
38
+ // REQ-X-02 additionally gates therapy on POST)" is a citation. Formal
39
+ // triggers and guards belong in native `accept` and `if`; these stay
40
+ // records so the two are not confused.
41
+ metadata def TransitionRecord {
42
+ attribute id : String;
43
+ attribute name : String;
21
44
  attribute trigger : String;
22
45
  attribute guardSummary : String;
23
46
  attribute effectSummary : String;
24
- attribute priority : Integer;
25
- attribute sameStepCritical : Boolean;
26
- attribute sourceState : String;
27
- attribute targetState : String;
47
+ attribute sourceReference : String;
28
48
  }
49
+
29
50
  // A verifiable behavioural constraint, such as an invariant, transition
30
51
  // rule, temporal claim, assumption, or guarantee.
31
52
  part def BehaviorProperty specializes VerifiableElement {
@@ -34,8 +55,22 @@ package memo_architecture_functional_behavior {
34
55
  attribute formalExpression : String;
35
56
  }
36
57
  part def Contract specializes VerifiableElement { attribute contractScope : String; }
37
- part def PropertySet specializes VerifiableElement { attribute propertySetScope : String; }
38
- part def ActivityAction specializes ArchitectureElement {
58
+ // `part def PropertySet specializes VerifiableElement { attribute
59
+ // propertySetScope : String; }` stood here and is DELETED (plan C3,
60
+ // open question §14.6). It was AADL's property-set idea imported as a
61
+ // name: one String field, no typed content, no binding to whatever it
62
+ // annotated, and zero usages anywhere in the tree.
63
+ //
64
+ // Per-technology properties belong on the extension type that owns them,
65
+ // typed. ROS QoS was the first real customer and settled it:
66
+ // `attribute def RosQosProfile` has reliability, durability, deadline,
67
+ // liveliness and history depth as typed fields, so a publisher's offer and
68
+ // a subscriber's request can be compared. A `propertySetScope` String
69
+ // could not have expressed one of them. Where an extension needs to
70
+ // annotate a BASE element rather than declare its own type, the SysML-
71
+ // native answer is `metadata def` + `Metaobjects::SemanticMetadata`, which
72
+ // is what every MEMO relation already carries since A4.
73
+ part def ActivityAction specializes MemoPart {
39
74
  attribute actionKind : ActionKind;
40
75
  attribute inputSummary : String;
41
76
  attribute outputSummary : String;
@@ -47,20 +82,13 @@ package memo_architecture_functional_behavior {
47
82
  attribute guardCondition : String;
48
83
  attribute weight : String;
49
84
  }
50
- // UIScenario now lives in memo_architecture_implementation_ui (:> MemoScenario).
51
- part def InteractionMessage specializes MemoPart {
52
- attribute messageKind : MessageKind;
53
- attribute sequenceOrder : Integer;
54
- attribute senderComponent : String;
55
- attribute receiverComponent : String;
56
- attribute exchangeItem : String;
57
- attribute timingConstraintMs : String;
58
- }
85
+ // UI scenarios are OperativeScenario usages with scenarioKind `ui`.
86
+
59
87
  part def TimingConstraint specializes VerifiableElement {
60
88
  attribute constraintKind : TimingConstraintKind;
61
89
  attribute minMs : String;
62
90
  attribute maxMs : String;
63
- attribute referenceElement : String;
91
+ ref referenceElement : MemoPart[1];
64
92
  attribute verificationMethod : VerificationMethodKind;
65
93
  }
66
94
  }
@@ -1,13 +1,14 @@
1
1
  package memo_architecture_functional_constraints {
2
2
  private import ScalarValues::*;
3
+ private import memo_core_common::*;
3
4
 
4
5
  doc /* Reusable quantitative constraint definitions. */
5
6
 
6
- constraint def MaxResponseTimeConstraint {
7
+ constraint def MaxResponseTimeConstraint :> MemoConstraint {
7
8
  attribute responseTimeMs : Real;
8
9
  attribute maxAllowedMs : Real;
9
10
  }
10
- constraint def LockoutIntervalConstraint {
11
+ constraint def LockoutIntervalConstraint :> MemoConstraint {
11
12
  attribute elapsedMs : Real;
12
13
  attribute lockoutMs : Real;
13
14
  }