@memoarchitect/ontology 0.13.2 → 0.15.1
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 +5 -3
- package/examples/connected-patient-monitor/memo.identity.yaml +34 -0
- package/examples/connected-patient-monitor/memo.package.yaml +3 -1
- package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +17 -12
- package/examples/connected-patient-monitor/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/embedded-infusion-pump/memo.package.yaml +3 -1
- package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +6 -6
- package/examples/embedded-infusion-pump/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/functional-logical-physical/memo.identity.yaml +28 -0
- package/examples/functional-logical-physical/memo.package.yaml +3 -1
- package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
- package/examples/functional-logical-physical/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +40 -139
- package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +38 -290
- package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +47 -217
- package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +50 -191
- package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +42 -181
- package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +40 -164
- package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +51 -172
- package/examples/gpca-pump/analysis/Samples/README.md +15 -9
- package/examples/gpca-pump/analysis/memo_model.py +243 -0
- package/examples/gpca-pump/memo.identity.yaml +521 -26
- package/examples/gpca-pump/memo.package.yaml +3 -1
- package/examples/gpca-pump/methodology/gpca_profiles.sysml +56 -47
- package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +51 -78
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +359 -357
- package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +9 -9
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +56 -69
- package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +44 -59
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +23 -35
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +33 -40
- package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +62 -63
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +362 -483
- package/examples/gpca-pump/model/catalog/gpca_operational.sysml +45 -70
- package/examples/gpca-pump/model/catalog/gpca_physical.sysml +6 -12
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +173 -169
- package/examples/gpca-pump/model/catalog/gpca_risk.sysml +139 -225
- package/examples/gpca-pump/model/catalog/gpca_standards.sysml +43 -47
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +68 -65
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +147 -116
- package/examples/gpca-pump/model/catalog/gpca_verification.sysml +65 -90
- package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +7 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
- package/examples/gpca-pump/model/{catalog → methodology}/project.sysml +8 -6
- package/examples/ivd-laboratory-system/memo.package.yaml +3 -1
- package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +12 -9
- package/examples/ivd-laboratory-system/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/manual-surgical-instrument/memo.package.yaml +3 -1
- package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +2 -6
- package/examples/manual-surgical-instrument/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/multidimensional-layers/memo.package.yaml +3 -1
- package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +2 -4
- package/examples/multidimensional-layers/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/nested-architecture-dsm/memo.identity.yaml +93 -0
- package/examples/nested-architecture-dsm/memo.package.yaml +3 -1
- package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +30 -30
- package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +28 -28
- package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +2 -4
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +4 -4
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +7 -7
- package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +8 -8
- package/examples/nested-architecture-dsm/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/reusable-instrument/memo.package.yaml +3 -1
- package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -7
- package/examples/reusable-instrument/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/robot-cell-family/README.md +34 -0
- package/examples/robot-cell-family/memo.identity.yaml +142 -0
- package/examples/robot-cell-family/memo.package.yaml +7 -0
- package/examples/robot-cell-family/model/methodology/project.sysml +30 -0
- package/examples/robot-cell-family/model/shared/shared.sysml +53 -0
- package/examples/robot-cell-family/model/sos/chains.sysml +36 -0
- package/examples/robot-cell-family/model/sos/icds.sysml +29 -0
- package/examples/robot-cell-family/model/sos/sos.sysml +31 -0
- package/examples/robot-cell-family/model/sos/use_cases.sysml +25 -0
- package/examples/robot-cell-family/model/systems/manipulation/manipulation_system.sysml +35 -0
- package/examples/robot-cell-family/model/systems/navigation/navigation_system.sysml +46 -0
- package/examples/robot-cell-family/model/systems/perception/perception_system.sysml +37 -0
- package/examples/robot-platform/memo.package.yaml +3 -0
- package/examples/robot-platform/model/platform.sysml +15 -0
- package/examples/ros-mobile-robot/README.md +5 -4
- package/examples/ros-mobile-robot/memo.identity.yaml +94 -0
- package/examples/ros-mobile-robot/memo.package.yaml +3 -1
- package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +26 -29
- package/examples/ros-mobile-robot/model/{catalog → methodology}/project.sysml +8 -14
- package/examples/software-only-medical-device/memo.package.yaml +3 -1
- package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +9 -10
- package/examples/software-only-medical-device/model/{catalog → methodology}/project.sysml +8 -9
- package/examples/surgical-closure-workflow/memo.package.yaml +3 -1
- package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +23 -26
- package/examples/surgical-closure-workflow/model/{catalog → methodology}/project.sysml +7 -5
- package/examples/surgical-robot/memo.package.yaml +3 -1
- package/examples/surgical-robot/model/catalog/surgical_robot.sysml +14 -12
- package/examples/surgical-robot/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/sysml-diagram-samples/README.md +1 -0
- package/examples/sysml-diagram-samples/memo.identity.yaml +459 -0
- package/examples/sysml-diagram-samples/memo.package.yaml +3 -1
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +10 -20
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +5 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +10 -13
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +11 -7
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +63 -8
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/drill_down_view.sysml +88 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +25 -25
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +6 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +15 -17
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +21 -21
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +7 -7
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +5 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +14 -14
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +16 -17
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +9 -9
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +7 -14
- package/examples/sysml-diagram-samples/model/{catalog → methodology}/project.sysml +5 -5
- package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +1 -1
- package/examples/temperature-alarm/memo.identity.yaml +6 -0
- package/examples/temperature-alarm/memo.package.yaml +3 -1
- package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +43 -21
- package/examples/temperature-alarm/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/ui-screen-regions/memo.identity.yaml +33 -0
- package/examples/ui-screen-regions/memo.package.yaml +3 -1
- package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +12 -12
- package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +18 -18
- package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +6 -6
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +3 -3
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +10 -10
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
- package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +15 -15
- package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +6 -6
- package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -2
- package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
- package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
- package/examples/ui-screen-regions/model/{catalog → methodology}/project.sysml +4 -5
- package/extensions/README.md +65 -16
- package/extensions/aadl/memo.package.yaml +1 -1
- package/extensions/aadl/src/aadl_extension.sysml +5 -2
- package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +29 -50
- package/extensions/clinical/memo.package.yaml +1 -1
- package/extensions/clinical/src/clinical_extension.sysml +2 -0
- package/extensions/cloud/memo.package.yaml +1 -1
- package/extensions/container/memo.package.yaml +1 -1
- package/extensions/messaging/memo.package.yaml +1 -1
- package/extensions/messaging/src/messaging_extension.sysml +2 -2
- package/extensions/ros/memo.package.yaml +1 -1
- package/extensions/ros/src/ros_extension.sysml +25 -24
- package/extensions/template/memo.package.yaml +1 -1
- package/extensions/template/model/extension.sysml +25 -0
- package/memo.manifest.yaml +1 -7
- 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 +6 -4
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/decisions/memo_decisions.sysml +9 -2
- package/src/architecture/functional/behavior/memo_behavior.sysml +27 -7
- package/src/architecture/functional/functions/memo_functions.sysml +45 -31
- package/src/architecture/functional/memo_architecture_functional.sysml +14 -0
- package/src/architecture/implementation/memo_architecture_implementation.sysml +21 -0
- package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +7 -0
- package/src/architecture/implementation/software/structure/memo_software_structure.sysml +58 -17
- package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
- package/src/architecture/logical/interfaces/memo_interfaces.sysml +67 -58
- package/src/architecture/logical/memo_architecture_logical.sysml +13 -0
- package/src/architecture/logical/structure/memo_logical_structure.sysml +27 -8
- package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +4 -1
- package/src/architecture/operational/memo_architecture_operational.sysml +19 -0
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +9 -8
- package/src/architecture/operational/structure/memo_operational.sysml +5 -2
- package/src/architecture/operational/use_cases/memo_use_cases.sysml +16 -8
- package/src/architecture/realization/deployment/memo_deployment.sysml +30 -10
- package/src/architecture/realization/memo_architecture_realization.sysml +13 -0
- package/src/architecture/realization/physical/memo_physical_architecture.sysml +61 -0
- package/src/architecture/variability/memo_variability.sysml +87 -0
- package/src/artifacts/configuration_management/memo_configuration_management.sysml +95 -3
- package/src/artifacts/core/memo_controlled_artifacts.sysml +4 -2
- package/src/artifacts/standards/cfr_21_820.sysml +12 -24
- package/src/artifacts/standards/fda_cybersecurity_2023.sysml +13 -20
- package/src/artifacts/standards/iec_60601_1.sysml +16 -32
- package/src/artifacts/standards/iec_60601_1_2.sysml +5 -10
- package/src/artifacts/standards/iec_60812.sysml +4 -8
- package/src/artifacts/standards/iec_62304.sysml +607 -47
- package/src/artifacts/standards/iec_62366_1.sysml +12 -24
- package/src/artifacts/standards/iec_81001_5_1.sysml +8 -16
- package/src/artifacts/standards/iso_13485.sysml +12 -24
- package/src/artifacts/standards/iso_14971.sysml +118 -20
- package/src/artifacts/standards/iso_iec_ieee_42010.sysml +3 -6
- package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +14 -4
- package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +1 -2
- package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sad.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sbom.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sdp.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/soup.md +3 -5
- package/src/artifacts/templates/dhf/system/sad.md +1 -1
- package/src/artifacts/templates/dhf/system/standards-checklist.md +2 -2
- package/src/artifacts/templates/dhf/system/standards-traceability.md +1 -1
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +339 -13
- package/src/assurance/human_factors/memo_human_factors.sysml +6 -2
- package/src/assurance/safety_risk/analysis/memo_fmea.sysml +7 -3
- package/src/assurance/safety_risk/memo_risk.sysml +39 -1
- package/src/core/common/memo_common.sysml +61 -68
- package/src/core/enumerations/memo_enumerations.sysml +93 -9
- package/src/core/relationships/memo_relationships.sysml +17 -11
- package/src/core/relationships/memo_workspace_membership.sysml +284 -0
- package/src/core/semantics/semantics.sysml +58 -0
- package/src/core/terminology/terminology.sysml +7 -0
- package/src/memo_namespaces.sysml +6 -0
- package/src/methodology/archetypes/memo_archetypes.sysml +8 -16
- package/src/methodology/core/memo_core.sysml +85 -29
- package/src/methodology/profiles/memo_profiles.sysml +217 -61
- package/src/methodology/workflow/memo_workflow.sysml +28 -0
- package/src/rules/closure/closure_rules.sysml +250 -4
- package/src/rules/crosslayer/cross_layer_rules.sysml +11 -0
- package/src/rules/ontology/ontology_invariants.sysml +288 -48
- package/src/rules/quantitative/quantitative_rules.sysml +4 -0
- package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +28 -28
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
- package/src/viewpoints/context/context_viewpoint.sysml +2 -3
- package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -3
- package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +0 -4
- package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
- package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -4
- package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -4
- package/src/viewpoints/logical/logical_viewpoint.sysml +2 -3
- package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
- package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
- package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
- package/src/viewpoints/physical/physical_viewpoint.sysml +2 -3
- package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +2 -4
- package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +2 -4
- package/src/viewpoints/rendering/memo_rendering.sysml +50 -98
- package/src/viewpoints/requirements/requirements_viewpoint.sysml +2 -3
- package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
- package/src/viewpoints/risk/risk_viewpoint.sysml +2 -3
- package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
- package/src/viewpoints/software/software_viewpoint.sysml +2 -3
- package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
- package/src/viewpoints/stakeholders_concerns/memo_stakeholders_concerns.sysml +11 -29
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
- package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
- package/src/viewpoints/usability/usability_viewpoint.sysml +2 -3
- package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
- package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -4
- package/stage1/syside-67f92dc96ba75cd05b5c8d13.ids.gz +0 -0
- package/stage1/syside-67f92dc96ba75cd05b5c8d13.json.gz +0 -0
- package/templates/default/memo.package.yaml +6 -1
- package/templates/default/model/catalog/architecture/system.sysml +7 -3
- package/templates/default/model/{catalog → methodology}/project.sysml +3 -4
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +0 -47
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +0 -94
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +0 -13
- package/examples/ui-screen-regions/model/catalog/relationships.sysml +0 -8
- package/extensions/aadl/src/methodology/aadl_methodology.sysml +0 -19
- package/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -24
- package/extensions/cloud/src/methodology/cloud_methodology.sysml +0 -19
- package/extensions/container/src/methodology/container_methodology.sysml +0 -19
- package/extensions/messaging/src/methodology/messaging_methodology.sysml +0 -19
- package/extensions/ros/src/methodology/ros_methodology.sysml +0 -27
- package/extensions/template/src/extension.sysml +0 -39
- package/templates/connected-device/memo.package.yaml +0 -13
- package/templates/connected-device/model/catalog/architecture/system.sysml +0 -5
- package/templates/connected-device/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/connected-device/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/connected-device/model/catalog/project.sysml +0 -30
- package/templates/connected-device/package.json +0 -8
- package/templates/connected-device/syside.toml +0 -13
- package/templates/infusion-pump/memo.package.yaml +0 -13
- package/templates/infusion-pump/model/catalog/architecture/system.sysml +0 -5
- package/templates/infusion-pump/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/infusion-pump/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/infusion-pump/model/catalog/project.sysml +0 -30
- package/templates/infusion-pump/package.json +0 -8
- package/templates/infusion-pump/syside.toml +0 -13
- package/templates/monitoring-device/memo.package.yaml +0 -13
- package/templates/monitoring-device/model/catalog/architecture/system.sysml +0 -5
- package/templates/monitoring-device/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/monitoring-device/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/monitoring-device/model/catalog/project.sysml +0 -30
- package/templates/monitoring-device/package.json +0 -8
- package/templates/monitoring-device/syside.toml +0 -13
- package/templates/samd/memo.package.yaml +0 -13
- package/templates/samd/model/catalog/architecture/system.sysml +0 -5
- package/templates/samd/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/samd/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/samd/model/catalog/project.sysml +0 -30
- package/templates/samd/package.json +0 -8
- package/templates/samd/syside.toml +0 -13
|
@@ -11,20 +11,146 @@ package memo_rules_ontology {
|
|
|
11
11
|
|
|
12
12
|
private import memo_core_common::*;
|
|
13
13
|
private import memo_core_common::MemoIdentity;
|
|
14
|
+
private import memo_artifacts_standards_traceability::EnforcesClause;
|
|
15
|
+
private import memo_artifacts_standards_iec_62366_1::*;
|
|
16
|
+
private import memo_artifacts_standards_iso_13485::*;
|
|
14
17
|
// ─── Structure ───────────────────────────────────────────────────────
|
|
15
18
|
|
|
16
19
|
constraint def ContainmentAcyclicRule :> MemoConsistencyRule {
|
|
17
20
|
@MemoIdentity { :>> providedId = "CR-ONT-001"; }
|
|
18
21
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
22
|
+
attribute domain = RuleDomainKind::modelling;
|
|
23
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
19
24
|
attribute appliesTo = "Model";
|
|
20
25
|
attribute severity = RuleSeverityKind::error;
|
|
21
26
|
attribute rationaleText = "Containment/composition relations (Composes) must form no cycles.";
|
|
22
27
|
attribute predicateExpression = "acyclic(composes)";
|
|
23
28
|
constraint { true }
|
|
24
29
|
}
|
|
30
|
+
constraint def ModelDeclaresSystemRule :> MemoConsistencyRule {
|
|
31
|
+
@MemoIdentity { :>> providedId = "CR-ONT-084"; }
|
|
32
|
+
// Tailorable, not an invariant: a library or a model that only extends another has no
|
|
33
|
+
// system of its own, and its method says so with a rationale.
|
|
34
|
+
attribute tailoring = RuleTailoringKind::methodology;
|
|
35
|
+
attribute domain = RuleDomainKind::modelling;
|
|
36
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
37
|
+
attribute appliesTo = "Model";
|
|
38
|
+
attribute severity = RuleSeverityKind::error;
|
|
39
|
+
attribute rationaleText = "A model declares at least one System (a part def that specializes System). A workspace is the closure of what is linked to the definition of a System, so a model with only a usage typed by System, or none, has no workspace: nothing can be scoped, and every element is Unassigned.";
|
|
40
|
+
attribute predicateExpression = "allOfKind('System')->exists(isDefinition == 'true')";
|
|
41
|
+
constraint { true }
|
|
42
|
+
}
|
|
43
|
+
// ─── Use case scope (plan O8) ─────────────────────────────────────────
|
|
44
|
+
//
|
|
45
|
+
// A use case is at the level of its subject: one whose subject is a SystemOfSystems is a clinical
|
|
46
|
+
// procedure, one whose subject is a System is a system use case. There is no kind for either; the
|
|
47
|
+
// level is read from the subject, and the subject from `hasSubject`. A use case with no subject
|
|
48
|
+
// is at neither level and neither rule judges it.
|
|
49
|
+
|
|
50
|
+
constraint def SosUseCaseIncludesSystemUseCaseRule :> MemoConsistencyRule {
|
|
51
|
+
@MemoIdentity { :>> providedId = "CR-ONT-085"; }
|
|
52
|
+
attribute tailoring = RuleTailoringKind::methodology;
|
|
53
|
+
attribute domain = RuleDomainKind::modelling;
|
|
54
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
55
|
+
attribute appliesTo = "UseCase";
|
|
56
|
+
attribute severity = RuleSeverityKind::warning;
|
|
57
|
+
attribute rationaleText = "A use case whose subject is a system of systems is made of what its systems do: it includes at least one use case whose subject is a system.";
|
|
58
|
+
attribute predicateExpression = "not(downstream(hasSubject)->exists(conformsTo(SystemOfSystems))) or downstream(includesStep)->exists(downstream(hasSubject)->exists(conformsTo(System)))";
|
|
59
|
+
constraint { true }
|
|
60
|
+
}
|
|
61
|
+
constraint def SystemUseCaseIncludedRule :> MemoConsistencyRule {
|
|
62
|
+
@MemoIdentity { :>> providedId = "CR-ONT-086"; }
|
|
63
|
+
attribute tailoring = RuleTailoringKind::methodology;
|
|
64
|
+
attribute domain = RuleDomainKind::modelling;
|
|
65
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
66
|
+
attribute appliesTo = "UseCase";
|
|
67
|
+
attribute severity = RuleSeverityKind::warning;
|
|
68
|
+
attribute rationaleText = "A use case whose subject is a system is included by a use case of the system of systems, or says it stands alone (standalone = true).";
|
|
69
|
+
attribute predicateExpression = "not(downstream(hasSubject)->exists(conformsTo(System))) or upstream(includesStep)->size() >= 1 or attributes.standalone == 'true'";
|
|
70
|
+
constraint { true }
|
|
71
|
+
}
|
|
72
|
+
// A system is a boundary (plan O16). The workspace closure never reaches another system or the
|
|
73
|
+
// system of systems, and drops such a link silently; this rule reports it. Evaluated by the
|
|
74
|
+
// workspace evaluator because it needs what each workspace holds, which no predicate can say:
|
|
75
|
+
// the subject is the element inside a system that is typed by, or relates to, a System-kind or
|
|
76
|
+
// SystemOfSystems-kind element outside it. The system of systems' own references to its systems
|
|
77
|
+
// are what it is for and are not findings.
|
|
78
|
+
constraint def SystemBoundaryRule :> MemoConsistencyRule {
|
|
79
|
+
@MemoIdentity { :>> providedId = "CR-ONT-087"; }
|
|
80
|
+
attribute tailoring = RuleTailoringKind::methodology;
|
|
81
|
+
attribute domain = RuleDomainKind::modelling;
|
|
82
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
83
|
+
attribute evaluator = "workspace";
|
|
84
|
+
attribute appliesTo = "Model";
|
|
85
|
+
attribute severity = RuleSeverityKind::warning;
|
|
86
|
+
attribute rationaleText = "A system does not reference another system or the system of systems from inside itself. Two systems meet at an interface the system of systems owns.";
|
|
87
|
+
constraint { true }
|
|
88
|
+
}
|
|
89
|
+
// ─── Release selections (plan O14) ────────────────────────────────────
|
|
90
|
+
//
|
|
91
|
+
// A release record selects features (`#SelectsFeature`), and through them the variants that realize
|
|
92
|
+
// them (`#RealizesFeature`, variant to feature). The rules read a record's selection by navigation;
|
|
93
|
+
// `selectRelease` (memo-tools `model/variability.ts`) is the same join in code and a test holds the
|
|
94
|
+
// two equal. `upstream` / `downstream` are transitive and directed; the bare relation name is one
|
|
95
|
+
// hop in both directions, which is what the symmetric `excludesFeature` needs (a transitive reading
|
|
96
|
+
// would make A and C exclusive because each excludes B).
|
|
97
|
+
|
|
98
|
+
constraint def ReleaseSelectsProposedVariantRule :> MemoConsistencyRule {
|
|
99
|
+
@MemoIdentity { :>> providedId = "CR-ONT-088"; }
|
|
100
|
+
attribute tailoring = RuleTailoringKind::methodology;
|
|
101
|
+
attribute domain = RuleDomainKind::modelling;
|
|
102
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
103
|
+
attribute appliesTo = "ReleaseRecord";
|
|
104
|
+
attribute severity = RuleSeverityKind::error;
|
|
105
|
+
attribute rationaleText = "An approved or released record contains what it selects. A feature whose variant is still proposed has no approved design behind it, so a record that has passed approval cannot select it. A record with no status, or one still being drafted, is not judged.";
|
|
106
|
+
attribute predicateExpression = "not(attributes.status == 'ElementStatusKind::approved' or attributes.status == 'ElementStatusKind::released') or downstream(selectsFeature)->forAll(upstream(realizesFeature)->forAll(attributes.status != 'ElementStatusKind::proposed'))";
|
|
107
|
+
constraint { true }
|
|
108
|
+
}
|
|
109
|
+
constraint def ReleaseSelectionConsistentRule :> MemoConsistencyRule {
|
|
110
|
+
@MemoIdentity { :>> providedId = "CR-ONT-089"; }
|
|
111
|
+
// An invariant: requires and excludes are the family's own declarations, and a selection that
|
|
112
|
+
// breaks them contradicts the model, whatever the record's status.
|
|
113
|
+
attribute tailoring = RuleTailoringKind::invariant;
|
|
114
|
+
attribute domain = RuleDomainKind::modelling;
|
|
115
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
116
|
+
attribute appliesTo = "ReleaseRecord";
|
|
117
|
+
attribute severity = RuleSeverityKind::error;
|
|
118
|
+
attribute rationaleText = "A record selects a set of features that satisfies the family's rules: every feature a selected feature requires is selected too, and no two selected features exclude each other.";
|
|
119
|
+
attribute predicateExpression = "downstream(selectsFeature)->forAll(downstream(requiresFeature)->forAll(upstream(selectsFeature)->exists(id == subject.id)) and excludesFeature->forAll(upstream(selectsFeature)->forAll(id != subject.id)))";
|
|
120
|
+
constraint { true }
|
|
121
|
+
}
|
|
122
|
+
// Every variation point of the item a record is a release of is resolved to ONE variant, and no
|
|
123
|
+
// variation point anywhere has two. Two halves, one rule:
|
|
124
|
+
// at most one -- any record, any status: a record that selects the features of two variants
|
|
125
|
+
// of one point describes no product. Needs no item.
|
|
126
|
+
// exactly one -- an approved or released record that is `#ReleaseOf` an item: each variation
|
|
127
|
+
// point the item owns (`composes`, transitive, so an SoS record judges the
|
|
128
|
+
// points of the SoS and each system record those of its own system; ownership
|
|
129
|
+
// does not cross typing) has one selected variant. A draft is allowed to be
|
|
130
|
+
// unfinished, as in CR-ONT-088.
|
|
131
|
+
// Not asked of the exactly-one half: a point none of whose variants realizes a feature (a
|
|
132
|
+
// release can neither select nor drop its variants, so it cannot resolve it), a point owned by
|
|
133
|
+
// a variant the record does not select (it is not in the product), and a record with no
|
|
134
|
+
// `#ReleaseOf` (no item to judge, a limit; the at-most-one half still runs).
|
|
135
|
+
// `selectRelease` (memo-tools `model/variability.ts`) is the same definition in code and a test
|
|
136
|
+
// holds the two equal. Limit: `variant` is followed transitively, so a variant that is itself a
|
|
137
|
+
// variation point counts its own variants against its parent's.
|
|
138
|
+
constraint def ReleaseSelectsOneVariantRule :> MemoConsistencyRule {
|
|
139
|
+
@MemoIdentity { :>> providedId = "CR-ONT-090"; }
|
|
140
|
+
attribute tailoring = RuleTailoringKind::invariant;
|
|
141
|
+
attribute domain = RuleDomainKind::modelling;
|
|
142
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
143
|
+
attribute appliesTo = "ReleaseRecord";
|
|
144
|
+
attribute severity = RuleSeverityKind::error;
|
|
145
|
+
attribute rationaleText = "A variation point is one choice. A record that selects the features of two of its variants builds both, and an approved or released record of an item that selects none of a variation point's variants builds neither, so it describes no single product.";
|
|
146
|
+
attribute predicateExpression = "downstream(selectsFeature)->forAll(upstream(realizesFeature)->forAll(upstream(variant)->forAll(downstream(variant)->select(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))->size() <= 1))) and (not(attributes.status == 'ElementStatusKind::approved' or attributes.status == 'ElementStatusKind::released') or downstream(releaseOf)->forAll(downstream(composes)->select(attributes.isVariation == 'true')->forAll(not(downstream(variant)->exists(downstream(realizesFeature)->notEmpty())) or upstream(composes)->exists(upstream(variant)->notEmpty() and downstream(realizesFeature)->notEmpty() and not(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))) or downstream(variant)->select(downstream(realizesFeature)->exists(upstream(selectsFeature)->exists(id == subject.id)))->size() == 1)))";
|
|
147
|
+
constraint { true }
|
|
148
|
+
}
|
|
25
149
|
constraint def NestedPartConnectedRule :> MemoConsistencyRule {
|
|
26
150
|
@MemoIdentity { :>> providedId = "AR-IBD-001"; }
|
|
27
151
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
152
|
+
attribute domain = RuleDomainKind::modelling;
|
|
153
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
28
154
|
// Internal-block connectivity is a structural-architecture concern, so
|
|
29
155
|
// the subject is the structural component — not every MemoPart. UI
|
|
30
156
|
// elements, captured evidence, and review comments nest in compositions
|
|
@@ -48,6 +174,8 @@ package memo_rules_ontology {
|
|
|
48
174
|
constraint def RuntimeTracesToModuleRule :> MemoConsistencyRule {
|
|
49
175
|
@MemoIdentity { :>> providedId = "CR-ONT-011"; }
|
|
50
176
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
177
|
+
attribute domain = RuleDomainKind::modelling;
|
|
178
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
51
179
|
attribute appliesTo = "SoftwareComponent";
|
|
52
180
|
attribute severity = RuleSeverityKind::warning;
|
|
53
181
|
attribute rationaleText = "Every runtime component must trace to a module-view definition (Realizes).";
|
|
@@ -56,7 +184,9 @@ package memo_rules_ontology {
|
|
|
56
184
|
}
|
|
57
185
|
constraint def PatientContactCharacterizedRule :> MemoConsistencyRule {
|
|
58
186
|
@MemoIdentity { :>> providedId = "CR-ONT-032"; }
|
|
59
|
-
attribute tailoring = RuleTailoringKind::
|
|
187
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
188
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
189
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
60
190
|
attribute appliesTo = "PhysicalComponent";
|
|
61
191
|
attribute severity = RuleSeverityKind::error;
|
|
62
192
|
attribute rationaleText = "Patient-contact components must identify contact nature and duration (ISO 10993-1).";
|
|
@@ -68,31 +198,50 @@ package memo_rules_ontology {
|
|
|
68
198
|
|
|
69
199
|
constraint def SafetyCriticalFunctionVerifiedRule :> MemoConsistencyRule {
|
|
70
200
|
@MemoIdentity { :>> providedId = "CR-ONT-040"; }
|
|
71
|
-
attribute tailoring = RuleTailoringKind::
|
|
201
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
202
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
203
|
+
attribute obligation = RuleObligationKind::required;
|
|
204
|
+
// To confirm: inferred from the clause scope; confirm.
|
|
72
205
|
attribute appliesTo = "MemoFunction";
|
|
73
206
|
attribute severity = RuleSeverityKind::error;
|
|
74
207
|
attribute rationaleText = "Safety-critical functions (criticality high or catastrophic) must trace to at least one verification case.";
|
|
75
208
|
attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or verifiedBy->size() >= 1";
|
|
76
209
|
constraint { true }
|
|
77
210
|
}
|
|
211
|
+
#EnforcesClause dependency from SafetyCriticalFunctionVerifiedRule to iso13485::iso13485Clause7::iso13485Clause7_3::iso13485Clause7_3_6;
|
|
78
212
|
constraint def CriticalTaskValidatedRule :> MemoConsistencyRule {
|
|
79
213
|
@MemoIdentity { :>> providedId = "CR-ONT-041"; }
|
|
80
|
-
attribute tailoring = RuleTailoringKind::
|
|
81
|
-
attribute
|
|
214
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
215
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
216
|
+
attribute obligation = RuleObligationKind::required;
|
|
217
|
+
// To confirm: inferred from the clause scope; the FDA human-factors guidance it also cites is not in the library yet.
|
|
218
|
+
// The selector used to be `[criticality=high]`, which left the
|
|
219
|
+
// catastrophic tasks — the most critical — outside the rule while the
|
|
220
|
+
// predicate still spelled out the catastrophic case. The criticality
|
|
221
|
+
// test lives in the predicate alone now. `testedByUsability` is the
|
|
222
|
+
// relation the human-factors package declares for exactly this link;
|
|
223
|
+
// reading only `validates` meant a task linked the way the ontology
|
|
224
|
+
// asks was still reported.
|
|
225
|
+
attribute appliesTo = "OperativeAction";
|
|
82
226
|
attribute severity = RuleSeverityKind::error;
|
|
83
227
|
attribute rationaleText = "Critical tasks (criticality high or catastrophic) must trace to usability validation (FDA HF guidance; IEC 62366-1 summative evaluation).";
|
|
84
|
-
attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or validates->size() >= 1";
|
|
228
|
+
attribute predicateExpression = "not(criticality == 'high' or criticality == 'catastrophic') or testedByUsability->size() >= 1 or validates->size() >= 1";
|
|
85
229
|
constraint { true }
|
|
86
230
|
}
|
|
231
|
+
#EnforcesClause dependency from CriticalTaskValidatedRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_9;
|
|
87
232
|
constraint def UseErrorTracesToHazardRule :> MemoConsistencyRule {
|
|
88
233
|
@MemoIdentity { :>> providedId = "CR-ONT-042"; }
|
|
89
|
-
attribute tailoring = RuleTailoringKind::
|
|
234
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
235
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
236
|
+
attribute obligation = RuleObligationKind::required;
|
|
237
|
+
// To confirm: inferred from the clause scope; confirm.
|
|
90
238
|
attribute appliesTo = "UseError";
|
|
91
239
|
attribute severity = RuleSeverityKind::warning;
|
|
92
240
|
attribute rationaleText = "Safety-relevant use errors (severity serious or worse) must trace to a hazard.";
|
|
93
241
|
attribute predicateExpression = "not(severity == 'serious' or severity == 'critical' or severity == 'catastrophic') or causes->size() >= 1 or tracesRisk->size() >= 1";
|
|
94
242
|
constraint { true }
|
|
95
243
|
}
|
|
244
|
+
#EnforcesClause dependency from UseErrorTracesToHazardRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_3;
|
|
96
245
|
// ─── Relation end conformance (Track A0) ─────────────────────────────
|
|
97
246
|
//
|
|
98
247
|
// These rules carry the constraints that `connection def` end TYPES used to
|
|
@@ -131,6 +280,8 @@ package memo_rules_ontology {
|
|
|
131
280
|
constraint def SatisfiedBySourceKindRule :> MemoConsistencyRule {
|
|
132
281
|
@MemoIdentity { :>> providedId = "CR-ONT-060"; }
|
|
133
282
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
283
|
+
attribute domain = RuleDomainKind::modelling;
|
|
284
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
134
285
|
attribute appliesTo = "Model";
|
|
135
286
|
attribute severity = RuleSeverityKind::error;
|
|
136
287
|
attribute rationaleText = "Only a requirement or a need is satisfied by something. The source end of SatisfiedBy must conform to MemoRequirementElement.";
|
|
@@ -140,6 +291,8 @@ package memo_rules_ontology {
|
|
|
140
291
|
constraint def SatisfiedByTargetKindRule :> MemoConsistencyRule {
|
|
141
292
|
@MemoIdentity { :>> providedId = "CR-ONT-061"; }
|
|
142
293
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
294
|
+
attribute domain = RuleDomainKind::modelling;
|
|
295
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
143
296
|
attribute appliesTo = "Model";
|
|
144
297
|
attribute severity = RuleSeverityKind::error;
|
|
145
298
|
attribute rationaleText = "A requirement is satisfied by a designed part, a behaviour, or a port. Never by another requirement or by a document.";
|
|
@@ -149,6 +302,8 @@ package memo_rules_ontology {
|
|
|
149
302
|
constraint def VerifiedByTargetKindRule :> MemoConsistencyRule {
|
|
150
303
|
@MemoIdentity { :>> providedId = "CR-ONT-062"; }
|
|
151
304
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
305
|
+
attribute domain = RuleDomainKind::modelling;
|
|
306
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
152
307
|
attribute appliesTo = "Model";
|
|
153
308
|
attribute severity = RuleSeverityKind::error;
|
|
154
309
|
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.";
|
|
@@ -158,24 +313,30 @@ package memo_rules_ontology {
|
|
|
158
313
|
constraint def AllocatedToSourceKindRule :> MemoConsistencyRule {
|
|
159
314
|
@MemoIdentity { :>> providedId = "CR-ONT-063"; }
|
|
160
315
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
316
|
+
attribute domain = RuleDomainKind::modelling;
|
|
317
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
161
318
|
attribute appliesTo = "Model";
|
|
162
319
|
attribute severity = RuleSeverityKind::error;
|
|
163
|
-
attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is a part or
|
|
164
|
-
attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(MemoPart) or construct == 'action')";
|
|
320
|
+
attribute rationaleText = "Allocation runs from a function or a behaviour to where it runs. The source end of AllocatedTo is a part, an action, or a functional exchange (allocated to a component exchange, as ARCADIA allocates one).";
|
|
321
|
+
attribute predicateExpression = "sourcesOf(allocatedTo)->forAll(conformsTo(MemoPart) or construct == 'action' or conformsTo(FunctionalExchange))";
|
|
165
322
|
constraint { true }
|
|
166
323
|
}
|
|
167
324
|
constraint def AllocatedToTargetKindRule :> MemoConsistencyRule {
|
|
168
325
|
@MemoIdentity { :>> providedId = "CR-ONT-064"; }
|
|
169
326
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
327
|
+
attribute domain = RuleDomainKind::modelling;
|
|
328
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
170
329
|
attribute appliesTo = "Model";
|
|
171
330
|
attribute severity = RuleSeverityKind::error;
|
|
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))";
|
|
331
|
+
attribute rationaleText = "A function is allocated to a part — including a system or actor — as ARCADIA System Analysis requires; a functional exchange is allocated to a component exchange.";
|
|
332
|
+
attribute predicateExpression = "targetsOf(allocatedTo)->forAll(conformsTo(MemoPart) or conformsTo(ComponentExchange))";
|
|
174
333
|
constraint { true }
|
|
175
334
|
}
|
|
176
335
|
constraint def ComposesParentKindRule :> MemoConsistencyRule {
|
|
177
336
|
@MemoIdentity { :>> providedId = "CR-ONT-065"; }
|
|
178
337
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
338
|
+
attribute domain = RuleDomainKind::modelling;
|
|
339
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
179
340
|
attribute appliesTo = "Model";
|
|
180
341
|
attribute severity = RuleSeverityKind::error;
|
|
181
342
|
attribute rationaleText = "A whole in a decomposition is a part, a behaviour, or a state machine. A requirement does not compose anything.";
|
|
@@ -185,6 +346,8 @@ package memo_rules_ontology {
|
|
|
185
346
|
constraint def ComposesChildKindRule :> MemoConsistencyRule {
|
|
186
347
|
@MemoIdentity { :>> providedId = "CR-ONT-066"; }
|
|
187
348
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
349
|
+
attribute domain = RuleDomainKind::modelling;
|
|
350
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
188
351
|
attribute appliesTo = "Model";
|
|
189
352
|
attribute severity = RuleSeverityKind::error;
|
|
190
353
|
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.";
|
|
@@ -194,6 +357,8 @@ package memo_rules_ontology {
|
|
|
194
357
|
constraint def PrecedesEndKindRule :> MemoConsistencyRule {
|
|
195
358
|
@MemoIdentity { :>> providedId = "CR-ONT-067"; }
|
|
196
359
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
360
|
+
attribute domain = RuleDomainKind::modelling;
|
|
361
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
197
362
|
attribute appliesTo = "Model";
|
|
198
363
|
attribute severity = RuleSeverityKind::error;
|
|
199
364
|
attribute rationaleText = "Precedence orders things that happen: parts or behaviours, at both ends.";
|
|
@@ -203,6 +368,8 @@ package memo_rules_ontology {
|
|
|
203
368
|
constraint def PerformsPerformerKindRule :> MemoConsistencyRule {
|
|
204
369
|
@MemoIdentity { :>> providedId = "CR-ONT-068"; }
|
|
205
370
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
371
|
+
attribute domain = RuleDomainKind::modelling;
|
|
372
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
206
373
|
attribute appliesTo = "Model";
|
|
207
374
|
attribute severity = RuleSeverityKind::error;
|
|
208
375
|
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.";
|
|
@@ -212,6 +379,8 @@ package memo_rules_ontology {
|
|
|
212
379
|
constraint def BindsToInterfaceEndKindRule :> MemoConsistencyRule {
|
|
213
380
|
@MemoIdentity { :>> providedId = "CR-ONT-070"; }
|
|
214
381
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
382
|
+
attribute domain = RuleDomainKind::modelling;
|
|
383
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
215
384
|
attribute appliesTo = "Model";
|
|
216
385
|
attribute severity = RuleSeverityKind::error;
|
|
217
386
|
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.";
|
|
@@ -221,34 +390,45 @@ package memo_rules_ontology {
|
|
|
221
390
|
constraint def CrossesTrustBoundaryEndKindRule :> MemoConsistencyRule {
|
|
222
391
|
@MemoIdentity { :>> providedId = "CR-ONT-071"; }
|
|
223
392
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
393
|
+
attribute domain = RuleDomainKind::modelling;
|
|
394
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
224
395
|
attribute appliesTo = "Model";
|
|
225
396
|
attribute severity = RuleSeverityKind::error;
|
|
226
|
-
attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset or an exchange
|
|
227
|
-
attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item')";
|
|
397
|
+
attribute rationaleText = "A boundary is a boundary element or a port; what crosses it is an asset, an item, or an exchange: an interface or a flow.";
|
|
398
|
+
attribute predicateExpression = "sourcesOf(crossesTrustBoundary)->forAll(conformsTo(InterfaceElement) or construct == 'port') and targetsOf(crossesTrustBoundary)->forAll(conformsTo(MemoPart) or construct == 'item' or construct == 'interface' or construct == 'flow')";
|
|
228
399
|
constraint { true }
|
|
229
400
|
}
|
|
230
401
|
|
|
231
|
-
// CR-ONT-002's replacement. ComponentExchange
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
402
|
+
// CR-ONT-002's replacement, now asked of the edge. A ComponentExchange is
|
|
403
|
+
// an interface, so its ends are the ports it connects, and `sourceEnd` /
|
|
404
|
+
// `targetEnd` are those elements. The compiler does not check this:
|
|
405
|
+
// a compiler accepts a part at an interface end even when the definition types
|
|
406
|
+
// the ends.
|
|
407
|
+
//
|
|
408
|
+
// It used to read `sourceEndpoint` refs, whose dotted values the builder
|
|
409
|
+
// cut to their first segment, and compare them as strings, which drop
|
|
410
|
+
// everything up to the last `::`. On gpca-pump that matched the enclosing
|
|
411
|
+
// device for 44 of 46 exchanges and passed.
|
|
236
412
|
constraint def ComponentExchangeSourceEndpointKindRule :> MemoConsistencyRule {
|
|
237
413
|
@MemoIdentity { :>> providedId = "CR-ONT-072"; }
|
|
238
414
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
415
|
+
attribute domain = RuleDomainKind::modelling;
|
|
416
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
239
417
|
attribute appliesTo = "ComponentExchange";
|
|
240
418
|
attribute severity = RuleSeverityKind::error;
|
|
241
|
-
attribute rationaleText = "
|
|
242
|
-
attribute predicateExpression = "
|
|
419
|
+
attribute rationaleText = "A component exchange starts at a port. An exchange that starts at a component names no boundary, so nothing says where on the component it enters or leaves, and no port can carry its item type or direction.";
|
|
420
|
+
attribute predicateExpression = "sourceEnd->size() == 1 and sourceEnd->forAll(construct == 'port')";
|
|
243
421
|
constraint { true }
|
|
244
422
|
}
|
|
245
423
|
constraint def ComponentExchangeTargetEndpointKindRule :> MemoConsistencyRule {
|
|
246
424
|
@MemoIdentity { :>> providedId = "CR-ONT-073"; }
|
|
247
425
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
426
|
+
attribute domain = RuleDomainKind::modelling;
|
|
427
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
248
428
|
attribute appliesTo = "ComponentExchange";
|
|
249
429
|
attribute severity = RuleSeverityKind::error;
|
|
250
|
-
attribute rationaleText = "
|
|
251
|
-
attribute predicateExpression = "
|
|
430
|
+
attribute rationaleText = "A component exchange ends at a port, on the same grounds as CR-ONT-072.";
|
|
431
|
+
attribute predicateExpression = "targetEnd->size() == 1 and targetEnd->forAll(construct == 'port')";
|
|
252
432
|
constraint { true }
|
|
253
433
|
}
|
|
254
434
|
|
|
@@ -261,6 +441,8 @@ package memo_rules_ontology {
|
|
|
261
441
|
constraint def ComponentFunctionAllocatedRule :> MemoConsistencyRule {
|
|
262
442
|
@MemoIdentity { :>> providedId = "CR-ONT-074"; }
|
|
263
443
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
444
|
+
attribute domain = RuleDomainKind::modelling;
|
|
445
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
264
446
|
attribute appliesTo = "ComponentFunction";
|
|
265
447
|
attribute severity = RuleSeverityKind::error;
|
|
266
448
|
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.";
|
|
@@ -270,6 +452,8 @@ package memo_rules_ontology {
|
|
|
270
452
|
constraint def FunctionDecomposesIntoFunctionsRule :> MemoConsistencyRule {
|
|
271
453
|
@MemoIdentity { :>> providedId = "CR-ONT-075"; }
|
|
272
454
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
455
|
+
attribute domain = RuleDomainKind::modelling;
|
|
456
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
273
457
|
attribute appliesTo = "MemoFunction";
|
|
274
458
|
attribute severity = RuleSeverityKind::error;
|
|
275
459
|
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.";
|
|
@@ -294,7 +478,12 @@ package memo_rules_ontology {
|
|
|
294
478
|
//
|
|
295
479
|
// They read the `composes` edge, which the builder synthesizes from native
|
|
296
480
|
// nesting, so they cover the nesting spelling and the retired connection
|
|
297
|
-
// form identically.
|
|
481
|
+
// form identically. They read it DOWNSTREAM: a bare relation name navigates
|
|
482
|
+
// both ways, so `composes` alone also reached the subject's own parent and
|
|
483
|
+
// judged a software system by the assembly it sat in. That reported one
|
|
484
|
+
// cross-family nesting twice, once on each side, and the child's copy
|
|
485
|
+
// blamed the element that was not doing the containing. `downstream` is
|
|
486
|
+
// transitive, so the rule reads as "the subtree stays in the family".
|
|
298
487
|
//
|
|
299
488
|
// Ports are exempt. A port is a boundary FEATURE of its owner, not a member
|
|
300
489
|
// of its owner's family, and any element may carry one whatever family it
|
|
@@ -305,47 +494,61 @@ package memo_rules_ontology {
|
|
|
305
494
|
constraint def SoftwareContainsSoftwareRule :> MemoConsistencyRule {
|
|
306
495
|
@MemoIdentity { :>> providedId = "CR-ONT-077"; }
|
|
307
496
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
497
|
+
attribute domain = RuleDomainKind::modelling;
|
|
498
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
308
499
|
attribute appliesTo = "SoftwareElement";
|
|
309
500
|
attribute severity = RuleSeverityKind::error;
|
|
310
501
|
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))";
|
|
502
|
+
attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(SoftwareElement))";
|
|
312
503
|
constraint { true }
|
|
313
504
|
}
|
|
314
505
|
constraint def LogicalContainsLogicalRule :> MemoConsistencyRule {
|
|
315
506
|
@MemoIdentity { :>> providedId = "CR-ONT-078"; }
|
|
316
507
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
508
|
+
attribute domain = RuleDomainKind::modelling;
|
|
509
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
317
510
|
attribute appliesTo = "LogicalComponent";
|
|
318
511
|
attribute severity = RuleSeverityKind::error;
|
|
319
512
|
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))";
|
|
513
|
+
attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(LogicalComponent))";
|
|
321
514
|
constraint { true }
|
|
322
515
|
}
|
|
323
516
|
constraint def PhysicalContainsPhysicalRule :> MemoConsistencyRule {
|
|
324
517
|
@MemoIdentity { :>> providedId = "CR-ONT-079"; }
|
|
325
518
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
519
|
+
attribute domain = RuleDomainKind::modelling;
|
|
520
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
326
521
|
attribute appliesTo = "PhysicalElement";
|
|
327
522
|
attribute severity = RuleSeverityKind::error;
|
|
328
523
|
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))";
|
|
524
|
+
attribute predicateExpression = "downstream(composes)->forAll(construct == 'port' or construct == 'package' or conformsTo(PhysicalElement))";
|
|
330
525
|
constraint { true }
|
|
331
526
|
}
|
|
332
527
|
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
528
|
+
// An interface is the path between two ports; the flow over it is what
|
|
529
|
+
// moves. This rule asks that a component exchange carries one: a flow
|
|
530
|
+
// whose ends are the exchange's own two ports. The ends are compared as
|
|
531
|
+
// elements (`intersects` matches exact ids), not as names.
|
|
532
|
+
//
|
|
533
|
+
// It replaces the same-name coupling this id used to check, which tied a
|
|
534
|
+
// ComponentExchange PART to a flow of the same name. That was unsatisfiable
|
|
535
|
+
// once the model compiled: two members of one namespace may not share a
|
|
536
|
+
// name (`namespace-distinguishability`), and a `bind` could not be named at
|
|
537
|
+
// all. With the exchange an interface there is no second record to keep in
|
|
538
|
+
// step, and what is left to check is transport.
|
|
337
539
|
//
|
|
338
|
-
//
|
|
339
|
-
//
|
|
340
|
-
//
|
|
341
|
-
// restored FlowDeclaration name makes possible at all.
|
|
540
|
+
// `assurance`, not `invariant`: whether every interface must declare its
|
|
541
|
+
// transport is a method's call (§9.2 of the architecture plan), and a
|
|
542
|
+
// method that models interfaces before their flows may tailor it.
|
|
342
543
|
constraint def ExchangeHasFlowRule :> MemoConsistencyRule {
|
|
343
544
|
@MemoIdentity { :>> providedId = "CR-ONT-076"; }
|
|
344
|
-
attribute tailoring = RuleTailoringKind::
|
|
545
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
546
|
+
attribute domain = RuleDomainKind::modelling;
|
|
547
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
345
548
|
attribute appliesTo = "ComponentExchange";
|
|
346
549
|
attribute severity = RuleSeverityKind::error;
|
|
347
|
-
attribute rationaleText = "
|
|
348
|
-
attribute predicateExpression = "linksOf(flow)->exists(
|
|
550
|
+
attribute rationaleText = "A component exchange is the connection between two ports; the flow is what crosses it. An exchange with no flow between its ports declares a path that nothing uses, so its timing and kind describe no transfer.";
|
|
551
|
+
attribute predicateExpression = "linksOf(flow)->exists(sourceEnd->intersects(subject.sourceEnd) and targetEnd->intersects(subject.targetEnd))";
|
|
349
552
|
constraint { true }
|
|
350
553
|
}
|
|
351
554
|
|
|
@@ -359,6 +562,8 @@ package memo_rules_ontology {
|
|
|
359
562
|
constraint def AlternateScenarioHasBaseRule :> MemoConsistencyRule {
|
|
360
563
|
@MemoIdentity { :>> providedId = "CR-ONT-043"; }
|
|
361
564
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
565
|
+
attribute domain = RuleDomainKind::modelling;
|
|
566
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
362
567
|
attribute appliesTo = "OperativeScenario";
|
|
363
568
|
attribute severity = RuleSeverityKind::error;
|
|
364
569
|
attribute rationaleText = "An alternate scenario is a variation of a nominal path, so it belongs to a workflow that has one. An alternate with no nominal sibling is either a workflow with no happy path or a scenario filed under the wrong parent.";
|
|
@@ -366,20 +571,37 @@ package memo_rules_ontology {
|
|
|
366
571
|
// the definition, and a default is not written onto every usage. So the
|
|
367
572
|
// sibling test is "not alternate", and `conformsTo` keeps it from being
|
|
368
573
|
// satisfied by an ordinary step of the same workflow.
|
|
369
|
-
|
|
574
|
+
//
|
|
575
|
+
// The base may be found three ways, and the workflow sibling is only
|
|
576
|
+
// the first. A use case is what a main scenario and its extensions
|
|
577
|
+
// vary from, so an alternate realizing a use case that a nominal
|
|
578
|
+
// scenario also realizes has its base, whichever workflow holds each
|
|
579
|
+
// (gpca-pump files its alarm responses in a workflow of their own). A
|
|
580
|
+
// scenario with no workflow at all has its package as its parent, so
|
|
581
|
+
// its siblings are the package's other workflow-less scenarios.
|
|
582
|
+
attribute predicateExpression = "not(scenarioKind == 'alternate') or composes.composes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate') or downstream(realizes).realizes->exists(conformsTo(OperativeScenario) and scenarioKind != 'alternate') or (upstream(composes)->isEmpty() and allOfKind('OperativeScenario')->exists(package == subject.package and scenarioKind != 'alternate' and upstream(composes)->isEmpty()))";
|
|
370
583
|
constraint { true }
|
|
371
584
|
}
|
|
372
585
|
|
|
373
586
|
// ─── Assurance-trace warnings ────────────────────────────────────────
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
587
|
+
// A WARNING, not an error: it describes a trace graph that is suspicious
|
|
588
|
+
// rather than invalid, and a regulated model has legitimate exceptions.
|
|
589
|
+
// It needed `upstream` / `downstream` — the bare relation name is
|
|
590
|
+
// bidirectional, so before those existed no rule could ask which way a
|
|
591
|
+
// derivation ran.
|
|
592
|
+
//
|
|
593
|
+
// CR-ONT-081 (RedundantAncestorTraceRule) was deleted 2026-09-25. It called
|
|
594
|
+
// a trace redundant when one element satisfied both a requirement and one
|
|
595
|
+
// derived from it, "already implied by the derivation". It is not: a
|
|
596
|
+
// `derive` does not make its source satisfied, and a response-time
|
|
597
|
+
// requirement derived from "select a drug from the library" says nothing
|
|
598
|
+
// about whether the selector lets you select one.
|
|
379
599
|
|
|
380
600
|
constraint def DerivationGapRule :> MemoConsistencyRule {
|
|
381
601
|
@MemoIdentity { :>> providedId = "CR-ONT-080"; }
|
|
382
602
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
603
|
+
attribute domain = RuleDomainKind::modelling;
|
|
604
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
383
605
|
attribute appliesTo = "MemoRequirementElement";
|
|
384
606
|
attribute severity = RuleSeverityKind::warning;
|
|
385
607
|
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.";
|
|
@@ -387,13 +609,31 @@ package memo_rules_ontology {
|
|
|
387
609
|
constraint { true }
|
|
388
610
|
}
|
|
389
611
|
|
|
390
|
-
|
|
391
|
-
|
|
612
|
+
// ─── Causes ─────────────────────────────────────────────────────────
|
|
613
|
+
//
|
|
614
|
+
// Causes' ends are untyped because its CauseKind spans parts and items
|
|
615
|
+
// (memo_fmea.sysml). These carry what the types cannot.
|
|
616
|
+
|
|
617
|
+
constraint def CausesCauseKindRule :> MemoConsistencyRule {
|
|
618
|
+
@MemoIdentity { :>> providedId = "CR-ONT-082"; }
|
|
392
619
|
attribute tailoring = RuleTailoringKind::invariant;
|
|
393
|
-
attribute
|
|
394
|
-
attribute
|
|
395
|
-
attribute
|
|
396
|
-
attribute
|
|
620
|
+
attribute domain = RuleDomainKind::modelling;
|
|
621
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
622
|
+
attribute appliesTo = "Model";
|
|
623
|
+
attribute severity = RuleSeverityKind::error;
|
|
624
|
+
attribute rationaleText = "A cause is a risk-chain element (a failure mode, failure cause, hazard cause or fault-tree event) or a part that originates one (a component, a use error). A requirement or a behaviour causes nothing.";
|
|
625
|
+
attribute predicateExpression = "sourcesOf(causes)->forAll(conformsTo(RiskItem) or conformsTo(MemoPart))";
|
|
626
|
+
constraint { true }
|
|
627
|
+
}
|
|
628
|
+
constraint def CausesEffectKindRule :> MemoConsistencyRule {
|
|
629
|
+
@MemoIdentity { :>> providedId = "CR-ONT-083"; }
|
|
630
|
+
attribute tailoring = RuleTailoringKind::invariant;
|
|
631
|
+
attribute domain = RuleDomainKind::modelling;
|
|
632
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
633
|
+
attribute appliesTo = "Model";
|
|
634
|
+
attribute severity = RuleSeverityKind::error;
|
|
635
|
+
attribute rationaleText = "An effect is a link in a risk chain, or the fault-tree event a component originates. Not a component, not a requirement.";
|
|
636
|
+
attribute predicateExpression = "targetsOf(causes)->forAll(conformsTo(RiskItem) or conformsTo(FaultTreeNode))";
|
|
397
637
|
constraint { true }
|
|
398
638
|
}
|
|
399
639
|
}
|
|
@@ -11,6 +11,8 @@ package memo_rules_quantitative {
|
|
|
11
11
|
constraint def HazardMaxControlsRule :> MemoConsistencyRule {
|
|
12
12
|
@MemoIdentity { :>> providedId = "QT-001"; }
|
|
13
13
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
14
|
+
attribute domain = RuleDomainKind::modelling;
|
|
15
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
14
16
|
attribute appliesTo = "Hazard";
|
|
15
17
|
attribute severity = RuleSeverityKind::info;
|
|
16
18
|
attribute rationaleText = "Excessive controls per hazard suggests the hazard is too broad and should be decomposed.";
|
|
@@ -21,6 +23,8 @@ package memo_rules_quantitative {
|
|
|
21
23
|
constraint def SwComponentMaxInterfacesRule :> MemoConsistencyRule {
|
|
22
24
|
@MemoIdentity { :>> providedId = "QT-002"; }
|
|
23
25
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
26
|
+
attribute domain = RuleDomainKind::modelling;
|
|
27
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
24
28
|
attribute appliesTo = "SoftwareModule";
|
|
25
29
|
attribute severity = RuleSeverityKind::info;
|
|
26
30
|
attribute rationaleText = "High interface count indicates excessive coupling; consider decomposition.";
|