@memoarchitect/ontology 0.4.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +5 -4
  2. package/examples/connected-patient-monitor/README.md +7 -0
  3. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +70 -0
  4. package/examples/connected-patient-monitor/model/connected_patient_monitor.sysml +3 -0
  5. package/examples/connected-patient-monitor/model/viewpoints/connected_patient_monitor_overview.sysml +6 -0
  6. package/examples/embedded-infusion-pump/README.md +7 -0
  7. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +66 -0
  8. package/examples/embedded-infusion-pump/model/embedded_infusion_pump.sysml +3 -0
  9. package/examples/embedded-infusion-pump/model/viewpoints/embedded_infusion_pump_overview.sysml +6 -0
  10. package/examples/extensions/README.md +16 -0
  11. package/examples/extensions/clinical/memo.package.yaml +9 -0
  12. package/examples/extensions/clinical/src/clinical_extension.sysml +3 -0
  13. package/examples/extensions/clinical/src/methodology/clinical_methodology.sysml +14 -0
  14. package/examples/extensions/clinical/src/procedures/memo_clinical_procedures.sysml +16 -0
  15. package/examples/extensions/template/memo.package.yaml +9 -0
  16. package/examples/extensions/template/src/extension.sysml +15 -0
  17. package/examples/functional-logical-physical/README.md +7 -0
  18. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +50 -0
  19. package/examples/functional-logical-physical/model/functional_logical_physical.sysml +3 -0
  20. package/examples/functional-logical-physical/model/viewpoints/functional_logical_physical_overview.sysml +6 -0
  21. package/examples/gpca-pump/README.md +26 -0
  22. package/examples/gpca-pump/dhf/documents/DOC-RMP-001.md +1 -1
  23. package/examples/gpca-pump/memo.config.yaml +2 -2
  24. package/examples/gpca-pump/methodology/gpca_profiles.sysml +1 -1
  25. package/examples/gpca-pump/methodology/gpca_scope.sysml +2 -2
  26. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +1 -1
  27. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +10 -10
  28. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +17 -6
  29. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +11 -11
  30. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +35 -22
  31. package/examples/gpca-pump/model/catalog/gpca_context.sysml +25 -6
  32. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +6 -6
  33. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +29 -15
  34. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +293 -169
  35. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +139 -21
  36. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +1 -1
  37. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +210 -105
  38. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +66 -69
  39. package/examples/gpca-pump/model/catalog/gpca_system.sysml +43 -76
  40. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +73 -70
  41. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +27 -27
  42. package/examples/gpca-pump/model/views/context_system_context_view.sysml +2 -2
  43. package/examples/gpca-pump/model/views/document_architecture_description_view.sysml +2 -2
  44. package/examples/gpca-pump/model/views/document_cyber_assessment_view.sysml +2 -2
  45. package/examples/gpca-pump/model/views/document_hazard_analysis_view.sysml +1 -1
  46. package/examples/gpca-pump/model/views/document_rmf_view.sysml +2 -2
  47. package/examples/gpca-pump/model/views/document_sdd_view.sysml +2 -2
  48. package/examples/gpca-pump/model/views/document_threat_model_view.sysml +1 -1
  49. package/examples/gpca-pump/model/views/document_usability_view.sysml +1 -1
  50. package/examples/gpca-pump/model/views/document_vv_view.sysml +1 -1
  51. package/examples/gpca-pump/model/views/functional_function_allocation_view.sysml +1 -1
  52. package/examples/gpca-pump/model/views/functional_function_browser_view.sysml +1 -1
  53. package/examples/gpca-pump/model/views/logical_device_interconnect_view.sysml +1 -1
  54. package/examples/gpca-pump/model/views/logical_mode_state_view.sysml +1 -1
  55. package/examples/gpca-pump/model/views/logical_system_decomposition_view.sysml +1 -1
  56. package/examples/gpca-pump/model/views/operational_scenario_sequence_view.sysml +1 -1
  57. package/examples/gpca-pump/model/views/operational_use_case_view.sysml +6 -6
  58. package/examples/gpca-pump/model/views/physical_physical_bom_view.sysml +1 -1
  59. package/examples/gpca-pump/model/views/requirements_requirements_trace_view.sysml +1 -1
  60. package/examples/gpca-pump/model/views/risk_risk_chain_view.sysml +2 -2
  61. package/examples/gpca-pump/model/views/software_software_architecture_view.sysml +1 -1
  62. package/examples/gpca-pump/model/views/verification_verification_coverage_view.sysml +1 -1
  63. package/examples/ivd-laboratory-system/README.md +7 -0
  64. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +58 -0
  65. package/examples/ivd-laboratory-system/model/ivd_laboratory_system.sysml +3 -0
  66. package/examples/ivd-laboratory-system/model/viewpoints/ivd_laboratory_system_overview.sysml +6 -0
  67. package/examples/manual-surgical-instrument/README.md +7 -0
  68. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +41 -0
  69. package/examples/manual-surgical-instrument/model/manual_surgical_instrument.sysml +3 -0
  70. package/examples/manual-surgical-instrument/model/viewpoints/manual_surgical_instrument_overview.sysml +6 -0
  71. package/examples/multidimensional-layers/README.md +7 -0
  72. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +51 -0
  73. package/examples/multidimensional-layers/model/multidimensional_layers.sysml +4 -0
  74. package/examples/multidimensional-layers/model/viewpoints/multidimensional_layers_overview.sysml +13 -0
  75. package/examples/reusable-instrument/README.md +7 -0
  76. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +71 -0
  77. package/examples/reusable-instrument/model/reusable_instrument.sysml +4 -0
  78. package/examples/reusable-instrument/model/viewpoints/reusable_instrument_overview.sysml +13 -0
  79. package/examples/software-only-medical-device/README.md +7 -0
  80. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +62 -0
  81. package/examples/software-only-medical-device/model/software_only_medical_device.sysml +4 -0
  82. package/examples/software-only-medical-device/model/viewpoints/software_only_medical_device_overview.sysml +13 -0
  83. package/examples/surgical-closure-workflow/README.md +8 -0
  84. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +151 -0
  85. package/examples/surgical-closure-workflow/model/surgical_closure_workflow.sysml +4 -0
  86. package/examples/surgical-closure-workflow/model/viewpoints/surgical_closure_workflow_overview.sysml +13 -0
  87. package/examples/surgical-robot/README.md +7 -0
  88. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +58 -0
  89. package/examples/surgical-robot/model/surgical_robot.sysml +4 -0
  90. package/examples/surgical-robot/model/viewpoints/surgical_robot_overview.sysml +13 -0
  91. package/examples/sysml-diagram-samples/README.md +32 -0
  92. package/examples/sysml-diagram-samples/memo.package.yaml +5 -0
  93. package/examples/{gpca-pump → sysml-diagram-samples}/model/samples/action_flow_view.sysml +22 -4
  94. package/examples/sysml-diagram-samples/model/samples/context_view.sysml +55 -0
  95. package/examples/{gpca-pump → sysml-diagram-samples}/model/samples/functional_flow_view.sysml +17 -6
  96. package/examples/{gpca-pump → sysml-diagram-samples}/model/samples/interconnection_view.sysml +4 -3
  97. package/examples/{gpca-pump → sysml-diagram-samples}/model/samples/operational_behaviour_view.sysml +32 -42
  98. package/examples/sysml-diagram-samples/model/samples/requirements_view.sysml +63 -0
  99. package/examples/sysml-diagram-samples/model/samples/state_transition_view.sysml +109 -0
  100. package/examples/{gpca-pump → sysml-diagram-samples}/model/samples/tree_view.sysml +3 -3
  101. package/examples/sysml-diagram-samples/model/samples/use_case_view.sysml +81 -0
  102. package/examples/temperature-alarm/README.md +7 -0
  103. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +140 -0
  104. package/examples/temperature-alarm/model/temperature_alarm.sysml +4 -0
  105. package/examples/temperature-alarm/model/viewpoints/temperature_alarm_overview.sysml +13 -0
  106. package/memo.manifest.yaml +4 -1
  107. package/methodologies/default/memo.package.yaml +1 -1
  108. package/methodologies/gpca/memo.package.yaml +4 -4
  109. package/ontology/memo.package.yaml +1 -1
  110. package/ontology/memo.rendering.yaml +37 -0
  111. package/package.json +17 -7
  112. package/profile/memo.package.yaml +1 -1
  113. package/profile/templates/connected-device/starter.sysml +3 -3
  114. package/profile/templates/infusion-pump/starter.sysml +3 -3
  115. package/profile/templates/monitoring-device/starter.sysml +3 -3
  116. package/profile/templates/samd/starter.sysml +3 -3
  117. package/src/architecture/decisions/memo_decisions.sysml +1 -1
  118. package/src/architecture/{behavior → functional/behavior}/memo_behavior.sysml +12 -11
  119. package/src/architecture/{constraints → functional/constraints}/memo_constraints.sysml +2 -2
  120. package/src/architecture/functional/functions/memo_functions.sysml +81 -0
  121. package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +46 -0
  122. package/src/architecture/implementation/hardware/electrical/memo_hardware_electrical.sysml +36 -0
  123. package/src/architecture/implementation/hardware/fluidic/memo_hardware_fluidic.sysml +14 -0
  124. package/src/architecture/implementation/hardware/mechanical/memo_hardware_mechanical.sysml +14 -0
  125. package/src/architecture/implementation/hardware/optical/memo_hardware_optical.sysml +11 -0
  126. package/src/architecture/implementation/hardware/sensing/memo_hardware_sensing.sysml +17 -0
  127. package/src/architecture/implementation/hardware/structure/memo_hardware_structure.sysml +12 -0
  128. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +70 -0
  129. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +80 -0
  130. package/src/architecture/implementation/ui/memo_ui.sysml +159 -0
  131. package/src/architecture/logical/interfaces/memo_interfaces.sysml +102 -0
  132. package/src/architecture/logical/structure/memo_logical_structure.sysml +150 -0
  133. package/src/architecture/operational/activities/memo_activities.sysml +86 -0
  134. package/src/architecture/operational/context/actors/memo_actors.sysml +38 -0
  135. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +64 -0
  136. package/src/architecture/operational/context/use_context/memo_use_context.sysml +53 -0
  137. package/src/architecture/operational/scenarios/memo_scenarios.sysml +116 -0
  138. package/src/architecture/operational/structure/memo_operational.sysml +26 -0
  139. package/src/architecture/operational/use_cases/memo_use_cases.sysml +67 -0
  140. package/src/architecture/operational/workflows/memo_workflows.sysml +126 -0
  141. package/src/architecture/realization/deployment/memo_deployment.sysml +90 -0
  142. package/src/architecture/{physical → realization/physical}/memo_physical_architecture.sysml +12 -1
  143. package/src/artifacts/definitions/memo_artifact_definitions.sysml +1 -1
  144. package/src/{architecture → assurance}/cybersecurity/memo_cybersecurity.sysml +14 -10
  145. package/src/assurance/human_factors/memo_human_factors.sysml +50 -0
  146. package/src/{architecture → assurance}/requirements/memo_requirements.sysml +45 -21
  147. package/src/assurance/requirements/needs/memo_needs.sysml +43 -0
  148. package/src/{architecture → assurance/safety_risk}/analysis/memo_fmea.sysml +13 -13
  149. package/src/{architecture/risk → assurance/safety_risk}/memo_arch_risk.sysml +2 -2
  150. package/src/{architecture/risk → assurance/safety_risk}/memo_risk.sysml +25 -16
  151. package/src/assurance/verification_validation/memo_assurance.sysml +49 -0
  152. package/src/compliance/artifacts/memo_artifacts.sysml +1 -1
  153. package/src/compliance/change/memo_change.sysml +2 -2
  154. package/src/compliance/dhf-templates/21cfr820/design-input.md +1 -1
  155. package/src/compliance/dhf-templates/21cfr820/design-validation.md +1 -1
  156. package/src/compliance/dhf-templates/21cfr820/user-needs.md +2 -2
  157. package/src/compliance/dhf-templates/iec-62366/urra.md +1 -1
  158. package/src/compliance/dhf-templates/iso-14971/fmea.md +1 -1
  159. package/src/compliance/dhf-templates/iso-14971/har.md +4 -4
  160. package/src/compliance/dhf-templates/iso-14971/risk-matrix.md +1 -1
  161. package/src/compliance/dhf-templates/iso-14971/rmp.md +1 -1
  162. package/src/compliance/dhf-templates/iso-14971/rmr.md +1 -1
  163. package/src/compliance/iso14971/risk_management_file.sysml +1 -1
  164. package/src/compliance/postmarket/memo_postmarket.sysml +2 -2
  165. package/src/core/common/memo_common.sysml +123 -14
  166. package/src/core/consistency_rules/consistency_rules.sysml +2 -2
  167. package/src/core/dimensions/dimensions.sysml +45 -24
  168. package/src/core/enumerations/memo_enumerations.sysml +11 -16
  169. package/src/core/methodology_scope/methodology_scope.sysml +10 -28
  170. package/src/core/relationships/memo_relationships.sysml +178 -146
  171. package/src/core/stdlib/{collections.sysml → collections/collections.sysml} +1 -1
  172. package/src/core/stdlib/{functions.sysml → functions/functions.sysml} +1 -1
  173. package/src/core/stdlib/{scalars.sysml → scalars/scalars.sysml} +1 -1
  174. package/src/core/stdlib/{time.sysml → time/time.sysml} +1 -1
  175. package/src/core/terminology/terminology.sysml +35 -0
  176. package/src/memo_namespaces.sysml +247 -302
  177. package/src/methodology/{memo_core.sysml → core/memo_core.sysml} +19 -13
  178. package/src/methodology/{memo_gates.sysml → gates/memo_gates.sysml} +1 -1
  179. package/src/methodology/{memo_patterns.sysml → patterns/memo_patterns.sysml} +1 -1
  180. package/src/methodology/{memo_profiles.sysml → profiles/memo_profiles.sysml} +27 -35
  181. package/src/methodology/{memo_workflow.sysml → workflow/memo_workflow.sysml} +1 -1
  182. package/src/rules/closure/closure_rules.sysml +11 -11
  183. package/src/rules/coverage/coverage_rules.sysml +8 -8
  184. package/src/rules/crosslayer/cross_layer_rules.sysml +2 -2
  185. package/src/rules/lifecycle/lifecycle_rules.sysml +1 -1
  186. package/src/rules/ontology/ontology_invariants.sysml +133 -0
  187. package/src/rules/quantitative/quantitative_rules.sysml +2 -2
  188. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +189 -0
  189. package/src/viewpoints/clinical/clinical_viewpoint.sysml +0 -1
  190. package/src/viewpoints/context/context_viewpoint.sysml +1 -2
  191. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +1 -2
  192. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +8 -8
  193. package/src/viewpoints/functional/{function_allocation_view.sysml → function_allocation_view/function_allocation_view.sysml} +1 -1
  194. package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
  195. package/src/viewpoints/functional/{system_functional_tree_view.sysml → system_functional_tree_view/system_functional_tree_view.sysml} +1 -1
  196. package/src/viewpoints/logical/logical_viewpoint.sysml +0 -1
  197. package/src/viewpoints/operational/operational_viewpoint.sysml +1 -2
  198. package/src/viewpoints/operational/{use_case_view.sysml → use_case_view/use_case_view.sysml} +1 -1
  199. package/src/viewpoints/physical/physical_viewpoint.sysml +0 -1
  200. package/src/viewpoints/requirements/{requirements_traceability_view.sysml → requirements_traceability_view/requirements_traceability_view.sysml} +1 -1
  201. package/src/viewpoints/requirements/requirements_viewpoint.sysml +1 -2
  202. package/src/viewpoints/risk/{risk_chain_view.sysml → risk_chain_view/risk_chain_view.sysml} +2 -2
  203. package/src/viewpoints/risk/risk_viewpoint.sysml +1 -2
  204. package/src/viewpoints/software/{software_architecture_view.sysml → software_architecture_view/software_architecture_view.sysml} +1 -1
  205. package/src/viewpoints/software/software_viewpoint.sysml +1 -2
  206. package/src/viewpoints/usability/usability_viewpoint.sysml +0 -1
  207. package/src/viewpoints/verification/verification_viewpoint.sysml +0 -1
  208. package/template/memo.package.yaml +1 -1
  209. package/template/src/catalog/starter.sysml +3 -3
  210. package/examples/gpca-pump/model/samples/README.md +0 -24
  211. package/examples/gpca-pump/model/samples/action_flow_view.viewlayout +0 -9
  212. package/examples/gpca-pump/model/samples/interconnection_view.viewlayout +0 -99
  213. package/src/architecture/assurance/memo_assurance.sysml +0 -29
  214. package/src/architecture/context/memo_context.sysml +0 -58
  215. package/src/architecture/functions/memo_functions.sysml +0 -30
  216. package/src/architecture/hardware_structure/memo_hardware_structure.sysml +0 -15
  217. package/src/architecture/interfaces/memo_interfaces.sysml +0 -103
  218. package/src/architecture/logical_structure/memo_logical_structure.sysml +0 -10
  219. package/src/architecture/operational/memo_operational.sysml +0 -51
  220. package/src/architecture/software_structure/memo_software_structure.sysml +0 -44
  221. package/src/architecture/system/memo_system_analysis.sysml +0 -54
  222. package/src/artifacts/clinical_safety_report.sysml +0 -12
  223. package/src/artifacts/cybersecurity_assessment_report.sysml +0 -12
  224. package/src/artifacts/design_change_log.sysml +0 -12
  225. package/src/artifacts/design_history_file_index.sysml +0 -12
  226. package/src/artifacts/design_input_plan.sysml +0 -12
  227. package/src/artifacts/design_output_plan.sysml +0 -12
  228. package/src/artifacts/evidence_record.sysml +0 -12
  229. package/src/artifacts/failure_mode_effects_analysis.sysml +0 -12
  230. package/src/artifacts/hazard_analysis_report.sysml +0 -12
  231. package/src/artifacts/labeling_specification.sysml +0 -12
  232. package/src/artifacts/requirements_specification.sysml +0 -12
  233. package/src/artifacts/requirements_traceability_matrix.sysml +0 -12
  234. package/src/artifacts/risk_management_plan.sysml +0 -12
  235. package/src/artifacts/software_design_description.sysml +0 -12
  236. package/src/artifacts/software_development_plan.sysml +0 -12
  237. package/src/artifacts/soup_list.sysml +0 -12
  238. package/src/artifacts/system_architecture_description.sysml +0 -12
  239. package/src/artifacts/test_protocol.sysml +0 -12
  240. package/src/artifacts/test_report.sysml +0 -12
  241. package/src/artifacts/threat_model_report.sysml +0 -12
  242. package/src/artifacts/usability_engineering_report.sysml +0 -12
  243. package/src/medical_device_library.sysml +0 -100
  244. /package/src/methodology/{memo_archetypes.sysml → archetypes/memo_archetypes.sysml} +0 -0
  245. /package/src/methodology/{memo_rules.sysml → rules/memo_rules.sysml} +0 -0
  246. /package/src/methodology/{memo_viewpoints.sysml → viewpoints/memo_viewpoints.sysml} +0 -0
  247. /package/src/viewpoints/clinical/{clinical_evidence_view.sysml → clinical_evidence_view/clinical_evidence_view.sysml} +0 -0
  248. /package/src/viewpoints/context/{system_context_view.sysml → system_context_view/system_context_view.sysml} +0 -0
  249. /package/src/viewpoints/cybersecurity/{cybersecurity_assessment_view.sysml → cybersecurity_assessment_view/cybersecurity_assessment_view.sysml} +0 -0
  250. /package/src/viewpoints/cybersecurity/{threat_model_view.sysml → threat_model_view/threat_model_view.sysml} +0 -0
  251. /package/src/viewpoints/logical/{logical_architecture_view.sysml → logical_architecture_view/logical_architecture_view.sysml} +0 -0
  252. /package/src/viewpoints/physical/{network_topology_view.sysml → network_topology_view/network_topology_view.sysml} +0 -0
  253. /package/src/viewpoints/physical/{physical_bom_view.sysml → physical_bom_view/physical_bom_view.sysml} +0 -0
  254. /package/src/viewpoints/usability/{usability_engineering_view.sysml → usability_engineering_view/usability_engineering_view.sysml} +0 -0
  255. /package/src/viewpoints/verification/{verification_coverage_view.sysml → verification_coverage_view/verification_coverage_view.sysml} +0 -0
