@memoarchitect/ontology 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +70 -0
  3. package/examples/gpca-pump/dhf/documents/DOC-RMP-001.md +210 -0
  4. package/examples/gpca-pump/memo.config.yaml +9 -0
  5. package/examples/gpca-pump/methodology/gpca_methodology.sysml +11 -0
  6. package/examples/gpca-pump/methodology/gpca_profiles.sysml +25 -0
  7. package/examples/gpca-pump/methodology/gpca_scope.sysml +25 -0
  8. package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +231 -0
  9. package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +272 -0
  10. package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +81 -0
  11. package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +363 -0
  12. package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +205 -0
  13. package/examples/gpca-pump/model/catalog/gpca_context.sysml +113 -0
  14. package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +172 -0
  15. package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +173 -0
  16. package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +1062 -0
  17. package/examples/gpca-pump/model/catalog/gpca_operational.sysml +209 -0
  18. package/examples/gpca-pump/model/catalog/gpca_physical.sysml +53 -0
  19. package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +1505 -0
  20. package/examples/gpca-pump/model/catalog/gpca_risk.sysml +744 -0
  21. package/examples/gpca-pump/model/catalog/gpca_system.sysml +144 -0
  22. package/examples/gpca-pump/model/catalog/gpca_trace.sysml +696 -0
  23. package/examples/gpca-pump/model/catalog/gpca_verification.sysml +285 -0
  24. package/examples/gpca-pump/model/samples/README.md +24 -0
  25. package/examples/gpca-pump/model/samples/action_flow_view.sysml +72 -0
  26. package/examples/gpca-pump/model/samples/action_flow_view.viewlayout +9 -0
  27. package/examples/gpca-pump/model/samples/functional_flow_view.sysml +153 -0
  28. package/examples/gpca-pump/model/samples/interconnection_view.sysml +93 -0
  29. package/examples/gpca-pump/model/samples/interconnection_view.viewlayout +99 -0
  30. package/examples/gpca-pump/model/samples/operational_behaviour_view.sysml +145 -0
  31. package/examples/gpca-pump/model/samples/tree_view.sysml +56 -0
  32. package/examples/gpca-pump/model/views/behavior_action_flow_view.sysml +41 -0
  33. package/examples/gpca-pump/model/views/context_system_context_view.sysml +43 -0
  34. package/examples/gpca-pump/model/views/cybersecurity_cybersecurity_view.sysml +44 -0
  35. package/examples/gpca-pump/model/views/document_architecture_description_view.sysml +29 -0
  36. package/examples/gpca-pump/model/views/document_cyber_assessment_view.sysml +28 -0
  37. package/examples/gpca-pump/model/views/document_dhf_index_view.sysml +29 -0
  38. package/examples/gpca-pump/model/views/document_hazard_analysis_view.sysml +29 -0
  39. package/examples/gpca-pump/model/views/document_rmf_view.sysml +29 -0
  40. package/examples/gpca-pump/model/views/document_sdd_view.sysml +29 -0
  41. package/examples/gpca-pump/model/views/document_threat_model_view.sysml +28 -0
  42. package/examples/gpca-pump/model/views/document_usability_view.sysml +28 -0
  43. package/examples/gpca-pump/model/views/document_vv_view.sysml +29 -0
  44. package/examples/gpca-pump/model/views/functional_function_allocation_view.sysml +42 -0
  45. package/examples/gpca-pump/model/views/functional_function_browser_view.sysml +41 -0
  46. package/examples/gpca-pump/model/views/logical_device_interconnect_view.sysml +43 -0
  47. package/examples/gpca-pump/model/views/logical_logical_architecture_view.sysml +42 -0
  48. package/examples/gpca-pump/model/views/logical_mode_state_view.sysml +42 -0
  49. package/examples/gpca-pump/model/views/logical_system_decomposition_view.sysml +44 -0
  50. package/examples/gpca-pump/model/views/operational_scenario_sequence_view.sysml +41 -0
  51. package/examples/gpca-pump/model/views/operational_use_case_view.sysml +43 -0
  52. package/examples/gpca-pump/model/views/physical_physical_bom_view.sysml +41 -0
  53. package/examples/gpca-pump/model/views/requirements_requirements_trace_view.sysml +42 -0
  54. package/examples/gpca-pump/model/views/risk_fmea_view.sysml +42 -0
  55. package/examples/gpca-pump/model/views/risk_risk_chain_view.sysml +44 -0
  56. package/examples/gpca-pump/model/views/software_software_architecture_view.sysml +43 -0
  57. package/examples/gpca-pump/model/views/verification_verification_coverage_view.sysml +42 -0
  58. package/memo.manifest.yaml +13 -0
  59. package/methodologies/default/memo.package.yaml +9 -0
  60. package/methodologies/gpca/memo.package.yaml +9 -0
  61. package/ontology/memo.package.yaml +8 -0
  62. package/ontology/memo.rendering.yaml +47 -0
  63. package/package.json +65 -0
  64. package/profile/archetypes.yaml +36 -0
  65. package/profile/memo.package.yaml +9 -0
  66. package/profile/templates/connected-device/starter.sysml +8 -0
  67. package/profile/templates/infusion-pump/starter.sysml +8 -0
  68. package/profile/templates/monitoring-device/starter.sysml +8 -0
  69. package/profile/templates/samd/starter.sysml +8 -0
  70. package/src/architecture/analysis/memo_fmea.sysml +91 -0
  71. package/src/architecture/assurance/memo_assurance.sysml +29 -0
  72. package/src/architecture/behavior/memo_behavior.sysml +65 -0
  73. package/src/architecture/constraints/memo_constraints.sysml +14 -0
  74. package/src/architecture/context/memo_context.sysml +58 -0
  75. package/src/architecture/cybersecurity/memo_cybersecurity.sysml +99 -0
  76. package/src/architecture/decisions/memo_decisions.sysml +12 -0
  77. package/src/architecture/functions/memo_functions.sysml +30 -0
  78. package/src/architecture/hardware_structure/memo_hardware_structure.sysml +15 -0
  79. package/src/architecture/interfaces/memo_interfaces.sysml +103 -0
  80. package/src/architecture/logical_structure/memo_logical_structure.sysml +10 -0
  81. package/src/architecture/operational/memo_operational.sysml +51 -0
  82. package/src/architecture/physical/memo_physical_architecture.sysml +19 -0
  83. package/src/architecture/requirements/memo_requirements.sysml +69 -0
  84. package/src/architecture/risk/memo_arch_risk.sysml +7 -0
  85. package/src/architecture/risk/memo_risk.sysml +80 -0
  86. package/src/architecture/software_structure/memo_software_structure.sysml +44 -0
  87. package/src/architecture/system/memo_system_analysis.sysml +54 -0
  88. package/src/artifacts/clinical_safety_report.sysml +12 -0
  89. package/src/artifacts/cybersecurity_assessment_report.sysml +12 -0
  90. package/src/artifacts/definitions/memo_artifact_definitions.sysml +12 -0
  91. package/src/artifacts/design_change_log.sysml +12 -0
  92. package/src/artifacts/design_history_file_index.sysml +12 -0
  93. package/src/artifacts/design_input_plan.sysml +12 -0
  94. package/src/artifacts/design_output_plan.sysml +12 -0
  95. package/src/artifacts/evidence_record.sysml +12 -0
  96. package/src/artifacts/failure_mode_effects_analysis.sysml +12 -0
  97. package/src/artifacts/hazard_analysis_report.sysml +12 -0
  98. package/src/artifacts/labeling_specification.sysml +12 -0
  99. package/src/artifacts/requirements_specification.sysml +12 -0
  100. package/src/artifacts/requirements_traceability_matrix.sysml +12 -0
  101. package/src/artifacts/risk_management_plan.sysml +12 -0
  102. package/src/artifacts/software_design_description.sysml +12 -0
  103. package/src/artifacts/software_development_plan.sysml +12 -0
  104. package/src/artifacts/soup_list.sysml +12 -0
  105. package/src/artifacts/system_architecture_description.sysml +12 -0
  106. package/src/artifacts/test_protocol.sysml +12 -0
  107. package/src/artifacts/test_report.sysml +12 -0
  108. package/src/artifacts/threat_model_report.sysml +12 -0
  109. package/src/artifacts/usability_engineering_report.sysml +12 -0
  110. package/src/compliance/artifacts/memo_artifacts.sysml +13 -0
  111. package/src/compliance/change/memo_change.sysml +17 -0
  112. package/src/compliance/dhf-templates/21cfr820/change-record.md +45 -0
  113. package/src/compliance/dhf-templates/21cfr820/design-input.md +67 -0
  114. package/src/compliance/dhf-templates/21cfr820/design-output.md +80 -0
  115. package/src/compliance/dhf-templates/21cfr820/design-review.md +51 -0
  116. package/src/compliance/dhf-templates/21cfr820/design-validation.md +64 -0
  117. package/src/compliance/dhf-templates/21cfr820/design-verification.md +57 -0
  118. package/src/compliance/dhf-templates/21cfr820/dhf-index.md +111 -0
  119. package/src/compliance/dhf-templates/21cfr820/transfer-plan.md +50 -0
  120. package/src/compliance/dhf-templates/21cfr820/user-needs.md +81 -0
  121. package/src/compliance/dhf-templates/21cfr820/vv-plan.md +89 -0
  122. package/src/compliance/dhf-templates/21cfr820/vv-report.md +85 -0
  123. package/src/compliance/dhf-templates/fda-cybersecurity/incident-response.md +66 -0
  124. package/src/compliance/dhf-templates/fda-cybersecurity/postmarket-surveillance.md +63 -0
  125. package/src/compliance/dhf-templates/fda-cybersecurity/security-arch.md +83 -0
  126. package/src/compliance/dhf-templates/fda-cybersecurity/threat-model.md +100 -0
  127. package/src/compliance/dhf-templates/fda-cybersecurity/vuln-assessment.md +77 -0
  128. package/src/compliance/dhf-templates/iec-62304/change-control.md +40 -0
  129. package/src/compliance/dhf-templates/iec-62304/detailed-design.md +69 -0
  130. package/src/compliance/dhf-templates/iec-62304/integration-test.md +68 -0
  131. package/src/compliance/dhf-templates/iec-62304/sad.md +115 -0
  132. package/src/compliance/dhf-templates/iec-62304/sbom.md +67 -0
  133. package/src/compliance/dhf-templates/iec-62304/sdp.md +108 -0
  134. package/src/compliance/dhf-templates/iec-62304/soup.md +77 -0
  135. package/src/compliance/dhf-templates/iec-62304/srs.md +138 -0
  136. package/src/compliance/dhf-templates/iec-62304/sw-traceability.md +111 -0
  137. package/src/compliance/dhf-templates/iec-62304/system-test.md +67 -0
  138. package/src/compliance/dhf-templates/iec-62366/formative-eval.md +47 -0
  139. package/src/compliance/dhf-templates/iec-62366/summative-eval.md +69 -0
  140. package/src/compliance/dhf-templates/iec-62366/task-analysis.md +57 -0
  141. package/src/compliance/dhf-templates/iec-62366/ue-plan.md +81 -0
  142. package/src/compliance/dhf-templates/iec-62366/ui-spec.md +61 -0
  143. package/src/compliance/dhf-templates/iec-62366/urra.md +74 -0
  144. package/src/compliance/dhf-templates/iec-62366/use-spec.md +61 -0
  145. package/src/compliance/dhf-templates/iso-14971/fmea.md +93 -0
  146. package/src/compliance/dhf-templates/iso-14971/fta.md +70 -0
  147. package/src/compliance/dhf-templates/iso-14971/har.md +165 -0
  148. package/src/compliance/dhf-templates/iso-14971/risk-benefit.md +51 -0
  149. package/src/compliance/dhf-templates/iso-14971/risk-matrix.md +51 -0
  150. package/src/compliance/dhf-templates/iso-14971/rmp.md +169 -0
  151. package/src/compliance/dhf-templates/iso-14971/rmr.md +101 -0
  152. package/src/compliance/dhf-templates/shared/snippets/approval-block.md +16 -0
  153. package/src/compliance/dhf-templates/shared/snippets/document-control-header.md +15 -0
  154. package/src/compliance/dhf-templates/shared/snippets/references-section.md +16 -0
  155. package/src/compliance/dhf-templates/shared/snippets/revision-history-table.md +11 -0
  156. package/src/compliance/document_views/memo_document_views.sysml +7 -0
  157. package/src/compliance/iso14971/risk_management_file.sysml +16 -0
  158. package/src/compliance/postmarket/memo_postmarket.sysml +16 -0
  159. package/src/core/common/memo_common.sysml +50 -0
  160. package/src/core/consistency_rules/consistency_rules.sysml +41 -0
  161. package/src/core/dimensions/dimensions.sysml +37 -0
  162. package/src/core/enumerations/memo_enumerations.sysml +562 -0
  163. package/src/core/methodology_scope/methodology_scope.sysml +46 -0
  164. package/src/core/relationships/memo_relationships.sysml +230 -0
  165. package/src/core/semantics/semantics.sysml +20 -0
  166. package/src/core/stdlib/collections.sysml +6 -0
  167. package/src/core/stdlib/functions.sysml +6 -0
  168. package/src/core/stdlib/scalars.sysml +6 -0
  169. package/src/core/stdlib/time.sysml +6 -0
  170. package/src/medical_device_library.sysml +100 -0
  171. package/src/memo_namespaces.sysml +668 -0
  172. package/src/methodology/LICENSES/MIT.txt +19 -0
  173. package/src/methodology/memo_archetypes.sysml +93 -0
  174. package/src/methodology/memo_core.sysml +53 -0
  175. package/src/methodology/memo_gates.sysml +11 -0
  176. package/src/methodology/memo_patterns.sysml +12 -0
  177. package/src/methodology/memo_profiles.sysml +218 -0
  178. package/src/methodology/memo_rules.sysml +15 -0
  179. package/src/methodology/memo_viewpoints.sysml +5 -0
  180. package/src/methodology/memo_workflow.sysml +14 -0
  181. package/src/rules/closure/closure_rules.sysml +180 -0
  182. package/src/rules/coverage/coverage_rules.sysml +258 -0
  183. package/src/rules/crosslayer/cross_layer_rules.sysml +38 -0
  184. package/src/rules/lifecycle/lifecycle_rules.sysml +41 -0
  185. package/src/rules/quantitative/quantitative_rules.sysml +34 -0
  186. package/src/viewpoints/clinical/clinical_evidence_view.sysml +13 -0
  187. package/src/viewpoints/clinical/clinical_viewpoint.sysml +25 -0
  188. package/src/viewpoints/context/context_viewpoint.sysml +25 -0
  189. package/src/viewpoints/context/system_context_view.sysml +29 -0
  190. package/src/viewpoints/cybersecurity/cybersecurity_assessment_view.sysml +13 -0
  191. package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +27 -0
  192. package/src/viewpoints/cybersecurity/threat_model_view.sysml +13 -0
  193. package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +82 -0
  194. package/src/viewpoints/functional/function_allocation_view.sysml +29 -0
  195. package/src/viewpoints/functional/functional_viewpoint.sysml +25 -0
  196. package/src/viewpoints/functional/system_functional_tree_view.sysml +29 -0
  197. package/src/viewpoints/logical/logical_architecture_view.sysml +29 -0
  198. package/src/viewpoints/logical/logical_viewpoint.sysml +25 -0
  199. package/src/viewpoints/operational/operational_viewpoint.sysml +25 -0
  200. package/src/viewpoints/operational/use_case_view.sysml +29 -0
  201. package/src/viewpoints/physical/network_topology_view.sysml +29 -0
  202. package/src/viewpoints/physical/physical_bom_view.sysml +29 -0
  203. package/src/viewpoints/physical/physical_viewpoint.sysml +25 -0
  204. package/src/viewpoints/requirements/requirements_traceability_view.sysml +29 -0
  205. package/src/viewpoints/requirements/requirements_viewpoint.sysml +25 -0
  206. package/src/viewpoints/risk/risk_chain_view.sysml +30 -0
  207. package/src/viewpoints/risk/risk_viewpoint.sysml +25 -0
  208. package/src/viewpoints/software/software_architecture_view.sysml +29 -0
  209. package/src/viewpoints/software/software_viewpoint.sysml +25 -0
  210. package/src/viewpoints/usability/usability_engineering_view.sysml +13 -0
  211. package/src/viewpoints/usability/usability_viewpoint.sysml +25 -0
  212. package/src/viewpoints/verification/verification_coverage_view.sysml +29 -0
  213. package/src/viewpoints/verification/verification_viewpoint.sysml +25 -0
  214. package/template/memo.package.yaml +5 -0
  215. package/template/src/catalog/starter.sysml +12 -0
  216. package/template/src/documents/.gitkeep +1 -0
  217. package/template/src/views/.gitkeep +1 -0
