@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.
Files changed (53) hide show
  1. package/README.md +1 -1
  2. package/examples/gpca-pump/memo.identity.yaml +27 -0
  3. package/examples/gpca-pump/model/catalog/gpca_system.sysml +3 -3
  4. package/examples/sysml-diagram-samples/README.md +10 -0
  5. package/examples/sysml-diagram-samples/dashboards/README.md +17 -0
  6. package/examples/sysml-diagram-samples/dashboards/viewpoint-vp-demo-ibd.md +61 -0
  7. package/examples/sysml-diagram-samples/memo.identity.yaml +616 -0
  8. package/examples/sysml-diagram-samples/model/catalog/project.sysml +2 -11
  9. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +81 -6
  10. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +15 -5
  11. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +88 -0
  12. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +6 -6
  13. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +3 -3
  14. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +64 -0
  15. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +64 -4
  16. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +3 -3
  17. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +69 -0
  18. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +11 -11
  19. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +97 -0
  20. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/standard_activity_view.sysml +18 -18
  21. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +18 -6
  22. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +5 -5
  23. package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +34 -11
  24. package/extensions/aadl/memo.package.yaml +1 -1
  25. package/extensions/cloud/memo.package.yaml +1 -1
  26. package/extensions/container/memo.package.yaml +1 -1
  27. package/extensions/messaging/memo.package.yaml +1 -1
  28. package/extensions/ros/memo.package.yaml +1 -1
  29. package/methodologies/default/memo.package.yaml +1 -1
  30. package/methodologies/gpca/memo.package.yaml +1 -1
  31. package/ontology/memo.package.yaml +1 -1
  32. package/package.json +1 -1
  33. package/profile/memo.package.yaml +1 -1
  34. package/src/architecture/functional/behavior/memo_behavior.sysml +8 -1
  35. package/src/architecture/functional/functions/memo_functions.sysml +16 -2
  36. package/src/architecture/implementation/ui/memo_ui.sysml +46 -20
  37. package/src/core/enumerations/memo_enumerations.sysml +49 -13
  38. package/src/memo_namespaces.sysml +2 -0
  39. package/src/viewpoints/clinical/clinical_viewpoint.sysml +3 -4
  40. package/src/viewpoints/context/context_viewpoint.sysml +3 -5
  41. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +3 -5
  42. package/src/viewpoints/definitions/memo_stakeholders_concerns.sysml +192 -0
  43. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +94 -6
  44. package/src/viewpoints/functional/functional_viewpoint.sysml +3 -4
  45. package/src/viewpoints/logical/logical_viewpoint.sysml +3 -4
  46. package/src/viewpoints/operational/operational_viewpoint.sysml +3 -4
  47. package/src/viewpoints/physical/physical_viewpoint.sysml +3 -4
  48. package/src/viewpoints/requirements/requirements_viewpoint.sysml +3 -4
  49. package/src/viewpoints/risk/risk_viewpoint.sysml +3 -4
  50. package/src/viewpoints/software/software_viewpoint.sysml +3 -4
  51. package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +3 -5
  52. package/src/viewpoints/usability/usability_viewpoint.sysml +3 -4
  53. package/src/viewpoints/verification/verification_viewpoint.sysml +3 -4
@@ -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
- // Standard SysML v2 activity sample (actionflow view kind, `afd` diagram type).
2
- //
3
- // The view over `activity_example::CustomerProcess`, the standard-SysML activity
4
- // fixture in `model/sysml_v2_activity_example.sysml`. It exists because the
5
- // fixture's whole point is the node types `action_flow_view.sysml` does not
6
- // have — decision, merge, fork, join, accept, send, terminate, and guarded
7
- // successions. Without a view exposing it the fixture parses into the model and
8
- // is never drawn, which is indistinguishable from a renderer that cannot draw
9
- // decisions.
10
- //
11
- // Nothing here specializes a MEMO kind: the fixture is plain standard SysML,
12
- // and that is the property under test. The renderer classifies its nodes from
13
- // the metamodel (`activity-notation.ts`), not from an ontology kind.
14
- package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_standard_activity_view {
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 standardActivityView : MemoDiagramView {
27
- expose CustomerProcess::**;
26
+ view orderFulfillmentActivity : MemoDiagramView {
27
+ expose FulfillOrder::**;
28
28
  attribute depth = 2;
29
- @MemoIdentity { :>> shortDescription = "Customer login, guarded validation, shopping loop, checkout, credit approval, and explicit completion outcomes."; }
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 = functionalViewpoint;
32
+ ref :>> viewpointDefinition = actionFlowViewpoint;
33
33
  }
34
34
  }
@@ -1,7 +1,7 @@
1
- // State transition sample (statetransition view kind, `stm` diagram type). A
2
- // behaviour machine owns its mode states by containing them, and each native
3
- // transition lives inside the state whose substates it connects.
4
- package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_state_transition_view {
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 sampleStateTransitionView : MemoDiagramView {
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 = functionalViewpoint;
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.
@@ -1,4 +1,4 @@
1
- package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_tree_view {
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-001";
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 sampleTreeView : MemoDiagramView {
36
+ view blockDecomposition : MemoDiagramView {
37
37
  expose rootA::**;
38
38
  attribute depth = 2;
39
- @MemoIdentity { :>> shortDescription = "One connected dummy hierarchy with varied branch depths for tree layout development."; }
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 = physicalViewpoint;
42
+ ref :>> viewpointDefinition = treeViewpoint;
43
43
  attribute :>> layoutHint = "tree";
44
44
  attribute :>> styleHint = "expanded:rootA,rootB,branchA1,branchB1";
45
45
  part :>> selectionQuery {
@@ -1,4 +1,4 @@
1
- package memo_examples_sysml_diagram_samples_viewpoints_unassigned_views_use_case_view {
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-001"; }
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-002"; }
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-003"; }
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-004"; }
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-005"; }
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
- view sampleUseCaseView : MemoDiagramView {
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 = operationalViewpoint;
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.11.2
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.11.2
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.11.2
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.11.2
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.11.2
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.11.2
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.11.2
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.11.2
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.11.2",
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.11.2
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
- ref referenceElement : MemoPart[1];
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
- part def FunctionalFlow specializes MemoPart {
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
- // What a rendered control and a physical one genuinely share: a label, an
119
- // accessibility story, and — when they annunciate — an alarm character.
120
- // The base exists so that the §18 traceability relations can type against
121
- // "something the user interacts with" rather than against software
122
- // specifically. Without it a use error on a knob would be unmodellable,
123
- // because ErrorAtElement would only accept a UIElement.
124
- abstract part def InteractionElement specializes MemoPart {
125
- attribute labelText : String;
126
- attribute accessibilitySummary : String;
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, InteractionElement {
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, InteractionElement {
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 def UIAction specializes MemoAction {
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 : InteractionElement :>> source;
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 : InteractionElement :>> target;
365
+ end element : MemoPart :>> target;
340
366
  }
341
367
  abstract connection errorAtElementLinks : ErrorAtElement[*];
342
368
  metadata def <errorAtElement> ErrorAtElementMetadata :> SemanticMetadata {