@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,1505 @@
1
+ package memo_examples_gpca_pump_model_catalog_gpca_requirements {
2
+ private import ScalarValues::*;
3
+
4
+ private import memo_architecture_requirements::*;
5
+ private import memo_core_enumerations::*;
6
+
7
+ // ═════════════════════════════════════════════════════════════
8
+ // GPCA requirements layer.
9
+ //
10
+ // REQ-CS-01..86 mirror the CriSys GPCA System Requirements
11
+ // (Murugesan/Rayadurgam/Heimdahl 2013, CITE-001) 1:1 by number,
12
+ // organized by the source mode hierarchy. Formal macro/constant
13
+ // expressions from the source are carried in acceptanceCriteria.
14
+ //
15
+ // REQ-X-01..14 are MEMO methodology extensions (sourceKind =
16
+ // extension) that are NOT in the CriSys source; they showcase
17
+ // POST, watchdog, cross-check, and hardware requirements.
18
+ //
19
+ // CONST-01..22 model the App. A.4 constants (plus I 8 audio and
20
+ // Ch.5 retention durations) as first-class elements.
21
+ // NOTIF-01..20 model the REQ 59 notification action table.
22
+ // ═════════════════════════════════════════════════════════════
23
+
24
+ // ── Stakeholder needs ───────────────────────────────────────
25
+ requirement needSafeTherapy : StakeholderNeed {
26
+ attribute :>> id = "NEED-001"; attribute :>> name = "SafePatientControlledTherapy";
27
+ attribute :>> statement = "The device shall support safe patient controlled analgesic infusion therapy.";
28
+ attribute :>> priority = "high";
29
+ }
30
+ requirement needEffectiveAnalgesia : StakeholderNeed {
31
+ attribute :>> id = "NEED-002"; attribute :>> name = "EffectivePainManagement";
32
+ attribute :>> statement = "The device shall deliver the prescribed basal and bolus doses accurately so the patient receives effective analgesia.";
33
+ attribute :>> priority = "high";
34
+ }
35
+ requirement needTimelyAlarms : StakeholderNeed {
36
+ attribute :>> id = "NEED-003"; attribute :>> name = "TimelyAlarmNotification";
37
+ attribute :>> statement = "Clinicians shall be notified promptly and unambiguously of any condition that interrupts or endangers therapy.";
38
+ attribute :>> priority = "high";
39
+ }
40
+ requirement needAuditableRecord : StakeholderNeed {
41
+ attribute :>> id = "NEED-004"; attribute :>> name = "AuditableTherapyRecord";
42
+ attribute :>> statement = "All delivered doses, alarms, and prescription changes shall be reviewable after the fact.";
43
+ attribute :>> priority = "medium";
44
+ }
45
+
46
+ // ── System constants (CriSys App. A.4; I 8; Ch.5) ───────────
47
+ part constMaxRateofFlowChange : SystemConstant {
48
+ attribute :>> id = "CONST-01"; attribute :>> name = "Max_Rateof_Flow_Change";
49
+ attribute :>> symbol = "Max_Rateof_Flow_Change_const";
50
+ attribute :>> description = "Maximum rate of change of flow of drug in the hose.";
51
+ attribute :>> unit = "ml/sec2"; attribute :>> valueType = "Numeric";
52
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
53
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
54
+ }
55
+ part constMaxModeChangeDuration : SystemConstant {
56
+ attribute :>> id = "CONST-02"; attribute :>> name = "Max_Mode_Change_Duration";
57
+ attribute :>> symbol = "Max_Mode_Change_Duration_const";
58
+ attribute :>> description = "Maximum time to be taken for mode transition.";
59
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
60
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
61
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
62
+ }
63
+ part constConfigWarningDuration : SystemConstant {
64
+ attribute :>> id = "CONST-03"; attribute :>> name = "Config_Warning_Duration";
65
+ attribute :>> symbol = "Config_Warning_Duration_const";
66
+ attribute :>> description = "Recommended duration of prescription values configuration.";
67
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
68
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
69
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
70
+ }
71
+ part constMaxConfigDuration : SystemConstant {
72
+ attribute :>> id = "CONST-04"; attribute :>> name = "Max_Config_Duration";
73
+ attribute :>> symbol = "Max_Config_Duration_const";
74
+ attribute :>> description = "Maximum time allowed for configuration.";
75
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
76
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
77
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
78
+ }
79
+ part constMaxIdleDuration : SystemConstant {
80
+ attribute :>> id = "CONST-05"; attribute :>> name = "Max_IDLE_Duration";
81
+ attribute :>> symbol = "Max_IDLE_Duration_const";
82
+ attribute :>> description = "Maximum duration the system is allowed to be in IDLE mode continuously.";
83
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
84
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
85
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
86
+ }
87
+ part constMaxDurationUnderInfusion : SystemConstant {
88
+ attribute :>> id = "CONST-06"; attribute :>> name = "Max_Duration_UnderInfusion";
89
+ attribute :>> symbol = "Max_Duration_UnderInfusion_const";
90
+ attribute :>> description = "Maximum cumulative duration the system can infuse below the respective mode's flow rate minus Tolerance_Min_const in any delta time interval.";
91
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
92
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
93
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
94
+ }
95
+ part constMaxDurationOverInfusion : SystemConstant {
96
+ attribute :>> id = "CONST-07"; attribute :>> name = "Max_Duration_OverInfusion";
97
+ attribute :>> symbol = "Max_Duration_OverInfusion_const";
98
+ attribute :>> description = "Maximum cumulative duration the system can infuse above the respective mode's flow rate plus Tolerance_Min_const in any delta time interval.";
99
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
100
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
101
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
102
+ }
103
+ part constLowReservoir : SystemConstant {
104
+ attribute :>> id = "CONST-08"; attribute :>> name = "Low_Reservoir";
105
+ attribute :>> symbol = "Low_Reservoir_const";
106
+ attribute :>> description = "Volume in the drug reservoir that needs notification for Low Reservoir.";
107
+ attribute :>> unit = "ml"; attribute :>> valueType = "Numeric";
108
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "should be greater than Empty_Reservoir_const";
109
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
110
+ }
111
+ part constEmptyReservoir : SystemConstant {
112
+ attribute :>> id = "CONST-09"; attribute :>> name = "Empty_Reservoir";
113
+ attribute :>> symbol = "Empty_Reservoir_const";
114
+ attribute :>> description = "Volume in the drug reservoir that needs notification for Empty Reservoir.";
115
+ attribute :>> unit = "ml"; attribute :>> valueType = "Numeric";
116
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "should be greater than FlowRate_kvo_hd (as written in the source)";
117
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
118
+ }
119
+ part constSingleAirBubbleVolume : SystemConstant {
120
+ attribute :>> id = "CONST-10"; attribute :>> name = "Single_AirBubble_Volume";
121
+ attribute :>> symbol = "Single_AirBubble_Volume_const";
122
+ attribute :>> description = "Maximum volume of a single air bubble that is safe to be infused.";
123
+ attribute :>> unit = "ml"; attribute :>> valueType = "Numeric";
124
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
125
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
126
+ }
127
+ part constCumulativeAirBubbleVolume : SystemConstant {
128
+ attribute :>> id = "CONST-11"; attribute :>> name = "Cumulative_AirBubble_Volume";
129
+ attribute :>> symbol = "Cumulative_AirBubble_Volume_const";
130
+ attribute :>> description = "Maximum volume of air bubbles cumulatively in a delta time interval that is safe to be infused.";
131
+ attribute :>> unit = "ml"; attribute :>> valueType = "Numeric";
132
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
133
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
134
+ }
135
+ part constRevDeliveryContinuousDuration : SystemConstant {
136
+ attribute :>> id = "CONST-12"; attribute :>> name = "Rev_Delivery_Continuous_Duration";
137
+ attribute :>> symbol = "Rev_Delivery_Continuous_Duration_const";
138
+ attribute :>> description = "Maximum duration the system is acceptable to be in reverse delivery continuously.";
139
+ attribute :>> unit = "minutes"; attribute :>> valueType = "Time";
140
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
141
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
142
+ }
143
+ part constRevDeliveryCumulativeDuration : SystemConstant {
144
+ attribute :>> id = "CONST-13"; attribute :>> name = "Rev_Delivery_Cumulative_Duration";
145
+ attribute :>> symbol = "Rev_Delivery_Cumulative_Duration_const";
146
+ attribute :>> description = "Maximum duration the system is acceptable to be in reverse delivery cumulatively in a delta time interval.";
147
+ attribute :>> unit = "minutes"; attribute :>> valueType = "Time";
148
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
149
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
150
+ }
151
+ part constMaxPausedDuration : SystemConstant {
152
+ attribute :>> id = "CONST-14"; attribute :>> name = "Max_PAUSED_Duration";
153
+ attribute :>> symbol = "Max_PAUSED_Duration_const";
154
+ attribute :>> description = "Maximum duration the system is allowed to be in PAUSED mode continuously.";
155
+ attribute :>> unit = "sec"; attribute :>> valueType = "Time";
156
+ attribute :>> constantValue = ""; attribute :>> valueCondition = "value left open by the source";
157
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
158
+ }
159
+ part constToleranceMax : SystemConstant {
160
+ attribute :>> id = "CONST-15"; attribute :>> name = "Tolerance_Max";
161
+ attribute :>> symbol = "Tolerance_Max_const";
162
+ attribute :>> description = "Maximum acceptable variation in flow rate in any mode, specified as a percentage of the respective mode's flow rate.";
163
+ attribute :>> unit = "%"; attribute :>> valueType = "Positive Integer";
164
+ attribute :>> constantValue = "20 %"; attribute :>> valueCondition = "";
165
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
166
+ }
167
+ part constToleranceMin : SystemConstant {
168
+ attribute :>> id = "CONST-16"; attribute :>> name = "Tolerance_Min";
169
+ attribute :>> symbol = "Tolerance_Min_const";
170
+ attribute :>> description = "Tolerance in flow rate variation that is acceptable for a certain duration of time (Max_Duration_OverInfusion_const, Max_Duration_UnderInfusion_const); computed like Tolerance_Max_const.";
171
+ attribute :>> unit = "%"; attribute :>> valueType = "Positive Integer";
172
+ attribute :>> constantValue = "5 %"; attribute :>> valueCondition = "";
173
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
174
+ }
175
+ part constAudioLevel : SystemConstant {
176
+ attribute :>> id = "CONST-17"; attribute :>> name = "Audio_level";
177
+ attribute :>> symbol = "Audio_level_const";
178
+ attribute :>> description = "Acceptable level of sound for audio notification. Interface spec I 8 states 50 db for 2 seconds per notification; the App. A.4 value cell is inconsistent in the source (lists '5 %').";
179
+ attribute :>> unit = "decibels"; attribute :>> valueType = "Positive Integer";
180
+ attribute :>> constantValue = "50 db for 2 seconds per notification"; attribute :>> valueCondition = "";
181
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §3.4 (I 8) and App. A.4";
182
+ }
183
+ part constAudioEnableDuration : SystemConstant {
184
+ attribute :>> id = "CONST-18"; attribute :>> name = "Audio_Enable_Duration";
185
+ attribute :>> symbol = "Audio_Enable_Duration_const";
186
+ attribute :>> description = "Audio notification temporary silencing duration.";
187
+ attribute :>> unit = "minutes"; attribute :>> valueType = "Positive Integer";
188
+ attribute :>> constantValue = "30"; attribute :>> valueCondition = "";
189
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
190
+ }
191
+ part constLogInterval : SystemConstant {
192
+ attribute :>> id = "CONST-19"; attribute :>> name = "Log_Interval";
193
+ attribute :>> symbol = "Log_Interval_const";
194
+ attribute :>> description = "Interval at which operational information should be recorded.";
195
+ attribute :>> unit = "minutes"; attribute :>> valueType = "Positive Integer";
196
+ attribute :>> constantValue = "5"; attribute :>> valueCondition = "";
197
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), App. A.4";
198
+ }
199
+ part constErrorLogRetention : SystemConstant {
200
+ attribute :>> id = "CONST-20"; attribute :>> name = "Error_Log_Retention";
201
+ attribute :>> symbol = "Error_Log_Retention";
202
+ attribute :>> description = "Duration for which the most recent error log data shall persist (REQ 85).";
203
+ attribute :>> unit = "days"; attribute :>> valueType = "Time";
204
+ attribute :>> constantValue = "30"; attribute :>> valueCondition = "";
205
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 85)";
206
+ }
207
+ part constOperationalLogRetention : SystemConstant {
208
+ attribute :>> id = "CONST-21"; attribute :>> name = "Operational_Log_Retention";
209
+ attribute :>> symbol = "Operational_Log_Retention";
210
+ attribute :>> description = "Duration for which the most recent operational log data shall persist (REQ 85).";
211
+ attribute :>> unit = "days"; attribute :>> valueType = "Time";
212
+ attribute :>> constantValue = "15"; attribute :>> valueCondition = "";
213
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 85)";
214
+ }
215
+ part constPrescriptionPersistDuration : SystemConstant {
216
+ attribute :>> id = "CONST-22"; attribute :>> name = "Prescription_Persist_Duration";
217
+ attribute :>> symbol = "Prescription_Persist_Duration";
218
+ attribute :>> description = "Duration for which the last saved prescription data shall persist (REQ 86).";
219
+ attribute :>> unit = "days"; attribute :>> valueType = "Time";
220
+ attribute :>> constantValue = "15"; attribute :>> valueCondition = "";
221
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 86)";
222
+ }
223
+
224
+ // ── REQ 59 notification action table (20 notifications) ─────
225
+ // Priority High/Med/Low with actions Visual / Audio / Inhibit
226
+ // Infusion / Inhibit Square Bolus / Inhibit Patient Bolus /
227
+ // Stop Bolus, exactly as tabulated in the source. Order of
228
+ // restriction: Inhibit All Infusion > Inhibit Square Bolus >
229
+ // Inhibit Patient Bolus.
230
+ part notifLowReservoir : NotificationSpec {
231
+ attribute :>> id = "NOTIF-01"; attribute :>> name = "Low_Reservoir";
232
+ attribute :>> priority = NotificationPriorityKind::high;
233
+ attribute :>> visualNotification = true; attribute :>> audioNotification = false;
234
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = true;
235
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
236
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
237
+ }
238
+ part notifEmptyReservoir : NotificationSpec {
239
+ attribute :>> id = "NOTIF-02"; attribute :>> name = "Empty_Reservoir";
240
+ attribute :>> priority = NotificationPriorityKind::high;
241
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
242
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = true;
243
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
244
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
245
+ }
246
+ part notifAirEmbolism : NotificationSpec {
247
+ attribute :>> id = "NOTIF-03"; attribute :>> name = "Air_embolism";
248
+ attribute :>> priority = NotificationPriorityKind::high;
249
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
250
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = true;
251
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
252
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
253
+ }
254
+ part notifReverseDelivery : NotificationSpec {
255
+ attribute :>> id = "NOTIF-04"; attribute :>> name = "Reverse_Delivery";
256
+ attribute :>> priority = NotificationPriorityKind::high;
257
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
258
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = true;
259
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
260
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
261
+ }
262
+ part notifOverInfusionFlowRate : NotificationSpec {
263
+ attribute :>> id = "NOTIF-05"; attribute :>> name = "Over_Infusion_FlowRate";
264
+ attribute :>> priority = NotificationPriorityKind::high;
265
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
266
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = true;
267
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
268
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
269
+ }
270
+ part notifOverInfusionVtbi : NotificationSpec {
271
+ attribute :>> id = "NOTIF-06"; attribute :>> name = "Over_Infusion_VTBI";
272
+ attribute :>> priority = NotificationPriorityKind::high;
273
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
274
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = true;
275
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = true;
276
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
277
+ }
278
+ part notifBolusExceeded : NotificationSpec {
279
+ attribute :>> id = "NOTIF-07"; attribute :>> name = "Bolus_Exceeded";
280
+ attribute :>> priority = NotificationPriorityKind::medium;
281
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
282
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
283
+ attribute :>> inhibitPatientBolus = true; attribute :>> stopBolus = false;
284
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
285
+ }
286
+ part notifInfusionInhibited : NotificationSpec {
287
+ attribute :>> id = "NOTIF-08"; attribute :>> name = "Infusion_Inhibited";
288
+ attribute :>> priority = NotificationPriorityKind::medium;
289
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
290
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = false;
291
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = true;
292
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
293
+ }
294
+ part notifInfusionManuallyInhibited : NotificationSpec {
295
+ attribute :>> id = "NOTIF-09"; attribute :>> name = "Infusion_Manually_Inhibited";
296
+ attribute :>> priority = NotificationPriorityKind::medium;
297
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
298
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = false;
299
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = true;
300
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
301
+ }
302
+ part notifInfusionStoppedManually : NotificationSpec {
303
+ attribute :>> id = "NOTIF-10"; attribute :>> name = "Infusion_Stopped_Manually";
304
+ attribute :>> priority = NotificationPriorityKind::medium;
305
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
306
+ attribute :>> inhibitInfusion = true; attribute :>> inhibitSquareBolus = false;
307
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = true;
308
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
309
+ }
310
+ part notifUnderInfusionFlowRate : NotificationSpec {
311
+ attribute :>> id = "NOTIF-11"; attribute :>> name = "Under_Infusion_FlowRate";
312
+ attribute :>> priority = NotificationPriorityKind::medium;
313
+ attribute :>> visualNotification = true; attribute :>> audioNotification = false;
314
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
315
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
316
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
317
+ }
318
+ part notifUnderInfusionVtbi : NotificationSpec {
319
+ attribute :>> id = "NOTIF-12"; attribute :>> name = "Under_Infusion_VTBI";
320
+ attribute :>> priority = NotificationPriorityKind::medium;
321
+ attribute :>> visualNotification = true; attribute :>> audioNotification = false;
322
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
323
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
324
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
325
+ }
326
+ part notifInfusionComplete : NotificationSpec {
327
+ attribute :>> id = "NOTIF-13"; attribute :>> name = "Infusion_Complete";
328
+ attribute :>> priority = NotificationPriorityKind::low;
329
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
330
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
331
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
332
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
333
+ }
334
+ part notifFrequentBolusRequests : NotificationSpec {
335
+ attribute :>> id = "NOTIF-14"; attribute :>> name = "Frequent_Bolus_Requests";
336
+ attribute :>> priority = NotificationPriorityKind::low;
337
+ attribute :>> visualNotification = true; attribute :>> audioNotification = false;
338
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
339
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
340
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
341
+ }
342
+ part notifIdleTime : NotificationSpec {
343
+ attribute :>> id = "NOTIF-15"; attribute :>> name = "IDLE_Time";
344
+ attribute :>> priority = NotificationPriorityKind::low;
345
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
346
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
347
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
348
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
349
+ }
350
+ part notifPausedTime : NotificationSpec {
351
+ attribute :>> id = "NOTIF-16"; attribute :>> name = "PAUSED_Time";
352
+ attribute :>> priority = NotificationPriorityKind::low;
353
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
354
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
355
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
356
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
357
+ }
358
+ part notifConfigTime : NotificationSpec {
359
+ attribute :>> id = "NOTIF-17"; attribute :>> name = "Config_Time";
360
+ attribute :>> priority = NotificationPriorityKind::low;
361
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
362
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
363
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
364
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
365
+ }
366
+ part notifValidationFailed : NotificationSpec {
367
+ attribute :>> id = "NOTIF-18"; attribute :>> name = "Validation_Failed";
368
+ attribute :>> priority = NotificationPriorityKind::low;
369
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
370
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
371
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
372
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
373
+ }
374
+ part notifDrugSafeValueNotPresent : NotificationSpec {
375
+ attribute :>> id = "NOTIF-19"; attribute :>> name = "Drug_safe_value_not_present";
376
+ attribute :>> description = "Raised with the missing field names appended.";
377
+ attribute :>> priority = NotificationPriorityKind::low;
378
+ attribute :>> visualNotification = true; attribute :>> audioNotification = false;
379
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
380
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
381
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
382
+ }
383
+ part notifDrugDatabaseNotReachable : NotificationSpec {
384
+ attribute :>> id = "NOTIF-20"; attribute :>> name = "Drug_database_not_reachable";
385
+ attribute :>> priority = NotificationPriorityKind::low;
386
+ attribute :>> visualNotification = true; attribute :>> audioNotification = true;
387
+ attribute :>> inhibitInfusion = false; attribute :>> inhibitSquareBolus = false;
388
+ attribute :>> inhibitPatientBolus = false; attribute :>> stopBolus = false;
389
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 REQ 59 table";
390
+ }
391
+
392
+ // ═════ CriSys system requirements — §4.1.1 GPCA System ══════
393
+ requirement reqCs01 : SystemRequirement {
394
+ attribute :>> id = "REQ-CS-01"; attribute :>> name = "SingleActiveMode";
395
+ attribute :>> statement = "The system shall always be in only one of the following modes: OFF (default mode), IDLE, PAUSED, BASAL, SQUARE BOLUS or PATIENT BOLUS.";
396
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
397
+ attribute :>> concernKind = ConcernKind::safety;
398
+ attribute :>> status = RequirementStatusKind::approved;
399
+ attribute :>> acceptanceCriteria = "Mode output is always exactly one valid exclusive value.";
400
+ attribute :>> subjectDescription = "GPCA system";
401
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.1.1 (REQ 1)";
402
+ }
403
+ requirement reqCs02 : SystemRequirement {
404
+ attribute :>> id = "REQ-CS-02"; attribute :>> name = "ModeChangeDurationWithoutFlowChange";
405
+ attribute :>> statement = "If there are mode transitions without change in flow rates between the two modes, the system shall transition within Max_Mode_Change_Duration_const.";
406
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
407
+ attribute :>> concernKind = ConcernKind::performance;
408
+ attribute :>> status = RequirementStatusKind::approved;
409
+ attribute :>> acceptanceCriteria = "transition time <= Max_Mode_Change_Duration_const";
410
+ attribute :>> subjectDescription = "GPCA system";
411
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.1.1 (REQ 2)";
412
+ }
413
+ requirement reqCs03 : SystemRequirement {
414
+ attribute :>> id = "REQ-CS-03"; attribute :>> name = "ModeChangeFlowRamp";
415
+ attribute :>> statement = "If there are mode transitions with change in flow rates between the two modes, the system shall change from the current mode flow rate to the new mode flow rate at a rate not more than Max_Rateof_Flow_Change_const or within Max_Mode_Change_Duration_const, whichever achieves the new desired flow rate the quickest.";
416
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
417
+ attribute :>> concernKind = ConcernKind::performance;
418
+ attribute :>> status = RequirementStatusKind::approved;
419
+ attribute :>> acceptanceCriteria = "flow ramp rate <= Max_Rateof_Flow_Change_const OR transition time <= Max_Mode_Change_Duration_const (quickest wins)";
420
+ attribute :>> subjectDescription = "GPCA system";
421
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.1.1 (REQ 3)";
422
+ }
423
+ requirement reqCs04 : SystemRequirement {
424
+ attribute :>> id = "REQ-CS-04"; attribute :>> name = "OffToIdleOnSystemStart";
425
+ attribute :>> statement = "The system shall transition from OFF mode to ON > IDLE mode when System_start_prog is commanded. At this transition, the variables in App. A.4 shall be set to their default values.";
426
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
427
+ attribute :>> concernKind = ConcernKind::safety;
428
+ attribute :>> status = RequirementStatusKind::approved;
429
+ attribute :>> acceptanceCriteria = "System_start_prog in OFF => mode = ON > IDLE and A.4 variables at defaults";
430
+ attribute :>> subjectDescription = "GPCA system (OFF -> ON transition)";
431
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.1.2 (REQ 4)";
432
+ }
433
+ requirement reqCs05 : SystemRequirement {
434
+ attribute :>> id = "REQ-CS-05"; attribute :>> name = "OnToOffOnSystemStop";
435
+ attribute :>> statement = "While in ON mode, when System_stop_prog is commanded, the system shall stop infusion, cancel all notifications and transition to OFF mode.";
436
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
437
+ attribute :>> concernKind = ConcernKind::safety;
438
+ attribute :>> status = RequirementStatusKind::approved;
439
+ attribute :>> acceptanceCriteria = "System_stop_prog in ON => infusion stopped, active notifications cancelled, mode = OFF";
440
+ attribute :>> subjectDescription = "GPCA system (ON -> OFF transition)";
441
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.1.2 (REQ 5)";
442
+ }
443
+
444
+ // ── §4.1.2 OFF mode ─────────────────────────────────────────
445
+ requirement reqCs06 : SystemRequirement {
446
+ attribute :>> id = "REQ-CS-06"; attribute :>> name = "OffModeNoDelivery";
447
+ attribute :>> statement = "While in OFF mode, the system shall not deliver any drug.";
448
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
449
+ attribute :>> concernKind = ConcernKind::safety;
450
+ attribute :>> status = RequirementStatusKind::approved;
451
+ attribute :>> acceptanceCriteria = "FlowRate_output = 0";
452
+ attribute :>> subjectDescription = "OFF mode";
453
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.2.1 (REQ 6)";
454
+ }
455
+
456
+ // ── §4.1.3 ON mode ──────────────────────────────────────────
457
+ requirement reqCs07 : SystemRequirement {
458
+ attribute :>> id = "REQ-CS-07"; attribute :>> name = "InfusionRequiresSavedPrescription";
459
+ attribute :>> statement = "While in ON mode, the system shall allow initiation of infusion only when a saved prescription is available.";
460
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
461
+ attribute :>> concernKind = ConcernKind::safety;
462
+ attribute :>> status = RequirementStatusKind::approved;
463
+ attribute :>> acceptanceCriteria = "Infusion initiation is rejected when no saved prescription exists.";
464
+ attribute :>> subjectDescription = "ON mode";
465
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 7)";
466
+ }
467
+ requirement reqCs08 : SystemRequirement {
468
+ attribute :>> id = "REQ-CS-08"; attribute :>> name = "AllowDataConfigurationInOn";
469
+ attribute :>> statement = "While in ON mode, the system shall allow configuring (DataConfig_prog) new or saved prescription data and reservoir initial volume, as described in the Data Configuration Requirements (§4.2).";
470
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
471
+ attribute :>> concernKind = ConcernKind::usability;
472
+ attribute :>> status = RequirementStatusKind::approved;
473
+ attribute :>> acceptanceCriteria = "DataConfig_prog is accepted in ON mode and enters the §4.2 configuration flow.";
474
+ attribute :>> subjectDescription = "ON mode";
475
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 8)";
476
+ }
477
+ requirement reqCs09 : SystemRequirement {
478
+ attribute :>> id = "REQ-CS-09"; attribute :>> name = "PrescriptionDisplayAndConfirm";
479
+ attribute :>> statement = "While in ON mode, if Infusion_initiate_prog, the system shall display the saved prescription values and allow the clinician to confirm the prescription with another Infusion_initiate_prog.";
480
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
481
+ attribute :>> concernKind = ConcernKind::usability;
482
+ attribute :>> status = RequirementStatusKind::approved;
483
+ attribute :>> acceptanceCriteria = "First Infusion_initiate_prog displays saved values; therapy starts only after a second Infusion_initiate_prog.";
484
+ attribute :>> subjectDescription = "ON mode";
485
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 9)";
486
+ }
487
+ requirement reqCs10 : SystemRequirement {
488
+ attribute :>> id = "REQ-CS-10"; attribute :>> name = "AllowNotificationsInOn";
489
+ attribute :>> statement = "While in ON mode, the system shall allow visual and audio notification as described in §4.3.";
490
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
491
+ attribute :>> concernKind = ConcernKind::safety;
492
+ attribute :>> status = RequirementStatusKind::approved;
493
+ attribute :>> acceptanceCriteria = "Notification behaviors of §4.3 are available whenever the system is in ON mode.";
494
+ attribute :>> subjectDescription = "ON mode";
495
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 10)";
496
+ }
497
+ requirement reqCs11 : SystemRequirement {
498
+ attribute :>> id = "REQ-CS-11"; attribute :>> name = "AllowLoggingInOn";
499
+ attribute :>> statement = "While in ON mode, the system shall allow logging as described in §4.4.";
500
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
501
+ attribute :>> concernKind = ConcernKind::regulatory;
502
+ attribute :>> status = RequirementStatusKind::approved;
503
+ attribute :>> acceptanceCriteria = "Log behaviors of §4.4 are available whenever the system is in ON mode.";
504
+ attribute :>> subjectDescription = "ON mode";
505
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.1 (REQ 11)";
506
+ }
507
+ requirement reqCs12 : SystemRequirement {
508
+ attribute :>> id = "REQ-CS-12"; attribute :>> name = "ConfirmedInitiateStartsBasal";
509
+ attribute :>> statement = "While in ON mode, when the second Infusion_initiate_prog is commanded as per REQ 9 and Inhibited_Infusion_macro = FALSE, the system shall reset Actual_Infusion_Duration_macro = 0 and Actual_Volume_Infused_macro = 0 and shall transition to ON > THERAPY > ACTIVE > BASAL mode.";
510
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
511
+ attribute :>> concernKind = ConcernKind::safety;
512
+ attribute :>> status = RequirementStatusKind::approved;
513
+ attribute :>> acceptanceCriteria = "Actual_Infusion_Duration_macro = 0 AND Actual_Volume_Infused_macro = 0 AND mode = ON > THERAPY > ACTIVE > BASAL";
514
+ attribute :>> subjectDescription = "ON mode transitions";
515
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.2 (REQ 12)";
516
+ }
517
+ requirement reqCs13 : SystemRequirement {
518
+ attribute :>> id = "REQ-CS-13"; attribute :>> name = "ConfirmedInitiateWhileInhibitedPauses";
519
+ attribute :>> statement = "While in ON mode, when the second Infusion_initiate_prog is commanded as per REQ 9 and Inhibited_Infusion_macro = TRUE, the system shall reset Actual_Infusion_Duration_macro = 0 and Actual_Volume_Infused_macro = 0, shall transition to ON > THERAPY > PAUSED mode and perform actions as described in REQ 59 for 'Infusion Inhibited'.";
520
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
521
+ attribute :>> concernKind = ConcernKind::safety;
522
+ attribute :>> status = RequirementStatusKind::approved;
523
+ attribute :>> acceptanceCriteria = "Inhibited_Infusion_macro = TRUE => mode = ON > THERAPY > PAUSED and 'Infusion Inhibited' actions taken";
524
+ attribute :>> subjectDescription = "ON mode transitions";
525
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.3.2 (REQ 13)";
526
+ }
527
+
528
+ // ── §4.1.4 ON > IDLE mode ───────────────────────────────────
529
+ requirement reqCs14 : SystemRequirement {
530
+ attribute :>> id = "REQ-CS-14"; attribute :>> name = "IdleModeNoDelivery";
531
+ attribute :>> statement = "While in IDLE mode, the system shall not deliver any drug.";
532
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
533
+ attribute :>> concernKind = ConcernKind::safety;
534
+ attribute :>> status = RequirementStatusKind::approved;
535
+ attribute :>> acceptanceCriteria = "FlowRate_output = 0";
536
+ attribute :>> subjectDescription = "ON > IDLE mode";
537
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.4.1 (REQ 14)";
538
+ }
539
+ requirement reqCs15 : SystemRequirement {
540
+ attribute :>> id = "REQ-CS-15"; attribute :>> name = "IdleTimeNotification";
541
+ attribute :>> statement = "While in IDLE mode for more than Max_IDLE_Duration_const, the system shall take actions as defined in REQ 59 for 'IDLE Time'.";
542
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
543
+ attribute :>> concernKind = ConcernKind::safety;
544
+ attribute :>> status = RequirementStatusKind::approved;
545
+ attribute :>> acceptanceCriteria = "time in IDLE > Max_IDLE_Duration_const => 'IDLE Time' actions taken";
546
+ attribute :>> subjectDescription = "ON > IDLE mode";
547
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.4.1 (REQ 15)";
548
+ }
549
+
550
+ // ── §4.1.5 ON > THERAPY mode ────────────────────────────────
551
+ requirement reqCs16 : SystemRequirement {
552
+ attribute :>> id = "REQ-CS-16"; attribute :>> name = "TherapyDeliveryWithinTolerance";
553
+ attribute :>> statement = "While in THERAPY mode, the system shall deliver the drug as per the respective sub-mode's programmed flow rate, FlowRate_Mode_macro, within a tolerance of Tolerance_Max_const.";
554
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
555
+ attribute :>> concernKind = ConcernKind::safety;
556
+ attribute :>> status = RequirementStatusKind::approved;
557
+ attribute :>> acceptanceCriteria = "FlowRate_output < FlowRate_Mode_macro + Tolerance_Max_const";
558
+ attribute :>> subjectDescription = "ON > THERAPY mode";
559
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.1 (REQ 16)";
560
+ }
561
+ requirement reqCs17 : SystemRequirement {
562
+ attribute :>> id = "REQ-CS-17"; attribute :>> name = "UnderInfusionFlowRateNotification";
563
+ attribute :>> statement = "While in THERAPY mode, the system shall take actions as defined in REQ 59 for 'Under Infusion FlowRate' if the output flow rate falls below the mode flow rate beyond the tolerance windows.";
564
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
565
+ attribute :>> concernKind = ConcernKind::safety;
566
+ attribute :>> status = RequirementStatusKind::approved;
567
+ attribute :>> acceptanceCriteria = "FlowRate_output < FlowRate_Mode_macro - Tolerance_Min_const for more than Max_Duration_UnderInfusion_const OR FlowRate_output < FlowRate_Mode_macro - Tolerance_Max_const OR FlowRate_output < FlowRate_lo_hd";
568
+ attribute :>> subjectDescription = "ON > THERAPY mode";
569
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.1 (REQ 17)";
570
+ }
571
+ requirement reqCs18 : SystemRequirement {
572
+ attribute :>> id = "REQ-CS-18"; attribute :>> name = "LowReservoirNotification";
573
+ attribute :>> statement = "While in THERAPY mode, when the current volume of drug in the reservoir is less than Low_Reservoir_const, the system shall perform the actions defined in REQ 59 for 'Low Reservoir'.";
574
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
575
+ attribute :>> concernKind = ConcernKind::safety;
576
+ attribute :>> status = RequirementStatusKind::approved;
577
+ attribute :>> acceptanceCriteria = "reservoir volume < Low_Reservoir_const => 'Low Reservoir' actions taken";
578
+ attribute :>> subjectDescription = "ON > THERAPY mode";
579
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.1 (REQ 18)";
580
+ }
581
+ requirement reqCs19 : SystemRequirement {
582
+ attribute :>> id = "REQ-CS-19"; attribute :>> name = "OverInfusionFlowRatePause";
583
+ attribute :>> statement = "While in THERAPY mode, the system shall transition to PAUSED mode and perform the actions described in REQ 59 for 'Over Infusion FlowRate' if the output flow rate exceeds the mode flow rate beyond the tolerance windows.";
584
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
585
+ attribute :>> concernKind = ConcernKind::safety;
586
+ attribute :>> status = RequirementStatusKind::approved;
587
+ attribute :>> acceptanceCriteria = "FlowRate_output > FlowRate_Mode_macro + Tolerance_Min_const for more than Max_Duration_OverInfusion_const OR FlowRate_output > FlowRate_Mode_macro + Tolerance_Max_const OR FlowRate_output > FlowRate_hi_hd";
588
+ attribute :>> subjectDescription = "ON > THERAPY mode transitions";
589
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 19)";
590
+ }
591
+ requirement reqCs20 : SystemRequirement {
592
+ attribute :>> id = "REQ-CS-20"; attribute :>> name = "OverInfusionVtbiPause";
593
+ attribute :>> statement = "While in THERAPY mode, the system shall transition to PAUSED mode and take the actions described in REQ 59 for 'Over Infusion VTBI' if the actual volume infused exceeds the drug-database maximum VTBI.";
594
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
595
+ attribute :>> concernKind = ConcernKind::safety;
596
+ attribute :>> status = RequirementStatusKind::approved;
597
+ attribute :>> acceptanceCriteria = "Actual_Volume_Infused_macro > VTBI_hi_hd";
598
+ attribute :>> subjectDescription = "ON > THERAPY mode transitions";
599
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 20)";
600
+ }
601
+ requirement reqCs21 : SystemRequirement {
602
+ attribute :>> id = "REQ-CS-21"; attribute :>> name = "AirEmbolismPause";
603
+ attribute :>> statement = "While in THERAPY mode, the system shall transition to PAUSED mode and perform the actions defined in REQ 59 for 'Air embolism' if an air bubble of a volume larger than Single_AirBubble_Volume_const flows through the hose, or the sum of volume of all air bubbles flowing through the hose exceeds Cumulative_AirBubble_Volume_const for the same time interval defined for Cumulative_AirBubble_Volume_const.";
604
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
605
+ attribute :>> concernKind = ConcernKind::safety;
606
+ attribute :>> status = RequirementStatusKind::approved;
607
+ attribute :>> acceptanceCriteria = "single bubble volume > Single_AirBubble_Volume_const OR cumulative bubble volume > Cumulative_AirBubble_Volume_const";
608
+ attribute :>> subjectDescription = "ON > THERAPY mode transitions";
609
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 21)";
610
+ }
611
+ requirement reqCs22 : SystemRequirement {
612
+ attribute :>> id = "REQ-CS-22"; attribute :>> name = "ReverseDeliveryPause";
613
+ attribute :>> statement = "While in THERAPY mode, the system shall transition to PAUSED mode and perform actions defined in REQ 59 for 'Reverse Delivery' if there is continuous reverse delivery for more than Rev_Delivery_Continuous_Duration_const, or the cumulative time of all reverse delivery episodes exceeds Rev_Delivery_Cumulative_Duration_const.";
614
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
615
+ attribute :>> concernKind = ConcernKind::safety;
616
+ attribute :>> status = RequirementStatusKind::approved;
617
+ attribute :>> acceptanceCriteria = "continuous reverse delivery > Rev_Delivery_Continuous_Duration_const OR cumulative reverse delivery > Rev_Delivery_Cumulative_Duration_const";
618
+ attribute :>> subjectDescription = "ON > THERAPY mode transitions";
619
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 22)";
620
+ }
621
+ requirement reqCs23 : SystemRequirement {
622
+ attribute :>> id = "REQ-CS-23"; attribute :>> name = "EmptyReservoirPause";
623
+ attribute :>> statement = "While in THERAPY mode and if the volume of drug in the reservoir is less than Empty_Reservoir_const, the system shall transition to PAUSED mode and perform actions as listed in REQ 59 for 'Empty Reservoir'.";
624
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
625
+ attribute :>> concernKind = ConcernKind::safety;
626
+ attribute :>> status = RequirementStatusKind::approved;
627
+ attribute :>> acceptanceCriteria = "reservoir volume < Empty_Reservoir_const => mode = PAUSED and 'Empty Reservoir' actions taken";
628
+ attribute :>> subjectDescription = "ON > THERAPY mode transitions";
629
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.5.2 (REQ 23)";
630
+ }
631
+
632
+ // ── §4.1.6 ON > THERAPY > ACTIVE mode ───────────────────────
633
+ requirement reqCs24 : SystemRequirement {
634
+ attribute :>> id = "REQ-CS-24"; attribute :>> name = "SquareBolusAutoSchedule";
635
+ attribute :>> statement = "While in ACTIVE mode, the system shall schedule to start a SQUARE BOLUS every Interval_sbolus_prog and end after Duration_sbolus_prog during the Duration_total_prog.";
636
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
637
+ attribute :>> concernKind = ConcernKind::safety;
638
+ attribute :>> status = RequirementStatusKind::approved;
639
+ attribute :>> acceptanceCriteria = "Square boluses are auto-scheduled by the system every Interval_sbolus_prog for Duration_sbolus_prog; no external trigger is required.";
640
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode";
641
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.1 (REQ 24)";
642
+ }
643
+ requirement reqCs25 : SystemRequirement {
644
+ attribute :>> id = "REQ-CS-25"; attribute :>> name = "IgnorePatientBolusRequestConditions";
645
+ attribute :>> statement = "While in ACTIVE mode, when BolusRequest_prog, the system shall ignore the patient bolus request (BolusRequest_prog = FALSE) if: (1) Inhibited_Infusion_macro = TRUE, OR (2) Inhibited_PatientBolus_macro = TRUE, OR (3) the interval between the most recent PATIENT BOLUS mode end time and the current BolusRequest_prog time violates LockOutPeriod_pbolus_prog, OR (4) the total number of delivered patient boluses for the current prescription violates the programmed maximum number of patient boluses, OR (5) the system is currently in PATIENT BOLUS mode.";
646
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
647
+ attribute :>> concernKind = ConcernKind::safety;
648
+ attribute :>> status = RequirementStatusKind::approved;
649
+ attribute :>> acceptanceCriteria = "Source formal conditions: (3) (BolusRequest_prog time - most recent PATIENT BOLUS end time) > LockOutPeriod_pbolus_prog; (4) sum of occurrences of all PATIENT BOLUS modes > NumberMax_pbolus_prog (source prose and formal expressions are inconsistent; transcribed as written).";
650
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode";
651
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.1 (REQ 25)";
652
+ }
653
+ requirement reqCs26 : SystemRequirement {
654
+ attribute :>> id = "REQ-CS-26"; attribute :>> name = "FrequentBolusRequestsNotification";
655
+ attribute :>> statement = "While in ACTIVE mode, the system shall perform the actions described in REQ 59 for 'Frequent Bolus Requests' if the condition described in REQ 25.3 or REQ 25.5 occurs.";
656
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
657
+ attribute :>> concernKind = ConcernKind::safety;
658
+ attribute :>> status = RequirementStatusKind::approved;
659
+ attribute :>> acceptanceCriteria = "REQ 25 condition 3 or 5 => 'Frequent Bolus Requests' actions taken";
660
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode";
661
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.1 (REQ 26)";
662
+ }
663
+ requirement reqCs27 : SystemRequirement {
664
+ attribute :>> id = "REQ-CS-27"; attribute :>> name = "BolusExceededNotification";
665
+ attribute :>> statement = "While in ACTIVE mode, the system shall perform the actions described in REQ 59 for 'Bolus Exceeded' if the condition described in REQ 25.4 occurs.";
666
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
667
+ attribute :>> concernKind = ConcernKind::safety;
668
+ attribute :>> status = RequirementStatusKind::approved;
669
+ attribute :>> acceptanceCriteria = "REQ 25 condition 4 => 'Bolus Exceeded' actions taken";
670
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode";
671
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.1 (REQ 27)";
672
+ }
673
+ requirement reqCs28 : SystemRequirement {
674
+ attribute :>> id = "REQ-CS-28"; attribute :>> name = "InfusionCompleteToIdle";
675
+ attribute :>> statement = "While in ACTIVE mode, the system shall transition to IDLE and perform actions described in REQ 59 for 'Infusion Complete' if the actual duration of infusion is greater than or equal to the programmed prescription total duration, or the total volume infused is greater than or equal to the programmed prescription maximum VTBI.";
676
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
677
+ attribute :>> concernKind = ConcernKind::safety;
678
+ attribute :>> status = RequirementStatusKind::approved;
679
+ attribute :>> acceptanceCriteria = "Actual_Infusion_Duration_macro >= Duration_total_prog OR Actual_Volume_Infused_macro >= VTBI_total_prog";
680
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
681
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 28)";
682
+ }
683
+ requirement reqCs29 : SystemRequirement {
684
+ attribute :>> id = "REQ-CS-29"; attribute :>> name = "ManualInhibitToPaused";
685
+ attribute :>> statement = "While in ACTIVE mode, when Infusion_inhibit_prog, the system shall transition to PAUSED mode and perform actions described in REQ 59 for 'Infusion Manually Inhibited'.";
686
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
687
+ attribute :>> concernKind = ConcernKind::safety;
688
+ attribute :>> status = RequirementStatusKind::approved;
689
+ attribute :>> acceptanceCriteria = "Infusion_inhibit_prog => mode = PAUSED and 'Infusion Manually Inhibited' actions taken";
690
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
691
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 29)";
692
+ }
693
+ requirement reqCs30 : SystemRequirement {
694
+ attribute :>> id = "REQ-CS-30"; attribute :>> name = "AllInhibitedToPaused";
695
+ attribute :>> statement = "While in ACTIVE mode, when Inhibited_Infusion_macro = TRUE, Inhibited_Bolus_macro = TRUE and Inhibited_PatientBolus_macro = TRUE, the system shall transition to PAUSED mode.";
696
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
697
+ attribute :>> concernKind = ConcernKind::safety;
698
+ attribute :>> status = RequirementStatusKind::approved;
699
+ attribute :>> acceptanceCriteria = "Inhibited_Infusion_macro AND Inhibited_Bolus_macro AND Inhibited_PatientBolus_macro => mode = PAUSED";
700
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
701
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 30)";
702
+ }
703
+ requirement reqCs31 : SystemRequirement {
704
+ attribute :>> id = "REQ-CS-31"; attribute :>> name = "BasalToSquareBolus";
705
+ attribute :>> statement = "While in BASAL mode, when SQUARE BOLUS is initiated as described in REQ 24, the system shall transition to SQUARE BOLUS mode if (1) Inhibited_Bolus_macro = FALSE, AND (2) Inhibited_Infusion_macro = FALSE, AND (3) either there is no BolusRequest_prog, or there is a BolusRequest_prog and at least one of the conditions listed in REQ 25 is true.";
706
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
707
+ attribute :>> concernKind = ConcernKind::safety;
708
+ attribute :>> status = RequirementStatusKind::approved;
709
+ attribute :>> acceptanceCriteria = "NOT Inhibited_Bolus_macro AND NOT Inhibited_Infusion_macro AND (no BolusRequest_prog OR a REQ 25 ignore condition holds)";
710
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
711
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 31)";
712
+ }
713
+ requirement reqCs32 : SystemRequirement {
714
+ attribute :>> id = "REQ-CS-32"; attribute :>> name = "BasalToPatientBolus";
715
+ attribute :>> statement = "While in BASAL mode, the system shall transition to PATIENT BOLUS mode when BolusRequest_prog and none of the conditions listed in REQ 25 are true.";
716
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
717
+ attribute :>> concernKind = ConcernKind::safety;
718
+ attribute :>> status = RequirementStatusKind::approved;
719
+ attribute :>> acceptanceCriteria = "BolusRequest_prog AND no REQ 25 ignore condition holds => mode = PATIENT BOLUS";
720
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
721
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 32)";
722
+ }
723
+ requirement reqCs33 : SystemRequirement {
724
+ attribute :>> id = "REQ-CS-33"; attribute :>> name = "SquareBolusToPatientBolus";
725
+ attribute :>> statement = "While in SQUARE BOLUS mode, the system shall transition to PATIENT BOLUS mode if BolusRequest_prog and none of the conditions listed in REQ 25 are true.";
726
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
727
+ attribute :>> concernKind = ConcernKind::safety;
728
+ attribute :>> status = RequirementStatusKind::approved;
729
+ attribute :>> acceptanceCriteria = "BolusRequest_prog AND no REQ 25 ignore condition holds => mode = PATIENT BOLUS";
730
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
731
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 33)";
732
+ }
733
+ requirement reqCs34 : SystemRequirement {
734
+ attribute :>> id = "REQ-CS-34"; attribute :>> name = "SquareBolusToBasal";
735
+ attribute :>> statement = "While in SQUARE BOLUS mode, if Inhibited_Bolus_macro = TRUE or the SQUARE BOLUS is scheduled to end (as described in REQ 24), the system shall transition to BASAL mode if (1) Inhibited_Infusion_macro = FALSE, AND (2) there is no BolusRequest_prog, or BolusRequest_prog and at least one of the conditions listed in REQ 25 is true.";
736
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
737
+ attribute :>> concernKind = ConcernKind::safety;
738
+ attribute :>> status = RequirementStatusKind::approved;
739
+ attribute :>> acceptanceCriteria = "(Inhibited_Bolus_macro OR scheduled end) AND NOT Inhibited_Infusion_macro AND (no BolusRequest_prog OR a REQ 25 ignore condition holds) => mode = BASAL";
740
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
741
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 34)";
742
+ }
743
+ requirement reqCs35 : SystemRequirement {
744
+ attribute :>> id = "REQ-CS-35"; attribute :>> name = "PatientBolusToBasal";
745
+ attribute :>> statement = "While in PATIENT BOLUS mode, when Inhibited_PatientBolus_macro = TRUE or the total duration in the current PATIENT BOLUS mode is greater than or equal to Duration_pbolus_prog, the system shall stop the PATIENT BOLUS delivery and transition to BASAL mode if (1) Inhibited_Infusion_macro = FALSE, AND (2) no SQUARE BOLUS is scheduled to be in progress at the time of transition, OR (3) a SQUARE BOLUS is scheduled to be in progress at the time of transition and Inhibited_Bolus_macro = TRUE.";
746
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
747
+ attribute :>> concernKind = ConcernKind::safety;
748
+ attribute :>> status = RequirementStatusKind::approved;
749
+ attribute :>> acceptanceCriteria = "(Inhibited_PatientBolus_macro OR patient-bolus duration >= Duration_pbolus_prog) AND NOT Inhibited_Infusion_macro AND (no square bolus scheduled OR (square bolus scheduled AND Inhibited_Bolus_macro)) => mode = BASAL";
750
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
751
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 35)";
752
+ }
753
+ requirement reqCs36 : SystemRequirement {
754
+ attribute :>> id = "REQ-CS-36"; attribute :>> name = "PatientBolusToSquareBolus";
755
+ attribute :>> statement = "While in PATIENT BOLUS mode, when Inhibited_PatientBolus_macro = TRUE or the total duration in the current PATIENT BOLUS mode is greater than or equal to Duration_pbolus_prog, the system shall stop the PATIENT BOLUS delivery and transition to SQUARE BOLUS mode if (1) Inhibited_Infusion_macro = FALSE, AND (2) a SQUARE BOLUS is scheduled to be in progress at the time of transition, AND (3) Inhibited_Bolus_macro = FALSE.";
756
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
757
+ attribute :>> concernKind = ConcernKind::safety;
758
+ attribute :>> status = RequirementStatusKind::approved;
759
+ attribute :>> acceptanceCriteria = "(Inhibited_PatientBolus_macro OR patient-bolus duration >= Duration_pbolus_prog) AND NOT Inhibited_Infusion_macro AND square bolus scheduled AND NOT Inhibited_Bolus_macro => mode = SQUARE BOLUS";
760
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
761
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 36)";
762
+ }
763
+ requirement reqCs37 : SystemRequirement {
764
+ attribute :>> id = "REQ-CS-37"; attribute :>> name = "BasalToPauseOnInhibit";
765
+ attribute :>> statement = "While in BASAL mode, if Inhibited_Infusion_macro = TRUE, the system shall transition to PAUSE mode.";
766
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
767
+ attribute :>> concernKind = ConcernKind::safety;
768
+ attribute :>> status = RequirementStatusKind::approved;
769
+ attribute :>> acceptanceCriteria = "Inhibited_Infusion_macro => mode = PAUSED";
770
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
771
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 37)";
772
+ }
773
+ requirement reqCs38 : SystemRequirement {
774
+ attribute :>> id = "REQ-CS-38"; attribute :>> name = "PatientBolusToPauseOnInhibit";
775
+ attribute :>> statement = "While in PATIENT BOLUS mode, the system shall transition to PAUSE mode if Inhibited_PatientBolus_macro = TRUE and Inhibited_Infusion_macro = TRUE.";
776
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
777
+ attribute :>> concernKind = ConcernKind::safety;
778
+ attribute :>> status = RequirementStatusKind::approved;
779
+ attribute :>> acceptanceCriteria = "Inhibited_PatientBolus_macro AND Inhibited_Infusion_macro => mode = PAUSED";
780
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
781
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 38)";
782
+ }
783
+ requirement reqCs39 : SystemRequirement {
784
+ attribute :>> id = "REQ-CS-39"; attribute :>> name = "SquareBolusToPauseOnInhibit";
785
+ attribute :>> statement = "While in SQUARE BOLUS mode, the system shall transition to PAUSE mode if Inhibited_Bolus_macro = TRUE and Inhibited_Infusion_macro = TRUE.";
786
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
787
+ attribute :>> concernKind = ConcernKind::safety;
788
+ attribute :>> status = RequirementStatusKind::approved;
789
+ attribute :>> acceptanceCriteria = "Inhibited_Bolus_macro AND Inhibited_Infusion_macro => mode = PAUSED";
790
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE mode transitions";
791
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.6.2 (REQ 39)";
792
+ }
793
+
794
+ // ── §4.1.7–4.1.9 BASAL / SQUARE BOLUS / PATIENT BOLUS ───────
795
+ requirement reqCs40 : SystemRequirement {
796
+ attribute :>> id = "REQ-CS-40"; attribute :>> name = "BasalDeliveryRate";
797
+ attribute :>> statement = "While in BASAL mode, the system shall deliver the drug at a flow rate FlowRate_basal_prog with a variation up to Tolerance_Max_const.";
798
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
799
+ attribute :>> concernKind = ConcernKind::safety;
800
+ attribute :>> status = RequirementStatusKind::approved;
801
+ attribute :>> acceptanceCriteria = "FlowRate_output within Tolerance_Max_const of FlowRate_basal_prog";
802
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE > BASAL mode";
803
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.7.1 (REQ 40)";
804
+ }
805
+ requirement reqCs41 : SystemRequirement {
806
+ attribute :>> id = "REQ-CS-41"; attribute :>> name = "SquareBolusDeliveryRate";
807
+ attribute :>> statement = "While in SQUARE BOLUS mode, the system shall deliver the drug at a flow rate FlowRate_sbolus_prog with a variation up to Tolerance_Max_const.";
808
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
809
+ attribute :>> concernKind = ConcernKind::safety;
810
+ attribute :>> status = RequirementStatusKind::approved;
811
+ attribute :>> acceptanceCriteria = "FlowRate_output within Tolerance_Max_const of FlowRate_sbolus_prog";
812
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE > SQUARE BOLUS mode";
813
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.8.1 (REQ 41)";
814
+ }
815
+ requirement reqCs42 : SystemRequirement {
816
+ attribute :>> id = "REQ-CS-42"; attribute :>> name = "PatientBolusDeliveryRate";
817
+ attribute :>> statement = "While in PATIENT BOLUS mode, the system shall deliver the drug at a flow rate FlowRate_pbolus_prog with a variation up to Tolerance_Max_const.";
818
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
819
+ attribute :>> concernKind = ConcernKind::safety;
820
+ attribute :>> status = RequirementStatusKind::approved;
821
+ attribute :>> acceptanceCriteria = "FlowRate_output within Tolerance_Max_const of FlowRate_pbolus_prog";
822
+ attribute :>> subjectDescription = "ON > THERAPY > ACTIVE > PATIENT BOLUS mode";
823
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.9.1 (REQ 42)";
824
+ }
825
+
826
+ // ── §4.1.10 ON > THERAPY > PAUSED mode ──────────────────────
827
+ requirement reqCs43 : SystemRequirement {
828
+ attribute :>> id = "REQ-CS-43"; attribute :>> name = "PausedKvoDelivery";
829
+ attribute :>> statement = "While in PAUSED mode, the system shall allow drug infusion at a flow rate FlowRate_kvo_hd with a variation up to Tolerance_Max_const, to keep the vein open when infusion is paused.";
830
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
831
+ attribute :>> concernKind = ConcernKind::safety;
832
+ attribute :>> status = RequirementStatusKind::approved;
833
+ attribute :>> acceptanceCriteria = "FlowRate_Mode_macro = FlowRate_kvo_hd; FlowRate_output within Tolerance_Max_const of FlowRate_kvo_hd (KVO flow, not zero)";
834
+ attribute :>> subjectDescription = "ON > THERAPY > PAUSED mode";
835
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.10.1 (REQ 43)";
836
+ }
837
+ requirement reqCs44 : SystemRequirement {
838
+ attribute :>> id = "REQ-CS-44"; attribute :>> name = "PausedTimeNotification";
839
+ attribute :>> statement = "While in PAUSED mode for more than Max_PAUSED_Duration_const, the system shall perform actions as described in REQ 59 for 'PAUSED Time'.";
840
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
841
+ attribute :>> concernKind = ConcernKind::safety;
842
+ attribute :>> status = RequirementStatusKind::approved;
843
+ attribute :>> acceptanceCriteria = "time in PAUSED > Max_PAUSED_Duration_const => 'PAUSED Time' actions taken";
844
+ attribute :>> subjectDescription = "ON > THERAPY > PAUSED mode";
845
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.10.1 (REQ 44)";
846
+ }
847
+ requirement reqCs45 : SystemRequirement {
848
+ attribute :>> id = "REQ-CS-45"; attribute :>> name = "PausedInitiateWhileInhibitedNoTransition";
849
+ attribute :>> statement = "While in PAUSED mode, when Infusion_initiate_prog and Inhibited_Infusion_macro = TRUE, the system shall not perform any transition.";
850
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
851
+ attribute :>> concernKind = ConcernKind::safety;
852
+ attribute :>> status = RequirementStatusKind::approved;
853
+ attribute :>> acceptanceCriteria = "Infusion_initiate_prog AND Inhibited_Infusion_macro => mode unchanged";
854
+ attribute :>> subjectDescription = "ON > THERAPY > PAUSED mode";
855
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.10.1 (REQ 45)";
856
+ }
857
+ requirement reqCs46 : SystemRequirement {
858
+ attribute :>> id = "REQ-CS-46"; attribute :>> name = "PausedResumeToBasal";
859
+ attribute :>> statement = "While in PAUSED mode, when Infusion_initiate_prog and Inhibited_Infusion_macro = FALSE, the system shall transition to ON > THERAPY > ACTIVE > BASAL mode.";
860
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
861
+ attribute :>> concernKind = ConcernKind::safety;
862
+ attribute :>> status = RequirementStatusKind::approved;
863
+ attribute :>> acceptanceCriteria = "Infusion_initiate_prog AND NOT Inhibited_Infusion_macro => mode = ON > THERAPY > ACTIVE > BASAL";
864
+ attribute :>> subjectDescription = "ON > THERAPY > PAUSED mode transitions";
865
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.10.2 (REQ 46)";
866
+ }
867
+ requirement reqCs47 : SystemRequirement {
868
+ attribute :>> id = "REQ-CS-47"; attribute :>> name = "PausedInhibitToIdle";
869
+ attribute :>> statement = "While in PAUSED mode, when Infusion_inhibit_prog, the system shall transition to ON > IDLE mode and perform actions as described in REQ 59 for 'Infusion Stopped Manually'.";
870
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
871
+ attribute :>> concernKind = ConcernKind::safety;
872
+ attribute :>> status = RequirementStatusKind::approved;
873
+ attribute :>> acceptanceCriteria = "Infusion_inhibit_prog => mode = ON > IDLE and 'Infusion Stopped Manually' actions taken";
874
+ attribute :>> subjectDescription = "ON > THERAPY > PAUSED mode transitions";
875
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.1.10.2 (REQ 47)";
876
+ }
877
+
878
+ // ═════ §4.2 Data Configuration Requirements ═════════════════
879
+ requirement reqCs48 : SystemRequirement {
880
+ attribute :>> id = "REQ-CS-48"; attribute :>> name = "DisplaySavedPrescriptionOnConfig";
881
+ attribute :>> statement = "When in ON mode, if DataConfig_prog as described in REQ 8, the system shall display the saved prescription and reservoir initial volume values or their default values (if there are no saved prescription and reservoir initial volume values) in the order listed in §3.1.1 and §3.1.3.";
882
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
883
+ attribute :>> concernKind = ConcernKind::usability;
884
+ attribute :>> status = RequirementStatusKind::approved;
885
+ attribute :>> acceptanceCriteria = "Displayed values equal saved values (or defaults) in the interface-specified order.";
886
+ attribute :>> subjectDescription = "Data configuration";
887
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 48)";
888
+ }
889
+ requirement reqCs49 : SystemRequirement {
890
+ attribute :>> id = "REQ-CS-49"; attribute :>> name = "EditValuesOneAtATime";
891
+ attribute :>> statement = "When the prescription and reservoir initial volume data are displayed as described in REQ 48, the system shall allow editing the values one at a time in the order they are displayed.";
892
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
893
+ attribute :>> concernKind = ConcernKind::usability;
894
+ attribute :>> status = RequirementStatusKind::approved;
895
+ attribute :>> acceptanceCriteria = "Exactly one value is editable at a time, in display order.";
896
+ attribute :>> subjectDescription = "Data configuration";
897
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 49)";
898
+ }
899
+ requirement reqCs50 : SystemRequirement {
900
+ attribute :>> id = "REQ-CS-50"; attribute :>> name = "AllowInitiateWithNewValues";
901
+ attribute :>> statement = "When the values are modified as described in REQ 49, the system shall allow infusion initiation with the new set of values (Infusion_initiate_prog).";
902
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
903
+ attribute :>> concernKind = ConcernKind::usability;
904
+ attribute :>> status = RequirementStatusKind::approved;
905
+ attribute :>> acceptanceCriteria = "Infusion_initiate_prog is accepted with the modified value set.";
906
+ attribute :>> subjectDescription = "Data configuration";
907
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 50)";
908
+ }
909
+ requirement reqCs51 : SystemRequirement {
910
+ attribute :>> id = "REQ-CS-51"; attribute :>> name = "ValidateValuesOnInitiate";
911
+ attribute :>> statement = "When Infusion_initiate_prog as described in REQ 50, the system shall validate if all the values are consistent with the conditions specified in their respective Type Condition fields in §3.1.1 and §3.1.3.";
912
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
913
+ attribute :>> concernKind = ConcernKind::safety;
914
+ attribute :>> status = RequirementStatusKind::approved;
915
+ attribute :>> acceptanceCriteria = "Every entered value satisfies its Type Condition constraints before saving.";
916
+ attribute :>> subjectDescription = "Data configuration";
917
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 51)";
918
+ }
919
+ requirement reqCs52 : SystemRequirement {
920
+ attribute :>> id = "REQ-CS-52"; attribute :>> name = "DrugDatabaseNotReachable";
921
+ attribute :>> statement = "When the system is validating data as described in REQ 51, if the system is unable to access the drug database safe values, the system shall not save the values and perform actions as described in REQ 59 for 'Drug database not reachable'.";
922
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
923
+ attribute :>> concernKind = ConcernKind::safety;
924
+ attribute :>> status = RequirementStatusKind::approved;
925
+ attribute :>> acceptanceCriteria = "Database unreachable => values not saved and 'Drug database not reachable' actions taken";
926
+ attribute :>> subjectDescription = "Data configuration";
927
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 52)";
928
+ }
929
+ requirement reqCs53 : SystemRequirement {
930
+ attribute :>> id = "REQ-CS-53"; attribute :>> name = "DrugSafeValueNotPresent";
931
+ attribute :>> statement = "When the system is validating data as described in REQ 51, if any of the drug database safe values listed in §3.5 is not present, the system shall not perform the validation with respect to that missing field, perform actions as described in REQ 59 for 'Drug safe value not present' and continue validation.";
932
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
933
+ attribute :>> concernKind = ConcernKind::safety;
934
+ attribute :>> status = RequirementStatusKind::approved;
935
+ attribute :>> acceptanceCriteria = "Missing safe value => that field's validation skipped, 'Drug safe value not present' actions taken, validation continues";
936
+ attribute :>> subjectDescription = "Data configuration";
937
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 53)";
938
+ }
939
+ requirement reqCs54 : SystemRequirement {
940
+ attribute :>> id = "REQ-CS-54"; attribute :>> name = "SaveValidatedPrescription";
941
+ attribute :>> statement = "If there are no notifications from REQ 51 and REQ 52, the system shall save the prescription values, clear all the notifications previously generated by REQ 51, REQ 52 and REQ 53 if any, and allow initiate infusion with the new values as described in REQ 9.";
942
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
943
+ attribute :>> concernKind = ConcernKind::safety;
944
+ attribute :>> status = RequirementStatusKind::approved;
945
+ attribute :>> acceptanceCriteria = "Validation clean => values saved, prior validation notifications cleared, initiation enabled per REQ 9.";
946
+ attribute :>> subjectDescription = "Data configuration";
947
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 54)";
948
+ }
949
+ requirement reqCs55 : SystemRequirement {
950
+ attribute :>> id = "REQ-CS-55"; attribute :>> name = "RejectInvalidPrescription";
951
+ attribute :>> statement = "If REQ 51 or REQ 52 had generated a notification, the system shall not save the prescription values, allow the clinician to edit the values of the fields as described in REQ 49 and then repeat steps from REQ 50 until all validations are passed as described in REQ 54.";
952
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
953
+ attribute :>> concernKind = ConcernKind::safety;
954
+ attribute :>> status = RequirementStatusKind::approved;
955
+ attribute :>> acceptanceCriteria = "Validation notification present => values not saved; edit-and-revalidate loop until clean.";
956
+ attribute :>> subjectDescription = "Data configuration";
957
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 55)";
958
+ }
959
+ requirement reqCs56 : SystemRequirement {
960
+ attribute :>> id = "REQ-CS-56"; attribute :>> name = "RemainInModeDuringConfig";
961
+ attribute :>> statement = "While data configuration is in progress, the system shall remain in its current mode with the currently active prescription values, until infusion is initiated with the new prescription values as described in REQ 54.";
962
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
963
+ attribute :>> concernKind = ConcernKind::safety;
964
+ attribute :>> status = RequirementStatusKind::approved;
965
+ attribute :>> acceptanceCriteria = "Mode and active prescription are unchanged during configuration.";
966
+ attribute :>> subjectDescription = "Data configuration";
967
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 56)";
968
+ }
969
+ requirement reqCs57 : SystemRequirement {
970
+ attribute :>> id = "REQ-CS-57"; attribute :>> name = "ConfigWarningNotification";
971
+ attribute :>> statement = "When the clinician has attempted to configure the data for more than Config_Warning_Duration_const continuously, the system shall perform actions as described in REQ 59 for 'Config Time'.";
972
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
973
+ attribute :>> concernKind = ConcernKind::usability;
974
+ attribute :>> status = RequirementStatusKind::approved;
975
+ attribute :>> acceptanceCriteria = "continuous configuration time > Config_Warning_Duration_const => 'Config Time' actions taken";
976
+ attribute :>> subjectDescription = "Data configuration";
977
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 57)";
978
+ }
979
+ requirement reqCs58 : SystemRequirement {
980
+ attribute :>> id = "REQ-CS-58"; attribute :>> name = "MaxConfigDurationClears";
981
+ attribute :>> statement = "When the clinician has attempted to configure the data for more than Max_Config_Duration_const continuously, the system shall clear all unsaved prescription values and shall perform actions as described in REQ 59 for 'Unsaved Configuration Cleared'.";
982
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
983
+ attribute :>> concernKind = ConcernKind::usability;
984
+ attribute :>> status = RequirementStatusKind::approved;
985
+ attribute :>> acceptanceCriteria = "continuous configuration time > Max_Config_Duration_const => unsaved values cleared ('Unsaved Configuration Cleared' is referenced by the source but absent from the REQ 59 table — a documented source inconsistency).";
986
+ attribute :>> subjectDescription = "Data configuration";
987
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.2 (REQ 58)";
988
+ }
989
+
990
+ // ═════ §4.3 Notification Requirements ═══════════════════════
991
+ requirement reqCs59 : SystemRequirement {
992
+ attribute :>> id = "REQ-CS-59"; attribute :>> name = "NotificationActionTable";
993
+ attribute :>> statement = "The system shall perform all the actions listed in the notification action table for the respective notification. The table defines, for each of the 20 notifications, its priority (High/Med/Low) and the actions Visual, Audio, Inhibit Infusion, Inhibit Square Bolus, Inhibit Patient Bolus, and Stop Bolus. Notification requirements have higher precedence over all other requirements in the system.";
994
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
995
+ attribute :>> concernKind = ConcernKind::safety;
996
+ attribute :>> status = RequirementStatusKind::approved;
997
+ attribute :>> acceptanceCriteria = "For every raised notification, the actions equal the NOTIF-01..NOTIF-20 table row: Inhibit Infusion => Inhibited_Infusion_macro = TRUE; Inhibit Square Bolus => Inhibited_Bolus_macro = TRUE; Inhibit Patient Bolus => Inhibited_PatientBolus_macro = TRUE; Stop Bolus => stop all boluses in progress.";
998
+ attribute :>> subjectDescription = "Notification handling (see NOTIF-01..NOTIF-20)";
999
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 59)";
1000
+ }
1001
+ requirement reqCs60 : SystemRequirement {
1002
+ attribute :>> id = "REQ-CS-60"; attribute :>> name = "HighestPriorityActionsFirst";
1003
+ attribute :>> statement = "When more than one notification having different priorities occurs at the same time, the system shall take actions listed for the highest priority notification.";
1004
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1005
+ attribute :>> concernKind = ConcernKind::safety;
1006
+ attribute :>> status = RequirementStatusKind::approved;
1007
+ attribute :>> acceptanceCriteria = "Simultaneous notifications with different priorities => actions of the highest priority notification are taken.";
1008
+ attribute :>> subjectDescription = "Notification precedence";
1009
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 60)";
1010
+ }
1011
+ requirement reqCs61 : SystemRequirement {
1012
+ attribute :>> id = "REQ-CS-61"; attribute :>> name = "MostRestrictiveSamePriority";
1013
+ attribute :>> statement = "When more than one notification having same priorities and different set of actions occurs at the same time, the system shall take actions listed for the most restrictive notification.";
1014
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1015
+ attribute :>> concernKind = ConcernKind::safety;
1016
+ attribute :>> status = RequirementStatusKind::approved;
1017
+ attribute :>> acceptanceCriteria = "Order of restriction: Inhibit All Infusion > Inhibit Square Bolus > Inhibit Patient Bolus.";
1018
+ attribute :>> subjectDescription = "Notification precedence";
1019
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 61)";
1020
+ }
1021
+ requirement reqCs62 : SystemRequirement {
1022
+ attribute :>> id = "REQ-CS-62"; attribute :>> name = "MostRestrictiveTieBreak";
1023
+ attribute :>> statement = "When more than one notification having same priorities and same set of actions occurs at the same time, the system will take actions for the notification that has the most restrictive actions as listed in REQ 59.";
1024
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1025
+ attribute :>> concernKind = ConcernKind::safety;
1026
+ attribute :>> status = RequirementStatusKind::approved;
1027
+ attribute :>> acceptanceCriteria = "Tie on priority and actions => REQ 59 restriction ordering breaks the tie.";
1028
+ attribute :>> subjectDescription = "Notification precedence";
1029
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 62)";
1030
+ }
1031
+ requirement reqCs63 : SystemRequirement {
1032
+ attribute :>> id = "REQ-CS-63"; attribute :>> name = "EscalateToMoreRestrictive";
1033
+ attribute :>> statement = "While a low priority or less restrictive notification is in effect and a higher priority or more restrictive same-priority notification occurs, the system shall take actions for the high priority or more restrictive notification as listed in REQ 59.";
1034
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1035
+ attribute :>> concernKind = ConcernKind::safety;
1036
+ attribute :>> status = RequirementStatusKind::approved;
1037
+ attribute :>> acceptanceCriteria = "In-effect notification is superseded by a higher-priority or more restrictive notification.";
1038
+ attribute :>> subjectDescription = "Notification precedence";
1039
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 63)";
1040
+ }
1041
+ requirement reqCs64 : SystemRequirement {
1042
+ attribute :>> id = "REQ-CS-64"; attribute :>> name = "LowPriorityListedOnly";
1043
+ attribute :>> statement = "While a high priority notification is in effect and a low priority notification occurs, the system shall only add the notification to the active notification list and shall not take any other actions for the low priority notification.";
1044
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1045
+ attribute :>> concernKind = ConcernKind::safety;
1046
+ attribute :>> status = RequirementStatusKind::approved;
1047
+ attribute :>> acceptanceCriteria = "Lower-priority notification is listed but its actions are not taken while a higher-priority notification is in effect.";
1048
+ attribute :>> subjectDescription = "Notification precedence";
1049
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 64)";
1050
+ }
1051
+ requirement reqCs65 : SystemRequirement {
1052
+ attribute :>> id = "REQ-CS-65"; attribute :>> name = "CancelNotificationsOneAtATime";
1053
+ attribute :>> statement = "The system shall allow the clinician to cancel the active notifications, starting from the first in the list, one at a time (Notification_cancel_prog).";
1054
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1055
+ attribute :>> concernKind = ConcernKind::usability;
1056
+ attribute :>> status = RequirementStatusKind::approved;
1057
+ attribute :>> acceptanceCriteria = "Cancellation proceeds one notification at a time from the head of the list.";
1058
+ attribute :>> subjectDescription = "Notification cancellation";
1059
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 65)";
1060
+ }
1061
+ requirement reqCs66 : SystemRequirement {
1062
+ attribute :>> id = "REQ-CS-66"; attribute :>> name = "CancelClearsRestrictions";
1063
+ attribute :>> statement = "When Notification_cancel_prog for a notification, the system shall cancel and clear the restrictions for that notification: Inhibited_Infusion_macro = FALSE, Inhibited_Bolus_macro = FALSE, Inhibited_PatientBolus_macro = FALSE, and cancel and clear the corresponding audio notification.";
1064
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1065
+ attribute :>> concernKind = ConcernKind::safety;
1066
+ attribute :>> status = RequirementStatusKind::approved;
1067
+ attribute :>> acceptanceCriteria = "After cancel: Inhibited_Infusion_macro = FALSE AND Inhibited_Bolus_macro = FALSE AND Inhibited_PatientBolus_macro = FALSE AND audio cleared for that notification.";
1068
+ attribute :>> subjectDescription = "Notification cancellation";
1069
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 66)";
1070
+ }
1071
+ requirement reqCs67 : SystemRequirement {
1072
+ attribute :>> id = "REQ-CS-67"; attribute :>> name = "NextNotificationAfterCancel";
1073
+ attribute :>> statement = "When Notification_cancel_prog for a notification, the system takes actions for the next active notification in order of priority and descending order of occurrence.";
1074
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1075
+ attribute :>> concernKind = ConcernKind::safety;
1076
+ attribute :>> status = RequirementStatusKind::approved;
1077
+ attribute :>> acceptanceCriteria = "After cancel, the next active notification (by priority, then recency) becomes the notification in effect.";
1078
+ attribute :>> subjectDescription = "Notification cancellation";
1079
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3 (REQ 67)";
1080
+ }
1081
+
1082
+ // ── §4.3.1 Visual notification ──────────────────────────────
1083
+ requirement reqCs68 : SystemRequirement {
1084
+ attribute :>> id = "REQ-CS-68"; attribute :>> name = "DisplayActiveNotificationsOrdered";
1085
+ attribute :>> statement = "The system shall display all active notifications in order of priority and descending order of occurrence (Notification_Visual_output).";
1086
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1087
+ attribute :>> concernKind = ConcernKind::usability;
1088
+ attribute :>> status = RequirementStatusKind::approved;
1089
+ attribute :>> acceptanceCriteria = "Notification_Visual_output lists active notifications ordered by priority, then most recent first.";
1090
+ attribute :>> subjectDescription = "Visual notification";
1091
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.1 (REQ 68)";
1092
+ }
1093
+ requirement reqCs69 : SystemRequirement {
1094
+ attribute :>> id = "REQ-CS-69"; attribute :>> name = "DisplayNotificationNameAndTime";
1095
+ attribute :>> statement = "The system shall display the name of all the active notifications and the time of the occurrence.";
1096
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1097
+ attribute :>> concernKind = ConcernKind::usability;
1098
+ attribute :>> status = RequirementStatusKind::approved;
1099
+ attribute :>> acceptanceCriteria = "Every active notification is shown with name and occurrence time.";
1100
+ attribute :>> subjectDescription = "Visual notification";
1101
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.1 (REQ 69)";
1102
+ }
1103
+ requirement reqCs70 : SystemRequirement {
1104
+ attribute :>> id = "REQ-CS-70"; attribute :>> name = "DisplaySimultaneousNotifications";
1105
+ attribute :>> statement = "When more than one notification occurs at the same time, the system shall display all the notifications as per REQ 68.";
1106
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1107
+ attribute :>> concernKind = ConcernKind::usability;
1108
+ attribute :>> status = RequirementStatusKind::approved;
1109
+ attribute :>> acceptanceCriteria = "Simultaneous notifications are all displayed in REQ 68 order.";
1110
+ attribute :>> subjectDescription = "Visual notification";
1111
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.1 (REQ 70)";
1112
+ }
1113
+ requirement reqCs71 : SystemRequirement {
1114
+ attribute :>> id = "REQ-CS-71"; attribute :>> name = "RemoveCancelledNotificationFromList";
1115
+ attribute :>> statement = "When Notification_cancel_prog for a notification, the system shall remove the notification from the list and shall display the list of remaining notifications.";
1116
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1117
+ attribute :>> concernKind = ConcernKind::usability;
1118
+ attribute :>> status = RequirementStatusKind::approved;
1119
+ attribute :>> acceptanceCriteria = "Cancelled notification disappears from the displayed list; remaining list stays displayed.";
1120
+ attribute :>> subjectDescription = "Visual notification";
1121
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.1 (REQ 71)";
1122
+ }
1123
+
1124
+ // ── §4.3.2 Audio notification ───────────────────────────────
1125
+ requirement reqCs72 : SystemRequirement {
1126
+ attribute :>> id = "REQ-CS-72"; attribute :>> name = "AudibleSoundPerNotification";
1127
+ attribute :>> statement = "When each notification occurs that requires an audio alarm as listed in REQ 59, the system shall produce a single audible sound of Audio_level_const, unless the audio is disabled or silenced.";
1128
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1129
+ attribute :>> concernKind = ConcernKind::safety;
1130
+ attribute :>> status = RequirementStatusKind::approved;
1131
+ attribute :>> acceptanceCriteria = "Audio-flagged notification => one audible sound at Audio_level_const (50 db for 2 seconds per I 8) unless Disable_audio_prog is set.";
1132
+ attribute :>> subjectDescription = "Audio notification";
1133
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.2 (REQ 72)";
1134
+ }
1135
+ requirement reqCs73 : SystemRequirement {
1136
+ attribute :>> id = "REQ-CS-73"; attribute :>> name = "AudioDisableSilenceEnable";
1137
+ attribute :>> statement = "The system shall allow the clinician to disable audible alarm, silence the alarm temporarily and enable a disabled or silenced alarm.";
1138
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1139
+ attribute :>> concernKind = ConcernKind::usability;
1140
+ attribute :>> status = RequirementStatusKind::approved;
1141
+ attribute :>> acceptanceCriteria = "Notification_Audio_output = FALSE if Disable_audio_prog = 'PERM' (disabled) or 'TEMP' (silenced); Notification_Audio_output = TRUE if Disable_audio_prog = FALSE.";
1142
+ attribute :>> subjectDescription = "Audio notification";
1143
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.2 (REQ 73)";
1144
+ }
1145
+ requirement reqCs74 : SystemRequirement {
1146
+ attribute :>> id = "REQ-CS-74"; attribute :>> name = "NoAudioWhileDisabled";
1147
+ attribute :>> statement = "If Disable_audio_prog = 'PERM' or 'TEMP', the system shall not produce audible alarm until it is enabled (Disable_audio_prog = FALSE).";
1148
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1149
+ attribute :>> concernKind = ConcernKind::usability;
1150
+ attribute :>> status = RequirementStatusKind::approved;
1151
+ attribute :>> acceptanceCriteria = "No audible alarm while Disable_audio_prog is 'PERM' or 'TEMP'.";
1152
+ attribute :>> subjectDescription = "Audio notification";
1153
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.2 (REQ 74)";
1154
+ }
1155
+ requirement reqCs75 : SystemRequirement {
1156
+ attribute :>> id = "REQ-CS-75"; attribute :>> name = "TempSilenceAutoReenable";
1157
+ attribute :>> statement = "If Disable_audio_prog = 'TEMP', the system shall automatically enable it (Disable_audio_prog = FALSE) after Audio_Enable_Duration_const minutes.";
1158
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1159
+ attribute :>> concernKind = ConcernKind::safety;
1160
+ attribute :>> status = RequirementStatusKind::approved;
1161
+ attribute :>> acceptanceCriteria = "Temporary silence expires after Audio_Enable_Duration_const (30) minutes.";
1162
+ attribute :>> subjectDescription = "Audio notification";
1163
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.2 (REQ 75)";
1164
+ }
1165
+ requirement reqCs76 : SystemRequirement {
1166
+ attribute :>> id = "REQ-CS-76"; attribute :>> name = "ReannunciateLongActiveNotifications";
1167
+ attribute :>> statement = "For every notification with audio alarm that is active for more than Audio_Enable_Duration_const minutes, the system shall produce audible sound as described in REQ 72.";
1168
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1169
+ attribute :>> concernKind = ConcernKind::safety;
1170
+ attribute :>> status = RequirementStatusKind::approved;
1171
+ attribute :>> acceptanceCriteria = "Audio-flagged notification active > Audio_Enable_Duration_const minutes => REQ 72 sound re-produced.";
1172
+ attribute :>> subjectDescription = "Audio notification";
1173
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.3.2 (REQ 76)";
1174
+ }
1175
+
1176
+ // ═════ §4.4 Log Requirements ════════════════════════════════
1177
+ requirement reqCs77 : SystemRequirement {
1178
+ attribute :>> id = "REQ-CS-77"; attribute :>> name = "LogWhileOn";
1179
+ attribute :>> statement = "The system shall log all the operational and error data when the system is in ON mode.";
1180
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1181
+ attribute :>> concernKind = ConcernKind::regulatory;
1182
+ attribute :>> status = RequirementStatusKind::approved;
1183
+ attribute :>> acceptanceCriteria = "Operational log and error log are recorded whenever the system is in ON mode.";
1184
+ attribute :>> subjectDescription = "Logging";
1185
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.4 (REQ 77)";
1186
+ }
1187
+ requirement reqCs78 : SystemRequirement {
1188
+ attribute :>> id = "REQ-CS-78"; attribute :>> name = "OperationalLogContent";
1189
+ attribute :>> statement = "While in ON mode, every Log_Interval_const minutes or when a mode transition occurs, the system shall record the following information in an 'Operational log': (1) date in dd/MM/yy format, (2) time in HH:MM:SS GMT, (3) Patient ID, (4) prescription information, (5) current mode of the system, (6) current flow rate of the system.";
1190
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1191
+ attribute :>> concernKind = ConcernKind::regulatory;
1192
+ attribute :>> status = RequirementStatusKind::approved;
1193
+ attribute :>> acceptanceCriteria = "Operational log entries appear every Log_Interval_const (5) minutes and on every mode transition, with all six fields.";
1194
+ attribute :>> subjectDescription = "Logging";
1195
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.4 (REQ 78)";
1196
+ }
1197
+ requirement reqCs79 : SystemRequirement {
1198
+ attribute :>> id = "REQ-CS-79"; attribute :>> name = "InfusionCompleteLogContent";
1199
+ attribute :>> statement = "When infusion is completed as per REQ 28, the system shall record the following information in addition to the information listed in REQ 78 in the 'Operational log': (1) total volume infused for that prescription, (2) total duration of infusion for that prescription (total duration in ACTIVE mode).";
1200
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1201
+ attribute :>> concernKind = ConcernKind::regulatory;
1202
+ attribute :>> status = RequirementStatusKind::approved;
1203
+ attribute :>> acceptanceCriteria = "Infusion-complete log entry includes total volume infused and total ACTIVE-mode duration.";
1204
+ attribute :>> subjectDescription = "Logging";
1205
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.4 (REQ 79)";
1206
+ }
1207
+ requirement reqCs80 : SystemRequirement {
1208
+ attribute :>> id = "REQ-CS-80"; attribute :>> name = "ErrorLogContent";
1209
+ attribute :>> statement = "When any notification condition listed in REQ 59 occurs, the system shall record the following information in an error log: (1) date in dd/MM/yy format, (2) time in HH:MM:SS GMT, (3) notification description, (4) current mode of the system, (5) remaining drug volume.";
1210
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1211
+ attribute :>> concernKind = ConcernKind::regulatory;
1212
+ attribute :>> status = RequirementStatusKind::approved;
1213
+ attribute :>> acceptanceCriteria = "Every REQ 59 notification produces an error log entry with all five fields.";
1214
+ attribute :>> subjectDescription = "Logging";
1215
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.4 (REQ 80)";
1216
+ }
1217
+ requirement reqCs81 : SystemRequirement {
1218
+ attribute :>> id = "REQ-CS-81"; attribute :>> name = "NotificationCancelLogContent";
1219
+ attribute :>> statement = "When a notification is cancelled as described in REQ 66, the system shall record the following information in the 'Operational log': (1) date in dd/MM/yy format, (2) time in HH:MM:SS GMT, (3) description of the notification cancelled.";
1220
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1221
+ attribute :>> concernKind = ConcernKind::regulatory;
1222
+ attribute :>> status = RequirementStatusKind::approved;
1223
+ attribute :>> acceptanceCriteria = "Every notification cancellation produces an operational log entry with all three fields.";
1224
+ attribute :>> subjectDescription = "Logging";
1225
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.4 (REQ 81)";
1226
+ }
1227
+
1228
+ // ═════ §4.5 Security Requirements ═══════════════════════════
1229
+ requirement reqCs82 : SystemRequirement {
1230
+ attribute :>> id = "REQ-CS-82"; attribute :>> name = "AuthorizedCliniciansOnly";
1231
+ attribute :>> statement = "The system shall allow only authorized clinicians to configure the system.";
1232
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1233
+ attribute :>> concernKind = ConcernKind::cybersecurity;
1234
+ attribute :>> status = RequirementStatusKind::approved;
1235
+ attribute :>> acceptanceCriteria = "Configuration is rejected for unauthorized users.";
1236
+ attribute :>> subjectDescription = "System configuration access";
1237
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §4.5 (REQ 82)";
1238
+ }
1239
+
1240
+ // ═════ Ch.5 Non-Behavioral Requirements ═════════════════════
1241
+ requirement reqCs83 : SystemRequirement {
1242
+ attribute :>> id = "REQ-CS-83"; attribute :>> name = "DropResistance";
1243
+ attribute :>> statement = "The system shall be unbreakable if it is dropped on a laminate floor from y m of height with no additional force than gravity.";
1244
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1245
+ attribute :>> concernKind = ConcernKind::reliability;
1246
+ attribute :>> status = RequirementStatusKind::approved;
1247
+ attribute :>> acceptanceCriteria = "Drop from height y m (value left open by the source) onto laminate floor causes no breakage.";
1248
+ attribute :>> subjectDescription = "GPCA enclosure";
1249
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 83)";
1250
+ }
1251
+ requirement reqCs84 : SystemRequirement {
1252
+ attribute :>> id = "REQ-CS-84"; attribute :>> name = "WaterResistance";
1253
+ attribute :>> statement = "The system shall be waterproof to non-acidic liquid of less than x ml on any side of the pump for a maximum of 2 hours.";
1254
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1255
+ attribute :>> concernKind = ConcernKind::reliability;
1256
+ attribute :>> status = RequirementStatusKind::approved;
1257
+ attribute :>> acceptanceCriteria = "Exposure to < x ml (value left open by the source) non-acidic liquid for up to 2 hours causes no ingress failure.";
1258
+ attribute :>> subjectDescription = "GPCA enclosure";
1259
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 84)";
1260
+ }
1261
+ requirement reqCs85 : SystemRequirement {
1262
+ attribute :>> id = "REQ-CS-85"; attribute :>> name = "LogRetention";
1263
+ attribute :>> statement = "The system shall persist the most recent 30 days of error log data and 15 days of operational log data.";
1264
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1265
+ attribute :>> concernKind = ConcernKind::regulatory;
1266
+ attribute :>> status = RequirementStatusKind::approved;
1267
+ attribute :>> acceptanceCriteria = "error log retention >= Error_Log_Retention (30 days); operational log retention >= Operational_Log_Retention (15 days)";
1268
+ attribute :>> subjectDescription = "Logging";
1269
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 85)";
1270
+ }
1271
+ requirement reqCs86 : SystemRequirement {
1272
+ attribute :>> id = "REQ-CS-86"; attribute :>> name = "PrescriptionRetention";
1273
+ attribute :>> statement = "The system shall persist the last saved prescription data for 15 days.";
1274
+ attribute :>> sourceKind = RequirementSourceKind::sourceDocument;
1275
+ attribute :>> concernKind = ConcernKind::regulatory;
1276
+ attribute :>> status = RequirementStatusKind::approved;
1277
+ attribute :>> acceptanceCriteria = "saved prescription retention >= Prescription_Persist_Duration (15 days)";
1278
+ attribute :>> subjectDescription = "Prescription storage";
1279
+ attribute :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §5.1 (REQ 86)";
1280
+ }
1281
+
1282
+ // ═════ MEMO extension requirements (REQ-X) ══════════════════
1283
+ // Not present in the CriSys source. These showcase how the MEMO
1284
+ // methodology extends a source specification with risk-driven
1285
+ // and hardware requirements. sourceKind = extension segregates
1286
+ // them from the REQ-CS family.
1287
+ requirement reqDrugLibraryLimits : SystemRequirement {
1288
+ attribute :>> id = "REQ-X-01"; attribute :>> name = "PrescriptionWithinDrugLibraryLimits";
1289
+ attribute :>> statement = "When a prescription parameter is entered, the system shall reject values outside drug-library hard limits and shall require explicit confirmation for values outside soft limits.";
1290
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1291
+ attribute :>> concernKind = ConcernKind::safety;
1292
+ attribute :>> status = RequirementStatusKind::approved;
1293
+ attribute :>> acceptanceCriteria = "Hard-limit violations cannot be saved; soft-limit violations require a distinct confirmation step; both are logged.";
1294
+ attribute :>> subjectDescription = "Config";
1295
+ attribute :>> actorDescription = "clinician";
1296
+ attribute :>> assumptionSummary = "drug library installed and current";
1297
+ attribute :>> guaranteeSummary = "no out-of-range prescription can be activated";
1298
+ attribute :>> sourceReference = "MEMO extension — hard/soft limit discipline beyond CriSys §4.2 validation (REQ-CS-51..55)";
1299
+ attribute :>> notation = RequirementNotationKind::ears;
1300
+ attribute :>> earsPattern = EarsPatternKind::eventDriven;
1301
+ attribute :>> obligation = ObligationKind::shall;
1302
+ attribute :>> conditionClause = "When a prescription parameter is entered";
1303
+ attribute :>> systemResponse = "reject hard-limit violations and require confirmation of soft-limit violations";
1304
+ }
1305
+ requirement reqPost : SystemRequirement {
1306
+ attribute :>> id = "REQ-X-02"; attribute :>> name = "PowerOnSelfTest";
1307
+ attribute :>> statement = "On power-up, the system shall complete a self test of CPU, memory, watchdog, and safety sensors before permitting therapy, and shall remain locked out of therapy if any check fails.";
1308
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1309
+ attribute :>> concernKind = ConcernKind::safety;
1310
+ attribute :>> status = RequirementStatusKind::approved;
1311
+ attribute :>> acceptanceCriteria = "Failed POST inhibits all infusion modes and raises a High-priority notification.";
1312
+ attribute :>> subjectDescription = "System_Monitor and Top_Level_Mode";
1313
+ attribute :>> actorDescription = "clinician";
1314
+ attribute :>> assumptionSummary = "hardware supports built-in test";
1315
+ attribute :>> guaranteeSummary = "no therapy on a device that failed self test";
1316
+ attribute :>> sourceReference = "MEMO extension — POST is not specified by the CriSys source";
1317
+ attribute :>> notation = RequirementNotationKind::ears;
1318
+ attribute :>> earsPattern = EarsPatternKind::eventDriven;
1319
+ attribute :>> obligation = ObligationKind::shall;
1320
+ attribute :>> conditionClause = "On power-up";
1321
+ attribute :>> systemResponse = "complete POST before permitting therapy";
1322
+ }
1323
+ requirement reqPowerLossRetention : SystemRequirement {
1324
+ attribute :>> id = "REQ-X-03"; attribute :>> name = "PrescriptionRetainedAcrossPowerLoss";
1325
+ attribute :>> statement = "If all power is lost, the system shall retain the confirmed prescription and event log, and on power restoration shall resume therapy only after clinician confirmation.";
1326
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1327
+ attribute :>> concernKind = ConcernKind::safety;
1328
+ attribute :>> status = RequirementStatusKind::approved;
1329
+ attribute :>> acceptanceCriteria = "Stored prescription checksum verifies after power cycle; therapy does not auto-resume. Retention durations remain governed by REQ-CS-85/86.";
1330
+ attribute :>> subjectDescription = "Config and Top_Level_Mode";
1331
+ attribute :>> actorDescription = "clinician";
1332
+ attribute :>> assumptionSummary = "non-volatile storage available";
1333
+ attribute :>> guaranteeSummary = "no silent loss or silent resumption of therapy";
1334
+ attribute :>> sourceReference = "MEMO extension — power-loss behavior is not specified by the CriSys source";
1335
+ attribute :>> notation = RequirementNotationKind::ears;
1336
+ attribute :>> earsPattern = EarsPatternKind::unwantedBehavior;
1337
+ attribute :>> obligation = ObligationKind::shall;
1338
+ attribute :>> conditionClause = "If all power is lost";
1339
+ attribute :>> systemResponse = "retain prescription and log; resume only after confirmation";
1340
+ }
1341
+ requirement reqOcclusion : SoftwareRequirement {
1342
+ attribute :>> id = "REQ-X-04"; attribute :>> name = "OcclusionDetectionAndAlarm";
1343
+ attribute :>> statement = "When downstream line pressure exceeds the occlusion threshold, the system shall pause infusion and raise a High-priority notification.";
1344
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1345
+ attribute :>> concernKind = ConcernKind::safety;
1346
+ attribute :>> safetyClass = SafetyClassKind::C;
1347
+ attribute :>> status = RequirementStatusKind::approved;
1348
+ attribute :>> acceptanceCriteria = "Occlusion above threshold pauses infusion within one execution step and annunciates. Complements REQ-CS-17 under-infusion detection with a direct pressure measurement.";
1349
+ attribute :>> subjectDescription = "Alarm and Infusion_Manager";
1350
+ attribute :>> actorDescription = "patient";
1351
+ attribute :>> assumptionSummary = "pressure sensor calibrated";
1352
+ attribute :>> guaranteeSummary = "no sustained pumping against a blocked line";
1353
+ attribute :>> sourceReference = "MEMO extension — occlusion sensing is not specified by the CriSys source (under-infusion flow rate, REQ-CS-17, is the source-level effect)";
1354
+ }
1355
+ requirement reqDoorOpen : SoftwareRequirement {
1356
+ attribute :>> id = "REQ-X-05"; attribute :>> name = "DoorOpenPreventsDelivery";
1357
+ attribute :>> statement = "While the reservoir door is open or unlatched, the system shall not deliver drug and shall raise a Medium-priority notification if therapy was active.";
1358
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1359
+ attribute :>> concernKind = ConcernKind::safety;
1360
+ attribute :>> safetyClass = SafetyClassKind::C;
1361
+ attribute :>> status = RequirementStatusKind::approved;
1362
+ attribute :>> acceptanceCriteria = "Flow command forced to zero whenever door state is open; notification raised on transition during ACTIVE.";
1363
+ attribute :>> subjectDescription = "Infusion_Manager";
1364
+ attribute :>> actorDescription = "clinician";
1365
+ attribute :>> assumptionSummary = "door sensor operational";
1366
+ attribute :>> guaranteeSummary = "no delivery with an unsecured fluid path";
1367
+ attribute :>> sourceReference = "MEMO extension — door interlock is not specified by the CriSys source";
1368
+ attribute :>> notation = RequirementNotationKind::ears;
1369
+ attribute :>> earsPattern = EarsPatternKind::stateDriven;
1370
+ attribute :>> obligation = ObligationKind::shall;
1371
+ attribute :>> conditionClause = "While the reservoir door is open";
1372
+ attribute :>> systemResponse = "inhibit delivery and notify if therapy was active";
1373
+ }
1374
+ requirement reqMaxHourlyDose : SoftwareRequirement {
1375
+ attribute :>> id = "REQ-X-06"; attribute :>> name = "MaximumHourlyDoseEnforcement";
1376
+ attribute :>> statement = "The system shall not deliver more than the prescribed maximum drug volume in any sliding one-hour window, counting basal, patient bolus, and square bolus contributions.";
1377
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1378
+ attribute :>> concernKind = ConcernKind::safety;
1379
+ attribute :>> safetyClass = SafetyClassKind::C;
1380
+ attribute :>> status = RequirementStatusKind::approved;
1381
+ attribute :>> acceptanceCriteria = "Cumulative delivered volume in every one-hour window is at or below the prescribed maximum. Complements the CriSys total-VTBI ceiling (REQ-CS-20, REQ-CS-28).";
1382
+ attribute :>> subjectDescription = "Infusion_Manager";
1383
+ attribute :>> actorDescription = "patient";
1384
+ attribute :>> assumptionSummary = "delivered volume measurable per step";
1385
+ attribute :>> guaranteeSummary = "hourly dose ceiling never exceeded";
1386
+ attribute :>> sourceReference = "MEMO extension — sliding-window hourly limit is not specified by the CriSys source";
1387
+ }
1388
+ requirement reqEventLogging : SoftwareRequirement {
1389
+ attribute :>> id = "REQ-X-07"; attribute :>> name = "TamperEvidentTherapyLog";
1390
+ attribute :>> statement = "The system shall record therapy events in a timestamped, tamper-evident event log such that any modification of recorded entries is detectable.";
1391
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1392
+ attribute :>> concernKind = ConcernKind::regulatory;
1393
+ attribute :>> safetyClass = SafetyClassKind::B;
1394
+ attribute :>> status = RequirementStatusKind::approved;
1395
+ attribute :>> acceptanceCriteria = "Modification of a stored log entry is detectable. Log content and cadence are governed by REQ-CS-77..81; retention by REQ-CS-85.";
1396
+ attribute :>> subjectDescription = "Logging";
1397
+ attribute :>> actorDescription = "clinician and auditor";
1398
+ attribute :>> assumptionSummary = "real-time clock available";
1399
+ attribute :>> guaranteeSummary = "log tampering cannot go unnoticed";
1400
+ attribute :>> sourceReference = "MEMO extension — tamper evidence is not specified by the CriSys source (log content: REQ-CS-77..81)";
1401
+ }
1402
+ requirement reqWatchdogSafeState : SoftwareRequirement {
1403
+ attribute :>> id = "REQ-X-08"; attribute :>> name = "WatchdogForcesSafeState";
1404
+ attribute :>> statement = "If the software fails to service the hardware watchdog within its timeout, the system shall force pump output to zero flow and raise a continuous audible alarm.";
1405
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1406
+ attribute :>> concernKind = ConcernKind::safety;
1407
+ attribute :>> safetyClass = SafetyClassKind::C;
1408
+ attribute :>> status = RequirementStatusKind::approved;
1409
+ attribute :>> acceptanceCriteria = "Induced CPU hang results in zero flow and alarm within the watchdog timeout.";
1410
+ attribute :>> subjectDescription = "System_Monitor and watchdog hardware";
1411
+ attribute :>> actorDescription = "clinician";
1412
+ attribute :>> assumptionSummary = "watchdog electrically independent of CPU";
1413
+ attribute :>> guaranteeSummary = "runaway software cannot keep pumping";
1414
+ attribute :>> sourceReference = "MEMO extension — watchdog behavior is not specified by the CriSys source";
1415
+ attribute :>> notation = RequirementNotationKind::ears;
1416
+ attribute :>> earsPattern = EarsPatternKind::unwantedBehavior;
1417
+ attribute :>> obligation = ObligationKind::shall;
1418
+ attribute :>> conditionClause = "If the watchdog is not serviced within its timeout";
1419
+ attribute :>> systemResponse = "force zero flow and continuous alarm";
1420
+ }
1421
+ requirement reqStuckButton : SoftwareRequirement {
1422
+ attribute :>> id = "REQ-X-09"; attribute :>> name = "StuckBolusButtonDetection";
1423
+ attribute :>> statement = "If the patient bolus button remains asserted for more than 60 seconds, the system shall treat the input as failed, ignore it, and raise a Medium-priority notification.";
1424
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1425
+ attribute :>> concernKind = ConcernKind::safety;
1426
+ attribute :>> safetyClass = SafetyClassKind::C;
1427
+ attribute :>> status = RequirementStatusKind::approved;
1428
+ attribute :>> acceptanceCriteria = "Continuous assertion beyond 60 s produces no bolus and raises a notification. Complements REQ-CS-25/26 request-level filtering with an input-failure check.";
1429
+ attribute :>> subjectDescription = "Infusion_Manager";
1430
+ attribute :>> actorDescription = "patient";
1431
+ attribute :>> assumptionSummary = "button sampled every step";
1432
+ attribute :>> guaranteeSummary = "a shorted pendant cannot request repeated boluses";
1433
+ attribute :>> sourceReference = "MEMO extension — stuck-input detection is not specified by the CriSys source";
1434
+ }
1435
+ requirement reqFlowCrossCheck : SoftwareRequirement {
1436
+ attribute :>> id = "REQ-X-10"; attribute :>> name = "CommandedVsMeasuredFlowCrossCheck";
1437
+ attribute :>> statement = "The system shall compare measured delivered flow against commanded flow using an independent flow sensor, and shall raise a High-priority notification and pause infusion when the deviation exceeds Tolerance_Min_const for more than Max_Duration_OverInfusion_const.";
1438
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1439
+ attribute :>> concernKind = ConcernKind::safety;
1440
+ attribute :>> safetyClass = SafetyClassKind::C;
1441
+ attribute :>> status = RequirementStatusKind::approved;
1442
+ attribute :>> acceptanceCriteria = "Injected flow deviation beyond Tolerance_Min_const (5 %) sustained past Max_Duration_OverInfusion_const pauses therapy and annunciates; detection is independent of motor control.";
1443
+ attribute :>> subjectDescription = "Alarm and Infusion_Manager";
1444
+ attribute :>> actorDescription = "patient";
1445
+ attribute :>> assumptionSummary = "independent flow sensor available";
1446
+ attribute :>> guaranteeSummary = "over- and under-infusion detected independently of motor control";
1447
+ attribute :>> sourceReference = "MEMO extension — independent cross-check channel beyond CriSys REQ-CS-17/19 tolerance monitoring; thresholds reuse App. A.4 constants";
1448
+ }
1449
+ requirement reqPumpAccuracy : HardwareRequirement {
1450
+ attribute :>> id = "REQ-X-11"; attribute :>> name = "DeliveryAccuracy";
1451
+ attribute :>> statement = "The pump mechanism shall deliver programmed volumes with an accuracy of plus or minus Tolerance_Min_const (5 percent) over the full rate range, so that the system-level flow tolerances of REQ-CS-16 are achievable.";
1452
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1453
+ attribute :>> concernKind = ConcernKind::performance;
1454
+ attribute :>> status = RequirementStatusKind::approved;
1455
+ attribute :>> acceptanceCriteria = "Gravimetric bench test across min/nominal/max rates within ±5% (Tolerance_Min_const).";
1456
+ attribute :>> subjectDescription = "PumpMotorAssembly";
1457
+ attribute :>> actorDescription = "patient";
1458
+ attribute :>> assumptionSummary = "approved administration set used";
1459
+ attribute :>> guaranteeSummary = "dose accuracy within labeling";
1460
+ attribute :>> sourceReference = "MEMO extension — mechanism-level accuracy budget derived from App. A.4 Tolerance_Min_const";
1461
+ attribute :>> electricalSafetyRelevant = false;
1462
+ }
1463
+ requirement reqAlarmLoudness : HardwareRequirement {
1464
+ attribute :>> id = "REQ-X-12"; attribute :>> name = "AlarmSoundPressureLevel";
1465
+ attribute :>> statement = "The audible annunciator shall produce notification tones at the sound level defined by Audio_level_const (50 db for 2 seconds per interface spec I 8), distinguishable by priority.";
1466
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1467
+ attribute :>> concernKind = ConcernKind::usability;
1468
+ attribute :>> status = RequirementStatusKind::approved;
1469
+ attribute :>> acceptanceCriteria = "Calibrated SPL measurement meets Audio_level_const for each priority tone.";
1470
+ attribute :>> subjectDescription = "AudibleAlarmAnnunciator";
1471
+ attribute :>> actorDescription = "clinician";
1472
+ attribute :>> assumptionSummary = "ward ambient noise per IEC 60601-1-8 baseline";
1473
+ attribute :>> guaranteeSummary = "alarms audible at the ward station";
1474
+ attribute :>> sourceReference = "MEMO extension — hardware annunciator budget realizing CriSys I 8 / Audio_level_const";
1475
+ attribute :>> electricalSafetyRelevant = false;
1476
+ }
1477
+ requirement reqBatteryBackup : HardwareRequirement {
1478
+ attribute :>> id = "REQ-X-13"; attribute :>> name = "BatteryBackupDuration";
1479
+ attribute :>> statement = "The battery shall sustain nominal therapy and alarm annunciation for at least 4 hours after loss of mains power.";
1480
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1481
+ attribute :>> concernKind = ConcernKind::reliability;
1482
+ attribute :>> status = RequirementStatusKind::approved;
1483
+ attribute :>> acceptanceCriteria = "Discharge test at nominal rate exceeds 4 h with low-battery warning at 30 min remaining.";
1484
+ attribute :>> subjectDescription = "BatteryPack";
1485
+ attribute :>> actorDescription = "clinician";
1486
+ attribute :>> assumptionSummary = "battery within service life";
1487
+ attribute :>> guaranteeSummary = "transport and outage continuity";
1488
+ attribute :>> sourceReference = "MEMO extension — power backup is not specified by the CriSys source";
1489
+ attribute :>> electricalSafetyRelevant = true;
1490
+ }
1491
+ requirement reqFreeFlowPrevention : HardwareRequirement {
1492
+ attribute :>> id = "REQ-X-14"; attribute :>> name = "MechanicalFreeFlowPrevention";
1493
+ attribute :>> statement = "The fluid path shall include a mechanical anti-free-flow valve that blocks gravity flow whenever the administration set is disengaged from the pumping mechanism.";
1494
+ attribute :>> sourceKind = RequirementSourceKind::extension;
1495
+ attribute :>> concernKind = ConcernKind::safety;
1496
+ attribute :>> status = RequirementStatusKind::approved;
1497
+ attribute :>> acceptanceCriteria = "No measurable flow under gravity head with set disengaged and door open.";
1498
+ attribute :>> subjectDescription = "AntiFreeFlowValve";
1499
+ attribute :>> actorDescription = "patient";
1500
+ attribute :>> assumptionSummary = "approved administration set used";
1501
+ attribute :>> guaranteeSummary = "free-flow overdose mechanically impossible";
1502
+ attribute :>> sourceReference = "MEMO extension — mechanical free-flow protection is not specified by the CriSys source";
1503
+ attribute :>> electricalSafetyRelevant = false;
1504
+ }
1505
+ }