@memoarchitect/ontology 0.6.2 → 0.6.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/README.md +25 -3
- package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +1 -1
- package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +1 -1
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +1 -1
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +104 -104
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +4 -4
- package/examples/gpca-pump/model/views/document_architecture_description_view.sysml +6 -0
- package/examples/gpca-pump/model/views/document_cyber_assessment_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_dhf_index_view.sysml +6 -0
- package/examples/gpca-pump/model/views/document_hazard_analysis_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_rmf_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_sdd_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_threat_model_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_usability_view.sysml +2 -0
- package/examples/gpca-pump/model/views/document_vv_view.sysml +2 -0
- package/examples/sysml-diagram-samples/model/samples/requirements_view.sysml +2 -2
- package/examples/sysml-diagram-samples/model/samples/use_case_view.sysml +4 -4
- 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 +4 -2
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/implementation/software/structure/memo_software_structure.sysml +3 -3
- package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
- package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +2 -2
- package/src/architecture/operational/context/use_context/memo_use_context.sysml +26 -1
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +1 -1
- package/src/architecture/operational/use_cases/memo_use_cases.sysml +1 -1
- package/src/architecture/operational/workflows/memo_workflows.sysml +2 -2
- package/src/architecture/realization/deployment/memo_deployment.sysml +2 -2
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +0 -1
- package/src/assurance/requirements/memo_requirements.sysml +1 -1
- package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
- package/src/compliance/artifacts/memo_artifacts.sysml +0 -1
- package/src/core/common/memo_common.sysml +3 -1
- package/src/core/enumerations/memo_enumerations.sysml +17 -1
- package/src/core/relationships/memo_relationships.sysml +9 -5
- package/src/memo_namespaces.sysml +2 -2
- package/src/methodology/profiles/memo_profiles.sysml +6 -22
- package/src/viewpoints/context/context_viewpoint.sysml +10 -1
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +7 -1
|
@@ -51,15 +51,15 @@ package memo_examples_gpca_pump_model_catalog_gpca_trace {
|
|
|
51
51
|
connection : ConnectsPhysically connect source ::> entityNeedle to target ::> actorPatient;
|
|
52
52
|
connection : ConnectsPhysically connect source ::> entityPowerInfrastructure to target ::> entityGpcaPump;
|
|
53
53
|
// Intended use and use context anchoring (no floating context nodes)
|
|
54
|
-
connection : Governs { attribute :>> governKind = GovernKind::use; connect governor ::> gpcaIntendedUse to governedElement ::> entityGpcaPump; }
|
|
54
|
+
connection : Governs { attribute :>> governKind = GovernKind::'use'; connect governor ::> gpcaIntendedUse to governedElement ::> entityGpcaPump; }
|
|
55
55
|
connection : AppliesInContext connect useContext ::> hospitalWardContext to subjectElement ::> entityGpcaPump;
|
|
56
56
|
connection : AppliesInContext connect useContext ::> hospitalWardContext to subjectElement ::> entityHospital;
|
|
57
57
|
|
|
58
58
|
// ── Actor participation (use case view) ─────────────────────
|
|
59
59
|
connection : Initiates connect initiatingUser ::> actorNurse to initiatedUseCase ::> ucDeliverPcaTherapy;
|
|
60
|
-
connection : ParticipatesIn connect
|
|
61
|
-
connection : ParticipatesIn connect
|
|
62
|
-
connection : ParticipatesIn connect
|
|
60
|
+
connection : ParticipatesIn connect participatingActor ::> actorPatient to useCase ::> ucDeliverPcaTherapy;
|
|
61
|
+
connection : ParticipatesIn connect participatingActor ::> actorPrescriber to useCase ::> ucDeliverPcaTherapy;
|
|
62
|
+
connection : ParticipatesIn connect participatingActor ::> actorPharmacist to useCase ::> ucDeliverPcaTherapy;
|
|
63
63
|
connection : Performs connect performer ::> actorPrescriber to performed ::> oaPrescribe;
|
|
64
64
|
connection : Performs connect performer ::> actorPharmacist to performed ::> oaLoadReservoir;
|
|
65
65
|
connection : Performs connect performer ::> actorNurse to performed ::> oaProgram;
|
|
@@ -2,6 +2,9 @@ package memo_examples_gpca_pump_model_views_document_architecture_description_vi
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_logical_logical_viewpoint::*;
|
|
6
|
+
private import memo_viewpoints_software_software_viewpoint::*;
|
|
7
|
+
private import memo_viewpoints_physical_physical_viewpoint::*;
|
|
5
8
|
private import memo_core_enumerations::*;
|
|
6
9
|
|
|
7
10
|
view architectureDescriptionView : MemoDocumentView {
|
|
@@ -18,6 +21,9 @@ package memo_examples_gpca_pump_model_views_document_architecture_description_vi
|
|
|
18
21
|
attribute :>> marketScope = "generic";
|
|
19
22
|
attribute :>> documentUsage = ("Architecture Description", "DHF");
|
|
20
23
|
attribute :>> sectionIdentifier = "AD";
|
|
24
|
+
part :>> viewpointDefinition = logicalArchitectureViewpoint;
|
|
25
|
+
part :>> viewpointDefinition = softwareViewpoint;
|
|
26
|
+
part :>> viewpointDefinition = physicalViewpoint;
|
|
21
27
|
part :>> selectionQuery {
|
|
22
28
|
attribute :>> id = "QRY-DOC-005";
|
|
23
29
|
attribute :>> name = "architectureDescriptionViewQuery";
|
|
@@ -3,6 +3,7 @@ package memo_examples_gpca_pump_model_views_document_cyber_assessment_view {
|
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
5
|
private import memo_viewpoints_cybersecurity_cybersecurity_assessment_view::*;
|
|
6
|
+
private import memo_viewpoints_cybersecurity_cybersecurity_viewpoint::*;
|
|
6
7
|
private import memo_core_enumerations::*;
|
|
7
8
|
|
|
8
9
|
view cyberAssessmentView : MemoCybersecurityAssessmentView {
|
|
@@ -17,6 +18,7 @@ package memo_examples_gpca_pump_model_views_document_cyber_assessment_view {
|
|
|
17
18
|
attribute :>> marketScope = "generic";
|
|
18
19
|
attribute :>> documentUsage = ("Cybersecurity Risk Assessment", "RMF", "QMSR");
|
|
19
20
|
attribute :>> sectionIdentifier = "CYB-RA";
|
|
21
|
+
part :>> viewpointDefinition = cybersecurityViewpoint;
|
|
20
22
|
part :>> selectionQuery {
|
|
21
23
|
attribute :>> id = "QRY-DOC-009";
|
|
22
24
|
attribute :>> name = "cyberAssessmentViewQuery";
|
|
@@ -2,6 +2,9 @@ package memo_examples_gpca_pump_model_views_document_dhf_index_view {
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_requirements_requirements_viewpoint::*;
|
|
6
|
+
private import memo_viewpoints_risk_risk_viewpoint::*;
|
|
7
|
+
private import memo_viewpoints_verification_verification_viewpoint::*;
|
|
5
8
|
private import memo_core_enumerations::*;
|
|
6
9
|
|
|
7
10
|
view dhfIndexView : MemoDocumentView {
|
|
@@ -18,6 +21,9 @@ package memo_examples_gpca_pump_model_views_document_dhf_index_view {
|
|
|
18
21
|
attribute :>> marketScope = "generic";
|
|
19
22
|
attribute :>> documentUsage = ("DHF");
|
|
20
23
|
attribute :>> sectionIdentifier = "DHF";
|
|
24
|
+
part :>> viewpointDefinition = requirementsViewpoint;
|
|
25
|
+
part :>> viewpointDefinition = riskViewpoint;
|
|
26
|
+
part :>> viewpointDefinition = verificationViewpoint;
|
|
21
27
|
part :>> selectionQuery {
|
|
22
28
|
attribute :>> id = "QRY-DOC-007";
|
|
23
29
|
attribute :>> name = "dhfIndexViewQuery";
|
|
@@ -2,6 +2,7 @@ package memo_examples_gpca_pump_model_views_document_hazard_analysis_view {
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_risk_risk_viewpoint::*;
|
|
5
6
|
private import memo_core_enumerations::*;
|
|
6
7
|
|
|
7
8
|
view hazardAnalysisView : MemoDocumentView {
|
|
@@ -18,6 +19,7 @@ package memo_examples_gpca_pump_model_views_document_hazard_analysis_view {
|
|
|
18
19
|
attribute :>> marketScope = "generic";
|
|
19
20
|
attribute :>> documentUsage = ("Hazard Analysis Report", "RMF");
|
|
20
21
|
attribute :>> sectionIdentifier = "HAZ";
|
|
22
|
+
part :>> viewpointDefinition = riskViewpoint;
|
|
21
23
|
part :>> selectionQuery {
|
|
22
24
|
attribute :>> id = "QRY-DOC-003";
|
|
23
25
|
attribute :>> name = "hazardAnalysisViewQuery";
|
|
@@ -2,6 +2,7 @@ package memo_examples_gpca_pump_model_views_document_rmf_view {
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_risk_risk_viewpoint::*;
|
|
5
6
|
private import memo_core_enumerations::*;
|
|
6
7
|
|
|
7
8
|
view rmfView : MemoDocumentView {
|
|
@@ -18,6 +19,7 @@ package memo_examples_gpca_pump_model_views_document_rmf_view {
|
|
|
18
19
|
attribute :>> marketScope = "generic";
|
|
19
20
|
attribute :>> documentUsage = ("RMF", "QMSR");
|
|
20
21
|
attribute :>> sectionIdentifier = "RMF";
|
|
22
|
+
part :>> viewpointDefinition = riskViewpoint;
|
|
21
23
|
part :>> selectionQuery {
|
|
22
24
|
attribute :>> id = "QRY-DOC-001";
|
|
23
25
|
attribute :>> name = "rmfViewQuery";
|
|
@@ -2,6 +2,7 @@ package memo_examples_gpca_pump_model_views_document_sdd_view {
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_software_software_viewpoint::*;
|
|
5
6
|
private import memo_core_enumerations::*;
|
|
6
7
|
|
|
7
8
|
view sddView : MemoDocumentView {
|
|
@@ -18,6 +19,7 @@ package memo_examples_gpca_pump_model_views_document_sdd_view {
|
|
|
18
19
|
attribute :>> marketScope = "generic";
|
|
19
20
|
attribute :>> documentUsage = ("SDD", "QMSR");
|
|
20
21
|
attribute :>> sectionIdentifier = "SDD";
|
|
22
|
+
part :>> viewpointDefinition = softwareViewpoint;
|
|
21
23
|
part :>> selectionQuery {
|
|
22
24
|
attribute :>> id = "QRY-DOC-004";
|
|
23
25
|
attribute :>> name = "sddViewQuery";
|
|
@@ -3,6 +3,7 @@ package memo_examples_gpca_pump_model_views_document_threat_model_view {
|
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
5
|
private import memo_viewpoints_cybersecurity_threat_model_view::*;
|
|
6
|
+
private import memo_viewpoints_cybersecurity_cybersecurity_viewpoint::*;
|
|
6
7
|
private import memo_core_enumerations::*;
|
|
7
8
|
|
|
8
9
|
view threatModelView : MemoCybersecurityThreatModelView {
|
|
@@ -17,6 +18,7 @@ package memo_examples_gpca_pump_model_views_document_threat_model_view {
|
|
|
17
18
|
attribute :>> marketScope = "generic";
|
|
18
19
|
attribute :>> documentUsage = ("Threat Model", "QMSR");
|
|
19
20
|
attribute :>> sectionIdentifier = "CYB-TM";
|
|
21
|
+
part :>> viewpointDefinition = cybersecurityViewpoint;
|
|
20
22
|
part :>> selectionQuery {
|
|
21
23
|
attribute :>> id = "QRY-DOC-008";
|
|
22
24
|
attribute :>> name = "threatModelViewQuery";
|
|
@@ -3,6 +3,7 @@ package memo_examples_gpca_pump_model_views_document_usability_view {
|
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
5
|
private import memo_viewpoints_usability_usability_engineering_view::*;
|
|
6
|
+
private import memo_viewpoints_usability_usability_viewpoint::*;
|
|
6
7
|
private import memo_core_enumerations::*;
|
|
7
8
|
|
|
8
9
|
view usabilityView : MemoUsabilityEngineeringView {
|
|
@@ -17,6 +18,7 @@ package memo_examples_gpca_pump_model_views_document_usability_view {
|
|
|
17
18
|
attribute :>> marketScope = "generic";
|
|
18
19
|
attribute :>> documentUsage = ("Usability Engineering File", "DHF");
|
|
19
20
|
attribute :>> sectionIdentifier = "UEF";
|
|
21
|
+
part :>> viewpointDefinition = usabilityViewpoint;
|
|
20
22
|
part :>> selectionQuery {
|
|
21
23
|
attribute :>> id = "QRY-DOC-002";
|
|
22
24
|
attribute :>> name = "usabilityViewQuery";
|
|
@@ -2,6 +2,7 @@ package memo_examples_gpca_pump_model_views_document_vv_view {
|
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
|
|
4
4
|
private import memo_viewpoints_definitions::*;
|
|
5
|
+
private import memo_viewpoints_verification_verification_viewpoint::*;
|
|
5
6
|
private import memo_core_enumerations::*;
|
|
6
7
|
|
|
7
8
|
view vvView : MemoDocumentView {
|
|
@@ -18,6 +19,7 @@ package memo_examples_gpca_pump_model_views_document_vv_view {
|
|
|
18
19
|
attribute :>> marketScope = "generic";
|
|
19
20
|
attribute :>> documentUsage = ("VV", "DHF", "QMSR");
|
|
20
21
|
attribute :>> sectionIdentifier = "VV";
|
|
22
|
+
part :>> viewpointDefinition = verificationViewpoint;
|
|
21
23
|
part :>> selectionQuery {
|
|
22
24
|
attribute :>> id = "QRY-DOC-006";
|
|
23
25
|
attribute :>> name = "vvViewQuery";
|
|
@@ -11,12 +11,12 @@ package memo_examples_sysml_diagram_samples_model_samples_requirements_view {
|
|
|
11
11
|
private import memo_core_enumerations::*;
|
|
12
12
|
|
|
13
13
|
requirement needSafeTherapy : Need {
|
|
14
|
-
attribute :>> needKind = NeedKind::stakeholder;
|
|
14
|
+
attribute :>> needKind = NeedKind::'stakeholder';
|
|
15
15
|
attribute :>> id = "NEED-001"; attribute :>> name = "SafeTherapy";
|
|
16
16
|
attribute :>> statement = "The device shall support safe patient-controlled infusion therapy.";
|
|
17
17
|
}
|
|
18
18
|
requirement needTimelyAlarms : Need {
|
|
19
|
-
attribute :>> needKind = NeedKind::stakeholder;
|
|
19
|
+
attribute :>> needKind = NeedKind::'stakeholder';
|
|
20
20
|
attribute :>> id = "NEED-002"; attribute :>> name = "TimelyAlarms";
|
|
21
21
|
attribute :>> statement = "Clinicians shall be notified promptly of any condition that endangers therapy.";
|
|
22
22
|
}
|
|
@@ -50,10 +50,10 @@ package memo_examples_sysml_diagram_samples_model_samples_use_case_view {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
connection : Initiates connect initiatingUser ::> clinician to initiatedUseCase ::> configureTherapy;
|
|
53
|
-
connection : ParticipatesIn connect
|
|
54
|
-
connection : ParticipatesIn connect
|
|
55
|
-
connection : ParticipatesIn connect
|
|
56
|
-
connection : ParticipatesIn connect
|
|
53
|
+
connection : ParticipatesIn connect participatingActor ::> patient to useCase ::> reviewStatus;
|
|
54
|
+
connection : ParticipatesIn connect participatingActor ::> patient to useCase ::> configureTherapy;
|
|
55
|
+
connection : ParticipatesIn connect participatingActor ::> serviceTechnician to useCase ::> maintainDevice;
|
|
56
|
+
connection : ParticipatesIn connect participatingActor ::> clinician to useCase ::> validateTherapySettings;
|
|
57
57
|
connection : Includes connect includingUseCase ::> configureTherapy to includedUseCase ::> reviewStatus;
|
|
58
58
|
connection : Includes connect includingUseCase ::> reviewStatus to includedUseCase ::> validateTherapySettings;
|
|
59
59
|
connection : Extends connect extendingUseCase ::> documentTreatment to extendedUseCase ::> reviewStatus;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: "@memoarchitect/ontology"
|
|
2
|
-
version: "0.6.
|
|
2
|
+
version: "0.6.4"
|
|
3
3
|
type: ontology
|
|
4
4
|
description: "MEMO — the single canonical medical-device ontology: core semantics, the Arcadia-inspired architecture layers (context, requirements, behavior, structure, interfaces, risk, cybersecurity, assurance, …), compliance, viewpoints, views, and invariant rules. One namespace (memo::), one src/ tree."
|
|
5
5
|
license: "MIT"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memoarchitect/ontology",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"packageManager": "pnpm@9.15.0",
|
|
5
5
|
"description": "MEMO \u2014 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": {
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"docs:diagrams": "node scripts/generate-reference-diagrams.mjs",
|
|
12
12
|
"docs:serve": "node scripts/generate-reference-diagrams.mjs && node scripts/generate-sysml-api.mjs && node scripts/check-reference-coverage.mjs && python3 -m mkdocs serve",
|
|
13
13
|
"docs:build": "node scripts/generate-reference-diagrams.mjs && node scripts/generate-sysml-api.mjs && node scripts/check-reference-coverage.mjs && python3 -m mkdocs build --strict",
|
|
14
|
-
"docs:check-reference": "node scripts/check-reference-coverage.mjs"
|
|
14
|
+
"docs:check-reference": "node scripts/check-reference-coverage.mjs",
|
|
15
|
+
"version:sync": "node scripts/sync-version.mjs",
|
|
16
|
+
"version:check": "node scripts/sync-version.mjs --check"
|
|
15
17
|
},
|
|
16
18
|
"engines": {
|
|
17
19
|
"node": ">=26.0.0"
|
|
@@ -20,10 +20,10 @@ package memo_architecture_implementation_software_structure {
|
|
|
20
20
|
// (period, WCET, scheduling) moved to SoftwareComponent.
|
|
21
21
|
// item / unit / package / library / code / firmware / soup (IEC 62304).
|
|
22
22
|
enum def ModuleKind {
|
|
23
|
-
enum item;
|
|
23
|
+
enum 'item';
|
|
24
24
|
enum unit;
|
|
25
|
-
enum package;
|
|
26
|
-
enum library;
|
|
25
|
+
enum 'package';
|
|
26
|
+
enum 'library';
|
|
27
27
|
enum code;
|
|
28
28
|
enum firmware;
|
|
29
29
|
enum soup;
|
|
@@ -127,7 +127,7 @@ package memo_architecture_implementation_ui {
|
|
|
127
127
|
}
|
|
128
128
|
connection def PresentsState :> MemoRelationship {
|
|
129
129
|
end userInterface : UserInterface;
|
|
130
|
-
end
|
|
130
|
+
end uiState : UIState;
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
// ── §18 traceability ─────────────────────────────────────────
|
|
@@ -40,7 +40,7 @@ package memo_architecture_operational_context_stakeholders {
|
|
|
40
40
|
|
|
41
41
|
connection def HasConcern :> MemoRelationship {
|
|
42
42
|
end interestedStakeholder : Stakeholder;
|
|
43
|
-
end
|
|
43
|
+
end stakeholderConcern : Concern;
|
|
44
44
|
}
|
|
45
45
|
connection def FramesConcern :> MemoRelationship {
|
|
46
46
|
end framingViewpoint : MemoPart;
|
|
@@ -54,7 +54,7 @@ package memo_architecture_operational_context_stakeholders {
|
|
|
54
54
|
// Governs unifies GovernsCorrespondence / GovernsUse, keyed by governKind.
|
|
55
55
|
enum def GovernKind {
|
|
56
56
|
enum correspondence;
|
|
57
|
-
enum use;
|
|
57
|
+
enum 'use';
|
|
58
58
|
}
|
|
59
59
|
connection def Governs :> MemoRelationship {
|
|
60
60
|
attribute governKind : GovernKind;
|
|
@@ -28,9 +28,34 @@ package memo_architecture_operational_context_use_context {
|
|
|
28
28
|
attribute mobility : String;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
// The single relation a system context view draws.
|
|
32
|
+
//
|
|
33
|
+
// A context diagram labels its edges with open-ended verbs — "directs
|
|
34
|
+
// procedure", "electrical power", "fluid supply", "environmental
|
|
35
|
+
// conditions". Enumerating those as relation kinds never terminates, so the
|
|
36
|
+
// ontology fixes the *role* an edge plays and leaves the verb to the
|
|
37
|
+
// project: a project declares `connection def SuppliesFluid :>
|
|
38
|
+
// InteractsInContext` and the view picks it up through the specialization
|
|
39
|
+
// closure, exactly as a FirmwareComponent is recognised as a
|
|
40
|
+
// SoftwareComponent.
|
|
41
|
+
//
|
|
42
|
+
// Keeping it separate from InteractsWith is the point: a context view draws
|
|
43
|
+
// this relation and nothing else, so a model's general-purpose edges cannot
|
|
44
|
+
// leak into the boundary picture.
|
|
45
|
+
connection def InteractsInContext :> MemoRelationship {
|
|
46
|
+
// Which side of the boundary picture the participant belongs on.
|
|
47
|
+
attribute contextSide : ContextSideKind;
|
|
48
|
+
// The verb, as it should read on the edge ("Directs procedure").
|
|
49
|
+
attribute interactionLabel : String[0..1];
|
|
50
|
+
end contextParticipant : MemoPart;
|
|
51
|
+
// Untyped: the system of interest may be a part or an operational activity.
|
|
52
|
+
end systemOfInterest;
|
|
53
|
+
}
|
|
54
|
+
|
|
31
55
|
connection def InteractsWith :> MemoRelationship {
|
|
32
56
|
end contextParticipant : Actor;
|
|
33
|
-
|
|
57
|
+
// Untyped so operational activities (action def) can be targets as well as parts.
|
|
58
|
+
end target;
|
|
34
59
|
}
|
|
35
60
|
// Directional context-level data flow between boundary entities.
|
|
36
61
|
connection def ExchangesWith :> MemoRelationship {
|
|
@@ -98,7 +98,7 @@ package memo_architecture_operational_scenarios {
|
|
|
98
98
|
// element), keyed by selectsKind.
|
|
99
99
|
enum def SelectsKind {
|
|
100
100
|
enum step;
|
|
101
|
-
enum flow;
|
|
101
|
+
enum 'flow';
|
|
102
102
|
}
|
|
103
103
|
connection def Selects :> MemoRelationship {
|
|
104
104
|
attribute selectsKind : SelectsKind;
|
|
@@ -51,7 +51,7 @@ package memo_architecture_operational_use_cases {
|
|
|
51
51
|
end initiatedUseCase : UseCase;
|
|
52
52
|
}
|
|
53
53
|
connection def ParticipatesIn :> MemoRelationship {
|
|
54
|
-
end
|
|
54
|
+
end participatingActor : Actor;
|
|
55
55
|
end useCase : UseCase;
|
|
56
56
|
}
|
|
57
57
|
// UML use-case relationships. Includes establishes a decomposition level;
|
|
@@ -79,12 +79,12 @@ package memo_architecture_realization_deployment {
|
|
|
79
79
|
// segment per traversed component boundary (AADL flow-spec → end-to-end).
|
|
80
80
|
connection def FlowComprisesSpec :> MemoRelationship {
|
|
81
81
|
attribute segmentOrder : Integer;
|
|
82
|
-
end
|
|
82
|
+
end endToEndFlow : EndToEndFlow;
|
|
83
83
|
end spec : FlowSpecification;
|
|
84
84
|
}
|
|
85
85
|
// The flow traverses a software→hardware binding; latency accrues here.
|
|
86
86
|
connection def FlowTraversesBinding :> MemoRelationship {
|
|
87
|
-
end
|
|
87
|
+
end endToEndFlow : EndToEndFlow;
|
|
88
88
|
end deploymentUnit : DeploymentUnit;
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -86,7 +86,6 @@ package memo_assurance_cybersecurity {
|
|
|
86
86
|
attribute derivedFromThreat : String;
|
|
87
87
|
attribute derivedFromRisk : String;
|
|
88
88
|
attribute defaultConcern : ConcernKind;
|
|
89
|
-
attribute safetyClass : SafetyClassKind;
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
item def TrustBoundary specializes InterfaceElement {
|
|
@@ -45,7 +45,7 @@ package memo_assurance_requirements {
|
|
|
45
45
|
attribute statement : String;
|
|
46
46
|
attribute sourceKind : RequirementSourceKind;
|
|
47
47
|
attribute concernKind : ConcernKind;
|
|
48
|
-
attribute
|
|
48
|
+
attribute requirementStatus : RequirementStatusKind;
|
|
49
49
|
attribute acceptanceCriteria : String;
|
|
50
50
|
attribute subjectDescription : String;
|
|
51
51
|
attribute actorDescription : String;
|
|
@@ -16,7 +16,7 @@ package memo_assurance_requirements_needs {
|
|
|
16
16
|
// (ISO 13485 §7.3.3, IEC 62366-1 user needs) is unchanged — it is simply
|
|
17
17
|
// an attribute of the one Need type rather than a class the modeler picks.
|
|
18
18
|
enum def NeedKind {
|
|
19
|
-
enum stakeholder;
|
|
19
|
+
enum 'stakeholder';
|
|
20
20
|
enum user;
|
|
21
21
|
enum clinicalUser;
|
|
22
22
|
enum patientUser;
|
|
@@ -5,7 +5,6 @@ package memo_compliance_artifacts {
|
|
|
5
5
|
private import memo_core_enumerations::*;
|
|
6
6
|
item def ControlledArtifact specializes MemoPart {
|
|
7
7
|
attribute version : String;
|
|
8
|
-
attribute lifecycleState : LifecycleStateKind;
|
|
9
8
|
attribute artifactKind : ArtifactKind;
|
|
10
9
|
attribute owner : String;
|
|
11
10
|
attribute approvalStatus : String;
|
|
@@ -81,7 +81,9 @@ package memo_core_common {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
// Interaction-contract foundation for interface definitions between ports.
|
|
84
|
-
interface def MemoInterface {
|
|
84
|
+
abstract interface def MemoInterface {
|
|
85
|
+
end source;
|
|
86
|
+
end target;
|
|
85
87
|
attribute id : String;
|
|
86
88
|
attribute name : String;
|
|
87
89
|
attribute description : String;
|
|
@@ -225,7 +225,7 @@ package memo_core_enumerations {
|
|
|
225
225
|
enum data;
|
|
226
226
|
enum command;
|
|
227
227
|
enum signal;
|
|
228
|
-
enum event;
|
|
228
|
+
enum 'event';
|
|
229
229
|
enum material;
|
|
230
230
|
enum energy;
|
|
231
231
|
enum fluid;
|
|
@@ -346,6 +346,22 @@ package memo_core_enumerations {
|
|
|
346
346
|
enum embedded;
|
|
347
347
|
enum partitioned;
|
|
348
348
|
}
|
|
349
|
+
// Which side of a system context diagram a participant belongs on.
|
|
350
|
+
// Animate and inanimate are kept apart because they are governed
|
|
351
|
+
// differently: a human participant carries training and use-error
|
|
352
|
+
// considerations (IEC 62366-1), an external system carries interface and
|
|
353
|
+
// interoperability ones.
|
|
354
|
+
enum def ContextSideKind {
|
|
355
|
+
// A human who interacts with the device (IEC 62366-1 intended user).
|
|
356
|
+
enum 'actor';
|
|
357
|
+
// An inanimate external system, device, or supply the device exchanges with.
|
|
358
|
+
enum externalSystem;
|
|
359
|
+
// The setting the device sits inside (IEC 62366-1 3.20 use environment).
|
|
360
|
+
enum environment;
|
|
361
|
+
// A condition the context imposes rather than a thing it connects to —
|
|
362
|
+
// regulatory, clinical, or operational limits on use.
|
|
363
|
+
enum 'constraint';
|
|
364
|
+
}
|
|
349
365
|
enum def ActorKind {
|
|
350
366
|
enum patient;
|
|
351
367
|
enum clinician;
|
|
@@ -45,12 +45,15 @@ package memo_core_relationships {
|
|
|
45
45
|
|
|
46
46
|
connection def DerivesFrom :> MemoRelationship {
|
|
47
47
|
// Drivers include needs and hazards (ISO 14971: hazards drive
|
|
48
|
-
// requirements)
|
|
48
|
+
// requirements). targetRequirement is untyped: Need is a requirement def
|
|
49
|
+
// (MemoNeed + RequirementDriver) and does not conform to VerifiableElement
|
|
50
|
+
// under SysIDE related-feature-conformance.
|
|
49
51
|
end sourceDriver : MemoPart;
|
|
50
|
-
end targetRequirement
|
|
52
|
+
end targetRequirement;
|
|
51
53
|
}
|
|
52
54
|
connection def SatisfiedBy :> MemoRelationship {
|
|
53
|
-
|
|
55
|
+
// Untyped: Need (requirement) instances must participate alongside Requirement.
|
|
56
|
+
end requiredElement;
|
|
54
57
|
end satisfyingElement : ArchitectureElement;
|
|
55
58
|
}
|
|
56
59
|
// Mitigates unifies the control/action → risk-element edges of the
|
|
@@ -67,8 +70,9 @@ package memo_core_relationships {
|
|
|
67
70
|
}
|
|
68
71
|
connection def Mitigates :> MemoRelationship {
|
|
69
72
|
attribute mitigationKind : MitigationKind;
|
|
70
|
-
|
|
71
|
-
end
|
|
73
|
+
// Untyped: controls/hazards may be item defs (RiskControlMeasure, Hazard, …).
|
|
74
|
+
end control;
|
|
75
|
+
end mitigatedElement;
|
|
72
76
|
}
|
|
73
77
|
connection def AllocatedTo :> MemoRelationship {
|
|
74
78
|
end function : ArchitectureElement;
|
|
@@ -102,7 +102,7 @@ package memo_namespace_assurance {
|
|
|
102
102
|
package safety_risk {
|
|
103
103
|
public import memo_assurance_safety_risk::*;
|
|
104
104
|
public import memo_assurance_safety_risk_arch_risk::*;
|
|
105
|
-
alias analysis for memo_namespace_assurance_safety_risk_analysis;
|
|
105
|
+
alias 'analysis' for memo_namespace_assurance_safety_risk_analysis;
|
|
106
106
|
}
|
|
107
107
|
alias cybersecurity for memo_namespace_assurance_cybersecurity;
|
|
108
108
|
alias human_factors for memo_namespace_assurance_human_factors;
|
|
@@ -291,7 +291,7 @@ package memo_namespace_viewpoints {
|
|
|
291
291
|
alias risk for memo_namespace_viewpoints_risk;
|
|
292
292
|
alias software for memo_namespace_viewpoints_software;
|
|
293
293
|
alias usability for memo_namespace_viewpoints_usability;
|
|
294
|
-
alias verification for memo_namespace_viewpoints_verification;
|
|
294
|
+
alias 'verification' for memo_namespace_viewpoints_verification;
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
package memo_namespace_assurance_safety_risk_analysis {
|
|
@@ -24,24 +24,16 @@ package memo_methodology_profiles {
|
|
|
24
24
|
attribute :>> domain = "medical device modeling";
|
|
25
25
|
attribute :>> description = "Light default methodology around the ontology for smaller or early project use.";
|
|
26
26
|
attribute :>> baseMethodName = "";
|
|
27
|
-
attribute :>> includedLayer = "memo::architecture::operational";
|
|
28
|
-
attribute :>>
|
|
29
|
-
attribute :>> includedLayer = "memo::architecture::logical";
|
|
30
|
-
attribute :>> includedModule = "memo::assurance::requirements";
|
|
31
|
-
attribute :>> includedModule = "memo::assurance::safety_risk";
|
|
32
|
-
attribute :>> includedModule = "memo::assurance::verification_validation";
|
|
27
|
+
attribute :>> includedLayer = ("memo::architecture::operational", "memo::architecture::functional", "memo::architecture::logical");
|
|
28
|
+
attribute :>> includedModule = ("memo::assurance::requirements", "memo::assurance::safety_risk", "memo::assurance::verification_validation");
|
|
33
29
|
}
|
|
34
30
|
|
|
35
31
|
part mdLightDefaultResolved : ResolvedMethodology {
|
|
36
32
|
attribute :>> id = "RMETH-001";
|
|
37
33
|
attribute :>> name = "MedicalDeviceLightDefaultResolved";
|
|
38
34
|
attribute :>> version = "0.1";
|
|
39
|
-
attribute :>> includedLayer = "memo::architecture::operational";
|
|
40
|
-
attribute :>>
|
|
41
|
-
attribute :>> includedLayer = "memo::architecture::logical";
|
|
42
|
-
attribute :>> includedModule = "memo::assurance::requirements";
|
|
43
|
-
attribute :>> includedModule = "memo::assurance::safety_risk";
|
|
44
|
-
attribute :>> includedModule = "memo::assurance::verification_validation";
|
|
35
|
+
attribute :>> includedLayer = ("memo::architecture::operational", "memo::architecture::functional", "memo::architecture::logical");
|
|
36
|
+
attribute :>> includedModule = ("memo::assurance::requirements", "memo::assurance::safety_risk", "memo::assurance::verification_validation");
|
|
45
37
|
}
|
|
46
38
|
|
|
47
39
|
part useRiskAndResidualRule : ElementUsageRule {
|
|
@@ -128,16 +120,8 @@ package memo_methodology_profiles {
|
|
|
128
120
|
attribute :>> name = "MedicalDeviceCoverageScope";
|
|
129
121
|
attribute :>> scopeName = "coverage";
|
|
130
122
|
|
|
131
|
-
attribute :>> includedArchLayer = "memo::architecture::operational";
|
|
132
|
-
attribute :>>
|
|
133
|
-
attribute :>> includedArchLayer = "memo::architecture::logical";
|
|
134
|
-
attribute :>> includedArchLayer = "memo::architecture::implementation";
|
|
135
|
-
attribute :>> includedArchLayer = "memo::architecture::realization";
|
|
136
|
-
attribute :>> includedModule = "memo::assurance::requirements";
|
|
137
|
-
attribute :>> includedModule = "memo::assurance::safety_risk";
|
|
138
|
-
attribute :>> includedModule = "memo::assurance::cybersecurity";
|
|
139
|
-
attribute :>> includedModule = "memo::assurance::human_factors";
|
|
140
|
-
attribute :>> includedModule = "memo::assurance::verification_validation";
|
|
123
|
+
attribute :>> includedArchLayer = ("memo::architecture::operational", "memo::architecture::functional", "memo::architecture::logical", "memo::architecture::implementation", "memo::architecture::realization");
|
|
124
|
+
attribute :>> includedModule = ("memo::assurance::requirements", "memo::assurance::safety_risk", "memo::assurance::cybersecurity", "memo::assurance::human_factors", "memo::assurance::verification_validation");
|
|
141
125
|
attribute :>> description = "Comprehensive default MEMO layer and module selection.";
|
|
142
126
|
}
|
|
143
127
|
|
|
@@ -18,7 +18,16 @@ package memo_viewpoints_context_context_viewpoint {
|
|
|
18
18
|
attribute :>> presentationKind = (PresentationKind::blockDiagram);
|
|
19
19
|
attribute :>> concernKinds = (ConcernKind::safety, ConcernKind::interoperability);
|
|
20
20
|
attribute :>> includedLayers = ("context");
|
|
21
|
-
|
|
21
|
+
// UseEnvironment (IEC 62366-1 3.20) is what the device sits inside —
|
|
22
|
+
// facility, procedure area, ambient conditions. A context view that
|
|
23
|
+
// cannot show it is missing half of "where is this used".
|
|
24
|
+
attribute :>> allowedElementKinds = ("Actor", "UseContext", "UseEnvironment", "IntendedUse", "ReasonablyForeseeableMisuse", "OperationalEntity", "TrustBoundary", "LogicalComponent");
|
|
25
|
+
// InteractsInContext is the context relation: a context view draws it
|
|
26
|
+
// and nothing else, so general-purpose model edges cannot leak into the
|
|
27
|
+
// boundary picture. Projects derive their own verbs from it and are
|
|
28
|
+
// picked up through the specialization closure. The three older
|
|
29
|
+
// relations remain for models authored before it existed.
|
|
30
|
+
attribute :>> allowedRelationshipKinds = ("InteractsInContext", "InteractsWith", "ExchangesWith", "ConnectsPhysically");
|
|
22
31
|
attribute :>> userExtensible = true;
|
|
23
32
|
}
|
|
24
33
|
}
|
|
@@ -19,6 +19,8 @@ package memo_viewpoints_definitions {
|
|
|
19
19
|
attribute filterExpression : String;
|
|
20
20
|
attribute extendsViewpointIds : String[*];
|
|
21
21
|
attribute userExtensible : Boolean;
|
|
22
|
+
// Optional navigation grouping interpreted by Memo Architect.
|
|
23
|
+
attribute group : String;
|
|
22
24
|
// default diagram kind for a catalog viewpoint (optional)
|
|
23
25
|
attribute defaultViewKind : DiagramViewKind[0..1];
|
|
24
26
|
}
|
|
@@ -47,7 +49,11 @@ package memo_viewpoints_definitions {
|
|
|
47
49
|
attribute queryDescription : String;
|
|
48
50
|
attribute dataSourceDescription : String;
|
|
49
51
|
attribute autoPopulate : Boolean;
|
|
50
|
-
|
|
52
|
+
// ISO 42010 conformance is many-to-many: every view has one or more
|
|
53
|
+
// viewpoints, and a viewpoint may be realized by many reusable views.
|
|
54
|
+
part viewpointDefinition : Viewpoint[1..*];
|
|
55
|
+
// Optional grouping within each viewpoint, interpreted by Architect.
|
|
56
|
+
attribute group : String;
|
|
51
57
|
ref subjectElement : MemoPart[*];
|
|
52
58
|
ref exposesElement : MemoPart[*];
|
|
53
59
|
ref exposesRelationship : MemoRelationship[*];
|