@memoarchitect/ontology 0.8.22 → 0.10.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/examples/connected-patient-monitor/memo.package.yaml +3 -0
- package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +9 -7
- package/examples/connected-patient-monitor/model/catalog/project.sysml +3 -1
- package/examples/connected-patient-monitor/model/catalog/viewpoints/unassigned/views/connected_patient_monitor_overview.sysml +1 -1
- package/examples/embedded-infusion-pump/memo.package.yaml +3 -0
- package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +11 -9
- package/examples/embedded-infusion-pump/model/catalog/project.sysml +3 -1
- package/examples/embedded-infusion-pump/model/catalog/viewpoints/unassigned/views/embedded_infusion_pump_overview.sysml +1 -1
- package/examples/functional-logical-physical/memo.package.yaml +3 -0
- package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +9 -7
- package/examples/functional-logical-physical/model/catalog/project.sysml +3 -1
- package/examples/functional-logical-physical/model/catalog/viewpoints/unassigned/views/functional_logical_physical_overview.sysml +1 -1
- package/examples/gpca-pump/memo.identity.yaml +2179 -0
- package/examples/gpca-pump/memo.package.yaml +3 -0
- package/examples/gpca-pump/methodology/gpca_profiles.sysml +3 -1
- package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +29 -27
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +115 -114
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +42 -41
- package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +26 -25
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +27 -23
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +15 -15
- package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +42 -40
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +198 -197
- package/examples/gpca-pump/model/catalog/gpca_operational.sysml +146 -180
- package/examples/gpca-pump/model/catalog/gpca_physical.sysml +8 -6
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +290 -288
- package/examples/gpca-pump/model/catalog/gpca_risk.sysml +164 -163
- package/examples/gpca-pump/model/catalog/gpca_standards.sysml +44 -43
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +21 -33
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +10 -11
- package/examples/gpca-pump/model/catalog/gpca_verification.sysml +62 -61
- package/examples/gpca-pump/model/catalog/project.sysml +3 -1
- package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +7 -7
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +7 -7
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +6 -7
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +7 -8
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +8 -9
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +7 -7
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +8 -9
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +6 -7
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +6 -7
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +6 -7
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +6 -6
- package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +8 -9
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +6 -7
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +6 -6
- package/examples/ivd-laboratory-system/memo.package.yaml +3 -0
- package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +10 -8
- package/examples/ivd-laboratory-system/model/catalog/project.sysml +3 -1
- package/examples/ivd-laboratory-system/model/catalog/viewpoints/unassigned/views/ivd_laboratory_system_overview.sysml +1 -1
- package/examples/manual-surgical-instrument/memo.package.yaml +3 -0
- package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +7 -5
- package/examples/manual-surgical-instrument/model/catalog/project.sysml +3 -1
- package/examples/manual-surgical-instrument/model/catalog/viewpoints/unassigned/views/manual_surgical_instrument_overview.sysml +1 -1
- package/examples/multidimensional-layers/memo.package.yaml +3 -0
- package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +6 -4
- package/examples/multidimensional-layers/model/catalog/project.sysml +3 -1
- package/examples/multidimensional-layers/model/catalog/viewpoints/unassigned/views/multidimensional_layers_overview.sysml +0 -1
- package/examples/nested-architecture-dsm/memo.package.yaml +3 -0
- package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +20 -18
- package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +20 -18
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +6 -4
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +9 -7
- package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +18 -16
- package/examples/nested-architecture-dsm/model/catalog/project.sysml +3 -1
- package/examples/reusable-instrument/memo.package.yaml +3 -0
- package/examples/reusable-instrument/model/catalog/project.sysml +3 -1
- package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +23 -31
- package/examples/reusable-instrument/model/catalog/viewpoints/unassigned/views/reusable_instrument_overview.sysml +0 -1
- package/examples/ros-mobile-robot/memo.package.yaml +3 -0
- package/examples/ros-mobile-robot/model/catalog/project.sysml +3 -1
- package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +18 -16
- package/examples/ros-mobile-robot/model/catalog/viewpoints/unassigned/views/ros_mobile_robot_overview.sysml +0 -1
- package/examples/software-only-medical-device/memo.package.yaml +3 -0
- package/examples/software-only-medical-device/model/catalog/project.sysml +3 -1
- package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +11 -9
- package/examples/software-only-medical-device/model/catalog/viewpoints/unassigned/views/software_only_medical_device_overview.sysml +0 -1
- package/examples/surgical-closure-workflow/memo.package.yaml +3 -0
- package/examples/surgical-closure-workflow/model/catalog/project.sysml +3 -1
- package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +56 -69
- package/examples/surgical-closure-workflow/model/catalog/viewpoints/unassigned/views/surgical_closure_workflow_overview.sysml +0 -1
- package/examples/surgical-robot/memo.package.yaml +3 -0
- package/examples/surgical-robot/model/catalog/project.sysml +3 -1
- package/examples/surgical-robot/model/catalog/surgical_robot.sysml +9 -7
- package/examples/surgical-robot/model/catalog/viewpoints/unassigned/views/surgical_robot_overview.sysml +0 -1
- package/examples/sysml-diagram-samples/memo.package.yaml +2 -0
- package/examples/sysml-diagram-samples/model/catalog/project.sysml +3 -1
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +12 -11
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +8 -7
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +4 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +3 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +17 -16
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +9 -8
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +4 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +3 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +4 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +12 -9
- package/examples/temperature-alarm/memo.identity.yaml +64 -0
- package/examples/temperature-alarm/memo.package.yaml +3 -0
- package/examples/temperature-alarm/model/catalog/project.sysml +3 -1
- package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +30 -29
- package/examples/temperature-alarm/model/catalog/viewpoints/unassigned/views/temperature_alarm_overview.sysml +0 -1
- package/examples/ui-screen-regions/memo.package.yaml +3 -0
- package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +14 -12
- package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +35 -33
- package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +8 -6
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +14 -13
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +4 -2
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +4 -2
- package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +12 -10
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +3 -1
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +14 -12
- package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +17 -15
- package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +10 -9
- package/examples/ui-screen-regions/model/catalog/project.sysml +3 -1
- package/examples/ui-screen-regions/model/catalog/relationships.sysml +2 -2
- package/examples/ui-screen-regions/model/catalog/traces.sysml +0 -2
- package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +6 -5
- package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +6 -5
- package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +6 -5
- package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/main_screen_layout.sysml +4 -3
- package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/settings_screen_layout.sysml +4 -3
- package/examples/ui-screen-regions/model/catalog/viewpoints/ui_layout/views/ui_region_trace.sysml +4 -3
- package/extensions/aadl/memo.package.yaml +1 -1
- package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +23 -21
- package/extensions/aadl/src/methodology/aadl_methodology.sysml +3 -1
- package/extensions/clinical/src/methodology/clinical_methodology.sysml +3 -1
- package/extensions/cloud/memo.package.yaml +1 -1
- package/extensions/cloud/src/methodology/cloud_methodology.sysml +3 -1
- package/extensions/container/memo.package.yaml +1 -1
- package/extensions/container/src/container_extension.sysml +2 -2
- package/extensions/container/src/methodology/container_methodology.sysml +3 -1
- package/extensions/messaging/memo.package.yaml +1 -1
- package/extensions/messaging/src/methodology/messaging_methodology.sysml +3 -1
- package/extensions/ros/memo.package.yaml +1 -1
- package/extensions/ros/src/methodology/ros_methodology.sysml +3 -1
- package/extensions/template/src/extension.sysml +3 -1
- package/methodologies/default/memo.package.yaml +1 -1
- package/methodologies/gpca/memo.package.yaml +1 -1
- package/ontology/memo.package.yaml +1 -1
- package/package.json +2 -2
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/functional/behavior/memo_behavior.sysml +5 -5
- package/src/architecture/functional/functions/memo_functions.sysml +6 -6
- package/src/architecture/implementation/hardware/common/memo_hardware_common.sysml +12 -2
- package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +0 -11
- package/src/architecture/implementation/software/structure/memo_software_structure.sysml +7 -7
- package/src/architecture/implementation/ui/memo_ui.sysml +8 -31
- package/src/architecture/logical/interfaces/memo_interfaces.sysml +4 -2
- package/src/architecture/logical/structure/memo_logical_structure.sysml +5 -5
- package/src/architecture/operational/activities/memo_activities.sysml +19 -28
- package/src/architecture/operational/context/actors/memo_actors.sysml +5 -4
- package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +7 -7
- package/src/architecture/operational/context/use_context/memo_use_context.sysml +5 -14
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +12 -104
- package/src/architecture/operational/structure/memo_operational.sysml +42 -13
- package/src/architecture/operational/use_cases/memo_use_cases.sysml +7 -12
- package/src/architecture/operational/workflows/memo_workflows.sysml +20 -42
- package/src/architecture/realization/deployment/memo_deployment.sysml +26 -19
- package/src/architecture/realization/physical/memo_physical_architecture.sysml +8 -2
- package/src/artifacts/standards/cfr_21_820.sysml +80 -89
- package/src/artifacts/standards/fda_cybersecurity_2023.sysml +45 -49
- package/src/artifacts/standards/iec_60601_1.sysml +108 -121
- package/src/artifacts/standards/iec_60601_1_2.sysml +31 -33
- package/src/artifacts/standards/iec_60812.sysml +21 -22
- package/src/artifacts/standards/iec_62304.sysml +150 -169
- package/src/artifacts/standards/iec_62366_1.sysml +80 -89
- package/src/artifacts/standards/iec_81001_5_1.sysml +52 -57
- package/src/artifacts/standards/iso_13485.sysml +80 -89
- package/src/artifacts/standards/iso_14971.sysml +66 -73
- package/src/artifacts/standards/iso_iec_ieee_42010.sysml +15 -15
- package/src/artifacts/templates/dhf/system/sad.md +3 -3
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +2 -2
- package/src/assurance/human_factors/memo_human_factors.sysml +2 -2
- package/src/assurance/requirements/memo_requirements.sysml +2 -18
- package/src/assurance/safety_risk/analysis/memo_fmea.sysml +1 -1
- package/src/assurance/safety_risk/memo_risk.sysml +12 -0
- package/src/assurance/verification_validation/memo_assurance.sysml +7 -12
- package/src/core/common/memo_common.sysml +59 -55
- package/src/core/enumerations/memo_enumerations.sysml +1 -1
- package/src/core/relationships/memo_relationships.sysml +29 -56
- package/src/methodology/archetypes/memo_archetypes.sysml +10 -8
- package/src/methodology/core/memo_core.sysml +0 -10
- package/src/methodology/profiles/memo_profiles.sysml +18 -16
- package/src/methodology/workflow/memo_workflow.sysml +5 -5
- package/src/rules/closure/closure_rules.sysml +22 -20
- package/src/rules/crosslayer/cross_layer_rules.sysml +4 -2
- package/src/rules/ontology/ontology_invariants.sysml +121 -48
- package/src/rules/quantitative/quantitative_rules.sysml +4 -2
- package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +58 -57
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +5 -4
- package/src/viewpoints/context/context_viewpoint.sysml +6 -5
- package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +6 -5
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +6 -6
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +36 -4
- package/src/viewpoints/functional/functional_viewpoint.sysml +6 -5
- package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +6 -5
- package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +6 -5
- package/src/viewpoints/logical/logical_viewpoint.sysml +5 -4
- package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +6 -5
- package/src/viewpoints/operational/operational_viewpoint.sysml +6 -5
- package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +7 -6
- package/src/viewpoints/physical/physical_viewpoint.sysml +5 -4
- package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +6 -5
- package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +6 -5
- package/src/viewpoints/rendering/memo_rendering.sysml +220 -40
- package/src/viewpoints/requirements/requirements_viewpoint.sysml +5 -4
- package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +6 -5
- package/src/viewpoints/risk/risk_viewpoint.sysml +5 -4
- package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +6 -5
- package/src/viewpoints/software/software_viewpoint.sysml +5 -4
- package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +6 -5
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +5 -4
- package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +3 -1
- package/src/viewpoints/usability/usability_viewpoint.sysml +5 -4
- package/src/viewpoints/verification/verification_viewpoint.sysml +5 -4
- package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +6 -5
- package/templates/connected-device/memo.package.yaml +2 -0
- package/templates/connected-device/model/catalog/project.sysml +3 -1
- package/templates/default/memo.package.yaml +2 -0
- package/templates/default/model/catalog/project.sysml +3 -1
- package/templates/infusion-pump/memo.package.yaml +2 -0
- package/templates/infusion-pump/model/catalog/project.sysml +3 -1
- package/templates/monitoring-device/memo.package.yaml +2 -0
- package/templates/monitoring-device/model/catalog/project.sysml +3 -1
- package/templates/samd/memo.package.yaml +2 -0
- package/templates/samd/model/catalog/project.sysml +3 -1
|
@@ -7,10 +7,12 @@ package memo_rules_closure {
|
|
|
7
7
|
private import memo_core_consistency_rules::*;
|
|
8
8
|
private import memo_core_enumerations::*;
|
|
9
9
|
|
|
10
|
+
private import memo_core_common::*;
|
|
11
|
+
private import memo_core_common::MemoIdentity;
|
|
10
12
|
// ─── Risk Layer Rules ────────────────────────────────────────────────
|
|
11
13
|
|
|
12
14
|
constraint def HazardMitigationRule :> MemoConsistencyRule {
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
+
@MemoIdentity { :>> providedId = "CR-MED-004"; }
|
|
44
46
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
45
47
|
attribute appliesTo = "Risk";
|
|
46
48
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -52,7 +54,7 @@ package memo_rules_closure {
|
|
|
52
54
|
// ─── Requirements Layer Rules ────────────────────────────────────────
|
|
53
55
|
|
|
54
56
|
constraint def SysReqTraceRule :> MemoConsistencyRule {
|
|
55
|
-
|
|
57
|
+
@MemoIdentity { :>> providedId = "CR-MED-010"; }
|
|
56
58
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
57
59
|
attribute appliesTo = "Requirement[requirementKind=system]";
|
|
58
60
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -62,7 +64,7 @@ package memo_rules_closure {
|
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
constraint def SwReqTraceRule :> MemoConsistencyRule {
|
|
65
|
-
|
|
67
|
+
@MemoIdentity { :>> providedId = "CR-MED-011"; }
|
|
66
68
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
67
69
|
attribute appliesTo = "Requirement[requirementKind=software]";
|
|
68
70
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -80,7 +82,7 @@ package memo_rules_closure {
|
|
|
80
82
|
// ─── Architecture Layer Rules ────────────────────────────────────────
|
|
81
83
|
|
|
82
84
|
constraint def SwComponentSafetyClassRule :> MemoConsistencyRule {
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
+
@MemoIdentity { :>> providedId = "CR-MED-022"; }
|
|
104
106
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
105
107
|
attribute appliesTo = "SystemFunction";
|
|
106
108
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -112,7 +114,7 @@ package memo_rules_closure {
|
|
|
112
114
|
// ─── Verification Layer Rules ────────────────────────────────────────
|
|
113
115
|
|
|
114
116
|
constraint def VerificationCaseMethodRule :> MemoConsistencyRule {
|
|
115
|
-
|
|
117
|
+
@MemoIdentity { :>> providedId = "CR-MED-030"; }
|
|
116
118
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
117
119
|
attribute appliesTo = "VerificationCase";
|
|
118
120
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -122,7 +124,7 @@ package memo_rules_closure {
|
|
|
122
124
|
}
|
|
123
125
|
|
|
124
126
|
constraint def VerificationCaseTargetRule :> MemoConsistencyRule {
|
|
125
|
-
|
|
127
|
+
@MemoIdentity { :>> providedId = "CR-MED-031"; }
|
|
126
128
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
127
129
|
attribute appliesTo = "VerificationCase";
|
|
128
130
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -132,7 +134,7 @@ package memo_rules_closure {
|
|
|
132
134
|
}
|
|
133
135
|
|
|
134
136
|
constraint def EvidenceProductionRule :> MemoConsistencyRule {
|
|
135
|
-
|
|
137
|
+
@MemoIdentity { :>> providedId = "CR-MED-032"; }
|
|
136
138
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
137
139
|
attribute appliesTo = "VerificationCase";
|
|
138
140
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -144,7 +146,7 @@ package memo_rules_closure {
|
|
|
144
146
|
// ─── Cybersecurity Layer Rules ───────────────────────────────────────
|
|
145
147
|
|
|
146
148
|
constraint def ThreatMitigationRule :> MemoConsistencyRule {
|
|
147
|
-
|
|
149
|
+
@MemoIdentity { :>> providedId = "CR-MED-040"; }
|
|
148
150
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
149
151
|
attribute appliesTo = "Threat";
|
|
150
152
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -154,7 +156,7 @@ package memo_rules_closure {
|
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
constraint def AssetThreatLinkRule :> MemoConsistencyRule {
|
|
157
|
-
|
|
159
|
+
@MemoIdentity { :>> providedId = "CR-MED-041"; }
|
|
158
160
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
159
161
|
attribute appliesTo = "CybersecurityAsset";
|
|
160
162
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -166,7 +168,7 @@ package memo_rules_closure {
|
|
|
166
168
|
// ─── Interface Rules ─────────────────────────────────────────────────
|
|
167
169
|
|
|
168
170
|
constraint def LogicalInterfaceDirectionRule :> MemoConsistencyRule {
|
|
169
|
-
|
|
171
|
+
@MemoIdentity { :>> providedId = "CR-MED-050"; }
|
|
170
172
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
171
173
|
attribute appliesTo = "Interface";
|
|
172
174
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -178,7 +180,7 @@ package memo_rules_closure {
|
|
|
178
180
|
// ─── Conditional Rules ───────────────────────────────────────────────
|
|
179
181
|
|
|
180
182
|
constraint def SafetyClassCVerificationRule :> MemoConsistencyRule {
|
|
181
|
-
|
|
183
|
+
@MemoIdentity { :>> providedId = "CR-MED-101"; }
|
|
182
184
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
183
185
|
attribute appliesTo = "SoftwareModule";
|
|
184
186
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -203,7 +205,7 @@ package memo_rules_closure {
|
|
|
203
205
|
// triggers. Chrome must be DECLARED `decoration`; an element left
|
|
204
206
|
// unclassified fails rather than passing as scenery.
|
|
205
207
|
constraint def UiElementDesignRecordRule :> MemoConsistencyRule {
|
|
206
|
-
|
|
208
|
+
@MemoIdentity { :>> providedId = "CR-MED-110"; }
|
|
207
209
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
208
210
|
attribute appliesTo = "UIElement";
|
|
209
211
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -217,7 +219,7 @@ package memo_rules_closure {
|
|
|
217
219
|
// The interactive-form restriction lives in the predicate because it spans
|
|
218
220
|
// several enum values.
|
|
219
221
|
constraint def ControlInvokesFunctionRule :> MemoConsistencyRule {
|
|
220
|
-
|
|
222
|
+
@MemoIdentity { :>> providedId = "CR-MED-111"; }
|
|
221
223
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
222
224
|
attribute appliesTo = "UIElement";
|
|
223
225
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -230,7 +232,7 @@ package memo_rules_closure {
|
|
|
230
232
|
// unconfirmed machine guess must never reach a design review looking like
|
|
231
233
|
// an engineering decision.
|
|
232
234
|
constraint def BoundsDetectionConfirmedRule :> MemoConsistencyRule {
|
|
233
|
-
|
|
235
|
+
@MemoIdentity { :>> providedId = "CR-MED-112"; }
|
|
234
236
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
235
237
|
attribute appliesTo = "UIElement";
|
|
236
238
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -242,7 +244,7 @@ package memo_rules_closure {
|
|
|
242
244
|
// A screenshot with no build behind it is undated design intent, not
|
|
243
245
|
// evidence of what the device does.
|
|
244
246
|
constraint def ScreenCaptureProvenanceRule :> MemoConsistencyRule {
|
|
245
|
-
|
|
247
|
+
@MemoIdentity { :>> providedId = "CR-MED-113"; }
|
|
246
248
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
247
249
|
attribute appliesTo = "ScreenCapture";
|
|
248
250
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -6,8 +6,10 @@ package memo_rules_crosslayer {
|
|
|
6
6
|
private import memo_core_consistency_rules::*;
|
|
7
7
|
private import memo_core_enumerations::*;
|
|
8
8
|
|
|
9
|
+
private import memo_core_common::*;
|
|
10
|
+
private import memo_core_common::MemoIdentity;
|
|
9
11
|
constraint def RiskToReqTraceRule :> MemoConsistencyRule {
|
|
10
|
-
|
|
12
|
+
@MemoIdentity { :>> providedId = "XL-001"; }
|
|
11
13
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
12
14
|
attribute appliesTo = "Hazard";
|
|
13
15
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -17,7 +19,7 @@ package memo_rules_crosslayer {
|
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
constraint def ReqToArchTraceRule :> MemoConsistencyRule {
|
|
20
|
-
|
|
22
|
+
@MemoIdentity { :>> providedId = "XL-002"; }
|
|
21
23
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
22
24
|
attribute appliesTo = "Requirement[requirementKind=system]";
|
|
23
25
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -9,10 +9,12 @@ package memo_rules_ontology {
|
|
|
9
9
|
private import memo_core_consistency_rules::*;
|
|
10
10
|
private import memo_core_enumerations::*;
|
|
11
11
|
|
|
12
|
+
private import memo_core_common::*;
|
|
13
|
+
private import memo_core_common::MemoIdentity;
|
|
12
14
|
// ─── Structure ───────────────────────────────────────────────────────
|
|
13
15
|
|
|
14
16
|
constraint def ContainmentAcyclicRule :> MemoConsistencyRule {
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
+
@MemoIdentity { :>> providedId = "CR-ONT-040"; }
|
|
69
71
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
70
72
|
attribute appliesTo = "MemoFunction";
|
|
71
73
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -74,16 +76,16 @@ package memo_rules_ontology {
|
|
|
74
76
|
constraint { true }
|
|
75
77
|
}
|
|
76
78
|
constraint def CriticalTaskValidatedRule :> MemoConsistencyRule {
|
|
77
|
-
|
|
79
|
+
@MemoIdentity { :>> providedId = "CR-ONT-041"; }
|
|
78
80
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
79
|
-
attribute appliesTo = "
|
|
81
|
+
attribute appliesTo = "OperativeAction[criticality=high]";
|
|
80
82
|
attribute severity = RuleSeverityKind::error;
|
|
81
83
|
attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
|
|
82
84
|
attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or validates->size() >= 1";
|
|
83
85
|
constraint { true }
|
|
84
86
|
}
|
|
85
87
|
constraint def UseErrorTracesToHazardRule :> MemoConsistencyRule {
|
|
86
|
-
|
|
88
|
+
@MemoIdentity { :>> providedId = "CR-ONT-042"; }
|
|
87
89
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
88
90
|
attribute appliesTo = "UseError";
|
|
89
91
|
attribute severity = RuleSeverityKind::warning;
|
|
@@ -113,9 +115,9 @@ package memo_rules_ontology {
|
|
|
113
115
|
// Several of these are WIDER than the end they replace, and deliberately so:
|
|
114
116
|
// the ends were being violated by content that already shipped. `composes`
|
|
115
117
|
// was typed MemoPart/MemoPart and links StateMachine (a state def) to
|
|
116
|
-
//
|
|
118
|
+
// OperativeAction (an action def); `verifiedBy`'s source was typed MemoPart and
|
|
117
119
|
// most of its sources are requirement defs; `precedes` was typed
|
|
118
|
-
//
|
|
120
|
+
// a part-only type and joins OperativeAction to OperativeAction.
|
|
119
121
|
// A rule that reproduced the old type exactly would have failed on the
|
|
120
122
|
// flagship example on the day it landed. What each rule asserts is the
|
|
121
123
|
// constraint the end MEANT, stated so it can be checked.
|
|
@@ -127,7 +129,7 @@ package memo_rules_ontology {
|
|
|
127
129
|
// and the admissible types so the report is still actionable.
|
|
128
130
|
|
|
129
131
|
constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
|
|
130
|
-
|
|
132
|
+
@MemoIdentity { :>> providedId = "CR-ONT-060"; }
|
|
131
133
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
132
134
|
attribute appliesTo = "Model";
|
|
133
135
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -136,16 +138,16 @@ package memo_rules_ontology {
|
|
|
136
138
|
constraint { true }
|
|
137
139
|
}
|
|
138
140
|
constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
|
|
139
|
-
|
|
141
|
+
@MemoIdentity { :>> providedId = "CR-ONT-061"; }
|
|
140
142
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
141
143
|
attribute appliesTo = "Model";
|
|
142
144
|
attribute severity = RuleSeverityKind::error;
|
|
143
|
-
attribute rationaleText = "A requirement is satisfied by a designed
|
|
144
|
-
attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(
|
|
145
|
+
attribute rationaleText = "A requirement is satisfied by a designed part, a behaviour, or a port. Never by another requirement or by a document.";
|
|
146
|
+
attribute predicateExpression = "targetsOf(satisfiedBy)->forAll(conformsTo(MemoPart) or construct == 'action' or construct == 'port')";
|
|
145
147
|
constraint { true }
|
|
146
148
|
}
|
|
147
149
|
constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
|
|
148
|
-
|
|
150
|
+
@MemoIdentity { :>> providedId = "CR-ONT-062"; }
|
|
149
151
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
150
152
|
attribute appliesTo = "Model";
|
|
151
153
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -154,25 +156,25 @@ package memo_rules_ontology {
|
|
|
154
156
|
constraint { true }
|
|
155
157
|
}
|
|
156
158
|
constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
|
|
157
|
-
|
|
159
|
+
@MemoIdentity { :>> providedId = "CR-ONT-063"; }
|
|
158
160
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
159
161
|
attribute appliesTo = "Model";
|
|
160
162
|
attribute severity = RuleSeverityKind::error;
|
|
161
|
-
attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is
|
|
162
|
-
attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(
|
|
163
|
+
attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is a part or an action.";
|
|
164
|
+
attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(MemoPart) or construct == 'action')";
|
|
163
165
|
constraint { true }
|
|
164
166
|
}
|
|
165
167
|
constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
|
|
166
|
-
|
|
168
|
+
@MemoIdentity { :>> providedId = "CR-ONT-064"; }
|
|
167
169
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
168
170
|
attribute appliesTo = "Model";
|
|
169
171
|
attribute severity = RuleSeverityKind::error;
|
|
170
|
-
attribute rationaleText = "A function is allocated to
|
|
171
|
-
attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(
|
|
172
|
+
attribute rationaleText = "A function is allocated to a part — including a system or actor — as ARCADIA System Analysis requires.";
|
|
173
|
+
attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(MemoPart))";
|
|
172
174
|
constraint { true }
|
|
173
175
|
}
|
|
174
176
|
constraint def ComposesParentKindRule :> MemoConsistencyRule {
|
|
175
|
-
|
|
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
|
-
|
|
186
|
+
@MemoIdentity { :>> providedId = "CR-ONT-066"; }
|
|
185
187
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
186
188
|
attribute appliesTo = "Model";
|
|
187
189
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -190,16 +192,16 @@ package memo_rules_ontology {
|
|
|
190
192
|
constraint { true }
|
|
191
193
|
}
|
|
192
194
|
constraint def PrecedesEndKindRule :> MemoConsistencyRule {
|
|
193
|
-
|
|
195
|
+
@MemoIdentity { :>> providedId = "CR-ONT-067"; }
|
|
194
196
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
195
197
|
attribute appliesTo = "Model";
|
|
196
198
|
attribute severity = RuleSeverityKind::error;
|
|
197
|
-
attribute rationaleText = "Precedence orders things that happen:
|
|
198
|
-
attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(
|
|
199
|
+
attribute rationaleText = "Precedence orders things that happen: parts or behaviours, at both ends.";
|
|
200
|
+
attribute predicateExpression = "sourcesOf(precedes)->forAll(conformsTo(MemoPart) or construct == 'action') and targetsOf(precedes)->forAll(conformsTo(MemoPart) or construct == 'action')";
|
|
199
201
|
constraint { true }
|
|
200
202
|
}
|
|
201
203
|
constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
|
|
202
|
-
|
|
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
|
-
|
|
213
|
+
@MemoIdentity { :>> providedId = "CR-ONT-070"; }
|
|
221
214
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
222
215
|
attribute appliesTo = "Model";
|
|
223
216
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -226,12 +219,12 @@ package memo_rules_ontology {
|
|
|
226
219
|
constraint { true }
|
|
227
220
|
}
|
|
228
221
|
constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
|
|
229
|
-
|
|
222
|
+
@MemoIdentity { :>> providedId = "CR-ONT-071"; }
|
|
230
223
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
231
224
|
attribute appliesTo = "Model";
|
|
232
225
|
attribute severity = RuleSeverityKind::error;
|
|
233
226
|
attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange item.";
|
|
234
|
-
attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(
|
|
227
|
+
attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item')";
|
|
235
228
|
constraint { true }
|
|
236
229
|
}
|
|
237
230
|
|
|
@@ -241,21 +234,21 @@ package memo_rules_ontology {
|
|
|
241
234
|
// reached with sourcesOf/targetsOf. They are resolved here by looking the id
|
|
242
235
|
// up in the kind extent, which is the same statement made the long way.
|
|
243
236
|
constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
|
|
244
|
-
|
|
237
|
+
@MemoIdentity { :>> providedId = "CR-ONT-072"; }
|
|
245
238
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
246
239
|
attribute appliesTo = "ComponentExchange";
|
|
247
240
|
attribute severity = RuleSeverityKind::error;
|
|
248
241
|
attribute rationaleText = "An exchange starts at a component or at a boundary port. Stating it as a rule is what let the endpoint refs stop being MemoPart-typed, which is what lets PhysicalPort and SoftwarePort become port defs.";
|
|
249
|
-
attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('
|
|
242
|
+
attribute predicateExpression = "attributes.sourceEndpoint == '' or allOfKind('MemoPart')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.sourceEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.sourceEndpoint)";
|
|
250
243
|
constraint { true }
|
|
251
244
|
}
|
|
252
245
|
constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
|
|
253
|
-
|
|
246
|
+
@MemoIdentity { :>> providedId = "CR-ONT-073"; }
|
|
254
247
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
255
248
|
attribute appliesTo = "ComponentExchange";
|
|
256
249
|
attribute severity = RuleSeverityKind::error;
|
|
257
250
|
attribute rationaleText = "An exchange ends at a component or at a boundary port, on the same grounds as CR-ONT-072.";
|
|
258
|
-
attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('
|
|
251
|
+
attribute predicateExpression = "attributes.targetEndpoint == '' or allOfKind('MemoPart')->exists(id == subject.attributes.targetEndpoint) or allOfKind('InterfaceElement')->exists(id == subject.attributes.targetEndpoint) or allOfKind('MemoPort')->exists(id == subject.attributes.targetEndpoint)";
|
|
259
252
|
constraint { true }
|
|
260
253
|
}
|
|
261
254
|
|
|
@@ -266,7 +259,7 @@ package memo_rules_ontology {
|
|
|
266
259
|
// "answerable to exactly one component" is the whole content of the concept.
|
|
267
260
|
|
|
268
261
|
constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
|
|
269
|
-
|
|
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
|
-
|
|
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
|
-
|
|
343
|
+
@MemoIdentity { :>> providedId = "CR-ONT-076"; }
|
|
298
344
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
299
345
|
attribute appliesTo = "ComponentExchange";
|
|
300
346
|
attribute severity = RuleSeverityKind::error;
|
|
@@ -304,12 +350,39 @@ package memo_rules_ontology {
|
|
|
304
350
|
}
|
|
305
351
|
|
|
306
352
|
constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
|
|
307
|
-
|
|
353
|
+
@MemoIdentity { :>> providedId = "CR-ONT-043"; }
|
|
308
354
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
309
|
-
attribute appliesTo = "
|
|
355
|
+
attribute appliesTo = "OperativeScenario";
|
|
310
356
|
attribute severity = RuleSeverityKind::error;
|
|
311
357
|
attribute rationaleText = "Alternate, exception, and recovery scenarios must identify their base scenario or variation point — never duplicate the workflow.";
|
|
312
358
|
attribute predicateExpression = "not(variantKind == 'alternate' or variantKind == 'exception' or variantKind == 'recovery') or baseScenario->size() == 1 or variationPoint != ''";
|
|
313
359
|
constraint { true }
|
|
314
360
|
}
|
|
361
|
+
|
|
362
|
+
// ─── Assurance-trace warnings ────────────────────────────────────────
|
|
363
|
+
// Both are WARNINGS, not errors: each describes a trace graph that is
|
|
364
|
+
// suspicious rather than invalid, and a regulated model has legitimate
|
|
365
|
+
// exceptions to both. They needed `upstream` / `downstream` — the bare
|
|
366
|
+
// relation name is bidirectional, so before those existed no rule could
|
|
367
|
+
// ask which way a derivation ran.
|
|
368
|
+
|
|
369
|
+
constraint def DerivationGapRule :> MemoConsistencyRule {
|
|
370
|
+
@MemoIdentity { :>> providedId = "CR-ONT-080"; }
|
|
371
|
+
attribute tailoring = RuleTailoringKind::invariant;
|
|
372
|
+
attribute appliesTo = "MemoRequirementElement";
|
|
373
|
+
attribute severity = RuleSeverityKind::warning;
|
|
374
|
+
attribute rationaleText = "A requirement that others derive from should itself be justified. If nothing is upstream of it and it is not a stakeholder need, the derivation chain dead-ends at an unexplained requirement — the gap an assessor asks about first. Needs are the legitimate roots, so they are exempt by type rather than by convention.";
|
|
375
|
+
attribute predicateExpression = "downstream(derivesFrom)->isEmpty() or upstream(derivesFrom)->notEmpty() or conformsTo(MemoNeed)";
|
|
376
|
+
constraint { true }
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
constraint def RedundantAncestorTraceRule :> MemoConsistencyRule {
|
|
380
|
+
@MemoIdentity { :>> providedId = "CR-ONT-081"; }
|
|
381
|
+
attribute tailoring = RuleTailoringKind::invariant;
|
|
382
|
+
attribute appliesTo = "MemoRequirementElement";
|
|
383
|
+
attribute severity = RuleSeverityKind::warning;
|
|
384
|
+
attribute rationaleText = "When one element satisfies both a requirement and something derived from that requirement, the trace to the ancestor is already implied by the derivation and adds no coverage. Two elements satisfying the two ends is ordinary decomposition and is not reported.";
|
|
385
|
+
attribute predicateExpression = "not satisfiedBy->intersects(downstream(derivesFrom).satisfiedBy)";
|
|
386
|
+
constraint { true }
|
|
387
|
+
}
|
|
315
388
|
}
|
|
@@ -6,8 +6,10 @@ package memo_rules_quantitative {
|
|
|
6
6
|
private import memo_core_consistency_rules::*;
|
|
7
7
|
private import memo_core_enumerations::*;
|
|
8
8
|
|
|
9
|
+
private import memo_core_common::*;
|
|
10
|
+
private import memo_core_common::MemoIdentity;
|
|
9
11
|
constraint def HazardMaxControlsRule :> MemoConsistencyRule {
|
|
10
|
-
|
|
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
|
-
|
|
22
|
+
@MemoIdentity { :>> providedId = "QT-002"; }
|
|
21
23
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
22
24
|
attribute appliesTo = "SoftwareModule";
|
|
23
25
|
attribute severity = RuleSeverityKind::info;
|