@memoarchitect/ontology 0.8.24 → 0.11.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 (203) hide show
  1. package/README.md +1 -1
  2. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +9 -7
  3. package/examples/connected-patient-monitor/model/catalog/project.sysml +3 -1
  4. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +9 -7
  5. package/examples/embedded-infusion-pump/model/catalog/project.sysml +3 -1
  6. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +8 -6
  7. package/examples/functional-logical-physical/model/catalog/project.sysml +3 -1
  8. package/examples/gpca-pump/memo.identity.yaml +2185 -0
  9. package/examples/gpca-pump/methodology/gpca_profiles.sysml +3 -1
  10. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +29 -27
  11. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +115 -114
  12. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +42 -41
  13. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +26 -25
  14. package/examples/gpca-pump/model/catalog/gpca_context.sysml +29 -24
  15. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +14 -13
  16. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +42 -40
  17. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +198 -197
  18. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +121 -125
  19. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +8 -6
  20. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +390 -388
  21. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +164 -163
  22. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +44 -43
  23. package/examples/gpca-pump/model/catalog/gpca_system.sysml +15 -14
  24. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +10 -8
  25. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +62 -61
  26. package/examples/gpca-pump/model/catalog/project.sysml +3 -1
  27. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +6 -4
  28. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +5 -3
  29. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +5 -3
  30. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +5 -3
  31. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +5 -3
  32. package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +5 -3
  33. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +5 -3
  34. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +5 -3
  35. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +5 -3
  36. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +5 -3
  37. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +5 -3
  38. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +5 -3
  39. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +5 -3
  40. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +5 -3
  41. package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +5 -3
  42. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +5 -3
  43. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +5 -3
  44. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +5 -3
  45. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +5 -3
  46. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +5 -3
  47. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +5 -3
  48. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +5 -3
  49. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +5 -3
  50. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +6 -4
  51. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +5 -3
  52. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +5 -3
  53. package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +9 -7
  54. package/examples/ivd-laboratory-system/model/catalog/project.sysml +3 -1
  55. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +6 -4
  56. package/examples/manual-surgical-instrument/model/catalog/project.sysml +3 -1
  57. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -4
  58. package/examples/multidimensional-layers/model/catalog/project.sysml +3 -1
  59. package/examples/nested-architecture-dsm/memo.identity.yaml +181 -0
  60. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +20 -18
  61. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +20 -18
  62. package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +34 -0
  63. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +11 -6
  64. package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +16 -14
  65. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +18 -16
  66. package/examples/nested-architecture-dsm/model/catalog/project.sysml +4 -1
  67. package/examples/reusable-instrument/model/catalog/project.sysml +3 -1
  68. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +17 -16
  69. package/examples/ros-mobile-robot/model/catalog/project.sysml +3 -1
  70. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +18 -16
  71. package/examples/software-only-medical-device/model/catalog/project.sysml +3 -1
  72. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +10 -8
  73. package/examples/surgical-closure-workflow/model/catalog/project.sysml +3 -1
  74. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +54 -51
  75. package/examples/surgical-robot/model/catalog/project.sysml +3 -1
  76. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +9 -7
  77. package/examples/sysml-diagram-samples/model/catalog/project.sysml +3 -1
  78. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +10 -8
  79. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +7 -5
  80. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +3 -1
  81. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +2 -1
  82. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +3 -1
  83. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +11 -9
  84. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +3 -1
  85. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +2 -1
  86. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +3 -1
  87. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +11 -7
  88. package/examples/temperature-alarm/memo.identity.yaml +64 -0
  89. package/examples/temperature-alarm/model/catalog/project.sysml +3 -1
  90. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +27 -22
  91. package/examples/ui-screen-regions/memo.identity.yaml +205 -0
  92. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +14 -12
  93. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +35 -33
  94. package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +8 -6
  95. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +14 -13
  96. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +4 -2
  97. package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +4 -2
  98. package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +12 -10
  99. package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +3 -1
  100. package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +26 -24
  101. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +17 -15
  102. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +10 -9
  103. package/examples/ui-screen-regions/model/catalog/project.sysml +3 -1
  104. package/examples/ui-screen-regions/model/catalog/relationships.sysml +2 -2
  105. package/examples/ui-screen-regions/model/catalog/traces.sysml +0 -2
  106. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +5 -3
  107. package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +5 -3
  108. package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +5 -3
  109. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +3 -1
  110. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +3 -1
  111. package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +3 -1
  112. package/extensions/aadl/memo.package.yaml +1 -1
  113. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +23 -21
  114. package/extensions/aadl/src/methodology/aadl_methodology.sysml +3 -1
  115. package/extensions/clinical/src/methodology/clinical_methodology.sysml +3 -1
  116. package/extensions/cloud/memo.package.yaml +1 -1
  117. package/extensions/cloud/src/methodology/cloud_methodology.sysml +3 -1
  118. package/extensions/container/memo.package.yaml +1 -1
  119. package/extensions/container/src/methodology/container_methodology.sysml +3 -1
  120. package/extensions/messaging/memo.package.yaml +1 -1
  121. package/extensions/messaging/src/methodology/messaging_methodology.sysml +3 -1
  122. package/extensions/ros/memo.package.yaml +1 -1
  123. package/extensions/ros/src/methodology/ros_methodology.sysml +3 -1
  124. package/extensions/template/src/extension.sysml +3 -1
  125. package/methodologies/default/memo.package.yaml +1 -1
  126. package/methodologies/gpca/memo.package.yaml +1 -1
  127. package/ontology/memo.package.yaml +1 -1
  128. package/package.json +2 -2
  129. package/profile/memo.package.yaml +1 -1
  130. package/src/architecture/functional/behavior/memo_behavior.sysml +1 -1
  131. package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +12 -2
  132. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +0 -11
  133. package/src/architecture/implementation/ui/memo_ui.sysml +0 -23
  134. package/src/architecture/logical/interfaces/memo_interfaces.sysml +3 -1
  135. package/src/architecture/operational/context/use_context/memo_use_context.sysml +3 -11
  136. package/src/architecture/operational/scenarios/memo_scenarios.sysml +1 -12
  137. package/src/architecture/operational/use_cases/memo_use_cases.sysml +7 -11
  138. package/src/architecture/operational/workflows/memo_workflows.sysml +0 -20
  139. package/src/architecture/realization/deployment/memo_deployment.sysml +16 -9
  140. package/src/architecture/realization/physical/memo_physical_architecture.sysml +8 -2
  141. package/src/artifacts/standards/cfr_21_820.sysml +80 -89
  142. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +45 -49
  143. package/src/artifacts/standards/iec_60601_1.sysml +108 -121
  144. package/src/artifacts/standards/iec_60601_1_2.sysml +31 -33
  145. package/src/artifacts/standards/iec_60812.sysml +21 -22
  146. package/src/artifacts/standards/iec_62304.sysml +150 -169
  147. package/src/artifacts/standards/iec_62366_1.sysml +80 -89
  148. package/src/artifacts/standards/iec_81001_5_1.sysml +52 -57
  149. package/src/artifacts/standards/iso_13485.sysml +80 -89
  150. package/src/artifacts/standards/iso_14971.sysml +66 -73
  151. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +15 -15
  152. package/src/artifacts/templates/dhf/iec-60601/hrs.md +6 -6
  153. package/src/artifacts/templates/dhf/iec-62304/srs.md +10 -10
  154. package/src/artifacts/templates/dhf/system/syrs.md +6 -6
  155. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +0 -1
  156. package/src/assurance/human_factors/memo_human_factors.sysml +0 -1
  157. package/src/assurance/requirements/memo_requirements.sysml +20 -16
  158. package/src/assurance/requirements/needs/memo_needs.sysml +33 -5
  159. package/src/assurance/safety_risk/memo_risk.sysml +20 -0
  160. package/src/assurance/verification_validation/memo_assurance.sysml +7 -12
  161. package/src/core/common/memo_common.sysml +50 -50
  162. package/src/core/enumerations/memo_enumerations.sysml +1 -1
  163. package/src/core/relationships/memo_relationships.sysml +22 -49
  164. package/src/methodology/archetypes/memo_archetypes.sysml +10 -8
  165. package/src/methodology/core/memo_core.sysml +0 -10
  166. package/src/methodology/profiles/memo_profiles.sysml +18 -16
  167. package/src/rules/closure/closure_rules.sysml +58 -22
  168. package/src/rules/crosslayer/cross_layer_rules.sysml +5 -3
  169. package/src/rules/ontology/ontology_invariants.sysml +119 -35
  170. package/src/rules/quantitative/quantitative_rules.sysml +4 -2
  171. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +29 -28
  172. package/src/viewpoints/clinical/clinical_viewpoint.sysml +4 -2
  173. package/src/viewpoints/context/context_viewpoint.sysml +5 -3
  174. package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +5 -3
  175. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +4 -2
  176. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +6 -16
  177. package/src/viewpoints/functional/functional_viewpoint.sysml +4 -2
  178. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +5 -3
  179. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +5 -3
  180. package/src/viewpoints/logical/logical_viewpoint.sysml +4 -2
  181. package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +5 -3
  182. package/src/viewpoints/operational/operational_viewpoint.sysml +4 -2
  183. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +5 -3
  184. package/src/viewpoints/physical/physical_viewpoint.sysml +4 -2
  185. package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +5 -3
  186. package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +5 -3
  187. package/src/viewpoints/rendering/memo_rendering.sysml +220 -40
  188. package/src/viewpoints/requirements/requirements_viewpoint.sysml +4 -2
  189. package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +5 -3
  190. package/src/viewpoints/risk/risk_viewpoint.sysml +4 -2
  191. package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +5 -3
  192. package/src/viewpoints/software/software_viewpoint.sysml +4 -2
  193. package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +5 -3
  194. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +4 -2
  195. package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +3 -1
  196. package/src/viewpoints/usability/usability_viewpoint.sysml +4 -2
  197. package/src/viewpoints/verification/verification_viewpoint.sysml +4 -2
  198. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +5 -3
  199. package/templates/connected-device/model/catalog/project.sysml +3 -1
  200. package/templates/default/model/catalog/project.sysml +3 -1
  201. package/templates/infusion-pump/model/catalog/project.sysml +3 -1
  202. package/templates/monitoring-device/model/catalog/project.sysml +3 -1
  203. package/templates/samd/model/catalog/project.sysml +3 -1
