@memoarchitect/ontology 0.7.0 → 0.8.22

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 (204) hide show
  1. package/README.md +4 -2
  2. package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +1 -1
  3. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +7 -5
  4. package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
  5. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +18 -8
  6. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +341 -99
  7. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +25 -11
  8. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +328 -271
  9. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +52 -11
  10. package/examples/gpca-pump/model/catalog/gpca_context.sysml +9 -0
  11. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +9 -5
  12. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +175 -259
  13. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +82 -58
  14. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +5 -10
  15. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +101 -100
  16. package/examples/gpca-pump/model/catalog/gpca_standards.sysml +161 -0
  17. package/examples/gpca-pump/model/catalog/gpca_system.sysml +15 -2
  18. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +274 -331
  19. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +115 -35
  20. package/examples/gpca-pump/model/catalog/project.sysml +5 -0
  21. package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +1 -1
  22. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +1 -1
  23. package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +1 -1
  24. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +1 -1
  25. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +2 -2
  26. package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +1 -1
  27. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +1 -1
  28. package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +1 -1
  29. package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +2 -2
  30. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +5 -2
  31. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -2
  32. package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +1 -1
  33. package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +1 -1
  34. package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +2 -2
  35. package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -2
  36. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +4 -2
  37. package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +1 -1
  38. package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +3 -2
  39. package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -2
  40. package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +133 -128
  41. package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +139 -157
  42. package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +56 -33
  43. package/examples/nested-architecture-dsm/model/catalog/traces.sysml +25 -26
  44. package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -5
  45. package/examples/ros-mobile-robot/README.md +40 -0
  46. package/examples/ros-mobile-robot/model/catalog/project.sysml +33 -0
  47. package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +296 -0
  48. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/viewpoint.sysml +7 -0
  49. package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +13 -0
  50. package/examples/software-only-medical-device/model/catalog/project.sysml +4 -0
  51. package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -5
  52. package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +56 -60
  53. package/examples/surgical-robot/model/catalog/surgical_robot.sysml +1 -1
  54. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +10 -15
  55. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +7 -9
  56. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +42 -66
  57. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +56 -66
  58. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +26 -55
  59. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +3 -6
  60. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +0 -18
  61. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +51 -82
  62. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +21 -31
  63. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +12 -8
  64. package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +28 -21
  65. package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +57 -33
  66. package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +102 -79
  67. package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +5 -5
  68. package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +21 -6
  69. package/examples/ui-screen-regions/model/catalog/relationships.sysml +8 -0
  70. package/examples/ui-screen-regions/model/catalog/traces.sysml +28 -125
  71. package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -1
  72. package/extensions/LICENSES/MIT.txt +19 -0
  73. package/extensions/README.md +94 -0
  74. package/extensions/aadl/memo.package.yaml +18 -0
  75. package/extensions/aadl/src/aadl_extension.sysml +6 -0
  76. package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +147 -0
  77. package/extensions/aadl/src/methodology/aadl_methodology.sysml +17 -0
  78. package/extensions/aadl/src/runtime/memo_aadl_runtime.sysml +56 -0
  79. package/extensions/cloud/memo.package.yaml +18 -0
  80. package/extensions/cloud/src/cloud_extension.sysml +44 -0
  81. package/extensions/cloud/src/methodology/cloud_methodology.sysml +17 -0
  82. package/extensions/container/memo.package.yaml +18 -0
  83. package/extensions/container/src/container_extension.sysml +37 -0
  84. package/extensions/container/src/methodology/container_methodology.sysml +17 -0
  85. package/extensions/messaging/memo.package.yaml +18 -0
  86. package/extensions/messaging/src/messaging_extension.sysml +64 -0
  87. package/extensions/messaging/src/methodology/messaging_methodology.sysml +17 -0
  88. package/extensions/ros/memo.package.yaml +18 -0
  89. package/extensions/ros/src/methodology/ros_methodology.sysml +25 -0
  90. package/extensions/ros/src/ros_extension.sysml +200 -0
  91. package/extensions/template/src/extension.sysml +37 -0
  92. package/memo.manifest.yaml +13 -2
  93. package/methodologies/default/memo.package.yaml +1 -1
  94. package/methodologies/gpca/memo.package.yaml +1 -1
  95. package/ontology/memo.package.yaml +1 -1
  96. package/package.json +5 -3
  97. package/profile/memo.package.yaml +1 -1
  98. package/src/architecture/decisions/memo_decisions.sysml +23 -2
  99. package/src/architecture/functional/behavior/memo_behavior.sysml +49 -21
  100. package/src/architecture/functional/constraints/memo_constraints.sysml +3 -2
  101. package/src/architecture/functional/functions/memo_functions.sysml +91 -34
  102. package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +46 -22
  103. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +37 -10
  104. package/src/architecture/implementation/ui/memo_ui.sysml +78 -38
  105. package/src/architecture/logical/interfaces/memo_interfaces.sysml +63 -11
  106. package/src/architecture/logical/structure/memo_logical_structure.sysml +21 -20
  107. package/src/architecture/operational/activities/memo_activities.sysml +10 -3
  108. package/src/architecture/operational/context/actors/memo_actors.sysml +5 -8
  109. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +13 -30
  110. package/src/architecture/operational/context/use_context/memo_use_context.sysml +42 -16
  111. package/src/architecture/operational/scenarios/memo_scenarios.sysml +57 -23
  112. package/src/architecture/operational/use_cases/memo_use_cases.sysml +35 -26
  113. package/src/architecture/operational/workflows/memo_workflows.sysml +29 -10
  114. package/src/architecture/realization/deployment/memo_deployment.sysml +111 -16
  115. package/src/architecture/realization/physical/memo_physical_architecture.sysml +27 -2
  116. package/src/artifacts/configuration_management/memo_configuration_management.sysml +16 -0
  117. package/src/artifacts/core/memo_controlled_artifacts.sysml +3 -1
  118. package/src/artifacts/standards/cfr_21_820.sysml +116 -0
  119. package/src/artifacts/standards/fda_cybersecurity_2023.sysml +80 -0
  120. package/src/artifacts/standards/iec_60601_1.sysml +149 -0
  121. package/src/artifacts/standards/iec_60601_1_2.sysml +56 -0
  122. package/src/artifacts/standards/iec_60812.sysml +51 -0
  123. package/src/artifacts/standards/iec_62304.sysml +210 -0
  124. package/src/artifacts/standards/iec_62366_1.sysml +113 -0
  125. package/src/artifacts/standards/iec_81001_5_1.sysml +84 -0
  126. package/src/artifacts/standards/iso_13485.sysml +113 -0
  127. package/src/artifacts/standards/iso_14971.sysml +94 -0
  128. package/src/artifacts/standards/iso_iec_ieee_42010.sysml +42 -0
  129. package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +132 -0
  130. package/src/artifacts/templates/dhf/21cfr820/design-input.md +1 -1
  131. package/src/artifacts/templates/dhf/21cfr820/design-output.md +5 -5
  132. package/src/artifacts/templates/dhf/21cfr820/design-review.md +1 -1
  133. package/src/artifacts/templates/dhf/21cfr820/design-validation.md +2 -2
  134. package/src/artifacts/templates/dhf/21cfr820/design-verification.md +2 -2
  135. package/src/artifacts/templates/dhf/21cfr820/dhf-index.md +2 -2
  136. package/src/artifacts/templates/dhf/21cfr820/transfer-plan.md +1 -1
  137. package/src/artifacts/templates/dhf/21cfr820/user-needs.md +1 -1
  138. package/src/artifacts/templates/dhf/21cfr820/vv-plan.md +3 -3
  139. package/src/artifacts/templates/dhf/21cfr820/vv-report.md +4 -4
  140. package/src/artifacts/templates/dhf/fda-cybersecurity/incident-response.md +1 -1
  141. package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +3 -2
  142. package/src/artifacts/templates/dhf/fda-cybersecurity/security-arch.md +2 -2
  143. package/src/artifacts/templates/dhf/fda-cybersecurity/threat-model.md +4 -4
  144. package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +4 -3
  145. package/src/artifacts/templates/dhf/iec-60601/hrs.md +170 -0
  146. package/src/artifacts/templates/dhf/iec-62304/detailed-design.md +1 -1
  147. package/src/artifacts/templates/dhf/iec-62304/integration-test.md +3 -3
  148. package/src/artifacts/templates/dhf/iec-62304/sad.md +6 -5
  149. package/src/artifacts/templates/dhf/iec-62304/sbom.md +3 -2
  150. package/src/artifacts/templates/dhf/iec-62304/sdp.md +5 -4
  151. package/src/artifacts/templates/dhf/iec-62304/soup.md +4 -2
  152. package/src/artifacts/templates/dhf/iec-62304/srs.md +54 -20
  153. package/src/artifacts/templates/dhf/iec-62304/sw-traceability.md +3 -3
  154. package/src/artifacts/templates/dhf/iec-62304/system-test.md +1 -1
  155. package/src/artifacts/templates/dhf/iec-62366/summative-eval.md +1 -1
  156. package/src/artifacts/templates/dhf/iec-62366/task-analysis.md +40 -4
  157. package/src/artifacts/templates/dhf/iec-62366/ue-plan.md +1 -1
  158. package/src/artifacts/templates/dhf/iec-62366/urra.md +3 -3
  159. package/src/artifacts/templates/dhf/iso-14971/fmea.md +42 -19
  160. package/src/artifacts/templates/dhf/iso-14971/har.md +3 -3
  161. package/src/artifacts/templates/dhf/iso-14971/rmp.md +2 -2
  162. package/src/artifacts/templates/dhf/system/sad.md +173 -0
  163. package/src/artifacts/templates/dhf/system/standards-checklist.md +87 -0
  164. package/src/artifacts/templates/dhf/system/standards-traceability.md +125 -0
  165. package/src/artifacts/templates/dhf/system/syrs.md +128 -0
  166. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +39 -20
  167. package/src/assurance/human_factors/memo_human_factors.sysml +29 -22
  168. package/src/assurance/requirements/memo_requirements.sysml +5 -2
  169. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  170. package/src/assurance/safety_risk/analysis/memo_fmea.sysml +118 -13
  171. package/src/assurance/safety_risk/memo_risk.sysml +78 -7
  172. package/src/assurance/safety_risk/postmarket_surveillance/memo_postmarket_surveillance.sysml +16 -0
  173. package/src/assurance/verification_validation/memo_assurance.sysml +17 -21
  174. package/src/core/annotations/memo_annotations.sysml +25 -6
  175. package/src/core/common/memo_common.sysml +121 -16
  176. package/src/core/consistency_rules/consistency_rules.sysml +1 -1
  177. package/src/core/dimensions/dimensions.sysml +12 -0
  178. package/src/core/enumerations/memo_enumerations.sysml +60 -14
  179. package/src/core/relationships/memo_relationships.sysml +199 -196
  180. package/src/memo_namespaces.sysml +30 -0
  181. package/src/methodology/core/memo_core.sysml +24 -0
  182. package/src/methodology/profiles/memo_profiles.sysml +1 -1
  183. package/src/rules/ontology/ontology_invariants.sysml +213 -1
  184. package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +3 -3
  185. package/src/viewpoints/clinical/clinical_viewpoint.sysml +1 -1
  186. package/src/viewpoints/context/context_viewpoint.sysml +1 -1
  187. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +1 -1
  188. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +1 -0
  189. package/src/viewpoints/functional/functional_viewpoint.sysml +1 -1
  190. package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +1 -1
  191. package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +1 -1
  192. package/src/viewpoints/operational/operational_viewpoint.sysml +1 -1
  193. package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +1 -1
  194. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +1 -1
  195. package/src/viewpoints/verification/verification_viewpoint.sysml +1 -1
  196. package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +1 -1
  197. package/examples/extensions/README.md +0 -16
  198. package/examples/extensions/template/src/extension.sysml +0 -15
  199. package/examples/gpca-pump/gpca-pump.kpar +0 -0
  200. /package/{examples/extensions → extensions}/clinical/memo.package.yaml +0 -0
  201. /package/{examples/extensions → extensions}/clinical/src/clinical_extension.sysml +0 -0
  202. /package/{examples/extensions → extensions}/clinical/src/methodology/clinical_methodology.sysml +0 -0
  203. /package/{examples/extensions → extensions}/clinical/src/procedures/memo_clinical_procedures.sysml +0 -0
  204. /package/{examples/extensions → extensions}/template/memo.package.yaml +0 -0
