@memoarchitect/ontology 0.13.2 → 0.15.1

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 (315) hide show
  1. package/README.md +5 -3
  2. package/examples/connected-patient-monitor/memo.identity.yaml +34 -0
  3. package/examples/connected-patient-monitor/memo.package.yaml +3 -1
  4. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +17 -12
  5. package/examples/connected-patient-monitor/model/{catalog → methodology}/project.sysml +4 -5
  6. package/examples/embedded-infusion-pump/memo.package.yaml +3 -1
  7. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +6 -6
  8. package/examples/embedded-infusion-pump/model/{catalog → methodology}/project.sysml +4 -5
  9. package/examples/functional-logical-physical/memo.identity.yaml +28 -0
  10. package/examples/functional-logical-physical/memo.package.yaml +3 -1
  11. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
  12. package/examples/functional-logical-physical/model/{catalog → methodology}/project.sysml +4 -5
  13. package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +40 -139
  14. package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +38 -290
  15. package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +47 -217
  16. package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +50 -191
  17. package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +42 -181
  18. package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +40 -164
  19. package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +51 -172
  20. package/examples/gpca-pump/analysis/Samples/README.md +15 -9
  21. package/examples/gpca-pump/analysis/memo_model.py +243 -0
  22. package/examples/gpca-pump/memo.identity.yaml +521 -26
  23. package/examples/gpca-pump/memo.package.yaml +3 -1
  24. package/examples/gpca-pump/methodology/gpca_profiles.sysml +56 -47
  25. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +51 -78
  26. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +359 -357
  27. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +9 -9
  28. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +56 -69
  29. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +44 -59
  30. package/examples/gpca-pump/model/catalog/gpca_context.sysml +23 -35
  31. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +33 -40
  32. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +62 -63
  33. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +362 -483
  34. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +45 -70
  35. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +6 -12
  36. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +173 -169
  37. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +139 -225
  38. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +43 -47
  39. package/examples/gpca-pump/model/catalog/gpca_system.sysml +68 -65
  40. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +147 -116
  41. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +65 -90
  42. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +4 -6
  43. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +4 -6
  44. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +4 -6
  45. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +4 -6
  46. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +2 -4
  47. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +7 -6
  48. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +4 -6
  49. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -6
  50. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
  51. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +4 -6
  52. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +4 -6
  53. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +3 -5
  54. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +3 -5
  55. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +4 -6
  56. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +2 -4
  57. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +3 -5
  58. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +2 -4
  59. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +4 -6
  60. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -6
  61. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
  62. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +4 -6
  63. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +4 -6
  64. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
  65. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -6
  66. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +3 -5
  67. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
  68. package/examples/gpca-pump/model/{catalog → methodology}/project.sysml +8 -6
  69. package/examples/ivd-laboratory-system/memo.package.yaml +3 -1
  70. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +12 -9
  71. package/examples/ivd-laboratory-system/model/{catalog → methodology}/project.sysml +4 -5
  72. package/examples/manual-surgical-instrument/memo.package.yaml +3 -1
  73. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +2 -6
  74. package/examples/manual-surgical-instrument/model/{catalog → methodology}/project.sysml +4 -5
  75. package/examples/multidimensional-layers/memo.package.yaml +3 -1
  76. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +2 -4
  77. package/examples/multidimensional-layers/model/{catalog → methodology}/project.sysml +4 -5
  78. package/examples/nested-architecture-dsm/memo.identity.yaml +93 -0
  79. package/examples/nested-architecture-dsm/memo.package.yaml +3 -1
  80. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +30 -30
  81. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +28 -28
  82. package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +2 -4
  83. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +4 -4
  84. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +7 -7
  85. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +8 -8
  86. package/examples/nested-architecture-dsm/model/{catalog → methodology}/project.sysml +4 -5
  87. package/examples/reusable-instrument/memo.package.yaml +3 -1
  88. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -7
  89. package/examples/reusable-instrument/model/{catalog → methodology}/project.sysml +4 -5
  90. package/examples/robot-cell-family/README.md +34 -0
  91. package/examples/robot-cell-family/memo.identity.yaml +142 -0
  92. package/examples/robot-cell-family/memo.package.yaml +7 -0
  93. package/examples/robot-cell-family/model/methodology/project.sysml +30 -0
  94. package/examples/robot-cell-family/model/shared/shared.sysml +53 -0
  95. package/examples/robot-cell-family/model/sos/chains.sysml +36 -0
  96. package/examples/robot-cell-family/model/sos/icds.sysml +29 -0
  97. package/examples/robot-cell-family/model/sos/sos.sysml +31 -0
  98. package/examples/robot-cell-family/model/sos/use_cases.sysml +25 -0
  99. package/examples/robot-cell-family/model/systems/manipulation/manipulation_system.sysml +35 -0
  100. package/examples/robot-cell-family/model/systems/navigation/navigation_system.sysml +46 -0
  101. package/examples/robot-cell-family/model/systems/perception/perception_system.sysml +37 -0
  102. package/examples/robot-platform/memo.package.yaml +3 -0
  103. package/examples/robot-platform/model/platform.sysml +15 -0
  104. package/examples/ros-mobile-robot/README.md +5 -4
  105. package/examples/ros-mobile-robot/memo.identity.yaml +94 -0
  106. package/examples/ros-mobile-robot/memo.package.yaml +3 -1
  107. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +26 -29
  108. package/examples/ros-mobile-robot/model/{catalog → methodology}/project.sysml +8 -14
  109. package/examples/software-only-medical-device/memo.package.yaml +3 -1
  110. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +9 -10
  111. package/examples/software-only-medical-device/model/{catalog → methodology}/project.sysml +8 -9
  112. package/examples/surgical-closure-workflow/memo.package.yaml +3 -1
  113. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +23 -26
  114. package/examples/surgical-closure-workflow/model/{catalog → methodology}/project.sysml +7 -5
  115. package/examples/surgical-robot/memo.package.yaml +3 -1
  116. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +14 -12
  117. package/examples/surgical-robot/model/{catalog → methodology}/project.sysml +4 -5
  118. package/examples/sysml-diagram-samples/README.md +1 -0
  119. package/examples/sysml-diagram-samples/memo.identity.yaml +459 -0
  120. package/examples/sysml-diagram-samples/memo.package.yaml +3 -1
  121. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +10 -20
  122. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +5 -5
  123. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +10 -13
  124. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +11 -7
  125. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +63 -8
  126. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/drill_down_view.sysml +88 -0
  127. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +25 -25
  128. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +6 -6
  129. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +15 -17
  130. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +21 -21
  131. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +7 -7
  132. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +5 -5
  133. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +14 -14
  134. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +16 -17
  135. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +9 -9
  136. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +7 -14
  137. package/examples/sysml-diagram-samples/model/{catalog → methodology}/project.sysml +5 -5
  138. package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +1 -1
  139. package/examples/temperature-alarm/memo.identity.yaml +6 -0
  140. package/examples/temperature-alarm/memo.package.yaml +3 -1
  141. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +43 -21
  142. package/examples/temperature-alarm/model/{catalog → methodology}/project.sysml +4 -5
  143. package/examples/ui-screen-regions/memo.identity.yaml +33 -0
  144. package/examples/ui-screen-regions/memo.package.yaml +3 -1
  145. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +12 -12
  146. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +18 -18
  147. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +6 -6
  148. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +3 -3
  149. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +1 -1
  150. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +1 -1
  151. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +10 -10
  152. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +1 -1
  153. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
  154. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +15 -15
  155. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +6 -6
  156. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -2
  157. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
  158. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
  159. package/examples/ui-screen-regions/model/{catalog → methodology}/project.sysml +4 -5
  160. package/extensions/README.md +65 -16
  161. package/extensions/aadl/memo.package.yaml +1 -1
  162. package/extensions/aadl/src/aadl_extension.sysml +5 -2
  163. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +29 -50
  164. package/extensions/clinical/memo.package.yaml +1 -1
  165. package/extensions/clinical/src/clinical_extension.sysml +2 -0
  166. package/extensions/cloud/memo.package.yaml +1 -1
  167. package/extensions/container/memo.package.yaml +1 -1
  168. package/extensions/messaging/memo.package.yaml +1 -1
  169. package/extensions/messaging/src/messaging_extension.sysml +2 -2
  170. package/extensions/ros/memo.package.yaml +1 -1
  171. package/extensions/ros/src/ros_extension.sysml +25 -24
  172. package/extensions/template/memo.package.yaml +1 -1
  173. package/extensions/template/model/extension.sysml +25 -0
  174. package/memo.manifest.yaml +1 -7
  175. package/methodologies/default/memo.package.yaml +1 -1
  176. package/methodologies/gpca/memo.package.yaml +1 -1
  177. package/ontology/memo.package.yaml +1 -1
  178. package/package.json +6 -4
  179. package/profile/memo.package.yaml +1 -1
  180. package/src/architecture/decisions/memo_decisions.sysml +9 -2
  181. package/src/architecture/functional/behavior/memo_behavior.sysml +27 -7
  182. package/src/architecture/functional/functions/memo_functions.sysml +45 -31
  183. package/src/architecture/functional/memo_architecture_functional.sysml +14 -0
  184. package/src/architecture/implementation/memo_architecture_implementation.sysml +21 -0
  185. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +7 -0
  186. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +58 -17
  187. package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
  188. package/src/architecture/logical/interfaces/memo_interfaces.sysml +67 -58
  189. package/src/architecture/logical/memo_architecture_logical.sysml +13 -0
  190. package/src/architecture/logical/structure/memo_logical_structure.sysml +27 -8
  191. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +4 -1
  192. package/src/architecture/operational/memo_architecture_operational.sysml +19 -0
  193. package/src/architecture/operational/scenarios/memo_scenarios.sysml +9 -8
  194. package/src/architecture/operational/structure/memo_operational.sysml +5 -2
  195. package/src/architecture/operational/use_cases/memo_use_cases.sysml +16 -8
  196. package/src/architecture/realization/deployment/memo_deployment.sysml +30 -10
  197. package/src/architecture/realization/memo_architecture_realization.sysml +13 -0
  198. package/src/architecture/realization/physical/memo_physical_architecture.sysml +61 -0
  199. package/src/architecture/variability/memo_variability.sysml +87 -0
  200. package/src/artifacts/configuration_management/memo_configuration_management.sysml +95 -3
  201. package/src/artifacts/core/memo_controlled_artifacts.sysml +4 -2
  202. package/src/artifacts/standards/cfr_21_820.sysml +12 -24
  203. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +13 -20
  204. package/src/artifacts/standards/iec_60601_1.sysml +16 -32
  205. package/src/artifacts/standards/iec_60601_1_2.sysml +5 -10
  206. package/src/artifacts/standards/iec_60812.sysml +4 -8
  207. package/src/artifacts/standards/iec_62304.sysml +607 -47
  208. package/src/artifacts/standards/iec_62366_1.sysml +12 -24
  209. package/src/artifacts/standards/iec_81001_5_1.sysml +8 -16
  210. package/src/artifacts/standards/iso_13485.sysml +12 -24
  211. package/src/artifacts/standards/iso_14971.sysml +118 -20
  212. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +3 -6
  213. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +14 -4
  214. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +1 -2
  215. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +1 -2
  216. package/src/artifacts/templates/dhf/iec-62304/sad.md +1 -2
  217. package/src/artifacts/templates/dhf/iec-62304/sbom.md +1 -2
  218. package/src/artifacts/templates/dhf/iec-62304/sdp.md +1 -2
  219. package/src/artifacts/templates/dhf/iec-62304/soup.md +3 -5
  220. package/src/artifacts/templates/dhf/system/sad.md +1 -1
  221. package/src/artifacts/templates/dhf/system/standards-checklist.md +2 -2
  222. package/src/artifacts/templates/dhf/system/standards-traceability.md +1 -1
  223. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +339 -13
  224. package/src/assurance/human_factors/memo_human_factors.sysml +6 -2
  225. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +7 -3
  226. package/src/assurance/safety_risk/memo_risk.sysml +39 -1
  227. package/src/core/common/memo_common.sysml +61 -68
  228. package/src/core/enumerations/memo_enumerations.sysml +93 -9
  229. package/src/core/relationships/memo_relationships.sysml +17 -11
  230. package/src/core/relationships/memo_workspace_membership.sysml +284 -0
  231. package/src/core/semantics/semantics.sysml +58 -0
  232. package/src/core/terminology/terminology.sysml +7 -0
  233. package/src/memo_namespaces.sysml +6 -0
  234. package/src/methodology/archetypes/memo_archetypes.sysml +8 -16
  235. package/src/methodology/core/memo_core.sysml +85 -29
  236. package/src/methodology/profiles/memo_profiles.sysml +217 -61
  237. package/src/methodology/workflow/memo_workflow.sysml +28 -0
  238. package/src/rules/closure/closure_rules.sysml +250 -4
  239. package/src/rules/crosslayer/cross_layer_rules.sysml +11 -0
  240. package/src/rules/ontology/ontology_invariants.sysml +288 -48
  241. package/src/rules/quantitative/quantitative_rules.sysml +4 -0
  242. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +28 -28
  243. package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
  244. package/src/viewpoints/context/context_viewpoint.sysml +2 -3
  245. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
  246. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -3
  247. package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
  248. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +0 -4
  249. package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
  250. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -4
  251. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -4
  252. package/src/viewpoints/logical/logical_viewpoint.sysml +2 -3
  253. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
  254. package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
  255. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
  256. package/src/viewpoints/physical/physical_viewpoint.sysml +2 -3
  257. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +2 -4
  258. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +2 -4
  259. package/src/viewpoints/rendering/memo_rendering.sysml +50 -98
  260. package/src/viewpoints/requirements/requirements_viewpoint.sysml +2 -3
  261. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
  262. package/src/viewpoints/risk/risk_viewpoint.sysml +2 -3
  263. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
  264. package/src/viewpoints/software/software_viewpoint.sysml +2 -3
  265. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
  266. package/src/viewpoints/stakeholders_concerns/memo_stakeholders_concerns.sysml +11 -29
  267. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
  268. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
  269. package/src/viewpoints/usability/usability_viewpoint.sysml +2 -3
  270. package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
  271. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -4
  272. package/stage1/syside-67f92dc96ba75cd05b5c8d13.ids.gz +0 -0
  273. package/stage1/syside-67f92dc96ba75cd05b5c8d13.json.gz +0 -0
  274. package/templates/default/memo.package.yaml +6 -1
  275. package/templates/default/model/catalog/architecture/system.sysml +7 -3
  276. package/templates/default/model/{catalog → methodology}/project.sysml +3 -4
  277. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +0 -47
  278. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +0 -94
  279. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +0 -13
  280. package/examples/ui-screen-regions/model/catalog/relationships.sysml +0 -8
  281. package/extensions/aadl/src/methodology/aadl_methodology.sysml +0 -19
  282. package/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -24
  283. package/extensions/cloud/src/methodology/cloud_methodology.sysml +0 -19
  284. package/extensions/container/src/methodology/container_methodology.sysml +0 -19
  285. package/extensions/messaging/src/methodology/messaging_methodology.sysml +0 -19
  286. package/extensions/ros/src/methodology/ros_methodology.sysml +0 -27
  287. package/extensions/template/src/extension.sysml +0 -39
  288. package/templates/connected-device/memo.package.yaml +0 -13
  289. package/templates/connected-device/model/catalog/architecture/system.sysml +0 -5
  290. package/templates/connected-device/model/catalog/artifacts/catalog.sysml +0 -5
  291. package/templates/connected-device/model/catalog/assurance/requirements.sysml +0 -7
  292. package/templates/connected-device/model/catalog/project.sysml +0 -30
  293. package/templates/connected-device/package.json +0 -8
  294. package/templates/connected-device/syside.toml +0 -13
  295. package/templates/infusion-pump/memo.package.yaml +0 -13
  296. package/templates/infusion-pump/model/catalog/architecture/system.sysml +0 -5
  297. package/templates/infusion-pump/model/catalog/artifacts/catalog.sysml +0 -5
  298. package/templates/infusion-pump/model/catalog/assurance/requirements.sysml +0 -7
  299. package/templates/infusion-pump/model/catalog/project.sysml +0 -30
  300. package/templates/infusion-pump/package.json +0 -8
  301. package/templates/infusion-pump/syside.toml +0 -13
  302. package/templates/monitoring-device/memo.package.yaml +0 -13
  303. package/templates/monitoring-device/model/catalog/architecture/system.sysml +0 -5
  304. package/templates/monitoring-device/model/catalog/artifacts/catalog.sysml +0 -5
  305. package/templates/monitoring-device/model/catalog/assurance/requirements.sysml +0 -7
  306. package/templates/monitoring-device/model/catalog/project.sysml +0 -30
  307. package/templates/monitoring-device/package.json +0 -8
  308. package/templates/monitoring-device/syside.toml +0 -13
  309. package/templates/samd/memo.package.yaml +0 -13
  310. package/templates/samd/model/catalog/architecture/system.sysml +0 -5
  311. package/templates/samd/model/catalog/artifacts/catalog.sysml +0 -5
  312. package/templates/samd/model/catalog/assurance/requirements.sysml +0 -7
  313. package/templates/samd/model/catalog/project.sysml +0 -30
  314. package/templates/samd/package.json +0 -8
  315. package/templates/samd/syside.toml +0 -13