@@ -0,0 +1,113 @@
1
+ package memo_examples_gpca_pump_model_catalog_gpca_context {
2
+ private import ScalarValues::*;
3
+
4
+ private import memo_architecture_context::*;
5
+ private import memo_core_enumerations::*;
6
+
7
+ // ── Intended use (ISO 14971 §5.2, IEC 62366-1) ──────────────
8
+ part gpcaIntendedUse : IntendedUse {
9
+ attribute :>> id = "IU-001";
10
+ attribute :>> name = "GPCA_IntendedUse";
11
+ attribute :>> title = "GPCA Pump Intended Use";
12
+ attribute :>> shortDescription = "Patient-controlled analgesia infusion of prescribed opioid analgesics.";
13
+ attribute :>> longDescription = "The GPCA pump delivers a prescribed analgesic drug intravenously at a programmed basal rate, supplemented by square boluses delivered automatically at programmed intervals and by patient-requested bolus doses, subject to lockout intervals and maximum-dose limits.";
14
+ attribute :>> indication = "Management of acute post-operative or chronic pain requiring titrated intravenous opioid analgesia.";
15
+ attribute :>> contraindication = "Patients unable to comprehend or operate the bolus request mechanism; drugs without safe-value records in the hospital pharmacy database.";
16
+ attribute :>> patientPopulation = "Adult in-patients under clinical supervision.";
17
+ attribute :>> clinicalBenefit = "Timely, patient-titrated analgesia with lower total opioid consumption than fixed-schedule dosing.";
18
+ attribute :>> regulatoryClassification = "FDA Class II infusion pump (21 CFR 880.5725); IEC 62304 software safety class C.";
19
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §2.1-2.3 (GPCA overview, system functions, user characteristics)";
20
+ }
21
+
22
+ // ── Use contexts ────────────────────────────────────────────
23
+ part hospitalWardContext : UseContext {
24
+ attribute :>> id = "UC-001";
25
+ attribute :>> name = "HospitalWardUseContext";
26
+ attribute :>> careSetting = "acute-care hospital ward and post-anesthesia care unit";
27
+ attribute :>> environment = "indoor clinical environment, mains power with battery backup, pole or bed-rail mounted";
28
+ attribute :>> jurisdiction = "generic (FDA/EU reference model)";
29
+ attribute :>> connectedUse = true;
30
+ attribute :>> intendedUseReference = "IU-001";
31
+ }
32
+ // UC-002 (intra-hospital transport) removed: CriSys §2.4 states the
33
+ // system is used in a fixed location and is not ambulatory.
34
+
35
+ // ── Actors ──────────────────────────────────────────────────
36
+ part actorPatient : Actor {
37
+ attribute :>> id = "ACT-001";
38
+ attribute :>> name = "Patient";
39
+ attribute :>> actorKind = ActorKind::patient;
40
+ attribute :>> trainingLevel = "instructed by clinician on bolus request button only";
41
+ attribute :>> description = "Receives the infusion and requests bolus doses via the patient pendant.";
42
+ }
43
+ part actorNurse : Actor {
44
+ attribute :>> id = "ACT-002";
45
+ attribute :>> name = "ClinicianNurse";
46
+ attribute :>> actorKind = ActorKind::clinician;
47
+ attribute :>> trainingLevel = "trained clinical user; programs prescriptions and responds to alarms";
48
+ attribute :>> description = "Loads the drug reservoir, programs and confirms the prescription, starts/stops therapy, and responds to alarms.";
49
+ }
50
+ part actorPrescriber : Actor {
51
+ attribute :>> id = "ACT-003";
52
+ attribute :>> name = "PrescribingPhysician";
53
+ attribute :>> actorKind = ActorKind::clinician;
54
+ attribute :>> trainingLevel = "licensed prescriber";
55
+ attribute :>> description = "Prescribes drug, concentration, basal rate, bolus volume, lockout interval, and maximum dose limits.";
56
+ }
57
+ part actorPharmacist : Actor {
58
+ attribute :>> id = "ACT-004";
59
+ attribute :>> name = "Pharmacist";
60
+ attribute :>> actorKind = ActorKind::clinician;
61
+ attribute :>> trainingLevel = "licensed pharmacist";
62
+ attribute :>> description = "Prepares the drug reservoir and verifies drug and concentration against the prescription.";
63
+ }
64
+ part actorTechnician : Actor {
65
+ attribute :>> id = "ACT-005";
66
+ attribute :>> name = "BiomedicalTechnician";
67
+ attribute :>> actorKind = ActorKind::technician;
68
+ attribute :>> trainingLevel = "service-trained; authenticated service access";
69
+ attribute :>> description = "Performs maintenance, battery replacement, and calibration through the service interface.";
70
+ }
71
+
72
+ // ── Foreseeable use errors (IEC 62366-1, AAMI TIR PCA) ──────
73
+ part ueMisprogrammedRate : UseError {
74
+ attribute :>> id = "UE-001";
75
+ attribute :>> name = "MisprogrammedInfusionParameters";
76
+ attribute :>> errorCategory = UseErrorCategoryKind::actionCategory;
77
+ attribute :>> taskReference = "OA-003: Program prescription";
78
+ attribute :>> severity = SeverityKind::catastrophic;
79
+ attribute :>> rootCauseType = "decimal-point / unit entry slip during prescription programming";
80
+ attribute :>> description = "Clinician enters a basal rate or bolus volume an order of magnitude off (e.g. mg vs mL, misplaced decimal).";
81
+ attribute :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (incorrect dose settings)";
82
+ }
83
+ part ueBolusByProxy : UseError {
84
+ attribute :>> id = "UE-002";
85
+ attribute :>> name = "PCAByProxy";
86
+ attribute :>> errorCategory = UseErrorCategoryKind::cognition;
87
+ attribute :>> taskReference = "OA-005: Request patient bolus";
88
+ attribute :>> severity = SeverityKind::catastrophic;
89
+ attribute :>> rootCauseType = "family member or caregiver presses bolus button on behalf of a sedated patient";
90
+ attribute :>> description = "Bolus doses requested by someone other than the patient defeat the inherent safety of patient-limited dosing.";
91
+ attribute :>> sourceReference = "illustrative — no source";
92
+ }
93
+ part ueWrongDrugLoaded : UseError {
94
+ attribute :>> id = "UE-003";
95
+ attribute :>> name = "WrongDrugOrConcentrationLoaded";
96
+ attribute :>> errorCategory = UseErrorCategoryKind::cognition;
97
+ attribute :>> taskReference = "OA-002: Load drug reservoir";
98
+ attribute :>> severity = SeverityKind::catastrophic;
99
+ attribute :>> rootCauseType = "reservoir containing wrong drug or concentration mounted without verification";
100
+ attribute :>> description = "Loaded drug or concentration differs from the programmed prescription, so delivered dose differs from intended dose.";
101
+ attribute :>> sourceReference = "illustrative — no source";
102
+ }
103
+ part ueAlarmDisregard : UseError {
104
+ attribute :>> id = "UE-004";
105
+ attribute :>> name = "AlarmSilencedAndForgotten";
106
+ attribute :>> errorCategory = UseErrorCategoryKind::memoryRecall;
107
+ attribute :>> taskReference = "OA-006: Respond to alarm";
108
+ attribute :>> severity = SeverityKind::serious;
109
+ attribute :>> rootCauseType = "alarm silenced during high workload and the underlying condition never resolved";
110
+ attribute :>> description = "Clinician silences an alarm and does not return to resolve the underlying condition (e.g. occlusion), interrupting therapy.";
111
+ attribute :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (attentional/memory failure)";
112
+ }
113
+ }
@@ -0,0 +1,172 @@
1
+ package memo_examples_gpca_pump_model_catalog_gpca_cybersecurity {
2
+ private import ScalarValues::*;
3
+
4
+ private import memo_architecture_cybersecurity::*;
5
+ private import memo_architecture_requirements::*;
6
+ private import memo_architecture_risk_risk::*;
7
+ private import memo_architecture_assurance::*;
8
+ private import memo_core_enumerations::*;
9
+ private import memo_core_relationships::*;
10
+ private import memo_examples_gpca_pump_model_catalog_gpca_architecture::*;
11
+ private import memo_examples_gpca_pump_model_catalog_gpca_risk::*;
12
+ private import memo_examples_gpca_pump_model_catalog_gpca_requirements::*;
13
+ private import memo_examples_gpca_pump_model_catalog_gpca_verification::*;
14
+
15
+ part therapyConfigurationAsset : CybersecurityAsset {
16
+ attribute :>> id = "AST-CYB-001";
17
+ attribute :>> name = "TherapyConfigurationAsset";
18
+ attribute :>> assetKind = AssetKind::configuration;
19
+ attribute :>> confidentialityNeed = "medium";
20
+ attribute :>> integrityNeed = "very high";
21
+ attribute :>> availabilityNeed = "high";
22
+ attribute :>> privacyRelevant = false;
23
+ attribute :>> safetyRelevant = true;
24
+ attribute :>> owningLayer = "software_structure";
25
+ }
26
+
27
+ part patientEventLogAsset : CybersecurityAsset {
28
+ attribute :>> id = "AST-CYB-002";
29
+ attribute :>> name = "PatientEventLogAsset";
30
+ attribute :>> assetKind = AssetKind::auditRecord;
31
+ attribute :>> confidentialityNeed = "high";
32
+ attribute :>> integrityNeed = "high";
33
+ attribute :>> availabilityNeed = "medium";
34
+ attribute :>> privacyRelevant = true;
35
+ attribute :>> safetyRelevant = false;
36
+ attribute :>> owningLayer = "software_structure";
37
+ }
38
+
39
+ part maintenancePortBoundary : TrustBoundary {
40
+ attribute :>> id = "TB-001";
41
+ attribute :>> name = "MaintenancePortBoundary";
42
+ attribute :>> boundaryType = "service-access";
43
+ attribute :>> crossingConstraint = "Boundary between service tooling and therapy controller runtime.";
44
+ attribute :>> trustAssumption = "Service tooling on the untrusted side requires authentication before any crossing is permitted.";
45
+ }
46
+
47
+ part unauthorizedConfigChangeThreat : Threat {
48
+ attribute :>> id = "TH-001";
49
+ attribute :>> name = "UnauthorizedTherapyConfigurationChange";
50
+ attribute :>> driverKind = "cybersecurity";
51
+ attribute :>> threatCategory = ThreatCategoryKind::tampering;
52
+ attribute :>> attackVector = "maintenance port";
53
+ attribute :>> threatSource = "unauthorized actor with local access";
54
+ attribute :>> precondition = "maintenance interface exposed without strong authentication";
55
+ attribute :>> affectedConcern = ConcernKind::cybersecurity;
56
+ attribute :>> defaultTechnique = "STRIDE tampering";
57
+ }
58
+
59
+ part eventLogTamperingThreat : Threat {
60
+ attribute :>> id = "TH-002";
61
+ attribute :>> name = "PatientEventLogTampering";
62
+ attribute :>> driverKind = "cybersecurity";
63
+ attribute :>> threatCategory = ThreatCategoryKind::repudiation;
64
+ attribute :>> attackVector = "maintenance port";
65
+ attribute :>> threatSource = "unauthorized actor with local access";
66
+ attribute :>> precondition = "audit log writable without integrity protection";
67
+ attribute :>> affectedConcern = ConcernKind::cybersecurity;
68
+ attribute :>> defaultTechnique = "STRIDE repudiation";
69
+ }
70
+
71
+ part weakServiceAuthentication : Vulnerability {
72
+ attribute :>> id = "VULN-001";
73
+ attribute :>> name = "WeakServiceAuthentication";
74
+ attribute :>> weakness = "service mode relies on shared default credential";
75
+ attribute :>> exploitability = "moderate";
76
+ attribute :>> discoveryMethod = "architecture review";
77
+ attribute :>> affectedLayer = "software_structure";
78
+ attribute :>> cweReference = "CWE-798";
79
+ }
80
+
81
+ part tamperedConfigurationScenario : ThreatScenario {
82
+ attribute :>> id = "SCN-001";
83
+ attribute :>> name = "TamperedTherapyConfigurationScenario";
84
+ attribute :>> description = "An attacker with local access to the maintenance port alters lockout or dose parameters, aiming to bypass safety limits; may enable unsafe therapy delivery or bypass safeguards.";
85
+ attribute :>> actorDescription = "unauthorized actor with local access to the maintenance port";
86
+ attribute :>> defaultCategory = ThreatCategoryKind::tampering;
87
+ }
88
+
89
+ part unsafeDoseCyberHazard : CyberHazard {
90
+ attribute :>> id = "CHZ-001";
91
+ attribute :>> name = "UnsafeTherapyConfigurationHazard";
92
+ attribute :>> hazardType = HazardTypeKind::drugDeliveryError;
93
+ attribute :>> foreseeable = true;
94
+ attribute :>> securityImpact = "loss of configuration integrity";
95
+ attribute :>> safetyImpact = "unsafe dose delivery";
96
+ attribute :>> privacyImpact = "none";
97
+ attribute :>> operationalImpact = "therapy interruption or unsafe continuation";
98
+ }
99
+
100
+ part configurationTamperingRisk : CyberRisk {
101
+ attribute :>> id = "CRISK-001";
102
+ attribute :>> name = "ConfigurationTamperingRisk";
103
+ attribute :>> driverKind = "cyber risk";
104
+ attribute :>> probabilityEstimate = ProbabilityKind::occasional;
105
+ attribute :>> severityEstimate = SeverityKind::catastrophic;
106
+ attribute :>> riskLevel = CriticalityKind::high;
107
+ attribute :>> acceptability = RiskAcceptabilityKind::unacceptable;
108
+ attribute :>> exploitabilityEstimate = "moderate";
109
+ attribute :>> detectability = DetectionKind::low;
110
+ attribute :>> attackComplexity = "moderate with local access";
111
+ attribute :>> patientSafetyContribution = "Potential overdose if therapy limits are changed.";
112
+ }
113
+
114
+ part strongServiceAuthentication : CyberMitigation {
115
+ attribute :>> id = "CMIT-001";
116
+ attribute :>> name = "StrongServiceAuthenticationAndAudit";
117
+ attribute :>> controlKind = RiskControlKind::protectiveMeasure;
118
+ attribute :>> implementationKind = RiskControlImplementationKind::softwareDesign;
119
+ attribute :>> verificationStatus = "planned";
120
+ attribute :>> cyberControlKind = CyberControlKind::authentication;
121
+ attribute :>> securityMechanism = "authenticate, authorize, audit";
122
+ attribute :>> verificationExpectation = "verify only authenticated and integrity-protected configuration changes are accepted";
123
+ }
124
+
125
+ requirement reqAuthenticatedServiceAccess : SecurityRequirement {
126
+ attribute :>> id = "SREQ-001";
127
+ attribute :>> name = "AuthenticatedServiceAccess";
128
+ attribute :>> statement = "The system shall require authenticated and authorized service access before any therapy configuration parameter can be modified.";
129
+ attribute :>> sourceKind = RequirementSourceKind::risk;
130
+ attribute :>> concernKind = ConcernKind::cybersecurity;
131
+ attribute :>> status = RequirementStatusKind::approved;
132
+ attribute :>> acceptanceCriteria = "Unauthenticated or unauthorized attempts to modify therapy configuration are rejected and logged.";
133
+ attribute :>> subjectDescription = "maintenance and configuration path";
134
+ attribute :>> actorDescription = "service personnel";
135
+ attribute :>> assumptionSummary = "cryptographic identity available";
136
+ attribute :>> guaranteeSummary = "only authorized service access can change therapy configuration";
137
+ attribute :>> securityObjective = "integrity";
138
+ attribute :>> derivedFromThreat = "TH-001";
139
+ attribute :>> defaultConcern = ConcernKind::cybersecurity;
140
+ attribute :>> safetyClass = SafetyClassKind::C;
141
+ }
142
+
143
+ part vcAuthenticatedServiceAccess : VerificationCase {
144
+ attribute :>> id = "CVER-001";
145
+ attribute :>> name = "VerifyAuthenticatedServiceAccess";
146
+ attribute :>> methodKind = VerificationMethodKind::test;
147
+ attribute :>> acceptanceCriteria = "Only authenticated and authorized service sessions may modify therapy configuration; all attempts are logged.";
148
+ attribute :>> status = "planned";
149
+ }
150
+
151
+ connection : ThreatenedBy connect protectedAsset ::> therapyConfigurationAsset to realizedThreat ::> unauthorizedConfigChangeThreat;
152
+
153
+ connection : ThreatenedBy connect protectedAsset ::> patientEventLogAsset to realizedThreat ::> eventLogTamperingThreat;
154
+
155
+ connection : Exploits connect realizedThreat ::> unauthorizedConfigChangeThreat to enablingVulnerability ::> weakServiceAuthentication;
156
+
157
+ connection : RealizedByScenario connect realizedThreat ::> unauthorizedConfigChangeThreat to scenario ::> tamperedConfigurationScenario;
158
+
159
+ connection : MitigatesVulnerability connect enablingVulnerability ::> weakServiceAuthentication to mitigation ::> strongServiceAuthentication;
160
+
161
+ connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> unauthorizedConfigChangeThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
162
+
163
+ connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> eventLogTamperingThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
164
+
165
+ connection : ImpactsSafety connect cyberElement ::> configurationTamperingRisk to safetyElement ::> riskBefore;
166
+
167
+ connection : CrossesTrustBoundary connect boundary ::> maintenancePortBoundary to crossingItem ::> therapyConfigurationAsset;
168
+
169
+ connection : VerifiedBy connect verificationTarget ::> reqAuthenticatedServiceAccess to verificationCase ::> vcAuthenticatedServiceAccess;
170
+
171
+ connection : ProducesEvidence connect producer ::> vcAuthenticatedServiceAccess to producedEvidence ::> evidenceLockout;
172
+ }
@@ -0,0 +1,173 @@
1
+ package memo_examples_gpca_pump_model_catalog_gpca_formal_behavior {
2
+ private import ScalarValues::*;
3
+
4
+ private import memo_architecture_behavior::*;
5
+ private import memo_core_enumerations::*;
6
+
7
+ // ═════════════════════════════════════════════════════════════
8
+ // Formal assume/guarantee properties translated 1:1 from the
9
+ // CriSys AADL AGREE annexes (GPCA_SW.aadl composite contract;
10
+ // CITE-002) and the compositional verification package
11
+ // (CITE-003). Alarm responses bound flow to FlowRate_KVO —
12
+ // keep-vein-open — except empty reservoir, where the source
13
+ // guarantees zero flow.
14
+ // ═════════════════════════════════════════════════════════════
15
+ part gpcaSwContract : Contract {
16
+ attribute :>> id = "CTR-000";
17
+ attribute :>> name = "GpcaSwCompositeContract";
18
+ attribute :>> contractScope = "GPCA_SW (composite, verified compositionally over the 8 subcomponents)";
19
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
20
+ }
21
+ part topLevelContract : Contract {
22
+ attribute :>> id = "CTR-001";
23
+ attribute :>> name = "TopLevelModeContract";
24
+ attribute :>> contractScope = "Top_Level_Mode";
25
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, Top_Level_Mode.aadl AGREE annex";
26
+ }
27
+ part infusionManagerContract : Contract {
28
+ attribute :>> id = "CTR-002";
29
+ attribute :>> name = "InfusionManagerContract";
30
+ attribute :>> contractScope = "Infusion_Manager";
31
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, Infusion_Manager.aadl AGREE annex";
32
+ }
33
+ part alarmContract : Contract {
34
+ attribute :>> id = "CTR-003";
35
+ attribute :>> name = "AlarmContract";
36
+ attribute :>> contractScope = "Alarm";
37
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, Alarm.aadl AGREE annex";
38
+ }
39
+
40
+ // ── Assumptions (GPCA_SW.aadl) ──────────────────────────────
41
+ part assumeVtbiHighPositive : AssumeProperty {
42
+ attribute :>> id = "AP-002";
43
+ attribute :>> name = "VtbiHighPositive";
44
+ attribute :>> propertyKind = BehaviorPropertyKind::assumption;
45
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
46
+ attribute :>> formalExpression = "assume DB_IN.VTBI_High > 0";
47
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
48
+ }
49
+ part assumeEmptyReservoirPositive : AssumeProperty {
50
+ attribute :>> id = "AP-003";
51
+ attribute :>> name = "EmptyReservoirConstPositive";
52
+ attribute :>> propertyKind = BehaviorPropertyKind::assumption;
53
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
54
+ attribute :>> formalExpression = "assume CONST_IN.Empty_Reservoir > 0";
55
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
56
+ }
57
+ part assumeValidPrescriptionSaved : AssumeProperty {
58
+ attribute :>> id = "AP-001";
59
+ attribute :>> name = "ValidPrescriptionSavedBeforeTherapy";
60
+ attribute :>> propertyKind = BehaviorPropertyKind::assumption;
61
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
62
+ attribute :>> formalExpression = "assume a saved prescription is available before infusion initiation";
63
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 7)";
64
+ }
65
+
66
+ // ── Guarantees (GPCA_SW.aadl AGREE annex, 1:1) ──────────────
67
+ part guaranteeExclusiveMode : GuaranteeProperty {
68
+ attribute :>> id = "GP-001";
69
+ attribute :>> name = "ModeRange";
70
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
71
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
72
+ attribute :>> formalExpression = "guarantee mode_range: GPCA_SW_OUT.Current_System_Mode in {0, 1, 2, 3, 4, 6, 7, 8} (source enumeration omits 5)";
73
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (REQ 1)";
74
+ }
75
+ part guaranteeOffMode : GuaranteeProperty {
76
+ attribute :>> id = "GP-004";
77
+ attribute :>> name = "NotStartImpliesModeZero";
78
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
79
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
80
+ attribute :>> formalExpression = "guarantee not(OP_CMD_IN.System_Start) => GPCA_SW_OUT.Current_System_Mode = 0";
81
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
82
+ }
83
+ part guaranteeInitialStart : GuaranteeProperty {
84
+ attribute :>> id = "GP-005";
85
+ attribute :>> name = "InitialSystemStartImpliesModeOne";
86
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
87
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
88
+ attribute :>> formalExpression = "guarantee sys_initial and OP_CMD_IN.System_Start => GPCA_SW_OUT.Current_System_Mode = 1";
89
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (REQ 4 allocation: TLM System_Start -> System_On; IM System_On -> mode 1)";
90
+ }
91
+ part guaranteeOffToOn : GuaranteeProperty {
92
+ attribute :>> id = "GP-006";
93
+ attribute :>> name = "OffToOnImpliesModeOne";
94
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
95
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
96
+ attribute :>> formalExpression = "guarantee not(sys_initial) and pre(GPCA_SW_OUT.Current_System_Mode) = 0 and OP_CMD_IN.System_Start => GPCA_SW_OUT.Current_System_Mode = 1";
97
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (REQ 4)";
98
+ }
99
+ part guaranteeEmptyReservoirNoFlow : GuaranteeProperty {
100
+ attribute :>> id = "GP-007";
101
+ attribute :>> name = "EmptyReservoirImpliesNoFlow";
102
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
103
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
104
+ attribute :>> formalExpression = "guarantee (OP_CMD_IN.System_Start and pre(Current_System_Mode) > 1 and GPCA_SW_OUT.Reservoir_Volume < CONST_IN.Empty_Reservoir) => GPCA_SW_OUT.Commanded_Flow_Rate = 0";
105
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (REQ 59 'Empty Reservoir')";
106
+ }
107
+ part guaranteeVtbiKvo : GuaranteeProperty {
108
+ attribute :>> id = "GP-008";
109
+ attribute :>> name = "OverVtbiImpliesFlowAtMostKvo";
110
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
111
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
112
+ attribute :>> formalExpression = "guarantee (OP_CMD_IN.System_Start and pre(Current_System_Mode) > 1 and GPCA_SW_OUT.Volume_Infused > DB_IN.VTBI_High) => GPCA_SW_OUT.Commanded_Flow_Rate <= GPCA_SW_OUT.Flow_Rate_KVO";
113
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (over-infusion => keep-vein-open, not zero)";
114
+ }
115
+ part guaranteeAirInLineKvo : GuaranteeProperty {
116
+ attribute :>> id = "GP-009";
117
+ attribute :>> name = "AirInLineImpliesFlowAtMostKvo";
118
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
119
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
120
+ attribute :>> formalExpression = "guarantee (OP_CMD_IN.System_Start and SENSOR_IN.Air_In_Line) => GPCA_SW_OUT.Commanded_Flow_Rate <= GPCA_SW_OUT.Flow_Rate_KVO";
121
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex (REQ 21 'Air embolism')";
122
+ }
123
+ part guaranteeOcclusionKvo : GuaranteeProperty {
124
+ attribute :>> id = "GP-010";
125
+ attribute :>> name = "OcclusionImpliesFlowAtMostKvo";
126
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
127
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
128
+ attribute :>> formalExpression = "guarantee (OP_CMD_IN.System_Start and SENSOR_IN.Occlusion) => GPCA_SW_OUT.Commanded_Flow_Rate <= GPCA_SW_OUT.Flow_Rate_KVO";
129
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
130
+ }
131
+ part guaranteeDoorOpenKvo : GuaranteeProperty {
132
+ attribute :>> id = "GP-011";
133
+ attribute :>> name = "DoorOpenImpliesFlowAtMostKvo";
134
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
135
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
136
+ attribute :>> formalExpression = "guarantee (OP_CMD_IN.System_Start and SENSOR_IN.Door_Open) => GPCA_SW_OUT.Commanded_Flow_Rate <= GPCA_SW_OUT.Flow_Rate_KVO";
137
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl AGREE annex";
138
+ }
139
+ part guaranteeAlarmStopsSameStep : GuaranteeProperty {
140
+ attribute :>> id = "GP-003";
141
+ attribute :>> name = "SameStepAlarmKvoGuarantee";
142
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
143
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
144
+ attribute :>> formalExpression = "guarantee an infusion-inhibiting notification in a step implies Commanded_Flow_Rate <= Flow_Rate_KVO in the same step (ALARM_OUT -> IM.ALARM_IN is an immediate connection)";
145
+ attribute :>> sourceReference = "CITE-002: CriSys GPCA AADL v2.0, GPCA_SW.aadl (ALARM_to_IM immediate) with the flow <= KVO guarantees above";
146
+ }
147
+ part guaranteeLockoutPreventsBolus : GuaranteeProperty {
148
+ attribute :>> id = "GP-002";
149
+ attribute :>> name = "LockoutGuarantee";
150
+ attribute :>> propertyKind = BehaviorPropertyKind::guarantee;
151
+ attribute :>> languageKind = PropertyLanguageKind::agreeLike;
152
+ attribute :>> formalExpression = "guarantee a BolusRequest_prog inside the LockOutPeriod_pbolus_prog window is ignored and no PATIENT BOLUS is initiated";
153
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.1 (REQ 25.3, REQ 26)";
154
+ }
155
+
156
+ // ── Temporal properties over the mode machine ───────────────
157
+ part temporalNoInvalidTransition : BehaviorProperty {
158
+ attribute :>> id = "BP-010";
159
+ attribute :>> name = "NoInvalidTransition";
160
+ attribute :>> propertyKind = BehaviorPropertyKind::temporalProperty;
161
+ attribute :>> languageKind = PropertyLanguageKind::ltlLike;
162
+ attribute :>> formalExpression = "G(mode transitions follow only the edges of the Fig 4.1 hierarchy as constrained by REQ 4-5, 12-13, 19-23, 28-39, 46-47)";
163
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1 Fig 4.1";
164
+ }
165
+ part temporalPauseOnCriticalAlarm : BehaviorProperty {
166
+ attribute :>> id = "BP-011";
167
+ attribute :>> name = "PauseAtKvoOnInhibitingNotification";
168
+ attribute :>> propertyKind = BehaviorPropertyKind::safetyProperty;
169
+ attribute :>> languageKind = PropertyLanguageKind::ltlLike;
170
+ attribute :>> formalExpression = "G(infusion_inhibiting_notification -> X (mode = PAUSED and Commanded_Flow_Rate <= Flow_Rate_KVO))";
171
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 19-23) and §4.1.10.1 (REQ 43)";
172
+ }
173
+ }