@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
@@ -7,6 +7,7 @@ package memo_core_relationships {
7
7
  private import memo_core_common::*;
8
8
  private import memo_core_enumerations::*;
9
9
 
10
+ private import Allocations::Allocation;
10
11
  // All MEMO relations are native SysML v2 `connection def`s (each is a
11
12
  // Connection/Association), specializing the MemoRelationship base. The
12
13
  // relationship name is the verb; the RelationshipRegistry derives the
@@ -107,17 +108,6 @@ package memo_core_relationships {
107
108
  // only when no specific relation carries the meaning, and say why in the
108
109
  // inherited `rationale` — an untyped link with no stated reason is an
109
110
  // audit gap, not a model fact.
110
- connection def MemoLink :> MemoRelationship {
111
- doc /* Generic association between any two model elements. */
112
- end linkSource :>> source;
113
- end linkTarget :>> target;
114
- }
115
- abstract connection memoLinkLinks : MemoLink[*];
116
- metadata def <memoLink> MemoLinkMetadata :> SemanticMetadata {
117
- :> annotatedElement : SysML::ConnectionDefinition;
118
- :> annotatedElement : SysML::ConnectionUsage;
119
- :>> baseType = memoLinkLinks meta SysML::Usage;
120
- }
121
111
 
122
112
  connection def DerivesFrom :> MemoRelationship {
123
113
  // Drivers span metaclasses — a need is a requirement def, a hazard an
@@ -206,57 +196,40 @@ package memo_core_relationships {
206
196
 
207
197
  // Enables unifies the former EnablesWorkflow / EnablesActivity synonyms
208
198
  // (an enabling system/function enables a workflow/activity).
209
- connection def Enables :> MemoRelationship {
210
- end enabling :>> source;
211
- end enabled : MemoAction :>> target;
212
- }
213
- abstract connection enablesLinks : Enables[*];
214
- metadata def <enables> EnablesMetadata :> SemanticMetadata {
215
- :> annotatedElement : SysML::ConnectionDefinition;
216
- :> annotatedElement : SysML::ConnectionUsage;
217
- :>> baseType = enablesLinks meta SysML::Usage;
218
- }
199
+ // `Enables` is native `dependency` (2026-08-18): write
200
+ // `dependency from <enabling> to <enabled>;`. Same call as `Supports`,
201
+ // which was deleted as a duplicate of both `dependency` and `Enables`.
219
202
 
220
- connection def HostedBy :> MemoRelationship {
203
+ // A processing node hosted by an assembly is allocated to it. The end
204
+ // NAMES were already right; two of the three usages wrote them in reverse
205
+ // order, and the builder binds by position, so those two edges pointed the
206
+ // wrong way. See the reversed-end-name lint in memo-tools.
207
+ allocation def HostedBy :> MemoRelationship, Allocations::Allocation {
221
208
  end processingNode : MemoPart :>> source;
222
209
  end hostAssembly : MemoPart :>> target;
223
210
  }
224
211
  abstract connection hostedByLinks : HostedBy[*];
225
212
  metadata def <hostedBy> HostedByMetadata :> SemanticMetadata {
226
- :> annotatedElement : SysML::ConnectionDefinition;
227
- :> annotatedElement : SysML::ConnectionUsage;
213
+ :> annotatedElement : SysML::AllocationDefinition;
214
+ :> annotatedElement : SysML::AllocationUsage;
228
215
  :>> baseType = hostedByLinks meta SysML::Usage;
229
216
  }
230
217
 
231
218
 
232
219
 
233
220
 
234
- // Composes is the single whole/part decomposition relation. It unifies the
235
- // former ComposesLogical / AssemblyComprises / Contains{Component,Element} /
236
- // {Workflow,Task,Activity,Scenario}Comprises* / FlowComprisesSpec /
237
- // Collection membership is carried by the end instance.
238
- // types, so the ends are generic MemoPart.
239
- connection def Composes :> MemoRelationship {
240
- end parent :>> source;
241
- end child :>> target;
242
- }
243
- abstract connection composesLinks : Composes[*];
244
- metadata def <composes> ComposesMetadata :> SemanticMetadata {
245
- :> annotatedElement : SysML::ConnectionDefinition;
246
- :> annotatedElement : SysML::ConnectionUsage;
247
- :>> baseType = composesLinks meta SysML::Usage;
248
- }
221
+ // `Composes` is deleted (R10-S7). Containment is NESTING — the child is
222
+ // declared inside the parent — which is how SysML v2 models composition:
223
+ // composite feature ownership, not a link. The relation specialized
224
+ // `Connections::BinaryConnection`, "a link between two things WITHIN some
225
+ // containing structure", so it was the wrong category for the containment
226
+ // itself, and the corpus has no composition connection to specialize.
227
+ //
228
+ // Nothing is lost: the builder synthesizes a `composes` edge from every
229
+ // nested part and item, so rules, the DSM and traceability read exactly the
230
+ // graph they read before. The edge type is registered natively in
231
+ // memo-tools' relationship registry.
249
232
 
250
- connection def AnalyzedBy :> MemoRelationship {
251
- end element : MemoPart :>> source;
252
- end analysisArtifact : AnalysisArtifact :>> target;
253
- }
254
- abstract connection analyzedByLinks : AnalyzedBy[*];
255
- metadata def <analyzedBy> AnalyzedByMetadata :> SemanticMetadata {
256
- :> annotatedElement : SysML::ConnectionDefinition;
257
- :> annotatedElement : SysML::ConnectionUsage;
258
- :>> baseType = analyzedByLinks meta SysML::Usage;
259
- }
260
233
 
261
234
  connection def BindsToInterface :> MemoRelationship {
262
235
  end portElement :>> source;
@@ -3,8 +3,10 @@ package memo_methodology_archetypes {
3
3
 
4
4
  private import memo_methodology_core::*;
5
5
 
6
+ private import memo_core_common::*;
7
+ private import memo_core_common::MemoIdentity;
6
8
  part minimal : Archetype {
7
- attribute :>> id = "ARCH-MINIMAL";
9
+ @MemoIdentity { :>> providedId = "ARCH-MINIMAL"; }
8
10
  attribute :>> name = "Minimal";
9
11
  attribute :>> label = "Minimal";
10
12
  attribute :>> description = "Core ontology only — requirements, hazards, basic architecture (~53 kinds)";
@@ -15,7 +17,7 @@ package memo_methodology_archetypes {
15
17
  }
16
18
 
17
19
  part standardArchetype : Archetype {
18
- attribute :>> id = "ARCH-STANDARD";
20
+ @MemoIdentity { :>> providedId = "ARCH-STANDARD"; }
19
21
  attribute :>> name = "Standard";
20
22
  attribute :>> label = "Standard";
21
23
  attribute :>> description = "Core + risk + software + DHF — covers most Class II devices (~120 kinds)";
@@ -26,7 +28,7 @@ package memo_methodology_archetypes {
26
28
  }
27
29
 
28
30
  part full : Archetype {
29
- attribute :>> id = "ARCH-FULL";
31
+ @MemoIdentity { :>> providedId = "ARCH-FULL"; }
30
32
  attribute :>> name = "Full";
31
33
  attribute :>> label = "Full";
32
34
  attribute :>> description = "All architecture layers, standards, and extensions (~200+ kinds)";
@@ -37,7 +39,7 @@ package memo_methodology_archetypes {
37
39
  }
38
40
 
39
41
  part samd : Archetype {
40
- attribute :>> id = "ARCH-SAMD";
42
+ @MemoIdentity { :>> providedId = "ARCH-SAMD"; }
41
43
  attribute :>> name = "SaMD";
42
44
  attribute :>> label = "Software as Medical Device (SaMD)";
43
45
  attribute :>> description = "Clinical decision support, diagnostic algorithm, AI/ML tool, mobile medical app";
@@ -48,7 +50,7 @@ package memo_methodology_archetypes {
48
50
  }
49
51
 
50
52
  part connected : Archetype {
51
- attribute :>> id = "ARCH-CONNECTED";
53
+ @MemoIdentity { :>> providedId = "ARCH-CONNECTED"; }
52
54
  attribute :>> name = "Connected";
53
55
  attribute :>> label = "Connected / IoT Device";
54
56
  attribute :>> description = "Remote monitoring, wearable, smart device with cloud connectivity and cybersecurity requirements";
@@ -59,7 +61,7 @@ package memo_methodology_archetypes {
59
61
  }
60
62
 
61
63
  part monitoring : Archetype {
62
- attribute :>> id = "ARCH-MONITORING";
64
+ @MemoIdentity { :>> providedId = "ARCH-MONITORING"; }
63
65
  attribute :>> name = "Monitoring";
64
66
  attribute :>> label = "Monitoring / Diagnostic Device";
65
67
  attribute :>> description = "Patient monitor, ECG, SpO2, vital signs, bedside diagnostic equipment";
@@ -70,7 +72,7 @@ package memo_methodology_archetypes {
70
72
  }
71
73
 
72
74
  part infusion_pump : Archetype {
73
- attribute :>> id = "ARCH-INFUSION";
75
+ @MemoIdentity { :>> providedId = "ARCH-INFUSION"; }
74
76
  attribute :>> name = "InfusionPump";
75
77
  attribute :>> label = "Infusion / Drug Delivery Device";
76
78
  attribute :>> description = "Infusion pump, syringe driver, implantable drug delivery, dosing device";
@@ -81,7 +83,7 @@ package memo_methodology_archetypes {
81
83
  }
82
84
 
83
85
  part blank : Archetype {
84
- attribute :>> id = "ARCH-BLANK";
86
+ @MemoIdentity { :>> providedId = "ARCH-BLANK"; }
85
87
  attribute :>> name = "Blank";
86
88
  attribute :>> label = "Blank Project";
87
89
  attribute :>> description = "Start from scratch with a minimal SysML shell";
@@ -113,14 +113,4 @@ package memo_methodology_core {
113
113
  // ── Relations owned by this package ─────────────────────────────
114
114
  // Moved out of memo_core_relationships: their ends are typed against
115
115
  // types declared here, and core must not depend on a domain package.
116
- connection def ResolvesToMethodology :> MemoRelationship {
117
- end boundModelElement : MemoPart :>> source;
118
- end resolvedMethodology : MethodologyDefinition :>> target;
119
- }
120
- abstract connection resolvesToMethodologyLinks : ResolvesToMethodology[*];
121
- metadata def <resolvesToMethodology> ResolvesToMethodologyMetadata :> SemanticMetadata {
122
- :> annotatedElement : SysML::ConnectionDefinition;
123
- :> annotatedElement : SysML::ConnectionUsage;
124
- :>> baseType = resolvesToMethodologyLinks meta SysML::Usage;
125
- }
126
116
  }
@@ -9,8 +9,10 @@ package memo_methodology_profiles {
9
9
  private import memo_core_enumerations::*;
10
10
  private import memo_core_methodology_scope::*;
11
11
 
12
+ private import memo_core_common::*;
13
+ private import memo_core_common::MemoIdentity;
12
14
  part mdCoreLibrary : MethodologyLibrary {
13
- attribute :>> id = "METHLIB-001";
15
+ @MemoIdentity { :>> providedId = "METHLIB-001"; }
14
16
  attribute :>> name = "MedicalDeviceMethodologyLibrary";
15
17
  attribute :>> version = "0.1";
16
18
  attribute :>> domain = "medical device modeling";
@@ -31,7 +33,7 @@ package memo_methodology_profiles {
31
33
  // that into `allAvailable` preserves the effective result and removes the
32
34
  // second scope authority.
33
35
  part mdDefaultDefinition : MethodologyDefinition {
34
- attribute :>> id = "METH-MD-DEFAULT";
36
+ @MemoIdentity { :>> providedId = "METH-MD-DEFAULT"; }
35
37
  attribute :>> name = "MedicalDeviceDefault";
36
38
  attribute :>> version = "0.6.5";
37
39
  attribute :>> domain = "medical device modeling";
@@ -40,7 +42,7 @@ package memo_methodology_profiles {
40
42
  }
41
43
 
42
44
  part useRiskAndResidualRule : ElementUsageRule {
43
- attribute :>> id = "RULE-001";
45
+ @MemoIdentity { :>> providedId = "RULE-001"; }
44
46
  attribute :>> name = "UseRiskAndResidualRisk";
45
47
  attribute :>> elementTypeName = "Risk,ResidualRisk,RiskMatrix";
46
48
  attribute :>> strength = RuleStrengthKind::recommended;
@@ -48,7 +50,7 @@ package memo_methodology_profiles {
48
50
  }
49
51
 
50
52
  part requireVerifiedByRule : RelationUsageRule {
51
- attribute :>> id = "RULE-002";
53
+ @MemoIdentity { :>> providedId = "RULE-002"; }
52
54
  attribute :>> name = "VerifiedBysRequired";
53
55
  attribute :>> relationTypeName = "verify";
54
56
  attribute :>> strength = RuleStrengthKind::required;
@@ -56,7 +58,7 @@ package memo_methodology_profiles {
56
58
  }
57
59
 
58
60
  part lightRiskPattern : ModelingPattern {
59
- attribute :>> id = "PAT-001";
61
+ @MemoIdentity { :>> providedId = "PAT-001"; }
60
62
  attribute :>> name = "LightRiskBeforeAfterPattern";
61
63
  attribute :>> intent = "Model hazard chain, before/after mitigation risk, controls, and residual evaluation in a lightweight way.";
62
64
  attribute :>> stage = WorkflowStageKind::risk;
@@ -64,7 +66,7 @@ package memo_methodology_profiles {
64
66
  }
65
67
 
66
68
  part lightTracePattern : ModelingPattern {
67
- attribute :>> id = "PAT-002";
69
+ @MemoIdentity { :>> providedId = "PAT-002"; }
68
70
  attribute :>> name = "CoreTracePattern";
69
71
  attribute :>> intent = "Need or risk to requirement, requirement to architecture, requirement/control to verification.";
70
72
  attribute :>> stage = WorkflowStageKind::requirements;
@@ -72,7 +74,7 @@ package memo_methodology_profiles {
72
74
  }
73
75
 
74
76
  action stepRequirements : MethodologyWorkflowStep {
75
- attribute :>> id = "STEP-001";
77
+ @MemoIdentity { :>> providedId = "STEP-001"; }
76
78
  attribute :>> name = "CaptureRequirements";
77
79
  attribute :>> stage = WorkflowStageKind::requirements;
78
80
  attribute :>> objectiveDescription = "Capture stakeholder needs and derive requirements.";
@@ -81,7 +83,7 @@ package memo_methodology_profiles {
81
83
  }
82
84
 
83
85
  action stepArchitecture : MethodologyWorkflowStep {
84
- attribute :>> id = "STEP-002";
86
+ @MemoIdentity { :>> providedId = "STEP-002"; }
85
87
  attribute :>> name = "DefineArchitecture";
86
88
  attribute :>> stage = WorkflowStageKind::architecture;
87
89
  attribute :>> objectiveDescription = "Define key software and hardware architecture elements and interfaces.";
@@ -90,7 +92,7 @@ package memo_methodology_profiles {
90
92
  }
91
93
 
92
94
  action stepRisk : MethodologyWorkflowStep {
93
- attribute :>> id = "STEP-003";
95
+ @MemoIdentity { :>> providedId = "STEP-003"; }
94
96
  attribute :>> name = "PerformRiskAnalysis";
95
97
  attribute :>> stage = WorkflowStageKind::risk;
96
98
  attribute :>> objectiveDescription = "Create core risk chain and controls.";
@@ -99,7 +101,7 @@ package memo_methodology_profiles {
99
101
  }
100
102
 
101
103
  action stepVerification : MethodologyWorkflowStep {
102
- attribute :>> id = "STEP-004";
104
+ @MemoIdentity { :>> providedId = "STEP-004"; }
103
105
  attribute :>> name = "PlanVerification";
104
106
  attribute :>> stage = WorkflowStageKind::verificationStage;
105
107
  attribute :>> objectiveDescription = "Define verification and evidence expectations.";
@@ -111,7 +113,7 @@ package memo_methodology_profiles {
111
113
  first stepRisk then stepVerification;
112
114
 
113
115
  part gateLightComplete : QualityGate {
114
- attribute :>> id = "GATE-001";
116
+ @MemoIdentity { :>> providedId = "GATE-001"; }
115
117
  attribute :>> name = "LightMethodReady";
116
118
  attribute :>> gateStage = WorkflowStageKind::verificationStage;
117
119
  attribute :>> passCriteria = "Core traceability, risk, verification, and RMF view support are present.";
@@ -123,7 +125,7 @@ package memo_methodology_profiles {
123
125
  // references its methodology with a typed SysML reference.
124
126
 
125
127
  part rmpDoc : DhfDocumentBinding {
126
- attribute :>> id = "DHF-001";
128
+ @MemoIdentity { :>> providedId = "DHF-001"; }
127
129
  attribute :>> name = "RiskManagementPlan";
128
130
  attribute :>> documentTitle = "Risk Management Plan";
129
131
  attribute :>> groupLabel = "Risk Management";
@@ -135,7 +137,7 @@ package memo_methodology_profiles {
135
137
  }
136
138
 
137
139
  part harDoc : DhfDocumentBinding {
138
- attribute :>> id = "DHF-002";
140
+ @MemoIdentity { :>> providedId = "DHF-002"; }
139
141
  attribute :>> name = "HazardAnalysisReport";
140
142
  attribute :>> documentTitle = "Hazard Analysis Report";
141
143
  attribute :>> groupLabel = "Risk Management";
@@ -147,7 +149,7 @@ package memo_methodology_profiles {
147
149
  }
148
150
 
149
151
  part sadDoc : DhfDocumentBinding {
150
- attribute :>> id = "DHF-003";
152
+ @MemoIdentity { :>> providedId = "DHF-003"; }
151
153
  attribute :>> name = "SoftwareArchitectureDescription";
152
154
  attribute :>> documentTitle = "Software Architecture Description";
153
155
  attribute :>> groupLabel = "Software";
@@ -159,7 +161,7 @@ package memo_methodology_profiles {
159
161
  }
160
162
 
161
163
  part threatModelDoc : DhfDocumentBinding {
162
- attribute :>> id = "DHF-004";
164
+ @MemoIdentity { :>> providedId = "DHF-004"; }
163
165
  attribute :>> name = "CybersecurityThreatModel";
164
166
  attribute :>> documentTitle = "Threat Model";
165
167
  attribute :>> groupLabel = "Cybersecurity";
@@ -171,7 +173,7 @@ package memo_methodology_profiles {
171
173
  }
172
174
 
173
175
  part vvPlanDoc : DhfDocumentBinding {
174
- attribute :>> id = "DHF-005";
176
+ @MemoIdentity { :>> providedId = "DHF-005"; }
175
177
  attribute :>> name = "VerificationValidationPlan";
176
178
  attribute :>> documentTitle = "V&V Plan";
177
179
  attribute :>> groupLabel = "Verification & Validation";
@@ -7,10 +7,12 @@ package memo_rules_closure {
7
7
  private import memo_core_consistency_rules::*;
8
8
  private import memo_core_enumerations::*;
9
9
 
10
+ private import memo_core_common::*;
11
+ private import memo_core_common::MemoIdentity;
10
12
  // ─── Risk Layer Rules ────────────────────────────────────────────────
11
13
 
12
14
  constraint def HazardMitigationRule :> MemoConsistencyRule {
13
- attribute :>> id = "CR-MED-001";
15
+ @MemoIdentity { :>> providedId = "CR-MED-001"; }
14
16
  attribute tailoring = RuleTailoringKind::assurance;
15
17
  attribute appliesTo = "Hazard";
16
18
  attribute severity = RuleSeverityKind::error;
@@ -20,7 +22,7 @@ package memo_rules_closure {
20
22
  }
21
23
 
22
24
  constraint def HazardSeverityRule :> MemoConsistencyRule {
23
- attribute :>> id = "CR-MED-002";
25
+ @MemoIdentity { :>> providedId = "CR-MED-002"; }
24
26
  attribute tailoring = RuleTailoringKind::assurance;
25
27
  attribute appliesTo = "Hazard";
26
28
  attribute severity = RuleSeverityKind::error;
@@ -30,7 +32,7 @@ package memo_rules_closure {
30
32
  }
31
33
 
32
34
  constraint def RiskControlVerificationRule :> MemoConsistencyRule {
33
- attribute :>> id = "CR-MED-003";
35
+ @MemoIdentity { :>> providedId = "CR-MED-003"; }
34
36
  attribute tailoring = RuleTailoringKind::assurance;
35
37
  attribute appliesTo = "RiskControlMeasure";
36
38
  attribute severity = RuleSeverityKind::error;
@@ -40,7 +42,7 @@ package memo_rules_closure {
40
42
  }
41
43
 
42
44
  constraint def InitialRiskMatrixRule :> MemoConsistencyRule {
43
- attribute :>> id = "CR-MED-004";
45
+ @MemoIdentity { :>> providedId = "CR-MED-004"; }
44
46
  attribute tailoring = RuleTailoringKind::assurance;
45
47
  attribute appliesTo = "Risk";
46
48
  attribute severity = RuleSeverityKind::warning;
@@ -52,9 +54,9 @@ package memo_rules_closure {
52
54
  // ─── Requirements Layer Rules ────────────────────────────────────────
53
55
 
54
56
  constraint def SysReqTraceRule :> MemoConsistencyRule {
55
- attribute :>> id = "CR-MED-010";
57
+ @MemoIdentity { :>> providedId = "CR-MED-010"; }
56
58
  attribute tailoring = RuleTailoringKind::assurance;
57
- attribute appliesTo = "Requirement[requirementKind=system]";
59
+ attribute appliesTo = "Requirement[requirementType=system]";
58
60
  attribute severity = RuleSeverityKind::error;
59
61
  attribute rationaleText = "Requirements shall be traceable to stakeholder needs per ISO 13485.";
60
62
  attribute predicateExpression = "derivesFrom->size() >= 1";
@@ -62,9 +64,9 @@ package memo_rules_closure {
62
64
  }
63
65
 
64
66
  constraint def SwReqTraceRule :> MemoConsistencyRule {
65
- attribute :>> id = "CR-MED-011";
67
+ @MemoIdentity { :>> providedId = "CR-MED-011"; }
66
68
  attribute tailoring = RuleTailoringKind::assurance;
67
- attribute appliesTo = "Requirement[requirementKind=software]";
69
+ attribute appliesTo = "Requirement[requirementType=software]";
68
70
  attribute severity = RuleSeverityKind::error;
69
71
  attribute rationaleText = "Software requirements derive from system requirements per IEC 62304.";
70
72
  attribute predicateExpression = "derivesFrom->size() >= 1";
@@ -80,7 +82,7 @@ package memo_rules_closure {
80
82
  // ─── Architecture Layer Rules ────────────────────────────────────────
81
83
 
82
84
  constraint def SwComponentSafetyClassRule :> MemoConsistencyRule {
83
- attribute :>> id = "CR-MED-020";
85
+ @MemoIdentity { :>> providedId = "CR-MED-020"; }
84
86
  attribute tailoring = RuleTailoringKind::assurance;
85
87
  attribute appliesTo = "SoftwareModule";
86
88
  attribute severity = RuleSeverityKind::error;
@@ -90,7 +92,7 @@ package memo_rules_closure {
90
92
  }
91
93
 
92
94
  constraint def SwComponentReqRule :> MemoConsistencyRule {
93
- attribute :>> id = "CR-MED-021";
95
+ @MemoIdentity { :>> providedId = "CR-MED-021"; }
94
96
  attribute tailoring = RuleTailoringKind::assurance;
95
97
  attribute appliesTo = "SoftwareModule";
96
98
  attribute severity = RuleSeverityKind::warning;
@@ -100,7 +102,7 @@ package memo_rules_closure {
100
102
  }
101
103
 
102
104
  constraint def LogicalFunctionAllocationRule :> MemoConsistencyRule {
103
- attribute :>> id = "CR-MED-022";
105
+ @MemoIdentity { :>> providedId = "CR-MED-022"; }
104
106
  attribute tailoring = RuleTailoringKind::assurance;
105
107
  attribute appliesTo = "SystemFunction";
106
108
  attribute severity = RuleSeverityKind::warning;
@@ -109,10 +111,44 @@ package memo_rules_closure {
109
111
  constraint { true }
110
112
  }
111
113
 
114
+ // A function that no edge reaches is not in the chain. This was a
115
+ // TypeScript rule (BV-002) applying to every action usage in the model,
116
+ // which reported a scenario and a flow step as defects for not being
117
+ // wired like a function. It is declared here instead: scoped by the
118
+ // ontology to the family it is about, tailorable by a methodology, and
119
+ // readable next to the rule that requires the allocation.
120
+ constraint def FunctionInChainRule :> MemoConsistencyRule {
121
+ @MemoIdentity { :>> providedId = "CR-MED-023"; }
122
+ attribute tailoring = RuleTailoringKind::assurance;
123
+ attribute appliesTo = "MemoFunction";
124
+ attribute severity = RuleSeverityKind::warning;
125
+ attribute rationaleText = "A function participates in the functional chain through a flow or a succession, or through the functions it decomposes into. One that participates in none of them is unreachable behaviour: nothing triggers it and nothing consumes what it produces.";
126
+ // `downstream` and not a bare `composes`: the relation navigates both
127
+ // ways, so a bare name would exempt every child on the strength of
128
+ // having a parent. A decomposed function participates through its
129
+ // parts; a leaf has to be reached by an edge of its own.
130
+ attribute predicateExpression = "flow->size() >= 1 or succession->size() >= 1 or downstream(composes)->size() >= 1";
131
+ constraint { true }
132
+ }
133
+
134
+ // A user need names the user whose need it is. IEC 62366-1's user profile
135
+ // is typed on the User element — population, impairments, training,
136
+ // qualification — so the need points at that element rather than restating
137
+ // any of it in prose, which is what `userPopulationReference` was doing.
138
+ constraint def UserNeedIdentifiesUserRule :> MemoConsistencyRule {
139
+ @MemoIdentity { :>> providedId = "CR-MED-024"; }
140
+ attribute tailoring = RuleTailoringKind::assurance;
141
+ attribute appliesTo = "Need";
142
+ attribute severity = RuleSeverityKind::warning;
143
+ attribute rationaleText = "A user need is a need someone has. Which users a device serves, and what they can be assumed to see, know and do, is the input a usability engineering file is built from (IEC 62366-1 5.1); a need that names no user leaves that input to prose.";
144
+ attribute predicateExpression = "not(needKind == 'user' or needKind == 'clinicalUser' or needKind == 'patientUser') or heldBy->size() >= 1";
145
+ constraint { true }
146
+ }
147
+
112
148
  // ─── Verification Layer Rules ────────────────────────────────────────
113
149
 
114
150
  constraint def VerificationCaseMethodRule :> MemoConsistencyRule {
115
- attribute :>> id = "CR-MED-030";
151
+ @MemoIdentity { :>> providedId = "CR-MED-030"; }
116
152
  attribute tailoring = RuleTailoringKind::assurance;
117
153
  attribute appliesTo = "VerificationCase";
118
154
  attribute severity = RuleSeverityKind::error;
@@ -122,7 +158,7 @@ package memo_rules_closure {
122
158
  }
123
159
 
124
160
  constraint def VerificationCaseTargetRule :> MemoConsistencyRule {
125
- attribute :>> id = "CR-MED-031";
161
+ @MemoIdentity { :>> providedId = "CR-MED-031"; }
126
162
  attribute tailoring = RuleTailoringKind::assurance;
127
163
  attribute appliesTo = "VerificationCase";
128
164
  attribute severity = RuleSeverityKind::error;
@@ -132,7 +168,7 @@ package memo_rules_closure {
132
168
  }
133
169
 
134
170
  constraint def EvidenceProductionRule :> MemoConsistencyRule {
135
- attribute :>> id = "CR-MED-032";
171
+ @MemoIdentity { :>> providedId = "CR-MED-032"; }
136
172
  attribute tailoring = RuleTailoringKind::assurance;
137
173
  attribute appliesTo = "VerificationCase";
138
174
  attribute severity = RuleSeverityKind::warning;
@@ -144,7 +180,7 @@ package memo_rules_closure {
144
180
  // ─── Cybersecurity Layer Rules ───────────────────────────────────────
145
181
 
146
182
  constraint def ThreatMitigationRule :> MemoConsistencyRule {
147
- attribute :>> id = "CR-MED-040";
183
+ @MemoIdentity { :>> providedId = "CR-MED-040"; }
148
184
  attribute tailoring = RuleTailoringKind::assurance;
149
185
  attribute appliesTo = "Threat";
150
186
  attribute severity = RuleSeverityKind::error;
@@ -154,7 +190,7 @@ package memo_rules_closure {
154
190
  }
155
191
 
156
192
  constraint def AssetThreatLinkRule :> MemoConsistencyRule {
157
- attribute :>> id = "CR-MED-041";
193
+ @MemoIdentity { :>> providedId = "CR-MED-041"; }
158
194
  attribute tailoring = RuleTailoringKind::assurance;
159
195
  attribute appliesTo = "CybersecurityAsset";
160
196
  attribute severity = RuleSeverityKind::warning;
@@ -166,7 +202,7 @@ package memo_rules_closure {
166
202
  // ─── Interface Rules ─────────────────────────────────────────────────
167
203
 
168
204
  constraint def LogicalInterfaceDirectionRule :> MemoConsistencyRule {
169
- attribute :>> id = "CR-MED-050";
205
+ @MemoIdentity { :>> providedId = "CR-MED-050"; }
170
206
  attribute tailoring = RuleTailoringKind::assurance;
171
207
  attribute appliesTo = "Interface";
172
208
  attribute severity = RuleSeverityKind::error;
@@ -178,7 +214,7 @@ package memo_rules_closure {
178
214
  // ─── Conditional Rules ───────────────────────────────────────────────
179
215
 
180
216
  constraint def SafetyClassCVerificationRule :> MemoConsistencyRule {
181
- attribute :>> id = "CR-MED-101";
217
+ @MemoIdentity { :>> providedId = "CR-MED-101"; }
182
218
  attribute tailoring = RuleTailoringKind::assurance;
183
219
  attribute appliesTo = "SoftwareModule";
184
220
  attribute severity = RuleSeverityKind::error;
@@ -203,7 +239,7 @@ package memo_rules_closure {
203
239
  // triggers. Chrome must be DECLARED `decoration`; an element left
204
240
  // unclassified fails rather than passing as scenery.
205
241
  constraint def UiElementDesignRecordRule :> MemoConsistencyRule {
206
- attribute :>> id = "CR-MED-110";
242
+ @MemoIdentity { :>> providedId = "CR-MED-110"; }
207
243
  attribute tailoring = RuleTailoringKind::assurance;
208
244
  attribute appliesTo = "UIElement";
209
245
  attribute severity = RuleSeverityKind::error;
@@ -217,7 +253,7 @@ package memo_rules_closure {
217
253
  // The interactive-form restriction lives in the predicate because it spans
218
254
  // several enum values.
219
255
  constraint def ControlInvokesFunctionRule :> MemoConsistencyRule {
220
- attribute :>> id = "CR-MED-111";
256
+ @MemoIdentity { :>> providedId = "CR-MED-111"; }
221
257
  attribute tailoring = RuleTailoringKind::assurance;
222
258
  attribute appliesTo = "UIElement";
223
259
  attribute severity = RuleSeverityKind::warning;
@@ -230,7 +266,7 @@ package memo_rules_closure {
230
266
  // unconfirmed machine guess must never reach a design review looking like
231
267
  // an engineering decision.
232
268
  constraint def BoundsDetectionConfirmedRule :> MemoConsistencyRule {
233
- attribute :>> id = "CR-MED-112";
269
+ @MemoIdentity { :>> providedId = "CR-MED-112"; }
234
270
  attribute tailoring = RuleTailoringKind::assurance;
235
271
  attribute appliesTo = "UIElement";
236
272
  attribute severity = RuleSeverityKind::warning;
@@ -242,7 +278,7 @@ package memo_rules_closure {
242
278
  // A screenshot with no build behind it is undated design intent, not
243
279
  // evidence of what the device does.
244
280
  constraint def ScreenCaptureProvenanceRule :> MemoConsistencyRule {
245
- attribute :>> id = "CR-MED-113";
281
+ @MemoIdentity { :>> providedId = "CR-MED-113"; }
246
282
  attribute tailoring = RuleTailoringKind::assurance;
247
283
  attribute appliesTo = "ScreenCapture";
248
284
  attribute severity = RuleSeverityKind::error;
@@ -6,8 +6,10 @@ package memo_rules_crosslayer {
6
6
  private import memo_core_consistency_rules::*;
7
7
  private import memo_core_enumerations::*;
8
8
 
9
+ private import memo_core_common::*;
10
+ private import memo_core_common::MemoIdentity;
9
11
  constraint def RiskToReqTraceRule :> MemoConsistencyRule {
10
- attribute :>> id = "XL-001";
12
+ @MemoIdentity { :>> providedId = "XL-001"; }
11
13
  attribute tailoring = RuleTailoringKind::assurance;
12
14
  attribute appliesTo = "Hazard";
13
15
  attribute severity = RuleSeverityKind::warning;
@@ -17,9 +19,9 @@ package memo_rules_crosslayer {
17
19
  }
18
20
 
19
21
  constraint def ReqToArchTraceRule :> MemoConsistencyRule {
20
- attribute :>> id = "XL-002";
22
+ @MemoIdentity { :>> providedId = "XL-002"; }
21
23
  attribute tailoring = RuleTailoringKind::assurance;
22
- attribute appliesTo = "Requirement[requirementKind=system]";
24
+ attribute appliesTo = "Requirement[requirementType=system]";
23
25
  attribute severity = RuleSeverityKind::warning;
24
26
  attribute rationaleText = "Requirements-to-architecture traceability per IEC 62304.";
25
27
  attribute predicateExpression = "satisfiedBy->size() >= 1";