@memoarchitect/ontology 0.8.22 → 0.10.9

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 (240) hide show
  1. package/README.md +1 -1
  2. package/examples/connected-patient-monitor/memo.package.yaml +3 -0
  3. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +9 -7
  4. package/examples/connected-patient-monitor/model/catalog/project.sysml +3 -1
  5. package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/views/connected_patient_monitor_overview.sysml +1 -1
  6. package/examples/embedded-infusion-pump/memo.package.yaml +3 -0
  7. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +11 -9
  8. package/examples/embedded-infusion-pump/model/catalog/project.sysml +3 -1
  9. package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/views/embedded_infusion_pump_overview.sysml +1 -1
  10. package/examples/functional-logical-physical/memo.package.yaml +3 -0
  11. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +9 -7
  12. package/examples/functional-logical-physical/model/catalog/project.sysml +3 -1
  13. package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/views/functional_logical_physical_overview.sysml +1 -1
  14. package/examples/gpca-pump/memo.identity.yaml +2179 -0
  15. package/examples/gpca-pump/memo.package.yaml +3 -0
  16. package/examples/gpca-pump/methodology/gpca_profiles.sysml +3 -1
  17. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +29 -27
  18. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +115 -114
  19. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +42 -41
  20. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +26 -25
  21. package/examples/gpca-pump/model/catalog/gpca_context.sysml +27 -23
  22. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +15 -15
  23. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +42 -40
  24. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +198 -197
  25. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +146 -180
  26. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +8 -6
  27. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +290 -288
  28. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +164 -163
  29. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +44 -43
  30. package/examples/gpca-pump/model/catalog/gpca_system.sysml +21 -33
  31. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +10 -11
  32. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +62 -61
  33. package/examples/gpca-pump/model/catalog/project.sysml +3 -1
  34. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +7 -7
  35. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +7 -7
  36. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +6 -7
  37. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +7 -8
  38. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +6 -6
  39. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +6 -6
  40. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +6 -6
  41. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +8 -9
  42. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +6 -6
  43. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +6 -6
  44. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +6 -6
  45. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +6 -6
  46. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +7 -7
  47. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +6 -6
  48. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +6 -6
  49. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +8 -9
  50. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +6 -6
  51. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +6 -7
  52. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +6 -7
  53. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +6 -6
  54. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +6 -6
  55. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +6 -7
  56. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +6 -6
  57. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +8 -9
  58. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +6 -7
  59. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +6 -6
  60. package/examples/ivd-laboratory-system/memo.package.yaml +3 -0
  61. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +10 -8
  62. package/examples/ivd-laboratory-system/model/catalog/project.sysml +3 -1
  63. package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/views/ivd_laboratory_system_overview.sysml +1 -1
  64. package/examples/manual-surgical-instrument/memo.package.yaml +3 -0
  65. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +7 -5
  66. package/examples/manual-surgical-instrument/model/catalog/project.sysml +3 -1
  67. package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/views/manual_surgical_instrument_overview.sysml +1 -1
  68. package/examples/multidimensional-layers/memo.package.yaml +3 -0
  69. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -4
  70. package/examples/multidimensional-layers/model/catalog/project.sysml +3 -1
  71. package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/views/multidimensional_layers_overview.sysml +0 -1
  72. package/examples/nested-architecture-dsm/memo.package.yaml +3 -0
  73. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +20 -18
  74. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +20 -18
  75. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +6 -4
  76. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +9 -7
  77. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +18 -16
  78. package/examples/nested-architecture-dsm/model/catalog/project.sysml +3 -1
  79. package/examples/reusable-instrument/memo.package.yaml +3 -0
  80. package/examples/reusable-instrument/model/catalog/project.sysml +3 -1
  81. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +23 -31
  82. package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/views/reusable_instrument_overview.sysml +0 -1
  83. package/examples/ros-mobile-robot/memo.package.yaml +3 -0
  84. package/examples/ros-mobile-robot/model/catalog/project.sysml +3 -1
  85. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +18 -16
  86. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +0 -1
  87. package/examples/software-only-medical-device/memo.package.yaml +3 -0
  88. package/examples/software-only-medical-device/model/catalog/project.sysml +3 -1
  89. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -9
  90. package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/views/software_only_medical_device_overview.sysml +0 -1
  91. package/examples/surgical-closure-workflow/memo.package.yaml +3 -0
  92. package/examples/surgical-closure-workflow/model/catalog/project.sysml +3 -1
  93. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +56 -69
  94. package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/views/surgical_closure_workflow_overview.sysml +0 -1
  95. package/examples/surgical-robot/memo.package.yaml +3 -0
  96. package/examples/surgical-robot/model/catalog/project.sysml +3 -1
  97. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +9 -7
  98. package/examples/surgical-robot/model/catalog/viewpoints/unassigned/views/surgical_robot_overview.sysml +0 -1
  99. package/examples/sysml-diagram-samples/memo.package.yaml +2 -0
  100. package/examples/sysml-diagram-samples/model/catalog/project.sysml +3 -1
  101. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +12 -11
  102. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +8 -7
  103. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +4 -3
  104. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +3 -3
  105. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +17 -16
  106. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +9 -8
  107. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +4 -3
  108. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +3 -3
  109. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +4 -3
  110. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +12 -9
  111. package/examples/temperature-alarm/memo.identity.yaml +64 -0
  112. package/examples/temperature-alarm/memo.package.yaml +3 -0
  113. package/examples/temperature-alarm/model/catalog/project.sysml +3 -1
  114. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +30 -29
  115. package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/views/temperature_alarm_overview.sysml +0 -1
  116. package/examples/ui-screen-regions/memo.package.yaml +3 -0
  117. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +14 -12
  118. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +35 -33
  119. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +8 -6
  120. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +14 -13
  121. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +4 -2
  122. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +4 -2
  123. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +12 -10
  124. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +3 -1
  125. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +14 -12
  126. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +17 -15
  127. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +10 -9
  128. package/examples/ui-screen-regions/model/catalog/project.sysml +3 -1
  129. package/examples/ui-screen-regions/model/catalog/relationships.sysml +2 -2
  130. package/examples/ui-screen-regions/model/catalog/traces.sysml +0 -2
  131. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +6 -5
  132. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +6 -5
  133. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +6 -5
  134. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +4 -3
  135. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +4 -3
  136. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +4 -3
  137. package/extensions/aadl/memo.package.yaml +1 -1
  138. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +23 -21
  139. package/extensions/aadl/src/methodology/aadl_methodology.sysml +3 -1
  140. package/extensions/clinical/src/methodology/clinical_methodology.sysml +3 -1
  141. package/extensions/cloud/memo.package.yaml +1 -1
  142. package/extensions/cloud/src/methodology/cloud_methodology.sysml +3 -1
  143. package/extensions/container/memo.package.yaml +1 -1
  144. package/extensions/container/src/container_extension.sysml +2 -2
  145. package/extensions/container/src/methodology/container_methodology.sysml +3 -1
  146. package/extensions/messaging/memo.package.yaml +1 -1
  147. package/extensions/messaging/src/methodology/messaging_methodology.sysml +3 -1
  148. package/extensions/ros/memo.package.yaml +1 -1
  149. package/extensions/ros/src/methodology/ros_methodology.sysml +3 -1
  150. package/extensions/template/src/extension.sysml +3 -1
  151. package/methodologies/default/memo.package.yaml +1 -1
  152. package/methodologies/gpca/memo.package.yaml +1 -1
  153. package/ontology/memo.package.yaml +1 -1
  154. package/package.json +2 -2
  155. package/profile/memo.package.yaml +1 -1
  156. package/src/architecture/functional/behavior/memo_behavior.sysml +5 -5
  157. package/src/architecture/functional/functions/memo_functions.sysml +6 -6
  158. package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +12 -2
  159. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +0 -11
  160. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +7 -7
  161. package/src/architecture/implementation/ui/memo_ui.sysml +8 -31
  162. package/src/architecture/logical/interfaces/memo_interfaces.sysml +4 -2
  163. package/src/architecture/logical/structure/memo_logical_structure.sysml +5 -5
  164. package/src/architecture/operational/activities/memo_activities.sysml +19 -28
  165. package/src/architecture/operational/context/actors/memo_actors.sysml +5 -4
  166. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +7 -7
  167. package/src/architecture/operational/context/use_context/memo_use_context.sysml +5 -14
  168. package/src/architecture/operational/scenarios/memo_scenarios.sysml +12 -104
  169. package/src/architecture/operational/structure/memo_operational.sysml +42 -13
  170. package/src/architecture/operational/use_cases/memo_use_cases.sysml +7 -12
  171. package/src/architecture/operational/workflows/memo_workflows.sysml +20 -42
  172. package/src/architecture/realization/deployment/memo_deployment.sysml +26 -19
  173. package/src/architecture/realization/physical/memo_physical_architecture.sysml +8 -2
  174. package/src/artifacts/standards/cfr_21_820.sysml +80 -89
  175. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +45 -49
  176. package/src/artifacts/standards/iec_60601_1.sysml +108 -121
  177. package/src/artifacts/standards/iec_60601_1_2.sysml +31 -33
  178. package/src/artifacts/standards/iec_60812.sysml +21 -22
  179. package/src/artifacts/standards/iec_62304.sysml +150 -169
  180. package/src/artifacts/standards/iec_62366_1.sysml +80 -89
  181. package/src/artifacts/standards/iec_81001_5_1.sysml +52 -57
  182. package/src/artifacts/standards/iso_13485.sysml +80 -89
  183. package/src/artifacts/standards/iso_14971.sysml +66 -73
  184. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +15 -15
  185. package/src/artifacts/templates/dhf/system/sad.md +3 -3
  186. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +2 -2
  187. package/src/assurance/human_factors/memo_human_factors.sysml +2 -2
  188. package/src/assurance/requirements/memo_requirements.sysml +2 -18
  189. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +1 -1
  190. package/src/assurance/safety_risk/memo_risk.sysml +12 -0
  191. package/src/assurance/verification_validation/memo_assurance.sysml +7 -12
  192. package/src/core/common/memo_common.sysml +59 -55
  193. package/src/core/enumerations/memo_enumerations.sysml +1 -1
  194. package/src/core/relationships/memo_relationships.sysml +29 -56
  195. package/src/methodology/archetypes/memo_archetypes.sysml +10 -8
  196. package/src/methodology/core/memo_core.sysml +0 -10
  197. package/src/methodology/profiles/memo_profiles.sysml +18 -16
  198. package/src/methodology/workflow/memo_workflow.sysml +5 -5
  199. package/src/rules/closure/closure_rules.sysml +22 -20
  200. package/src/rules/crosslayer/cross_layer_rules.sysml +4 -2
  201. package/src/rules/ontology/ontology_invariants.sysml +121 -48
  202. package/src/rules/quantitative/quantitative_rules.sysml +4 -2
  203. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +58 -57
  204. package/src/viewpoints/clinical/clinical_viewpoint.sysml +5 -4
  205. package/src/viewpoints/context/context_viewpoint.sysml +6 -5
  206. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +6 -5
  207. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +6 -6
  208. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +36 -4
  209. package/src/viewpoints/functional/functional_viewpoint.sysml +6 -5
  210. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +6 -5
  211. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +6 -5
  212. package/src/viewpoints/logical/logical_viewpoint.sysml +5 -4
  213. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +6 -5
  214. package/src/viewpoints/operational/operational_viewpoint.sysml +6 -5
  215. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +7 -6
  216. package/src/viewpoints/physical/physical_viewpoint.sysml +5 -4
  217. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +6 -5
  218. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +6 -5
  219. package/src/viewpoints/rendering/memo_rendering.sysml +220 -40
  220. package/src/viewpoints/requirements/requirements_viewpoint.sysml +5 -4
  221. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +6 -5
  222. package/src/viewpoints/risk/risk_viewpoint.sysml +5 -4
  223. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +6 -5
  224. package/src/viewpoints/software/software_viewpoint.sysml +5 -4
  225. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +6 -5
  226. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +5 -4
  227. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +3 -1
  228. package/src/viewpoints/usability/usability_viewpoint.sysml +5 -4
  229. package/src/viewpoints/verification/verification_viewpoint.sysml +5 -4
  230. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +6 -5
  231. package/templates/connected-device/memo.package.yaml +2 -0
  232. package/templates/connected-device/model/catalog/project.sysml +3 -1
  233. package/templates/default/memo.package.yaml +2 -0
  234. package/templates/default/model/catalog/project.sysml +3 -1
  235. package/templates/infusion-pump/memo.package.yaml +2 -0
  236. package/templates/infusion-pump/model/catalog/project.sysml +3 -1
  237. package/templates/monitoring-device/memo.package.yaml +2 -0
  238. package/templates/monitoring-device/model/catalog/project.sysml +3 -1
  239. package/templates/samd/memo.package.yaml +2 -0
  240. package/templates/samd/model/catalog/project.sysml +3 -1
