@memoarchitect/ontology 0.12.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 -358
- 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 -91
- 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 +675 -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 +7 -29
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +12 -36
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +13 -25
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +388 -0
- 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 +27 -36
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +8 -21
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +17 -65
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +23 -32
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +9 -22
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +7 -22
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +18 -34
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +2 -9
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +18 -42
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +11 -24
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +9 -36
- package/examples/sysml-diagram-samples/model/methodology/project.sysml +40 -0
- 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 +51 -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 +4 -5
- package/src/viewpoints/context/context_viewpoint.sysml +4 -5
- package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +4 -5
- package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +3 -5
- package/src/viewpoints/functional/functional_viewpoint.sysml +4 -5
- 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 +4 -5
- package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
- package/src/viewpoints/operational/operational_viewpoint.sysml +4 -5
- package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
- package/src/viewpoints/physical/physical_viewpoint.sysml +4 -5
- 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 +4 -5
- package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
- package/src/viewpoints/risk/risk_viewpoint.sysml +4 -5
- package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
- package/src/viewpoints/software/software_viewpoint.sysml +4 -5
- package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
- package/src/viewpoints/{definitions → stakeholders_concerns}/memo_stakeholders_concerns.sysml +45 -36
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +4 -5
- package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
- package/src/viewpoints/usability/usability_viewpoint.sysml +4 -5
- package/src/viewpoints/verification/verification_viewpoint.sysml +4 -5
- 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/project.sysml +0 -26
- 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
|
@@ -9,69 +9,96 @@ package memo_rules_closure {
|
|
|
9
9
|
|
|
10
10
|
private import memo_core_common::*;
|
|
11
11
|
private import memo_core_common::MemoIdentity;
|
|
12
|
+
private import memo_artifacts_standards_traceability::EnforcesClause;
|
|
13
|
+
private import memo_artifacts_standards_fda_cybersecurity_2023::*;
|
|
14
|
+
private import memo_artifacts_standards_iec_62304::*;
|
|
15
|
+
private import memo_artifacts_standards_iec_62366_1::*;
|
|
16
|
+
private import memo_artifacts_standards_iso_13485::*;
|
|
17
|
+
private import memo_artifacts_standards_iso_14971::*;
|
|
12
18
|
// ─── Risk Layer Rules ────────────────────────────────────────────────
|
|
13
19
|
|
|
14
20
|
constraint def HazardMitigationRule :> MemoConsistencyRule {
|
|
15
21
|
@MemoIdentity { :>> providedId = "CR-MED-001"; }
|
|
16
22
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
23
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
24
|
+
attribute obligation = RuleObligationKind::required;
|
|
17
25
|
attribute appliesTo = "Hazard";
|
|
18
26
|
attribute severity = RuleSeverityKind::error;
|
|
19
27
|
attribute rationaleText = "ISO 14971 requires each identified hazard to have risk control measures.";
|
|
20
28
|
attribute predicateExpression = "mitigates->size() >= 1";
|
|
21
29
|
constraint { true }
|
|
22
30
|
}
|
|
31
|
+
#EnforcesClause dependency from HazardMitigationRule to iso14971::iso14971Clause7::iso14971Clause7_1;
|
|
23
32
|
|
|
24
33
|
constraint def HazardSeverityRule :> MemoConsistencyRule {
|
|
25
34
|
@MemoIdentity { :>> providedId = "CR-MED-002"; }
|
|
26
35
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
36
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
37
|
+
attribute obligation = RuleObligationKind::required;
|
|
27
38
|
attribute appliesTo = "Hazard";
|
|
28
39
|
attribute severity = RuleSeverityKind::error;
|
|
29
40
|
attribute rationaleText = "Hazard severity is required for risk estimation per ISO 14971.";
|
|
30
41
|
attribute predicateExpression = "attributes.severity != ''";
|
|
31
42
|
constraint { true }
|
|
32
43
|
}
|
|
44
|
+
#EnforcesClause dependency from HazardSeverityRule to iso14971::iso14971Clause5::iso14971Clause5_5;
|
|
33
45
|
|
|
34
46
|
constraint def RiskControlVerificationRule :> MemoConsistencyRule {
|
|
35
47
|
@MemoIdentity { :>> providedId = "CR-MED-003"; }
|
|
36
48
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
49
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
50
|
+
attribute obligation = RuleObligationKind::required;
|
|
51
|
+
// Note: ISO 14971:2019 puts verification of the implementation and effectiveness of a risk control measure in 7.2; the rule text used to say 7.4, which is benefit-risk analysis.
|
|
37
52
|
attribute appliesTo = "RiskControlMeasure";
|
|
38
53
|
attribute severity = RuleSeverityKind::error;
|
|
39
|
-
attribute rationaleText = "Risk controls shall be verified per ISO 14971 clause 7.
|
|
54
|
+
attribute rationaleText = "Risk controls shall be verified per ISO 14971 clause 7.2.";
|
|
40
55
|
attribute predicateExpression = "verifiedBy->size() >= 1";
|
|
41
56
|
constraint { true }
|
|
42
57
|
}
|
|
58
|
+
#EnforcesClause dependency from RiskControlVerificationRule to iso14971::iso14971Clause7::iso14971Clause7_2;
|
|
43
59
|
|
|
44
60
|
constraint def InitialRiskMatrixRule :> MemoConsistencyRule {
|
|
45
61
|
@MemoIdentity { :>> providedId = "CR-MED-004"; }
|
|
46
62
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
63
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
64
|
+
attribute obligation = RuleObligationKind::required;
|
|
65
|
+
// To confirm: inferred from the clause scope, the rule text names no clause; confirm.
|
|
47
66
|
attribute appliesTo = "Risk";
|
|
48
67
|
attribute severity = RuleSeverityKind::warning;
|
|
49
68
|
attribute rationaleText = "Pre-mitigation risk must be assessed against a risk acceptability matrix.";
|
|
50
69
|
attribute predicateExpression = "assessedAgainst->size() >= 1";
|
|
51
70
|
constraint { true }
|
|
52
71
|
}
|
|
72
|
+
#EnforcesClause dependency from InitialRiskMatrixRule to iso14971::iso14971Clause6;
|
|
53
73
|
|
|
54
74
|
// ─── Requirements Layer Rules ────────────────────────────────────────
|
|
55
75
|
|
|
56
76
|
constraint def SysReqTraceRule :> MemoConsistencyRule {
|
|
57
77
|
@MemoIdentity { :>> providedId = "CR-MED-010"; }
|
|
58
78
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
79
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
80
|
+
attribute obligation = RuleObligationKind::required;
|
|
81
|
+
// To confirm: inferred from the clause scope; confirm.
|
|
59
82
|
attribute appliesTo = "Requirement[requirementType=system]";
|
|
60
83
|
attribute severity = RuleSeverityKind::error;
|
|
61
84
|
attribute rationaleText = "Requirements shall be traceable to stakeholder needs per ISO 13485.";
|
|
62
85
|
attribute predicateExpression = "derivesFrom->size() >= 1";
|
|
63
86
|
constraint { true }
|
|
64
87
|
}
|
|
88
|
+
#EnforcesClause dependency from SysReqTraceRule to iso13485::iso13485Clause7::iso13485Clause7_3::iso13485Clause7_3_3;
|
|
65
89
|
|
|
66
90
|
constraint def SwReqTraceRule :> MemoConsistencyRule {
|
|
67
91
|
@MemoIdentity { :>> providedId = "CR-MED-011"; }
|
|
68
92
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
93
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
94
|
+
attribute obligation = RuleObligationKind::required;
|
|
69
95
|
attribute appliesTo = "Requirement[requirementType=software]";
|
|
70
96
|
attribute severity = RuleSeverityKind::error;
|
|
71
97
|
attribute rationaleText = "Software requirements derive from system requirements per IEC 62304.";
|
|
72
98
|
attribute predicateExpression = "derivesFrom->size() >= 1";
|
|
73
99
|
constraint { true }
|
|
74
100
|
}
|
|
101
|
+
#EnforcesClause dependency from SwReqTraceRule to iec62304::iec62304Clause5::iec62304Clause5_2::iec62304Clause5_2_1;
|
|
75
102
|
|
|
76
103
|
// CR-MED-012 (RequirementIdMustBeUnique) is intentionally omitted from the native
|
|
77
104
|
// constraint set: cross-element uniqueness is not a single-subject predicate and
|
|
@@ -84,16 +111,21 @@ package memo_rules_closure {
|
|
|
84
111
|
constraint def SwComponentSafetyClassRule :> MemoConsistencyRule {
|
|
85
112
|
@MemoIdentity { :>> providedId = "CR-MED-020"; }
|
|
86
113
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
114
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
115
|
+
attribute obligation = RuleObligationKind::required;
|
|
87
116
|
attribute appliesTo = "SoftwareModule";
|
|
88
117
|
attribute severity = RuleSeverityKind::error;
|
|
89
118
|
attribute rationaleText = "IEC 62304 requires safety classification for all software items.";
|
|
90
119
|
attribute predicateExpression = "attributes.safetyClass != ''";
|
|
91
120
|
constraint { true }
|
|
92
121
|
}
|
|
122
|
+
#EnforcesClause dependency from SwComponentSafetyClassRule to iec62304::iec62304Clause4::iec62304Clause4_3;
|
|
93
123
|
|
|
94
124
|
constraint def SwComponentReqRule :> MemoConsistencyRule {
|
|
95
125
|
@MemoIdentity { :>> providedId = "CR-MED-021"; }
|
|
96
126
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
127
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
128
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
97
129
|
attribute appliesTo = "SoftwareModule";
|
|
98
130
|
attribute severity = RuleSeverityKind::warning;
|
|
99
131
|
attribute rationaleText = "Software items shall be linked to their requirements per IEC 62304.";
|
|
@@ -104,6 +136,8 @@ package memo_rules_closure {
|
|
|
104
136
|
constraint def LogicalFunctionAllocationRule :> MemoConsistencyRule {
|
|
105
137
|
@MemoIdentity { :>> providedId = "CR-MED-022"; }
|
|
106
138
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
139
|
+
attribute domain = RuleDomainKind::modelling;
|
|
140
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
107
141
|
attribute appliesTo = "SystemFunction";
|
|
108
142
|
attribute severity = RuleSeverityKind::warning;
|
|
109
143
|
attribute rationaleText = "Functions should be allocated to implementation elements.";
|
|
@@ -120,14 +154,22 @@ package memo_rules_closure {
|
|
|
120
154
|
constraint def FunctionInChainRule :> MemoConsistencyRule {
|
|
121
155
|
@MemoIdentity { :>> providedId = "CR-MED-023"; }
|
|
122
156
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
157
|
+
attribute domain = RuleDomainKind::modelling;
|
|
158
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
123
159
|
attribute appliesTo = "MemoFunction";
|
|
124
160
|
attribute severity = RuleSeverityKind::warning;
|
|
125
|
-
attribute rationaleText = "A function participates in the functional chain through a flow or a succession,
|
|
161
|
+
attribute rationaleText = "A function participates in the functional chain through a flow or a succession, through the functions it decomposes into, or by being performed — by a functional chain, or by the action that triggers it. One that participates in none of them is unreachable behaviour: nothing triggers it and nothing consumes what it produces.";
|
|
126
162
|
// `downstream` and not a bare `composes`: the relation navigates both
|
|
127
163
|
// ways, so a bare name would exempt every child on the strength of
|
|
128
164
|
// having a parent. A decomposed function participates through its
|
|
129
165
|
// parts; a leaf has to be reached by an edge of its own.
|
|
130
|
-
|
|
166
|
+
//
|
|
167
|
+
// `upstream(performs)`: a `perform` IS participation. A functional
|
|
168
|
+
// chain names its steps that way, and a UI action performing a
|
|
169
|
+
// function is what triggers it. Without it the rule reported gpca-pump's
|
|
170
|
+
// startup chain's own two steps, and ui-screen-regions' two functions
|
|
171
|
+
// that a control invokes, as reached by nothing.
|
|
172
|
+
attribute predicateExpression = "flow->size() >= 1 or succession->size() >= 1 or downstream(composes)->size() >= 1 or upstream(performs)->size() >= 1";
|
|
131
173
|
constraint { true }
|
|
132
174
|
}
|
|
133
175
|
|
|
@@ -138,18 +180,23 @@ package memo_rules_closure {
|
|
|
138
180
|
constraint def UserNeedIdentifiesUserRule :> MemoConsistencyRule {
|
|
139
181
|
@MemoIdentity { :>> providedId = "CR-MED-024"; }
|
|
140
182
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
183
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
184
|
+
attribute obligation = RuleObligationKind::required;
|
|
141
185
|
attribute appliesTo = "Need";
|
|
142
186
|
attribute severity = RuleSeverityKind::warning;
|
|
143
187
|
attribute rationaleText = "A user need is a need someone has. Which users a device serves, and what they can be assumed to see, know and do, is the input a usability engineering file is built from (IEC 62366-1 5.1); a need that names no user leaves that input to prose.";
|
|
144
188
|
attribute predicateExpression = "not(needKind == 'user' or needKind == 'clinicalUser' or needKind == 'patientUser') or heldBy->size() >= 1";
|
|
145
189
|
constraint { true }
|
|
146
190
|
}
|
|
191
|
+
#EnforcesClause dependency from UserNeedIdentifiesUserRule to iec62366_1::iec62366_1Clause5::iec62366_1Clause5_1;
|
|
147
192
|
|
|
148
193
|
// ─── Verification Layer Rules ────────────────────────────────────────
|
|
149
194
|
|
|
150
195
|
constraint def VerificationCaseMethodRule :> MemoConsistencyRule {
|
|
151
196
|
@MemoIdentity { :>> providedId = "CR-MED-030"; }
|
|
152
197
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
198
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
199
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
153
200
|
attribute appliesTo = "VerificationCase";
|
|
154
201
|
attribute severity = RuleSeverityKind::error;
|
|
155
202
|
attribute rationaleText = "Verification method (test, analysis, inspection, demonstration) required per IEC 62304.";
|
|
@@ -160,6 +207,8 @@ package memo_rules_closure {
|
|
|
160
207
|
constraint def VerificationCaseTargetRule :> MemoConsistencyRule {
|
|
161
208
|
@MemoIdentity { :>> providedId = "CR-MED-031"; }
|
|
162
209
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
210
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
211
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
163
212
|
attribute appliesTo = "VerificationCase";
|
|
164
213
|
attribute severity = RuleSeverityKind::error;
|
|
165
214
|
attribute rationaleText = "Verification cases must be linked to verifiable items.";
|
|
@@ -170,6 +219,8 @@ package memo_rules_closure {
|
|
|
170
219
|
constraint def EvidenceProductionRule :> MemoConsistencyRule {
|
|
171
220
|
@MemoIdentity { :>> providedId = "CR-MED-032"; }
|
|
172
221
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
222
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
223
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
173
224
|
attribute appliesTo = "VerificationCase";
|
|
174
225
|
attribute severity = RuleSeverityKind::warning;
|
|
175
226
|
attribute rationaleText = "Verification results should be documented as evidence records.";
|
|
@@ -182,32 +233,42 @@ package memo_rules_closure {
|
|
|
182
233
|
constraint def ThreatMitigationRule :> MemoConsistencyRule {
|
|
183
234
|
@MemoIdentity { :>> providedId = "CR-MED-040"; }
|
|
184
235
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
236
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
237
|
+
attribute obligation = RuleObligationKind::required;
|
|
238
|
+
// To confirm: inferred from the section scope; confirm.
|
|
185
239
|
attribute appliesTo = "Threat";
|
|
186
240
|
attribute severity = RuleSeverityKind::error;
|
|
187
241
|
attribute rationaleText = "FDA cybersecurity guidance requires threat mitigation.";
|
|
188
242
|
attribute predicateExpression = "derivesCyberRequirement->size() >= 1";
|
|
189
243
|
constraint { true }
|
|
190
244
|
}
|
|
245
|
+
#EnforcesClause dependency from ThreatMitigationRule to fdaCybersecurity2023::fdaCyberSection5::fdaCyberSection5A;
|
|
191
246
|
|
|
192
247
|
constraint def AssetThreatLinkRule :> MemoConsistencyRule {
|
|
193
248
|
@MemoIdentity { :>> providedId = "CR-MED-041"; }
|
|
194
249
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
250
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
251
|
+
attribute obligation = RuleObligationKind::required;
|
|
252
|
+
// To confirm: inferred from the section scope; confirm.
|
|
195
253
|
attribute appliesTo = "CybersecurityAsset";
|
|
196
254
|
attribute severity = RuleSeverityKind::warning;
|
|
197
255
|
attribute rationaleText = "Assets should have threat analysis per FDA cybersecurity guidance.";
|
|
198
256
|
attribute predicateExpression = "threatenedBy->size() >= 1";
|
|
199
257
|
constraint { true }
|
|
200
258
|
}
|
|
259
|
+
#EnforcesClause dependency from AssetThreatLinkRule to fdaCybersecurity2023::fdaCyberSection5::fdaCyberSection5A;
|
|
201
260
|
|
|
202
261
|
// ─── Interface Rules ─────────────────────────────────────────────────
|
|
203
262
|
|
|
204
263
|
constraint def LogicalInterfaceDirectionRule :> MemoConsistencyRule {
|
|
205
264
|
@MemoIdentity { :>> providedId = "CR-MED-050"; }
|
|
206
265
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
266
|
+
attribute domain = RuleDomainKind::modelling;
|
|
267
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
207
268
|
attribute appliesTo = "Interface";
|
|
208
269
|
attribute severity = RuleSeverityKind::error;
|
|
209
270
|
attribute rationaleText = "Interface direction required for integration analysis.";
|
|
210
|
-
attribute predicateExpression = "attributes.direction != ''
|
|
271
|
+
attribute predicateExpression = "attributes.direction != ''";
|
|
211
272
|
constraint { true }
|
|
212
273
|
}
|
|
213
274
|
|
|
@@ -216,12 +277,16 @@ package memo_rules_closure {
|
|
|
216
277
|
constraint def SafetyClassCVerificationRule :> MemoConsistencyRule {
|
|
217
278
|
@MemoIdentity { :>> providedId = "CR-MED-101"; }
|
|
218
279
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
280
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
281
|
+
attribute obligation = RuleObligationKind::required;
|
|
219
282
|
attribute appliesTo = "SoftwareModule";
|
|
220
283
|
attribute severity = RuleSeverityKind::error;
|
|
221
284
|
attribute rationaleText = "IEC 62304 requires rigorous verification for Class C software.";
|
|
222
285
|
attribute predicateExpression = "not(attributes.safetyClass == 'C') or verifiedBy->size() >= 1";
|
|
286
|
+
// To confirm: inferred: 5.5.4 and 5.5.5 are the unit verification clauses that Class C adds to; confirm.
|
|
223
287
|
constraint { true }
|
|
224
288
|
}
|
|
289
|
+
#EnforcesClause dependency from SafetyClassCVerificationRule to iec62304::iec62304Clause5::iec62304Clause5_5::iec62304Clause5_5_4, iec62304::iec62304Clause5::iec62304Clause5_5::iec62304Clause5_5_5;
|
|
225
290
|
|
|
226
291
|
// ─── UI Layout Rules ─────────────────────────────────────────────────
|
|
227
292
|
//
|
|
@@ -241,6 +306,8 @@ package memo_rules_closure {
|
|
|
241
306
|
constraint def UiElementDesignRecordRule :> MemoConsistencyRule {
|
|
242
307
|
@MemoIdentity { :>> providedId = "CR-MED-110"; }
|
|
243
308
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
309
|
+
attribute domain = RuleDomainKind::modelling;
|
|
310
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
244
311
|
attribute appliesTo = "UIElement";
|
|
245
312
|
attribute severity = RuleSeverityKind::error;
|
|
246
313
|
attribute rationaleText = "Every functional UI element must have a design record — a requirement it satisfies or an action it triggers. Elements with formKind `decoration` are chrome and are exempt.";
|
|
@@ -255,6 +322,8 @@ package memo_rules_closure {
|
|
|
255
322
|
constraint def ControlInvokesFunctionRule :> MemoConsistencyRule {
|
|
256
323
|
@MemoIdentity { :>> providedId = "CR-MED-111"; }
|
|
257
324
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
325
|
+
attribute domain = RuleDomainKind::modelling;
|
|
326
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
258
327
|
attribute appliesTo = "UIElement";
|
|
259
328
|
attribute severity = RuleSeverityKind::warning;
|
|
260
329
|
attribute rationaleText = "An interactive UI element (button, selector, slider, field) should trigger a UIAction that invokes a system function; otherwise the control's purpose is not in the model. Physical controls are OperatorInterfaceElement and are covered separately.";
|
|
@@ -268,6 +337,8 @@ package memo_rules_closure {
|
|
|
268
337
|
constraint def BoundsDetectionConfirmedRule :> MemoConsistencyRule {
|
|
269
338
|
@MemoIdentity { :>> providedId = "CR-MED-112"; }
|
|
270
339
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
340
|
+
attribute domain = RuleDomainKind::modelling;
|
|
341
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
271
342
|
attribute appliesTo = "UIElement";
|
|
272
343
|
attribute severity = RuleSeverityKind::warning;
|
|
273
344
|
attribute rationaleText = "Automatically detected bounds are a proposal until a reviewer confirms them; released UI documentation should contain no unconfirmed automatic bounds.";
|
|
@@ -280,10 +351,185 @@ package memo_rules_closure {
|
|
|
280
351
|
constraint def ScreenCaptureProvenanceRule :> MemoConsistencyRule {
|
|
281
352
|
@MemoIdentity { :>> providedId = "CR-MED-113"; }
|
|
282
353
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
354
|
+
attribute domain = RuleDomainKind::modelling;
|
|
355
|
+
attribute obligation = RuleObligationKind::recommended;
|
|
283
356
|
attribute appliesTo = "ScreenCapture";
|
|
284
357
|
attribute severity = RuleSeverityKind::error;
|
|
285
358
|
attribute rationaleText = "A screen capture used as design or usability evidence must identify the build it was taken from and hash the image bytes, or it cannot be relied on in the DHF.";
|
|
286
359
|
attribute predicateExpression = "attributes.capturedBuild != '' and attributes.imageHash != ''";
|
|
287
360
|
constraint { true }
|
|
288
361
|
}
|
|
362
|
+
|
|
363
|
+
// ─── Risk analysis and software lifecycle rules (clause by clause) ─────
|
|
364
|
+
// Written from the classification in plans/memo-rules-domain-trace-and-editor.md
|
|
365
|
+
// (Step 5): each checks a property the model carries, and each traces to the clause it enforces.
|
|
366
|
+
|
|
367
|
+
constraint def HazardHasSituationRule :> MemoConsistencyRule {
|
|
368
|
+
@MemoIdentity { :>> providedId = "CR-MED-005"; }
|
|
369
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
370
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
371
|
+
attribute obligation = RuleObligationKind::required;
|
|
372
|
+
attribute appliesTo = "Hazard";
|
|
373
|
+
attribute severity = RuleSeverityKind::warning;
|
|
374
|
+
attribute rationaleText = "A hazard is analysed through the hazardous situations it can lead to: a hazard that reaches no hazardous situation has not been analysed far enough to estimate a risk.";
|
|
375
|
+
attribute predicateExpression = "downstream(tracesRisk)->exists(conformsTo(HazardousSituation))";
|
|
376
|
+
constraint { true }
|
|
377
|
+
}
|
|
378
|
+
#EnforcesClause dependency from HazardHasSituationRule to iso14971::iso14971Clause5::iso14971Clause5_4;
|
|
379
|
+
|
|
380
|
+
constraint def SituationLeadsToHarmRule :> MemoConsistencyRule {
|
|
381
|
+
@MemoIdentity { :>> providedId = "CR-MED-006"; }
|
|
382
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
383
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
384
|
+
attribute obligation = RuleObligationKind::required;
|
|
385
|
+
attribute appliesTo = "HazardousSituation";
|
|
386
|
+
attribute severity = RuleSeverityKind::warning;
|
|
387
|
+
attribute rationaleText = "A hazardous situation is described by the harm it can cause; one that reaches no harm leaves the severity of the risk unestimated.";
|
|
388
|
+
attribute predicateExpression = "downstream(tracesRisk)->exists(conformsTo(Harm))";
|
|
389
|
+
constraint { true }
|
|
390
|
+
}
|
|
391
|
+
#EnforcesClause dependency from SituationLeadsToHarmRule to iso14971::iso14971Clause5::iso14971Clause5_4;
|
|
392
|
+
|
|
393
|
+
constraint def RiskEstimateRule :> MemoConsistencyRule {
|
|
394
|
+
@MemoIdentity { :>> providedId = "CR-MED-007"; }
|
|
395
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
396
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
397
|
+
attribute obligation = RuleObligationKind::required;
|
|
398
|
+
attribute appliesTo = "Risk";
|
|
399
|
+
attribute severity = RuleSeverityKind::warning;
|
|
400
|
+
attribute rationaleText = "A risk is estimated from the probability of occurrence and the severity of the harm; a risk missing either has no estimate.";
|
|
401
|
+
attribute predicateExpression = "attributes.probabilityEstimate != '' and attributes.severityEstimate != ''";
|
|
402
|
+
constraint { true }
|
|
403
|
+
}
|
|
404
|
+
#EnforcesClause dependency from RiskEstimateRule to iso14971::iso14971Clause5::iso14971Clause5_5;
|
|
405
|
+
|
|
406
|
+
constraint def RiskAcceptabilityRule :> MemoConsistencyRule {
|
|
407
|
+
@MemoIdentity { :>> providedId = "CR-MED-008"; }
|
|
408
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
409
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
410
|
+
attribute obligation = RuleObligationKind::required;
|
|
411
|
+
attribute appliesTo = "Risk";
|
|
412
|
+
attribute severity = RuleSeverityKind::warning;
|
|
413
|
+
attribute rationaleText = "Each estimated risk is evaluated against the acceptability criteria, so a risk states whether it is acceptable.";
|
|
414
|
+
attribute predicateExpression = "attributes.acceptability != ''";
|
|
415
|
+
constraint { true }
|
|
416
|
+
}
|
|
417
|
+
#EnforcesClause dependency from RiskAcceptabilityRule to iso14971::iso14971Clause6;
|
|
418
|
+
|
|
419
|
+
constraint def ResidualRiskAcceptabilityRule :> MemoConsistencyRule {
|
|
420
|
+
@MemoIdentity { :>> providedId = "CR-MED-009"; }
|
|
421
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
422
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
423
|
+
attribute obligation = RuleObligationKind::required;
|
|
424
|
+
attribute appliesTo = "ResidualRisk";
|
|
425
|
+
attribute severity = RuleSeverityKind::warning;
|
|
426
|
+
attribute rationaleText = "After risk control the residual risk is evaluated: it follows a control and states whether it is acceptable.";
|
|
427
|
+
attribute predicateExpression = "reducedBy->size() >= 1 and attributes.acceptability != ''";
|
|
428
|
+
constraint { true }
|
|
429
|
+
}
|
|
430
|
+
#EnforcesClause dependency from ResidualRiskAcceptabilityRule to iso14971::iso14971Clause7::iso14971Clause7_3;
|
|
431
|
+
|
|
432
|
+
constraint def ResidualRiskEvaluatedRule :> MemoConsistencyRule {
|
|
433
|
+
@MemoIdentity { :>> providedId = "CR-MED-014"; }
|
|
434
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
435
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
436
|
+
attribute obligation = RuleObligationKind::required;
|
|
437
|
+
attribute appliesTo = "ResidualRisk";
|
|
438
|
+
attribute severity = RuleSeverityKind::warning;
|
|
439
|
+
attribute rationaleText = "The overall residual risk is evaluated from the individual residual risks, so each residual risk is an input to that evaluation.";
|
|
440
|
+
attribute predicateExpression = "evaluatedIn->size() >= 1";
|
|
441
|
+
constraint { true }
|
|
442
|
+
}
|
|
443
|
+
#EnforcesClause dependency from ResidualRiskEvaluatedRule to iso14971::iso14971Clause8;
|
|
444
|
+
|
|
445
|
+
constraint def SoupAnomaliesRule :> MemoConsistencyRule {
|
|
446
|
+
@MemoIdentity { :>> providedId = "CR-MED-015"; }
|
|
447
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
448
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
449
|
+
attribute obligation = RuleObligationKind::required;
|
|
450
|
+
attribute appliesTo = "SOUPSoftwareModule";
|
|
451
|
+
attribute severity = RuleSeverityKind::warning;
|
|
452
|
+
attribute rationaleText = "The published anomaly list of a SOUP item is evaluated for anomalies that could lead to a hazardous situation, and the result is recorded on the item.";
|
|
453
|
+
attribute predicateExpression = "attributes.knownAnomalies != ''";
|
|
454
|
+
constraint { true }
|
|
455
|
+
}
|
|
456
|
+
#EnforcesClause dependency from SoupAnomaliesRule to iec62304::iec62304Clause7::iec62304Clause7_1::iec62304Clause7_1_3;
|
|
457
|
+
|
|
458
|
+
constraint def SoupIdentifiedRule :> MemoConsistencyRule {
|
|
459
|
+
@MemoIdentity { :>> providedId = "CR-MED-016"; }
|
|
460
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
461
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
462
|
+
attribute obligation = RuleObligationKind::required;
|
|
463
|
+
attribute appliesTo = "SOUPSoftwareModule";
|
|
464
|
+
attribute severity = RuleSeverityKind::warning;
|
|
465
|
+
attribute rationaleText = "A SOUP item is identified under configuration management by its title, manufacturer and version, so a SOUP item states a vendor and a version.";
|
|
466
|
+
attribute predicateExpression = "attributes.version != '' and attributes.supplier != ''";
|
|
467
|
+
constraint { true }
|
|
468
|
+
}
|
|
469
|
+
#EnforcesClause dependency from SoupIdentifiedRule to iec62304::iec62304Clause8::iec62304Clause8_1::iec62304Clause8_1_2;
|
|
470
|
+
|
|
471
|
+
constraint def SoupRequirementRule :> MemoConsistencyRule {
|
|
472
|
+
@MemoIdentity { :>> providedId = "CR-MED-017"; }
|
|
473
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
474
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
475
|
+
attribute obligation = RuleObligationKind::required;
|
|
476
|
+
attribute appliesTo = "SOUPSoftwareModule";
|
|
477
|
+
attribute severity = RuleSeverityKind::warning;
|
|
478
|
+
attribute rationaleText = "The functional and performance a software item needs from a SOUP item are stated as requirements, so a SOUP item is the subject of at least one requirement.";
|
|
479
|
+
attribute predicateExpression = "satisfiedBy->size() >= 1";
|
|
480
|
+
constraint { true }
|
|
481
|
+
}
|
|
482
|
+
#EnforcesClause dependency from SoupRequirementRule to iec62304::iec62304Clause5::iec62304Clause5_3::iec62304Clause5_3_3;
|
|
483
|
+
|
|
484
|
+
constraint def UnitDecompositionRule :> MemoConsistencyRule {
|
|
485
|
+
@MemoIdentity { :>> providedId = "CR-MED-018"; }
|
|
486
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
487
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
488
|
+
attribute obligation = RuleObligationKind::required;
|
|
489
|
+
attribute appliesTo = "SoftwareModule";
|
|
490
|
+
attribute severity = RuleSeverityKind::warning;
|
|
491
|
+
attribute rationaleText = "A software item of safety class B or C is subdivided into software units, so such an item contains at least one module of kind unit.";
|
|
492
|
+
attribute predicateExpression = "not(attributes.moduleKind == 'item' and (attributes.safetyClass == 'B' or attributes.safetyClass == 'C')) or downstream(composes)->exists(attributes.moduleKind == 'unit')";
|
|
493
|
+
constraint { true }
|
|
494
|
+
}
|
|
495
|
+
#EnforcesClause dependency from UnitDecompositionRule to iec62304::iec62304Clause5::iec62304Clause5_4::iec62304Clause5_4_1;
|
|
496
|
+
|
|
497
|
+
constraint def ChangeImpactRule :> MemoConsistencyRule {
|
|
498
|
+
@MemoIdentity { :>> providedId = "CR-MED-019"; }
|
|
499
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
500
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
501
|
+
attribute obligation = RuleObligationKind::required;
|
|
502
|
+
attribute appliesTo = "ChangeRequest";
|
|
503
|
+
attribute severity = RuleSeverityKind::warning;
|
|
504
|
+
attribute rationaleText = "A change request is analysed for its effect on the organisation, the released software and the systems that interface with it, and the analysis is recorded on the request.";
|
|
505
|
+
attribute predicateExpression = "attributes.impactAssessment != ''";
|
|
506
|
+
constraint { true }
|
|
507
|
+
}
|
|
508
|
+
#EnforcesClause dependency from ChangeImpactRule to iec62304::iec62304Clause6::iec62304Clause6_2::iec62304Clause6_2_3;
|
|
509
|
+
|
|
510
|
+
constraint def ChangeApprovalRule :> MemoConsistencyRule {
|
|
511
|
+
@MemoIdentity { :>> providedId = "CR-MED-025"; }
|
|
512
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
513
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
514
|
+
attribute obligation = RuleObligationKind::required;
|
|
515
|
+
attribute appliesTo = "ChangeRequest";
|
|
516
|
+
attribute severity = RuleSeverityKind::warning;
|
|
517
|
+
attribute rationaleText = "A change request records whether it was approved before the change is made.";
|
|
518
|
+
attribute predicateExpression = "attributes.approvalStatus != ''";
|
|
519
|
+
constraint { true }
|
|
520
|
+
}
|
|
521
|
+
#EnforcesClause dependency from ChangeApprovalRule to iec62304::iec62304Clause6::iec62304Clause6_2::iec62304Clause6_2_4, iec62304::iec62304Clause8::iec62304Clause8_2::iec62304Clause8_2_1;
|
|
522
|
+
|
|
523
|
+
constraint def ChangeTraceRule :> MemoConsistencyRule {
|
|
524
|
+
@MemoIdentity { :>> providedId = "CR-MED-026"; }
|
|
525
|
+
attribute tailoring = RuleTailoringKind::assurance;
|
|
526
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
527
|
+
attribute obligation = RuleObligationKind::required;
|
|
528
|
+
attribute appliesTo = "ChangeRequest";
|
|
529
|
+
attribute severity = RuleSeverityKind::warning;
|
|
530
|
+
attribute rationaleText = "A change request is traceable to the items it changes, so it has a changes relation to at least one element.";
|
|
531
|
+
attribute predicateExpression = "changes->size() >= 1";
|
|
532
|
+
constraint { true }
|
|
533
|
+
}
|
|
534
|
+
#EnforcesClause dependency from ChangeTraceRule to iec62304::iec62304Clause8::iec62304Clause8_2::iec62304Clause8_2_4;
|
|
289
535
|
}
|
|
@@ -8,24 +8,35 @@ package memo_rules_crosslayer {
|
|
|
8
8
|
|
|
9
9
|
private import memo_core_common::*;
|
|
10
10
|
private import memo_core_common::MemoIdentity;
|
|
11
|
+
private import memo_artifacts_standards_traceability::EnforcesClause;
|
|
12
|
+
private import memo_artifacts_standards_iec_62304::*;
|
|
13
|
+
private import memo_artifacts_standards_iso_14971::*;
|
|
11
14
|
constraint def RiskToReqTraceRule :> MemoConsistencyRule {
|
|
12
15
|
@MemoIdentity { :>> providedId = "XL-001"; }
|
|
13
16
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
17
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
18
|
+
attribute obligation = RuleObligationKind::required;
|
|
19
|
+
// To confirm: inferred from the clause scopes; confirm.
|
|
14
20
|
attribute appliesTo = "Hazard";
|
|
15
21
|
attribute severity = RuleSeverityKind::warning;
|
|
16
22
|
attribute rationaleText = "Risk-requirement traceability required for regulatory submissions.";
|
|
17
23
|
attribute predicateExpression = "derivesFrom->size() >= 1";
|
|
18
24
|
constraint { true }
|
|
19
25
|
}
|
|
26
|
+
#EnforcesClause dependency from RiskToReqTraceRule to iso14971::iso14971Clause7::iso14971Clause7_2, iec62304::iec62304Clause5::iec62304Clause5_2::iec62304Clause5_2_3;
|
|
20
27
|
|
|
21
28
|
constraint def ReqToArchTraceRule :> MemoConsistencyRule {
|
|
22
29
|
@MemoIdentity { :>> providedId = "XL-002"; }
|
|
23
30
|
attribute tailoring = RuleTailoringKind::assurance;
|
|
31
|
+
attribute domain = RuleDomainKind::medicalDevice;
|
|
32
|
+
attribute obligation = RuleObligationKind::required;
|
|
33
|
+
// To confirm: inferred from the clause scope; confirm.
|
|
24
34
|
attribute appliesTo = "Requirement[requirementType=system]";
|
|
25
35
|
attribute severity = RuleSeverityKind::warning;
|
|
26
36
|
attribute rationaleText = "Requirements-to-architecture traceability per IEC 62304.";
|
|
27
37
|
attribute predicateExpression = "satisfiedBy->size() >= 1";
|
|
28
38
|
constraint { true }
|
|
29
39
|
}
|
|
40
|
+
#EnforcesClause dependency from ReqToArchTraceRule to iec62304::iec62304Clause5::iec62304Clause5_3::iec62304Clause5_3_1;
|
|
30
41
|
|
|
31
42
|
}
|