@memoarchitect/ontology 0.10.9 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/examples/gpca-pump/memo.identity.yaml +12 -6
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +7 -4
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +100 -100
- package/examples/nested-architecture-dsm/memo.identity.yaml +181 -0
- package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +34 -0
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +5 -2
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +7 -7
- package/examples/nested-architecture-dsm/model/catalog/project.sysml +1 -0
- package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +3 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +3 -3
- package/examples/ui-screen-regions/memo.identity.yaml +205 -0
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
- package/extensions/aadl/memo.package.yaml +1 -1
- 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/ros/memo.package.yaml +1 -1
- package/methodologies/default/memo.package.yaml +1 -1
- package/methodologies/gpca/memo.package.yaml +1 -1
- package/ontology/memo.package.yaml +1 -1
- package/package.json +1 -1
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +1 -2
- package/src/artifacts/templates/dhf/iec-60601/hrs.md +6 -6
- package/src/artifacts/templates/dhf/iec-62304/srs.md +10 -10
- package/src/artifacts/templates/dhf/system/syrs.md +6 -6
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +5 -1
- package/src/assurance/human_factors/memo_human_factors.sysml +0 -1
- package/src/assurance/requirements/memo_requirements.sysml +20 -16
- package/src/assurance/requirements/needs/memo_needs.sysml +33 -5
- package/src/assurance/safety_risk/memo_risk.sysml +39 -16
- package/src/assurance/verification_validation/memo_assurance.sysml +18 -0
- package/src/rules/closure/closure_rules.sysml +36 -2
- package/src/rules/crosslayer/cross_layer_rules.sysml +1 -1
- package/src/rules/ontology/ontology_invariants.sysml +13 -2
|
@@ -21,7 +21,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
21
21
|
// ── The spec side ───────────────────────────────────────────
|
|
22
22
|
requirement reqRateEntry : Requirement {
|
|
23
23
|
@MemoIdentity { :>> providedId = "UIR-REQ-001"; } attribute :>> name = "RateEntryConfirmation";
|
|
24
|
-
attribute :>>
|
|
24
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
25
25
|
attribute :>> statement = "When the clinician enters a new infusion rate, the pump shall display the entered rate for explicit confirmation before applying it.";
|
|
26
26
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
27
27
|
attribute :>> earsPattern = EarsPatternKind::eventDriven;
|
|
@@ -34,7 +34,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
34
34
|
|
|
35
35
|
requirement reqRateLegibility : Requirement {
|
|
36
36
|
@MemoIdentity { :>> providedId = "UIR-REQ-002"; } attribute :>> name = "RateLegibility";
|
|
37
|
-
attribute :>>
|
|
37
|
+
attribute :>> requirementType = RequirementTypeKind::system;
|
|
38
38
|
attribute :>> statement = "The pump shall display the active infusion rate legibly at 1 m under 100–1000 lux ambient illumination.";
|
|
39
39
|
attribute :>> notation = RequirementNotationKind::sophist;
|
|
40
40
|
attribute :>> obligation = ObligationKind::shall;
|
|
@@ -48,7 +48,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
48
48
|
|
|
49
49
|
requirement reqVolumeDisplay : Requirement {
|
|
50
50
|
@MemoIdentity { :>> providedId = "UIR-REQ-003"; } attribute :>> name = "VolumeDeliveredDisplay";
|
|
51
|
-
attribute :>>
|
|
51
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
52
52
|
attribute :>> statement = "The pump shall display cumulative volume delivered for the active infusion, updated at least once per second.";
|
|
53
53
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
54
54
|
attribute :>> earsPattern = EarsPatternKind::stateDriven;
|
|
@@ -60,7 +60,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
60
60
|
|
|
61
61
|
requirement reqDrugLibrarySelection : Requirement {
|
|
62
62
|
@MemoIdentity { :>> providedId = "UIR-REQ-004"; } attribute :>> name = "DrugLibrarySelection";
|
|
63
|
-
attribute :>>
|
|
63
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
64
64
|
attribute :>> statement = "The pump shall permit selection only from drug and concentration entries enabled for the active care area.";
|
|
65
65
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
66
66
|
attribute :>> earsPattern = EarsPatternKind::stateDriven;
|
|
@@ -73,7 +73,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
73
73
|
|
|
74
74
|
requirement reqDisplayFreshness : Requirement {
|
|
75
75
|
@MemoIdentity { :>> providedId = "UIR-REQ-005"; } attribute :>> name = "InfusionStatusFreshness";
|
|
76
|
-
attribute :>>
|
|
76
|
+
attribute :>> requirementType = RequirementTypeKind::system;
|
|
77
77
|
attribute :>> statement = "The pump shall refresh the displayed active rate and cumulative delivered volume at least once per second while an infusion is running.";
|
|
78
78
|
attribute :>> notation = RequirementNotationKind::sophist;
|
|
79
79
|
attribute :>> obligation = ObligationKind::shall;
|
|
@@ -87,7 +87,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
87
87
|
|
|
88
88
|
requirement reqActiveRateDisplay : Requirement {
|
|
89
89
|
@MemoIdentity { :>> providedId = "UIR-REQ-006"; } attribute :>> name = "ActiveInfusionRateDisplay";
|
|
90
|
-
attribute :>>
|
|
90
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
91
91
|
attribute :>> statement = "While an infusion is running, the pump shall display the active infusion rate value and its mL/h unit.";
|
|
92
92
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
93
93
|
attribute :>> earsPattern = EarsPatternKind::stateDriven;
|
|
@@ -100,7 +100,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
100
100
|
|
|
101
101
|
requirement reqDrugIdentityDisplay : Requirement {
|
|
102
102
|
@MemoIdentity { :>> providedId = "UIR-REQ-007"; } attribute :>> name = "ActiveDrugIdentityDisplay";
|
|
103
|
-
attribute :>>
|
|
103
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
104
104
|
attribute :>> statement = "Where a drug-library entry is active, the pump shall display the selected drug name and concentration on the running-infusion screen.";
|
|
105
105
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
106
106
|
attribute :>> earsPattern = EarsPatternKind::optionalFeature;
|
|
@@ -113,7 +113,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
113
113
|
|
|
114
114
|
requirement reqTimeDisplay : Requirement {
|
|
115
115
|
@MemoIdentity { :>> providedId = "UIR-REQ-008"; } attribute :>> name = "LocalTimeDisplay";
|
|
116
|
-
attribute :>>
|
|
116
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
117
117
|
attribute :>> statement = "While the running-infusion screen is visible, the pump shall display synchronized local time in 24-hour HH:mm format.";
|
|
118
118
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
119
119
|
attribute :>> earsPattern = EarsPatternKind::stateDriven;
|
|
@@ -125,7 +125,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
125
125
|
|
|
126
126
|
requirement reqTimeAccuracy : Requirement {
|
|
127
127
|
@MemoIdentity { :>> providedId = "UIR-REQ-009"; } attribute :>> name = "DisplayedTimeAccuracy";
|
|
128
|
-
attribute :>>
|
|
128
|
+
attribute :>> requirementType = RequirementTypeKind::system;
|
|
129
129
|
attribute :>> statement = "The running-infusion display shall present local time within 2 seconds of the synchronized device clock and refresh the visible minute within 1 second of rollover.";
|
|
130
130
|
attribute :>> notation = RequirementNotationKind::sophist;
|
|
131
131
|
attribute :>> obligation = ObligationKind::shall;
|
|
@@ -139,7 +139,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
139
139
|
|
|
140
140
|
requirement reqBatteryStatusDisplay : Requirement {
|
|
141
141
|
@MemoIdentity { :>> providedId = "UIR-REQ-010"; } attribute :>> name = "BatteryStatusDisplay";
|
|
142
|
-
attribute :>>
|
|
142
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
143
143
|
attribute :>> statement = "While the pump is operating, the pump shall display battery state of charge as a percentage and graphical icon.";
|
|
144
144
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
145
145
|
attribute :>> earsPattern = EarsPatternKind::stateDriven;
|
|
@@ -152,7 +152,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
152
152
|
|
|
153
153
|
requirement reqBatteryWarningPerformance : Requirement {
|
|
154
154
|
@MemoIdentity { :>> providedId = "UIR-REQ-011"; } attribute :>> name = "LowBatteryStatusLatency";
|
|
155
|
-
attribute :>>
|
|
155
|
+
attribute :>> requirementType = RequirementTypeKind::system;
|
|
156
156
|
attribute :>> statement = "When estimated battery operating time falls below 30 minutes, the pump shall present a visually prominent low-battery state within 1 second.";
|
|
157
157
|
attribute :>> notation = RequirementNotationKind::sophist;
|
|
158
158
|
attribute :>> obligation = ObligationKind::shall;
|
|
@@ -166,7 +166,7 @@ package memo_examples_ui_screen_regions_assurance_requirements {
|
|
|
166
166
|
|
|
167
167
|
requirement reqDrugSelectionPerformance : Requirement {
|
|
168
168
|
@MemoIdentity { :>> providedId = "UIR-REQ-012"; } attribute :>> name = "DrugSelectorResponseTime";
|
|
169
|
-
attribute :>>
|
|
169
|
+
attribute :>> requirementType = RequirementTypeKind::software;
|
|
170
170
|
attribute :>> statement = "When the clinician activates the drug selector, the pump shall display the enabled drug list within 250 milliseconds.";
|
|
171
171
|
attribute :>> notation = RequirementNotationKind::ears;
|
|
172
172
|
attribute :>> earsPattern = EarsPatternKind::eventDriven;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/extension-aadl'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: AADL (SAE AS5506) correspondence profile and runtime component families
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/extension-cloud'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: Networked services and managed data stores
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/extension-container'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: OCI container images and container runtimes as deployment content
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/extension-messaging'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: Publish/subscribe messaging — topics, brokers, and delivery semantics
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/extension-ros'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: ROS 2 nodes, messages, topic/service/action interfaces, QoS, and containerized deployment
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/methodology-default'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: "MEMO default medical-device methodology \u2014 selects viewpoints/views/DHF documents from @memoarchitect/ontology and adds rules, gates, patterns, profiles, and workflow."
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/methodology-gpca'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: "GPCA infusion pump methodology \u2014 subtraction-based tailoring of @memoarchitect/methodology-default for the non-networked prototype variant. Excludes cybersecurity and SOUP."
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/ontology'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: "MEMO \u2014 the single canonical medical-device ontology: core semantics, the Arcadia-inspired architecture layers (context, requirements, behavior, structure, interfaces, risk, cybersecurity,\
|
|
12
12
|
\ assurance, \u2026), compliance, viewpoints, views, and invariant rules. One namespace (memo::), one src/ tree."
|
|
13
13
|
license: MIT
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memoarchitect/ontology",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"packageManager": "pnpm@9.15.0",
|
|
5
5
|
"description": "MEMO — Medical Engineering Modelling Ontology. Pure SysML v2 medical-device ontology with native constraints, portable to any conformant SysML v2 tool (SysIDE, SysON, sysand).",
|
|
6
6
|
"scripts": {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
# (`type`, `extends`, `usage`, `ontologies`, `methodology`, `modules`) were
|
|
8
8
|
# removed at the native semantic flip and are now rejected if present.
|
|
9
9
|
name: '@memoarchitect/medical-modeling-profile'
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.11.2
|
|
11
11
|
description: Closure rules and viewpoints for medical device modeling
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -42,13 +42,12 @@ package memo_architecture_operational_scenarios {
|
|
|
42
42
|
attribute assumptionSummary : String;
|
|
43
43
|
attribute guaranteeSummary : String;
|
|
44
44
|
attribute securityObjective : String;
|
|
45
|
-
|
|
45
|
+
ref abuseCase : OperativeScenario[0..1];
|
|
46
46
|
attribute defaultCategory : ThreatCategoryKind[0..1];
|
|
47
47
|
// verification scenario
|
|
48
48
|
attribute verificationEnvironment : String;
|
|
49
49
|
attribute stimulusSummary : String;
|
|
50
50
|
// hazard-related use scenario (IEC 62366-1 3.9)
|
|
51
|
-
attribute hazardReference : String;
|
|
52
51
|
attribute selectionRationale : String;
|
|
53
52
|
}
|
|
54
53
|
|
|
@@ -16,7 +16,7 @@ required_for: ["CE", "FDA_510k", "MDR"]
|
|
|
16
16
|
|
|
17
17
|
This Hardware Requirements Specification (HRS) defines the safety, construction, and performance requirements for the **{{project.product}}** physical equipment, ensuring compliance with IEC 60601-1 (general safety) and applicable collateral standards (IEC 60601-1-2 for electromagnetic compatibility).
|
|
18
18
|
|
|
19
|
-
Hardware requirements are identified by the model's `
|
|
19
|
+
Hardware requirements are identified by the model's `requirementType` attribute. Per-topic sections — construction, electrical, EMC, mechanical — are **not** name filters: each is the set of elements claiming the clause that governs that topic, selected by traversing `ConformsTo` to that clause. A clause is named by its element id rather than by its number, because a clause number is not unique across standards: "8" is a clause of IEC 60601-1, of IEC 60601-1-2 and of IEC 62304.
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -26,7 +26,7 @@ Summary metrics for the hardware requirements captured in the model:
|
|
|
26
26
|
|
|
27
27
|
```memo-query
|
|
28
28
|
kind: Requirement
|
|
29
|
-
where:
|
|
29
|
+
where: requirementType == "RequirementTypeKind::hardware"
|
|
30
30
|
display: count
|
|
31
31
|
label: Total hardware requirements
|
|
32
32
|
```
|
|
@@ -35,11 +35,11 @@ label: Total hardware requirements
|
|
|
35
35
|
|
|
36
36
|
```memo-query
|
|
37
37
|
kind: Requirement
|
|
38
|
-
where:
|
|
38
|
+
where: requirementType == "RequirementTypeKind::hardware"
|
|
39
39
|
display: table
|
|
40
|
-
columns: name,
|
|
40
|
+
columns: name, requirementType, electricalSafetyRelevant, doc
|
|
41
41
|
sort: name
|
|
42
|
-
empty: "No hardware requirements defined. Add Requirement elements with
|
|
42
|
+
empty: "No hardware requirements defined. Add Requirement elements with requirementType = hardware."
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
---
|
|
@@ -142,7 +142,7 @@ Hardware requirements traced to the elements that satisfy them:
|
|
|
142
142
|
|
|
143
143
|
```memo-query
|
|
144
144
|
kind: Requirement
|
|
145
|
-
where:
|
|
145
|
+
where: requirementType == "RequirementTypeKind::hardware"
|
|
146
146
|
traverse: outgoing satisfiedBy
|
|
147
147
|
display: table
|
|
148
148
|
columns: name, kind, layer, doc
|
|
@@ -16,7 +16,7 @@ required_for: ["CE", "FDA_510k", "MDR"]
|
|
|
16
16
|
|
|
17
17
|
This Software Requirements Specification (SRS) defines the software requirements for **{{project.product}}** in accordance with IEC 62304:2006+AMD1:2015 §5.2.
|
|
18
18
|
|
|
19
|
-
Software, hardware and system requirements are distinguished by the model's own `
|
|
19
|
+
Software, hardware and system requirements are distinguished by the model's own `requirementType` attribute, never by which layer directory a file sits in and never by what a requirement is called. There is no "software layer": hardware and software are sibling directories inside `implementation`.
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -26,14 +26,14 @@ Summary metrics for the requirements captured in the model:
|
|
|
26
26
|
|
|
27
27
|
```memo-query
|
|
28
28
|
kind: Requirement
|
|
29
|
-
where:
|
|
29
|
+
where: requirementType == "RequirementTypeKind::software"
|
|
30
30
|
display: count
|
|
31
31
|
label: Total software requirements
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
```memo-query
|
|
35
35
|
kind: Requirement
|
|
36
|
-
where:
|
|
36
|
+
where: requirementType == "RequirementTypeKind::system"
|
|
37
37
|
display: count
|
|
38
38
|
label: System requirements
|
|
39
39
|
```
|
|
@@ -48,7 +48,7 @@ Requirements carrying a `shall` obligation — the binding ones:
|
|
|
48
48
|
kind: Requirement
|
|
49
49
|
where: obligation == "ObligationKind::shall"
|
|
50
50
|
display: table
|
|
51
|
-
columns: name,
|
|
51
|
+
columns: name, requirementType, safetyClass, doc
|
|
52
52
|
sort: name
|
|
53
53
|
empty: "No requirements carry a `shall` obligation. Set `obligation` on Requirement elements."
|
|
54
54
|
```
|
|
@@ -57,11 +57,11 @@ empty: "No requirements carry a `shall` obligation. Set `obligation` on Requirem
|
|
|
57
57
|
|
|
58
58
|
```memo-query
|
|
59
59
|
kind: Requirement
|
|
60
|
-
where:
|
|
60
|
+
where: requirementType == "RequirementTypeKind::software"
|
|
61
61
|
display: table
|
|
62
|
-
columns: name,
|
|
62
|
+
columns: name, requirementType, safetyClass, doc
|
|
63
63
|
sort: name
|
|
64
|
-
empty: "No software requirements defined. Add Requirement elements with
|
|
64
|
+
empty: "No software requirements defined. Add Requirement elements with requirementType = software."
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
---
|
|
@@ -97,9 +97,9 @@ System requirements allocated to software per IEC 62304 §5.2, drawn from the mo
|
|
|
97
97
|
|
|
98
98
|
```memo-query
|
|
99
99
|
kind: Requirement
|
|
100
|
-
where:
|
|
100
|
+
where: requirementType == "RequirementTypeKind::system"
|
|
101
101
|
display: table
|
|
102
|
-
columns: name,
|
|
102
|
+
columns: name, requirementType, safetyClass, doc
|
|
103
103
|
sort: name
|
|
104
104
|
empty: "No system requirements defined."
|
|
105
105
|
```
|
|
@@ -155,7 +155,7 @@ empty: "No SOUP identified. Add DependsOnSoup links from software items to the S
|
|
|
155
155
|
|
|
156
156
|
```memo-query
|
|
157
157
|
kind: Requirement
|
|
158
|
-
where:
|
|
158
|
+
where: requirementType == "RequirementTypeKind::software"
|
|
159
159
|
traverse: outgoing verifiedBy
|
|
160
160
|
display: table
|
|
161
161
|
columns: name, kind, layer, doc
|
|
@@ -26,7 +26,7 @@ Summary metrics for the system requirements captured in the model:
|
|
|
26
26
|
|
|
27
27
|
```memo-query
|
|
28
28
|
kind: Requirement
|
|
29
|
-
where:
|
|
29
|
+
where: requirementType == "RequirementTypeKind::system"
|
|
30
30
|
display: count
|
|
31
31
|
label: Total system requirements
|
|
32
32
|
```
|
|
@@ -41,7 +41,7 @@ Binding system requirements — those carrying a `shall` obligation:
|
|
|
41
41
|
kind: Requirement
|
|
42
42
|
where: obligation == "ObligationKind::shall"
|
|
43
43
|
display: table
|
|
44
|
-
columns: name,
|
|
44
|
+
columns: name, requirementType, doc
|
|
45
45
|
sort: name
|
|
46
46
|
empty: "No requirements carry a `shall` obligation. Set `obligation` on Requirement elements."
|
|
47
47
|
```
|
|
@@ -50,11 +50,11 @@ empty: "No requirements carry a `shall` obligation. Set `obligation` on Requirem
|
|
|
50
50
|
|
|
51
51
|
```memo-query
|
|
52
52
|
kind: Requirement
|
|
53
|
-
where:
|
|
53
|
+
where: requirementType == "RequirementTypeKind::system"
|
|
54
54
|
display: table
|
|
55
|
-
columns: name,
|
|
55
|
+
columns: name, requirementType, safetyClass, doc
|
|
56
56
|
sort: name
|
|
57
|
-
empty: "No system requirements defined. Add Requirement elements with
|
|
57
|
+
empty: "No system requirements defined. Add Requirement elements with requirementType = system."
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
---
|
|
@@ -67,7 +67,7 @@ How system requirements are allocated down to hardware and software.
|
|
|
67
67
|
|
|
68
68
|
```memo-query
|
|
69
69
|
kind: Requirement
|
|
70
|
-
where:
|
|
70
|
+
where: requirementType == "RequirementTypeKind::system"
|
|
71
71
|
traverse: outgoing satisfiedBy
|
|
72
72
|
display: table
|
|
73
73
|
columns: name, kind, layer, doc
|
|
@@ -46,6 +46,11 @@ package memo_assurance_cybersecurity {
|
|
|
46
46
|
attribute affectedLayer : String;
|
|
47
47
|
attribute cweReference : String;
|
|
48
48
|
attribute remediable : Boolean;
|
|
49
|
+
// CVSS v3.1 quantitative rating — the core output of a vulnerability
|
|
50
|
+
// analysis (e.g. RSK-00058). `cvssBaseScore` is the 0.0-10.0 numeric
|
|
51
|
+
// score; `cvssVector` the source vector string (AV:.../AC:.../...).
|
|
52
|
+
attribute cvssBaseScore : Real;
|
|
53
|
+
attribute cvssVector : String;
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
item def CyberHazard specializes Hazard {
|
|
@@ -53,7 +58,6 @@ package memo_assurance_cybersecurity {
|
|
|
53
58
|
attribute safetyImpact : String;
|
|
54
59
|
attribute privacyImpact : String;
|
|
55
60
|
attribute operationalImpact : String;
|
|
56
|
-
attribute linkedSafetyHazardId : String;
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
part def CyberRisk specializes Risk {
|
|
@@ -7,25 +7,32 @@ package memo_assurance_requirements {
|
|
|
7
7
|
private import memo_assurance_requirements_needs::*;
|
|
8
8
|
part def RiskDriver specializes RequirementDriver { attribute driverKind : String; }
|
|
9
9
|
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
10
|
+
// What a requirement is about: the system, the software, the hardware, or
|
|
11
|
+
// the instructions for use. One axis, and the members are its values.
|
|
12
|
+
//
|
|
13
|
+
// It carried a second axis until now. `systemSpecification`,
|
|
14
|
+
// `softwareSpecification`, `hardwareSpecification` and `designControl` are
|
|
15
|
+
// the design-control ROLE — input versus output, 21 CFR 820.30(c)/(d) and
|
|
16
|
+
// ISO 13485 §7.3.3/§7.3.4 — multiplied into the subject. A requirement then
|
|
17
|
+
// could not say "software" without also committing to a role, the grid was
|
|
18
|
+
// incomplete by construction (there is no `ifuSpecification`, and there
|
|
19
|
+
// would have to be one for every future pairing), and nothing ever used the
|
|
20
|
+
// four: 250 requirements across the examples say system, software or
|
|
21
|
+
// hardware. A role, if a project needs one, is its own attribute.
|
|
22
|
+
//
|
|
23
|
+
// The instructions for use are neither hardware nor software: the device
|
|
24
|
+
// satisfies such a requirement with words rather than with a part or a
|
|
25
|
+
// module, and it is verified by reviewing the IFU rather than by testing a
|
|
26
|
+
// build (EU MDR Annex I §23.4, ISO 20417, IEC 62366-1 §7.2).
|
|
27
|
+
enum def RequirementTypeKind {
|
|
18
28
|
enum system;
|
|
19
29
|
enum software;
|
|
20
30
|
enum hardware;
|
|
21
|
-
enum
|
|
22
|
-
enum softwareSpecification;
|
|
23
|
-
enum hardwareSpecification;
|
|
24
|
-
enum designControl;
|
|
31
|
+
enum ifu;
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
requirement def Requirement specializes MemoRequirement {
|
|
28
|
-
attribute
|
|
35
|
+
attribute requirementType : RequirementTypeKind;
|
|
29
36
|
attribute :>> statement : String;
|
|
30
37
|
attribute sourceKind : RequirementSourceKind;
|
|
31
38
|
attribute concernKind : ConcernKind;
|
|
@@ -53,9 +60,6 @@ package memo_assurance_requirements {
|
|
|
53
60
|
// design-control specification (ISO 13485 design output)
|
|
54
61
|
attribute specificationDomain : String;
|
|
55
62
|
attribute sourceFolder : String;
|
|
56
|
-
attribute linkedUserNeeds : String;
|
|
57
|
-
attribute linkedRisks : String;
|
|
58
|
-
attribute linkedTests : String;
|
|
59
63
|
}
|
|
60
64
|
// Named constant defined by a source requirements document (e.g. CriSys
|
|
61
65
|
// GPCA App. A.4) and referenced from requirement statements.
|
|
@@ -6,8 +6,15 @@
|
|
|
6
6
|
package memo_assurance_requirements_needs {
|
|
7
7
|
private import ScalarValues::*;
|
|
8
8
|
|
|
9
|
+
private import Metaobjects::SemanticMetadata;
|
|
10
|
+
|
|
9
11
|
private import memo_core_common::*;
|
|
10
12
|
private import memo_core_enumerations::*;
|
|
13
|
+
private import memo_core_relationships::*;
|
|
14
|
+
// A need is held by someone and arises in a context, and both are modelled
|
|
15
|
+
// elements. Assurance may depend on architecture; the reverse may not.
|
|
16
|
+
private import memo_architecture_operational_context_actors::*;
|
|
17
|
+
private import memo_architecture_operational_context_use_context::*;
|
|
11
18
|
|
|
12
19
|
// The kind of need. Was a subclass branch (StakeholderNeed / UserNeed /
|
|
13
20
|
// ClinicalUserNeed / PatientUserNeed / BusinessNeed / ServiceNeed /
|
|
@@ -29,15 +36,36 @@ package memo_assurance_requirements_needs {
|
|
|
29
36
|
|
|
30
37
|
requirement def Need specializes MemoNeed {
|
|
31
38
|
attribute needKind : NeedKind;
|
|
32
|
-
// user need (IEC 62366-1)
|
|
33
|
-
|
|
39
|
+
// A user need (IEC 62366-1) says WHOSE need it is with HeldBy, and the
|
|
40
|
+
// user's characteristics live on the User: `userPopulation`,
|
|
41
|
+
// `impairmentConsiderations`, `intendedTraining`, `intendedQualification`.
|
|
42
|
+
// A `userPopulationReference` string stood here and held prose — "ward
|
|
43
|
+
// nurses, including those wearing corrective lenses" — which is two
|
|
44
|
+
// typed attributes of a user profile written as one sentence nothing
|
|
45
|
+
// could read, on the wrong element.
|
|
34
46
|
// regulatory need
|
|
35
47
|
attribute jurisdiction : String;
|
|
36
48
|
attribute regulationReference : String;
|
|
37
|
-
// operational need
|
|
38
|
-
|
|
49
|
+
// The context an operational need arises in. Typed, because UseContext
|
|
50
|
+
// carries the care setting, environment and jurisdiction that an
|
|
51
|
+
// `operationalContextReference` string could only describe.
|
|
52
|
+
ref useContext : UseContext[0..1];
|
|
39
53
|
// design-control need (ISO 13485 design input)
|
|
40
54
|
attribute sourceFolder : String;
|
|
41
|
-
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Whose need this is. The holder is a modelled participant — a User, with
|
|
58
|
+
// the profile IEC 62366-1 asks for, or another operational participant —
|
|
59
|
+
// so "which users does this need serve" is a question the model answers
|
|
60
|
+
// rather than a sentence a reader interprets.
|
|
61
|
+
connection def HeldBy :> MemoRelationship {
|
|
62
|
+
end need : MemoNeed :>> source;
|
|
63
|
+
end holder : OperationalParticipant :>> target;
|
|
64
|
+
}
|
|
65
|
+
abstract connection heldByLinks : HeldBy[*];
|
|
66
|
+
metadata def <heldBy> HeldByMetadata :> SemanticMetadata {
|
|
67
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
68
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
69
|
+
:>> baseType = heldByLinks meta SysML::Usage;
|
|
42
70
|
}
|
|
43
71
|
}
|
|
@@ -6,6 +6,9 @@ package memo_assurance_safety_risk {
|
|
|
6
6
|
private import memo_core_common::*;
|
|
7
7
|
private import memo_core_enumerations::*;
|
|
8
8
|
private import memo_assurance_requirements::*;
|
|
9
|
+
// For HazardRelatedScenario below. Assurance may depend on architecture;
|
|
10
|
+
// the reverse is what the string on the scenario was avoiding.
|
|
11
|
+
private import memo_architecture_operational_scenarios::*;
|
|
9
12
|
|
|
10
13
|
// ISO 14971 / IEC 62366-1 risk-analysis input. A model element so hazards,
|
|
11
14
|
// scenarios, requirements, and DHF records can trace to the foreseeable
|
|
@@ -36,22 +39,10 @@ package memo_assurance_safety_risk {
|
|
|
36
39
|
attribute riskLevelMapping : String;
|
|
37
40
|
attribute acceptabilityThresholds : String;
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
attribute hazardSubcategory : String;
|
|
44
|
-
attribute causeSequenceOfEventsFailure : String;
|
|
45
|
-
attribute harmText : String;
|
|
46
|
-
attribute probabilityBeforeRaw : String;
|
|
47
|
-
attribute severityBeforeRaw : String;
|
|
48
|
-
attribute riskBeforeMeasureRaw : String;
|
|
49
|
-
attribute probabilityAfterRaw : String;
|
|
50
|
-
attribute severityAfterRaw : String;
|
|
51
|
-
attribute riskAfterMitigationRaw : String;
|
|
52
|
-
attribute cannotReduceFurther : Boolean;
|
|
53
|
-
attribute linkSummary : String;
|
|
54
|
-
}
|
|
42
|
+
// `DesignControlRiskRow` was a denormalized spreadsheet transcription.
|
|
43
|
+
// Risk rows now decompose into the ISO 14971 chain below: Risk owns its
|
|
44
|
+
// Hazard, SequenceOfEvents, HazardousSituation, and Harm items, linked by
|
|
45
|
+
// TracesRisk / LeadsToHarm, with ResidualRisk after mitigation.
|
|
55
46
|
// A device characteristic whose implementation, failure, or misuse can
|
|
56
47
|
// affect safety. This is the modelable output of ISO 14971 §5.3.
|
|
57
48
|
part def SafetyRelatedCharacteristic specializes MemoPart {
|
|
@@ -99,6 +90,8 @@ package memo_assurance_safety_risk {
|
|
|
99
90
|
item def HazardousSituation specializes RiskItem {
|
|
100
91
|
attribute exposedPersons : String;
|
|
101
92
|
attribute operatingCondition : String;
|
|
93
|
+
// ISO 14971 P1: probability that the hazardous situation occurs.
|
|
94
|
+
attribute probabilityOfOccurrence : ProbabilityKind;
|
|
102
95
|
}
|
|
103
96
|
item def Harm specializes RiskItem {
|
|
104
97
|
attribute clinicalImpact : String;
|
|
@@ -135,6 +128,36 @@ package memo_assurance_safety_risk {
|
|
|
135
128
|
:> annotatedElement : SysML::ConnectionUsage;
|
|
136
129
|
:>> baseType = tracesRiskLinks meta SysML::Usage;
|
|
137
130
|
}
|
|
131
|
+
// The final ISO 14971 chain edge. P2 is the conditional probability that
|
|
132
|
+
// the hazardous situation results in the harm.
|
|
133
|
+
connection def LeadsToHarm :> MemoRelationship {
|
|
134
|
+
attribute conditionalProbability : ProbabilityKind;
|
|
135
|
+
end hazardousSituation : HazardousSituation :>> source;
|
|
136
|
+
end resultingHarm : Harm :>> target;
|
|
137
|
+
}
|
|
138
|
+
abstract connection leadsToHarmLinks : LeadsToHarm[*];
|
|
139
|
+
metadata def <leadsToHarm> LeadsToHarmMetadata :> SemanticMetadata {
|
|
140
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
141
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
142
|
+
:>> baseType = leadsToHarmLinks meta SysML::Usage;
|
|
143
|
+
}
|
|
144
|
+
// IEC 62366-1 3.9's hazard-related use scenario: the scenario a hazard can
|
|
145
|
+
// arise in. It is declared HERE rather than as a `hazardReference` string
|
|
146
|
+
// on the scenario, which is what stood in for it: a string names nothing a
|
|
147
|
+
// consumer can follow, and the layering is why it was written that way —
|
|
148
|
+
// assurance may depend on architecture, and the scenario package cannot
|
|
149
|
+
// see `Hazard`. On this side both ends are visible and the dependency runs
|
|
150
|
+
// the direction it already runs.
|
|
151
|
+
connection def HazardRelatedScenario :> MemoRelationship {
|
|
152
|
+
end hazard : RiskItem :>> source;
|
|
153
|
+
end scenario : OperativeScenario :>> target;
|
|
154
|
+
}
|
|
155
|
+
abstract connection hazardRelatedScenarioLinks : HazardRelatedScenario[*];
|
|
156
|
+
metadata def <hazardRelatedScenario> HazardRelatedScenarioMetadata :> SemanticMetadata {
|
|
157
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
158
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
159
|
+
:>> baseType = hazardRelatedScenarioLinks meta SysML::Usage;
|
|
160
|
+
}
|
|
138
161
|
connection def AssessedAgainst :> MemoRelationship {
|
|
139
162
|
end risk : Risk :>> source;
|
|
140
163
|
end riskMatrix : RiskMatrix :>> target;
|
|
@@ -21,10 +21,28 @@ package memo_assurance_verification_validation {
|
|
|
21
21
|
// a second spelling of `status`.
|
|
22
22
|
// Specializes the standard library verification case as well as MEMO's
|
|
23
23
|
// base, rather than shadowing it — see the note on UseCase.
|
|
24
|
+
// Reusable test action, distinct from a case's pass/fail criteria.
|
|
25
|
+
action def TestStep specializes MemoAction {
|
|
26
|
+
attribute stepAction : String;
|
|
27
|
+
attribute expectedResult : String;
|
|
28
|
+
attribute referencedItem : String;
|
|
29
|
+
}
|
|
24
30
|
verification def VerificationCase :> MemoVerificationCase, VerificationCases::VerificationCase {
|
|
25
31
|
attribute methodKind : MemoVerificationMethodKind;
|
|
26
32
|
attribute acceptanceCriteria : String;
|
|
27
33
|
}
|
|
34
|
+
// Orders a reusable TestStep within a verification or validation case.
|
|
35
|
+
connection def PerformsStep :> MemoRelationship {
|
|
36
|
+
attribute sequence : Integer;
|
|
37
|
+
end verificationCase : MemoVerificationCase :>> source;
|
|
38
|
+
end testStep : TestStep :>> target;
|
|
39
|
+
}
|
|
40
|
+
abstract connection performsStepLinks : PerformsStep[*];
|
|
41
|
+
metadata def <performsStep> PerformsStepMetadata :> SemanticMetadata {
|
|
42
|
+
:> annotatedElement : SysML::ConnectionDefinition;
|
|
43
|
+
:> annotatedElement : SysML::ConnectionUsage;
|
|
44
|
+
:>> baseType = performsStepLinks meta SysML::Usage;
|
|
45
|
+
}
|
|
28
46
|
verification def ValidationCase :> MemoVerificationCase {
|
|
29
47
|
attribute validationMethod : ValidationMethodKind;
|
|
30
48
|
attribute userParticipation : String;
|