null, triggering an immediate Early Return that suppresses false dose recommendations.
crcl === null, the engine terminates evaluation before reaching any drug or VTE branch. It raises Missing SCr & Weight, sets status to Tech Recall, and suppresses recommended dose to —.
flowchart TD
classDef gate fill:#7c3aed,stroke:#a78bfa,stroke-width:2px,color:#fff;
classDef action fill:#1e293b,stroke:#475569,stroke-width:1px,color:#e2e8f0;
classDef decision fill:#0f172a,stroke:#38bdf8,stroke-width:2px,color:#fff;
classDef tech fill:#581c87,stroke:#c084fc,stroke-width:1px,color:#f3e8ff;
classDef review fill:#7f1d1d,stroke:#f87171,stroke-width:1px,color:#fee2e2;
classDef ok fill:#14532d,stroke:#4ade80,stroke-width:1px,color:#dcfce7;
classDef specialist fill:#4c1d95,stroke:#c084fc,stroke-width:2px,color:#f3e8ff;
START(["Patient Record (27-Col EMIS CSV A–AA)"]) --> PARSE["Parse Demographics, Drug, Dose, Indication, Labs, Reviews, A&G (Col Y), Codes"]
PARSE --> CG["Calculate Cockcroft-Gault CrCl:
((140 - Age) * Weight) / (72 * (SCr / 88.4)) * (0.85 if Female)"]
CG --> GATE1{"Is CrCl == null?
(Weight or SCr Missing?)"}:::gate
GATE1 -- "YES (Missing Data)" --> EARLY_RETURN["EARLY RETURN (Line 139)
- Flag: Missing SCr & Weight
- Recommended Dose: '—'
- Status: Tech Recall"]:::tech
EARLY_RETURN --> OUTER_CHECKS["Outer Safety Checks
(Bloods Due, Hepatic, FBC, Interactions)"]
GATE1 -- "NO (CrCl Calculated)" --> WT_CHECK{"Weight Evaluation
(BOB 2026 Categories)"}:::decision
WT_CHECK -- "Wt < 40 kg or > 150 kg" --> FLAG_WT_SEVERE["Flag: DOAC not recommended
(Warfarin or spec. advice)"]:::review
FLAG_WT_SEVERE --> WT_ASSESSED{"Reviewed within 12m?"}:::decision
WT_CHECK -- "Wt > 120 kg" --> FLAG_WT120["Flag: CrCl may be overestimated
(actual wt used)"]:::action
FLAG_WT120 --> DOAC_WT_GATE{"DOAC Check:
Edoxaban / Dabigatran?"}:::decision
DOAC_WT_GATE -- "Yes" --> FLAG_EDOX_DAB_WT["Flag: Weight >120kg — avoid
Edoxaban/Dabigatran per BOB guidance"]:::review
DOAC_WT_GATE -- "No (Apix/Rivar)" --> WT_ASSESSED
FLAG_EDOX_DAB_WT --> WT_ASSESSED
WT_CHECK -- "Wt 40–49 kg" --> DAB_50_CHECK{"Prescribed DOAC:
Dabigatran?"}:::decision
DAB_50_CHECK -- "Yes (Dabigatran)" --> FLAG_DAB_50["Flag: Weight <50kg — consider 110mg BD
if high bleed risk per BOB guidance"]:::review
FLAG_DAB_50 --> WT_ASSESSED
DAB_50_CHECK -- "No (Apix/Rivar/Edox)" --> DRUG_ROUTER{"Select Prescribed DOAC"}:::decision
WT_CHECK -- "Standard (50–120 kg)" --> DRUG_ROUTER
WT_ASSESSED -- "Yes" --> FLAG_WT_MUTED["Flag: Weight review verified (Muted)"]:::action
WT_ASSESSED -- "No" --> FLAG_WT_REV["Flag: Weight alert active (Status -> CP Review)"]:::review
FLAG_WT_MUTED --> DRUG_ROUTER
FLAG_WT_REV --> DRUG_ROUTER
DRUG_ROUTER -- "Apixaban" --> APIX["Apixaban Sub-Engine"]:::action
DRUG_ROUTER -- "Rivaroxaban" --> RIV["Rivaroxaban Sub-Engine"]:::action
DRUG_ROUTER -- "Edoxaban" --> EDOX["Edoxaban Sub-Engine"]:::action
DRUG_ROUTER -- "Dabigatran" --> DAB["Dabigatran Sub-Engine"]:::action
APIX --> OUTER_CHECKS
RIV --> OUTER_CHECKS
EDOX --> OUTER_CHECKS
DAB --> OUTER_CHECKS
OUTER_CHECKS --> AG_GATE{"Advice & Guidance Gate:
A&G Date (Col Y) ==
Anticoag Rev Date (Col T)?"}:::decision
AG_GATE -- "Yes (Same Date Match)" --> SPEC_ROUTE["Route to Awaiting Specialist
(CP Review Suppressed into Specialist)
Tech Recall maintained if due"]:::specialist
AG_GATE -- "No / Unmatched" --> BADGE_SYNTHESIS["Synthesise Final Status Badges & Flags
(Tech Recall · Awaiting Specialist · CP Review · GP Review · Dose OK)"]:::gate
SPEC_ROUTE --> BADGE_SYNTHESIS
flowchart TD
classDef decision fill:#0f172a,stroke:#38bdf8,stroke-width:2px,color:#fff;
classDef review fill:#7f1d1d,stroke:#f87171,stroke-width:1px,color:#fee2e2;
classDef ok fill:#14532d,stroke:#4ade80,stroke-width:1px,color:#dcfce7;
classDef contra fill:#991b1b,stroke:#ef4444,stroke-width:2px,color:#fff;
APIX_START(["Apixaban Evaluation"]) --> IND_CHECK{"Indication"}:::decision
IND_CHECK -- "AF" --> AF_CRCL{"CrCl (ml/min)"}:::decision
AF_CRCL -- "CrCl < 15" --> APIX_AF_ESRD["Rec: Avoid (Spec. Advice)
Flag: CrCl <15 — avoid
Status: CP Review"]:::contra
AF_CRCL -- "CrCl 15–29" --> APIX_AF_RENAL["Rec: 2.5mg BD
Reduction Flag: CrCl 15–29 -> 2.5mg BD"]:::action
APIX_AF_RENAL --> APIX_AF_RENAL_DOSE{"Prescribed Dose?"}:::decision
APIX_AF_RENAL_DOSE -- "== 2.5mg" --> APIX_AF_RENAL_OK["Status: Dose OK
Chip: Green .chip.assessed"]:::ok
APIX_AF_RENAL_DOSE -- "!= 2.5mg" --> APIX_AF_RENAL_WRONG["Flag: Wrong Dose / Above max dose (pulsing purple)
Reduction Flag: Pink .chip.flag
Status: CP Review"]:::review
AF_CRCL -- "CrCl >= 30" --> APIX_SCORE["Score 3 Reduction Criteria:
1. Age >= 80
2. Weight <= 60 kg
3. SCr >= 133 µmol/L"]:::decision
APIX_SCORE -- "Score >= 2" --> APIX_REC_25["Rec: 2.5mg BD
Reduction Flag: >=2 reduction criteria met"]:::action
APIX_REC_25 --> APIX_25_DOSE{"Prescribed Dose?"}:::decision
APIX_25_DOSE -- "== 2.5mg" --> APIX_25_OK["Status: Dose OK
Chip: Green .chip.assessed"]:::ok
APIX_25_DOSE -- "!= 2.5mg" --> APIX_25_MISMATCH["Flag: Wrong Dose / Above max dose (pulsing purple)
Reduction Flag: Pink .chip.flag
Status: CP Review"]:::review
APIX_SCORE -- "Score < 2" --> APIX_REC_5["Rec: 5mg BD (Standard AF)"]:::action
APIX_REC_5 --> APIX_5_DOSE{"Prescribed Dose?"}:::decision
APIX_5_DOSE -- "== 5mg" --> APIX_5_OK["Status: Dose OK"]:::ok
APIX_5_DOSE -- "< 5mg" --> APIX_5_UNDER["Flag: Below 5mg BD
Status: CP Review"]:::review
APIX_5_DOSE -- "> 5mg" --> APIX_5_OVER["Flag: Above max dose
Status: CP Review"]:::review
IND_CHECK -- "VTE" --> VTE_DOSE{"Prescribed Dose?"}:::decision
VTE_DOSE -- "2.5mg BD" --> VTE_25_EXT{"Extended Phase Assessed
within 12m?"}:::decision
VTE_25_EXT -- "Yes" --> VTE_25_OK["Rec: 2.5mg BD (Extended prevention)
Flag: Extended phase reviewed
Status: Dose OK"]:::ok
VTE_25_EXT -- "No" --> VTE_25_UNCONF["Rec: 2.5mg BD (Extended prevention)
Flag: Extended phase — confirm phase & duration
Status: CP Review"]:::review
VTE_DOSE -- "5mg BD" --> VTE_5_DATE{"Diagnosis Date Available?"}:::decision
VTE_5_DATE -- "No Date" --> VTE_5_NODATE["Rec: 5mg BD (Confirm duration)
Flag: VTE full dose — confirm planned duration
Status: CP Review"]:::review
VTE_5_DATE -- "Date Present" --> VTE_5_AGE{"Months Since Diagnosis?"}:::decision
VTE_5_AGE -- "> 6 Months" --> VTE_5_OVER6M["Rec: 5mg BD (Review duration/step-down)
Flag: VTE full dose >6m — review step-down/stopping
Status: CP Review"]:::review
VTE_5_AGE -- "<= 6 Months" --> VTE_5_ACUTE["Rec: 5mg BD (Acute phase)
Flag: VTE acute phase (Diagnosed Date)
Status: Dose OK"]:::ok
VTE_DOSE -- "10mg BD" --> VTE_10_CHECK["Rec: 10mg BD (Initial 7 days only)
Flag: 10mg BD — verify within initial 7 days
Status: CP Review"]:::review
VTE_25_OK & VTE_25_UNCONF & VTE_5_NODATE & VTE_5_OVER6M & VTE_5_ACUTE & VTE_10_CHECK --> VTE_CRCL_OVERRIDE{"CrCl < 15 ml/min?"}:::decision
VTE_CRCL_OVERRIDE -- "Yes" --> VTE_CRCL_ESRD["Rec: Avoid (Spec. Advice)
Flag: CrCl <15 — avoid
Status: CP Review"]:::contra
VTE_CRCL_OVERRIDE -- "No" --> APIX_OUT(["To Outer Monitoring Layer"])
flowchart TD
classDef decision fill:#0f172a,stroke:#38bdf8,stroke-width:2px,color:#fff;
classDef review fill:#7f1d1d,stroke:#f87171,stroke-width:1px,color:#fee2e2;
classDef ok fill:#14532d,stroke:#4ade80,stroke-width:1px,color:#dcfce7;
classDef contra fill:#991b1b,stroke:#ef4444,stroke-width:2px,color:#fff;
classDef warn fill:#78350f,stroke:#fb923c,stroke-width:1px,color:#ffedd5;
subgraph RIVAROXABAN ["RIVAROXABAN"]
RIV_IND{"Indication"}:::decision
RIV_IND -- "AF" --> RIV_AF_CRCL{"CrCl (ml/min)"}:::decision
RIV_AF_CRCL -- "< 15" --> RIV_AF_C15["Rec: Avoid (Contraindicated)"]:::contra
RIV_AF_CRCL -- "15–49" --> RIV_AF_C50["Rec: 15mg OD (Renal reduction)
Dose == 15 -> Dose OK (Green assessed chip)
Dose != 15 -> CP Review (Pink flag + Above max dose)"]:::warn
RIV_AF_CRCL -- ">= 50" --> RIV_AF_STD["Rec: 20mg OD (Standard AF)
Dose != 20 -> CP Review"]:::ok
RIV_IND -- "VTE" --> RIV_VTE_DOSE{"Dose"}:::decision
RIV_VTE_DOSE -- "10mg OD" --> RIV_VTE_10["10mg OD (Extended prevention)"]:::action
RIV_VTE_DOSE -- "20mg OD" --> RIV_VTE_20["20mg OD Full Dose
Check >6m duration / confirm duration"]:::action
RIV_VTE_DOSE -- "15mg OD" --> RIV_VTE_15{"CrCl 15–49?"}:::decision
RIV_VTE_15 -- "Yes" --> RIV_VTE_15_RENAL["15mg OD (Renal reduction confirmed)
Green assessed chip (.chip.assessed)"]:::action
RIV_VTE_15 -- "No" --> RIV_VTE_15_ACUTE["15mg BD (Initial 21 days) or 20mg OD
Flag: Confirm acute-phase/renal"]:::warn
end
subgraph EDOXABAN ["EDOXABAN"]
EDOX_CRCL{"CrCl & Weight"}:::decision
EDOX_CRCL -- "AF & CrCl >= 95" --> EDOX_HIGH["Flag: CrCl >=95 not recommended
Status: CP Review"]:::warn
EDOX_CRCL -- "CrCl < 15" --> EDOX_C15["Rec: Avoid (Contraindicated)"]:::contra
EDOX_CRCL -- "CrCl 15–50 OR Wt <= 60kg" --> EDOX_30["Rec: 30mg OD (Reduction criteria met)
Dose == 30 -> Dose OK (Green assessed chip)
Dose != 30 -> CP Review (Pink flag + Above max dose)"]:::warn
EDOX_CRCL -- "CrCl > 50 & Wt > 60kg" --> EDOX_60["Rec: 60mg OD (Standard)
Dose != 60 -> CP Review"]:::ok
end
subgraph DABIGATRAN ["DABIGATRAN"]
DAB_IND{"Indication"}:::decision
DAB_IND -- "AF" --> DAB_AF_CRCL{"CrCl & Age"}:::decision
DAB_AF_CRCL -- "CrCl < 30" --> DAB_AF_C30["Rec: Avoid (Contraindicated)"]:::contra
DAB_AF_CRCL -- "Age >= 80 OR CrCl 30–49" --> DAB_AF_110["Rec: 110mg BD (Age/Renal reduction)
Dose == 110 -> Dose OK (Green assessed chip)
Dose != 110 -> CP Review (Pink flag + Above max dose)"]:::warn
DAB_AF_CRCL -- "Age < 80 & CrCl >= 50" --> DAB_AF_150["Rec: 150mg BD (Standard AF)"]:::ok
DAB_IND -- "VTE" --> DAB_VTE_CRCL{"CrCl Check"}:::decision
DAB_VTE_CRCL -- "CrCl < 30" --> DAB_VTE_C30["Rec: Avoid (Contraindicated)
CP Review (CrCl <30 — avoid)"]:::contra
DAB_VTE_CRCL -- "CrCl >= 30" --> DAB_VTE_CRIT{"Age >= 80 OR CrCl < 50?"}:::decision
DAB_VTE_CRIT -- "Yes" --> DAB_VTE_110["Rec: 110mg BD (Reduction criteria met)
Dose == 110 -> Dose OK (Green assessed chip)
Dose != 110 -> CP Review (Pink flag)"]:::warn
DAB_VTE_CRIT -- "No" --> DAB_VTE_150["Rec: 150mg BD (Standard VTE after parenteral)"]:::ok
end
flowchart TD
classDef gate fill:#7c3aed,stroke:#a78bfa,stroke-width:2px,color:#fff;
classDef tech fill:#581c87,stroke:#c084fc,stroke-width:1px,color:#f3e8ff;
classDef review fill:#7f1d1d,stroke:#f87171,stroke-width:1px,color:#fee2e2;
classDef ok fill:#14532d,stroke:#4ade80,stroke-width:1px,color:#dcfce7;
classDef caution fill:#78350f,stroke:#fb923c,stroke-width:1px,color:#ffedd5;
classDef specialist fill:#4c1d95,stroke:#c084fc,stroke-width:2px,color:#f3e8ff;
CHECK_START(["Outer Safety Checks Pipeline"]) --> FRAIL_CHECK{"Frailty Assessment
(eFI score or text)"}
FRAIL_CHECK -- "Frail (eFI > 0.12)" --> FRAIL_INTV["4-month Monitoring Cap
(No visible flag or GP note)"]:::caution
FRAIL_CHECK -- "Fit (eFI <= 0.12) / None" --> CRCL_INTV{"CrCl Level"}
CRCL_INTV -- "CrCl < 60 ml/min" --> CALC_INTV["Interval: CrCl / 10 months
(1 to 6 months)"]
CRCL_INTV -- "CrCl >= 60 ml/min" --> STD_INTV["Interval: 12 months standard"]
CALC_INTV & STD_INTV --> AGE_CAP{"Age >= 75?"}
AGE_CAP -- "Yes" --> CAP_4M["Cap interval at 4 months max"]:::caution
AGE_CAP -- "No" --> FINAL_INTV["Set Monitoring Interval"]
CAP_4M --> FINAL_INTV
FRAIL_INTV --> FINAL_INTV
FINAL_INTV --> BLOOD_EVAL["Evaluate Blood Statuses vs Interval:
- U&E (Serum Creatinine)
- LFT (ALT & Bilirubin)
- FBC (Haemoglobin & Platelets)"]
BLOOD_EVAL --> BLOOD_GATE{"Any Bloods Due OR
Weight == null OR
CrCl == null?"}:::gate
BLOOD_GATE -- "Yes" --> ADD_TECH["Add Status: Tech Recall
Flag: 'Incomplete monitoring — dose unverified'"]:::tech
BLOOD_GATE -- "No" --> LAB_VALUES["Check Specific Lab Values"]
ADD_TECH --> LAB_VALUES
LAB_VALUES --> ALT_CHECK{"ALT > 2x ULN (>90) OR
Bili > 1.5x ULN (>31.5)?"}
ALT_CHECK -- "Yes" --> HEPATIC_FLAG["Flag: Hepatic Impairment Alert
Status elevated to GP Review"]:::caution
ALT_CHECK -- "No" --> FBC_CHECK{"Anaemia (Hb <130 M, <120 F) OR
Platelets < 100?"}
FBC_CHECK -- "Yes" --> FBC_FLAG["Flag: Anaemia / Thrombocytopenia
Status elevated to GP Review"]:::caution
FBC_CHECK -- "No" --> INTERACT_CHECK{"Interacting Drug (Col R)?"}
INTERACT_CHECK -- "Yes" --> INT_REV{"Reviewed within 12m &
Prescribed on/before Review Date?"}
INT_REV -- "Yes" --> INT_MUTED["Flag: Interaction reviewed (Assessed)"]:::ok
INT_REV -- "No (New / Added Post-Review)" --> INT_ACTIVE["Flag: Interact: [Drug Name] (post-review)
Status elevated to CP Review"]:::review
INTERACT_CHECK -- "No" --> GP_ESCALATION{"GP Contact Coded in EMIS
within last 3 months?"}
INT_MUTED & INT_ACTIVE & HEPATIC_FLAG & FBC_FLAG --> GP_ESCALATION
GP_ESCALATION -- "Yes (Recent GP Contact)" --> MUTE_GP["Flag: GP Contacted re: Bloods
Review elevated to GP Caution"]:::ok
GP_ESCALATION -- "No" --> AG_CHECK{"Advice & Guidance (Col Y)
matches Anticoag Rev Date (Col T)?"}:::decision
MUTE_GP --> AG_CHECK
AG_CHECK -- "Yes (Same Day Match)" --> AG_SPEC["Triaged to Awaiting Specialist
• CP Review suppressed
• Flag: Awaiting Specialist (Xd ago)
• Tech Recall active if due"]:::specialist
AG_CHECK -- "No / Differing Dates" --> COMPOSE_BADGES["Final Output Badges:
• Tech Recall (Purple)
• Awaiting Specialist (Purple / Lavender)
• CP Review (Red)
• GP Review (Amber)
• Dose OK (Green)"]
AG_SPEC --> COMPOSE_BADGES
| Condition / Check | Trigger Logic | Engine Action | Status Badge & Chip Indicator |
|---|---|---|---|
| Missing SCr or Weight | crcl === null |
Immediate early return. Recommended dose suppressed (—). Downstream logic bypassed. |
Tech Recall .chip.tech |
| Weight Extremes | wt < 50kg or wt > 120kg |
Flags extreme weight; prompts CP review unless reviewed within past 12 months. | CP Review (or Assessed if reviewed) |
| Drug Interactions | Interacting drug in Col R | Flags for CP review. Assessed if reviewed within 12m and added on/before review date. Flags if added post-review. | CP Review (or Assessed if reviewed) |
| Advice & Guidance / Specialist | adviceGuidanceDate === doacReviewDate (Col Y == Col T) |
Triages patient into dedicated “Awaiting Specialist” tab and status. CP Review is suppressed into Awaiting Specialist. Tech Recall remains active if bloods or weight are due. | Awaiting Specialist .chip.specialist |
| Apixaban AF (≥2 Criteria or Renal) | Age ≥80, Wt ≤60kg, SCr ≥133 (or CrCl 15–29) | Mandates 2.5mg BD. • Prescribed 2.5mg BD: Verified reduction confirmed. • Prescribed 5mg BD: Unreduced regimen flagged. |
• On 2.5mg BD: Dose OK + ≥2 reduction criteria met / CrCl 15–29 -> 2.5mg BD • On 5mg BD: CP Review + Reduction flag + Above max dose |
| Rivaroxaban AF (Renal Reduction) | CrCl 15–49 ml/min | Mandates 15mg OD. • Prescribed 15mg OD: Verified reduction confirmed. • Prescribed 20mg OD: Unreduced regimen flagged. |
• On 15mg OD: Dose OK + CrCl <50 -> 15mg OD • On 20mg OD: CP Review + CrCl <50 -> 15mg OD + Above max dose |
| Edoxaban AF/VTE (Reduction Criteria) | CrCl ≤50 ml/min or Wt ≤60kg | Mandates 30mg OD. • Prescribed 30mg OD: Verified reduction confirmed. • Prescribed 60mg OD: Unreduced regimen flagged. |
• On 30mg OD: Dose OK + Reduction criteria -> 30mg OD • On 60mg OD: CP Review + Reduction criteria -> 30mg OD + Above max dose |
| Dabigatran AF/VTE (Reduction Criteria) | Age ≥80 years or CrCl 30–49 ml/min | Recommends 110mg BD. • Prescribed 110mg BD: Verified reduction confirmed. • Prescribed 150mg BD: Unreduced regimen flagged. |
• On 110mg BD: Dose OK + Age ≥80 / CrCl <50 -> 110mg BD • On 150mg BD: CP Review + Age ≥80 / CrCl <50 -> 110mg BD + Above max dose |
| VTE Duration >6 Months | Full dose (5mg Apix / 20mg Riv) >6m | Prompts clinician to review step-down to extended prevention dose or cessation. | CP Review .chip.flag |
| Hepatic Elevation | ALT >90 U/L or Bili >31.5 µmol/L | Flags liver enzymes >2× / >1.5× ULN. Contraindicated in Child-Pugh B/C. | GP Review .chip.warn |
| Haematology / Bleed Risk | Hb <130 (M) / <120 (F) or Plt <100 | Flags anaemia or thrombocytopenia for clinical GP review. | GP Review .chip.warn |