@memoarchitect/ontology 0.11.2 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/examples/gpca-pump/memo.identity.yaml +27 -0
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +3 -3
- package/examples/sysml-diagram-samples/README.md +10 -0
- package/examples/sysml-diagram-samples/dashboards/README.md +17 -0
- package/examples/sysml-diagram-samples/dashboards/viewpoint-vp-demo-ibd.md +61 -0
- package/examples/sysml-diagram-samples/memo.identity.yaml +616 -0
- package/examples/sysml-diagram-samples/model/catalog/project.sysml +2 -11
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +81 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +15 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +88 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +6 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +3 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +64 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +64 -4
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +3 -3
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +69 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +11 -11
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +97 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +18 -18
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +18 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +5 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +34 -11
- 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/functional/behavior/memo_behavior.sysml +8 -1
- package/src/architecture/functional/functions/memo_functions.sysml +16 -2
- package/src/architecture/implementation/ui/memo_ui.sysml +46 -20
- package/src/core/enumerations/memo_enumerations.sysml +49 -13
- package/src/memo_namespaces.sysml +2 -0
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +3 -4
- package/src/viewpoints/context/context_viewpoint.sysml +3 -5
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +3 -5
- package/src/viewpoints/definitions/memo_stakeholders_concerns.sysml +192 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +94 -6
- package/src/viewpoints/functional/functional_viewpoint.sysml +3 -4
- package/src/viewpoints/logical/logical_viewpoint.sysml +3 -4
- package/src/viewpoints/operational/operational_viewpoint.sysml +3 -4
- package/src/viewpoints/physical/physical_viewpoint.sysml +3 -4
- package/src/viewpoints/requirements/requirements_viewpoint.sysml +3 -4
- package/src/viewpoints/risk/risk_viewpoint.sysml +3 -4
- package/src/viewpoints/software/software_viewpoint.sysml +3 -4
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +3 -5
- package/src/viewpoints/usability/usability_viewpoint.sysml +3 -4
- package/src/viewpoints/verification/verification_viewpoint.sysml +3 -4
package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
package diagram_samples {
|
|
2
|
+
// Sequence sample (sequence view kind, `seq` diagram type). A FunctionalFlow
|
|
3
|
+
// owns an ordered chain of FunctionalFlowSteps; each step is `allocate`d to
|
|
4
|
+
// the lifeline (an actor or component) that performs it, and the sequence
|
|
5
|
+
// template lays lifelines out as columns with one row per step in
|
|
6
|
+
// declaration order.
|
|
7
|
+
private import ScalarValues::*;
|
|
8
|
+
|
|
9
|
+
private import memo_architecture_operational_context_actors::*;
|
|
10
|
+
private import memo_architecture_logical_structure::*;
|
|
11
|
+
private import memo_architecture_functional_functions::*;
|
|
12
|
+
private import memo_core_relationships::*;
|
|
13
|
+
private import memo_viewpoints_definitions::*;
|
|
14
|
+
private import memo_viewpoints_functional_functional_viewpoint::*;
|
|
15
|
+
private import memo_core_enumerations::*;
|
|
16
|
+
|
|
17
|
+
private import memo_core_common::*;
|
|
18
|
+
private import memo_core_common::MemoIdentity;
|
|
19
|
+
|
|
20
|
+
// Lifelines — the actor and components each step is allocated to.
|
|
21
|
+
part clinician : User { attribute :>> name = "Clinician"; }
|
|
22
|
+
part pumpController : LogicalComponent { attribute :>> name = "Pump Controller"; }
|
|
23
|
+
part pumpMechanism : LogicalComponent { attribute :>> name = "Pump Mechanism"; }
|
|
24
|
+
|
|
25
|
+
// Combined fragment definitions — referenced by steps' `fragment` attribute.
|
|
26
|
+
part monitorLoop {
|
|
27
|
+
attribute :>> name = "Monitor Loop";
|
|
28
|
+
attribute fragmentType = "loop";
|
|
29
|
+
attribute guard = "vitals abnormal";
|
|
30
|
+
}
|
|
31
|
+
part errorHandling {
|
|
32
|
+
attribute :>> name = "Error Handling";
|
|
33
|
+
attribute fragmentType = "alt";
|
|
34
|
+
attribute fragmentGuards = "[error recoverable]|[else]";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
action startInfusion : FunctionalFlow {
|
|
38
|
+
attribute :>> name = "Start Infusion";
|
|
39
|
+
|
|
40
|
+
action stepRequestStart : FunctionalFlowStep { attribute :>> name = "Request start infusion"; }
|
|
41
|
+
action stepValidate : FunctionalFlowStep { attribute :>> name = "Validate prescribed rate"; }
|
|
42
|
+
action stepCommandMotor : FunctionalFlowStep { attribute :>> name = "Command motor drive"; }
|
|
43
|
+
action stepConfirm : FunctionalFlowStep { attribute :>> name = "Confirm delivery started"; }
|
|
44
|
+
|
|
45
|
+
// Steps inside the monitoring loop fragment
|
|
46
|
+
action stepReadSensor : FunctionalFlowStep { attribute :>> name = "Read sensor data"; attribute stepOrder = "5"; attribute fragment = "monitorLoop"; }
|
|
47
|
+
action stepCheckVitals : FunctionalFlowStep { attribute :>> name = "Check vital signs"; attribute stepOrder = "6"; attribute fragment = "monitorLoop"; }
|
|
48
|
+
|
|
49
|
+
// Steps inside the alt (error-handling) fragment
|
|
50
|
+
action stepRetryDelivery : FunctionalFlowStep { attribute :>> name = "Retry delivery"; attribute stepOrder = "7"; attribute fragment = "errorHandling"; attribute fragmentOperand = "1"; }
|
|
51
|
+
action stepAlertUser : FunctionalFlowStep { attribute :>> name = "Alert user"; attribute stepOrder = "8"; attribute fragment = "errorHandling"; attribute fragmentOperand = "2"; }
|
|
52
|
+
|
|
53
|
+
action stepNotify : FunctionalFlowStep { attribute :>> name = "Notify delivery started"; attribute stepOrder = "9"; }
|
|
54
|
+
|
|
55
|
+
first start then stepRequestStart;
|
|
56
|
+
first stepRequestStart then stepValidate;
|
|
57
|
+
first stepValidate then stepCommandMotor;
|
|
58
|
+
first stepCommandMotor then stepConfirm;
|
|
59
|
+
first stepConfirm then stepReadSensor;
|
|
60
|
+
first stepReadSensor then stepCheckVitals;
|
|
61
|
+
first stepCheckVitals then stepRetryDelivery;
|
|
62
|
+
first stepCheckVitals then stepAlertUser;
|
|
63
|
+
first stepRetryDelivery then stepNotify;
|
|
64
|
+
first stepAlertUser then stepNotify;
|
|
65
|
+
first stepNotify then done;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Lane assignment — which lifeline performs each step, in the order the
|
|
69
|
+
// sequence reads top to bottom: clinician requests, controller validates,
|
|
70
|
+
// mechanism drives, controller confirms, clinician is notified.
|
|
71
|
+
allocate startInfusion.stepRequestStart to clinician;
|
|
72
|
+
allocate startInfusion.stepValidate to pumpController;
|
|
73
|
+
allocate startInfusion.stepCommandMotor to pumpMechanism;
|
|
74
|
+
allocate startInfusion.stepConfirm to pumpController;
|
|
75
|
+
allocate startInfusion.stepReadSensor to pumpMechanism;
|
|
76
|
+
allocate startInfusion.stepCheckVitals to pumpController;
|
|
77
|
+
allocate startInfusion.stepRetryDelivery to pumpController;
|
|
78
|
+
allocate startInfusion.stepAlertUser to clinician;
|
|
79
|
+
allocate startInfusion.stepNotify to clinician;
|
|
80
|
+
|
|
81
|
+
view startInfusionSequence : MemoDiagramView {
|
|
82
|
+
expose startInfusion::**;
|
|
83
|
+
expose clinician::**;
|
|
84
|
+
expose pumpController::**;
|
|
85
|
+
expose pumpMechanism::**;
|
|
86
|
+
expose monitorLoop::**;
|
|
87
|
+
expose errorHandling::**;
|
|
88
|
+
attribute depth = 2;
|
|
89
|
+
@MemoIdentity { :>> shortDescription = "Start-infusion sequence with combined fragments — loop for sensor monitoring and alt for error handling."; }
|
|
90
|
+
attribute :>> viewKind = DiagramViewKind::sequence;
|
|
91
|
+
attribute :>> diagramType = "seq";
|
|
92
|
+
ref :>> viewpointDefinition = sequenceViewpoint;
|
|
93
|
+
part :>> selectionQuery {
|
|
94
|
+
attribute :>> includeElementKinds = ("FunctionalFlowStep", "User", "LogicalComponent", "Part");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// fixture
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
// the
|
|
14
|
-
|
|
1
|
+
package diagram_samples {
|
|
2
|
+
// Standard SysML v2 activity sample (actionflow view kind, `afd` diagram type).
|
|
3
|
+
//
|
|
4
|
+
// The view over `activity_example::CustomerProcess`, the standard-SysML activity
|
|
5
|
+
// fixture in `model/sysml_v2_activity_example.sysml`. It exists because the
|
|
6
|
+
// fixture's whole point is the node types `action_flow_view.sysml` does not
|
|
7
|
+
// have — decision, merge, fork, join, accept, send, terminate, and guarded
|
|
8
|
+
// successions. Without a view exposing it the fixture parses into the model and
|
|
9
|
+
// is never drawn, which is indistinguishable from a renderer that cannot draw
|
|
10
|
+
// decisions.
|
|
11
|
+
//
|
|
12
|
+
// Nothing here specializes a MEMO kind: the fixture is plain standard SysML,
|
|
13
|
+
// and that is the property under test. The renderer classifies its nodes from
|
|
14
|
+
// the metamodel (`activity-notation.ts`), not from an ontology kind.
|
|
15
15
|
private import ScalarValues::*;
|
|
16
16
|
|
|
17
17
|
private import memo_core_relationships::*;
|
|
@@ -23,12 +23,12 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_standard
|
|
|
23
23
|
|
|
24
24
|
private import memo_core_common::*;
|
|
25
25
|
private import memo_core_common::MemoIdentity;
|
|
26
|
-
view
|
|
27
|
-
expose
|
|
26
|
+
view orderFulfillmentActivity : MemoDiagramView {
|
|
27
|
+
expose FulfillOrder::**;
|
|
28
28
|
attribute depth = 2;
|
|
29
|
-
@MemoIdentity { :>> shortDescription = "
|
|
29
|
+
@MemoIdentity { :>> shortDescription = "Order fulfilment — accept, validate, decide, fork into parallel shipment and invoice, join, notify, send receipt, and terminate."; }
|
|
30
30
|
attribute :>> viewKind = DiagramViewKind::actionflow;
|
|
31
31
|
attribute :>> diagramType = "afd";
|
|
32
|
-
ref :>> viewpointDefinition =
|
|
32
|
+
ref :>> viewpointDefinition = actionFlowViewpoint;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
1
|
+
package diagram_samples {
|
|
2
|
+
// State transition sample (statetransition view kind, `stm` diagram type). A
|
|
3
|
+
// behaviour machine owns its mode states by containing them, and each native
|
|
4
|
+
// transition lives inside the state whose substates it connects.
|
|
5
5
|
private import ScalarValues::*;
|
|
6
6
|
|
|
7
7
|
private import memo_architecture_functional_behavior::*;
|
|
@@ -62,18 +62,30 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_state_tr
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
view
|
|
65
|
+
view pumpModeStateMachine : MemoDiagramView {
|
|
66
66
|
expose pumpModes::**;
|
|
67
67
|
attribute depth = 2;
|
|
68
68
|
@MemoIdentity { :>> shortDescription = "A pump-mode state machine — Idle, Infusing, Paused, Alarm — where Infusing is a composite state nesting Priming, Delivering and Holding."; }
|
|
69
69
|
attribute :>> viewKind = DiagramViewKind::statetransition;
|
|
70
70
|
attribute :>> diagramType = "stm";
|
|
71
|
-
ref :>> viewpointDefinition =
|
|
71
|
+
ref :>> viewpointDefinition = stateMachineViewpoint;
|
|
72
72
|
part :>> selectionQuery {
|
|
73
73
|
attribute :>> includeElementKinds = ("StateMachine", "MemoState");
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
view infusingSubStates : MemoDiagramView {
|
|
78
|
+
expose pumpModes.infusing::**;
|
|
79
|
+
attribute depth = 2;
|
|
80
|
+
@MemoIdentity { :>> shortDescription = "Sub-states of the Infusing composite state — Priming, Delivering, and Holding with their internal transitions."; }
|
|
81
|
+
attribute :>> viewKind = DiagramViewKind::statetransition;
|
|
82
|
+
attribute :>> diagramType = "stm";
|
|
83
|
+
ref :>> viewpointDefinition = stateMachineViewpoint;
|
|
84
|
+
part :>> selectionQuery {
|
|
85
|
+
attribute :>> includeElementKinds = ("MemoState");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
77
89
|
// The machine is one containment tree, so exposing its root reaches every
|
|
78
90
|
// state and transition; the former per-element IncludedIn list restated
|
|
79
91
|
// that tree a second time and is gone with it.
|
package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package diagram_samples {
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
private import memo_architecture_implementation_hardware_structure::*;
|
|
4
4
|
|
|
@@ -16,7 +16,7 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_tree_vie
|
|
|
16
16
|
attribute :>> name = "Branch A.1";
|
|
17
17
|
part leafA11 : HardwareAssembly {
|
|
18
18
|
attribute :>> name = "Leaf A.1.1";
|
|
19
|
-
attribute :>> partNumber = "PN-
|
|
19
|
+
attribute :>> partNumber = "PN-1";
|
|
20
20
|
}
|
|
21
21
|
part leafA12 : HardwareAssembly { attribute :>> name = "Leaf A.1.2"; }
|
|
22
22
|
}
|
|
@@ -33,13 +33,13 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_tree_vie
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
view
|
|
36
|
+
view blockDecomposition : MemoDiagramView {
|
|
37
37
|
expose rootA::**;
|
|
38
38
|
attribute depth = 2;
|
|
39
|
-
@MemoIdentity { :>> shortDescription = "
|
|
39
|
+
@MemoIdentity { :>> shortDescription = "Block decomposition tree — hardware assemblies with varied branch depths."; }
|
|
40
40
|
attribute :>> viewKind = DiagramViewKind::general;
|
|
41
41
|
attribute :>> diagramType = "bdd";
|
|
42
|
-
ref :>> viewpointDefinition =
|
|
42
|
+
ref :>> viewpointDefinition = treeViewpoint;
|
|
43
43
|
attribute :>> layoutHint = "tree";
|
|
44
44
|
attribute :>> styleHint = "expanded:rootA,rootB,branchA1,branchB1";
|
|
45
45
|
part :>> selectionQuery {
|
package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package diagram_samples {
|
|
2
2
|
private import ScalarValues::*;
|
|
3
3
|
private import memo_architecture_operational_context_actors::*;
|
|
4
4
|
private import memo_architecture_operational_use_cases::*;
|
|
@@ -9,6 +9,15 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
9
9
|
|
|
10
10
|
private import memo_core_common::*;
|
|
11
11
|
private import memo_core_common::MemoIdentity;
|
|
12
|
+
|
|
13
|
+
// Generalization (specialization) relation for UML-style use-case diagrams.
|
|
14
|
+
// Source is the specific element, target the general one; the UCD renderer
|
|
15
|
+
// draws a solid line with a hollow triangle pointing at the general end.
|
|
16
|
+
connection def Specialization :> MemoRelationship {
|
|
17
|
+
end specialized :>> source;
|
|
18
|
+
end general :>> target;
|
|
19
|
+
}
|
|
20
|
+
|
|
12
21
|
// Product-neutral fixture for the UML-style use-case presentation.
|
|
13
22
|
part patient : User {
|
|
14
23
|
attribute :>> actorKind = ActorKind::patient;
|
|
@@ -22,9 +31,13 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
22
31
|
attribute :>> actorKind = ActorKind::technician;
|
|
23
32
|
attribute :>> name = "Service Technician";
|
|
24
33
|
}
|
|
34
|
+
part nursingStaff : User {
|
|
35
|
+
attribute :>> actorKind = ActorKind::clinician;
|
|
36
|
+
attribute :>> name = "Nursing Staff";
|
|
37
|
+
}
|
|
25
38
|
|
|
26
39
|
use case reviewStatus : UseCase {
|
|
27
|
-
@MemoIdentity { :>> providedId = "UC-SAMPLE-
|
|
40
|
+
@MemoIdentity { :>> providedId = "UC-SAMPLE-1"; }
|
|
28
41
|
attribute :>> name = "Review Device Status";
|
|
29
42
|
attribute :>> useCaseKind = UseCaseKind::clinical;
|
|
30
43
|
include validateTherapySettings;
|
|
@@ -32,7 +45,7 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
32
45
|
actor patientActor = patient;
|
|
33
46
|
}
|
|
34
47
|
use case configureTherapy : UseCase {
|
|
35
|
-
@MemoIdentity { :>> providedId = "UC-SAMPLE-
|
|
48
|
+
@MemoIdentity { :>> providedId = "UC-SAMPLE-2"; }
|
|
36
49
|
attribute :>> name = "Configure Therapy";
|
|
37
50
|
attribute :>> useCaseKind = UseCaseKind::clinical;
|
|
38
51
|
include reviewStatus;
|
|
@@ -41,7 +54,7 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
41
54
|
actor patientActor = patient;
|
|
42
55
|
}
|
|
43
56
|
use case maintainDevice : UseCase {
|
|
44
|
-
@MemoIdentity { :>> providedId = "UC-SAMPLE-
|
|
57
|
+
@MemoIdentity { :>> providedId = "UC-SAMPLE-3"; }
|
|
45
58
|
attribute :>> name = "Maintain Device";
|
|
46
59
|
attribute :>> useCaseKind = UseCaseKind::service;
|
|
47
60
|
subject supportingSystem;
|
|
@@ -49,14 +62,14 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
49
62
|
}
|
|
50
63
|
|
|
51
64
|
use case documentTreatment : UseCase {
|
|
52
|
-
@MemoIdentity { :>> providedId = "UC-SAMPLE-
|
|
65
|
+
@MemoIdentity { :>> providedId = "UC-SAMPLE-4"; }
|
|
53
66
|
attribute :>> name = "Document Treatment";
|
|
54
67
|
attribute :>> useCaseKind = UseCaseKind::clinical;
|
|
55
68
|
}
|
|
56
69
|
|
|
57
70
|
// L2 child of Review Device Status: makes L0 → L1 → L2 selectable.
|
|
58
71
|
use case validateTherapySettings : UseCase {
|
|
59
|
-
@MemoIdentity { :>> providedId = "UC-SAMPLE-
|
|
72
|
+
@MemoIdentity { :>> providedId = "UC-SAMPLE-5"; }
|
|
60
73
|
attribute :>> name = "Validate Therapy Settings";
|
|
61
74
|
attribute :>> useCaseKind = UseCaseKind::clinical;
|
|
62
75
|
subject supportingSystem;
|
|
@@ -67,24 +80,34 @@ package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case
|
|
|
67
80
|
// specialization, and `:>` inherits the base's subject and actors.
|
|
68
81
|
dependency from documentTreatment to reviewStatus;
|
|
69
82
|
|
|
70
|
-
|
|
83
|
+
// Actor generalization: Nursing Staff is a specialization of Clinician.
|
|
84
|
+
// UML draws this as a solid line with a hollow triangle arrowhead pointing
|
|
85
|
+
// at the general actor.
|
|
86
|
+
connection : Specialization connect nursingStaff to clinician;
|
|
87
|
+
|
|
88
|
+
// Use-case generalization: Configure Therapy specializes Review Device
|
|
89
|
+
// Status — the general case is browsing status; configuring therapy is a
|
|
90
|
+
// more specific variant.
|
|
91
|
+
connection : Specialization connect configureTherapy to reviewStatus;
|
|
92
|
+
|
|
93
|
+
view deviceUseCases : MemoDiagramView {
|
|
71
94
|
expose patient;
|
|
72
95
|
expose clinician;
|
|
73
96
|
expose serviceTechnician;
|
|
97
|
+
expose nursingStaff;
|
|
74
98
|
expose reviewStatus;
|
|
75
99
|
expose configureTherapy;
|
|
76
100
|
expose maintainDevice;
|
|
77
101
|
expose documentTreatment;
|
|
78
102
|
expose validateTherapySettings;
|
|
79
|
-
@MemoIdentity { :>> shortDescription = "Actors outside a device boundary with include, extend, hierarchy-level, and orthogonal-routing presentation."; }
|
|
103
|
+
@MemoIdentity { :>> shortDescription = "Actors outside a device boundary with include, extend, generalization, hierarchy-level, and orthogonal-routing presentation."; }
|
|
80
104
|
attribute :>> viewKind = DiagramViewKind::general;
|
|
81
105
|
attribute :>> diagramType = "ucd";
|
|
82
|
-
ref :>> viewpointDefinition =
|
|
106
|
+
ref :>> viewpointDefinition = useCaseViewpoint;
|
|
83
107
|
part :>> selectionQuery {
|
|
84
108
|
attribute :>> includeElementKinds = ("User", "UseCase");
|
|
85
|
-
attribute :>> includeRelationshipKinds = ("ParticipatesIn", "IncludesStep", "Extends");
|
|
109
|
+
attribute :>> includeRelationshipKinds = ("ParticipatesIn", "IncludesStep", "Extends", "Specialization");
|
|
86
110
|
}
|
|
87
|
-
// Presentation is owned by the model view, rather than a canvas control.
|
|
88
111
|
attribute :>> layoutHint = "usecase:level=all;edge=rounded";
|
|
89
112
|
}
|
|
90
113
|
}
|
|
@@ -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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1
|
|
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.12.1",
|
|
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.12.1
|
|
11
11
|
description: Closure rules and viewpoints for medical device modeling
|
|
12
12
|
license: MIT
|
|
13
13
|
tags:
|
|
@@ -88,7 +88,14 @@ package memo_architecture_functional_behavior {
|
|
|
88
88
|
attribute constraintKind : TimingConstraintKind;
|
|
89
89
|
attribute minMs : String;
|
|
90
90
|
attribute maxMs : String;
|
|
91
|
-
|
|
91
|
+
// Untyped, the way `InteractsInContext::systemOfInterest` is: what a
|
|
92
|
+
// latency or period is measured against is a behaviour at least as
|
|
93
|
+
// often as it is a structure — a functional flow, an action, a port.
|
|
94
|
+
// `MemoPart[1]` said otherwise and could only ever have held the
|
|
95
|
+
// structural half, which is the same A0 residue that kept
|
|
96
|
+
// `FunctionalFlow` a part def. MEMO has no root above the metaclasses
|
|
97
|
+
// by design, so spanning them means naming none.
|
|
98
|
+
ref referenceElement[1];
|
|
92
99
|
attribute verificationMethod : MemoVerificationMethodKind;
|
|
93
100
|
}
|
|
94
101
|
}
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
// ZERO example files. The ends are metaclass-neutral now (CR-ONT-060..073), so
|
|
18
18
|
// the split has no cause and is gone: OperativeAction is merged into the function
|
|
19
19
|
// family, and its `actionKind` moved onto MemoFunction where it was always
|
|
20
|
-
// describing the function anyway.
|
|
20
|
+
// describing the function anyway. `FunctionalFlow` was the one element A0 left
|
|
21
|
+
// behind on the part side; it is an `action def` now, for the same reason and
|
|
22
|
+
// on the same evidence.
|
|
21
23
|
//
|
|
22
24
|
// `functionCategory` and `actionKind` are NOT two spellings of one axis, and
|
|
23
25
|
// merging them would lose information. `actionKind` is the verb — sense,
|
|
@@ -112,7 +114,19 @@ package memo_architecture_functional_functions {
|
|
|
112
114
|
|
|
113
115
|
// A reusable functional route through system responsibilities. Functional
|
|
114
116
|
// flows are part of functional architecture, never logical structure.
|
|
115
|
-
|
|
117
|
+
//
|
|
118
|
+
// An `action def`, like every other behaviour in MEMO. It was
|
|
119
|
+
// `part def ... specializes MemoPart` for the Track A0 reason described at
|
|
120
|
+
// the top of this file — relation ends typed on part-based types, and
|
|
121
|
+
// KerML forbids a behaviour from specializing one — and it was the single
|
|
122
|
+
// element A0 did not carry across when that reason went away. A route
|
|
123
|
+
// through responsibilities is the same shape as the `OperationalWorkflow`
|
|
124
|
+
// and `OperativeScenario` it sits beside: the scenarios package calls a
|
|
125
|
+
// scenario "a selected path through a workflow (or functional flow)",
|
|
126
|
+
// naming the two as one kind of thing, and its steps are `action def`s
|
|
127
|
+
// already. A structure whose whole body is `perform` is a behaviour that
|
|
128
|
+
// has not been allowed to say so.
|
|
129
|
+
action def FunctionalFlow specializes MemoAction {
|
|
116
130
|
attribute flowCategory : FunctionalFlowKind;
|
|
117
131
|
attribute endToEndLatencyBudgetMs : String;
|
|
118
132
|
attribute safetyRelevant : Boolean;
|
|
@@ -115,21 +115,15 @@ package memo_architecture_implementation_ui {
|
|
|
115
115
|
attribute uiTechnology : String;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
//
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// alarm annunciation (optional; IEC 60601-1-8)
|
|
128
|
-
attribute alarmPriority : NotificationPriorityKind[0..1];
|
|
129
|
-
attribute annunciationModality : String;
|
|
130
|
-
attribute silenceable : Boolean;
|
|
131
|
-
}
|
|
132
|
-
|
|
118
|
+
// `InteractionElement` was an abstract base over UIElement and
|
|
119
|
+
// OperatorInterfaceElement, existing so the §18 relations could type
|
|
120
|
+
// against "something the user interacts with". It was both redundant and
|
|
121
|
+
// too narrow: the nearest real common ancestor is already `MemoPart`, and
|
|
122
|
+
// IEC 62366-1 puts the whole means of interaction in scope — a mis-keyed
|
|
123
|
+
// connector, a moulded marking on a housing, a tube routed backwards are
|
|
124
|
+
// use errors at parts that were never interaction elements and so could
|
|
125
|
+
// not be named. `ErrorAtElement` and `ElementTriggersAction` now take
|
|
126
|
+
// `MemoPart`; the attributes moved to whichever type actually set them.
|
|
133
127
|
|
|
134
128
|
// One UIElement — the single UI part type. The widget form — holding
|
|
135
129
|
// (screen/panel/dialog), acting (button/knob/slider), presenting
|
|
@@ -153,8 +147,20 @@ package memo_architecture_implementation_ui {
|
|
|
153
147
|
// CODE, and a screen is not a source module. Runtime processes are
|
|
154
148
|
// SoftwareComponent, code is SoftwareModule, and the UI is a third view of
|
|
155
149
|
// the same software — a sibling of those, not a kind of either.
|
|
156
|
-
part def UIElement specializes SoftwareElement
|
|
150
|
+
part def UIElement specializes SoftwareElement {
|
|
157
151
|
attribute formKind : UIElementFormKind;
|
|
152
|
+
// The visible label. Held here rather than on a shared interaction
|
|
153
|
+
// base: a physical control's label is moulded or printed, and is
|
|
154
|
+
// `legendText` on OperatorInterfaceElement.
|
|
155
|
+
attribute labelText : String;
|
|
156
|
+
// ── alarm annunciation (optional; IEC 60601-1-8) ──
|
|
157
|
+
// On the rendered element, because that is where every modelled
|
|
158
|
+
// annunciation lives. A physical annunciator that needs a priority
|
|
159
|
+
// wants an alarm concept of its own, not three attributes copied onto
|
|
160
|
+
// every front-panel part.
|
|
161
|
+
attribute alarmPriority : NotificationPriorityKind[0..1];
|
|
162
|
+
attribute annunciationModality : String;
|
|
163
|
+
attribute silenceable : Boolean;
|
|
158
164
|
// ── screen layout (optional; set for elements that are laid out) ──
|
|
159
165
|
// Bounds are relative to the parent element in the Composes tree; a
|
|
160
166
|
// root screen's bounds are the full frame.
|
|
@@ -222,7 +228,7 @@ package memo_architecture_implementation_ui {
|
|
|
222
228
|
enum printedMarking;
|
|
223
229
|
}
|
|
224
230
|
|
|
225
|
-
part def OperatorInterfaceElement specializes PhysicalComponent
|
|
231
|
+
part def OperatorInterfaceElement specializes PhysicalComponent {
|
|
226
232
|
attribute formKind : OperatorInterfaceFormKind;
|
|
227
233
|
// actuation (optional; set for actuated forms)
|
|
228
234
|
attribute actuationForce : String;
|
|
@@ -267,7 +273,17 @@ package memo_architecture_implementation_ui {
|
|
|
267
273
|
attribute intent : InteractionIntentKind;
|
|
268
274
|
}
|
|
269
275
|
|
|
270
|
-
action
|
|
276
|
+
// Clicking a button IS an operative action: it has a trigger, a
|
|
277
|
+
// precondition, a criticality, a potential harm and a frequency of use,
|
|
278
|
+
// exactly as turning a knob does. Specializing MemoAction directly made
|
|
279
|
+
// UIAction a SIBLING of OperativeAction, which cost two things — a UI
|
|
280
|
+
// action could carry none of those ten attributes, and `CommitsUseError`
|
|
281
|
+
// (source end: OperativeAction) would not accept it, so a use error
|
|
282
|
+
// committed by a click was unmodellable.
|
|
283
|
+
//
|
|
284
|
+
// The three attributes here are what a UI action adds on top: what the
|
|
285
|
+
// user meant by it, what came back, and whether it asks first.
|
|
286
|
+
action def UIAction specializes OperativeAction {
|
|
271
287
|
attribute intent : InteractionIntentKind;
|
|
272
288
|
attribute feedbackProvided : String;
|
|
273
289
|
attribute confirmationRequired : Boolean;
|
|
@@ -310,8 +326,13 @@ package memo_architecture_implementation_ui {
|
|
|
310
326
|
// from here, and only this relation says so.
|
|
311
327
|
|
|
312
328
|
// ── §18 traceability ─────────────────────────────────────────
|
|
329
|
+
// Source is `MemoPart`, not a UI-specific base: a foot pedal and a
|
|
330
|
+
// rendered button trigger the same kind of action, and the two are a
|
|
331
|
+
// PhysicalComponent and a SoftwareElement whose only common ancestor is
|
|
332
|
+
// MemoPart. CR-MED-111 still holds rendered controls to it, and it is
|
|
333
|
+
// scoped to UIElement, so the wider end does not weaken the rule.
|
|
313
334
|
connection def ElementTriggersAction :> MemoRelationship {
|
|
314
|
-
end element :
|
|
335
|
+
end element : MemoPart :>> source;
|
|
315
336
|
end triggeredAction : UIAction :>> target;
|
|
316
337
|
}
|
|
317
338
|
abstract connection elementTriggersActionLinks : ElementTriggersAction[*];
|
|
@@ -334,9 +355,14 @@ package memo_architecture_implementation_ui {
|
|
|
334
355
|
}
|
|
335
356
|
// A UI scenario realizes a functional scenario one layer up: each is a
|
|
336
357
|
// OperativeScenario selected by scenarioKind rather than a separate definition.
|
|
358
|
+
// Target is `MemoPart`. IEC 62366-1 scopes the user interface to every
|
|
359
|
+
// means of interaction, so a use error lands wherever the user got it
|
|
360
|
+
// wrong — a mis-keyed connector, a moulded marking, a tube routed
|
|
361
|
+
// backwards — not only on a control. Narrowing this to an interaction
|
|
362
|
+
// base made those unmodellable.
|
|
337
363
|
connection def ErrorAtElement :> MemoRelationship {
|
|
338
364
|
end useError : UseError :>> source;
|
|
339
|
-
end element :
|
|
365
|
+
end element : MemoPart :>> target;
|
|
340
366
|
}
|
|
341
367
|
abstract connection errorAtElementLinks : ErrorAtElement[*];
|
|
342
368
|
metadata def <errorAtElement> ErrorAtElementMetadata :> SemanticMetadata {
|