@@ -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,7 +76,7 @@ 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
81
  attribute appliesTo = "OperativeAction[criticality=high]";
80
82
  attribute severity = RuleSeverityKind::error;
@@ -83,7 +85,7 @@ package memo_rules_ontology {
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;
@@ -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,7 +138,7 @@ 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;
@@ -145,7 +147,7 @@ package memo_rules_ontology {
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,7 +156,7 @@ 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;
@@ -163,7 +165,7 @@ package memo_rules_ontology {
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;
@@ -172,7 +174,7 @@ package memo_rules_ontology {
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,7 +192,7 @@ 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;
@@ -199,7 +201,7 @@ package memo_rules_ontology {
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,7 +219,7 @@ 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;
@@ -241,7 +234,7 @@ 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;
@@ -250,7 +243,7 @@ package memo_rules_ontology {
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;
@@ -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;
@@ -303,13 +349,51 @@ package memo_rules_ontology {
303
349
  constraint { true }
304
350
  }
305
351
 
352
+ // The predicate here named three features that do not exist — `variantKind`,
353
+ // `baseScenario`, `variationPoint` — so it could never fail, and a rule that
354
+ // cannot fail is coverage on paper only. `baseScenario` is the one the
355
+ // scenario def deliberately refused: "a nominal/alternate pair are scenarios
356
+ // of the same workflow, distinguished by scenarioKind — no baseScenario
357
+ // back-ref". The base of an alternate IS the nominal scenario of its
358
+ // workflow, so the rule asks the containment that already expresses it.
306
359
  constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
307
- attribute :>> id = "CR-ONT-043";
360
+ @MemoIdentity { :>> providedId = "CR-ONT-043"; }
308
361
  attribute tailoring = RuleTailoringKind::invariant;
309
362
  attribute appliesTo = "OperativeScenario";
310
363
  attribute severity = RuleSeverityKind::error;
311
- attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
312
- attribute predicateExpression = "not(variantKind == 'alternate' or variantKind == 'exception' or variantKind == 'recovery') or baseScenario->size() == 1 or variationPoint != ''";
364
+ attribute rationaleText = "An alternate scenario is a variation of a nominal path, so it belongs to a workflow that has one. An alternate with no nominal sibling is either a workflow with no happy path or a scenario filed under the wrong parent.";
365
+ // A nominal scenario usually says nothing: `nominal` is the default on
366
+ // the definition, and a default is not written onto every usage. So the
367
+ // sibling test is "not alternate", and `conformsTo` keeps it from being
368
+ // satisfied by an ordinary step of the same workflow.
369
+ attribute predicateExpression = "not(scenarioKind == 'alternate') or composes.composes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate')";
370
+ constraint { true }
371
+ }
372
+
373
+ // ─── Assurance-trace warnings ────────────────────────────────────────
374
+ // Both are WARNINGS, not errors: each describes a trace graph that is
375
+ // suspicious rather than invalid, and a regulated model has legitimate
376
+ // exceptions to both. They needed `upstream` / `downstream` — the bare
377
+ // relation name is bidirectional, so before those existed no rule could
378
+ // ask which way a derivation ran.
379
+
380
+ constraint def DerivationGapRule :> MemoConsistencyRule {
381
+ @MemoIdentity { :>> providedId = "CR-ONT-080"; }
382
+ attribute tailoring = RuleTailoringKind::invariant;
383
+ attribute appliesTo = "MemoRequirementElement";
384
+ attribute severity = RuleSeverityKind::warning;
385
+ 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.";
386
+ attribute predicateExpression = "downstream(derivesFrom)->isEmpty() or upstream(derivesFrom)->notEmpty() or conformsTo(MemoNeed)";
387
+ constraint { true }
388
+ }
389
+
390
+ constraint def RedundantAncestorTraceRule :> MemoConsistencyRule {
391
+ @MemoIdentity { :>> providedId = "CR-ONT-081"; }
392
+ attribute tailoring = RuleTailoringKind::invariant;
393
+ attribute appliesTo = "MemoRequirementElement";
394
+ attribute severity = RuleSeverityKind::warning;
395
+ attribute rationaleText = "When one element satisfies both a requirement and something derived from that requirement, the trace to the ancestor is already implied by the derivation and adds no coverage. Two elements satisfying the two ends is ordinary decomposition and is not reported.";
396
+ attribute predicateExpression = "not satisfiedBy->intersects(downstream(derivesFrom).satisfiedBy)";
313
397
  constraint { true }
314
398
  }
315
399
  }
@@ -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;
@@ -9,143 +9,144 @@ package memo_viewpoints_catalog {
9
9
  private import memo_core_enumerations::*;
10
10
  private import memo_viewpoints_definitions::*;
11
11
 
12
+ private import memo_core_common::MemoIdentity;
12
13
  // A cataloged viewpoint: the Viewpoint descriptor plus its default
13
14
  // resolution to a standard SysML v2 view kind.
14
15
 
15
16
  // ── Content and context ─────────────────────────────────────
16
17
  viewpoint vpModelContent : MemoViewpoint {
17
- attribute :>> id = "VP-CAT-001"; attribute :>> name = "ModelContentViewpoint";
18
+ @MemoIdentity { :>> providedId = "VP-CAT-001"; } attribute :>> name = "ModelContentViewpoint";
18
19
  attribute :>> purpose = "Browse the model tree and package structure.";
19
20
  attribute :>> defaultViewKind = DiagramViewKind::browser;
20
21
  }
21
22
  viewpoint vpSystemContext : MemoViewpoint {
22
- attribute :>> id = "VP-CAT-002"; attribute :>> name = "SystemContextViewpoint";
23
+ @MemoIdentity { :>> providedId = "VP-CAT-002"; } attribute :>> name = "SystemContextViewpoint";
23
24
  attribute :>> purpose = "System of interest, actors, external systems, and context exchanges.";
24
25
  attribute :>> defaultViewKind = DiagramViewKind::general;
25
26
  }
26
27
  // ── Operational world ───────────────────────────────────────
27
28
  viewpoint vpUseCase : MemoViewpoint {
28
- attribute :>> id = "VP-CAT-003"; attribute :>> name = "UseCaseViewpoint";
29
+ @MemoIdentity { :>> providedId = "VP-CAT-003"; } attribute :>> name = "UseCaseViewpoint";
29
30
  attribute :>> purpose = "Use cases, initiating users, supporting actors, and motivating needs.";
30
31
  attribute :>> defaultViewKind = DiagramViewKind::general;
31
32
  }
32
33
  viewpoint vpClinicalWorkflow : MemoViewpoint {
33
- attribute :>> id = "VP-CAT-004"; attribute :>> name = "ClinicalWorkflowViewpoint";
34
+ @MemoIdentity { :>> providedId = "VP-CAT-004"; } attribute :>> name = "ClinicalWorkflowViewpoint";
34
35
  attribute :>> purpose = "Workflow steps, decisions, parallel work, handoffs, and roles.";
35
36
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
36
37
  }
37
38
  viewpoint vpScenario : MemoViewpoint {
38
- attribute :>> id = "VP-CAT-005"; attribute :>> name = "ScenarioViewpoint";
39
+ @MemoIdentity { :>> providedId = "VP-CAT-005"; } attribute :>> name = "ScenarioViewpoint";
39
40
  attribute :>> purpose = "Selected paths through workflows: variants, conditions, variation points.";
40
41
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
41
42
  }
42
43
  // ── Functional ──────────────────────────────────────────────
43
44
  viewpoint vpFunctionalArchitecture : MemoViewpoint {
44
- attribute :>> id = "VP-CAT-006"; attribute :>> name = "FunctionalArchitectureViewpoint";
45
+ @MemoIdentity { :>> providedId = "VP-CAT-006"; } attribute :>> name = "FunctionalArchitectureViewpoint";
45
46
  attribute :>> purpose = "System functions, capabilities, and functional exchanges.";
46
47
  attribute :>> defaultViewKind = DiagramViewKind::general;
47
48
  }
48
49
  viewpoint vpFunctionalFlow : MemoViewpoint {
49
- attribute :>> id = "VP-CAT-007"; attribute :>> name = "FunctionalFlowViewpoint";
50
+ @MemoIdentity { :>> providedId = "VP-CAT-007"; } attribute :>> name = "FunctionalFlowViewpoint";
50
51
  attribute :>> purpose = "Ordered functional flows and their steps.";
51
52
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
52
53
  }
53
54
  // ── Logical ─────────────────────────────────────────────────
54
55
  viewpoint vpLogicalArchitecture : MemoViewpoint {
55
- attribute :>> id = "VP-CAT-008"; attribute :>> name = "LogicalArchitectureViewpoint";
56
+ @MemoIdentity { :>> providedId = "VP-CAT-008"; } attribute :>> name = "LogicalArchitectureViewpoint";
56
57
  attribute :>> purpose = "Logical components, channels, and allocations.";
57
58
  attribute :>> defaultViewKind = DiagramViewKind::general;
58
59
  }
59
60
  viewpoint vpSystemDecomposition : MemoViewpoint {
60
- attribute :>> id = "VP-CAT-009"; attribute :>> name = "SystemDecompositionViewpoint";
61
+ @MemoIdentity { :>> providedId = "VP-CAT-009"; } attribute :>> name = "SystemDecompositionViewpoint";
61
62
  attribute :>> purpose = "Composition hierarchy of the system of interest.";
62
63
  attribute :>> defaultViewKind = DiagramViewKind::browser;
63
64
  }
64
65
  viewpoint vpInternalInterconnection : MemoViewpoint {
65
- attribute :>> id = "VP-CAT-010"; attribute :>> name = "InternalInterconnectionViewpoint";
66
+ @MemoIdentity { :>> providedId = "VP-CAT-010"; } attribute :>> name = "InternalInterconnectionViewpoint";
66
67
  attribute :>> purpose = "Ports, connectors, and exchanges inside a component boundary.";
67
68
  attribute :>> defaultViewKind = DiagramViewKind::interconnection;
68
69
  }
69
70
  // ── Implementation ──────────────────────────────────────────
70
71
  viewpoint vpSoftwareModule : MemoViewpoint {
71
- attribute :>> id = "VP-CAT-011"; attribute :>> name = "SoftwareModuleViewpoint";
72
+ @MemoIdentity { :>> providedId = "VP-CAT-011"; } attribute :>> name = "SoftwareModuleViewpoint";
72
73
  attribute :>> purpose = "IEC 62304 module structure: systems, items, units, SOUP.";
73
74
  attribute :>> defaultViewKind = DiagramViewKind::general;
74
75
  }
75
76
  viewpoint vpSoftwareComponents : MemoViewpoint {
76
- attribute :>> id = "VP-CAT-012"; attribute :>> name = "SoftwareComponentViewpoint";
77
+ @MemoIdentity { :>> providedId = "VP-CAT-012"; } attribute :>> name = "SoftwareComponentViewpoint";
77
78
  attribute :>> purpose = "Runtime component-and-connector structure with concurrency and scheduling.";
78
79
  attribute :>> defaultViewKind = DiagramViewKind::interconnection;
79
80
  }
80
81
  viewpoint vpHardwareArchitecture : MemoViewpoint {
81
- attribute :>> id = "VP-CAT-013"; attribute :>> name = "HardwareArchitectureViewpoint";
82
+ @MemoIdentity { :>> providedId = "VP-CAT-013"; } attribute :>> name = "HardwareArchitectureViewpoint";
82
83
  attribute :>> purpose = "Electronic/electrical structure and processing platform.";
83
84
  attribute :>> defaultViewKind = DiagramViewKind::general;
84
85
  }
85
86
  viewpoint vpPhysicalArchitecture : MemoViewpoint {
86
- attribute :>> id = "VP-CAT-014"; attribute :>> name = "PhysicalArchitectureViewpoint";
87
+ @MemoIdentity { :>> providedId = "VP-CAT-014"; } attribute :>> name = "PhysicalArchitectureViewpoint";
87
88
  attribute :>> purpose = "Mechanical, fluidic, optical, and other physical realization.";
88
89
  attribute :>> defaultViewKind = DiagramViewKind::general;
89
90
  }
90
91
  viewpoint vpDeviceComposition : MemoViewpoint {
91
- attribute :>> id = "VP-CAT-015"; attribute :>> name = "DeviceCompositionViewpoint";
92
+ @MemoIdentity { :>> providedId = "VP-CAT-015"; } attribute :>> name = "DeviceCompositionViewpoint";
92
93
  attribute :>> purpose = "Device definitions, instances, accessories, and consumables.";
93
94
  attribute :>> defaultViewKind = DiagramViewKind::browser;
94
95
  }
95
96
  viewpoint vpNetworkDeployment : MemoViewpoint {
96
- attribute :>> id = "VP-CAT-016"; attribute :>> name = "NetworkDeploymentViewpoint";
97
+ @MemoIdentity { :>> providedId = "VP-CAT-016"; } attribute :>> name = "NetworkDeploymentViewpoint";
97
98
  attribute :>> purpose = "Deployment units on processing nodes and network topology.";
98
99
  attribute :>> defaultViewKind = DiagramViewKind::interconnection;
99
100
  }
100
101
  // ── Interaction and behavior ────────────────────────────────
101
102
  viewpoint vpUiFlow : MemoViewpoint {
102
- attribute :>> id = "VP-CAT-017"; attribute :>> name = "UiFlowViewpoint";
103
+ @MemoIdentity { :>> providedId = "VP-CAT-017"; } attribute :>> name = "UiFlowViewpoint";
103
104
  attribute :>> purpose = "Interaction flows, UI states, and transitions.";
104
105
  attribute :>> defaultViewKind = DiagramViewKind::statetransition;
105
106
  }
106
107
  viewpoint vpStateMode : MemoViewpoint {
107
- attribute :>> id = "VP-CAT-018"; attribute :>> name = "StateModeViewpoint";
108
+ @MemoIdentity { :>> providedId = "VP-CAT-018"; } attribute :>> name = "StateModeViewpoint";
108
109
  attribute :>> purpose = "System states, device modes, and transitions.";
109
110
  attribute :>> defaultViewKind = DiagramViewKind::statetransition;
110
111
  }
111
112
  viewpoint vpSequenceInteraction : MemoViewpoint {
112
- attribute :>> id = "VP-CAT-019"; attribute :>> name = "SequenceInteractionViewpoint";
113
+ @MemoIdentity { :>> providedId = "VP-CAT-019"; } attribute :>> name = "SequenceInteractionViewpoint";
113
114
  attribute :>> purpose = "Ordered message exchanges between participants in a scenario.";
114
115
  attribute :>> defaultViewKind = DiagramViewKind::sequence;
115
116
  }
116
117
  // ── Assurance ───────────────────────────────────────────────
117
118
  viewpoint vpRequirementsTraceability : MemoViewpoint {
118
- attribute :>> id = "VP-CAT-020"; attribute :>> name = "RequirementsTraceabilityViewpoint";
119
+ @MemoIdentity { :>> providedId = "VP-CAT-020"; } attribute :>> name = "RequirementsTraceabilityViewpoint";
119
120
  attribute :>> purpose = "Needs → requirements → architecture → verification trace matrix.";
120
121
  attribute :>> defaultViewKind = DiagramViewKind::grid;
121
122
  }
122
123
  viewpoint vpRiskChain : MemoViewpoint {
123
- attribute :>> id = "VP-CAT-021"; attribute :>> name = "RiskChainViewpoint";
124
+ @MemoIdentity { :>> providedId = "VP-CAT-021"; } attribute :>> name = "RiskChainViewpoint";
124
125
  attribute :>> purpose = "ISO 14971 chain: hazard → hazardous situation → harm with controls.";
125
126
  attribute :>> defaultViewKind = DiagramViewKind::general;
126
127
  }
127
128
  viewpoint vpCybersecurity : MemoViewpoint {
128
- attribute :>> id = "VP-CAT-022"; attribute :>> name = "CybersecurityViewpoint";
129
+ @MemoIdentity { :>> providedId = "VP-CAT-022"; } attribute :>> name = "CybersecurityViewpoint";
129
130
  attribute :>> purpose = "Assets, threats, trust boundaries, and security controls.";
130
131
  attribute :>> defaultViewKind = DiagramViewKind::general;
131
132
  }
132
133
  viewpoint vpHumanFactors : MemoViewpoint {
133
- attribute :>> id = "VP-CAT-023"; attribute :>> name = "HumanFactorsViewpoint";
134
+ @MemoIdentity { :>> providedId = "VP-CAT-023"; } attribute :>> name = "HumanFactorsViewpoint";
134
135
  attribute :>> purpose = "Users, tasks, use errors, and hazard-related use scenarios.";
135
136
  attribute :>> defaultViewKind = DiagramViewKind::grid;
136
137
  }
137
138
  viewpoint vpVerificationCoverage : MemoViewpoint {
138
- attribute :>> id = "VP-CAT-024"; attribute :>> name = "VerificationCoverageViewpoint";
139
+ @MemoIdentity { :>> providedId = "VP-CAT-024"; } attribute :>> name = "VerificationCoverageViewpoint";
139
140
  attribute :>> purpose = "Verification cases against requirements and functions.";
140
141
  attribute :>> defaultViewKind = DiagramViewKind::grid;
141
142
  }
142
143
  viewpoint vpValidationCoverage : MemoViewpoint {
143
- attribute :>> id = "VP-CAT-025"; attribute :>> name = "ValidationCoverageViewpoint";
144
+ @MemoIdentity { :>> providedId = "VP-CAT-025"; } attribute :>> name = "ValidationCoverageViewpoint";
144
145
  attribute :>> purpose = "Validation cases against use cases and critical tasks.";
145
146
  attribute :>> defaultViewKind = DiagramViewKind::grid;
146
147
  }
147
148
  viewpoint vpEvidenceTraceability : MemoViewpoint {
148
- attribute :>> id = "VP-CAT-026"; attribute :>> name = "EvidenceTraceabilityViewpoint";
149
+ @MemoIdentity { :>> providedId = "VP-CAT-026"; } attribute :>> name = "EvidenceTraceabilityViewpoint";
149
150
  attribute :>> purpose = "Evidence records back to the cases and elements they support.";
150
151
  attribute :>> defaultViewKind = DiagramViewKind::grid;
151
152
  }
@@ -154,14 +155,14 @@ package memo_viewpoints_catalog {
154
155
  // SoftwareComponents realizing a functional OperativeScenario. The viewpoint is the
155
156
  // reusable spec; the diagram of a specific model is the view.
156
157
  viewpoint vpSoftwareSequence : MemoViewpoint {
157
- attribute :>> id = "VP-CAT-027"; attribute :>> name = "SoftwareSequenceViewpoint";
158
+ @MemoIdentity { :>> providedId = "VP-CAT-027"; } attribute :>> name = "SoftwareSequenceViewpoint";
158
159
  attribute :>> purpose = "Runtime message ordering between software components along a functional scenario.";
159
160
  attribute :>> defaultViewKind = DiagramViewKind::sequence;
160
161
  }
161
162
  // The first cataloged viewpoint to resolve to `geometry`: screen regions
162
163
  // carry authored RegionBounds, so a geometry view draws modelled facts.
163
164
  viewpoint vpUILayout : MemoViewpoint {
164
- attribute :>> id = "VP-CAT-028"; attribute :>> name = "UILayoutViewpoint";
165
+ @MemoIdentity { :>> providedId = "VP-CAT-028"; } attribute :>> name = "UILayoutViewpoint";
165
166
  attribute :>> purpose = "Captured screens with their marked regions and the UI elements those regions present.";
166
167
  attribute :>> defaultViewKind = DiagramViewKind::geometry;
167
168
  }
@@ -4,10 +4,12 @@ package memo_viewpoints_clinical_clinical_viewpoint {
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
+ private import memo_core_common::*;
8
+ private import memo_core_common::MemoIdentity;
7
9
  viewpoint clinicalViewpoint : MemoViewpoint {
8
- attribute :>> id = "VP-CLIN";
10
+ @MemoIdentity { :>> providedId = "VP-CLIN"; }
9
11
  attribute :>> name = "ClinicalViewpoint";
10
- attribute :>> shortDescription = "Shows clinical context, users, use environment, and clinical evidence.";
12
+ @MemoIdentity { :>> shortDescription = "Shows clinical context, users, use environment, and clinical evidence."; }
11
13
  attribute :>> description = "Default viewpoint derived from the context and assurance layers for clinical stakeholders — intended use, patient/clinician interaction, clinical evidence, and clinical safety claims.";
12
14
  attribute :>> purpose = "Communicate clinical use context and clinical evidence for the device.";
13
15
  attribute :>> audience = (AudienceKind::clinicalEngineer, AudienceKind::regulatoryEngineer);
@@ -4,10 +4,12 @@ package memo_viewpoints_context_context_viewpoint {
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
+ private import memo_core_common::*;
8
+ private import memo_core_common::MemoIdentity;
7
9
  viewpoint contextViewpoint : MemoViewpoint {
8
- attribute :>> id = "VP-CTX";
10
+ @MemoIdentity { :>> providedId = "VP-CTX"; }
9
11
  attribute :>> name = "ContextViewpoint";
10
- attribute :>> shortDescription = "Shows actors, use context, and system boundary.";
12
+ @MemoIdentity { :>> shortDescription = "Shows actors, use context, and system boundary."; }
11
13
  attribute :>> description = "Default viewpoint derived from the context layer to communicate who interacts with the device, under which use conditions, and where trust or safety boundaries exist.";
12
14
  attribute :>> purpose = "Communicate operational context and boundaries.";
13
15
  attribute :>> audience = (AudienceKind::systemArchitect);
@@ -28,7 +30,7 @@ package memo_viewpoints_context_context_viewpoint {
28
30
  // boundary picture. Projects derive their own verbs from it and are
29
31
  // picked up through the specialization closure. The three older
30
32
  // relations remain for models authored before it existed.
31
- attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "flow", "bind", "connect");
33
+ attribute :>> allowedRelationshipKinds = ("InteractsInContext", "connect", "flow", "bind");
32
34
  attribute :>> userExtensible = true;
33
35
  }
34
36
  }
@@ -5,19 +5,21 @@ package memo_viewpoints_context_views_system_context_view {
5
5
  private import memo_core_enumerations::*;
6
6
  private import memo_viewpoints_context_context_viewpoint::*;
7
7
 
8
+ private import memo_core_common::*;
9
+ private import memo_core_common::MemoIdentity;
8
10
  view systemContextView : MemoDiagramView {
9
11
  expose memo_viewpoints_context_views_system_context_view::*;
10
12
  attribute depth = 2;
11
- attribute :>> id = "VIEW-CTX-001";
13
+ @MemoIdentity { :>> providedId = "VIEW-CTX-001"; }
12
14
  attribute :>> name = "SystemContextView";
13
- attribute :>> shortDescription = "Actors, use context, and system boundary.";
15
+ @MemoIdentity { :>> shortDescription = "Actors, use context, and system boundary."; }
14
16
  attribute :>> outputKind = (ViewOutputKind::diagram);
15
17
  attribute :>> presentationKind = (PresentationKind::blockDiagram);
16
18
  attribute :>> diagramType = "bdd";
17
19
  attribute :>> autoPopulate = true;
18
20
  attribute :>> queryDescription = "Include actors, use contexts, and trust boundaries at the system boundary.";
19
21
  part :>> selectionQuery {
20
- attribute :>> id = "QRY-CTX-001";
22
+ @MemoIdentity { :>> providedId = "QRY-CTX-001"; }
21
23
  attribute :>> name = "SystemContextQuery";
22
24
  attribute :>> includeElementKinds = ("Actor", "UseContext", "TrustBoundary");
23
25
  attribute :>> includeLayers = ("context");
@@ -4,10 +4,12 @@ package memo_viewpoints_cybersecurity_cybersecurity_viewpoint {
4
4
  private import memo_viewpoints_definitions::*;
5
5
  private import memo_core_enumerations::*;
6
6
 
7
+ private import memo_core_common::*;
8
+ private import memo_core_common::MemoIdentity;
7
9
  viewpoint cybersecurityViewpoint : MemoViewpoint {
8
- attribute :>> id = "VP-CYB";
10
+ @MemoIdentity { :>> providedId = "VP-CYB"; }
9
11
  attribute :>> name = "CybersecurityViewpoint";
10
- attribute :>> shortDescription = "Shows assets, trust boundaries, threats, vulnerabilities, cyber hazards, cyber risks, and mitigations.";
12
+ @MemoIdentity { :>> shortDescription = "Shows assets, trust boundaries, threats, vulnerabilities, cyber hazards, cyber risks, and mitigations."; }
11
13
  attribute :>> description = "Default viewpoint derived from the cybersecurity layer, using STRIDE-style threat categories by default while allowing safety and privacy impacts to be traced into the broader model.";
12
14
  attribute :>> purpose = "Communicate cybersecurity design, threat analysis, and cyber risk posture.";
13
15
  attribute :>> audience = (AudienceKind::securityEngineer);