@@ -67,7 +67,7 @@ package memo_rules_ontology {
67
67
  constraint def SafetyCriticalFunctionVerifiedRule :> MemoConsistencyRule {
68
68
  attribute id = "CR-ONT-040";
69
69
  attribute tailoring = RuleTailoringKind::invariant;
70
- attribute appliesTo = "SystemFunction";
70
+ attribute appliesTo = "MemoFunction";
71
71
  attribute severity = RuleSeverityKind::error;
72
72
  attribute rationaleText = "Safety-critical functions (criticality high or catastrophic) must trace to at least one verification case.";
73
73
  attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or verifiedBy->size() >= 1";
@@ -91,6 +91,218 @@ package memo_rules_ontology {
91
91
  attribute predicateExpression = "not(severity == 'serious' or severity == 'critical' or severity == 'catastrophic') or causes->size() >= 1 or tracesRisk->size() >= 1";
92
92
  constraint { true }
93
93
  }
94
+ // ─── Relation end conformance (Track A0) ─────────────────────────────
95
+ //
96
+ // These rules carry the constraints that `connection def` end TYPES used to
97
+ // carry in memo_core_relationships. The types had to go: KerML forbids a
98
+ // port or a behaviour from specializing a part-based type, so a
99
+ // `MemoPart`-typed end forced every endpoint to be a part — which is why
100
+ // ports are part defs, why a function is a part with its behaviour stapled
101
+ // on, and why `allocate <function> to <actor>` is rejected. See the Track A0
102
+ // note at the top of memo_core_relationships.
103
+ //
104
+ // Each rule states what its end stated, in the one vocabulary that survives
105
+ // the metaclass split:
106
+ //
107
+ // * `conformsTo(Base)` — SysML specialization against a MEMO base. This is
108
+ // the part the end type expressed, and it still works within a metaclass.
109
+ // * `construct == 'action' | 'port' | 'state' | …` — the SysML METACLASS.
110
+ // No MEMO base can say this, because the bases are per-metaclass by
111
+ // construction; a type-based end could only ever admit one of them.
112
+ //
113
+ // Several of these are WIDER than the end they replace, and deliberately so:
114
+ // the ends were being violated by content that already shipped. `composes`
115
+ // was typed MemoPart/MemoPart and links StateMachine (a state def) to
116
+ // WorkflowStep (an action def); `verifiedBy`'s source was typed MemoPart and
117
+ // most of its sources are requirement defs; `precedes` was typed
118
+ // ArchitectureElement and joins OperationalActivity to OperationalActivity.
119
+ // A rule that reproduced the old type exactly would have failed on the
120
+ // flagship example on the day it landed. What each rule asserts is the
121
+ // constraint the end MEANT, stated so it can be checked.
122
+ //
123
+ // Subject scope is `Model`, following CR-ONT-001: a statement about the ends
124
+ // of a relation quantifies over its LINKS, not over elements of one kind, so
125
+ // no per-element subject can reach it. The cost is that a violation names
126
+ // the rule and not the offending link; the rationale text names the relation
127
+ // and the admissible types so the report is still actionable.
128
+
129
+ constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
130
+ attribute id = "CR-ONT-060";
131
+ attribute tailoring = RuleTailoringKind::invariant;
132
+ attribute appliesTo = "Model";
133
+ attribute severity = RuleSeverityKind::error;
134
+ attribute rationaleText = "Only a requirement or a need is satisfied by something. The source end of SatisfiedBy must conform to MemoRequirementElement.";
135
+ attribute predicateExpression = "sourcesOf(satisfiedBy)->forAll(conformsTo(MemoRequirementElement))";
136
+ constraint { true }
137
+ }
138
+ constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
139
+ attribute id = "CR-ONT-061";
140
+ attribute tailoring = RuleTailoringKind::invariant;
141
+ attribute appliesTo = "Model";
142
+ attribute severity = RuleSeverityKind::error;
143
+ attribute rationaleText = "A requirement is satisfied by a designed thing: an architecture element, an actor, a behaviour, or a port. Never by another requirement or by a document.";
144
+ attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor) or construct == 'action' or construct == 'port')";
145
+ constraint { true }
146
+ }
147
+ constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
148
+ attribute id = "CR-ONT-062";
149
+ attribute tailoring = RuleTailoringKind::invariant;
150
+ attribute appliesTo = "Model";
151
+ attribute severity = RuleSeverityKind::error;
152
+ attribute rationaleText = "A verification case verifies a requirement, a risk control, an architecture element, a behaviour, or a port — something a test can be run against. Not a view, not an evidence record.";
153
+ attribute predicateExpression = "sourcesOf(verifiedBy)->forAll(conformsTo(MemoPart) or construct == 'requirement' or construct == 'action' or construct == 'port')";
154
+ constraint { true }
155
+ }
156
+ constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
157
+ attribute id = "CR-ONT-063";
158
+ attribute tailoring = RuleTailoringKind::invariant;
159
+ attribute appliesTo = "Model";
160
+ attribute severity = RuleSeverityKind::error;
161
+ attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is an architecture element or an action.";
162
+ attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
163
+ constraint { true }
164
+ }
165
+ constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
166
+ attribute id = "CR-ONT-064";
167
+ attribute tailoring = RuleTailoringKind::invariant;
168
+ attribute appliesTo = "Model";
169
+ attribute severity = RuleSeverityKind::error;
170
+ attribute rationaleText = "A function is allocated to an architecture element or to an actor — ARCADIA System Analysis allocates to the system OR to an actor, which the former ArchitectureElement-typed end made impossible.";
171
+ attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(ArchitectureElement) or conformsTo(Actor))";
172
+ constraint { true }
173
+ }
174
+ constraint def ComposesParentKindRule :> MemoConsistencyRule {
175
+ attribute id = "CR-ONT-065";
176
+ attribute tailoring = RuleTailoringKind::invariant;
177
+ attribute appliesTo = "Model";
178
+ attribute severity = RuleSeverityKind::error;
179
+ attribute rationaleText = "A whole in a decomposition is a part, a behaviour, or a state machine. A requirement does not compose anything.";
180
+ attribute predicateExpression = "sourcesOf(composes)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'state')";
181
+ constraint { true }
182
+ }
183
+ constraint def ComposesChildKindRule :> MemoConsistencyRule {
184
+ attribute id = "CR-ONT-066";
185
+ attribute tailoring = RuleTailoringKind::invariant;
186
+ attribute appliesTo = "Model";
187
+ attribute severity = RuleSeverityKind::error;
188
+ attribute rationaleText = "A part in a decomposition is a part, a behaviour, a state, or a port — a component owns its ports, and a workflow owns its steps.";
189
+ attribute predicateExpression = "targetsOf(composes)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'state' or construct == 'port')";
190
+ constraint { true }
191
+ }
192
+ constraint def PrecedesEndKindRule :> MemoConsistencyRule {
193
+ attribute id = "CR-ONT-067";
194
+ attribute tailoring = RuleTailoringKind::invariant;
195
+ attribute appliesTo = "Model";
196
+ attribute severity = RuleSeverityKind::error;
197
+ attribute rationaleText = "Precedence orders things that happen: architecture elements or behaviours, at both ends.";
198
+ attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action') and targetsOf(precedes)->forAll(conformsTo(ArchitectureElement) or construct == 'action')";
199
+ constraint { true }
200
+ }
201
+ constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
202
+ attribute id = "CR-ONT-068";
203
+ attribute tailoring = RuleTailoringKind::invariant;
204
+ attribute appliesTo = "Model";
205
+ attribute severity = RuleSeverityKind::error;
206
+ attribute rationaleText = "A performer is an operational entity, an actor, or a system action — a part or a behaviour. The end's own documentation said 'or system action' while its MemoPart type forbade one.";
207
+ attribute predicateExpression = "sourcesOf(performs)->forAll(conformsTo(MemoPart) or construct == 'action')";
208
+ constraint { true }
209
+ }
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
+ constraint def BindsToInterfaceEndKindRule :> MemoConsistencyRule {
220
+ attribute id = "CR-ONT-070";
221
+ attribute tailoring = RuleTailoringKind::invariant;
222
+ attribute appliesTo = "Model";
223
+ attribute severity = RuleSeverityKind::error;
224
+ attribute rationaleText = "A port binds to an interface. The bound end is an interface definition, which the former InterfaceElement-typed end could not hold at all — Interface specializes MemoInterface, an interface def, not a part.";
225
+ attribute predicateExpression = "sourcesOf(bindsToInterface)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(bindsToInterface)->forAll(conformsTo(InterfaceElement) or construct == 'interface' or construct == 'port')";
226
+ constraint { true }
227
+ }
228
+ constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
229
+ attribute id = "CR-ONT-071";
230
+ attribute tailoring = RuleTailoringKind::invariant;
231
+ attribute appliesTo = "Model";
232
+ attribute severity = RuleSeverityKind::error;
233
+ attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange item.";
234
+ attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(ArchitectureElement) or construct == 'item')";
235
+ constraint { true }
236
+ }
237
+
238
+ // CR-ONT-002's replacement. ComponentExchange's endpoints are `ref`
239
+ // features, not links, and the builder projects them as element-ID STRINGS
240
+ // in the attribute map (a §13.3 string pseudo-reference) — so they cannot be
241
+ // reached with sourcesOf/targetsOf. They are resolved here by looking the id
242
+ // up in the kind extent, which is the same statement made the long way.
243
+ constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
244
+ attribute id = "CR-ONT-072";
245
+ attribute tailoring = RuleTailoringKind::invariant;
246
+ attribute appliesTo = "ComponentExchange";
247
+ attribute severity = RuleSeverityKind::error;
248
+ attribute rationaleText = "An exchange starts at a component or at a boundary port. Stating it as a rule is what let the endpoint refs stop being MemoPart-typed, which is what lets PhysicalPort and SoftwarePort become port defs.";
249
+ attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.sourceEndpoint)";
250
+ constraint { true }
251
+ }
252
+ constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
253
+ attribute id = "CR-ONT-073";
254
+ attribute tailoring = RuleTailoringKind::invariant;
255
+ attribute appliesTo = "ComponentExchange";
256
+ attribute severity = RuleSeverityKind::error;
257
+ attribute rationaleText = "An exchange ends at a component or at a boundary port, on the same grounds as CR-ONT-072.";
258
+ attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('ArchitectureElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.targetEndpoint)";
259
+ constraint { true }
260
+ }
261
+
262
+ // ─── The functional chain ────────────────────────────────────────────
263
+ //
264
+ // What makes ComponentFunction a definition of its own rather than an enum
265
+ // member on SystemFunction. An enum value cannot change a multiplicity, and
266
+ // "answerable to exactly one component" is the whole content of the concept.
267
+
268
+ constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
269
+ attribute id = "CR-ONT-074";
270
+ attribute tailoring = RuleTailoringKind::invariant;
271
+ attribute appliesTo = "ComponentFunction";
272
+ attribute severity = RuleSeverityKind::error;
273
+ attribute rationaleText = "A component function is the responsibility of exactly one component, and AllocatedTo is what names it. A component function allocated nowhere is a responsibility nobody has accepted; one allocated twice is a responsibility nobody owns. A system-level responsibility with no single owner is a SystemFunction, which allows that.";
274
+ attribute predicateExpression = "allocatedTo->size() == 1";
275
+ constraint { true }
276
+ }
277
+ constraint def FunctionDecomposesIntoFunctionsRule :> MemoConsistencyRule {
278
+ attribute id = "CR-ONT-075";
279
+ attribute tailoring = RuleTailoringKind::invariant;
280
+ attribute appliesTo = "MemoFunction";
281
+ attribute severity = RuleSeverityKind::error;
282
+ attribute rationaleText = "The functional chain decomposes functions into functions. A function composed of a component, or owned by one, is confusing allocation with decomposition — the component is named by AllocatedTo, never by Composes.";
283
+ attribute predicateExpression = "composes->forAll(conformsTo(MemoFunction))";
284
+ constraint { true }
285
+ }
286
+
287
+ // Track A3. The flow is the edge; the exchange part carries the budget and
288
+ // assurance attributes. The two halves are bound by a SHARED NAME — the flow
289
+ // usage is named with its exchange — and this is what makes that binding a
290
+ // checked fact rather than a convention someone can quietly break.
291
+ //
292
+ // It needs `linksOf`, because the question is about a link's IDENTITY, not
293
+ // about what sits at its ends: `sourcesOf`/`targetsOf` yield the elements at
294
+ // the ends and can never answer it. Naming the flow is what the grammar's
295
+ // restored FlowDeclaration name makes possible at all.
296
+ constraint def ExchangeHasFlowRule :> MemoConsistencyRule {
297
+ attribute id = "CR-ONT-076";
298
+ attribute tailoring = RuleTailoringKind::invariant;
299
+ attribute appliesTo = "ComponentExchange";
300
+ attribute severity = RuleSeverityKind::error;
301
+ attribute rationaleText = "An exchange states that something crosses a boundary, which is an EDGE, and the edge is a native flow. The part def exists for the budget and assurance attributes a reader has to find from the edge, so the two are named alike and this rule holds them together. An exchange with no flow is a budget attached to nothing.";
302
+ attribute predicateExpression = "linksOf(flow)->exists(id == subject.id)";
303
+ constraint { true }
304
+ }
305
+
94
306
  constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
