@memoarchitect/ontology 0.6.3 → 0.6.5

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 (46) hide show
  1. package/README.md +25 -3
  2. package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +1 -1
  3. package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +148 -0
  4. package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +301 -0
  5. package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +229 -0
  6. package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +200 -0
  7. package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +188 -0
  8. package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +173 -0
  9. package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +180 -0
  10. package/examples/gpca-pump/analysis/Samples/README.md +37 -0
  11. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +21 -11
  12. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +1 -1
  13. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +7 -1
  14. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +1 -1
  15. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +34 -5
  16. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +104 -104
  17. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +9 -0
  18. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +36 -12
  19. package/examples/gpca-pump/model/views/logical_device_interconnect_view.sysml +3 -3
  20. package/examples/sysml-diagram-samples/model/samples/requirements_view.sysml +2 -2
  21. package/examples/sysml-diagram-samples/model/samples/use_case_view.sysml +4 -4
  22. package/methodologies/default/memo.package.yaml +1 -1
  23. package/methodologies/gpca/memo.package.yaml +1 -1
  24. package/ontology/memo.package.yaml +1 -1
  25. package/package.json +5 -3
  26. package/profile/memo.package.yaml +1 -1
  27. package/src/architecture/implementation/software/structure/memo_software_structure.sysml +3 -3
  28. package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
  29. package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +2 -2
  30. package/src/architecture/operational/context/use_context/memo_use_context.sysml +26 -1
  31. package/src/architecture/operational/scenarios/memo_scenarios.sysml +1 -1
  32. package/src/architecture/operational/use_cases/memo_use_cases.sysml +1 -1
  33. package/src/architecture/operational/workflows/memo_workflows.sysml +2 -2
  34. package/src/architecture/realization/deployment/memo_deployment.sysml +2 -2
  35. package/src/assurance/cybersecurity/memo_cybersecurity.sysml +0 -1
  36. package/src/assurance/requirements/memo_requirements.sysml +1 -1
  37. package/src/assurance/requirements/needs/memo_needs.sysml +1 -1
  38. package/src/compliance/artifacts/memo_artifacts.sysml +0 -1
  39. package/src/core/common/memo_common.sysml +3 -1
  40. package/src/core/enumerations/memo_enumerations.sysml +17 -1
  41. package/src/core/relationships/memo_relationships.sysml +9 -5
  42. package/src/memo_namespaces.sysml +2 -2
  43. package/src/methodology/profiles/memo_profiles.sysml +6 -22
  44. package/src/rules/ontology/ontology_invariants.sysml +13 -0
  45. package/src/viewpoints/context/context_viewpoint.sysml +10 -1
  46. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +2 -0
@@ -71,6 +71,15 @@ package memo_examples_gpca_pump_model_catalog_gpca_risk {
71
71
  attribute :>> year = "2009";
72
72
  }
73
73
 
74
+ part citeCriSysSoftwareBehavior : Citation {
75
+ attribute :>> id = "CITE-009";
76
+ attribute :>> name = "CriSysGpcaSoftwareBehaviorModel";
77
+ attribute :>> source = "PCA Pump Software Model (Simulink/Stateflow) — University of Minnesota CriSys";
78
+ attribute :>> section = "Infusion Pump Software Model Stateflow chart";
79
+ attribute :>> uri = "https://crisys.cs.umn.edu/downloads/gpca/PCA_Pump_SoftwareModel.mdl";
80
+ attribute :>> year = "undated";
81
+ }
82
+
74
83
  // ── Shared risk matrix ───────────────────────────────────────────