@@ -11,20 +11,146 @@ package memo_rules_ontology {
11
11
 
12
12
  private import memo_core_common::*;
13
13
  private import memo_core_common::MemoIdentity;
14
+ private import memo_artifacts_standards_traceability::EnforcesClause;
15
+ private import memo_artifacts_standards_iec_62366_1::*;
16
+ private import memo_artifacts_standards_iso_13485::*;
14
17
  // ─── Structure ───────────────────────────────────────────────────────
15
18
 
16
19
  constraint def ContainmentAcyclicRule :> MemoConsistencyRule {
17
20
  @MemoIdentity { :>> providedId = "CR-ONT-001"; }
18
21
  attribute tailoring = RuleTailoringKind::invariant;
22
+ attribute domain = RuleDomainKind::modelling;
23
+ attribute obligation = RuleObligationKind::recommended;
19
24
  attribute appliesTo = "Model";
20
25
  attribute severity = RuleSeverityKind::error;
21
26
  attribute rationaleText = "Containment/composition relations (Composes) must form no cycles.";
22
27
  attribute predicateExpression = "acyclic(composes)";
23
28
  constraint { true }
24
29
  }
30
+ constraint def ModelDeclaresSystemRule :> MemoConsistencyRule {
31
+ @MemoIdentity { :>> providedId = "CR-ONT-084"; }
32
+ // Tailorable, not an invariant: a library or a model that only extends another has no
33
+ // system of its own, and its method says so with a rationale.
34
+ attribute tailoring = RuleTailoringKind::methodology;
35
+ attribute domain = RuleDomainKind::modelling;
36
+ attribute obligation = RuleObligationKind::recommended;
37
+ attribute appliesTo = "Model";
38
+ attribute severity = RuleSeverityKind::error;
39
+ attribute rationaleText = "A model declares at least one System (a part def that specializes System). A workspace is the closure of what is linked to the definition of a System, so a model with only a usage typed by System, or none, has no workspace: nothing can be scoped, and every element is Unassigned.";
40
+ attribute predicateExpression = "allOfKind('System')->exists(isDefinition == 'true')";
41
+ constraint { true }
42
+ }
43
+ // ─── Use case scope (plan O8) ─────────────────────────────────────────
44
+ //
45
+ // A use case is at the level of its subject: one whose subject is a SystemOfSystems is a clinical
46
+ // procedure, one whose subject is a System is a system use case. There is no kind for either; the
47
+ // level is read from the subject, and the subject from `hasSubject`. A use case with no subject
48
+ // is at neither level and neither rule judges it.
49
+
50
+ constraint def SosUseCaseIncludesSystemUseCaseRule :> MemoConsistencyRule {
51
+ @MemoIdentity { :>> providedId = "CR-ONT-085"; }
52
+ attribute tailoring = RuleTailoringKind::methodology;
53
+ attribute domain = RuleDomainKind::modelling;
54
+ attribute obligation = RuleObligationKind::recommended;
55
+ attribute appliesTo = "UseCase";
56
+ attribute severity = RuleSeverityKind::warning;
57
+ attribute rationaleText = "A use case whose subject is a system of systems is made of what its systems do: it includes at least one use case whose subject is a system.";
58
+ attribute predicateExpression = "not(downstream(hasSubject)->exists(conformsTo(SystemOfSystems))) or downstream(includesStep)->exists(downstream(hasSubject)->exists(conformsTo(System)))";
59
+ constraint { true }
60
+ }
61
+ constraint def SystemUseCaseIncludedRule :> MemoConsistencyRule {
62
+ @MemoIdentity { :>> providedId = "CR-ONT-086"; }
63
+ attribute tailoring = RuleTailoringKind::methodology;
64
+ attribute domain = RuleDomainKind::modelling;
65
+ attribute obligation = RuleObligationKind::recommended;
66
+ attribute appliesTo = "UseCase";
67
+ attribute severity = RuleSeverityKind::warning;
68
+ attribute rationaleText = "A use case whose subject is a system is included by a use case of the system of systems, or says it stands alone (standalone = true).";
69
+ attribute predicateExpression = "not(downstream(hasSubject)->exists(conformsTo(System))) or upstream(includesStep)->size() >= 1 or attributes.standalone == 'true'";
70
+ constraint { true }
71
+ }
72
+ // A system is a boundary (plan O16). The workspace closure never reaches another system or the
73
+ // system of systems, and drops such a link silently; this rule reports it. Evaluated by the
74
+ // workspace evaluator because it needs what each workspace holds, which no predicate can say:
75
+ // the subject is the element inside a system that is typed by, or relates to, a System-kind or
76
+ // SystemOfSystems-kind element outside it. The system of systems' own references to its systems
77
+ // are what it is for and are not findings.
78
+ constraint def SystemBoundaryRule :> MemoConsistencyRule {
79
+ @MemoIdentity { :>> providedId = "CR-ONT-087"; }
80
+ attribute tailoring = RuleTailoringKind::methodology;
81
+ attribute domain = RuleDomainKind::modelling;
82
+ attribute obligation = RuleObligationKind::recommended;
83
+ attribute evaluator = "workspace";
84
+ attribute appliesTo = "Model";
85
+ attribute severity = RuleSeverityKind::warning;
86
+ attribute rationaleText = "A system does not reference another system or the system of systems from inside itself. Two systems meet at an interface the system of systems owns.";
87
+ constraint { true }
88
+ }
89
+ // ─── Release selections (plan O14) ────────────────────────────────────
90
+ //
91
+ // A release record selects features (`#SelectsFeature`), and through them the variants that realize
92
+ // them (`#RealizesFeature`, variant to feature). The rules read a record's selection by navigation;
93
+ // `selectRelease` (memo-tools `model/variability.ts`) is the same join in code and a test holds the
94
+ // two equal. `upstream` / `downstream` are transitive and directed; the bare relation name is one
95
+ // hop in both directions, which is what the symmetric `excludesFeature` needs (a transitive reading
96
+ // would make A and C exclusive because each excludes B).
97
+
98
+ constraint def ReleaseSelectsProposedVariantRule :> MemoConsistencyRule {
99
+ @MemoIdentity { :>> providedId = "CR-ONT-088"; }
100
+ attribute tailoring = RuleTailoringKind::methodology;
101
+ attribute domain = RuleDomainKind::modelling;
102
+ attribute obligation = RuleObligationKind::recommended;
103
+ attribute appliesTo = "ReleaseRecord";
104
+ attribute severity = RuleSeverityKind::error;
105
+ attribute rationaleText = "An approved or released record contains what it selects. A feature whose variant is still proposed has no approved design behind it, so a record that has passed approval cannot select it. A record with no status, or one still being drafted, is not judged.";
106
+ attribute predicateExpression = "not(attributes.status == 'ElementStatusKind::approved' or attributes.status == 'ElementStatusKind::released') or downstream(selectsFeature)->forAll(upstream(realizesFeature)->forAll(attributes.status != 'ElementStatusKind::proposed'))";
107
+ constraint { true }
108
+ }
109
+ constraint def ReleaseSelectionConsistentRule :> MemoConsistencyRule {
110
+ @MemoIdentity { :>> providedId = "CR-ONT-089"; }
111
+ // An invariant: requires and excludes are the family's own declarations, and a selection that
112
+ // breaks them contradicts the model, whatever the record's status.
113
+ attribute tailoring = RuleTailoringKind::invariant;
114
+ attribute domain = RuleDomainKind::modelling;
115
+ attribute obligation = RuleObligationKind::recommended;
116
+ attribute appliesTo = "ReleaseRecord";
117
+ attribute severity = RuleSeverityKind::error;
118
+ attribute rationaleText = "A record selects a set of features that satisfies the family's rules: every feature a selected feature requires is selected too, and no two selected features exclude each other.";
119
+ attribute predicateExpression = "downstream(selectsFeature)->forAll(downstream(requiresFeature)->forAll(upstream(selectsFeature)->exists(id == subject.id)) and excludesFeature->forAll(upstream(selectsFeature)->forAll(id != subject.id)))";
120
+ constraint { true }
121
+ }
122
+ // Every variation point of the item a record is a release of is resolved to ONE variant, and no
123
+ // variation point anywhere has two. Two halves, one rule:
124
+ // at most one -- any record, any status: a record that selects the features of two variants
125
+ // of one point describes no product. Needs no item.
126
+ // exactly one -- an approved or released record that is `#ReleaseOf` an item: each variation
127
+ // point the item owns (`composes`, transitive, so an SoS record judges the
128
+ // points of the SoS and each system record those of its own system; ownership
129
+ // does not cross typing) has one selected variant. A draft is allowed to be
130
+ // unfinished, as in CR-ONT-088.
131
+ // Not asked of the exactly-one half: a point none of whose variants realizes a feature (a
132
+ // release can neither select nor drop its variants, so it cannot resolve it), a point owned by
133
+ // a variant the record does not select (it is not in the product), and a record with no
134
+ // `#ReleaseOf` (no item to judge, a limit; the at-most-one half still runs).
135
+ // `selectRelease` (memo-tools `model/variability.ts`) is the same definition in code and a test
136
+ // holds the two equal. Limit: `variant` is followed transitively, so a variant that is itself a
137
+ // variation point counts its own variants against its parent's.
138
+ constraint def ReleaseSelectsOneVariantRule :> MemoConsistencyRule {
139
+ @MemoIdentity { :>> providedId = "CR-ONT-090"; }
140
+ attribute tailoring = RuleTailoringKind::invariant;
141
+ attribute domain = RuleDomainKind::modelling;
142
+ attribute obligation = RuleObligationKind::recommended;
143
+ attribute appliesTo = "ReleaseRecord";
144
+ attribute severity = RuleSeverityKind::error;
145
+ attribute rationaleText = "A variation point is one choice. A record that selects the features of two of its variants builds both, and an approved or released record of an item that selects none of a variation point's variants builds neither, so it describes no single product.";
146
+ attribute predicateExpression = "downstream(selectsFeature)->forAll(upstream(realizesFeature)->forAll(upstream(variant)->forAll(downstream(variant)->select(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))->size() <= 1))) and (not(attributes.status == 'ElementStatusKind::approved' or attributes.status == 'ElementStatusKind::released') or downstream(releaseOf)->forAll(downstream(composes)->select(attributes.isVariation == 'true')->forAll(not(downstream(variant)->exists(downstream(realizesFeature)->notEmpty())) or upstream(composes)->exists(upstream(variant)->notEmpty() and downstream(realizesFeature)->notEmpty() and not(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))) or downstream(variant)->select(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))->size() == 1)))";
147
+ constraint { true }
148
+ }
25
149
  constraint def NestedPartConnectedRule :> MemoConsistencyRule {
26
150
  @MemoIdentity { :>> providedId = "AR-IBD-001"; }
27
151
  attribute tailoring = RuleTailoringKind::invariant;
152
+ attribute domain = RuleDomainKind::modelling;
153
+ attribute obligation = RuleObligationKind::recommended;
28
154
  // Internal-block connectivity is a structural-architecture concern, so
29
155
  // the subject is the structural component — not every MemoPart. UI
30
156
  // elements, captured evidence, and review comments nest in compositions
@@ -48,6 +174,8 @@ package memo_rules_ontology {
48
174
  constraint def RuntimeTracesToModuleRule :> MemoConsistencyRule {
49
175
  @MemoIdentity { :>> providedId = "CR-ONT-011"; }
50
176
  attribute tailoring = RuleTailoringKind::invariant;
177
+ attribute domain = RuleDomainKind::modelling;
178
+ attribute obligation = RuleObligationKind::recommended;
51
179
  attribute appliesTo = "SoftwareComponent";
52
180
  attribute severity = RuleSeverityKind::warning;
53
181
  attribute rationaleText = "Every runtime component must trace to a module-view definition (Realizes).";
@@ -56,7 +184,9 @@ package memo_rules_ontology {
56
184
  }
57
185
  constraint def PatientContactCharacterizedRule :> MemoConsistencyRule {
58
186
  @MemoIdentity { :>> providedId = "CR-ONT-032"; }
59
- attribute tailoring = RuleTailoringKind::invariant;
187
+ attribute tailoring = RuleTailoringKind::assurance;
188
+ attribute domain = RuleDomainKind::medicalDevice;
189
+ attribute obligation = RuleObligationKind::recommended;
60
190
  attribute appliesTo = "PhysicalComponent";
61
191
  attribute severity = RuleSeverityKind::error;
62
192
  attribute rationaleText = "Patient-contact components must identify contact nature and duration (ISO 10993-1).";
@@ -68,31 +198,50 @@ package memo_rules_ontology {
68
198
 
69
199
  constraint def SafetyCriticalFunctionVerifiedRule :> MemoConsistencyRule {
70
200
  @MemoIdentity { :>> providedId = "CR-ONT-040"; }
71
- attribute tailoring = RuleTailoringKind::invariant;
201
+ attribute tailoring = RuleTailoringKind::assurance;
202
+ attribute domain = RuleDomainKind::medicalDevice;
203
+ attribute obligation = RuleObligationKind::required;
204
+ // To confirm: inferred from the clause scope; confirm.
72
205
  attribute appliesTo = "MemoFunction";
73
206
  attribute severity = RuleSeverityKind::error;
74
207
  attribute rationaleText = "Safety-critical functions (criticality high or catastrophic) must trace to at least one verification case.";
75
208
  attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or verifiedBy->size() >= 1";
76
209
  constraint { true }
77
210
  }
211
+ #EnforcesClause dependency from SafetyCriticalFunctionVerifiedRule to iso13485::iso13485Clause7::iso13485Clause7_3::iso13485Clause7_3_6;
78
212
  constraint def CriticalTaskValidatedRule :> MemoConsistencyRule {
79
213
  @MemoIdentity { :>> providedId = "CR-ONT-041"; }
80
- attribute tailoring = RuleTailoringKind::invariant;
81
- attribute appliesTo = "OperativeAction[criticality=high]";
214
+ attribute tailoring = RuleTailoringKind::assurance;
215
+ attribute domain = RuleDomainKind::medicalDevice;
216
+ attribute obligation = RuleObligationKind::required;
217
+ // To confirm: inferred from the clause scope; the FDA human-factors guidance it also cites is not in the library yet.
218
+ // The selector used to be `[criticality=high]`, which left the
219
+ // catastrophic tasks — the most critical — outside the rule while the
220
+ // predicate still spelled out the catastrophic case. The criticality
221
+ // test lives in the predicate alone now. `testedByUsability` is the
222
+ // relation the human-factors package declares for exactly this link;
223
+ // reading only `validates` meant a task linked the way the ontology
224
+ // asks was still reported.
225
+ attribute appliesTo = "OperativeAction";
82
226
  attribute severity = RuleSeverityKind::error;
83
227
  attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
84
- attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or validates->size() >= 1";
228
+ attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or testedByUsability->size() >= 1 or validates->size() >= 1";
85
229
  constraint { true }
86
230
  }
231
+ #EnforcesClause dependency from CriticalTaskValidatedRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_9;
87
232
  constraint def UseErrorTracesToHazardRule :> MemoConsistencyRule {
88
233
  @MemoIdentity { :>> providedId = "CR-ONT-042"; }
89
- attribute tailoring = RuleTailoringKind::invariant;
234
+ attribute tailoring = RuleTailoringKind::assurance;
235
+ attribute domain = RuleDomainKind::medicalDevice;
236
+ attribute obligation = RuleObligationKind::required;
237
+ // To confirm: inferred from the clause scope; confirm.
90
238
  attribute appliesTo = "UseError";
91
239
  attribute severity = RuleSeverityKind::warning;
92
240
  attribute rationaleText = "Safety-relevant use errors (severity serious or worse) must trace to a hazard.";
93
241
  attribute predicateExpression = "not(severity == 'serious' or severity == 'critical' or severity == 'catastrophic') or causes->size() >= 1 or tracesRisk->size() >= 1";
94
242
  constraint { true }
95
243
  }
244
+ #EnforcesClause dependency from UseErrorTracesToHazardRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_3;
96
245
  // ─── Relation end conformance (Track A0) ─────────────────────────────
97
246
  //
98
247
  // These rules carry the constraints that `connection def` end TYPES used to
@@ -131,6 +280,8 @@ package memo_rules_ontology {
131
280
  constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
132
281
  @MemoIdentity { :>> providedId = "CR-ONT-060"; }
133
282
  attribute tailoring = RuleTailoringKind::invariant;
283
+ attribute domain = RuleDomainKind::modelling;
284
+ attribute obligation = RuleObligationKind::recommended;
134
285
  attribute appliesTo = "Model";
135
286
  attribute severity = RuleSeverityKind::error;
136
287
  attribute rationaleText = "Only a requirement or a need is satisfied by something. The source end of SatisfiedBy must conform to MemoRequirementElement.";
@@ -140,6 +291,8 @@ package memo_rules_ontology {
140
291
  constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
141
292
  @MemoIdentity { :>> providedId = "CR-ONT-061"; }
142
293
  attribute tailoring = RuleTailoringKind::invariant;
294
+ attribute domain = RuleDomainKind::modelling;
295
+ attribute obligation = RuleObligationKind::recommended;
143
296
  attribute appliesTo = "Model";
144
297
  attribute severity = RuleSeverityKind::error;
145
298
  attribute rationaleText = "A requirement is satisfied by a designed part, a behaviour, or a port. Never by another requirement or by a document.";
@@ -149,6 +302,8 @@ package memo_rules_ontology {
149
302
  constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
150
303
  @MemoIdentity { :>> providedId = "CR-ONT-062"; }
151
304
  attribute tailoring = RuleTailoringKind::invariant;
305
+ attribute domain = RuleDomainKind::modelling;
306
+ attribute obligation = RuleObligationKind::recommended;
152
307
  attribute appliesTo = "Model";
153
308
  attribute severity = RuleSeverityKind::error;
154
309
  attribute rationaleText = "A verification case verifies a requirement, a risk control, an architecture element, a behaviour, or a port — something a test can be run against. Not a view, not an evidence record.";
@@ -158,24 +313,30 @@ package memo_rules_ontology {
158
313
  constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
159
314
  @MemoIdentity { :>> providedId = "CR-ONT-063"; }
160
315
  attribute tailoring = RuleTailoringKind::invariant;
316
+ attribute domain = RuleDomainKind::modelling;
317
+ attribute obligation = RuleObligationKind::recommended;
161
318
  attribute appliesTo = "Model";
162
319
  attribute severity = RuleSeverityKind::error;
163
- attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is a part or an action.";
164
- attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(MemoPart) or construct == 'action')";
320
+ attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is a part, an action, or a functional exchange (allocated to a component exchange, as ARCADIA allocates one).";
321
+ attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(MemoPart) or construct == 'action' or conformsTo(FunctionalExchange))";
165
322
  constraint { true }
166
323
  }
167
324
  constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
168
325
  @MemoIdentity { :>> providedId = "CR-ONT-064"; }
169
326
  attribute tailoring = RuleTailoringKind::invariant;
327
+ attribute domain = RuleDomainKind::modelling;
328
+ attribute obligation = RuleObligationKind::recommended;
170
329
  attribute appliesTo = "Model";
171
330
  attribute severity = RuleSeverityKind::error;
172
- attribute rationaleText = "A function is allocated to a part — including a system or actor — as ARCADIA System Analysis requires.";
173
- attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(MemoPart))";
331
+ attribute rationaleText = "A function is allocated to a part — including a system or actor — as ARCADIA System Analysis requires; a functional exchange is allocated to a component exchange.";
332
+ attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(MemoPart) or conformsTo(ComponentExchange))";
174
333
  constraint { true }
175
334
  }
176
335
  constraint def ComposesParentKindRule :> MemoConsistencyRule {
177
336
  @MemoIdentity { :>> providedId = "CR-ONT-065"; }
178
337
  attribute tailoring = RuleTailoringKind::invariant;
338
+ attribute domain = RuleDomainKind::modelling;
339
+ attribute obligation = RuleObligationKind::recommended;
179
340
  attribute appliesTo = "Model";
180
341
  attribute severity = RuleSeverityKind::error;
181
342
  attribute rationaleText = "A whole in a decomposition is a part, a behaviour, or a state machine. A requirement does not compose anything.";
@@ -185,6 +346,8 @@ package memo_rules_ontology {
185
346
  constraint def ComposesChildKindRule :> MemoConsistencyRule {
186
347
  @MemoIdentity { :>> providedId = "CR-ONT-066"; }
187
348
  attribute tailoring = RuleTailoringKind::invariant;
349
+ attribute domain = RuleDomainKind::modelling;
350
+ attribute obligation = RuleObligationKind::recommended;
188
351
  attribute appliesTo = "Model";
189
352
  attribute severity = RuleSeverityKind::error;
190
353
  attribute rationaleText = "A part in a decomposition is a part, a behaviour, a state, or a port — a component owns its ports, and a workflow owns its steps.";
@@ -194,6 +357,8 @@ package memo_rules_ontology {
194
357
  constraint def PrecedesEndKindRule :> MemoConsistencyRule {
195
358
  @MemoIdentity { :>> providedId = "CR-ONT-067"; }
196
359
  attribute tailoring = RuleTailoringKind::invariant;
360
+ attribute domain = RuleDomainKind::modelling;
361
+ attribute obligation = RuleObligationKind::recommended;
197
362
  attribute appliesTo = "Model";
198
363
  attribute severity = RuleSeverityKind::error;
199
364
  attribute rationaleText = "Precedence orders things that happen: parts or behaviours, at both ends.";
@@ -203,6 +368,8 @@ package memo_rules_ontology {
203
368
  constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
204
369
  @MemoIdentity { :>> providedId = "CR-ONT-068"; }
205
370
  attribute tailoring = RuleTailoringKind::invariant;
371
+ attribute domain = RuleDomainKind::modelling;
372
+ attribute obligation = RuleObligationKind::recommended;
206
373
  attribute appliesTo = "Model";
207
374
  attribute severity = RuleSeverityKind::error;
208
375
  attribute rationaleText = "A performer is an operational entity, an actor, or a system action — a part or a behaviour. The end's own documentation said 'or system action' while its MemoPart type forbade one.";
@@ -212,6 +379,8 @@ package memo_rules_ontology {
212
379
  constraint def BindsToInterfaceEndKindRule :> MemoConsistencyRule {
213
380
  @MemoIdentity { :>> providedId = "CR-ONT-070"; }
214
381
  attribute tailoring = RuleTailoringKind::invariant;
382
+ attribute domain = RuleDomainKind::modelling;
383
+ attribute obligation = RuleObligationKind::recommended;
215
384
  attribute appliesTo = "Model";
216
385
  attribute severity = RuleSeverityKind::error;
217
386
  attribute rationaleText = "A port binds to an interface. The bound end is an interface definition, which the former InterfaceElement-typed end could not hold at all — Interface specializes MemoInterface, an interface def, not a part.";
@@ -221,34 +390,45 @@ package memo_rules_ontology {
221
390
  constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
222
391
  @MemoIdentity { :>> providedId = "CR-ONT-071"; }
223
392
  attribute tailoring = RuleTailoringKind::invariant;
393
+ attribute domain = RuleDomainKind::modelling;
394
+ attribute obligation = RuleObligationKind::recommended;
224
395
  attribute appliesTo = "Model";
225
396
  attribute severity = RuleSeverityKind::error;
226
- attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange item.";
227
- attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item')";
397
+ attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset, an item, or an exchange: an interface or a flow.";
398
+ attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item' or construct == 'interface' or construct == 'flow')";
228
399
  constraint { true }
229
400
  }
230
401
 
231
- // CR-ONT-002's replacement. ComponentExchange's endpoints are `ref`
232
- // features, not links, and the builder projects them as element-ID STRINGS
233
- // in the attribute map (a §13.3 string pseudo-reference) — so they cannot be
234
- // reached with sourcesOf/targetsOf. They are resolved here by looking the id
235
- // up in the kind extent, which is the same statement made the long way.
402
+ // CR-ONT-002's replacement, now asked of the edge. A ComponentExchange is
403
+ // an interface, so its ends are the ports it connects, and `sourceEnd` /
404
+ // `targetEnd` are those elements. The compiler does not check this:
405
+ // a compiler accepts a part at an interface end even when the definition types
406
+ // the ends.
407
+ //
408
+ // It used to read `sourceEndpoint` refs, whose dotted values the builder
409
+ // cut to their first segment, and compare them as strings, which drop
410
+ // everything up to the last `::`. On gpca-pump that matched the enclosing
411
+ // device for 44 of 46 exchanges and passed.
236
412
  constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
237
413
  @MemoIdentity { :>> providedId = "CR-ONT-072"; }
238
414
  attribute tailoring = RuleTailoringKind::invariant;
415
+ attribute domain = RuleDomainKind::modelling;
416
+ attribute obligation = RuleObligationKind::recommended;
239
417
  attribute appliesTo = "ComponentExchange";
240
418
  attribute severity = RuleSeverityKind::error;
241
- attribute rationaleText = "An exchange starts at a component or at a boundary port. Stating it as a rule is what let the endpoint refs stop being MemoPart-typed, which is what lets PhysicalPort and SoftwarePort become port defs.";
242
- attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('MemoPart')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.sourceEndpoint)";
419
+ attribute rationaleText = "A component exchange starts at a port. An exchange that starts at a component names no boundary, so nothing says where on the component it enters or leaves, and no port can carry its item type or direction.";
420
+ attribute predicateExpression = "sourceEnd->size() == 1 and sourceEnd->forAll(construct == 'port')";
243
421
  constraint { true }
244
422
  }
245
423
  constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
246
424
  @MemoIdentity { :>> providedId = "CR-ONT-073"; }
247
425
  attribute tailoring = RuleTailoringKind::invariant;
426
+ attribute domain = RuleDomainKind::modelling;
427
+ attribute obligation = RuleObligationKind::recommended;
248
428
  attribute appliesTo = "ComponentExchange";
249
429
  attribute severity = RuleSeverityKind::error;
250
- attribute rationaleText = "An exchange ends at a component or at a boundary port, on the same grounds as CR-ONT-072.";
251
- attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('MemoPart')->exists(id == subject.attributes.targetEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.targetEndpoint)";
430
+ attribute rationaleText = "A component exchange ends at a port, on the same grounds as CR-ONT-072.";
431
+ attribute predicateExpression = "targetEnd->size() == 1 and targetEnd->forAll(construct == 'port')";
252
432
  constraint { true }
253
433
  }
254
434
 
@@ -261,6 +441,8 @@ package memo_rules_ontology {
261
441
  constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
262
442
  @MemoIdentity { :>> providedId = "CR-ONT-074"; }
263
443
  attribute tailoring = RuleTailoringKind::invariant;
444
+ attribute domain = RuleDomainKind::modelling;
445
+ attribute obligation = RuleObligationKind::recommended;
264
446
  attribute appliesTo = "ComponentFunction";
265
447
  attribute severity = RuleSeverityKind::error;
266
448
  attribute rationaleText = "A component function is the responsibility of exactly one component, and AllocatedTo is what names it. A component function allocated nowhere is a responsibility nobody has accepted; one allocated twice is a responsibility nobody owns. A system-level responsibility with no single owner is a SystemFunction, which allows that.";
@@ -270,6 +452,8 @@ package memo_rules_ontology {
270
452
  constraint def FunctionDecomposesIntoFunctionsRule :> MemoConsistencyRule {
271
453
  @MemoIdentity { :>> providedId = "CR-ONT-075"; }
272
454
  attribute tailoring = RuleTailoringKind::invariant;
455
+ attribute domain = RuleDomainKind::modelling;
456
+ attribute obligation = RuleObligationKind::recommended;
273
457
  attribute appliesTo = "MemoFunction";
274
458
  attribute severity = RuleSeverityKind::error;
275
459
  attribute rationaleText = "The functional chain decomposes functions into functions. A function composed of a component, or owned by one, is confusing allocation with decomposition — the component is named by AllocatedTo, never by Composes.";
@@ -294,7 +478,12 @@ package memo_rules_ontology {
294
478
  //
295
479
  // They read the `composes` edge, which the builder synthesizes from native
296
480
  // nesting, so they cover the nesting spelling and the retired connection
297
- // form identically.
481
+ // form identically. They read it DOWNSTREAM: a bare relation name navigates
482
+ // both ways, so `composes` alone also reached the subject's own parent and
483
+ // judged a software system by the assembly it sat in. That reported one
484
+ // cross-family nesting twice, once on each side, and the child's copy
485
+ // blamed the element that was not doing the containing. `downstream` is
486
+ // transitive, so the rule reads as "the subtree stays in the family".
298
487
  //
299
488
  // Ports are exempt. A port is a boundary FEATURE of its owner, not a member
300
489
  // of its owner's family, and any element may carry one whatever family it
@@ -305,47 +494,61 @@ package memo_rules_ontology {
305
494
  constraint def SoftwareContainsSoftwareRule :> MemoConsistencyRule {
306
495
  @MemoIdentity { :>> providedId = "CR-ONT-077"; }
307
496
  attribute tailoring = RuleTailoringKind::invariant;
497
+ attribute domain = RuleDomainKind::modelling;
498
+ attribute obligation = RuleObligationKind::recommended;
308
499
  attribute appliesTo = "SoftwareElement";
309
500
  attribute severity = RuleSeverityKind::error;
310
501
  attribute rationaleText = "Software contains software. A software element containing a logical or physical one is realization, not containment — that is a refinement dependency.";
311
- attribute predicateExpression = "composes->forAll(construct == 'port' or construct == 'package' or conformsTo(SoftwareElement))";
502
+ attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(SoftwareElement))";
312
503
  constraint { true }
313
504
  }
314
505
  constraint def LogicalContainsLogicalRule :> MemoConsistencyRule {
315
506
  @MemoIdentity { :>> providedId = "CR-ONT-078"; }
316
507
  attribute tailoring = RuleTailoringKind::invariant;
508
+ attribute domain = RuleDomainKind::modelling;
509
+ attribute obligation = RuleObligationKind::recommended;
317
510
  attribute appliesTo = "LogicalComponent";
318
511
  attribute severity = RuleSeverityKind::error;
319
512
  attribute rationaleText = "The logical hierarchy decomposes into logical components. A logical component containing a software module or a physical part is realization — the implementation element refines the logical one, it is not part of it.";
320
- attribute predicateExpression = "composes->forAll(construct == 'port' or construct == 'package' or conformsTo(LogicalComponent))";
513
+ attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(LogicalComponent))";
321
514
  constraint { true }
322
515
  }
323
516
  constraint def PhysicalContainsPhysicalRule :> MemoConsistencyRule {
324
517
  @MemoIdentity { :>> providedId = "CR-ONT-079"; }
325
518
  attribute tailoring = RuleTailoringKind::invariant;
519
+ attribute domain = RuleDomainKind::modelling;
520
+ attribute obligation = RuleObligationKind::recommended;
326
521
  attribute appliesTo = "PhysicalElement";
327
522
  attribute severity = RuleSeverityKind::error;
328
523
  attribute rationaleText = "An assembly contains physical things. PhysicalElement is the shared root the family gained for this rule — PhysicalAssembly and PhysicalComponent previously specialized MemoPart separately, which left no type meaning 'a physical thing' to name here.";
329
- attribute predicateExpression = "composes->forAll(construct == 'port' or construct == 'package' or conformsTo(PhysicalElement))";
524
+ attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(PhysicalElement))";
330
525
  constraint { true }
331
526
  }
332
527
 
333
- // Track A3. The flow is the edge; the exchange part carries the budget and
334
- // assurance attributes. The two halves are bound by a SHARED NAME — the flow
335
- // usage is named with its exchange — and this is what makes that binding a
336
- // checked fact rather than a convention someone can quietly break.
528
+ // An interface is the path between two ports; the flow over it is what
529
+ // moves. This rule asks that a component exchange carries one: a flow
530
+ // whose ends are the exchange's own two ports. The ends are compared as
531
+ // elements (`intersects` matches exact ids), not as names.
532
+ //
533
+ // It replaces the same-name coupling this id used to check, which tied a
534
+ // ComponentExchange PART to a flow of the same name. That was unsatisfiable
535
+ // once the model compiled: two members of one namespace may not share a
536
+ // name (`namespace-distinguishability`), and a `bind` could not be named at
537
+ // all. With the exchange an interface there is no second record to keep in
538
+ // step, and what is left to check is transport.
337
539
  //
338
- // It needs `linksOf`, because the question is about a link's IDENTITY, not
339
- // about what sits at its ends: `sourcesOf`/`targetsOf` yield the elements at
340
- // the ends and can never answer it. Naming the flow is what the grammar's
341
- // restored FlowDeclaration name makes possible at all.
540
+ // `assurance`, not `invariant`: whether every interface must declare its
541
+ // transport is a method's call (§9.2 of the architecture plan), and a
542
+ // method that models interfaces before their flows may tailor it.
342
543
  constraint def ExchangeHasFlowRule :> MemoConsistencyRule {
343
544
  @MemoIdentity { :>> providedId = "CR-ONT-076"; }
344
- attribute tailoring = RuleTailoringKind::invariant;
545
+ attribute tailoring = RuleTailoringKind::assurance;
546
+ attribute domain = RuleDomainKind::modelling;
547
+ attribute obligation = RuleObligationKind::recommended;
345
548
  attribute appliesTo = "ComponentExchange";
346
549
  attribute severity = RuleSeverityKind::error;
347
- attribute rationaleText = "An exchange states that something crosses a boundary, which is an EDGE, and the edge is a native flow. The part def exists for the budget and assurance attributes a reader has to find from the edge, so the two are named alike and this rule holds them together. An exchange with no flow is a budget attached to nothing.";
348
- attribute predicateExpression = "linksOf(flow)->exists(id == subject.id)";
550
+ attribute rationaleText = "A component exchange is the connection between two ports; the flow is what crosses it. An exchange with no flow between its ports declares a path that nothing uses, so its timing and kind describe no transfer.";
551
+ attribute predicateExpression = "linksOf(flow)->exists(sourceEnd->intersects(subject.sourceEnd) and targetEnd->intersects(subject.targetEnd))";
349
552
  constraint { true }
350
553
  }
351
554
 
@@ -359,6 +562,8 @@ package memo_rules_ontology {
359
562
  constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
360
563
  @MemoIdentity { :>> providedId = "CR-ONT-043"; }
361
564
  attribute tailoring = RuleTailoringKind::invariant;
565
+ attribute domain = RuleDomainKind::modelling;
566
+ attribute obligation = RuleObligationKind::recommended;
362
567
  attribute appliesTo = "OperativeScenario";
363
568
  attribute severity = RuleSeverityKind::error;
364
569
  attribute rationaleText = "An alternate scenario is a variation of a nominal path, so it belongs to a workflow that has one. An alternate with no nominal sibling is either a workflow with no happy path or a scenario filed under the wrong parent.";
@@ -366,20 +571,37 @@ package memo_rules_ontology {
366
571
  // the definition, and a default is not written onto every usage. So the
367
572
  // sibling test is "not alternate", and `conformsTo` keeps it from being
368
573
  // satisfied by an ordinary step of the same workflow.
369
- attribute predicateExpression = "not(scenarioKind == 'alternate') or composes.composes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate')";
574
+ //
575
+ // The base may be found three ways, and the workflow sibling is only
576
+ // the first. A use case is what a main scenario and its extensions
577
+ // vary from, so an alternate realizing a use case that a nominal
578
+ // scenario also realizes has its base, whichever workflow holds each
579
+ // (gpca-pump files its alarm responses in a workflow of their own). A
580
+ // scenario with no workflow at all has its package as its parent, so
581
+ // its siblings are the package's other workflow-less scenarios.
582
+ attribute predicateExpression = "not(scenarioKind == 'alternate') or composes.composes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate') or downstream(realizes).realizes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate') or (upstream(composes)->isEmpty() and allOfKind('OperativeScenario')->exists(package == subject.package and scenarioKind != 'alternate' and upstream(composes)->isEmpty()))";
370
583
  constraint { true }
371
584
  }
372
585
 
373
586
  // ─── Assurance-trace warnings ────────────────────────────────────────
374
- // Both are WARNINGS, not errors: each describes a trace graph that is
375
- // suspicious rather than invalid, and a regulated model has legitimate
376
- // exceptions to both. They needed `upstream` / `downstream` — the bare
377
- // relation name is bidirectional, so before those existed no rule could
378
- // ask which way a derivation ran.
587
+ // A WARNING, not an error: it describes a trace graph that is suspicious
588
+ // rather than invalid, and a regulated model has legitimate exceptions.
589
+ // It needed `upstream` / `downstream` — the bare relation name is
590
+ // bidirectional, so before those existed no rule could ask which way a
591
+ // derivation ran.
592
+ //
593
+ // CR-ONT-081 (RedundantAncestorTraceRule) was deleted 2026-09-25. It called
594
+ // a trace redundant when one element satisfied both a requirement and one
595
+ // derived from it, "already implied by the derivation". It is not: a
596
+ // `derive` does not make its source satisfied, and a response-time
597
+ // requirement derived from "select a drug from the library" says nothing
598
+ // about whether the selector lets you select one.
379
599
 
380
600
  constraint def DerivationGapRule :> MemoConsistencyRule {
381
601
  @MemoIdentity { :>> providedId = "CR-ONT-080"; }
382
602
  attribute tailoring = RuleTailoringKind::invariant;
603
+ attribute domain = RuleDomainKind::modelling;
604
+ attribute obligation = RuleObligationKind::recommended;
383
605
  attribute appliesTo = "MemoRequirementElement";
384
606
  attribute severity = RuleSeverityKind::warning;
385
607
  attribute rationaleText = "A requirement that others derive from should itself be justified. If nothing is upstream of it and it is not a stakeholder need, the derivation chain dead-ends at an unexplained requirement — the gap an assessor asks about first. Needs are the legitimate roots, so they are exempt by type rather than by convention.";
@@ -387,13 +609,31 @@ package memo_rules_ontology {
387
609
  constraint { true }
388
610
  }
389
611
 
390
- constraint def RedundantAncestorTraceRule :> MemoConsistencyRule {
391
- @MemoIdentity { :>> providedId = "CR-ONT-081"; }
612
+ // ─── Causes ─────────────────────────────────────────────────────────
613
+ //
614
+ // Causes' ends are untyped because its CauseKind spans parts and items
615
+ // (memo_fmea.sysml). These carry what the types cannot.
616
+
617
+ constraint def CausesCauseKindRule :> MemoConsistencyRule {
618
+ @MemoIdentity { :>> providedId = "CR-ONT-082"; }
392
619
  attribute tailoring = RuleTailoringKind::invariant;
393
- attribute appliesTo = "MemoRequirementElement";
394
- attribute severity = RuleSeverityKind::warning;
395
- attribute rationaleText = "When one element satisfies both a requirement and something derived from that requirement, the trace to the ancestor is already implied by the derivation and adds no coverage. Two elements satisfying the two ends is ordinary decomposition and is not reported.";
396
- attribute predicateExpression = "not satisfiedBy->intersects(downstream(derivesFrom).satisfiedBy)";
620
+ attribute domain = RuleDomainKind::modelling;
621
+ attribute obligation = RuleObligationKind::recommended;
622
+ attribute appliesTo = "Model";
623
+ attribute severity = RuleSeverityKind::error;
624
+ attribute rationaleText = "A cause is a risk-chain element (a failure mode, failure cause, hazard cause or fault-tree event) or a part that originates one (a component, a use error). A requirement or a behaviour causes nothing.";
625
+ attribute predicateExpression = "sourcesOf(causes)->forAll(conformsTo(RiskItem) or conformsTo(MemoPart))";
626
+ constraint { true }
627
+ }
628
+ constraint def CausesEffectKindRule :> MemoConsistencyRule {
629
+ @MemoIdentity { :>> providedId = "CR-ONT-083"; }
630
+ attribute tailoring = RuleTailoringKind::invariant;
631
+ attribute domain = RuleDomainKind::modelling;
632
+ attribute obligation = RuleObligationKind::recommended;
633
+ attribute appliesTo = "Model";
634
+ attribute severity = RuleSeverityKind::error;
635
+ attribute rationaleText = "An effect is a link in a risk chain, or the fault-tree event a component originates. Not a component, not a requirement.";
636
+ attribute predicateExpression = "targetsOf(causes)->forAll(conformsTo(RiskItem) or conformsTo(FaultTreeNode))";
397
637
  constraint { true }
398
638
  }
399
639
  }
@@ -11,6 +11,8 @@ package memo_rules_quantitative {
11
11
  constraint def HazardMaxControlsRule :> MemoConsistencyRule {
12
12
  @MemoIdentity { :>> providedId = "QT-001"; }
13
13
  attribute tailoring = RuleTailoringKind::assurance;
14
+ attribute domain = RuleDomainKind::modelling;
15
+ attribute obligation = RuleObligationKind::recommended;
14
16
  attribute appliesTo = "Hazard";
15
17
  attribute severity = RuleSeverityKind::info;
16
18
  attribute rationaleText = "Excessive controls per hazard suggests the hazard is too broad and should be decomposed.";
@@ -21,6 +23,8 @@ package memo_rules_quantitative {
21
23
  constraint def SwComponentMaxInterfacesRule :> MemoConsistencyRule {
22
24
  @MemoIdentity { :>> providedId = "QT-002"; }
23
25
  attribute tailoring = RuleTailoringKind::assurance;
26
+ attribute domain = RuleDomainKind::modelling;
27
+ attribute obligation = RuleObligationKind::recommended;
24
28
  attribute appliesTo = "SoftwareModule";
25
29
  attribute severity = RuleSeverityKind::info;
26
30
  attribute rationaleText = "High interface count indicates excessive coupling; consider decomposition.";