95
307
  attribute id = "CR-ONT-043";
96
308
  attribute tailoring = RuleTailoringKind::invariant;
@@ -34,8 +34,8 @@ package memo_viewpoints_catalog {
34
34
  attribute :>> purpose = "Workflow steps, decisions, parallel work, handoffs, and roles.";
35
35
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
36
36
  }
37
- part vpOperativeScenario : Viewpoint {
38
- attribute :>> id = "VP-CAT-005"; attribute :>> name = "OperativeScenarioViewpoint";
37
+ part vpScenario : Viewpoint {
38
+ attribute :>> id = "VP-CAT-005"; attribute :>> name = "ScenarioViewpoint";
39
39
  attribute :>> purpose = "Selected paths through workflows: variants, conditions, variation points.";
40
40
  attribute :>> defaultViewKind = DiagramViewKind::actionflow;
41
41
  }
@@ -151,7 +151,7 @@ package memo_viewpoints_catalog {
151
151
  }
152
152
  // A software sequence diagram is a VIEW conforming to this viewpoint
153
153
  // (ISO/IEC/IEEE 42010): it frames the runtime message ordering between
154
- // SoftwareComponents realizing a FunctionalScenario. The viewpoint is the
154
+ // SoftwareComponents realizing a functional MemoScenario. The viewpoint is the
155
155
  // reusable spec; the diagram of a specific model is the view.
156
156
  part vpSoftwareSequence : Viewpoint {
157
157
  attribute :>> id = "VP-CAT-027"; attribute :>> name = "SoftwareSequenceViewpoint";
@@ -20,7 +20,7 @@ package memo_viewpoints_clinical_clinical_viewpoint {
20
20
  attribute :>> includedLayers = ("context", "assurance");
21
21
  attribute :>> explorerLane = "assurance";
22
22
  attribute :>> explorerOrder = 4;
23
- attribute :>> allowedElementKinds = ("Actor", "UseContext", "Evidence");
23
+ attribute :>> allowedElementKinds = ("Actor", "UseContext", "MemoEvidence");
24
24
  attribute :>> userExtensible = true;
25
25
  }
26
26
  }
@@ -29,7 +29,7 @@ package memo_viewpoints_context_context_viewpoint {
29
29
  // boundary picture. Projects derive their own verbs from it and are
30
30
  // picked up through the specialization closure. The three older
31
31
  // relations remain for models authored before it existed.
32
- attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "ExchangesWith", "ConnectsPhysically");
32
+ attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "flow", "bind", "connect");
33
33
  attribute :>> userExtensible = true;