75
84
  part riskMatrix : RiskMatrix {
76
85
  attribute :>> id = "RMX-001";
@@ -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 participant ::> actorPatient to useCase ::> ucDeliverPcaTherapy;
61
- connection : ParticipatesIn connect participant ::> actorPrescriber to useCase ::> ucDeliverPcaTherapy;
62
- connection : ParticipatesIn connect participant ::> actorPharmacist to useCase ::> ucDeliverPcaTherapy;
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;
@@ -435,14 +435,38 @@ package memo_examples_gpca_pump_model_catalog_gpca_trace {
435
435
  connection : Composes connect parent ::> gpcaSoftware to child ::> portDbIn;
436
436
  connection : Composes connect parent ::> gpcaSoftware to child ::> portGpcaSwOut;
437
437
 
438
- // ── Device-boundary interconnect (GPCA_Device.aadl; CE-001..004,
439
- // CITE-002) — hardware ↔ software-port connection topology ──
440
- connection : ExchangesWith connect source ::> gpcaDeviceSensors to target ::> portSensorIn;
441
- connection : ExchangesWith connect source ::> portGpcaSwOut to target ::> pumpMotorAssembly;
442
- connection : ExchangesWith connect source ::> portGpcaSwOut to target ::> audibleAlarm;
443
- connection : ExchangesWith connect source ::> portGpcaSwOut to target ::> operatorDisplay;
444
- connection : ExchangesWith connect source ::> operatorKeypad to target ::> portPresIn;
445
- connection : ExchangesWith connect source ::> operatorKeypad to target ::> portOpCmdIn;
438
+ // ── Device/subsystem feature ownership (published AADL, 1:1) ──
439
+ connection : Composes connect parent ::> gpcaDevice to child ::> devOpCmdIn;
440
+ connection : Composes connect parent ::> gpcaDevice to child ::> devDbIn;
441
+ connection : Composes connect parent ::> gpcaDevice to child ::> devPresIn;
442
+ connection : Composes connect parent ::> gpcaDevice to child ::> devPatientIn;
443
+ connection : Composes connect parent ::> gpcaDevice to child ::> devGpcaOut;
444
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsOpCmdIn;
445
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsDbIn;
446
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsPresIn;
447
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsPatientIn;
448
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsOpCmdOut;
449
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsPresOut;
450
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsPatientOut;
451
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsSensorOut;
452
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsConstOut;
453
+ connection : Composes connect parent ::> gpcaDeviceSensors to child ::> snsDbOut;
454
+ connection : Composes connect parent ::> gpcaActuators to child ::> actGpcaSwIn;
455
+ connection : Composes connect parent ::> gpcaActuators to child ::> actGpcaOut;
456
+
457
+ // ── GPCA_Device.Impl connections (GPCA_Device.aadl, 1:1) ──
458
+ connection : ExchangesWith connect source ::> devOpCmdIn to target ::> snsOpCmdIn;
459
+ connection : ExchangesWith connect source ::> devDbIn to target ::> snsDbIn;
460
+ connection : ExchangesWith connect source ::> devPresIn to target ::> snsPresIn;
461
+ connection : ExchangesWith connect source ::> devPatientIn to target ::> snsPatientIn;
462
+ connection : ExchangesWith connect source ::> snsOpCmdOut to target ::> portOpCmdIn;
463
+ connection : ExchangesWith connect source ::> snsPresOut to target ::> portPresIn;
464
+ connection : ExchangesWith connect source ::> snsPatientOut to target ::> portPatientIn;
465
+ connection : ExchangesWith connect source ::> snsSensorOut to target ::> portSensorIn;
466
+ connection : ExchangesWith connect source ::> snsConstOut to target ::> portConstIn;
467
+ connection : ExchangesWith connect source ::> snsDbOut to target ::> portDbIn;
468
+ connection : ExchangesWith connect source ::> portGpcaSwOut to target ::> actGpcaSwIn;
469
+ connection : ExchangesWith connect source ::> actGpcaOut to target ::> devGpcaOut;
446
470
 
447
471
  // ── Risk chains (ISO 14971, GIIP causal-tree structure) ─────
448
472
  // Categorized causes converge on each hazard (GIIP Tables 2-9
@@ -19,8 +19,8 @@ package memo_examples_gpca_pump_model_views_logical_device_interconnect_view {
19
19
  attribute :>> id = "VIEW-LOG-003";
20
20
  attribute :>> name = "GPCA_DeviceInterconnectView";
21
21
  attribute :>> title = "GPCA Device Interconnect View";
22
- attribute :>> shortDescription = "Device-level interconnection: hardware assemblies wired to the software system's boundary ports.";
23
- attribute :>> longDescription = "Interconnection-kind view of the GPCA device per GPCA_Device.aadl: sensor and actuator assemblies, the GPCA software system with its seven AADL boundary ports (OP_CMD_IN, PRES_IN, PATIENT_IN, SENSOR_IN, CONST_IN, DB_IN, GPCA_SW_OUT) pinned on its boundary, the eight software subcomponents nested inside, and the ExchangesWith connection topology (device-boundary CE-001..004 plus the GPCA_SW.Impl internal connections). Rendered through the KK-3 Interconnection view template.";
22
+ attribute :>> shortDescription = "AADL device-level interconnection: GPCA_HW_Sensors, GPCA_SW, and GPCA_HW_Actuators with their declared boundary features.";
23
+ attribute :>> longDescription = "Source-faithful interconnection view of GPCA_Device.Impl: exactly the three AADL subcomponents (GPCA_HW_Sensors, GPCA_SW, GPCA_HW_Actuators), the device and subsystem boundary ports, and the twelve declared port connections. MEMO physical-design additions such as the controller board, power sources, enclosure, and individual sensors/actuators are intentionally excluded because the published AADL v2.0 model does not declare them as GPCA_Device.Impl subcomponents. Drill into GPCA_SW to inspect its eight subcomponents and 42 internal connections; use the connection-density control to switch between bundled summary and full fidelity.";
24
24
  attribute :>> outputKind = (ViewOutputKind::diagram);
25
25
  attribute :>> presentationKind = (PresentationKind::internalDiagram);
26
26
  attribute :>> viewKind = DiagramViewKind::interconnection;
@@ -32,7 +32,7 @@ package memo_examples_gpca_pump_model_views_logical_device_interconnect_view {
32
32
  part :>> selectionQuery {
33
33
  attribute :>> id = "QRY-LOG-003";
34
34
  attribute :>> name = "GPCA_DeviceInterconnectQuery";
35
- attribute :>> includeElementKinds = ("HardwareAssembly", "SoftwareSystem", "SoftwareModule", "SoftwarePort");
35
+ attribute :>> includeElementIds = ("gpcaDevice", "gpcaDeviceSensors", "gpcaSoftware", "gpcaActuators", "devOpCmdIn", "devDbIn", "devPresIn", "devPatientIn", "devGpcaOut", "snsOpCmdIn", "snsDbIn", "snsPresIn", "snsPatientIn", "snsOpCmdOut", "snsPresOut", "snsPatientOut", "snsSensorOut", "snsConstOut", "snsDbOut", "portOpCmdIn", "portPresIn", "portPatientIn", "portSensorIn", "portConstIn", "portDbIn", "portGpcaSwOut", "actGpcaSwIn", "actGpcaOut", "tlm", "systemStatus", "alarm", "config", "infusionMgr", "systemMonitor", "logging", "outputBus");
36
36
  attribute :>> includeRelationshipKinds = ("ExchangesWith", "Composes");
37
37
  attribute :>> includeLayers = ("logical_structure", "software_structure", "interfaces");
38
38
  attribute :>> selectionExpression = "product == 'GPCA'";
@@ -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 participant ::> patient to useCase ::> reviewStatus;
54
- connection : ParticipatesIn connect participant ::> patient to useCase ::> configureTherapy;
55
- connection : ParticipatesIn connect participant ::> serviceTechnician to useCase ::> maintainDevice;
56
- connection : ParticipatesIn connect participant ::> clinician to useCase ::> validateTherapySettings;
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/methodology-default"
2
- version: "0.6.2"
2
+ version: "0.6.4"
3
3
  type: methodology
4
4
  extends: "@memoarchitect/ontology"
5
5
  sysmlDir: "../../src/methodology"
@@ -1,5 +1,5 @@
1
1
  name: "@memoarchitect/methodology-gpca"
2
- version: "0.6.2"
2
+ version: "0.6.4"
3
3
  type: methodology
4
4
  extends: "@memoarchitect/methodology-default"
5
5
  sysmlDir: "../../examples/gpca-pump/methodology"
@@ -1,5 +1,5 @@
1
1
  name: "@memoarchitect/ontology"
2
- version: "0.6.2"
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,8 +1,8 @@
1
1
  {
2
2
  "name": "@memoarchitect/ontology",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "packageManager": "pnpm@9.15.0",
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).",
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
  "build": "bash scripts/build-kpar.sh",
8
8
  "check": "bash scripts/build-kpar.sh",
@@ -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"
@@ -1,5 +1,5 @@
1
1
  name: "@memoarchitect/medical-modeling-profile"
2
- version: "0.6.2"
2
+ version: "0.6.4"
3
3
  type: profile
4
4
  extends:
5
5
  - "@memoarchitect/ontology"
@@ -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 state : UIState;
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 concern : Concern;
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
- end target : MemoPart;
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 participant : Actor;
54
+ end participatingActor : Actor;
55
55
  end useCase : UseCase;
56
56
  }
57
57
  // UML use-case relationships. Includes establishes a decomposition level;
@@ -54,8 +54,8 @@ package memo_architecture_operational_workflows {
54
54
  // decision / fork / join / handoff.
55
55
  enum def ControlNodeKind {
56
56
  enum decision;
57
- enum fork;
58
- enum join;
57
+ enum 'fork';
58
+ enum 'join';
59
59
  enum handoff;
60
60
  }
61
61
 
@@ -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 flow : EndToEndFlow;
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 flow : EndToEndFlow;
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 status : RequirementStatusKind;
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), so the source stays at MemoPart
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 : VerifiableElement;
52
+ end targetRequirement;
51
53
  }
52
54
  connection def SatisfiedBy :> MemoRelationship {
53
- end requiredElement : VerifiableElement;
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
- end control : VerifiableElement;
71
- end mitigatedElement : MemoPart;
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 :>> includedLayer = "memo::architecture::functional";
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 :>> includedLayer = "memo::architecture::functional";
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 :>> includedArchLayer = "memo::architecture::functional";
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
 
@@ -19,6 +19,19 @@ package memo_rules_ontology {
19
19
  attribute predicateExpression = "acyclic(composes)";
20
20
  constraint { true }
21
21
  }
22
+ constraint def nestedPartConnectedRule {
23
+ attribute id = "AR-IBD-001";
24
+ attribute appliesTo = "MemoPart";
25
+ attribute severity = RuleSeverityKind::warning;
26
+ attribute rationaleText = "A structural part nested inside another part should expose at least one modeled interface connector. Passive or intentionally isolated parts may retain this warning with an explicit modelling rationale.";
27
+ attribute predicateExpression = "hasConnectorInComposition";
28
+ // Graph-aware structural rule, evaluated by Memo Architect's rule
29
+ // engine: it lifts port endpoints to their owning part, ignores
30
+ // composition/trace/deployment links, and includes a connected child's
31
+ // containing assemblies. The generic KerML expression evaluator cannot
32
+ // represent that transitive containment query.
33
+ constraint { true }
34
+ }
22
35
  constraint def connectorEndpointsExistRule {
23
36
  attribute id = "CR-ONT-002";
24
37
  attribute appliesTo = "ComponentExchange";
@@ -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
- attribute :>> allowedElementKinds = ("Actor", "UseContext", "IntendedUse", "ReasonablyForeseeableMisuse", "OperationalEntity", "TrustBoundary", "LogicalComponent");
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
  }
@@ -34,6 +34,7 @@ package memo_viewpoints_definitions {
34
34
 
35
35
  part def ViewSelectionQuery specializes MemoPart {
36
36
  attribute includeElementKinds : String[*];
37
+ attribute includeElementIds : String[*];
37
38
  attribute includeRelationshipKinds : String[*];
38
39
  attribute includeLayers : String[*];
39
40
  attribute includeConcerns : ConcernKind[*];
@@ -79,6 +80,7 @@ package memo_viewpoints_definitions {
79
80
 
80
81
  part def ViewInclusionRule specializes MemoPart {
81
82
  attribute includeElementKinds : String[*];
83
+ attribute includeElementIds : String[*];
82
84
  attribute includeRelationshipKinds : String[*];
83
85
  attribute includeLayers : String[*];
84
86
  attribute includeConcerns : ConcernKind[*];