@@ -4,35 +4,41 @@ package memo_methodology_core {
4
4
  private import memo_core_common::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
- part def MethodologyLibrary :> TraceableElement {
7
+ part def MethodologyLibrary :> MemoPart {
8
8
  attribute version : String;
9
9
  attribute domain : String;
10
10
  attribute :>> description : String;
11
11
  }
12
12
 
13
- part def MethodologyDefinition :> TraceableElement {
13
+ part def MethodologyDefinition :> MemoPart {
14
14
  attribute version : String;
15
15
  attribute domain : String;
16
16
  attribute :>> description : String;
17
17
  attribute baseMethodName : String;
18
+ // A methodology is an inclusion set. Layer entries normally name a
19
+ // public MEMO layer namespace; module entries may name any qualified
20
+ // package available to the project, including packages outside MEMO.
21
+ attribute includedLayer : String[0..*];
22
+ attribute includedModule : String[0..*];
18
23
  }
19
24
 
20
- part def ResolvedMethodology :> TraceableElement {
25
+ part def ResolvedMethodology :> MemoPart {
21
26
  attribute version : String;
22
- // Risk-proportionate scope keyed to the device's software safety
23
- // classification (IEC 62304 A/B/C) and lifecycle stage — not a
24
- // "rigor dial". The class + stage determine which layers, links,
25
- // viewpoints, and gates a release must clear.
26
- attribute safetyClassification : SafetyClassKind;
27
- attribute lifecycleStage : LifecycleStateKind;
28
- attribute resolutionSummary : String;
27
+ // The effective inclusion set after the project binding has added any
28
+ // project- or supplier-specific modules.
29
+ attribute includedLayer : String[0..*];
30
+ attribute includedModule : String[0..*];
29
31
  }
30
32
 
31
- part def ProjectMethodBinding :> TraceableElement {
33
+ part def ProjectMethodBinding :> MemoPart {
32
34
  attribute projectName : String;
35
+ attribute methodologyName : String;
36
+ // Project bindings may add project or supplier modules to the selected
37
+ // methodology without requiring those packages to live under memo::.
38
+ attribute includedModule : String[0..*];
33
39
  }
34
40
 
35
- part def DhfDocumentBinding :> TraceableElement {
41
+ part def DhfDocumentBinding :> MemoPart {
36
42
  attribute documentTitle : String;
37
43
  attribute groupLabel : String;
38
44
  attribute templateId : String;
@@ -42,7 +48,7 @@ package memo_methodology_core {
42
48
  attribute required : Boolean;
43
49
  }
44
50
 
45
- part def Archetype :> TraceableElement {
51
+ part def Archetype :> MemoPart {
46
52
  attribute label : String;
47
53
  attribute :>> description : String;
48
54
  attribute category : String;
@@ -4,7 +4,7 @@ package memo_methodology_gates {
4
4
  private import memo_core_common::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
- part def QualityGate :> TraceableElement {
7
+ part def QualityGate :> MemoPart {
8
8
  attribute gateStage : WorkflowStageKind;
9
9
  attribute passCriteria : String;
10
10
  }
@@ -4,7 +4,7 @@ package memo_methodology_patterns {
4
4
  private import memo_core_common::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
- part def ModelingPattern :> TraceableElement {
7
+ part def ModelingPattern :> MemoPart {
8
8
  attribute intent : String;
9
9
  attribute stage : WorkflowStageKind;
10
10
  attribute strength : RuleStrengthKind;
@@ -2,7 +2,6 @@ package memo_methodology_profiles {
2
2
  private import ScalarValues::*;
3
3
 
4
4
  private import memo_methodology_core::*;
5
- private import memo_methodology_viewpoints::*;
6
5
  private import memo_methodology_rules::*;
7
6
  private import memo_methodology_patterns::*;
8
7
  private import memo_methodology_workflow::*;
@@ -25,39 +24,30 @@ package memo_methodology_profiles {
25
24
  attribute :>> domain = "medical device modeling";
26
25
  attribute :>> description = "Light default methodology around the ontology for smaller or early project use.";
27
26
  attribute :>> baseMethodName = "";
27
+ attribute :>> includedLayer = "memo::architecture::operational";
28
+ attribute :>> includedLayer = "memo::architecture::functional";
29
+ attribute :>> includedLayer = "memo::architecture::logical";
30
+ attribute :>> includedModule = "memo::assurance::requirements";
31
+ attribute :>> includedModule = "memo::assurance::safety_risk";
32
+ attribute :>> includedModule = "memo::assurance::verification_validation";
28
33
  }
29
34
 
30
35
  part mdLightDefaultResolved : ResolvedMethodology {
31
36
  attribute :>> id = "RMETH-001";
32
37
  attribute :>> name = "MedicalDeviceLightDefaultResolved";
33
38
  attribute :>> version = "0.1";
34
- attribute :>> safetyClassification = SafetyClassKind::A;
35
- attribute :>> lifecycleStage = LifecycleStateKind::development;
36
- attribute :>> resolutionSummary = "Class A development-stage scope: core requirements, architecture, risk, verification, and RMF support required; cybersecurity and SOUP out of scope.";
39
+ attribute :>> includedLayer = "memo::architecture::operational";
40
+ attribute :>> includedLayer = "memo::architecture::functional";
41
+ attribute :>> includedLayer = "memo::architecture::logical";
42
+ attribute :>> includedModule = "memo::assurance::requirements";
43
+ attribute :>> includedModule = "memo::assurance::safety_risk";
44
+ attribute :>> includedModule = "memo::assurance::verification_validation";
37
45
  }
38
46
 
39
- part riskView : Viewpoint {
40
- attribute :>> id = "VP-001";
41
- attribute :>> name = "RiskManagementView";
42
- attribute :>> purpose = "Focus on risk chain, controls, verification, and residual risk.";
43
- attribute :>> audience = AudienceKind::safetyEngineer;
44
- attribute :>> stage = WorkflowStageKind::risk;
45
- attribute :>> abstractionLevel = "safety management";
46
- }
47
-
48
- part swArchView : Viewpoint {
49
- attribute :>> id = "VP-002";
50
- attribute :>> name = "SoftwareArchitectureView";
51
- attribute :>> purpose = "Focus on software decomposition, interfaces, timing, and contracts.";
52
- attribute :>> audience = AudienceKind::softwareArchitect;
53
- attribute :>> stage = WorkflowStageKind::architecture;
54
- attribute :>> abstractionLevel = "software design";
55
- }
56
-
57
- part useRiskBeforeRule : ElementUsageRule {
47
+ part useRiskAndResidualRule : ElementUsageRule {
58
48
  attribute :>> id = "RULE-001";
59
- attribute :>> name = "UseRiskBeforeAfter";
60
- attribute :>> elementTypeName = "RiskBeforeMitigation,RiskAfterMitigation,RiskMatrix";
49
+ attribute :>> name = "UseRiskAndResidualRisk";
50
+ attribute :>> elementTypeName = "Risk,ResidualRisk,RiskMatrix";
61
51
  attribute :>> strength = RuleStrengthKind::recommended;
62
52
  attribute :>> rationaleText = "Even a light methodology should distinguish pre- and post-mitigation risk and assess against a matrix.";
63
53
  }
@@ -138,22 +128,24 @@ package memo_methodology_profiles {
138
128
  attribute :>> name = "MedicalDeviceCoverageScope";
139
129
  attribute :>> scopeName = "coverage";
140
130
 
141
- attribute :>> includedArchLayer = "context; requirements; functions; logical_structure; interfaces; software_structure; hardware_structure; behavior; risk; arch_risk; assurance; cybersecurity; constraints";
142
-
143
- attribute :>> includedStandard = "ISO 14971; IEC 62304; 21 CFR 820; ISO 13485; ISO 14155; IEC 62366; IEC 60601-1; IEC 82304-1; FDA Cybersecurity Guidance";
144
-
145
- attribute :>> includedArtifactKind = "RiskManagementPlan; RequirementsSpecification; SystemArchitectureDescription; SoftwareDesignDescription; HazardAnalysisReport; RequirementsTraceabilityMatrix; CybersecurityAssessmentReport; ThreatModelReport; UsabilityEngineeringReport; ClinicalSafetyReport; FailureModeEffectsAnalysisReport; SoupList; DesignInputPlan; DesignOutputPlan; SoftwareDevelopmentPlan; LabelingSpecification; DesignHistoryFileIndex; DesignChangeLog";
146
-
147
- attribute :>> includedViewpointType = "VP-CTX; VP-OPS; VP-REQ; VP-FUNC; VP-LOG; VP-SW; VP-PHY; VP-RISK; VP-VER; VP-CYB; VP-USE; VP-CLIN";
148
-
149
- attribute :>> excludedKind = "";
150
- attribute :>> description = "Comprehensive default methodology — includes all architecture layers, supported standards, artifact kinds, and viewpoint types. No GPCA-specific subtraction.";
131
+ attribute :>> includedArchLayer = "memo::architecture::operational";
132
+ attribute :>> includedArchLayer = "memo::architecture::functional";
133
+ attribute :>> includedArchLayer = "memo::architecture::logical";
134
+ attribute :>> includedArchLayer = "memo::architecture::implementation";
135
+ attribute :>> includedArchLayer = "memo::architecture::realization";
136
+ attribute :>> includedModule = "memo::assurance::requirements";
137
+ attribute :>> includedModule = "memo::assurance::safety_risk";
138
+ attribute :>> includedModule = "memo::assurance::cybersecurity";
139
+ attribute :>> includedModule = "memo::assurance::human_factors";
140
+ attribute :>> includedModule = "memo::assurance::verification_validation";
141
+ attribute :>> description = "Comprehensive default MEMO layer and module selection.";
151
142
  }
152
143
 
153
144
  part gpcaProjectBinding : ProjectMethodBinding {
154
145
  attribute :>> id = "PMB-001";
155
146
  attribute :>> name = "GPCAProjectMethodBinding";
156
147
  attribute :>> projectName = "GPCA";
148
+ attribute :>> methodologyName = "MedicalDeviceLightDefault";
157
149
  }
158
150
 
159
151
  part rmpDoc : DhfDocumentBinding {
@@ -4,7 +4,7 @@ package memo_methodology_workflow {
4
4
  private import memo_core_common::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
- part def WorkflowStep :> TraceableElement {
7
+ part def WorkflowStep :> MemoPart {
8
8
  attribute stepOrder : Integer;
9
9
  attribute stage : WorkflowStageKind;
10
10
  attribute objectiveDescription : String;
@@ -21,7 +21,7 @@ package memo_rules_closure {
21
21
  attribute appliesTo = "Hazard";
22
22
  attribute severity = RuleSeverityKind::error;
23
23
  attribute rationaleText = "ISO 14971 requires each identified hazard to have risk control measures.";
24
- attribute predicateExpression = "mitigatesHazard->size() >= 1";
24
+ attribute predicateExpression = "mitigates->size() >= 1";
25
25
  constraint { true }
26
26
  }
27
27
 
@@ -36,16 +36,16 @@ package memo_rules_closure {
36
36
 
37
37
  constraint def riskControlVerificationRule {
38
38
  attribute id = "CR-MED-003";
39
- attribute appliesTo = "RiskControl";
39
+ attribute appliesTo = "RiskControlMeasure";
40
40
  attribute severity = RuleSeverityKind::error;
41
41
  attribute rationaleText = "Risk controls shall be verified per ISO 14971 clause 7.4.";
42
42
  attribute predicateExpression = "verifiedBy->size() >= 1";
43
43
  constraint { true }
44
44
  }
45
45
 
46
- constraint def riskBeforeMatrixRule {
46
+ constraint def initialRiskMatrixRule {
47
47
  attribute id = "CR-MED-004";
48
- attribute appliesTo = "RiskBeforeMitigation";
48
+ attribute appliesTo = "Risk";
49
49
  attribute severity = RuleSeverityKind::warning;
50
50
  attribute rationaleText = "Pre-mitigation risk must be assessed against a risk acceptability matrix.";
51
51
  attribute predicateExpression = "assessedAgainst->size() >= 1";
@@ -56,7 +56,7 @@ package memo_rules_closure {
56
56
 
57
57
  constraint def sysReqTraceRule {
58
58
  attribute id = "CR-MED-010";
59
- attribute appliesTo = "SystemRequirement";
59
+ attribute appliesTo = "Requirement[requirementKind=system]";
60
60
  attribute severity = RuleSeverityKind::error;
61
61
  attribute rationaleText = "Requirements shall be traceable to stakeholder needs per ISO 13485.";
62
62
  attribute predicateExpression = "derivesFrom->size() >= 1";
@@ -65,7 +65,7 @@ package memo_rules_closure {
65
65
 
66
66
  constraint def swReqTraceRule {
67
67
  attribute id = "CR-MED-011";
68
- attribute appliesTo = "SoftwareRequirement";
68
+ attribute appliesTo = "Requirement[requirementKind=software]";
69
69
  attribute severity = RuleSeverityKind::error;
70
70
  attribute rationaleText = "Software requirements derive from system requirements per IEC 62304.";
71
71
  attribute predicateExpression = "derivesFrom->size() >= 1";
@@ -75,14 +75,14 @@ package memo_rules_closure {
75
75
  // CR-MED-012 (RequirementIdMustBeUnique) is intentionally omitted from the native
76
76
  // constraint set: cross-element uniqueness is not a single-subject predicate and
77
77
  // cannot be expressed as a `constraint { … }` body over one Requirement.
78
- // It remains an engine-level check (future model-level constraint support).
78
+ // It remains an engine-level check.
79
79
  // Do not reintroduce the `predicate="uniqueAttribute"` part.
80
80
 
81
81
  // ─── Architecture Layer Rules ────────────────────────────────────────
82
82
 
83
83
  constraint def swComponentSafetyClassRule {
84
84
  attribute id = "CR-MED-020";
85
- attribute appliesTo = "SoftwareComponent";
85
+ attribute appliesTo = "SoftwareModule";
86
86
  attribute severity = RuleSeverityKind::error;
87
87
  attribute rationaleText = "IEC 62304 requires safety classification for all software items.";
88
88
  attribute predicateExpression = "attributes.safetyClass != \"\"";
@@ -91,7 +91,7 @@ package memo_rules_closure {
91
91
 
92
92
  constraint def swComponentReqRule {
93
93
  attribute id = "CR-MED-021";
94
- attribute appliesTo = "SoftwareComponent";
94
+ attribute appliesTo = "SoftwareModule";
95
95
  attribute severity = RuleSeverityKind::warning;
96
96
  attribute rationaleText = "Software items shall be linked to their requirements per IEC 62304.";
97
97
  attribute predicateExpression = "satisfiedBy->size() >= 1";
@@ -100,7 +100,7 @@ package memo_rules_closure {
100
100
 
101
101
  constraint def logicalFunctionAllocationRule {
102
102
  attribute id = "CR-MED-022";
103
- attribute appliesTo = "LogicalFunction";
103
+ attribute appliesTo = "SystemFunction";
104
104
  attribute severity = RuleSeverityKind::warning;
105
105
  attribute rationaleText = "Functions should be allocated to implementation elements.";
106
106
  attribute predicateExpression = "allocatedTo->size() >= 1";
@@ -171,7 +171,7 @@ package memo_rules_closure {
171
171
 
172
172
  constraint def safetyClassCVerificationRule {
173
173
  attribute id = "CR-MED-101";
174
- attribute appliesTo = "SoftwareComponent";
174
+ attribute appliesTo = "SoftwareModule";
175
175
  attribute severity = RuleSeverityKind::error;
176
176
  attribute rationaleText = "IEC 62304 requires rigorous verification for Class C software.";
177
177
  attribute predicateExpression = "not(attributes.safetyClass == \"C\") or verifiedBy->size() >= 1";
@@ -54,34 +54,34 @@ package memo_rules_coverage {
54
54
 
55
55
  constraint def iec62304SwArchCoverage {
56
56
  attribute id = "COV-62304-001";
57
- attribute appliesTo = "SoftwareComponent";
57
+ attribute appliesTo = "SoftwareModule";
58
58
  attribute severity = RuleSeverityKind::error;
59
59
  attribute rationaleText = "IEC 62304 clause 5.3 requires software architecture.";
60
60
  attribute standardReference = "IEC 62304";
61
61
  attribute clause = "5.3";
62
- attribute coverageTarget = "SoftwareComponent";
62
+ attribute coverageTarget = "SoftwareModule";
63
63
  }
64
64
 
65
65
  constraint def iec62304SwReqCoverage {
66
66
  attribute id = "COV-62304-002";
67
- attribute appliesTo = "SoftwareRequirement";
67
+ attribute appliesTo = "Requirement[requirementKind=software]";
68
68
  attribute severity = RuleSeverityKind::error;
69
69
  attribute rationaleText = "IEC 62304 clause 5.2 requires software requirements specification.";
70
70
  attribute standardReference = "IEC 62304";
71
71
  attribute clause = "5.2";
72
- attribute coverageTarget = "SoftwareRequirement";
72
+ attribute coverageTarget = "Requirement[requirementKind=software]";
73
73
  }
74
74
 
75
75
  // ─── FDA 21 CFR 820: Quality System ──────────────────────────────────
76
76
 
77
77
  constraint def fda820DesignInputCoverage {
78
78
  attribute id = "COV-820-001";
79
- attribute appliesTo = "SystemRequirement";
79
+ attribute appliesTo = "Requirement[requirementKind=system]";
80
80
  attribute severity = RuleSeverityKind::error;
81
81
  attribute rationaleText = "21 CFR 820.30(c) requires design inputs including requirements.";
82
82
  attribute standardReference = "FDA 21 CFR 820";
83
83
  attribute clause = "820.30(c)";
84
- attribute coverageTarget = "SystemRequirement";
84
+ attribute coverageTarget = "Requirement[requirementKind=system]";
85
85
  }
86
86
 
87
87
  constraint def fda820DesignVerificationCoverage {
@@ -98,12 +98,12 @@ package memo_rules_coverage {
98
98
 
99
99
  constraint def iso13485StakeholderNeedCoverage {
100
100
  attribute id = "COV-13485-001";
101
- attribute appliesTo = "StakeholderNeed";
101
+ attribute appliesTo = "Need[needKind=stakeholder]";
102
102
  attribute severity = RuleSeverityKind::error;
103
103
  attribute rationaleText = "ISO 13485 clause 7.2 requires determination of customer requirements.";
104
104
  attribute standardReference = "ISO 13485";
105
105
  attribute clause = "7.2";
106
- attribute coverageTarget = "StakeholderNeed";
106
+ attribute coverageTarget = "Need[needKind=stakeholder]";
107
107
  }
108
108
 
109
109
  // ─── ISO 14155: Clinical Investigations ──────────────────────────────
@@ -1,4 +1,4 @@
1
- // C4 cross-layer rule pack — native KerML constraints (Epic EE-3).
1
+ // Cross-layer rule pack — native KerML constraints.
2
2
  // Traceability between architecture layers, migrated from ConsistencyRule
3
3
  // predicate-attribute parts to native `constraint def` bodies.
4
4
  package memo_rules_crosslayer {
@@ -18,7 +18,7 @@ package memo_rules_crosslayer {
18
18
 
19
19
  constraint def reqToArchTraceRule {
20
20
  attribute id = "XL-002";
21
- attribute appliesTo = "SystemRequirement";
21
+ attribute appliesTo = "Requirement[requirementKind=system]";
22
22
  attribute severity = RuleSeverityKind::warning;
23
23
  attribute rationaleText = "Requirements-to-architecture traceability per IEC 62304.";
24
24
  attribute predicateExpression = "satisfiedBy->size() >= 1";
@@ -17,7 +17,7 @@ package memo_rules_lifecycle {
17
17
 
18
18
  constraint def reqBeforeArchRule {
19
19
  attribute id = "LC-001";
20
- attribute appliesTo = "SoftwareComponent";
20
+ attribute appliesTo = "SoftwareModule";
21
21
  attribute severity = RuleSeverityKind::warning;
22
22
  attribute rationaleText = "IEC 62304 requires requirements to precede architecture decomposition.";
23
23
  // Lifecycle ordering — model-level, no single-subject predicate.
@@ -0,0 +1,133 @@
1
+ // Ontology conformance invariants (§25, 0.5 rework). Same native pattern as
2
+ // memo_rules_closure: `constraint def` bodies with declarative rule metadata
3
+ // (`predicateExpression`) evaluated by the external constraint engine.
4
+ // Structural invariants (endpoint existence, cycle freedom) are expressed over
5
+ // the typed relations introduced in 0.5 — typed references make them checkable.
6
+ package memo_rules_ontology {
7
+ private import ScalarValues::*;
8
+
9
+ private import memo_core_consistency_rules::*;
10
+ private import memo_core_enumerations::*;
11
+
12
+ // ─── Structure ───────────────────────────────────────────────────────
13
+
14
+ constraint def containmentAcyclicRule {
15
+ attribute id = "CR-ONT-001";
16
+ attribute appliesTo = "MemoPart";
17
+ attribute severity = RuleSeverityKind::error;
18
+ attribute rationaleText = "Containment/composition relations (Composes) must form no cycles.";
19
+ attribute predicateExpression = "acyclic(composes)";
20
+ constraint { true }
21
+ }
22
+ constraint def connectorEndpointsExistRule {
23
+ attribute id = "CR-ONT-002";
24
+ attribute appliesTo = "ComponentExchange";
25
+ attribute severity = RuleSeverityKind::error;
26
+ attribute rationaleText = "Connector endpoints must resolve to model elements via the typed refs sourceEndpoint/targetEndpoint; port-path strings are descriptive labels only.";
27
+ attribute predicateExpression = "sourceEndpoint->size() = 1 and targetEndpoint->size() = 1";
28
+ constraint { true }
29
+ }
30
+ constraint def portCompatibilityRule {
31
+ attribute id = "CR-ONT-003";
32
+ attribute appliesTo = "LogicalConnector";
33
+ attribute severity = RuleSeverityKind::error;
34
+ attribute rationaleText = "Connected ports must agree on content kind; a fluid port cannot connect to an information port.";
35
+ attribute predicateExpression = "sourceComponent.ports.contentKind->intersect(targetComponent.ports.contentKind)->size() >= 1";
36
+ constraint { true }
37
+ }
38
+ constraint def directionAgreesWithFlowRule {
39
+ attribute id = "CR-ONT-004";
40
+ attribute appliesTo = "LogicalExchange";
41
+ attribute severity = RuleSeverityKind::error;
42
+ attribute rationaleText = "Exchange direction must agree with the direction of its source and target ports.";
43
+ attribute predicateExpression = "sourcePort.direction != DirectionKind::input and targetPort.direction != DirectionKind::output";
44
+ constraint { true }
45
+ }
46
+ constraint def exchangedItemTypeRule {
47
+ attribute id = "CR-ONT-005";
48
+ attribute appliesTo = "LogicalExchange";
49
+ attribute severity = RuleSeverityKind::warning;
50
+ attribute rationaleText = "Exchanged items must be type-compatible with the exchange content kind.";
51
+ attribute predicateExpression = "exchangedItem->isEmpty() or exchangedItem.contentKind = contentKind";
52
+ constraint { true }
53
+ }
54
+
55
+ // ─── Deployment and realization ──────────────────────────────────────
56
+
57
+ constraint def deployToCapableNodeRule {
58
+ attribute id = "CR-ONT-010";
59
+ attribute appliesTo = "DeploysTo";
60
+ attribute severity = RuleSeverityKind::error;
61
+ attribute rationaleText = "Software deploys only to capable execution nodes (e.g. containerized units require supportsContainerization).";
62
+ attribute predicateExpression = "deploymentKind != DeploymentKind::containerized or node.supportsContainerization = true";
63
+ constraint { true }
64
+ }
65
+ constraint def runtimeTracesToModuleRule {
66
+ attribute id = "CR-ONT-011";
67
+ attribute appliesTo = "SoftwareComponent";
68
+ attribute severity = RuleSeverityKind::warning;
69
+ attribute rationaleText = "Every runtime component must trace to a module-view definition (Realizes).";
70
+ attribute predicateExpression = "realizes->size() >= 1";
71
+ constraint { true }
72
+ }
73
+ constraint def logicalRealizationTypedRule {
74
+ attribute id = "CR-ONT-012";
75
+ attribute appliesTo = "Realizes";
76
+ attribute severity = RuleSeverityKind::error;
77
+ attribute rationaleText = "Realization relations must resolve both ends to model elements, not name strings.";
78
+ attribute predicateExpression = "realizing->size() = 1 and realized->size() = 1";
79
+ constraint { true }
80
+ }
81
+
82
+ constraint def patientContactCharacterizedRule {
83
+ attribute id = "CR-ONT-032";
84
+ attribute appliesTo = "PhysicalComponent";
85
+ attribute severity = RuleSeverityKind::error;
86
+ attribute rationaleText = "Patient-contact components must identify contact nature and duration (ISO 10993-1).";
87
+ attribute predicateExpression = "patientContact = false or (contactNature != '' and contactDuration != '')";
88
+ constraint { true }
89
+ }
90
+
91
+ // ─── Assurance coverage ──────────────────────────────────────────────
92
+
93
+ constraint def safetyCriticalFunctionVerifiedRule {
94
+ attribute id = "CR-ONT-040";
95
+ attribute appliesTo = "SystemFunction";
96
+ attribute severity = RuleSeverityKind::error;
97
+ attribute rationaleText = "Safety-critical functions (criticality high or catastrophic) must trace to at least one verification case.";
98
+ attribute predicateExpression = "criticality < CriticalityKind::high or verifiedBy->size() >= 1";
99
+ constraint { true }
100
+ }
101
+ constraint def criticalTaskValidatedRule {
102
+ attribute id = "CR-ONT-041";
103
+ attribute appliesTo = "UserTask[criticality=high]";
104
+ attribute severity = RuleSeverityKind::error;
105
+ attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
106
+ attribute predicateExpression = "criticality < CriticalityKind::high or validates->size() >= 1";
107
+ constraint { true }
108
+ }
109
+ constraint def useErrorTracesToHazardRule {
110
+ attribute id = "CR-ONT-042";
111
+ attribute appliesTo = "UseError";
112
+ attribute severity = RuleSeverityKind::warning;
113
+ attribute rationaleText = "Safety-relevant use errors (severity serious or worse) must trace to a hazard.";
114
+ attribute predicateExpression = "severity < SeverityKind::serious or causes->size() >= 1";
115
+ constraint { true }
116
+ }
117
+ constraint def alternateScenarioHasBaseRule {
118
+ attribute id = "CR-ONT-043";
119
+ attribute appliesTo = "MemoScenario";
120
+ attribute severity = RuleSeverityKind::error;
121
+ attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
122
+ attribute predicateExpression = "variantKind = ScenarioVariantKind::nominal or baseScenario->size() = 1 or variationPoint != ''";
123
+ constraint { true }
124
+ }
125
+ constraint def singleAxisOwnershipRule {
126
+ attribute id = "CR-ONT-045";
127
+ attribute appliesTo = "MemoPart";
128
+ attribute severity = RuleSeverityKind::error;
129
+ attribute rationaleText = "Every element is owned by exactly one axis, encoded by its owning package: a horizontal architecture layer (memo_architecture_*) XOR a vertical assurance discipline (memo_assurance_*) — never both. Cross-axis participation is expressed by typed relationships, not by dual membership.";
130
+ attribute predicateExpression = "owningPackage.startsWith('memo_architecture_') xor owningPackage.startsWith('memo_assurance_')";
131
+ constraint { true }
132
+ }
133
+ }
@@ -13,13 +13,13 @@ package memo_rules_quantitative {
13
13
  attribute appliesTo = "Hazard";
14
14
  attribute severity = RuleSeverityKind::info;
15
15
  attribute rationaleText = "Excessive controls per hazard suggests the hazard is too broad and should be decomposed.";
16
- attribute predicateExpression = "mitigatesHazard->size() >= 0 and mitigatesHazard->size() <= 10";
16
+ attribute predicateExpression = "mitigates->size() >= 0 and mitigates->size() <= 10";
17
17
  constraint { true }
18
18
  }
19
19
 
20
20
  constraint def swComponentMaxInterfacesRule {
21
21
  attribute id = "QT-002";
22
- attribute appliesTo = "SoftwareComponent";
22
+ attribute appliesTo = "SoftwareModule";
23
23
  attribute severity = RuleSeverityKind::info;
24
24
  attribute rationaleText = "High interface count indicates excessive coupling; consider decomposition.";
25
25
  attribute predicateExpression = "threatenedBy->size() >= 0 and threatenedBy->size() <= 8";