34
34
  }
35
35
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_cybersecurity_cybersecurity_viewpoint {
20
20
  attribute :>> includedLayers = ("cybersecurity", "software_structure", "hardware_structure", "interfaces", "risk", "assurance");
21
21
  attribute :>> explorerLane = "assurance";
22
22
  attribute :>> explorerOrder = 3;
23
- attribute :>> allowedElementKinds = ("CybersecurityAsset", "Threat", "Vulnerability", "CyberHazard", "CyberRisk", "CyberMitigation", "SecurityRequirement", "TrustBoundary", "ThreatScenario");
23
+ attribute :>> allowedElementKinds = ("CybersecurityAsset", "Threat", "Vulnerability", "CyberHazard", "CyberRisk", "CyberMitigation", "SecurityRequirement", "TrustBoundary", "MemoScenario[scenarioKind=threat]");
24
24
  attribute :>> allowedRelationshipKinds = ("ThreatenedBy", "Exploits", "RealizedByScenario", "Mitigates", "DerivesCyberRequirement", "ImpactsSafety", "CrossesTrustBoundary");
25
25
  attribute :>> documentUsage = ("Secure Product Development", "Threat Model", "Cybersecurity Risk Assessment", "QMSR");
26
26
  attribute :>> userExtensible = true;
@@ -1,4 +1,5 @@
1
1
  package memo_viewpoints_definitions {
2
+ private import Metaobjects::SemanticMetadata;
2
3
  private import ScalarValues::*;
3
4
 
4
5
  private import memo_core_common::*;
@@ -20,7 +20,7 @@ package memo_viewpoints_functional_functional_viewpoint {
20
20
  attribute :>> includedLayers = ("functions");
21
21
  attribute :>> explorerLane = "architecture";
22
22
  attribute :>> explorerOrder = 2;
23
- attribute :>> allowedElementKinds = ("SystemFunction", "FunctionalFlow", "FunctionalFlowStep", "FunctionalScenario", "FunctionalExchange");
23
+ attribute :>> allowedElementKinds = ("SystemFunction", "ComponentFunction", "FunctionalFlow", "FunctionalFlowStep", "MemoScenario[scenarioKind=functional]", "FunctionalExchange");
24
24
  attribute :>> userExtensible = true;
25
25
  }
26
26
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_functional_views_function_allocation_view {
20
20
  part :>> selectionQuery {
21
21
  attribute :>> id = "QRY-FUNC-002";
22
22
  attribute :>> name = "FunctionAllocationQuery";
23
- attribute :>> includeElementKinds = ("SystemFunction", "LogicalComponent");
23
+ attribute :>> includeElementKinds = ("SystemFunction", "ComponentFunction", "LogicalComponent");
24
24
  attribute :>> includeLayers = ("functions", "logical_structure");
25
25
  attribute :>> rationaleText = "Auto-populate function-to-component allocation from the functions and logical structure layers.";
26
26
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_functional_views_system_functional_tree_view {
20
20
  part :>> selectionQuery {
21
21
  attribute :>> id = "QRY-FUNC-001";
22
22
  attribute :>> name = "SystemFunctionalTreeQuery";
23
- attribute :>> includeElementKinds = ("SystemFunction");
23
+ attribute :>> includeElementKinds = ("SystemFunction", "ComponentFunction");
24
24
  attribute :>> includeLayers = ("functions");
25
25
  attribute :>> rationaleText = "Auto-populate the functional tree from the functions layer.";
26
26
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_operational_operational_viewpoint {
20
20
  attribute :>> includedLayers = ("context", "operational", "system");
21
21
  attribute :>> explorerLane = "architecture";
22
22
  attribute :>> explorerOrder = 1;
23
- attribute :>> allowedElementKinds = ("Actor", "UseContext", "OperationalActivity", "OperativeScenario");
23
+ attribute :>> allowedElementKinds = ("Actor", "UseContext", "OperationalActivity", "MemoScenario[scenarioKind=operative]");
24
24
  attribute :>> userExtensible = true;
25
25
  }
26
26
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_operational_views_use_case_view {
20
20
  part :>> selectionQuery {
21
21
  attribute :>> id = "QRY-OPS-001";
22
22
  attribute :>> name = "UseCaseQuery";
23
- attribute :>> includeElementKinds = ("Actor", "UseContext", "OperativeScenario");
23
+ attribute :>> includeElementKinds = ("Actor", "UseContext", "MemoScenario[scenarioKind=operative]");
24
24
  attribute :>> includeLayers = ("context", "operational");
25
25
  attribute :>> rationaleText = "Auto-populate the use case view from the context and operational layers.";
26
26
  }
@@ -21,7 +21,7 @@ package memo_viewpoints_ui_layout_ui_layout_viewpoint {
21
21
  attribute :>> explorerLane = "architecture";
22
22
  attribute :>> explorerOrder = 4;
23
23
  attribute :>> allowedElementKinds = ("ScreenCapture", "UIElement", "UserInterface");
24
- attribute :>> allowedRelationshipKinds = ("CapturesScreen", "NavigatesTo", "Composes", "SatisfiedBy", "ElementTriggersAction");
24
+ attribute :>> allowedRelationshipKinds = ("CapturesScreen", "NavigatesTo", "Composes", "satisfy", "ElementTriggersAction");
25
25
  attribute :>> defaultViewKind = DiagramViewKind::geometry;
26
26
  attribute :>> userExtensible = true;
27
27
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_verification_verification_viewpoint {
20
20
  attribute :>> includedLayers = ("requirements", "assurance");
21
21
  attribute :>> explorerLane = "assurance";
22
22
  attribute :>> explorerOrder = 5;
23
- attribute :>> allowedElementKinds = ("Requirement", "VerificationCase", "ValidationCase", "Evidence", "TestArtifact");
23
+ attribute :>> allowedElementKinds = ("Requirement", "VerificationCase", "ValidationCase", "MemoEvidence");
24
24
  attribute :>> userExtensible = true;
25
25
  }
26
26
  }
@@ -20,7 +20,7 @@ package memo_viewpoints_verification_views_verification_coverage_view {
20
20
  part :>> selectionQuery {
21
21
  attribute :>> id = "QRY-VER-001";
22
22
  attribute :>> name = "VerificationCoverageQuery";
23
- attribute :>> includeElementKinds = ("Requirement", "VerificationCase", "ValidationCase", "Evidence");
23
+ attribute :>> includeElementKinds = ("Requirement", "VerificationCase", "ValidationCase", "MemoEvidence");
24
24
  attribute :>> includeLayers = ("requirements", "assurance");
25
25
  attribute :>> rationaleText = "Auto-populate V&V coverage from the requirements and assurance layers.";
26
26
  }
@@ -1,16 +0,0 @@
1
- # Extension examples
2
-
3
- An extension is a regular SysML package selected by a MEMO methodology. MEMO
4
- does not define a separate extension metaclass. `MethodologyDefinition` and
5
- `ProjectMethodBinding` already accept packages through `includedModule`.
6
-
7
- - `template/` is the starting structure for an extension.
8
- - `clinical/` specializes `OperationalWorkflow` with clinical procedure data.
9
-
10
- Extensions specialize or reference base types. They do not redefine
11
- activities, workflows, architecture elements, relationships, or constraints
12
- already expressed by the base ontology.
13
-
14
- Extension packages remain outside `src/` and outside the `memo::` namespace.
15
- Projects import an extension package directly and include it in their selected
16
- methodology.
@@ -1,15 +0,0 @@
1
- // Replace the package name and included module with extension-specific names.
2
- package memo_extension_template {
3
- private import ScalarValues::*;
4
- private import memo_methodology_core::*;
5
-
6
- part extensionMethod : MethodologyDefinition {
7
- attribute :>> id = "EXT-METH-001";
8
- attribute :>> name = "ExtensionMethod";
9
- attribute :>> version = "0.1.0";
10
- attribute :>> domain = "project extension";
11
- attribute :>> description = "Adds a project or domain package to the selected MEMO methodology.";
12
- attribute :>> baseMethodName = "MedicalDeviceLightDefault";
13
- attribute :>> includedModule = "replace_with_extension_package";
14
- }
15
- }
Binary file