@memoarchitect/ontology 0.4.4
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/LICENSE +19 -0
- package/README.md +70 -0
- package/examples/gpca-pump/dhf/documents/DOC-RMP-001.md +210 -0
- package/examples/gpca-pump/memo.config.yaml +9 -0
- package/examples/gpca-pump/methodology/gpca_methodology.sysml +11 -0
- package/examples/gpca-pump/methodology/gpca_profiles.sysml +25 -0
- package/examples/gpca-pump/methodology/gpca_scope.sysml +25 -0
- package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +231 -0
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +272 -0
- package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +81 -0
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +363 -0
- package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +205 -0
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +113 -0
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +172 -0
- package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +173 -0
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +1062 -0
- package/examples/gpca-pump/model/catalog/gpca_operational.sysml +209 -0
- package/examples/gpca-pump/model/catalog/gpca_physical.sysml +53 -0
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +1505 -0
- package/examples/gpca-pump/model/catalog/gpca_risk.sysml +744 -0
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +144 -0
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +696 -0
- package/examples/gpca-pump/model/catalog/gpca_verification.sysml +285 -0
- package/examples/gpca-pump/model/samples/README.md +24 -0
- package/examples/gpca-pump/model/samples/action_flow_view.sysml +72 -0
- package/examples/gpca-pump/model/samples/action_flow_view.viewlayout +9 -0
- package/examples/gpca-pump/model/samples/functional_flow_view.sysml +153 -0
- package/examples/gpca-pump/model/samples/interconnection_view.sysml +93 -0
- package/examples/gpca-pump/model/samples/interconnection_view.viewlayout +99 -0
- package/examples/gpca-pump/model/samples/operational_behaviour_view.sysml +145 -0
- package/examples/gpca-pump/model/samples/tree_view.sysml +56 -0
- package/examples/gpca-pump/model/views/behavior_action_flow_view.sysml +41 -0
- package/examples/gpca-pump/model/views/context_system_context_view.sysml +43 -0
- package/examples/gpca-pump/model/views/cybersecurity_cybersecurity_view.sysml +44 -0
- package/examples/gpca-pump/model/views/document_architecture_description_view.sysml +29 -0
- package/examples/gpca-pump/model/views/document_cyber_assessment_view.sysml +28 -0
- package/examples/gpca-pump/model/views/document_dhf_index_view.sysml +29 -0
- package/examples/gpca-pump/model/views/document_hazard_analysis_view.sysml +29 -0
- package/examples/gpca-pump/model/views/document_rmf_view.sysml +29 -0
- package/examples/gpca-pump/model/views/document_sdd_view.sysml +29 -0
- package/examples/gpca-pump/model/views/document_threat_model_view.sysml +28 -0
- package/examples/gpca-pump/model/views/document_usability_view.sysml +28 -0
- package/examples/gpca-pump/model/views/document_vv_view.sysml +29 -0
- package/examples/gpca-pump/model/views/functional_function_allocation_view.sysml +42 -0
- package/examples/gpca-pump/model/views/functional_function_browser_view.sysml +41 -0
- package/examples/gpca-pump/model/views/logical_device_interconnect_view.sysml +43 -0
- package/examples/gpca-pump/model/views/logical_logical_architecture_view.sysml +42 -0
- package/examples/gpca-pump/model/views/logical_mode_state_view.sysml +42 -0
- package/examples/gpca-pump/model/views/logical_system_decomposition_view.sysml +44 -0
- package/examples/gpca-pump/model/views/operational_scenario_sequence_view.sysml +41 -0
- package/examples/gpca-pump/model/views/operational_use_case_view.sysml +43 -0
- package/examples/gpca-pump/model/views/physical_physical_bom_view.sysml +41 -0
- package/examples/gpca-pump/model/views/requirements_requirements_trace_view.sysml +42 -0
- package/examples/gpca-pump/model/views/risk_fmea_view.sysml +42 -0
- package/examples/gpca-pump/model/views/risk_risk_chain_view.sysml +44 -0
- package/examples/gpca-pump/model/views/software_software_architecture_view.sysml +43 -0
- package/examples/gpca-pump/model/views/verification_verification_coverage_view.sysml +42 -0
- package/memo.manifest.yaml +13 -0
- package/methodologies/default/memo.package.yaml +9 -0
- package/methodologies/gpca/memo.package.yaml +9 -0
- package/ontology/memo.package.yaml +8 -0
- package/ontology/memo.rendering.yaml +47 -0
- package/package.json +65 -0
- package/profile/archetypes.yaml +36 -0
- package/profile/memo.package.yaml +9 -0
- package/profile/templates/connected-device/starter.sysml +8 -0
- package/profile/templates/infusion-pump/starter.sysml +8 -0
- package/profile/templates/monitoring-device/starter.sysml +8 -0
- package/profile/templates/samd/starter.sysml +8 -0
- package/src/architecture/analysis/memo_fmea.sysml +91 -0
- package/src/architecture/assurance/memo_assurance.sysml +29 -0
- package/src/architecture/behavior/memo_behavior.sysml +65 -0
- package/src/architecture/constraints/memo_constraints.sysml +14 -0
- package/src/architecture/context/memo_context.sysml +58 -0
- package/src/architecture/cybersecurity/memo_cybersecurity.sysml +99 -0
- package/src/architecture/decisions/memo_decisions.sysml +12 -0
- package/src/architecture/functions/memo_functions.sysml +30 -0
- package/src/architecture/hardware_structure/memo_hardware_structure.sysml +15 -0
- package/src/architecture/interfaces/memo_interfaces.sysml +103 -0
- package/src/architecture/logical_structure/memo_logical_structure.sysml +10 -0
- package/src/architecture/operational/memo_operational.sysml +51 -0
- package/src/architecture/physical/memo_physical_architecture.sysml +19 -0
- package/src/architecture/requirements/memo_requirements.sysml +69 -0
- package/src/architecture/risk/memo_arch_risk.sysml +7 -0
- package/src/architecture/risk/memo_risk.sysml +80 -0
- package/src/architecture/software_structure/memo_software_structure.sysml +44 -0
- package/src/architecture/system/memo_system_analysis.sysml +54 -0
- package/src/artifacts/clinical_safety_report.sysml +12 -0
- package/src/artifacts/cybersecurity_assessment_report.sysml +12 -0
- package/src/artifacts/definitions/memo_artifact_definitions.sysml +12 -0
- package/src/artifacts/design_change_log.sysml +12 -0
- package/src/artifacts/design_history_file_index.sysml +12 -0
- package/src/artifacts/design_input_plan.sysml +12 -0
- package/src/artifacts/design_output_plan.sysml +12 -0
- package/src/artifacts/evidence_record.sysml +12 -0
- package/src/artifacts/failure_mode_effects_analysis.sysml +12 -0
- package/src/artifacts/hazard_analysis_report.sysml +12 -0
- package/src/artifacts/labeling_specification.sysml +12 -0
- package/src/artifacts/requirements_specification.sysml +12 -0
- package/src/artifacts/requirements_traceability_matrix.sysml +12 -0
- package/src/artifacts/risk_management_plan.sysml +12 -0
- package/src/artifacts/software_design_description.sysml +12 -0
- package/src/artifacts/software_development_plan.sysml +12 -0
- package/src/artifacts/soup_list.sysml +12 -0
- package/src/artifacts/system_architecture_description.sysml +12 -0
- package/src/artifacts/test_protocol.sysml +12 -0
- package/src/artifacts/test_report.sysml +12 -0
- package/src/artifacts/threat_model_report.sysml +12 -0
- package/src/artifacts/usability_engineering_report.sysml +12 -0
- package/src/compliance/artifacts/memo_artifacts.sysml +13 -0
- package/src/compliance/change/memo_change.sysml +17 -0
- package/src/compliance/dhf-templates/21cfr820/change-record.md +45 -0
- package/src/compliance/dhf-templates/21cfr820/design-input.md +67 -0
- package/src/compliance/dhf-templates/21cfr820/design-output.md +80 -0
- package/src/compliance/dhf-templates/21cfr820/design-review.md +51 -0
- package/src/compliance/dhf-templates/21cfr820/design-validation.md +64 -0
- package/src/compliance/dhf-templates/21cfr820/design-verification.md +57 -0
- package/src/compliance/dhf-templates/21cfr820/dhf-index.md +111 -0
- package/src/compliance/dhf-templates/21cfr820/transfer-plan.md +50 -0
- package/src/compliance/dhf-templates/21cfr820/user-needs.md +81 -0
- package/src/compliance/dhf-templates/21cfr820/vv-plan.md +89 -0
- package/src/compliance/dhf-templates/21cfr820/vv-report.md +85 -0
- package/src/compliance/dhf-templates/fda-cybersecurity/incident-response.md +66 -0
- package/src/compliance/dhf-templates/fda-cybersecurity/postmarket-surveillance.md +63 -0
- package/src/compliance/dhf-templates/fda-cybersecurity/security-arch.md +83 -0
- package/src/compliance/dhf-templates/fda-cybersecurity/threat-model.md +100 -0
- package/src/compliance/dhf-templates/fda-cybersecurity/vuln-assessment.md +77 -0
- package/src/compliance/dhf-templates/iec-62304/change-control.md +40 -0
- package/src/compliance/dhf-templates/iec-62304/detailed-design.md +69 -0
- package/src/compliance/dhf-templates/iec-62304/integration-test.md +68 -0
- package/src/compliance/dhf-templates/iec-62304/sad.md +115 -0
- package/src/compliance/dhf-templates/iec-62304/sbom.md +67 -0
- package/src/compliance/dhf-templates/iec-62304/sdp.md +108 -0
- package/src/compliance/dhf-templates/iec-62304/soup.md +77 -0
- package/src/compliance/dhf-templates/iec-62304/srs.md +138 -0
- package/src/compliance/dhf-templates/iec-62304/sw-traceability.md +111 -0
- package/src/compliance/dhf-templates/iec-62304/system-test.md +67 -0
- package/src/compliance/dhf-templates/iec-62366/formative-eval.md +47 -0
- package/src/compliance/dhf-templates/iec-62366/summative-eval.md +69 -0
- package/src/compliance/dhf-templates/iec-62366/task-analysis.md +57 -0
- package/src/compliance/dhf-templates/iec-62366/ue-plan.md +81 -0
- package/src/compliance/dhf-templates/iec-62366/ui-spec.md +61 -0
- package/src/compliance/dhf-templates/iec-62366/urra.md +74 -0
- package/src/compliance/dhf-templates/iec-62366/use-spec.md +61 -0
- package/src/compliance/dhf-templates/iso-14971/fmea.md +93 -0
- package/src/compliance/dhf-templates/iso-14971/fta.md +70 -0
- package/src/compliance/dhf-templates/iso-14971/har.md +165 -0
- package/src/compliance/dhf-templates/iso-14971/risk-benefit.md +51 -0
- package/src/compliance/dhf-templates/iso-14971/risk-matrix.md +51 -0
- package/src/compliance/dhf-templates/iso-14971/rmp.md +169 -0
- package/src/compliance/dhf-templates/iso-14971/rmr.md +101 -0
- package/src/compliance/dhf-templates/shared/snippets/approval-block.md +16 -0
- package/src/compliance/dhf-templates/shared/snippets/document-control-header.md +15 -0
- package/src/compliance/dhf-templates/shared/snippets/references-section.md +16 -0
- package/src/compliance/dhf-templates/shared/snippets/revision-history-table.md +11 -0
- package/src/compliance/document_views/memo_document_views.sysml +7 -0
- package/src/compliance/iso14971/risk_management_file.sysml +16 -0
- package/src/compliance/postmarket/memo_postmarket.sysml +16 -0
- package/src/core/common/memo_common.sysml +50 -0
- package/src/core/consistency_rules/consistency_rules.sysml +41 -0
- package/src/core/dimensions/dimensions.sysml +37 -0
- package/src/core/enumerations/memo_enumerations.sysml +562 -0
- package/src/core/methodology_scope/methodology_scope.sysml +46 -0
- package/src/core/relationships/memo_relationships.sysml +230 -0
- package/src/core/semantics/semantics.sysml +20 -0
- package/src/core/stdlib/collections.sysml +6 -0
- package/src/core/stdlib/functions.sysml +6 -0
- package/src/core/stdlib/scalars.sysml +6 -0
- package/src/core/stdlib/time.sysml +6 -0
- package/src/medical_device_library.sysml +100 -0
- package/src/memo_namespaces.sysml +668 -0
- package/src/methodology/LICENSES/MIT.txt +19 -0
- package/src/methodology/memo_archetypes.sysml +93 -0
- package/src/methodology/memo_core.sysml +53 -0
- package/src/methodology/memo_gates.sysml +11 -0
- package/src/methodology/memo_patterns.sysml +12 -0
- package/src/methodology/memo_profiles.sysml +218 -0
- package/src/methodology/memo_rules.sysml +15 -0
- package/src/methodology/memo_viewpoints.sysml +5 -0
- package/src/methodology/memo_workflow.sysml +14 -0
- package/src/rules/closure/closure_rules.sysml +180 -0
- package/src/rules/coverage/coverage_rules.sysml +258 -0
- package/src/rules/crosslayer/cross_layer_rules.sysml +38 -0
- package/src/rules/lifecycle/lifecycle_rules.sysml +41 -0
- package/src/rules/quantitative/quantitative_rules.sysml +34 -0
- package/src/viewpoints/clinical/clinical_evidence_view.sysml +13 -0
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +25 -0
- package/src/viewpoints/context/context_viewpoint.sysml +25 -0
- package/src/viewpoints/context/system_context_view.sysml +29 -0
- package/src/viewpoints/cybersecurity/cybersecurity_assessment_view.sysml +13 -0
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +27 -0
- package/src/viewpoints/cybersecurity/threat_model_view.sysml +13 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +82 -0
- package/src/viewpoints/functional/function_allocation_view.sysml +29 -0
- package/src/viewpoints/functional/functional_viewpoint.sysml +25 -0
- package/src/viewpoints/functional/system_functional_tree_view.sysml +29 -0
- package/src/viewpoints/logical/logical_architecture_view.sysml +29 -0
- package/src/viewpoints/logical/logical_viewpoint.sysml +25 -0
- package/src/viewpoints/operational/operational_viewpoint.sysml +25 -0
- package/src/viewpoints/operational/use_case_view.sysml +29 -0
- package/src/viewpoints/physical/network_topology_view.sysml +29 -0
- package/src/viewpoints/physical/physical_bom_view.sysml +29 -0
- package/src/viewpoints/physical/physical_viewpoint.sysml +25 -0
- package/src/viewpoints/requirements/requirements_traceability_view.sysml +29 -0
- package/src/viewpoints/requirements/requirements_viewpoint.sysml +25 -0
- package/src/viewpoints/risk/risk_chain_view.sysml +30 -0
- package/src/viewpoints/risk/risk_viewpoint.sysml +25 -0
- package/src/viewpoints/software/software_architecture_view.sysml +29 -0
- package/src/viewpoints/software/software_viewpoint.sysml +25 -0
- package/src/viewpoints/usability/usability_engineering_view.sysml +13 -0
- package/src/viewpoints/usability/usability_viewpoint.sysml +25 -0
- package/src/viewpoints/verification/verification_coverage_view.sysml +29 -0
- package/src/viewpoints/verification/verification_viewpoint.sysml +25 -0
- package/template/memo.package.yaml +5 -0
- package/template/src/catalog/starter.sysml +12 -0
- package/template/src/documents/.gitkeep +1 -0
- package/template/src/views/.gitkeep +1 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// C2 coverage rule packs per regulatory standard — Epic EE-3.
|
|
2
|
+
//
|
|
3
|
+
// Coverage rules assert model-level *existence* ("the model must contain at least
|
|
4
|
+
// one X for standard S"). Existence over the whole model is not a single-subject
|
|
5
|
+
// boolean predicate, so it has no `constraint { … }` body. The legacy
|
|
6
|
+
// `predicate="coverageCheck"` parts were likewise never evaluated by the rule engine
|
|
7
|
+
// (toClosureRule returned undefined for coverageCheck), so they produced no
|
|
8
|
+
// violations — parity is preserved by keeping these as metadata-only constraint defs.
|
|
9
|
+
//
|
|
10
|
+
// Each rule retains its standard / clause / coverageTarget metadata so the coverage
|
|
11
|
+
// catalog and DHF traceability stay intact; the constraint loader skips defs with no
|
|
12
|
+
// require/assert body, so none of these fire. Model-level coverage is reported by the
|
|
13
|
+
// completeness tooling, not the per-subject constraint evaluator. The proprietary
|
|
14
|
+
// `predicate="…"` attribute pattern is removed per EE-3.
|
|
15
|
+
package memo_rules_coverage {
|
|
16
|
+
private import ScalarValues::*;
|
|
17
|
+
|
|
18
|
+
private import memo_core_consistency_rules::*;
|
|
19
|
+
private import memo_core_enumerations::*;
|
|
20
|
+
|
|
21
|
+
// ─── ISO 14971: Risk Management ──────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
constraint def iso14971HazardCoverage {
|
|
24
|
+
attribute id = "COV-14971-001";
|
|
25
|
+
attribute appliesTo = "Hazard";
|
|
26
|
+
attribute severity = RuleSeverityKind::error;
|
|
27
|
+
attribute rationaleText = "ISO 14971 clause 5.4 requires hazard identification.";
|
|
28
|
+
attribute standardReference = "ISO 14971";
|
|
29
|
+
attribute clause = "5.4";
|
|
30
|
+
attribute coverageTarget = "Hazard";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
constraint def iso14971RiskMatrixCoverage {
|
|
34
|
+
attribute id = "COV-14971-002";
|
|
35
|
+
attribute appliesTo = "RiskMatrix";
|
|
36
|
+
attribute severity = RuleSeverityKind::error;
|
|
37
|
+
attribute rationaleText = "ISO 14971 clause 5.5 requires risk estimation and evaluation criteria.";
|
|
38
|
+
attribute standardReference = "ISO 14971";
|
|
39
|
+
attribute clause = "5.5";
|
|
40
|
+
attribute coverageTarget = "RiskMatrix";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
constraint def iso14971ResidualRiskCoverage {
|
|
44
|
+
attribute id = "COV-14971-003";
|
|
45
|
+
attribute appliesTo = "OverallResidualRiskEvaluation";
|
|
46
|
+
attribute severity = RuleSeverityKind::warning;
|
|
47
|
+
attribute rationaleText = "ISO 14971 clause 8 requires overall residual risk evaluation.";
|
|
48
|
+
attribute standardReference = "ISO 14971";
|
|
49
|
+
attribute clause = "8";
|
|
50
|
+
attribute coverageTarget = "OverallResidualRiskEvaluation";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─── IEC 62304: Software Lifecycle ───────────────────────────────────
|
|
54
|
+
|
|
55
|
+
constraint def iec62304SwArchCoverage {
|
|
56
|
+
attribute id = "COV-62304-001";
|
|
57
|
+
attribute appliesTo = "SoftwareComponent";
|
|
58
|
+
attribute severity = RuleSeverityKind::error;
|
|
59
|
+
attribute rationaleText = "IEC 62304 clause 5.3 requires software architecture.";
|
|
60
|
+
attribute standardReference = "IEC 62304";
|
|
61
|
+
attribute clause = "5.3";
|
|
62
|
+
attribute coverageTarget = "SoftwareComponent";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
constraint def iec62304SwReqCoverage {
|
|
66
|
+
attribute id = "COV-62304-002";
|
|
67
|
+
attribute appliesTo = "SoftwareRequirement";
|
|
68
|
+
attribute severity = RuleSeverityKind::error;
|
|
69
|
+
attribute rationaleText = "IEC 62304 clause 5.2 requires software requirements specification.";
|
|
70
|
+
attribute standardReference = "IEC 62304";
|
|
71
|
+
attribute clause = "5.2";
|
|
72
|
+
attribute coverageTarget = "SoftwareRequirement";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ─── FDA 21 CFR 820: Quality System ──────────────────────────────────
|
|
76
|
+
|
|
77
|
+
constraint def fda820DesignInputCoverage {
|
|
78
|
+
attribute id = "COV-820-001";
|
|
79
|
+
attribute appliesTo = "SystemRequirement";
|
|
80
|
+
attribute severity = RuleSeverityKind::error;
|
|
81
|
+
attribute rationaleText = "21 CFR 820.30(c) requires design inputs including requirements.";
|
|
82
|
+
attribute standardReference = "FDA 21 CFR 820";
|
|
83
|
+
attribute clause = "820.30(c)";
|
|
84
|
+
attribute coverageTarget = "SystemRequirement";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
constraint def fda820DesignVerificationCoverage {
|
|
88
|
+
attribute id = "COV-820-002";
|
|
89
|
+
attribute appliesTo = "VerificationCase";
|
|
90
|
+
attribute severity = RuleSeverityKind::error;
|
|
91
|
+
attribute rationaleText = "21 CFR 820.30(f) requires design verification.";
|
|
92
|
+
attribute standardReference = "FDA 21 CFR 820";
|
|
93
|
+
attribute clause = "820.30(f)";
|
|
94
|
+
attribute coverageTarget = "VerificationCase";
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ─── ISO 13485: Quality Management ───────────────────────────────────
|
|
98
|
+
|
|
99
|
+
constraint def iso13485StakeholderNeedCoverage {
|
|
100
|
+
attribute id = "COV-13485-001";
|
|
101
|
+
attribute appliesTo = "StakeholderNeed";
|
|
102
|
+
attribute severity = RuleSeverityKind::error;
|
|
103
|
+
attribute rationaleText = "ISO 13485 clause 7.2 requires determination of customer requirements.";
|
|
104
|
+
attribute standardReference = "ISO 13485";
|
|
105
|
+
attribute clause = "7.2";
|
|
106
|
+
attribute coverageTarget = "StakeholderNeed";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ─── ISO 14155: Clinical Investigations ──────────────────────────────
|
|
110
|
+
|
|
111
|
+
constraint def iso14155UseContextCoverage {
|
|
112
|
+
attribute id = "COV-14155-001";
|
|
113
|
+
attribute appliesTo = "UseContext";
|
|
114
|
+
attribute severity = RuleSeverityKind::warning;
|
|
115
|
+
attribute rationaleText = "ISO 14155 requires definition of clinical investigation context.";
|
|
116
|
+
attribute standardReference = "ISO 14155";
|
|
117
|
+
attribute clause = "6";
|
|
118
|
+
attribute coverageTarget = "UseContext";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ─── FDA Cybersecurity Guidance ──────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
constraint def fdaCyberThreatCoverage {
|
|
124
|
+
attribute id = "COV-CYBER-001";
|
|
125
|
+
attribute appliesTo = "Threat";
|
|
126
|
+
attribute severity = RuleSeverityKind::error;
|
|
127
|
+
attribute rationaleText = "FDA cybersecurity guidance requires threat modeling.";
|
|
128
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
129
|
+
attribute clause = "V.A";
|
|
130
|
+
attribute coverageTarget = "Threat";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
constraint def fdaCyberAssetCoverage {
|
|
134
|
+
attribute id = "COV-CYBER-002";
|
|
135
|
+
attribute appliesTo = "CybersecurityAsset";
|
|
136
|
+
attribute severity = RuleSeverityKind::error;
|
|
137
|
+
attribute rationaleText = "FDA cybersecurity guidance requires asset identification.";
|
|
138
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
139
|
+
attribute clause = "V.A";
|
|
140
|
+
attribute coverageTarget = "CybersecurityAsset";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
constraint def fdaCyberVulnerabilityCoverage {
|
|
144
|
+
attribute id = "COV-CYBER-003";
|
|
145
|
+
attribute appliesTo = "Vulnerability";
|
|
146
|
+
attribute severity = RuleSeverityKind::error;
|
|
147
|
+
attribute rationaleText = "FDA cybersecurity guidance requires vulnerability analysis.";
|
|
148
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
149
|
+
attribute clause = "V.B";
|
|
150
|
+
attribute coverageTarget = "Vulnerability";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
constraint def fdaCyberTrustBoundaryCoverage {
|
|
154
|
+
attribute id = "COV-CYBER-004";
|
|
155
|
+
attribute appliesTo = "TrustBoundary";
|
|
156
|
+
attribute severity = RuleSeverityKind::error;
|
|
157
|
+
attribute rationaleText = "FDA cybersecurity guidance requires trust boundary identification.";
|
|
158
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
159
|
+
attribute clause = "V.A";
|
|
160
|
+
attribute coverageTarget = "TrustBoundary";
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
constraint def fdaCyberThreatScenarioCoverage {
|
|
164
|
+
attribute id = "COV-CYBER-005";
|
|
165
|
+
attribute appliesTo = "ThreatScenario";
|
|
166
|
+
attribute severity = RuleSeverityKind::error;
|
|
167
|
+
attribute rationaleText = "FDA cybersecurity guidance requires threat scenario analysis.";
|
|
168
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
169
|
+
attribute clause = "V.A";
|
|
170
|
+
attribute coverageTarget = "ThreatScenario";
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
constraint def fdaCyberMitigationCoverage {
|
|
174
|
+
attribute id = "COV-CYBER-006";
|
|
175
|
+
attribute appliesTo = "CyberMitigation";
|
|
176
|
+
attribute severity = RuleSeverityKind::error;
|
|
177
|
+
attribute rationaleText = "FDA cybersecurity guidance requires risk mitigation.";
|
|
178
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
179
|
+
attribute clause = "V.C";
|
|
180
|
+
attribute coverageTarget = "CyberMitigation";
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
constraint def fdaCyberRiskCoverage {
|
|
184
|
+
attribute id = "COV-CYBER-007";
|
|
185
|
+
attribute appliesTo = "CyberRisk";
|
|
186
|
+
attribute severity = RuleSeverityKind::error;
|
|
187
|
+
attribute rationaleText = "FDA cybersecurity guidance requires cyber risk assessment.";
|
|
188
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
189
|
+
attribute clause = "V.B";
|
|
190
|
+
attribute coverageTarget = "CyberRisk";
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
constraint def fdaCyberHazardCoverage {
|
|
194
|
+
attribute id = "COV-CYBER-008";
|
|
195
|
+
attribute appliesTo = "CyberHazard";
|
|
196
|
+
attribute severity = RuleSeverityKind::error;
|
|
197
|
+
attribute rationaleText = "FDA cybersecurity guidance requires cyber-safety hazard mapping.";
|
|
198
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
199
|
+
attribute clause = "V.B";
|
|
200
|
+
attribute coverageTarget = "CyberHazard";
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
constraint def fdaCyberSecurityReqCoverage {
|
|
204
|
+
attribute id = "COV-CYBER-009";
|
|
205
|
+
attribute appliesTo = "SecurityRequirement";
|
|
206
|
+
attribute severity = RuleSeverityKind::error;
|
|
207
|
+
attribute rationaleText = "FDA cybersecurity guidance requires security requirements derivation.";
|
|
208
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
209
|
+
attribute clause = "V.C";
|
|
210
|
+
attribute coverageTarget = "SecurityRequirement";
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
constraint def fdaCyberVerificationCoverage {
|
|
214
|
+
attribute id = "COV-CYBER-010";
|
|
215
|
+
attribute appliesTo = "VerificationCase";
|
|
216
|
+
attribute severity = RuleSeverityKind::warning;
|
|
217
|
+
attribute rationaleText = "FDA cybersecurity guidance requires security testing and verification.";
|
|
218
|
+
attribute standardReference = "FDA Cybersecurity";
|
|
219
|
+
attribute clause = "V.D";
|
|
220
|
+
attribute coverageTarget = "VerificationCase";
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ─── IEC 62366: Usability Engineering ────────────────────────────────
|
|
224
|
+
|
|
225
|
+
constraint def iec62366ActorCoverage {
|
|
226
|
+
attribute id = "COV-62366-001";
|
|
227
|
+
attribute appliesTo = "Actor";
|
|
228
|
+
attribute severity = RuleSeverityKind::warning;
|
|
229
|
+
attribute rationaleText = "IEC 62366 clause 5.1 requires user profile specification.";
|
|
230
|
+
attribute standardReference = "IEC 62366";
|
|
231
|
+
attribute clause = "5.1";
|
|
232
|
+
attribute coverageTarget = "Actor";
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// ─── IEC 60601-1: General Safety ─────────────────────────────────────
|
|
236
|
+
|
|
237
|
+
constraint def iec60601HarmCoverage {
|
|
238
|
+
attribute id = "COV-60601-001";
|
|
239
|
+
attribute appliesTo = "Harm";
|
|
240
|
+
attribute severity = RuleSeverityKind::error;
|
|
241
|
+
attribute rationaleText = "IEC 60601-1 clause 4.2 requires identification of hazards and harms.";
|
|
242
|
+
attribute standardReference = "IEC 60601-1";
|
|
243
|
+
attribute clause = "4.2";
|
|
244
|
+
attribute coverageTarget = "Harm";
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ─── IEC 82304-1: Health Software ────────────────────────────────────
|
|
248
|
+
|
|
249
|
+
constraint def iec82304SwSystemCoverage {
|
|
250
|
+
attribute id = "COV-82304-001";
|
|
251
|
+
attribute appliesTo = "SoftwareSystem";
|
|
252
|
+
attribute severity = RuleSeverityKind::error;
|
|
253
|
+
attribute rationaleText = "IEC 82304-1 requires health software product definition.";
|
|
254
|
+
attribute standardReference = "IEC 82304-1";
|
|
255
|
+
attribute clause = "6.1";
|
|
256
|
+
attribute coverageTarget = "SoftwareSystem";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// C4 cross-layer rule pack — native KerML constraints (Epic EE-3).
|
|
2
|
+
// Traceability between architecture layers, migrated from ConsistencyRule
|
|
3
|
+
// predicate-attribute parts to native `constraint def` bodies.
|
|
4
|
+
package memo_rules_crosslayer {
|
|
5
|
+
private import ScalarValues::*;
|
|
6
|
+
|
|
7
|
+
private import memo_core_consistency_rules::*;
|
|
8
|
+
private import memo_core_enumerations::*;
|
|
9
|
+
|
|
10
|
+
constraint def riskToReqTraceRule {
|
|
11
|
+
attribute id = "XL-001";
|
|
12
|
+
attribute appliesTo = "Hazard";
|
|
13
|
+
attribute severity = RuleSeverityKind::warning;
|
|
14
|
+
attribute rationaleText = "Risk-requirement traceability required for regulatory submissions.";
|
|
15
|
+
attribute predicateExpression = "derivesFrom->size() >= 1";
|
|
16
|
+
constraint { true }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
constraint def reqToArchTraceRule {
|
|
20
|
+
attribute id = "XL-002";
|
|
21
|
+
attribute appliesTo = "SystemRequirement";
|
|
22
|
+
attribute severity = RuleSeverityKind::warning;
|
|
23
|
+
attribute rationaleText = "Requirements-to-architecture traceability per IEC 62304.";
|
|
24
|
+
attribute predicateExpression = "satisfiedBy->size() >= 1";
|
|
25
|
+
constraint { true }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// XL-003 had minCount=0 (advisory only), so the native form is vacuously true
|
|
29
|
+
// (size >= 0). Retained for metadata/rationale parity; flags nothing.
|
|
30
|
+
constraint def cyberToSafetyTraceRule {
|
|
31
|
+
attribute id = "XL-003";
|
|
32
|
+
attribute appliesTo = "CyberHazard";
|
|
33
|
+
attribute severity = RuleSeverityKind::warning;
|
|
34
|
+
attribute rationaleText = "FDA cybersecurity guidance requires linking cybersecurity to patient safety.";
|
|
35
|
+
attribute predicateExpression = "impactsSafety->size() >= 0";
|
|
36
|
+
constraint { true }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// C3 lifecycle rule pack — Epic EE-3.
|
|
2
|
+
// These rules express lifecycle-stage *ordering* (requirements before architecture,
|
|
3
|
+
// risk before verification, evidence after verification). Ordering across the whole
|
|
4
|
+
// model is not a single-subject boolean predicate, so it has no `require constraint`
|
|
5
|
+
// body — and the legacy parts never enforced anything either (they carried
|
|
6
|
+
// predicate=requireRelationship with no relationshipType, so they matched nothing).
|
|
7
|
+
//
|
|
8
|
+
// They are retained here as metadata-only constraint defs (id, subject, rationale)
|
|
9
|
+
// so the catalog and traceability stay intact; the constraint loader skips defs that
|
|
10
|
+
// have no require/assert body, so they evaluate to nothing — exactly as before.
|
|
11
|
+
// The proprietary `predicate="…"` attribute pattern is removed per EE-3.
|
|
12
|
+
package memo_rules_lifecycle {
|
|
13
|
+
private import ScalarValues::*;
|
|
14
|
+
|
|
15
|
+
private import memo_core_consistency_rules::*;
|
|
16
|
+
private import memo_core_enumerations::*;
|
|
17
|
+
|
|
18
|
+
constraint def reqBeforeArchRule {
|
|
19
|
+
attribute id = "LC-001";
|
|
20
|
+
attribute appliesTo = "SoftwareComponent";
|
|
21
|
+
attribute severity = RuleSeverityKind::warning;
|
|
22
|
+
attribute rationaleText = "IEC 62304 requires requirements to precede architecture decomposition.";
|
|
23
|
+
// Lifecycle ordering — model-level, no single-subject predicate.
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
constraint def riskBeforeVerificationRule {
|
|
27
|
+
attribute id = "LC-002";
|
|
28
|
+
attribute appliesTo = "VerificationCase";
|
|
29
|
+
attribute severity = RuleSeverityKind::warning;
|
|
30
|
+
attribute rationaleText = "Risk controls drive verification scope per ISO 14971.";
|
|
31
|
+
// Lifecycle ordering — model-level, no single-subject predicate.
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
constraint def evidenceAfterVerificationRule {
|
|
35
|
+
attribute id = "LC-003";
|
|
36
|
+
attribute appliesTo = "Evidence";
|
|
37
|
+
attribute severity = RuleSeverityKind::info;
|
|
38
|
+
attribute rationaleText = "Evidence is produced by executing verification — ordering matters for DHF assembly.";
|
|
39
|
+
// Lifecycle ordering — model-level, no single-subject predicate.
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// C5 quantitative rule pack — native KerML constraints (Epic EE-3).
|
|
2
|
+
// Numeric cardinality bounds migrated from cardinalityCheck predicate parts to
|
|
3
|
+
// native `constraint def` bodies. The aggregate ratio rule (QT-003) is a
|
|
4
|
+
// model-level metric, not a single-subject predicate, and is omitted (see note).
|
|
5
|
+
package memo_rules_quantitative {
|
|
6
|
+
private import ScalarValues::*;
|
|
7
|
+
|
|
8
|
+
private import memo_core_consistency_rules::*;
|
|
9
|
+
private import memo_core_enumerations::*;
|
|
10
|
+
|
|
11
|
+
constraint def hazardMaxControlsRule {
|
|
12
|
+
attribute id = "QT-001";
|
|
13
|
+
attribute appliesTo = "Hazard";
|
|
14
|
+
attribute severity = RuleSeverityKind::info;
|
|
15
|
+
attribute rationaleText = "Excessive controls per hazard suggests the hazard is too broad and should be decomposed.";
|
|
16
|
+
attribute predicateExpression = "mitigatesHazard->size() >= 0 and mitigatesHazard->size() <= 10";
|
|
17
|
+
constraint { true }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
constraint def swComponentMaxInterfacesRule {
|
|
21
|
+
attribute id = "QT-002";
|
|
22
|
+
attribute appliesTo = "SoftwareComponent";
|
|
23
|
+
attribute severity = RuleSeverityKind::info;
|
|
24
|
+
attribute rationaleText = "High interface count indicates excessive coupling; consider decomposition.";
|
|
25
|
+
attribute predicateExpression = "threatenedBy->size() >= 0 and threatenedBy->size() <= 8";
|
|
26
|
+
constraint { true }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// QT-003 (RequirementVerificationRatio, "≥80% of requirements verified") is an
|
|
30
|
+
// aggregate coverage metric over the whole requirement set, not a per-subject
|
|
31
|
+
// predicate, so it has no `constraint { … }` form. It remains a
|
|
32
|
+
// model-level metric (completeness / coverage tooling), not a native constraint.
|
|
33
|
+
// Do not reintroduce a `predicate="coverageCheck"` part for it.
|
|
34
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package memo_viewpoints_clinical_clinical_evidence_view {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
view def MemoClinicalEvidenceView :> MemoDocumentView {
|
|
8
|
+
attribute :>> viewKind = DocumentViewKind::Clinical;
|
|
9
|
+
attribute :>> generationRule = "Include use contexts, actors, and clinical evidence supporting the device's intended use, filtered to clinical concern.";
|
|
10
|
+
attribute :>> outputKind = (ViewOutputKind::documentSection);
|
|
11
|
+
attribute :>> presentationKind = (PresentationKind::narrativeSection);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
package memo_viewpoints_clinical_clinical_viewpoint {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part clinicalViewpoint : Viewpoint {
|
|
8
|
+
attribute :>> id = "VP-CLIN";
|
|
9
|
+
attribute :>> name = "ClinicalViewpoint";
|
|
10
|
+
attribute :>> title = "Clinical Viewpoint";
|
|
11
|
+
attribute :>> shortDescription = "Shows clinical context, users, use environment, and clinical evidence.";
|
|
12
|
+
attribute :>> longDescription = "Default viewpoint derived from the context and assurance layers for clinical stakeholders — intended use, patient/clinician interaction, clinical evidence, and clinical safety claims.";
|
|
13
|
+
attribute :>> purpose = "Communicate clinical use context and clinical evidence for the device.";
|
|
14
|
+
attribute :>> audience = (AudienceKind::clinicalEngineer, AudienceKind::regulatoryEngineer);
|
|
15
|
+
attribute :>> stage = WorkflowStageKind::context;
|
|
16
|
+
attribute :>> abstractionLevel = "clinical";
|
|
17
|
+
attribute :>> outputKind = (ViewOutputKind::documentSection, ViewOutputKind::table);
|
|
18
|
+
attribute :>> presentationKind = (PresentationKind::narrativeSection);
|
|
19
|
+
attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::clinical);
|
|
20
|
+
attribute :>> includedLayers = ("context", "assurance");
|
|
21
|
+
attribute :>> allowedElementKinds = ("Actor", "UseContext", "Evidence");
|
|
22
|
+
attribute :>> methodologyReference = ("default-layer-viewpoint");
|
|
23
|
+
attribute :>> userExtensible = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
package memo_viewpoints_context_context_viewpoint {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part contextViewpoint : Viewpoint {
|
|
8
|
+
attribute :>> id = "VP-CTX";
|
|
9
|
+
attribute :>> name = "ContextViewpoint";
|
|
10
|
+
attribute :>> title = "System Context Viewpoint";
|
|
11
|
+
attribute :>> shortDescription = "Shows actors, use context, and system boundary.";
|
|
12
|
+
attribute :>> longDescription = "Default viewpoint derived from the context layer to communicate who interacts with the device, under which use conditions, and where trust or safety boundaries exist.";
|
|
13
|
+
attribute :>> purpose = "Communicate operational context and boundaries.";
|
|
14
|
+
attribute :>> audience = (AudienceKind::systemArchitect);
|
|
15
|
+
attribute :>> stage = WorkflowStageKind::context;
|
|
16
|
+
attribute :>> abstractionLevel = "system";
|
|
17
|
+
attribute :>> outputKind = (ViewOutputKind::diagram);
|
|
18
|
+
attribute :>> presentationKind = (PresentationKind::blockDiagram);
|
|
19
|
+
attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::interoperability);
|
|
20
|
+
attribute :>> includedLayers = ("context");
|
|
21
|
+
attribute :>> allowedElementKinds = ("Actor", "UseContext", "IntendedUse", "OperationalEntity", "TrustBoundary", "LogicalComponent");
|
|
22
|
+
attribute :>> methodologyReference = ("default-layer-viewpoint");
|
|
23
|
+
attribute :>> userExtensible = true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package memo_viewpoints_context_system_context_view {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
private import memo_viewpoints_context_context_viewpoint::*;
|
|
7
|
+
|
|
8
|
+
view systemContextView : MemoDiagramView {
|
|
9
|
+
expose memo_viewpoints_context_system_context_view::*;
|
|
10
|
+
attribute depth = 2;
|
|
11
|
+
attribute :>> id = "VIEW-CTX-001";
|
|
12
|
+
attribute :>> name = "SystemContextView";
|
|
13
|
+
attribute :>> title = "System Context View";
|
|
14
|
+
attribute :>> shortDescription = "Actors, use context, and system boundary.";
|
|
15
|
+
attribute :>> outputKind = (ViewOutputKind::diagram);
|
|
16
|
+
attribute :>> presentationKind = (PresentationKind::blockDiagram);
|
|
17
|
+
attribute :>> diagramType = "bdd";
|
|
18
|
+
attribute :>> autoPopulate = true;
|
|
19
|
+
attribute :>> queryDescription = "Include actors, use contexts, and trust boundaries at the system boundary.";
|
|
20
|
+
part :>> selectionQuery {
|
|
21
|
+
attribute :>> id = "QRY-CTX-001";
|
|
22
|
+
attribute :>> name = "SystemContextQuery";
|
|
23
|
+
attribute :>> includeElementKinds = ("Actor", "UseContext", "TrustBoundary");
|
|
24
|
+
attribute :>> includeLayers = ("context");
|
|
25
|
+
attribute :>> rationaleText = "Auto-populate the system context view from the context layer.";
|
|
26
|
+
}
|
|
27
|
+
part :>> viewpointDefinition = contextViewpoint;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package memo_viewpoints_cybersecurity_cybersecurity_assessment_view {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
view def MemoCybersecurityAssessmentView :> MemoDocumentView {
|
|
8
|
+
attribute :>> viewKind = DocumentViewKind::CybersecurityAssessment;
|
|
9
|
+
attribute :>> generationRule = "Include cyber risks, exploitability, mitigations, security requirements, verification, residual risk, and postmarket evidence references.";
|
|
10
|
+
attribute :>> outputKind = (ViewOutputKind::documentSection);
|
|
11
|
+
attribute :>> presentationKind = (PresentationKind::riskTable);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package memo_viewpoints_cybersecurity_cybersecurity_viewpoint {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
part cybersecurityViewpoint : Viewpoint {
|
|
8
|
+
attribute :>> id = "VP-CYB";
|
|
9
|
+
attribute :>> name = "CybersecurityViewpoint";
|
|
10
|
+
attribute :>> title = "Cybersecurity Viewpoint";
|
|
11
|
+
attribute :>> shortDescription = "Shows assets, trust boundaries, threats, vulnerabilities, cyber hazards, cyber risks, and mitigations.";
|
|
12
|
+
attribute :>> longDescription = "Default viewpoint derived from the cybersecurity layer, using STRIDE-style threat categories by default while allowing safety and privacy impacts to be traced into the broader model.";
|
|
13
|
+
attribute :>> purpose = "Communicate cybersecurity design, threat analysis, and cyber risk posture.";
|
|
14
|
+
attribute :>> audience = (AudienceKind::securityEngineer);
|
|
15
|
+
attribute :>> stage = WorkflowStageKind::risk;
|
|
16
|
+
attribute :>> abstractionLevel = "analysis";
|
|
17
|
+
attribute :>> outputKind = (ViewOutputKind::diagram);
|
|
18
|
+
attribute :>> presentationKind = (PresentationKind::custom);
|
|
19
|
+
attribute :>> concernKinds = (ConcernKind::cybersecurity, ConcernKind::privacy, ConcernKind::safety);
|
|
20
|
+
attribute :>> includedLayers = ("cybersecurity", "software_structure", "hardware_structure", "interfaces", "risk", "assurance");
|
|
21
|
+
attribute :>> allowedElementKinds = ("CybersecurityAsset", "Threat", "Vulnerability", "CyberHazard", "CyberRisk", "CyberMitigation", "SecurityRequirement", "TrustBoundary", "ThreatScenario");
|
|
22
|
+
attribute :>> allowedRelationshipKinds = ("ThreatenedBy", "Exploits", "RealizedByScenario", "MitigatesVulnerability", "DerivesCyberRequirement", "ImpactsSafety", "CrossesTrustBoundary");
|
|
23
|
+
attribute :>> methodologyReference = ("stride-default", "fda-cybersecurity-default");
|
|
24
|
+
attribute :>> documentUsage = ("Secure Product Development", "Threat Model", "Cybersecurity Risk Assessment", "QMSR");
|
|
25
|
+
attribute :>> userExtensible = true;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package memo_viewpoints_cybersecurity_threat_model_view {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
|
|
7
|
+
view def MemoCybersecurityThreatModelView :> MemoDocumentView {
|
|
8
|
+
attribute :>> viewKind = DocumentViewKind::ThreatModel;
|
|
9
|
+
attribute :>> generationRule = "Include assets, trust boundaries, threat scenarios, vulnerabilities, mitigations, and trace links to safety/privacy concerns.";
|
|
10
|
+
attribute :>> outputKind = (ViewOutputKind::documentSection);
|
|
11
|
+
attribute :>> presentationKind = (PresentationKind::narrativeSection);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
package memo_viewpoints_definitions {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_core_common::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
private import memo_core_relationships::*;
|
|
7
|
+
|
|
8
|
+
part def Viewpoint specializes DocumentedElement {
|
|
9
|
+
attribute purpose : String;
|
|
10
|
+
attribute audience : AudienceKind[*];
|
|
11
|
+
attribute stage : WorkflowStageKind;
|
|
12
|
+
attribute abstractionLevel : String;
|
|
13
|
+
attribute outputKind : ViewOutputKind[*];
|
|
14
|
+
attribute presentationKind : PresentationKind[*];
|
|
15
|
+
attribute concernKinds : ConcernKind[*];
|
|
16
|
+
attribute includedLayers : String[*];
|
|
17
|
+
attribute allowedElementKinds : String[*];
|
|
18
|
+
attribute allowedRelationshipKinds : String[*];
|
|
19
|
+
attribute filterExpression : String;
|
|
20
|
+
attribute methodologyReference : String[*];
|
|
21
|
+
attribute extendsViewpointIds : String[*];
|
|
22
|
+
attribute userExtensible : Boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
part def ViewRule specializes TraceableElement {
|
|
26
|
+
attribute elementTypeName : String;
|
|
27
|
+
attribute relationTypeName : String;
|
|
28
|
+
attribute strength : RuleStrengthKind;
|
|
29
|
+
attribute rationaleText : String;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
part def ViewSelectionQuery specializes TraceableElement {
|
|
33
|
+
attribute includeElementKinds : String[*];
|
|
34
|
+
attribute includeRelationshipKinds : String[*];
|
|
35
|
+
attribute includeLayers : String[*];
|
|
36
|
+
attribute includeConcerns : ConcernKind[*];
|
|
37
|
+
attribute includeStatusTags : String[*];
|
|
38
|
+
attribute selectionExpression : String;
|
|
39
|
+
attribute rationaleText : String;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
view def MemoView :> Views::View, DocumentedElement {
|
|
43
|
+
attribute outputKind : ViewOutputKind[*];
|
|
44
|
+
attribute presentationKind : PresentationKind[*];
|
|
45
|
+
attribute filterExpression : String;
|
|
46
|
+
attribute queryDescription : String;
|
|
47
|
+
attribute dataSourceDescription : String;
|
|
48
|
+
attribute autoPopulate : Boolean;
|
|
49
|
+
part viewpointDefinition : Viewpoint;
|
|
50
|
+
ref subjectElement : TraceableElement[*];
|
|
51
|
+
ref exposesElement : TraceableElement[*];
|
|
52
|
+
ref exposesRelationship : SemanticLink[*];
|
|
53
|
+
part selectionQuery : ViewSelectionQuery[*];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
view def MemoDiagramView :> MemoView {
|
|
57
|
+
attribute viewKind : DiagramViewKind;
|
|
58
|
+
attribute diagramType : String;
|
|
59
|
+
attribute layoutHint : String;
|
|
60
|
+
attribute styleHint : String;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
view def MemoDocumentBackedView :> MemoView {
|
|
64
|
+
attribute version : String;
|
|
65
|
+
attribute lifecycleState : LifecycleStateKind;
|
|
66
|
+
attribute generationRule : String;
|
|
67
|
+
attribute marketScope : String;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
view def MemoDocumentView :> MemoDocumentBackedView {
|
|
71
|
+
attribute viewKind : DocumentViewKind;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
part def ViewInclusionRule specializes TraceableElement {
|
|
75
|
+
attribute includeElementKinds : String[*];
|
|
76
|
+
attribute includeRelationshipKinds : String[*];
|
|
77
|
+
attribute includeLayers : String[*];
|
|
78
|
+
attribute includeConcerns : ConcernKind[*];
|
|
79
|
+
attribute selectionExpression : String;
|
|
80
|
+
attribute rationaleText : String;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package memo_viewpoints_functional_function_allocation_view {
|
|
2
|
+
private import ScalarValues::*;
|
|
3
|
+
|
|
4
|
+
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_core_enumerations::*;
|
|
6
|
+
private import memo_viewpoints_functional_functional_viewpoint::*;
|
|
7
|
+
|
|
8
|
+
view functionAllocationView : MemoDiagramView {
|
|
9
|
+
expose memo_viewpoints_functional_function_allocation_view::*;
|
|
10
|
+
attribute depth = 2;
|
|
11
|
+
attribute :>> id = "VIEW-FUNC-002";
|
|
12
|
+
attribute :>> name = "FunctionAllocationView";
|
|
13
|
+
attribute :>> title = "Function Allocation View";
|
|
14
|
+
attribute :>> shortDescription = "Functions allocated to logical components.";
|
|
15
|
+
attribute :>> outputKind = (ViewOutputKind::diagram);
|
|
16
|
+
attribute :>> presentationKind = (PresentationKind::blockDiagram);
|
|
17
|
+
attribute :>> diagramType = "bdd";
|
|
18
|
+
attribute :>> autoPopulate = true;
|
|
19
|
+
attribute :>> queryDescription = "Include functions and the logical components they are allocated to.";
|
|
20
|
+
part :>> selectionQuery {
|
|
21
|
+
attribute :>> id = "QRY-FUNC-002";
|
|
22
|
+
attribute :>> name = "FunctionAllocationQuery";
|
|
23
|
+
attribute :>> includeElementKinds = ("LogicalFunction", "LogicalComponent");
|
|
24
|
+
attribute :>> includeLayers = ("functions", "logical_structure");
|
|
25
|
+
attribute :>> rationaleText = "Auto-populate function-to-component allocation from the functions and logical structure layers.";
|
|
26
|
+
}
|
|
27
|
+
part :>> viewpointDefinition = functionalViewpoint;
|
|
28
|
+
}
|
|
29
|
+
}
|