@@ -7,10 +7,12 @@ package memo_rules_closure {
7
7
  private import memo_core_consistency_rules::*;
8
8
  private import memo_core_enumerations::*;
9
9
 
10
+ private import memo_core_common::*;
11
+ private import memo_core_common::MemoIdentity;
10
12
  // ─── Risk Layer Rules ────────────────────────────────────────────────
11
13
 
12
14
  constraint def HazardMitigationRule :> MemoConsistencyRule {
13
- attribute id = "CR-MED-001";
15
+ @MemoIdentity { :>> providedId = "CR-MED-001"; }
14
16
  attribute tailoring = RuleTailoringKind::assurance;
15
17
  attribute appliesTo = "Hazard";
16
18
  attribute severity = RuleSeverityKind::error;
@@ -20,7 +22,7 @@ package memo_rules_closure {
20
22
  }
21
23
 
22
24
  constraint def HazardSeverityRule :> MemoConsistencyRule {
23
- attribute id = "CR-MED-002";
25
+ @MemoIdentity { :>> providedId = "CR-MED-002"; }
24
26
  attribute tailoring = RuleTailoringKind::assurance;
25
27
  attribute appliesTo = "Hazard";
26
28
  attribute severity = RuleSeverityKind::error;
@@ -30,7 +32,7 @@ package memo_rules_closure {
30
32
  }
31
33
 
32
34
  constraint def RiskControlVerificationRule :> MemoConsistencyRule {
33
- attribute id = "CR-MED-003";
35
+ @MemoIdentity { :>> providedId = "CR-MED-003"; }
34
36
  attribute tailoring = RuleTailoringKind::assurance;
35
37
  attribute appliesTo = "RiskControlMeasure";
36
38
  attribute severity = RuleSeverityKind::error;
@@ -40,7 +42,7 @@ package memo_rules_closure {
40
42
  }
41
43
 
42
44
  constraint def InitialRiskMatrixRule :> MemoConsistencyRule {
43
- attribute id = "CR-MED-004";
45
+ @MemoIdentity { :>> providedId = "CR-MED-004"; }
44
46
  attribute tailoring = RuleTailoringKind::assurance;
45
47
  attribute appliesTo = "Risk";
46
48
  attribute severity = RuleSeverityKind::warning;
@@ -52,7 +54,7 @@ package memo_rules_closure {
52
54
  // ─── Requirements Layer Rules ────────────────────────────────────────
53
55
 
54
56
  constraint def SysReqTraceRule :> MemoConsistencyRule {
55
- attribute id = "CR-MED-010";
57
+ @MemoIdentity { :>> providedId = "CR-MED-010"; }
56
58
  attribute tailoring = RuleTailoringKind::assurance;
57
59
  attribute appliesTo = "Requirement[requirementKind=system]";
58
60
  attribute severity = RuleSeverityKind::error;
@@ -62,7 +64,7 @@ package memo_rules_closure {
62
64
  }
63
65
 
64
66
  constraint def SwReqTraceRule :> MemoConsistencyRule {
65
- attribute id = "CR-MED-011";
67
+ @MemoIdentity { :>> providedId = "CR-MED-011"; }
66
68
  attribute tailoring = RuleTailoringKind::assurance;
67
69
  attribute appliesTo = "Requirement[requirementKind=software]";
68
70
  attribute severity = RuleSeverityKind::error;
@@ -80,7 +82,7 @@ package memo_rules_closure {
80
82
  // ─── Architecture Layer Rules ────────────────────────────────────────
81
83
 
82
84
  constraint def SwComponentSafetyClassRule :> MemoConsistencyRule {
83
- attribute id = "CR-MED-020";
85
+ @MemoIdentity { :>> providedId = "CR-MED-020"; }
84
86
  attribute tailoring = RuleTailoringKind::assurance;
85
87
  attribute appliesTo = "SoftwareModule";
86
88
  attribute severity = RuleSeverityKind::error;
@@ -90,7 +92,7 @@ package memo_rules_closure {
90
92
  }
91
93
 
92
94
  constraint def SwComponentReqRule :> MemoConsistencyRule {
93
- attribute id = "CR-MED-021";
95
+ @MemoIdentity { :>> providedId = "CR-MED-021"; }
94
96
  attribute tailoring = RuleTailoringKind::assurance;
95
97
  attribute appliesTo = "SoftwareModule";
96
98
  attribute severity = RuleSeverityKind::warning;
@@ -100,7 +102,7 @@ package memo_rules_closure {
100
102
  }
101
103
 
102
104
  constraint def LogicalFunctionAllocationRule :> MemoConsistencyRule {
103
- attribute id = "CR-MED-022";
105
+ @MemoIdentity { :>> providedId = "CR-MED-022"; }
104
106
  attribute tailoring = RuleTailoringKind::assurance;
105
107
  attribute appliesTo = "SystemFunction";
106
108
  attribute severity = RuleSeverityKind::warning;
@@ -112,7 +114,7 @@ package memo_rules_closure {
112
114
  // ─── Verification Layer Rules ────────────────────────────────────────
113
115
 
114
116
  constraint def VerificationCaseMethodRule :> MemoConsistencyRule {
115
- attribute id = "CR-MED-030";
117
+ @MemoIdentity { :>> providedId = "CR-MED-030"; }
116
118
  attribute tailoring = RuleTailoringKind::assurance;
117
119
  attribute appliesTo = "VerificationCase";
118
120
  attribute severity = RuleSeverityKind::error;
@@ -122,7 +124,7 @@ package memo_rules_closure {
122
124
  }
123
125
 
124
126
  constraint def VerificationCaseTargetRule :> MemoConsistencyRule {
125
- attribute id = "CR-MED-031";
127
+ @MemoIdentity { :>> providedId = "CR-MED-031"; }
126
128
  attribute tailoring = RuleTailoringKind::assurance;
127
129
  attribute appliesTo = "VerificationCase";
128
130
  attribute severity = RuleSeverityKind::error;
@@ -132,7 +134,7 @@ package memo_rules_closure {
132
134
  }
133
135
 
134
136
  constraint def EvidenceProductionRule :> MemoConsistencyRule {
135
- attribute id = "CR-MED-032";
137
+ @MemoIdentity { :>> providedId = "CR-MED-032"; }
136
138
  attribute tailoring = RuleTailoringKind::assurance;
137
139
  attribute appliesTo = "VerificationCase";
138
140
  attribute severity = RuleSeverityKind::warning;
@@ -144,7 +146,7 @@ package memo_rules_closure {
144
146
  // ─── Cybersecurity Layer Rules ───────────────────────────────────────
145
147
 
146
148
  constraint def ThreatMitigationRule :> MemoConsistencyRule {
147
- attribute id = "CR-MED-040";
149
+ @MemoIdentity { :>> providedId = "CR-MED-040"; }
148
150
  attribute tailoring = RuleTailoringKind::assurance;
149
151
  attribute appliesTo = "Threat";
150
152
  attribute severity = RuleSeverityKind::error;
@@ -154,7 +156,7 @@ package memo_rules_closure {
154
156
  }
155
157
 
156
158
  constraint def AssetThreatLinkRule :> MemoConsistencyRule {
157
- attribute id = "CR-MED-041";
159
+ @MemoIdentity { :>> providedId = "CR-MED-041"; }
158
160
  attribute tailoring = RuleTailoringKind::assurance;
159
161
  attribute appliesTo = "CybersecurityAsset";
160
162
  attribute severity = RuleSeverityKind::warning;
@@ -166,7 +168,7 @@ package memo_rules_closure {
166
168
  // ─── Interface Rules ─────────────────────────────────────────────────
167
169
 
168
170
  constraint def LogicalInterfaceDirectionRule :> MemoConsistencyRule {
169
- attribute id = "CR-MED-050";
171
+ @MemoIdentity { :>> providedId = "CR-MED-050"; }
170
172
  attribute tailoring = RuleTailoringKind::assurance;
171
173
  attribute appliesTo = "Interface";
172
174
  attribute severity = RuleSeverityKind::error;
@@ -178,7 +180,7 @@ package memo_rules_closure {
178
180
  // ─── Conditional Rules ───────────────────────────────────────────────
179
181
 
180
182
  constraint def SafetyClassCVerificationRule :> MemoConsistencyRule {
181
- attribute id = "CR-MED-101";
183
+ @MemoIdentity { :>> providedId = "CR-MED-101"; }
182
184
  attribute tailoring = RuleTailoringKind::assurance;
183
185
  attribute appliesTo = "SoftwareModule";
184
186
  attribute severity = RuleSeverityKind::error;
@@ -203,7 +205,7 @@ package memo_rules_closure {
203
205
  // triggers. Chrome must be DECLARED `decoration`; an element left
204
206
  // unclassified fails rather than passing as scenery.
205
207
  constraint def UiElementDesignRecordRule :> MemoConsistencyRule {
206
- attribute id = "CR-MED-110";
208
+ @MemoIdentity { :>> providedId = "CR-MED-110"; }
207
209
  attribute tailoring = RuleTailoringKind::assurance;
208
210
  attribute appliesTo = "UIElement";
209
211
  attribute severity = RuleSeverityKind::error;
@@ -217,7 +219,7 @@ package memo_rules_closure {
217
219
  // The interactive-form restriction lives in the predicate because it spans
218
220
  // several enum values.
219
221
  constraint def ControlInvokesFunctionRule :> MemoConsistencyRule {
220
- attribute id = "CR-MED-111";
222
+ @MemoIdentity { :>> providedId = "CR-MED-111"; }
221
223
  attribute tailoring = RuleTailoringKind::assurance;
222
224
  attribute appliesTo = "UIElement";
223
225
  attribute severity = RuleSeverityKind::warning;
@@ -230,7 +232,7 @@ package memo_rules_closure {
230
232
  // unconfirmed machine guess must never reach a design review looking like
231
233
  // an engineering decision.
232
234
  constraint def BoundsDetectionConfirmedRule :> MemoConsistencyRule {
233
- attribute id = "CR-MED-112";
235
+ @MemoIdentity { :>> providedId = "CR-MED-112"; }
234
236
  attribute tailoring = RuleTailoringKind::assurance;
235
237
  attribute appliesTo = "UIElement";
236
238
  attribute severity = RuleSeverityKind::warning;
@@ -242,7 +244,7 @@ package memo_rules_closure {
242
244
  // A screenshot with no build behind it is undated design intent, not
243
245
  // evidence of what the device does.
244
246
  constraint def ScreenCaptureProvenanceRule :> MemoConsistencyRule {
245
- attribute id = "CR-MED-113";
247
+ @MemoIdentity { :>> providedId = "CR-MED-113"; }
246
248
  attribute tailoring = RuleTailoringKind::assurance;
247
249
  attribute appliesTo = "ScreenCapture";
248
250
  attribute severity = RuleSeverityKind::error;
@@ -6,8 +6,10 @@ package memo_rules_crosslayer {
6
6
  private import memo_core_consistency_rules::*;
7
7
  private import memo_core_enumerations::*;
8
8
 
9
+ private import memo_core_common::*;
10
+ private import memo_core_common::MemoIdentity;
9
11
  constraint def RiskToReqTraceRule :> MemoConsistencyRule {
10
- attribute id = "XL-001";
12
+ @MemoIdentity { :>> providedId = "XL-001"; }
11
13
  attribute tailoring = RuleTailoringKind::assurance;
12
14
  attribute appliesTo = "Hazard";
13
15
  attribute severity = RuleSeverityKind::warning;
@@ -17,7 +19,7 @@ package memo_rules_crosslayer {
17
19
  }
18
20
 
19
21
  constraint def ReqToArchTraceRule :> MemoConsistencyRule {
20
- attribute id = "XL-002";
22
+ @MemoIdentity { :>> providedId = "XL-002"; }
21
23
  attribute tailoring = RuleTailoringKind::assurance;
22
24
  attribute appliesTo = "Requirement[requirementKind=system]";
23
25
  attribute severity = RuleSeverityKind::warning;
@@ -9,10 +9,12 @@ package memo_rules_ontology {
9
9
  private import memo_core_consistency_rules::*;
10
10
  private import memo_core_enumerations::*;
11
11
 
12
+ private import memo_core_common::*;
13
+ private import memo_core_common::MemoIdentity;
12
14
  // ─── Structure ───────────────────────────────────────────────────────
13
15
 
14
16
  constraint def ContainmentAcyclicRule :> MemoConsistencyRule {
15
- attribute id = "CR-ONT-001";
17
+ @MemoIdentity { :>> providedId = "CR-ONT-001"; }
16
18
  attribute tailoring = RuleTailoringKind::invariant;
17
19
  attribute appliesTo = "Model";
18
20
  attribute severity = RuleSeverityKind::error;
@@ -21,7 +23,7 @@ package memo_rules_ontology {
21
23
  constraint { true }
22
24
  }
23
25
  constraint def NestedPartConnectedRule :> MemoConsistencyRule {
24
- attribute id = "AR-IBD-001";
26
+ @MemoIdentity { :>> providedId = "AR-IBD-001"; }
25
27
  attribute tailoring = RuleTailoringKind::invariant;
26
28
  // Internal-block connectivity is a structural-architecture concern, so
27
29
  // the subject is the structural component — not every MemoPart. UI
@@ -44,7 +46,7 @@ package memo_rules_ontology {
44
46
  // ─── Deployment and realization ──────────────────────────────────────
45
47
 
46
48
  constraint def RuntimeTracesToModuleRule :> MemoConsistencyRule {
47
- attribute id = "CR-ONT-011";
49
+ @MemoIdentity { :>> providedId = "CR-ONT-011"; }
48
50
  attribute tailoring = RuleTailoringKind::invariant;
49
51
  attribute appliesTo = "SoftwareComponent";
50
52
  attribute severity = RuleSeverityKind::warning;
@@ -53,7 +55,7 @@ package memo_rules_ontology {
53
55
  constraint { true }
54
56
  }
55
57
  constraint def PatientContactCharacterizedRule :> MemoConsistencyRule {
56
- attribute id = "CR-ONT-032";
58
+ @MemoIdentity { :>> providedId = "CR-ONT-032"; }
57
59
  attribute tailoring = RuleTailoringKind::invariant;
58
60
  attribute appliesTo = "PhysicalComponent";
59
61
  attribute severity = RuleSeverityKind::error;
@@ -65,7 +67,7 @@ package memo_rules_ontology {
65
67
  // ─── Assurance coverage ──────────────────────────────────────────────
66
68
 
67
69
  constraint def SafetyCriticalFunctionVerifiedRule :> MemoConsistencyRule {
68
- attribute id = "CR-ONT-040";
70
+ @MemoIdentity { :>> providedId = "CR-ONT-040"; }
69
71
  attribute tailoring = RuleTailoringKind::invariant;
70
72
  attribute appliesTo = "MemoFunction";
71
73
  attribute severity = RuleSeverityKind::error;
@@ -74,16 +76,16 @@ package memo_rules_ontology {
74
76
  constraint { true }
75
77
  }
76
78
  constraint def CriticalTaskValidatedRule :> MemoConsistencyRule {
77
- attribute id = "CR-ONT-041";
79
+ @MemoIdentity { :>> providedId = "CR-ONT-041"; }
78
80
  attribute tailoring = RuleTailoringKind::invariant;
79
- attribute appliesTo = "UserTask[criticality=high]";
81
+ attribute appliesTo = "OperativeAction[criticality=high]";
80
82
  attribute severity = RuleSeverityKind::error;
81
83
  attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
82
84
  attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or validates->size() >= 1";
83
85
  constraint { true }
84
86
  }
85
87
  constraint def UseErrorTracesToHazardRule :> MemoConsistencyRule {
86
- attribute id = "CR-ONT-042";
88
+ @MemoIdentity { :>> providedId = "CR-ONT-042"; }
87
89
  attribute tailoring = RuleTailoringKind::invariant;
88
90
  attribute appliesTo = "UseError";
89
91
  attribute severity = RuleSeverityKind::warning;
@@ -113,9 +115,9 @@ package memo_rules_ontology {
113
115
  // Several of these are WIDER than the end they replace, and deliberately so:
114
116
  // the ends were being violated by content that already shipped. `composes`
115
117
  // was typed MemoPart/MemoPart and links StateMachine (a state def) to
116
- // WorkflowStep (an action def); `verifiedBy`'s source was typed MemoPart and
118
+ // OperativeAction (an action def); `verifiedBy`'s source was typed MemoPart and
117
119
  // most of its sources are requirement defs; `precedes` was typed
118
- // ArchitectureElement and joins OperationalActivity to OperationalActivity.
120
+ // a part-only type and joins OperativeAction to OperativeAction.
119
121
  // A rule that reproduced the old type exactly would have failed on the
120
122
  // flagship example on the day it landed. What each rule asserts is the
121
123
  // constraint the end MEANT, stated so it can be checked.
@@ -127,7 +129,7 @@ package memo_rules_ontology {
127
129
  // and the admissible types so the report is still actionable.
128
130
 
129
131
  constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
130
- attribute id = "CR-ONT-060";
132
+ @MemoIdentity { :>> providedId = "CR-ONT-060"; }
131
133
  attribute tailoring = RuleTailoringKind::invariant;
132
134
  attribute appliesTo = "Model";
133
135
  attribute severity = RuleSeverityKind::error;
@@ -136,16 +138,16 @@ package memo_rules_ontology {
136
138
  constraint { true }
137
139
  }
138
140
  constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
139
- attribute id = "CR-ONT-061";
141
+ @MemoIdentity { :>> providedId = "CR-ONT-061"; }
140
142
  attribute tailoring = RuleTailoringKind::invariant;
141
143
  attribute appliesTo = "Model";
142
144
  attribute severity = RuleSeverityKind::error;
143
- attribute rationaleText = "A requirement is satisfied by a designed thing: an architecture element, an actor, a behaviour, or a port. Never by another requirement or by a document.";
144
- attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor) or construct == 'action' or construct == 'port')";
145
+ attribute rationaleText = "A requirement is satisfied by a designed part, a behaviour, or a port. Never by another requirement or by a document.";
146
+ attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'port')";
145
147
  constraint { true }
146
148
  }
147
149
  constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
148
- attribute id = "CR-ONT-062";
150
+ @MemoIdentity { :>> providedId = "CR-ONT-062"; }
149
151
  attribute tailoring = RuleTailoringKind::invariant;
150
152
  attribute appliesTo = "Model";
151
153
  attribute severity = RuleSeverityKind::error;
@@ -154,25 +156,25 @@ package memo_rules_ontology {
154
156
  constraint { true }
155
157
  }
156
158
  constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
157
- attribute id = "CR-ONT-063";
159
+ @MemoIdentity { :>> providedId = "CR-ONT-063"; }
158
160
  attribute tailoring = RuleTailoringKind::invariant;
159
161
  attribute appliesTo = "Model";
160
162
  attribute severity = RuleSeverityKind::error;
161
- attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is an architecture element or an action.";
162
- attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
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')";
163
165
  constraint { true }
164
166
  }
165
167
  constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
166
- attribute id = "CR-ONT-064";
168
+ @MemoIdentity { :>> providedId = "CR-ONT-064"; }
167
169
  attribute tailoring = RuleTailoringKind::invariant;
168
170
  attribute appliesTo = "Model";
169
171
  attribute severity = RuleSeverityKind::error;
170
- attribute rationaleText = "A function is allocated to an architecture element or to an actor — ARCADIA System Analysis allocates to the system OR to an actor, which the former ArchitectureElement-typed end made impossible.";
171
- attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor))";
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))";
172
174
  constraint { true }
173
175
  }
174
176
  constraint def ComposesParentKindRule :> MemoConsistencyRule {
175
- attribute id = "CR-ONT-065";
177
+ @MemoIdentity { :>> providedId = "CR-ONT-065"; }
176
178
  attribute tailoring = RuleTailoringKind::invariant;
177
179
  attribute appliesTo = "Model";
178
180
  attribute severity = RuleSeverityKind::error;
@@ -181,7 +183,7 @@ package memo_rules_ontology {
181
183
  constraint { true }
182
184
  }
183
185
  constraint def ComposesChildKindRule :> MemoConsistencyRule {
184
- attribute id = "CR-ONT-066";
186
+ @MemoIdentity { :>> providedId = "CR-ONT-066"; }
185
187
  attribute tailoring = RuleTailoringKind::invariant;
186
188
  attribute appliesTo = "Model";
187
189
  attribute severity = RuleSeverityKind::error;
@@ -190,16 +192,16 @@ package memo_rules_ontology {
190
192
  constraint { true }
191
193
  }
192
194
  constraint def PrecedesEndKindRule :> MemoConsistencyRule {
193
- attribute id = "CR-ONT-067";
195
+ @MemoIdentity { :>> providedId = "CR-ONT-067"; }
194
196
  attribute tailoring = RuleTailoringKind::invariant;
195
197
  attribute appliesTo = "Model";
196
198
  attribute severity = RuleSeverityKind::error;
197
- attribute rationaleText = "Precedence orders things that happen: architecture elements or behaviours, at both ends.";
198
- attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action') and targetsOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
199
+ attribute rationaleText = "Precedence orders things that happen: parts or behaviours, at both ends.";
200
+ attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(MemoPart) or construct == 'action') and targetsOf(precedes)->forAll(conformsTo(MemoPart) or construct == 'action')";
199
201
  constraint { true }
200
202
  }
201
203
  constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
202
- attribute id = "CR-ONT-068";
204
+ @MemoIdentity { :>> providedId = "CR-ONT-068"; }
203
205
  attribute tailoring = RuleTailoringKind::invariant;
204
206
  attribute appliesTo = "Model";
205
207
  attribute severity = RuleSeverityKind::error;
@@ -207,17 +209,8 @@ package memo_rules_ontology {
207
209
  attribute predicateExpression = "sourcesOf(performs)->forAll(conformsTo(MemoPart) or construct == 'action')";
208
210
  constraint { true }
209
211
  }
210
- constraint def EnablesEnablerKindRule :> MemoConsistencyRule {
211
- attribute id = "CR-ONT-069";
212
- attribute tailoring = RuleTailoringKind::invariant;
213
- attribute appliesTo = "Model";
214
- attribute severity = RuleSeverityKind::error;
215
- attribute rationaleText = "An enabling system or function enables a workflow: the enabling end is a part or a behaviour.";
216
- attribute predicateExpression = "sourcesOf(enables)->forAll(conformsTo(MemoPart) or construct == 'action')";
217
- constraint { true }
218
- }
219
212
  constraint def BindsToInterfaceEndKindRule :> MemoConsistencyRule {
220
- attribute id = "CR-ONT-070";
213
+ @MemoIdentity { :>> providedId = "CR-ONT-070"; }
221
214
  attribute tailoring = RuleTailoringKind::invariant;
222
215
  attribute appliesTo = "Model";
223
216
  attribute severity = RuleSeverityKind::error;
@@ -226,12 +219,12 @@ package memo_rules_ontology {
226
219
  constraint { true }
227
220
  }
228
221
  constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
229
- attribute id = "CR-ONT-071";
222
+ @MemoIdentity { :>> providedId = "CR-ONT-071"; }
230
223
  attribute tailoring = RuleTailoringKind::invariant;
231
224
  attribute appliesTo = "Model";
232
225
  attribute severity = RuleSeverityKind::error;
233
226
  attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange item.";
234
- attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(ArchitectureElement) or construct == 'item')";
227
+ attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item')";
235
228
  constraint { true }
236
229
  }
237
230
 
@@ -241,21 +234,21 @@ package memo_rules_ontology {
241
234
  // reached with sourcesOf/targetsOf. They are resolved here by looking the id
242
235
  // up in the kind extent, which is the same statement made the long way.
243
236
  constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
244
- attribute id = "CR-ONT-072";
237
+ @MemoIdentity { :>> providedId = "CR-ONT-072"; }
245
238
  attribute tailoring = RuleTailoringKind::invariant;
246
239
  attribute appliesTo = "ComponentExchange";
247
240
  attribute severity = RuleSeverityKind::error;
248
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.";
249
- attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.sourceEndpoint)";
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)";
250
243
  constraint { true }
251
244
  }
252
245
  constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
253
- attribute id = "CR-ONT-073";
246
+ @MemoIdentity { :>> providedId = "CR-ONT-073"; }
254
247
  attribute tailoring = RuleTailoringKind::invariant;
255
248
  attribute appliesTo = "ComponentExchange";
256
249
  attribute severity = RuleSeverityKind::error;
257
250
  attribute rationaleText = "An exchange ends at a component or at a boundary port, on the same grounds as CR-ONT-072.";
258
- attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.targetEndpoint)";
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)";
259
252
  constraint { true }
260
253
  }
261
254
 
@@ -266,7 +259,7 @@ package memo_rules_ontology {
266
259
  // "answerable to exactly one component" is the whole content of the concept.
267
260
 
268
261
  constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
269
- attribute id = "CR-ONT-074";
262
+ @MemoIdentity { :>> providedId = "CR-ONT-074"; }
270
263
  attribute tailoring = RuleTailoringKind::invariant;
271
264
  attribute appliesTo = "ComponentFunction";
272
265
  attribute severity = RuleSeverityKind::error;
@@ -275,7 +268,7 @@ package memo_rules_ontology {
275
268
  constraint { true }
276
269
  }
277
270
  constraint def FunctionDecomposesIntoFunctionsRule :> MemoConsistencyRule {
278
- attribute id = "CR-ONT-075";
271
+ @MemoIdentity { :>> providedId = "CR-ONT-075"; }
279
272
  attribute tailoring = RuleTailoringKind::invariant;
280
273
  attribute appliesTo = "MemoFunction";
281
274
  attribute severity = RuleSeverityKind::error;
@@ -284,6 +277,59 @@ package memo_rules_ontology {
284
277
  constraint { true }
285
278
  }
286
279
 
280
+ // ── Containment stays inside one family ─────────────────────────────
281
+ //
282
+ // CR-ONT-075 above is this rule for functions; these are the same shape for
283
+ // the other families. The invariant is FAMILY homogeneity, not type
284
+ // homogeneity: a System containing a Subsystem containing a LogicalComponent
285
+ // is correct decomposition even though all three types differ, and measured
286
+ // 2026-08-18 only 1 of 68 containment edges had identical types at both
287
+ // ends — a same-type rule would have rejected 98.5% of the corpus, the
288
+ // ontology's own templates included.
289
+ //
290
+ // What they catch is containment CROSSING a family: a logical component
291
+ // "containing" a software module is realization, and a hardware assembly
292
+ // "containing" a function is allocation. Both have their own relation, and
293
+ // writing them as containment loses the distinction.
294
+ //
295
+ // They read the `composes` edge, which the builder synthesizes from native
296
+ // nesting, so they cover the nesting spelling and the retired connection
297
+ // form identically.
298
+ //
299
+ // Ports are exempt. A port is a boundary FEATURE of its owner, not a member
300
+ // of its owner's family, and any element may carry one whatever family it
301
+ // is in — CR-ONT-065/066 already govern what may sit at a containment end.
302
+ // Without the exemption these rules reject `SoftwareModule composes
303
+ // PhysicalPort`, which those rules accept, and the ontology contradicts
304
+ // itself about a single edge.
305
+ constraint def SoftwareContainsSoftwareRule :> MemoConsistencyRule {
306
+ @MemoIdentity { :>> providedId = "CR-ONT-077"; }
307
+ attribute tailoring = RuleTailoringKind::invariant;
308
+ attribute appliesTo = "SoftwareElement";
309
+ attribute severity = RuleSeverityKind::error;
310
+ 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))";
312
+ constraint { true }
313
+ }
314
+ constraint def LogicalContainsLogicalRule :> MemoConsistencyRule {
315
+ @MemoIdentity { :>> providedId = "CR-ONT-078"; }
316
+ attribute tailoring = RuleTailoringKind::invariant;
317
+ attribute appliesTo = "LogicalComponent";
318
+ attribute severity = RuleSeverityKind::error;
319
+ 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))";
321
+ constraint { true }
322
+ }
323
+ constraint def PhysicalContainsPhysicalRule :> MemoConsistencyRule {
324
+ @MemoIdentity { :>> providedId = "CR-ONT-079"; }
325
+ attribute tailoring = RuleTailoringKind::invariant;
326
+ attribute appliesTo = "PhysicalElement";
327
+ attribute severity = RuleSeverityKind::error;
328
+ 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))";
330
+ constraint { true }
331
+ }
332
+
287
333
  // Track A3. The flow is the edge; the exchange part carries the budget and
288
334
  // assurance attributes. The two halves are bound by a SHARED NAME — the flow
289
335
  // usage is named with its exchange — and this is what makes that binding a
@@ -294,7 +340,7 @@ package memo_rules_ontology {
294
340
  // the ends and can never answer it. Naming the flow is what the grammar's
295
341
  // restored FlowDeclaration name makes possible at all.
296
342
  constraint def ExchangeHasFlowRule :> MemoConsistencyRule {
297
- attribute id = "CR-ONT-076";
343
+ @MemoIdentity { :>> providedId = "CR-ONT-076"; }
298
344
  attribute tailoring = RuleTailoringKind::invariant;
299
345
  attribute appliesTo = "ComponentExchange";
300
346
  attribute severity = RuleSeverityKind::error;
@@ -304,12 +350,39 @@ package memo_rules_ontology {
304
350
  }
305
351
 
306
352
  constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
307
- attribute id = "CR-ONT-043";
353
+ @MemoIdentity { :>> providedId = "CR-ONT-043"; }
308
354
  attribute tailoring = RuleTailoringKind::invariant;
309
- attribute appliesTo = "MemoScenario";
355
+ attribute appliesTo = "OperativeScenario";
310
356
  attribute severity = RuleSeverityKind::error;
311
357
  attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
312
358
  attribute predicateExpression = "not(variantKind == 'alternate' or variantKind == 'exception' or variantKind == 'recovery') or baseScenario->size() == 1 or variationPoint != ''";
313
359
  constraint { true }
314
360
  }
361
+
362
+ // ─── Assurance-trace warnings ────────────────────────────────────────
363
+ // Both are WARNINGS, not errors: each describes a trace graph that is
364
+ // suspicious rather than invalid, and a regulated model has legitimate
365
+ // exceptions to both. They needed `upstream` / `downstream` — the bare
366
+ // relation name is bidirectional, so before those existed no rule could
367
+ // ask which way a derivation ran.
368
+
369
+ constraint def DerivationGapRule :> MemoConsistencyRule {
370
+ @MemoIdentity { :>> providedId = "CR-ONT-080"; }
371
+ attribute tailoring = RuleTailoringKind::invariant;
372
+ attribute appliesTo = "MemoRequirementElement";
373
+ attribute severity = RuleSeverityKind::warning;
374
+ 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.";
375
+ attribute predicateExpression = "downstream(derivesFrom)->isEmpty() or upstream(derivesFrom)->notEmpty() or conformsTo(MemoNeed)";
376
+ constraint { true }
377
+ }
378
+
379
+ constraint def RedundantAncestorTraceRule :> MemoConsistencyRule {
380
+ @MemoIdentity { :>> providedId = "CR-ONT-081"; }
381
+ attribute tailoring = RuleTailoringKind::invariant;
382
+ attribute appliesTo = "MemoRequirementElement";
383
+ attribute severity = RuleSeverityKind::warning;
384
+ 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.";
385
+ attribute predicateExpression = "not satisfiedBy->intersects(downstream(derivesFrom).satisfiedBy)";
386
+ constraint { true }
387
+ }
315
388
  }
@@ -6,8 +6,10 @@ package memo_rules_quantitative {
6
6
  private import memo_core_consistency_rules::*;
7
7
  private import memo_core_enumerations::*;
8
8
 
9
+ private import memo_core_common::*;
10
+ private import memo_core_common::MemoIdentity;
9
11
  constraint def HazardMaxControlsRule :> MemoConsistencyRule {
10
- attribute id = "QT-001";
12
+ @MemoIdentity { :>> providedId = "QT-001"; }
11
13
  attribute tailoring = RuleTailoringKind::assurance;
12
14
  attribute appliesTo = "Hazard";
13
15
  attribute severity = RuleSeverityKind::info;
@@ -17,7 +19,7 @@ package memo_rules_quantitative {
17
19
  }
18
20
 
19
21
  constraint def SwComponentMaxInterfacesRule :> MemoConsistencyRule {
20
- attribute id = "QT-002";
22
+ @MemoIdentity { :>> providedId = "QT-002"; }
21
23
  attribute tailoring = RuleTailoringKind::assurance;
22
24
  attribute appliesTo = "SoftwareModule";
23
25
  attribute severity = RuleSeverityKind::info;