Marcus Webb3 itemsEPS Gate-blocked: CHARGE_RESOLVED, EXEMPTION_EVIDENCE09:33Labelling
Clinical check 4
Susan Bell4 itemsEPSRTEC ✓ maternity09:31CheckingAK
Severe interaction — warfarin + miconazole. Open the check to resolve.
Oakwood Care Home14 items · batchMDS09:20Batch
Accuracy check 1
Leon Murphy2 itemsEPSCharge unresolved09:12ScanTM
Ready — checked & bagged 5
Ahmed Hassan2 itemsDeclaration ✓EPS09:05Ready
Eleanor Wright1 itemAge exemptPaper08:58Ready
Double-click a status pill to advance (audited via the state-machine service) · drag between groups to reassign · F2 jumps to next actionable · scanner input always captured.
Rx — Margaret ThompsonEPS acuteReceived
Short-form ID 9A3F2E-X81004-44C7Z1 · signed by Dr R. Mehta (GP, Park Road Surgery A81021) · 12 Jun 2026
Item
Qty
Status
Amlodipine 5mg tablets
28
To dispense
Atorvastatin 40mg tablets
28
To dispense
Levothyroxine 75mcg tablets
28
To dispense
Exemption: Age (78) — derived from DOB, no RTEC call needed. Charge status: exempt.
Same-day supply detected — Levothyroxine 75mcg
This patient already received 1 supply of this item today (09:10 emergency supply, 7 tablets). A picking/double-supply interrupt fires before this item dispenses — distinct from the CDS duplicate-therapy screen (§2.13 / B3-1).
Approve is gated: 1 of 1 severe alert must be resolved/overridden and 3 of 4 warnings still need acknowledgement before the check can pass (SM-2).
Susan Bell · 72 · ♀ · NHS 943 476 5919 PDS ✓
Penicillin allergy Maternity (RTEC)
Items (4)
Warfarin 3mg tablets ×28
Amoxicillin 500mg capsules ×21
Miconazole oral gel 80g
Atorvastatin 20mg tablets ×28
Decision-support categories screened: Interaction · Allergy · Dose · Duplicate · Pregnancy/lactation · Contraindication. Every red resolves and every amber acknowledges before Approve unlocks.
SEVERE — Interaction · bleeding risk
drug_drugevidence: studyonset: delayed
Miconazole significantly potentiates warfarin (CYP2C9 inhibition). Resolve before approval — no silent pass. Management: avoid concurrent use / suspend miconazole, monitor INR.
Amoxicillin vs recorded penicillin allergy (severity: moderate, GP record, coded — machine-screened).
allergy v89 · not yet acknowledged
Uncoded allergy notes (verbatim)
"Came up in blotches with co-codamol once — also says shellfish disagrees with her."
Not machine-screened — free text only, no allergen_code. Coded entry required for the CDS check to screen it; review by the pharmacist is the backstop.
Warning — Duplicate therapy
Atorvastatin (this Rx) duplicates simvastatin 20mg on the current medication set — same therapeutic class (HMG-CoA reductase inhibitor).
duplicate v41 · not yet acknowledged
Pregnancy — not screened
Not screened — no pregnancy status recorded for this patient. Pregnancy/breastfeeding screening could not run; default reads unknown, never "not pregnant".
pregnancy v18 · lactation v18
Dose within range
All doses within band for the patient inputs available.
Resolved band: adult 18–64, 80 kg (from age + weightKg; no paediatric/BSA band applied).
Renal / hepatic band not evaluated — no eGFR/CrCl or LFT on record (reported not-evaluated, never "within range").
Suggest counselling on bleeding signs; consider INR recheck timing. Never blocks or passes the check.
Screened by cds module · FDB Multilex 2026.05 — interactions v126, allergy v89, dose v54, duplicate v41, pregnancy v18, lactation v18 (per-card version shown above) · patient record as of 09:31 · result snapshot retained (device traceability).
Accuracy check — Leon Murphy2 packs
Scan each pack's GS1 DataMatrix — verified against the chosen AMP from product choice (§2.12). The active field always captures scanner input. Robot-assembled packs (WWKS2) still pass this same check — see Robot Output (§2.19, Designed).
Prescribed
Scanned (GTIN → AMP)
Batch / expiry
Verdict
Sertraline 50mg tablets ×28 (VMP)
Sertraline 50mg — Zentiva (AMP)
L2406A · 03/2028
Match
Salbutamol 100mcg inhaler ×1
— awaiting scan —
—
Pending
A scan resolving to a different VMP fails hard and one-tap drafts a near-miss (LASA/picking). Offline: resolves against the cached dm+d slice; unresolvable → explicit “cannot verify offline”, never auto-pass.
Handout — Ahmed HassanReady · checked & bagged
Collector
Collector type
Name
No Sch 2 CD lines — FP10DT token not required. CD handout would demand collector identity + ID check + FP10DT signature before completion.
RP present (A. Khan) — handout permitted. During RP absence only checked-and-bagged items under a recorded reg-220B authorisation.
Charges (claims-finance panel)
RTEC check (at labelling)No match
Items chargeable2 × £9.90 = £19.80
Resolve charge status
Declaration category (effective-dated)
Income Support / income-based JSA removed 15 Apr 2026 — picker only offers currently-effective categories. DN + PSU “collected” fire on completion.
3 selectedBatch ops audited per row (actor + reason); re-process re-runs the gate chain, never auto-passes.
New scripts 5
Margaret Thompson3 items · EPS acute9A3F2EDownloaded 09:42
John Okafor1 item · eRD 2/69D45A1RTEC ✓
Priya Patel5 items · urgent7F0C19RTEC pending
Failed / rejected 2
Marcus WebbDN failed — attempt 3 of 85B71D2OperationOutcome · transient
Leon MurphyClaim rejected — SSP ref format3A92E7Claim · invalid endorsement
DNs and claims send automatically (DN per supply event at handout; claim sweep after gateClaim() passes — SM-6). The actions here are the manual/exception controls: send-now, re-send failed, withdraw DN, amend claim, return to Spine, per-row View FHIR/XML source, and a multi-select batch clear/re-process over selected rows (ProScript F3/F4/F7/F8 equivalents + G2.1 batch parity — AC-40).
FP10PCD — monthly NHSBSA submission statusRead-only · owned by claims-finance
Private CD (FP10PCD) forms are reimbursement-free but statutorily submitted to NHSBSA monthly, separate from FP34C. The tracker is owned by claims-finance (claim_fp10pcd_submissions); this console surfaces it read-only — each FP10PCD supply contributes to the month's count (PCD-2 / CD-10).
Period
FP10PCD forms
Submission
Evidence
Reminder
June 2026 current
7 contributed so far
Open — submit by 05 Jul
accumulating
due in 21d
May 2026
11
Submitted 04 Jun
batch ref NB-PCD-0524
—
April 2026
9
Submitted 03 May
batch ref NB-PCD-0423
—
Dispensing contributes but never owns the tracker — the submitted state, evidence and reminder are written on the claims-finance side (PCD-2).
eRD management
John Okafor — issue 3/6due 26 JunScheduled
Mary Quinn — issue 6/6final issueReview
D. Lloyd — prescriber cancelled issue 4Cancelled
Nominations
Nominated patients1,204
Nomination changes this week+9 / −3
One-off nominations pending2
No-steering rule: nomination is always the patient's choice — capture evidence on change.
Prescription trackerEPS Prescription Tracker FHIR — support tool
NHS number
Prescription ID (short form)
Result — Susan Bell · 2 prescriptions found on Spine
9A11FFIssued 10 JunDr Mehta, Park RoadWith dispenser — Timperley
8C03ADIssued 28 MayDr Mehta, Park RoadClaimed
“Patient says the GP sent it” workflow — shows where the script actually is (signed but not downloaded / with another dispenser / cancelled). Every trace is audited with care context.
Owings & split plans7 owings open · 2 split plans · ETA data from StockIQ (as of 09:44)
Two distinct concepts share this board: an owing is a short-supply (stock was not on hand); a split-dispensing plan is a planned multi-supply of an in-stock item for stock/clinical reasons — no urgent re-order loop, each split its own supply event + DN (§2.16 / SP-1).
Patient waiting 1
Priya PatelMethylphenidate 10mg ×28 owedOwingOn order — ETA Thu (conf 09:14)
Arriving 3
Susan BellWarfarin 3mg ×28 (14 owed)OwingAAH — tomorrow
Leon MurphySalbutamol inhaler ×1OwingArrived — collect from tote 3
Eleanor WrightQuetiapine 100mg ×112 — 4 splits × ×28 (clinical, weekly review)Split plan 2/4Next split due 21 Jun · DN per split
Tom Mills (staff Rx)Pregabalin 75mg ×84 — 3 splits × ×28Sch 3 CD · split plan 1/3 CD 28-day guard — splits 2 & 3 must fall ≤ 09 Jul
Open 3
D. LloydSch 3 CD — buprenorphine patchOwingDay 26 of 28 — auto-expires day 28
Sch 2/3 CD owing balances and split-plan supplies cannot be supplied after day 28 (SM-7 / SP-2) — auto-expiry creates a patient-notification task. A split plan never fires pmr.owing_created and never enters the StockIQ urgent-reorder loop; resolving an owing unblocks the claim.
MDS — cycles & trays
Production boardProfiles (41)Scripts dueCare-home batches
Oakwood Care Home — cycle 16 Jun–13 Jul · 12 residents
Margaret Thompson28-day · 4 trays · morning/lunch/evening/nightAssemblingTM
Harold Jenkins28-day · 4 traysClinical checkAK
Vera Singhmid-cycle change — dose ↑ ramiprilTray regeneration
Community patients 29 profiles
George Adams7-day dosette · collect FridaysReady wk 24
One MDS model only (no parallel schemas) · mid-cycle changes regenerate unchecked trays and flag checked ones · MAR chart prints with each batch · batch-ready emits to delivery + comms.
Instalment dispensing — FP10MDApaper-only workflow · today Fri 12 Jun
Due today 3
C. ReillyMethadone 1mg/ml — 60ml daily · supervisedSch 2Due
Mon ✓ · Tue ✓ · Wed ✓ · Thu — 1 missed · Fri 3 due · Sat 2 · Sun closed
Per-instalment collector capture · Sch 2 supplies write the CD register via compliance API · missed instalment requires an action note · claims via the monthly paper FP34C bundle (CM-10).
Paper / private intake Veterinary (POM-V)
Type = Veterinary (POM-V) — NHS number, PDS and exemption fields are hidden; the patient is the animal, billed private + VAT to the responsible owner. No EPS, no RTEC, no NHS claim (SM-13).
Type *
Animal patient *
Responsible owner *
Species / microchip
Veterinary surgeon (RCVS) *
Date on prescription
Items
Veterinary product (dm+d / VMD)
Qty
Directions
Metacam 1.5mg/ml oral suspension (meloxicam)
1 × 100ml
1.5ml once daily with food
+ add item…
Veterinary label preview
For animal treatment only · Keep out of the reach and sight of children Bella (Border Collie) — owner J. Okafor Metacam 1.5mg/ml oral susp · Give 1.5ml once daily with food Prescribed by Mr D. Frost MRCVS · Timperley Vets Supplied 14 Jun 2026 · Timperley Pharmacy, WA15 6QX
Veterinary supply writes the veterinary POM register (compliance, batch-mandatory, owner-keyed, 5-year retention — D-CC1/SM-13). No NHS claim — billed private + VAT 20% via claims-finance vet invoicing.
Private CD (FP10PCD) — type variantSch 3
Selecting Private CD (FP10PCD) reveals the CD-schedule, collector block, FP10DT token and the reg-22 requisition sub-panel below. Billed private (no NHS claim) but submitted to NHSBSA monthly via the claims-finance FP10PCD tracker (§2.18 / PCD-2).
CD schedule *
28-day window (CD)
FP10DT token
Collector block (required before handout)
Collector type
Collector name + ID seen
Signature on FP10DT Captured at handout
Reg-22 requisition (supply on requisition to pharmacy / practitioner / care home)
Direction
Requisitioner name + profession
Registration / address
Purpose
Product + quantity
Signed requisition form
Requisition particulars hand to the compliance CD register (statutory record, 2-year retention — reg 22/23). The resulting supply references this requisition_id.
Emergency supplies write the POM register via pomRegister.record() (compliance). Private prescriptions never enter the NHS claim path — billed via private invoicing (SM-11). FP10PCD is private CD: CD-register write + 28-day window + collector/FP10DT apply by schedule (PCD-1).
2 prescriber-request supplies are Rx-to-follow overdue — the 72h undertaking has lapsed and no prescription has arrived. Chase the prescriber; this is a statutory obligation (§2.20 / ES-2).
Today's supplies4
Rx-to-follow pending3
Overdue (72h lapsed)2
Resolved (Rx received)11
Today's supplies 4
Margaret ThompsonLevothyroxine 75mcg ×7 (until GP open)Patient requestNo Rx-to-followsupplied 09:10Logged
Susan BellWarfarin 3mg ×3Prescriber request Rx-to-follow by 16 Jun 11:40 · 45h leftsupplied 11:40Awaiting Rx
Ahmed HassanPrednisolone 5mg ×6Prescriber request Rx-to-follow by 17 Jun 13:30 · 71h leftsupplied 13:30Awaiting Rx
Rx-to-follow overdue 2
Eleanor WrightLatanoprost eye drops ×1Prescriber request — Dr A. Osei Overdue 9h · due was 14 Jun 05:15supplied 11 Jun
George AdamsTamsulosin 400mcg MR ×7Prescriber request — The Grange Overdue 31h · due was 13 Jun 07:00supplied 10 Jun
Resolved this week 3 of 11 shown
John OkaforMetformin 500mg ×14Prescriber requestRx received 12 Jun — within 72hsupplied 10 JunClosed
Derek ShawAmlodipine 5mg ×7Patient requestInterval check passed — no greater qty than neededsupplied 09 JunClosed
Two statutory bases, two records (ES-3): a patient-request supply captures the nature of the emergency + interval-since-last-supply + statutory-max and has no Rx-to-follow; a prescriber-request supply captures the prescriber undertaking and is overdue-tracked at supplied_at + 72h. Both feed the compliance POM register (emergency_supply_patient / emergency_supply_prescriber); the same overdue surface appears on the compliance inspection dashboard.
Emergency supply — intakePrescriber request
The statutory fields swap by basis: choose patient request for nature-of-emergency + interval check (no Rx-to-follow), or prescriber request for the 72h undertaking → an Rx-to-follow deadline is set and tracked (ES-1).
Request basis *
Patient *
Product (dm+d) *
Prescriber-request fields
Prescriber identity *
Quantity supplied
Undertaking received
Rx-to-follow by (auto +72h)
A prescriber-request supply must carry an Rx-to-follow deadline and is overdue-tracked — it cannot be saved without the prescriber undertaking.
Patient-request fields (hidden for this basis)
Nature of emergency
Interval since last supply
Statutory max quantity
No Rx-to-follow for patient-request supplies — they are not overdue-tracked.
On save: pomRegister.record() writes the matching entry kind to the compliance POM register; the supply is a CD entry too where the product is scheduled. The two bases never collapse to one record (ES-3).
The prescription names the VMP (Sertraline 50mg tablets) — choose the actual AMP + pack supplied. The chosen AMP drives the label, the endorsement and the reimbursement basis, and is what the accuracy-check GTIN must resolve to (DPC-1 / SM-3).
Available AMPs (dm+d of the prescribed VMP)
AMP — brand / supplier
Pack
Tariff basis
Stock
Sertraline 50mg tablets — Zentiva
28
Cat M
42
Sertraline 50mg tablets — Accord
28
Cat M
6
Lustral 50mg tablets — Viatris (brand)
28
Cat C
0
LASA caution — verify product name
Other products with similar names: Sertraline vs Sildenafil, and Lustral vs Lyrica. Confirm you have the correct product before supply.
records lasa_acknowledged_by · not yet acknowledged
Substitution reason (brand-written only)
Drug Tariff reimbursement context (display-only · as of 01 Jun 2026 DT)
Part VIIIA categoryCat M
Reimbursement price (28)£1.07
Broken-bulk thresholdpack ≥ £20 / <1 pack used
Out-of-pocket ruleclaim where > £0.05 OOP
BNF classification4.3.3 SSRIs
Pricing visibility at the counter — informs the choice + broken-bulk / out-of-pocket endorsement decision. Never re-computes reimbursement (claims-finance CM-6).
Binds accuracy check
The chosen AMP (Zentiva 28) sets the GTIN the accuracy scan must resolve to. A scan resolving to a different VMP fails hard and one-tap drafts a LASA/picking near-miss.
Endorsements — Priya Patel5 items 1 item not claimable until evidence
Data-driven endorsement engine — codes are auto-suggested (e.g. NCSO from the concession list) or added manually. Evidence is typed by code; an item carrying a code that needs evidence is not claimable until the evidence is captured (§2.14 / AC-39). PC/PNC are paper-only and never travel in an EPS claim.
Item
Code
Channel
Evidence (typed)
Claim state
Salbutamol 100mcg inhaler
NCSOauto
EPS + paper
From concession list (Jun 2026) — no manual evidence
Claimable ✓
Phenytoin 100mg caps ×84
SPspecial
EPS + paper
Not claimable — evidence missing
Methylphenidate 10mg ×28
BB
EPS + paper
Claimable ✓
Specialist emollient 500g
XP
EPS + paper
Claimable ✓
Co-codamol 30/500 ×30
PCpaper-only
Paper only
Links prescriber-contact record (illegible qty → confirmed) — see Contact prescriber
Paper bundle (no EPS claim)
Add endorsement code
Code
Applies to item
Channel applicability is denormalised from the registry: eps / paper / both. PC/PNC force paper_only and link a prescriber_contact_id.
Binds the accuracy check
Endorsement codes and the chosen AMP (from product choice) travel together on the claim. The endorsed quantity reads qty_supplied_rounded (OPD-aware), not quantity_prescribed.
FHIR / XML source — Margaret Thompson9A3F2E-X81004-44C7Z1Spine prescription-order
Read-only view of the raw EPS FHIR message as received from / sent to the Spine — a support & audit affordance (G2.1 parity). The displayed payload is the stored copy (hash-matched); it is never re-derived. Disclosure of the source view is itself audited.
FHIR Dispensing API payloads (prescription-order · dispense-notification · reimbursement claim · OperationOutcome) are retained per the EPS message-retention policy. Reachable per-row from the EPS console View FHIR/XML action (AC-40).
Margaret Thompson has already received 1 supply of Levothyroxine 75microgram tablets today. This is an interruptive prompt — it does not hard-block (the same medicine may legitimately be re-supplied, e.g. a lost/spilt dose or an MDS top-up), but you must acknowledge with a reason to proceed (§2.13 / SDS-1 / B3-1).
Prior same-day supplies (1)
Time
Item (dm+d / chosen AMP)
Qty
Basis
Supplied by
09:10
Levothyroxine 75microgram tablets — Almus
7
Emergency — patient request
T. Mills
This guard is distinct from & complementary to the CDS duplicate-therapy screen on the clinical check (same-class duplication across different products). Both can fire on one dispense; neither suppresses the other (SDS-3).
Reason to proceed *
Note (optional)
The acknowledgement is audited: operator + reason + the referenced prior supply event (SDS-2). For a Sch 2/3 CD this prompt additionally surfaces the 28-day CD-window context (SM-7).
Contact prescriber — Susan BellCo-codamol 30/500 ×30
A structured disp_prescriber_contacts record — who/when/method/reason/outcome/what-changed. The outcome drives the PC (prescriber contacted) or PNC (prescriber not contacted) paper-only endorsement (§2.14 / PCN-1/2 / AC-32). PC/PNC never travel in an EPS claim.
PC/PNC are paper-only (paper_only = true) — accepted via the claims-finance paper-bundle gate (CM-10), never an EPS Claim (PCN-2). A confirmed_as_written with no change still records the contact as the resolving evidence (PCN-3).
Links to
Drives the endorsement
On save, the endorsement carries this record's prescriber_contact_id and disp.prescriber_contacted is emitted. The record is the evidence behind the PC/PNC code.
Record measurement — Susan BellSelf-reported · at counter
Inline capture point (§2.17 / B3-5 / AC-35). Dispensing provides the affordance; the authoritative observation is owned by clinical-services (clin_observations) — saved via its public API and marked self-reported. It does not block the dispense if clinical-services is unavailable (the capture queues).
Measurement
Type
Taken
Systolic (mmHg)
Diastolic (mmHg)
Height (cm)
Weight (kg)
BMI (derived)
Context
Note
Derived BMI
71.0 kg ÷ (1.62 m)² = 27.1 kg/m²Overweight range
May trigger a service
A BP reading at the counter may offer a hypertension case-finding / clinical-monitoring service — that downstream logic is clinical-services'. Dispensing only records the capture event (§9.1) and links the returned clin_observations reference (IC-3).
Boundary: a counselling/intervention note from the clinical check stays in dispensing (not double-recorded in clin_interventions) — only a service-significant intervention routes to clinical-services (IC-2 / OQ-14).
Split-dispensing plan — Eleanor WrightQuetiapine 100mg ×112Split 2 of 4
A planned multi-supply of an in-stock item for stock/clinical reasons — not an owing (no short-supply, no pmr.owing_created, no StockIQ urgent-reorder loop). The sum of split quantities equals the prescribed quantity; each split fires its own supply event + DN at its planned date (§2.16 / SP-1 / AC-34).
Splits planned4 × ×28
Supplied1 of 4
Prescribed total112
Next split due21 Jun
Per-split schedule
Split
Qty
Planned date
Supply event
DN
Status
1 of 4
28
07 Jun
SE-7741
Sent
Supplied
2 of 4
28
21 Jun
—
—
Due next
3 of 4
28
05 Jul
—
—
Scheduled
4 of 4
28
19 Jul
—
—
Scheduled
Σ split quantities (4 × 28 = 112) = quantity_prescribed. Each split produces its own supply event + DN at supply time; this is distinct on the board from an owing and from an FP10MDA instalment schedule (SP-3).
Create a split plan
Item (in stock)
Number of splits
Reason
CD 28-day guard (Sch 2/3)
For a Sch 2/3 CD, every split is bounded by the prescription's 28-day window (SM-7) — a split planned or supplied after day 28 is blocked at plan time and at supply time (SP-2). This Quetiapine plan is not a CD, so the guard is informational here; the Tom Mills pregabalin (Sch 3) plan shows the live block.
Recall — patients supplied a batchRead-only result surface
Read-only supply-history match (§2.9 / D-CC3 / AC-25). Deep-link target from the compliance recall workflow — answers "who did we supply this recalled product/batch to?". Where a supplied batch is unknown, the patient is surfaced for precautionary notification, never silently dropped.
This surface is read-only — the contact-action that blocks recall completion lives on the compliance recall screen (it consumes these matches). Batch-unknown rows cannot be excluded; they are flagged for precautionary notification (D-CC3).
Designed (pre-build). The WWKS2 client + Output step + provenance fields ship pre-built; live robot enablement is a per-site procurement/rollout decision (§2.19 / AC-37 / OQ-21). This screen is an honest depiction of the designed flow, not a live integration.
Returned pack data (GTIN · batch L2406A · expiry 03/2028 · pack_serial) flows into disp_supply_event_items. The robot is an assembler, not a substitute for the statutory accuracy check (RB-2).
Still passes accuracy check
The GTIN/batch the robot returns is verified against the chosen AMP exactly as a manual pick. A reservation that cannot be fulfilled (out of robot stock) falls back to manual assembly or an owing — never a silent pass.
CD hub-routing guard
A Sch 1–3 CD line is refused robot/hub routing (never crosses entity hub — HS-4 / RB-3). The MDS auto-filler (§2.7) is a distinct machine, not this single-pack WWKS2 robot.
Fallback (robot unreachable): "Robot Output unavailable" — fall back to manual assembly (or an owing if no stock). The manual pack still passes the accuracy check (RB-2). Data unavailable for live robot status — Designed state.
Patients
Search (name · maiden/old alias · DOB · NHS no · postcode · tag · care home)
Operational status (§2.7 · defaults to Active)
Other filter
Group by
Showing Active only · operational status is orthogonal to PDS-trace status and to deceased — none substitutes for another (INV-14). Deceased patients stay blocked regardless of operational status.
Oakwood Care Home grouped view · 2 of 12 residents match
Margaret Thompson14 Mar 1948 · 485 777 3456PDS ✓Large printMDSActivetoday
Harold Jenkins09 Sep 1939 · 401 223 8851PDS ✓ CovertActive2 Jun
Other patients order as returned · no matching level (INV-7)
Robert Thomson02 Jul 1961 · 625 339 1180PDS ✓Active3 Jun
Ann Thomas29 Jan 1990 · NHS unverifiedunverified SafeguardingActive28 May
Daniel Pryce12 May 1997 · 943 476 5919 Provisional — auto-created from EPSeps_auto · pending_verificationActivetoday
Bella(owner: John Okafor)~6 yrs est. · no NHS Animal · POM-VActive14 May
Claire Donnelly03 Sep 1982 · 943 476 5919PDS ✓Activeopening this record runs an access check
Three orthogonal "is this record live?" axes never conflated: operational status (Active default / Inactive / Moved away / Archived / Do-not-serve, §2.7) · PDS-trace status (verified / unverified / pending / trace-no-match / superseded) · deceased (clinical/legal, always-blocking). eps_auto records badge provisional until the nightly sweep traces them; do_not_serve shows an unmissable banner + reason at open but does not itself block dispensing.
Record views are audited with care context · safeguarding/AIS pills render with forced visibility everywhere the patient appears · PDS "no match" results render in PDS order with no matching level shown.
Register new patient PDS-firstStep 1 — trace & create · Step 2 — enrich the record
ScriptIQ is PDS-first: demographics (name, DOB, gender, address, registered GP, nominations) come from the PDS trace — staff never re-type them. Create from PDS auto-fills all of it; you then enrich the local-only fields in Step 2.
Human (PDS trace)Animal (POM-V — owner-keyed, no PDS)
Step 1 · Trace on PDS — creates a verified record CIS2 step-up active
NHS number
or Last name + DOB
PDS result — 1 match order as returned by PDS · no matching level shown (INV-7)
Daniel Pryce12 May 1997 · Male · 8 Mill Court, Timperley WA15 7JD PDS verified
Create from PDS auto-fills usual name + name uses · DOB · gender · primary home address · registered GP (ODS) · EPS nominations (read model) · sensitivity flag · NHS-number status — all PDS-mastered and read-only locally. registration_source = pds_trace.
Step 2 preview — complete the record (captured next, on the edit surface)
Local-only fields ScriptIQ captures after the PDS demographics land. None of these come from PDS — they are the PMR's authoritative record.
Use only when PDS is unavailable or the patient cannot be traced. Captures the minimum to hang a script off; demographics stay incomplete until the trace completes.
First name *
Last name *
DOB *
Lands nhs_number_status = unverified_manual, pds_sync_state = pending_verification; visibly badged provisional and queued for the nightly PDS re-verification sweep (and completed on next interactive open). NHS-number-dependent flows (EPS nomination view, RTEC exemption check) stay disabled until verified. registration_source = walk_in.
Every registration is view- and write-audited (actor · timestamp · branch).
Margaret ThompsonPDS ✓Age exempt Large print Oakwood Owes £8.85
PDS demographics last synced today 06:12 · née Hartley · operational status Active · DOB exact (PDS-traced).
OverviewMedicationsAllergiesConditionsPrescribersServicesCommsNotesDocumentsConsentBalancePDS syncGP record / SCR
Demographics
DOB / age
14 Mar 1948 · 78
NHS number
485 777 3456 (Modulus-11 ✓, PDS-verified)
Address
Oakwood Care Home, 4 Elm Grove, Timperley WA15 6QX
GP
Park Road Surgery (A81021) — Dr R. Mehta
Nomination
This pharmacy (FA512) since 2019 · history kept
Current medicationDerived from dispensing
Amlodipine 5mg tablets
once daily
last 14 May
Atorvastatin 40mg tablets
at night
last 14 May
Levothyroxine 75microgram tablets
once daily
last 14 May
Patient-asserted supplement (not in dispensing history)
Cod liver oil 1000mg capsules
once daily
Self-declared OTC
Apixaban 2.5mg tablets
twice daily
Hospital-initiated
Supplement is patient-asserted only (pat_current_meds); the authoritative view is the dispensing-derived list above.
Conditions (coded — feeds CDS)
Hypothyroidism
SNOMED 40930008
Active
Essential hypertension
SNOMED 59621000
Active
Atrial fibrillation
free-text
Not machine-screened
Absence of rows is not "no conditions" — CDS treats an empty list as not screened (fail-closed). Uncoded free-text rows render not machine-screened and are excluded from automated gating. Empty-state copy when none recorded: "Conditions not recorded — not screened".
Alerts & needs (forced visibility)
AIS — large print
All patient-facing material in ≥16pt; flag travels to labels, comms and the delivery manifest.
Care home resident
Oakwood — 28-day MDS cycle, round Tuesday.
Allergies
No drug allergies recorded (end-dated entries retained)
Exemption
Age exemption (78)Auto — DOB derived
No RTEC call needed; never declared.
Prescribers (roll-up)
Dr R. Mehta
Park Road Surgery · GMC 6041122
Registered GP
12 May
Dr H. Osei
Cardiology, Wythenshawe · GMC 7188340
Consultant
28 Apr
GtD OOH
Mastercall OOH · spurious G9999998
OOH
11 Mar
Dr S. Cole
The Spire, Manchester · GMC 6620451
Private
02 Feb
Patient-level roll-up (pat_prescribers); dispensing upserts last_prescribed_at on script receipt. Distinct from the PDS-sourced registered GP (read-only, above) and from the per-script prescriber on the prescription.
Pregnancy / breastfeeding
Status Unknown — not screened
Default unknown reads as not screened to CDS (fail-closed) — never "not pregnant". EDD / review surface only once a status is recorded; feeds the valproate/teratogen PPP gate.
Balance — Margaret Thompson Owes £8.85
patients holds the running balance (pat_patient_balance) but never adjudicates it — charge/owing lines arrive only from dispensing's handout capture. charge_status, HC2/HC3 redemption and FP57 reconciliation are owned by claims-finance; this screen reflects the net it is told.
Current balance£8.85
Oldest open14 May 2026
Last line14 May · charge
Date
Direction
Reason
Source
Amount
Status
14 May 2026
Charge
Rx charge — Apixaban (1 item)
dispensing · ref d4f1…
+£9.90
Open owing
14 May 2026
Payment
Counter — card
dispensing · ref d4f1…
−£9.90
Settled
06 May 2026
Charge
Owing — collected, pay later
dispensing · ref c12a…
+£9.90
Open owing
02 May 2026
Adjustment
Goodwill — short-dated stock
patients · Aisha Khan (mgr)
−£1.05
Applied
28 Apr 2026
Write-offvoided
Write-off (entered in error)
patients · voided 28 Apr
+£0.00
Voided
Append-only ledger (pat_balance_lines): corrections are a new offsetting line or a void — never an in-place edit. balance_minor always equals the signed sum of non-voided lines; a recalc job alarms on drift, never silent-corrects. adjustment/write_off are manager-gated; charge/payment originate from dispensing only. Drives the comms owing-arrival prompt and the debtor-ageing report.
Bella — Labrador (owner: John Okafor) Animal — POM-VNo NHS / no PDS Owes £42.60
Veterinary patient (patient_kind='animal'): no NHS number, no PDS sync, no EPS / nomination, no NHS charge-exemption — all suppressed and write-rejected (INV-10). Identity hangs off the owner as the responsible person; the owner carries contact, comms and the balance. Supplies are private + VAT-able (claims-finance owns vet invoicing).
OverviewAllergiesDocumentsNotesBalance
Animal
Name
Bella
Species / breed
Dog · Labrador Retriever
Sex
Female · neutered
Age / DOB
~6 yrs est.(approx — no exact DOB)
Microchip
985 1410 0072 4419
Insurance
Petplan · ref PP-88241
Owner (responsible person)animal_owner
Name
John Okafor
Address
17 Brackley Road, Timperley WA15 7LN
Mobile
07700 900614 SMS
Email
j.okafor@example.co.uk
comms isContactable() and delivery resolve the owner, not the animal. Mandatory single owner_related_person_id (INV-10).
Suppressed national-service surfaces
NHS number
Not applicable
PDS sync
local_only — never traced
EPS nomination
Hidden — paper/local Rx
Charge exemption
N/A — private + VAT
Writing an NHS number, a PDS state other than local_only, a nomination row or a pat_exemptions row to an animal record is API-rejected. Excluded from the nightly PDS re-verify sweep (active-population query filters patient_kind='human').
Allergies / sensitivities (species-appropriate)
No known drug allergies asserted — Tom Mills, 14 May 2026
Allergy model still applies (no SCR/NCRS source for animals). Absence of rows is not "no allergies".
Vet balance (owner)
Outstanding Owes £42.60
Last line: vet_invoice £42.60 (Apoquel 16mg × 30) · billed to owner. Charge-capture posts a vet_invoice/private_supply balance line — never an NHS-charge/exemption decision.
Edit patient — Margaret Thompson PDS verified Synced 02:14 today
Demographics are PDS-mastered. Local edits to PDS fields flag the record for re-verification against PDS on save. NHS number and registered GP are read-only (PDS-sourced, never pushed). All other sections below are locally owned (PMR is truth).
Per-purpose channel matrix (comms resolves the cascade from these)
Purpose
SMS
Email
Phone
Letter
NHS App
None
Ready for collection
Owing arrival
Service reminder
Delivery notice
Marketing (needs marketing consent)
Preferred contact times
Interpreter needed
Exemptions & charges — pat_exemptions
Exemption type
Certificate number
Valid to
Evidence
Status
Age-exempt (DOB-derived)
RTEC
No RTEC call needed
Age exemption is derived from DOB, never stored as a row. For PPC/MedEx/UC etc. a Verified via RTEC pill appears once the dispensing-flow RTEC check confirms; expiry warns 28 days before valid_to.
Allergies & sensitivities — pat_allergies · absence ≠ no allergies
Allergen
Type
Reaction
Severity
Source
Verified
Penicillin
Allergy
Urticarial rash
Moderate
GP record
Aisha Khan
Codeine
Intolerance
Nausea / drowsiness
Mild
Patient-reported
Unverified
Explicit assertion held: NKDA otherwise asserted — Aisha Khan, 12 May 2026. Severity scale: mild / moderate / severe / life-threatening. Source: patient-reported / SCR (NCRS) / GP / discharge / pharmacist.
Reasonable Adjustment Digital Flag (RADF): not yet linked (national RA-flag interplay reserved — OQ-7). Local reasonable_adjustment flag is the PMR-owned accommodation today. Active flags render wherever patient context renders.
No consent row is ever a precondition of dispensing or direct care (lawful basis is Art 6(1)(e)+9(2)(h)).
Documents — pat_documents · virus-scan gated
Document
Type
Uploaded
Status
MDS written consent.pdf
Consent form
03 Feb 2026 · Tom Mills
Clean
Care plan — Oakwood.pdf
Care plan
03 Feb 2026
Clean
Daughter ID (POA).jpg
Photo ID
03 Feb 2026
Clean
Audit: every field change is recorded with actor + before/after. NHS number is read-only (Modulus-11 validated, PDS-verified). Deceased marker blocks dispensing at API level; soft-delete only via the governed GDPR workflow, never row deletion.
Full national-service surfaces enabled; deltas applied ETag-based
pending_verification
Provisional record (walk-in stub / eps_auto) not yet traced
Badged provisional; NHS-no-dependent flows (EPS view, RTEC) disabled until traced
trace_no_match
PDS returned no match for the demographics
Record usable; re-traced every night; never an invisible fallback (§8.1)
decoupled
PDS returned a superseded NHS number (INV-4)
Flagged "wrongly identified"; must not push updates to PDS; guided re-trace + merge required
local_only
Animal patient — never enters PDS sync (§2.5)
Permanent; excluded from the nightly sweep
Superseded NHS number — record de-coupled from PDS (INV-4). A different example record (Robert Thomson, pds_sync_state='decoupled') received a supersession from PDS: the number 625 339 1180 has been retired and replaced nationally. The local record is flagged "wrongly identified"; outbound demographic updates to PDS are suppressed until resolved. Resolution is a guided re-trace and merge into the correct record — never a silent re-link.
A duplicate-review task is auto-created so the two diverging records resolve into one (§2.3).
Other non-synced states (worked examples)
Patient
State
Origin
Daniel Pryce
pending_verification
eps_auto — inbound EPS for an unknown NHS number; provisional record auto-created
Ann Thomas
trace_no_match
Manual registration, PDS returned no match; re-traced nightly
Sync policy (§8.1, normative). Coverage is prioritised and rolling, not all-active-nightly: pending_verification/trace_no_match re-verify every night; the active population (activity in last 90 days) re-verifies on a rolling cadence ordered by staleness, sized so every active patient is re-verified at least every 7 nights, with per-tenant batch caps keeping the estate-wide rate inside the contracted PDS app-restricted quota. Cadence slipping past 7 nights is itself an exception (coverage lag is reported honestly, never hidden — OPEN QUESTION 11). Deceased flag from PDS hard-blocks dispensing and opens an exception task · ETag-based, only deltas applied.
Care homes
Home
Residents
MDS cycle
Round day
Contact
Oakwood Care Home
12
28-day
Tuesday
Mrs P. Adler · 0161 980 4412
Cycle in prep
Riverside Lodge
8
28-day
Thursday
J. Coleman
OK
Oakwood Care HomeNursing4 Elm Grove, Timperley · CQC 1-2345678 · serving branch: Timperley
Residents12
MDS enrolled10
Wings2
Next roundTue 17 Jun
MAR / eMAR configuration (home-level · ProScript-parity)
Round times
08:00 · 12:00 · 18:00 · 22:00
MAR template
A4 · 28-day · 18 lines/sheet · backing-sheet on
Cycle anchor
28-day · Tuesday round
Picking list
Per-wing · blank-rows on
eMAR partner
Camascopesharing consent on file
GP practice
Park Road Surgery (A81021)
MAR-chart config lives here (pat_care_homes); the chart content is generated by dispensing. care_home_emar_sharing consent gates the eMAR feed.
Dorothy LaneRoom 18 · original packs Self-administersassessment SA-0907 · excluded from MAR round & pickingResident
Stanley FrostRoom 22 · MDS 28-day08:00 / 22:00 Hospital stay
Covert administration without an authorisation reference is rejected. A covert_administration=true flag requires a non-null covert_authorisation_ref (best-interests / MCA authorisation) — write-rejected otherwise; covert admin without authorisation is unlawful (INV-15). Crush authorisation is a separate clinical sign-off; self-administering residents are excluded from MAR-round & picking output.
One open (resident) residency per patient · wing must be one of the home's defined wings · status & wing/dose-round/self-admin/covert/crush changes emit pat.care_home_resident_changed (dispensing re-plans MDS + regenerates MAR annotations; delivery re-plans per-wing rounds).
Candidates surface from (a) NHS-number collisions (INV-1, auto-task), (b) demographic + former/maiden-name similarity on create/PDS-sync, (c) PDS supersession events (INV-4). multiple_birth and dob_is_estimated are read as disambiguators, not match boosters — twins at one address score as likely-distinct. There is no automatic un-merge; pre-merge snapshots make a supervised reconstruction possible (IG-governed).
NHS-number collision — auto-task (INV-1) two records share one NHS number — a defect state
943 476 5919Susan BellvsSusan A. Bellboth badge "possible duplicate" until resolved · warfarin patient
Demographic / maiden-name similarity
score 0.92Robert ThomsonvsRob Thomsonsame DOB 02 Jul 1961 · former-surname collision (Thomson née Thompson) · NHS vs paper-only
score 0.74Eleanor WrightvsEllie Wrightnickname alias hit · estimated DOB on one side (~1952) est-DOB widened the window — flagged
Multiple-birth — foregrounded as likely-distinct (§9.4) canonical wrong-patient hazard — never auto-suggest a merge
twinAisha Khan&Amira Khansame address · same DOB 18 Aug 2014 · birth-order 1 / 2 · distinguishing fields foregrounded Likely distinct — no merge offered
Merge is elevated-permission and fully audited; the losing row survives with merged_into_id + redirect (pat_merges). A "Not a duplicate" decision is also recorded (duplicate decisions are audited).
Merge preview — Robert Thomsoncandidate score 0.92 manager / superintendent
Wrong-patient merge combines two real people — the highest-severity action on this module. The dependent-object census below is a full online count; if any module API is unreachable the merge is blocked (fail-closed — a partial merge is worse than a delayed one). Statutory records in other modules are never rewritten — they keep their original patient UUID and resolve through the redirect, preserving original attribution.
Field-level diff — choose the surviving value per field
Field
Keep — Robert Thomson (NHS, 41 dispensings)
Merge away — Rob Thomson (paper, 2 dispensings)
Take
NHS number
625 339 1180 PDS ✓
—
Keep
DOB
02 Jul 1961 exact
02 Jul 1961 exact
Identical
Usual name
Robert Thomson
Rob Thomson
Former / maiden
Thompson (old)
—
Both retained
Address
14 Brook St, Timperley WA15 7QP
14 Brook Street, Timperley
Mobile
07700 900118
07700 900550 newer
Registered GP
Park Road Surgery (A81021)
none
Keep
Allergies / flags / consents
Penicillin allergy · 2 consents
NKDA asserted
Re-pointed, provenance preserved
Allergy / flag / consent rows are re-pointed to the winner with their original provenance intact — never overwritten or dropped.
Dependent-object census — counted live through each module's public API All modules responded
Module
Keep
Merge away
After merge
Treatment
Dispensing — prescriptions
41
2
43
Original UUID retained; resolves via redirect
Clinical services
3
0
3
Re-pointed
Claims / owings
£0.00
£9.90 open
£9.90
Balance lines re-pointed (append-only)
Documents
4
1
5
Re-pointed
Comms history
22
1
23
Re-pointed
Compliance — CD / POM register
2
0
2
Carve-out — never rewritten
Statutory register entries keep their original patient UUID (reg 20 no-alteration) and resolve through the tombstone redirect — they are counted but not re-pointed. A failed census on any module aborts the merge.
Reason for merge *
Performed as
Pre-merge snapshots of both records are stored in pat_merges for reversibility evidence; pat.patient_merged is emitted so consuming modules re-point caches/boards.
Confirm your identity to merge Forced re-authentication
Patient merge requires a fresh credential prompt — the same session rule as CD operations and system config (master plan §15). Your active session alone is not enough; re-enter your password and MFA to authorise this specific merge. A failed re-auth aborts the operation and is audited.
Re-authenticate
Signed in as
Password *
Authenticator code *
On success the merge executes, the loser is tombstoned (merged_into_id), a merge_audit_id is returned and recorded with this re-auth event id.
What you are authorising
Keep (winner)
Robert Thomson · 625 339 1180
Tombstone (loser)
Rob Thomson · paper-only
Records re-pointed
76 across 5 modules
Carve-out (not rewritten)
2 statutory register entries
Reversible
Supervised manual only (IG-governed)
There is no automatic un-merge.
Snapshots in pat_merges allow a supervised reconstruction; attempting it is an IG-governed operation.
Merge and GDPR actions are refused offline with explicit messaging (online-only, governed). The merge is blocked if the dependent-object census could not complete or if re-auth fails — both audited.
GDPR requests superintendent / IG
Open requests3
Due ≤ 7 days1
Awaiting approval1
Executing1
Patient
Type
Received
Due (1 month + ext)
State
Handler
Ann Thomas
SAR
2 Jun
2 Jul
scoped → approval
IG lead
(former patient — Mary Lomax)
Erasure
28 May
27 Jun
executing (3/6 modules)
IG lead
Thomas Ridley
Rectification
11 Jun
11 Jul
identity_verified
Manager
Erasure honours statutory retention minimums — clinical/statutory carve-out records are retained unmodified and restricted; only erasable classes are deleted/anonymised; the patient row reduces to a pseudonymised tombstone (pat.gdpr_erasure_executed purges non-statutory caches estate-wide). Never a raw DELETE. SAR export is signed-URL, watermarked and superintendent-gated.
Erasure request — Mary Lomax (former patient) Article 17executingReceived 28 May · due 27 Jun
Erasure state machine — pat_gdpr_requests (§2.4)
received identity_verified scoped approval executingcompleted
A rejected terminal branch (with reason letter) is also reachable from approval. Each transition is audited (actor, role, timestamp, is_remote).
Identity verification
Subject
Mary Lomax · DOB 04 Apr 1959 · former NHS 612 003 4471
Verification
SAR-grade — passport + proof of address seen Recorded
Verified by
Tom Mills (Manager) · 29 May 2026
Scope classification — each module's gdprScope() · erasable vs statutory carve-out
Class
Data
Treatment
Erasable
Marketing consents · comms history beyond need · tags · non-clinical notes · photo · communication prefs · duplicate-detection artefacts · household links · current-meds supplement · MDS suitability/consent · name aliases · non-PDS telecom/addresses
Deleted / irreversibly anonymised
Carve-out — retain
CD-register entries · POM register · RP log · dispensing/supply + EPS evidence (in period) · claim/endorsement evidence · clinical-service records (8y / 25th-birthday) · incident records
Retained unmodified, restricted — patient link not rewritten (reg 20)
Clinical (per-row)
Coded conditions · pregnancy status · prescribers — where part of the dispensing/clinical-safety record
Carve-out lawful basis: UK GDPR Art 17(3)(b) — legal obligation (statutory retention schedule + NHS RMCoP). Erasure must never delete or alter records the law requires the pharmacy to retain.
Dual approval — superintendent + IG/DPO (§2.4)
Superintendent
Aisha Khan Approved 02 Jun
IG / DPO
R. Okafor (DPO) Approved 03 Jun
Caldicott review
Not required (no disclosure-sensitivity)
Both approvals are mandatory before executing; recorded as IG evidence. A Caldicott Guardian review hook fires where disclosure issues arise.
Per-module completion ledger3 / 6 confirmed
Module
Erase
State
patients
aliases · prefs · notes · MDS
Confirmed
comms-patient
marketing history
Confirmed
claims-finance
non-statutory only
Confirmed
dispensing
carve-out retained
Running
delivery
PoD evidence retained
Pending
compliance
registers retained
Pending
The workflow never reports complete until every registered contributor confirms (AC-13/14). On a partway failure it halts in executing with this ledger and is resumable — an unregistered module is a CI failure, not a silent gap.
SAR export (this subject also lodged a SAR)
Aggregated ZIP — every module's gdprExport() Watermarked
Issuance is superintendent-gated, watermarked with requester + timestamp, signed-URL, and audited as a disclosure.
Statutory clock: 1 month from receipt (+ extension where complex). Every transition, approval and execution detail is audited.
Clinical servicesTimperley · today
Consolidation: ScriptIQ is absorbing the full provider side of PharmOutcomes + the Cegedim portal natively in the PMR. Per-service rollout is gated by G1 — NHS assurance (national services) and G2 — local-commissioner onboarding (local services); coexistence is interim only. See the service catalogue for each service's native/bridge status.
Red-flag answers (stridor, immunosuppression, quinsy) force an escalation outcome — no override on PGD supply (EP-5); the content pack, not the pharmacist, defines PGD legality. Score-gate & eGFR gate are enforced server-side.
Referral / triage notes & GP record (split panel)
Referral sourceWalk-in — no BaRS triage notes
GP Connect Access Record (CIS2 step-up)consent_to_record_access ✓
Allergies (from GP record)No penicillin allergy recorded
CDS decision support (cds.screen — fail-closed, EP-8)
Delayed-supply window (if selected)collect/start after 3 days · safety-netting mandatory
Label + tokenbatch “PF CP”
Charge£9.90 or exemption (claims-finance)
Safety-netting & intervention
Safety-netting checklist (mandatory) Worsening/duration advice given
Add pharmacist intervention (clin_interventions)
Report adverse reaction (Yellow Card)
Document outputs & completion
→ GP Connect Update Record (day-of / next working day; NHSmail fallback) · clin.episode_completed → claims-finance provisions £17 (MYS, verify by 5th) · counts toward CP fixed-payment band (24 → 30 = £1,000).
New Medicine Servicecap headroom: 31 of 38 (0.9% of items)
Identified 3
P. Whitfieldapixaban — started 11 JunOffer NMS
Engagement 2
R. Salimengaged 9 Jun · intervention window opens 16 JunScheduled
Intervention due 4
Susan Bellwindow 16–23 Jun · phone preferredDue
Follow-up 3
G. Adamsfollow-up complete · outcome: continueClaim-ready £28
Windows computed from the content pack (engagement +7…14d, intervention +14…21d) · out-of-window completion needs an audited reason and flags the claim · declined patients suppress re-identification 3 months.
VaccinationsFlu + COVID joint campaign
Recording route: NHS-assured Point-of-Care system (RAVS interim) — native capture is the OPEN QUESTION 1 decision. NBS mandatory for COVID appointments.
Recording delegated to NHS-assured PoC system (RAVS). ScriptIQ reconciles the administered set back into clin_vaccination_records; native capture (right) is enabled per OQ-1.
Patient
PoC ref
Vaccine / batch
NIVS
Reconcile
R. Khanna · 68
RAVS-88214
Flu aQIV · FL2471A
sent
Matched
P. Doyle · 73
RAVS-88231
COVID Comirnaty · CV0931
delegated_to_poc
No PMR draw-down — fix
Batch + expiry mandatory at administration · 15-min observation for COVID · GP/NIVS notified day-of/next-day · stock draw-down via pmr.service_supply.
Administer — H. Begum (71 ♀)Flu + COVID co-administrationCampaign pack autumn-2026 (pinned)
Mismatched or expired product blocks administration (mirrors the device-calibration block).
2 · Pre-screen contraindication checklist (mandatory, no skip)
Acute illness — “well enough today”?Yes — well
COVID — PEG / polysorbate allergy?No
Flu — egg allergy / prior anaphylaxis?No
Anticoagulation / bleeding disorder?Apixaban — fine pressure technique
A red-flag pre-screen answer blocks administration and forces the content-declared outcome (defer / refer) — EP-5 discipline. Responses stored in pre_screen_responses.
3 · Dose-interval / NIVS dose-history (fail-open)
COVID — prior dose history (NIVS read)NIVS unavailable — self-declared used
Self-declared: last COVID Apr 2026Interval > 91 days · dose_interval_ok
Flu — one dose this season?First this season
Where NIVS dose history is unavailable, capture is NOT blocked — “dose history not available — reason” recorded (fail-open-to-manual), self-declared history used (OQ-13).
4 · Co-administration & sites
Flu site / route
COVID site / route
Co-administration group Flu+COVID linked · permitted combo
Adverse event during observation?None observed so far
NIVS status
Red book (PCHR) updated
EMVS decommission ref
GP / record notifygp_connect_ur queued
A recorded observation-period reaction offers one-tap Yellow Card (§2.11, YC-1/YC-3) — distinct from LFPSE incident. Fees: flu £10.06 · COVID £8.70 (in-campaign) · stock draw-down pmr.service_supply.
Appointments — Fri 12 Jun
Time
Patient
Service
Modality
With
Status
10:30
H. Begum
Flu + COVID vax
In person
A. Khan
Arrived
11:15
Susan Bell
NMS intervention
Phone
A. Khan
Booked
14:30
M. Iqbal
HCF — ABPM fit
In person
T. Mills
Confirmed
15:00
B. Hughes
PF follow-up (DNA rebook)
In person
A. Khan
DNA risk
clin_appointments state machine: requested → booked → confirmed → completed | dna | cancelled · DNA raises the service follow-up task · NBS and portal book through this API.
Content packs (national assured) and private definitions are both instances of the same commissioner-configurable form/template engine — eligibility rules, stages, form-field schema, references and claim definition are config not code, all governed by the CC-3 lifecycle.
Pack
Active version
PGDs
Sign-off
Expiry
Pharmacy First — 7 pathways
v7 (live 1 Apr 2026)
12
CSO ✓
—
Contraception (PCS)
v3
4
CSO ✓
—
PGD — phenoxymethylpenicillin
v4
—
Adopted
03/2027
PGD — nitrofurantoin (UTI)
v2
—
Adopted
09/2026
Episodes pin the content version in force (historical records stay interpretable) · expired/withdrawn PGD blocks supply fail-closed (PGD-2) · activation emits clin.content_activated → staff competency invalidation.
Service registrations — Timperley
Service
MYS registration
Prerequisites
Status
Pharmacy First
Registered (evidence 12 Jan 2026)
HCF + PCS bundling ✓
Active
NMS
Registered
—
Active
Hypertension case-finding
Registered
BIHS-validated monitor ✓ · ABPM ×2
Active
Smoking cessation
—
setup fee £1,000 unclaimed
Not registered
Autumn vaccination campaign
milestone 31 Jul
PoC system decision (OQ-1)
Pending
EP-2: an episode cannot start without an active registration — fail closed. PF fixed payment requires HCF and PCS registration (bundling rule from 1 Jun 2025).
Pharmacy Firstpathway selector + active episodes
Pathway selector — clinical version resolved by date (PF v7, live 1 Apr 2026)
L. Chen · 31UTI · nitrofurantoin PGD · 111 onlineCPRespond by 12:02
Minor illness (MI) — referral only, £17, no gateway 1
B. Hughes · 24earache · GP referral · may transition → otitis media CPMIAwaiting assessment
Completed today 4
T. O'Neill · 66impetigo · fusidic acid PGD · exclusion letter issuedCP£17 claim-ready
CP monthly count drives the fixed-payment band (£500 at 20–29 · £1,000 at 30+, bundling: HCF+PCS) · MI/UMS excluded from the band · in-episode strand transition (MI → CP) re-resolves content + claimability (§2.3.5).
PINCER is a prescribing-safety audit, not a CPCF service (no episode, no MYS claim). Indicators + cohort are owned by cds (D-CC3); this module owns the audit cycle + intervention. Fail-closed: an audit cannot open without an active ref_cds_pincer_indicators version (PIN-5).
Open audits3
Cases to review14
Interventions this quarter22
At-risk reduction31 → 12
Open audits
Indicator
Cohort
Severity
Status
PINCER-A · NSAID, no gastroprotection, PU history
9
High
Reviewing
PINCER-C · non-selective β-blocker in asthma
3
Medium
Open
PINCER-E · methotrexate monitoring gap
2
High
Re-audit
indicator_version pinned at open (CC-4); re-audit recomputes current_at_risk_count against the same pinned version (PIN-3) — like-for-like improvement.
Cohort worklist — PINCER-A (NSAID / no PPI)
Susan Bell · 72naproxen 500mg + PU history · no PPIHigh · flagged
G. Adams · 64ibuprofen repeat · prior GI bleedUnder review
R. Salim · 58diclofenac · PPI added — GP feedback sentIntervened
K. Doyle · 67on PPI alreadyFalse positive
Case review — Susan Bell (72)
IndicatorPINCER-A · cds_evaluation_ref ✓
Flagged medicineNaproxen 500mg tablets ×56
Risk factorPeptic-ulcer history, no gastroprotection
Triage decision *
Intervention capture (clin_pincer_interventions)
Intervention type
Note
GP feedback (clin_gp_notifications rail — PIN-4)
Baseline vs current improvement
Baseline at-risk (audit open)9
Current at-risk (last re-audit)4
Re-audit against pinned indicator_version (PIN-3)
PIN-1: cohort obtained via cds.evaluateIndicators() (pull, never re-implemented here) · PIN-2: every triage/intervention is an audit event · estate-wide (NULL branch) audits are central-ops-scoped · emits clin.pincer_intervention_recorded → reporting.
Cross-branch remote NMScentral-ops scope
Remote delivery records the remote performer; the claim stays with the originating branch (EP-7). Assigning locks the episode to one performer (assignNms — one performer per episode, release counterpart included). Pharmacist-only; live audio/video.
assignNms locking prevents double-staffing across branches · the cross-branch queue is the same surface central-ops/reporting delegates into (reporting holds no state) · cap headroom warns, never blocks.
Active consultation — Susan Bell (72)
ModalityVideo (live) · Timperley episode
Verbal consent for remote (verbal_for_remote) Captured 11:18
Consent to record call (consent_to_record_call)Declined — no recording, consult continues
Call recording Not recording (consent-gated)
Consultation timer 06:12
Structured NMS follow-up form
Medicine being taken *
Adherence OK?
Side effects
Outcome enum *
Side-effect → Yellow Card hand-off
GP referral (gp_referral_sent — clin_gp_notifications)
Add pharmacist intervention
Terminal actions
Three terminals: Complete · Save & schedule follow-up · lost (lost-to-follow-up — records the attempt log, claims nothing for the missed stage). Distinct from lapsed (window expiry) and dna (no-show).
Service claims & PPV evidenceMay 2026 cycle · Timperley
Provisions visible 1 Jun · contractor verifies & submits by 5 Jun (6th after bank holiday). Claims-finance owns money state — this dashboard mirrors the cycle & chases unverified months. 2 claims unverified.
Provisioned (May)£1,946
Verified / submitted£1,512
Rejections3
Late — IT exception2
PPV value-at-risk (Q1)£289
Month cycle & chase
Service
Completed
Provisioned
Status
Pharmacy First (CP)
24 · £408
£408
Unverified — chase
NMS (int + f/u)
11 · £266
£266
Submitted
HCF / PCS / DMS
mixed
£1,272
Unverified — chase
Rejections triage (claim.service_claim_rejected)
L. Chen · PF UTIrejected — no gateway anchor on recordTriage
G. Adams · NMSrejected — out-of-window, no audited reasonTriage
H. Begum · Flurejected — duplicate of NBS claimReview
Incomplete bundles (missing same-day record / required observation / un-notified GP past SLA) surface as a PPV risk before the quarter closes — exposure visible, never discovered at audit (PPV-2). Evidence immutable once the claim is submitted (CL-8).
Quarter value-at-risk
Q1 claims with incomplete evidence£289 (5 episodes)
15% of sampled-claim value flagged · remediate before quarter close to remove from the PPV evidence pack reporting assembles.
Private service definition — Travel healthprivate_travelDefinition v4 (active)v5 draft
Private/PGD services are configurable definitions in the same content registry — no NHS assurance gate, but the same CC-3 lifecycle (draft → in_review → approved → active → superseded → withdrawn) and audited CSO sign-off apply. Invoice output instead of a MYS claim. Episodes pin the definition version they started on (CC-4).
PGD set (medicine · dose · inclusion/exclusion · expiry)
PGD
Version
Expiry
Status
Atovaquone/proguanil (antimalarial)
v2
04/2027
Adopted
Rabies (Rabipur) — multi-dose schedule
v1
11/2026
Adopted
Typhoid (Typhim Vi)
v3
09/2026
Expires in 3 months
Price list (private fee schedule — invoice output, no MYS)
Item
Unit price (£)
VAT
Effective from
Consultation fee
exempt
1 Mar 2026
Hepatitis A (Havrix Monodose)
20%
1 Mar 2026
Rabies (Rabipur) — per dose
20%
1 Mar 2026
Atovaquone/proguanil ×26
20%
1 Mar 2026
Lifecycle & sign-off (CC-3)
Current active versionv4 · active since 1 Mar 2026 · signed A. Khan (CSO-delegated) GPhC 2061234
Draft in progressv5 · price uplift + typhoid PGD refresh
Sign-off required to activateCSO or delegated clinical author — audited event
Activation supersedes v4 (never deletes it — CC-4); in-flight episodes keep their pinned version. The engine refuses to run a consultation with no active, signed-off definition for the service on that date (fail closed — EP-2 spirit).
Private definitions reuse the same episode engine, wizard, supply and audit machinery as NHS services — only the assurance gate and the money output (invoice vs MYS claim) differ. Supplies emit pmr.service_supply draw-down events to StockIQ.
Service cataloguemaster service list · native consolidation tracker (PharmOutcomes + Cegedim absorption)
Every service ScriptIQ delivers — and every service still delivered through an incumbent bridge — appears here with a rollout / coexistence status. Two gates decide when each goes native: G1 — NHS assurance (PF / NMS / DMS / HCF / PCS / vaccinations / SCS) and G2 — local-commissioner onboarding (Tees minor ailments, supervised consumption, EHC, PSNE contracts…). Coexistence with PharmOutcomes / Cegedim is an interim bridge only, per service.
Native (live)11
Via PharmOutcomes — G17
Via PharmOutcomes — G29
Native day-one (private/PGD)2
Filter
All (29)National assuredLocal commissionedPrivate / PGDBridge only
Service
Archetype
Commissioner
Recording route now
Rollout / coexistence status
Pharmacy First — 7 pathways
consultation
NHS England
ScriptIQ native
Native (live)
New Medicine Service
multi-stage pathway
NHS England
ScriptIQ native
Native (live)
Discharge Medicines Service
multi-stage pathway
NHS England (Essential)
ScriptIQ native · MESH ToC
Native (live)
Hypertension case-finding (clinic)
device-loan
NHS England
ScriptIQ native
Native (live)
Contraception (PCS)
consultation
NHS England
ScriptIQ native
Native (live)
Seasonal flu + COVID vaccination
vaccination + batch
NHS England
Via Cegedim portal → RAVS
Via PharmOutcomes/Cegedim — pending NHS assurance (G1)
NHS smoking cessation (SCS)
multi-stage pathway
NHS England (trust referral)
Via PharmOutcomes (beta)
Via PharmOutcomes — pending NHS assurance (G1)
Childhood flu vaccination
vaccination + batch
NHS England
Via Cegedim portal
Via PharmOutcomes/Cegedim — pending NHS assurance (G1)
Pharmacy First — urgent supply (UMS)
referral-intake
NHS England
ScriptIQ native (BaRS)
Native (live)
Think Pharmacy First — local minor ailments
consultation
Tees LPC / ICB
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Supervised consumption (Tees)
multi-stage pathway
Middlesbrough Council
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Emergency hormonal contraception (Newcastle EHC)
consultation
PSNE / Newcastle Council
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Needle & syringe exchange
activity-claim
Tees Valley CCG
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
NRT voucher redemption (maternity)
voucher
Middlesbrough Council
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Travel health consultation
multi-stage pathway
Private (no commissioner)
ScriptIQ native
Native day-one (private/PGD)
Private flu vaccination (Flu Xpress)
vaccination + batch
Private (no commissioner)
ScriptIQ native
Native day-one (private/PGD)
Transfer of Care — patient feedback (PROMs)
PROMs survey
North East LPCs
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Prevention of acute kidney injury (PQS audit)
clinical audit
NHS England (PQS)
ScriptIQ native
Native (live)
Bank holiday opening claim
activity-claim
NHS England
ScriptIQ native
Native (live)
PSNE pharmacy-services contract 2022
commissioning-contract
PSNE Ltd
Via PharmOutcomes
Via PharmOutcomes — pending commissioner onboarding (G2)
Two-gate rollout — what each gate needs
G1 · NHS assurance (timing only)
Native delivery of a national/assured service needs per-service NHS assurance + MYS / GP-Connect assurance. PharmOutcomes / Cegedim stay for that service only until ScriptIQ is assured. Buildable now; switch-on is pure timing.
G2 · local-commissioner onboarding (commercial)
To drop PharmOutcomes for a local service, the local commissioner (LPC / ICB / council) must commission + pay via ScriptIQ, or accept ScriptIQ-recorded data + claims. Per-commissioner, the harder "future" part — the incumbent's real moat is the commissioner relationships + payment rails, not the forms.
No gate · native day-one
Private / PGD services (no assurance), the generic form/template engine, practitioner enrolment, and the recording/claiming machinery itself ship natively now.
Coexistence bridge — interim only
Services still on PharmOutcomes16
Services still on Cegedim portal3
Estate logins to retirePharmOutcomes · Cegedim · EMISInsights
Target end stateone PMR-native platform · zero separate logins
Each bridged service shows the incumbent it routes through today and the gate that retires that bridge. The catalogue is the single tracker for the whole absorption programme.
Status enum: native_live · bridge_pharmoutcomes_g1 · bridge_pharmoutcomes_g2 · bridge_cegedim_g1 · native_day_one. Each catalogue entry references its service definition (built in the service builder), its commissioner, its practitioner-enrolment requirement, and its claim route (MYS national vs local commissioner).
Recording route today: Cegedim Pharmacy Services portal (separate login). Native ScriptIQ delivery is buildable but switches on at G1 — NHS assurance for childhood flu (target autumn-2026 campaign). This screen is the read view of the definition the builder produces.
Ovalbumin content guide · fallback paper formattached
Like every PharmOutcomes template, the definition carries its own clinical references — these travel with the form, not the user.
A catalogue entry is a thin read view over a service definition. Editing happens in the service builder; the rollout status is governed by the two-gate model on the catalogue.
Service builder — Think Pharmacy First (local minor ailments)local_minor_ailmentsDefinition v3 draftCC-3 lifecycle
The config-not-code surface: one commissioner-configurable engine produces every service — national, local, private, audit, claim, contract, survey, voucher. A definition is data (CC-5); it pins its version into each episode (CC-4) and runs through the same draft → in_review → approved → active → superseded → withdrawn lifecycle with audited CSO / commissioner sign-off (CC-3). No code ships to add a service.
Selected: Consultation (differential-dx ×3 + supply + exemption, mirroring the Tees minor-ailments template). The archetype seeds the default stages and form sections; you then tailor them below.
3 · Eligibility rules (generic evaluators — data not code, CC-5)
Multi-stage services link a registration → intervention → follow-up; each stage can claim a partial (like DMS / SCS). Single-stage consultations collapse to one form.
5 · Form-field builder (field types — the form-template engine)
Field
Field type
Required
Notes / options
Was patient present?
single-select
Yes
Yes / No / Telephone / Video
Consultation notes
long-text
Yes
symptoms / history / prior treatment / exam
Differential diagnosis 1–3
coded-list lookup
Yes
≈45-condition list (SNOMED-mapped)
Product given 1–3 + quantity
dm+d picker + number
Conditional
draws down via pmr.service_supply
Where heard about service
single-select
No
GP / 111 / family / advert / leaflet / social / other
Service spec + formulary (PDF) A4 / A5 paper consultation form NICE CKS — minor ailments Local PGD set
7 · Funding / claim definition
Claim route *
Fee model
Consultation fee (£)
Local-commissioner services auto-claim direct to the commissioner per its funding definition (see commissioner claims) — distinct from the MYS national path. Anonymised-reporting opt-in is captured here too.
8 · Practitioner-enrolment requirement
Require an enrolled / accredited practitioner before an episode can start (in-form gate) Required
Accreditation criteriaLocal-minor-ailments training · safeguarding L2 · indemnity
9 · Lifecycle & sign-off (CC-3)
Current statedraft (v3) — price uplift + 2 new conditions
Active version (in force)v2 · active since 1 Apr 2026 · signed A. Khan (CSO-delegated) GPhC 2061234
Activation supersedes v2 (never deletes it — CC-4); in-flight episodes keep their pinned version. The engine refuses to run an episode with no active, signed-off definition on that date (fail closed — EP-2).
This is the surface that absorbs PharmOutcomes' moat: a universal template engine (10 archetypes) + commissioner authoring + per-service practitioner enrolment, all native to the PMR. Definitions reuse the same episode / wizard / supply / audit machinery as the national content packs (content packs).
Every service can require an enrolled, accredited practitioner before an episode starts (the PharmOutcomes "select a practitioner or New Practitioner" gate, enforced in-form, EP-5 style). Enrolment records the criteria met, the evidence, and an enrolled / expired status per practitioner per service. Expiry blocks delivery fail-closed.
Practitioners enrolled12
Enrolments expiring <60 days3
Expired — delivery blocked1
Services with an enrolment gate14
Enrolment matrix — Timperley
Practitioner
Service
Criteria met
Status
Aisha Khan · Pharmacist (RP) · GPhC 2061234
Pharmacy First
PGD sign-offs ✓ · CPPE ✓
Enrolled
Aisha Khan
HCF (BP)
BP technique ✓ · BIHS device ✓
Enrolled
Aisha Khan
Flu vaccination
Vaccinator + BLS + anaphylaxis
Expires 31 Aug 2026
Tom Mills · Technician (ACT)
Contraception (PCS)
PCS technician training ✓ (from 29 Oct 2025)
Enrolled
Tom Mills
Smoking cessation
NCSCT 4 modules ✓
Enrolled
Tom Mills
Local minor ailments (Tees)
Local training · safeguarding L2
Expires 19 Jul 2026
R. Osei (locum) · GPhC 2207851
Pharmacy First
PGD sign-offs missing
Not enrolled — delivery blocked
An episode cannot start unless an enrolled practitioner is selected for that service (the in-form gate). A new PGD version invalidates the cached competency (staff ST-4) → re-enrolment required.
Enrolment detail — A. Khan · Flu vaccination
Accreditation criteria (commissioner-defined)3 of 3 met
Vaccinator competency (CPPE) Evidence on file
Basic life support — annualExpires 31 Aug 2026
Anaphylaxis management Evidence on file
Registration number checkedGPhC 2061234 · in good standing
Evidence attached
CPPE flu cert.pdf BLS 2025.pdf
BLS lapses 31 Aug 2026 — a task is raised 60 days before; on expiry the flu-vaccination enrolment goes expired and delivery is blocked fail-closed until re-evidenced.
Enrolment is per practitioner × per service, with commissioner-defined criteria. It is read by the service builder's "enrolment requirement" step and enforced at episode start. Estate-wide reporting rolls enrolment status into the assurance pack (reporting holds no state).
Enrolment — Tom Mills · Local minor ailments (Tees)local_minor_ailmentsExpires 19 Jul 2026
Commissioner: Tees LPC / Tees Valley ICB. This service requires an enrolled practitioner before any episode — the builder's enrolment step (8) set the criteria; this record holds the evidence and status for one practitioner.
Criteria & evidence
Criterion
Evidence
Status
Local minor-ailments training
Tees LPC e-learning cert · 12 Mar 2026
Met
Safeguarding level 2
Safeguarding L2 · renews annually
Renew by 19 Jul 2026
Professional indemnity
NPA cover · current
Met
Registration in good standing
GPhC technician register check
Met
History & gate effect
First enrolled14 Mar 2026
Episodes delivered under this enrolment41
In-form gate Selectable at episode start
On expiry (19 Jul)Blocks new episodes — re-evidence to restore
Withdrawing or expiring an enrolment never deletes the historical episodes it authorised; they keep the enrolment provenance (immutable). Mirrors PGD sign-off provenance.
Local services are commissioned by named bodies (LPC / ICB / council), authored as templates in the service builder, and paid via direct-to-commissioner claims. Going native needs G2 — local-commissioner onboarding: the commissioner must commission + pay via ScriptIQ, or accept ScriptIQ-recorded data. Until then each runs on PharmOutcomes as an interim bridge.
Commissioners
Commissioner
Contact
Services
Onboarding (G2)
Tees LPC / Tees Valley ICB
commissioning@teeslpc.nhs.uk
3
In discussion
Middlesbrough Borough Council
publichealth@middlesbrough.gov.uk
3
Not started
Pharmacy Services North East (PSNE)
contracts@psne.co.uk
2
Pilot agreed
Newcastle City Council
sexualhealth@newcastle.gov.uk
1
Not started
The commissioner ↔ provider conduit is PharmOutcomes' deepest moat — named commissioners, contract authoring, the referral + claim + pay rail. Absorbing it is the G2 work.
Local service catalogue
Service
Commissioner
Archetype
Status
Think PF — local minor ailments
Tees LPC
consultation
Bridge · PharmOutcomes
Supervised consumption (Tees)
Middlesbrough Council
multi-stage
Bridge · PharmOutcomes
Needle & syringe exchange
Tees Valley CCG
activity-claim
Bridge · PharmOutcomes
Newcastle EHC
PSNE / Newcastle
consultation
Bridge · PharmOutcomes
NRT voucher redemption (maternity)
Middlesbrough Council
voucher
Bridge · PharmOutcomes
PSNE pharmacy-services contract 2022
PSNE Ltd
contract
Native pilot
Per-service status badge: bridge_pharmoutcomes (interim) → native_pilot (commissioner accepts ScriptIQ data) → native_live (commissioner commissions + pays via ScriptIQ). The catalogue rolls these into the estate-wide G2 view.
Think Pharmacy First — Local Minor AilmentsTees LPC / Tees Valley ICBBridge · PharmOutcomes (G2 in discussion)
Recording route today: PharmOutcomes. ScriptIQ has the native template ready (built in the service builder); switch-on is blocked on G2 — Tees LPC onboarding (commissioner to accept ScriptIQ-recorded data + claims, or commission via ScriptIQ).
Direct claim rail to commissioner configuredPending sign-off
PharmOutcomes bridge retired for this serviceAfter native live
When all four clear, this service flips to native_live on the catalogue and the PharmOutcomes login is no longer needed for it. This is the hard, per-commissioner "future" work.
Activity (recorded on PharmOutcomes today · mirrored for reconciliation)
Date
Patient
Differential dx
Supply
Exemption
Claim
12 Jun
K. Doyle · 67
Conjunctivitis (bacterial)
Chloramphenicol 0.5% drops
Age 60+ (B)
PharmOutcomes
11 Jun
B. Hughes · 24
Acute otitis media
Advice only
Pays levy
PharmOutcomes
Local-commissioner claimsdirect-to-commissioner claiming · distinct from the MYS national path
Local services auto-claim direct to the commissioner per its funding definition — no MYS, no contractor submission. Batches are charged to named councils / LPC / ICB, settled monthly. This is the commissioner ↔ pharmacy payment rail (PharmOutcomes' "no need to submit — we claim on your behalf"). National Advanced services still route to MYS; this screen is the local counterpart.
Claimed this month (local)£4,118
Batches awaiting submission2
Settled YTD (FY 26/27)£11,640
Rejected / queried1
Claim batches — by commissioner
Batch ref
Commissioner
Service(s)
Period
Items
Value
Status
TLPC-2606
Tees LPC
Local minor ailments
May 2026
58
£812
Ready to submit
MBC-2605
Middlesbrough Council
Supervised consumption · NRT vouchers
May 2026
132
£1,944
Ready to submit
PSNE-2604
PSNE Ltd
Pharmacy-services contract activity
Apr 2026
—
£900
Settled 28 May
TLPC-2605
Tees LPC
Local minor ailments
Apr 2026
49
£686
Settled 30 May
NCC-2604
Newcastle City Council
EHC supplies
Apr 2026
14
£280
Queried — evidence
Funding definitions (per commissioner — set in the builder)
Tees LPC · local minor ailments£14 / consultation + concession
The funding definition lives on the service definition (builder step 7). Claims are auto-generated from completed episodes per that definition — the pharmacy never hand-keys a local claim.
Settlement & provenance
Settlement cyclemonthly · per commissioner terms
Claim history retainedback to FY 14/15 (parity with PharmOutcomes)
Each batch referencesepisode ids · funding definition version · practitioner
Distinct from MYSno contractor 5th-of-month submission
NCC-2604 queried: 2 EHC supplies missing evidence-of-age. Resolve before resubmission — incomplete claims surface here before the commissioner rejects them.
Local claiming is auto-generated direct to named commissioners (councils / LPC / ICB) per their funding definitions — the rail PharmOutcomes runs today. National Advanced (PF / CPCS / flu) stays on the MYS path; vaccinations reconcile via NIVS. Both rails feed reporting; claims-finance owns money state.
Claim batch MBC-2605 — Middlesbrough Borough CouncilMay 2026Ready to submit
Charged to Middlesbrough Borough Council · public health · funding definitions for supervised consumption + NRT vouchers. Auto-assembled from completed episodes — review then submit; the council settles monthly.
Supervised-consumption supervisions96 · £144
NRT vouchers redeemed36 · £1,800
Batch total£1,944
Evidence complete132 / 132
Episode
Patient
Service
Activity
Funding def.
Value
Evidence
SC-4471
D. Okeke · 49
Supervised consumption
22 daily supervisions
£1.50 / day
£33.00
✓
SC-4488
J. Mwangi · 61
Supervised consumption
18 daily supervisions
£1.50 / day
£27.00
✓
NRT-2261
P. Patel · 33
NRT voucher (maternity)
Voucher V-88142 redeemed
value + £2
£50.00
✓
NRT-2274
F. Osei · 31
NRT voucher (maternity)
Voucher V-88160 redeemed
value + £2
£50.00
✓
Each line references its episode id, the funding-definition version it was priced on, and the delivering practitioner. The batch is immutable once submitted (parity with the MYS claim-evidence lock CL-8). Settlement and any query route back here.
Replacement suggested — routed from labelling short-dated chip (filter=short-dated).
short-datedAlliance £4.12
Item-lock (StockIQ-owned, SQ-6 AC-e)
A line already in another user's open order/basket renders the locked state — "being ordered by {user}" — and offers no second order action. The PMR card only renders the lock StockIQ reports; it never sets the lock (OPEN QUESTION 18). Two pmr.dispensed events for the same product/branch/day collapse to one card.
One card per product/branch/day, driven by pmr.dispensed events · shelf-stock entry → AI-suggested qty → cascade → basket · tabs + filter chips resolve the §5.2 review targets (owing · low-stock · short-dated · dmd:{code} · pip:{code} · supplier:{id}).
Read-only rollup through stock.dashboard(scope) — min/max/reorder policy is StockIQ-owned (NR-1, NR-8). Editing a reorder rule is a deep-link into StockIQ, never a PMR write (AC-2). Scope is role-gated: branch staff → own branch, central-ops → assigned set, superintendent → estate.
Rollup as of 14:32 · StockIQ count age 2h · staleness fresh — a stale rollup says so, never a confident-looking stale number.
Below-Min37lines under min · 5 branches · tile → below-min
A line that cannot be supplied from normal cascade stock — out-of-stock, NCSO concession, SSP substitution, or special (SP/ED) — is routed here to procure the substitute. The PMR provides only the routing seam (§5.4a); resolution + the specials path stay StockIQ-side (OPEN QUESTION 14).
"Order substitute" lands here from the bench stockout chip (/shortage?filter=ncso|ssp|special or dmd:{code}) · the chosen substitute flows into the cascade/specials path and onto the order pad.
Shortage/concession/specials procurement is StockIQ-owned, deep-linked (§1.3 posture) · whether specials sit inside the cascade or a separate path is a StockIQ procurement decision (OQ-14) · the PMR side is unaffected either way.
Order pad12 lines · cascade applied
Pad modeAll suppliers supplier:AAHsupplier:Phoenixsupplier:Alliancedeep-link /order-pad?filter=supplier:{id} — supplier-scoped pad (§5.2)
Cascade pad (12)MDS / MCS scripts (5)Supplier-scoped
Alliance — 1 line · £12.40 · cutoff 15:45 slow API
Methylphenidate 10mg ×28qty 2 · owing for P. Patelurgent£12.40
MDS / MCS cycle padfilter=mdscycle: 28-day · due 18 JunOakwood care home · 14 residents
Monitored-dosage-system / multi-compartment-compliance scripts pad ahead of the production cycle — quantities driven by the MAR cycle, not the daily review cards. Deep-link /order-pad?filter=mcs or ?filter=mds resolves the MCS/MDS tab StockIQ-side.
Resident / wing
Product
Cycle qty
On hand
To order
Supplier
Margaret Thompson · Elm wing
Amlodipine 5mg tabs ×28
28
4
AAH
Margaret Thompson · Elm wing
Atorvastatin 20mg tabs ×28
28
0
AAH
John Okafor · Oak wing
Metformin 500mg tabs ×56
56
12
Phoenix
Oakwood — bulk
Lansoprazole 30mg caps ×28
112
9
Phoenix
MDS/MCS quantities are sourced from the care-home MAR cycle (compliance / dispensing) and ordered ahead of the production runway — distinct from the daily-dispensed review cards.
Cascade picks best price/availability across wholesalers · locked lines stay put · urgent owing lines flagged from the PMR loop · supplier-scoped pad + MDS/MCS tab resolve the /order-pad?filter=supplier:{id}|mcs|mds Ctrl+K seeds (§5.2).
Order outbox
Outbox (1)Sent today (2)History →
Order
Supplier
Lines
Value
Status
ETA
PO-TIM-0612-03
Alliance
1
£12.40
Sending…
—
PO-TIM-0612-02
AAH
7
£214.12
Acknowledged
tomorrow AM
PO-TIM-0612-01
Phoenix
4
£61.20
Partial — 3 of 4 confirmed
tomorrow AM
PO-TIM-0611-04
AAH
11
£388.51
Delivered — goods-in pending
Owings board ETA panel — per-line fulfilment state (SQ-16)
A generic "on order" masks a wholesaler back-order — the H-ORD-4 escalation signal. Where orders.statusForOwing returns a per-line state it is rendered explicitly; where StockIQ cannot reach the order, ETA shows "unknown" with last-data age, never blank or a fabricated date.
Owing line
Order
Qty
Per-line state
ETA
Methylphenidate 10mg ×28 CD2 · P. Patel
PO-TIM-0612-03
2
Confirmed
Thu (confirmed 09:14)
Naproxen 500mg ×28 · S. Bell
PO-TIM-0612-01
28
Partial — 14 of 28 confirmed
14 Thu · balance no ETA
Quetiapine 25mg ×60 · J. Okafor
PO-TIM-0612-01
60
Back-ordered — no ETA
none — escalate
Clarithromycin 500mg ×14 · A. Hassan
PO-TIM-0612-02
14
Substituted — Klaricid 500mg ×14 offered
tomorrow AM
Salbutamol 100mcg inhaler · A. Khan ord.
PO-TIM-0612-99
3
ETA unknown — ordering unreachable
last data 14:32
Per-line states (Back-ordered / Partial N of M / Substituted {product}) come from orders.statusForOwing (SQ-16). Where SQ-16 is not yet exposed, the generic state shows with no phantom line-status field (AP-4); StockIQ unreachable degrades visibly per §5.4, never a confident-looking stale number.
Order confirm fires stockiq.order_confirmed → owing ETAs in the PMR · delivery fires stockiq.delivery_received → "owed item arrived" tasks · the full filterable history lives on the order-history screen.
Goods in — AAH deliveryPO-TIM-0611-04
Claude Vision extracted 11 lines from the invoice photo — verify against totes.
Line (AI-extracted)
Ordered
Received
Batch / expiry
Verdict
Amoxicillin 500mg ×21
10
10
L2406A · 03/2028
Match
Warfarin 3mg ×28
5
4
W9911C · 11/2027
Short — 1
Salbutamol inhaler
6
6
S5520 · 08/2027
Match
Receipt updates perpetual inventory · short/damage claims tracked against the wholesaler · owed-item arrivals raise PMR tasks + patient comms.
Stock — Timperleyperpetual inventory · StockIQ is the stock truth
On-hand read through the facade carries two ages: fetch age (when the PMR read it) and count age / confidence (StockIQ's lastCountedAt + cadence tier). Read as of 14:32 · fresh <60s. Short-date / fridge / dead-stock are procurement hints (SQ-14) — informational, never a clinical expiry gate (§9.4).
Search product (dm+d)
Filter
Location
Nearest-expiry sort
Product
On hand
Nearest expiry
Last counted (count age)
Confidence
Location
State
30-day usage
Warfarin 1mg tabs ×28
11
05/2027
3 Jun 11d
High
W2
In date
14
Warfarin 3mg tabs ×28
4
10/2026
3 Jun 11d
Med
W2
Short-dated
22
Warfarin 5mg tabs ×28
9
03/2028
3 Jun 11d
High
W2
In date
8
Insulin Lantus SoloStar ×5
3
09/2026
11 Jun 3d
High
Fridge
Fridge · short-dated
6
Dosulepin 75mg caps ×28
5
02/2027
28 Apr 47d
Low
D3
Dead stock — 0 dispensed 120d
0
Co-amoxiclav 500/125mg ×21
7
Expiry unknown
3 Jun 11d
Med
C1
Expiry not recorded
9
"Expiry unknown" is a degraded state, never a fabricated in-date (SQ-14 AC-b / AP-3)
Co-amoxiclav 500/125mg ×21 has no expiry_date on its ledger line — the short-date fields return absent and render "expiry unknown", not a confident-looking date. The short-date threshold is StockIQ-config-sourced, not a PMR constant. The same short-date/fridge chip mirrors onto the dispensing labelling hint (§5.4).
PMR dispense draw-downs land as reason='dispense_out' keyed on event id (no double-deduction with EPOS sales) · credit movements (return_in / write_off / broken_bulk) keep on-hand from drifting down (§4.3a) · the PMR only ever reads this via the stock-facade with the dual fetch + count age above · row click → per-product drug statistics.
Drug TariffJune 2026 · loaded 1 Jun
Tariff monthJun 2026Part VIIIA 21,408 lines
Cat M resetQ1 appliednext quarterly: Jul
NCSO / concessions—Jun list (interim)
Snapshot provenanceStockIQ → ref_drug_tariffage 11 days ✓
AllCat A — weighted averageCat M — quarterly calcCat C — brand-basedPart VIIIB — specialsPart IX — appliancesNCSO active
Select a line to see price basis, history, concession state and endorsement guidance.
Versioned snapshot in public.ref_drug_tariff (provenance + staleness columns) · feeds expected-value estimates, NCSO endorsement suggestions and margin read-models · updates relay as shared.tariff_updated.
Credentials vault-stored, never in client code · per-branch schedules drive owing ETAs · cascade order is config, not code.
dm+d & TRUD syncHealthy
Dataset
Version
Loaded
Age rule
Status
dm+d weekly (TRUD)
2026-wk23
8 Jun 02:10
≤2 months (IS-2)
4 days
GTIN supplementary (SQ-12)
2026-wk23
8 Jun 02:14
coverage 94% of dispensable AMPs
Exposed via catalogue API
BNF↔SNOMED map
May 2026
2 Jun
monthly
OK
PMR read-model push
—
continuous
staleness surfaced in PMR UI
In sync
Single TRUD pipeline (StockIQ) — the PMR keeps a read-only projection for offline dispensing/CDS keys; never a second ingestion.
EPOS — till summaryTimperley · today
EPOS is a separate StockIQ product (NR-7) — sales, shifts, safes, refunds and Dojo card payments have no PMR involvement; the shell only reads the till summary. These admin views are deep-link-only into the StockIQ EPOS suite.
Takings£412.65
Transactions57
Rx charges collected£59.40
P-line gatingRP present ✓
Time
Items
Type
Total
Method
10:22
Paracetamol 500mg ×16, plasters
OTC
£4.78
Card
10:18
Rx charge ×2 (A. Hassan)
Rx charge
£19.80
Card
10:09
Refund — Ibuprofen 200mg ×16 (faulty)
Refund
−£2.49
Card
10:02
Chlorphenamine 4mg ×28
P-line
£3.20
Cash
Refunds & voids4 today£18.74 · manager-authorised
Products & pricing2,140 SKUsPLU / barcode admin
Till operators6 staffPIN / permissions
P-medicine lines gate on pmr.rp_status_changed (no pharmacist signed in → queued for authorisation) · Rx-charge collection reconciles with the PMR charge ledger (claims OQ-6) · refunds / products / operator admin are StockIQ-EPOS-owned (NR-7), shown here as deep-link depth only.
Refunds reverse an EPOS sale only (reason='sale' ledger movement reversed) — they never touch dispensing draw-downs or the NHSBSA charge ledger. Each refund is manager-authorised; the credit settles back to the original tender. No PMR write.
Refunds today4
Refund value−£18.74
Voids (pre-tender)3
Manager auth rate100%
Time
Original sale
Item
Reason
Amount
Tender
Authorised by
10:09
TXN-44820
Ibuprofen 200mg ×16
Faulty / damaged
−£2.49
Card (Dojo)
Aisha Khan (RP)
09:41
TXN-44805
Carrier bag ×3
Wrong item
−£0.30
Cash
Aisha Khan (RP)
09:18
TXN-44790
Vitamin D3 1000IU ×90
Customer changed mind
−£6.95
Card (Dojo)
Aisha Khan (RP)
08:55
TXN-44781
Compression hosiery (sized wrong)
Wrong size
−£9.00
Card (Dojo)
Aisha Khan (RP)
New refund
Original transaction
Item
Reason
Refund to
Manager authorisation
Restock to shelf?
Refunds and voids are EPOS-owned (NR-7); a saleable restock posts a StockIQ return_in movement, a faulty write-off a write_off — both EPOS-side, disjoint from the dispensing reverse/credit path (§4.3a).
Retail product catalogue, PLU/barcode pricing and till-operator permissions are EPOS-owned. dm+d-linked lines reuse the canonical PIP↔dm+d map (NR-4); OTC-only SKUs are EPOS-local. The PMR never edits these.
Catalogue, pricing and operator permissions are StockIQ-EPOS-owned (NR-7) and shown here for deep-link continuity only — the PMR holds no retail SKU or till-operator table.
Drug statistics — Warfarin 3mg tabs ×28dmd:319773006StockIQ · read-onlybranch: Timperley
Per-product statistics for the dm+d concept — usage trend, dispensed-vs-ordered, demand state and order-history links. Resolves the /statistics?filter=dmd:{code} deep-link target + the "Drug statistics" Ctrl+K seed (§5.2). All figures read through the facade with explicit data age — no PMR-side computation.
ProductWindow as of 14:32 · count age 11d
Dispensed 30d22vs 18 prior 30d (+22%)
Ordered 30d16across 4 POs
On hand4min 4 · reorder to 8
Demand stateRising · seasonalAI demand pipeline
Usage trend — 90 days (weekly dispensed)demand: rising
12 → 22 dispensed/wk over the window · last bar amber = current incomplete week
Dispensed vs ordered (30d)
Metric
Qty
Note
Dispensed out
22
true demand signal
Ordered in
16
net of returns
Returned to shelf return_in
2
un-collected, restocked
Written off write_off
1
excluded from demand (RV-3)
Net movement
−5
drawing down → reorder due
Demand state: rising
Dispensed outpacing ordered for 3 weeks — suggestion engine has raised the reorder-to from 6 to 8 (pinned override by Aisha Khan, 2 Jun).
Order history for this product
Order
Date
Supplier
Qty
Unit
Status
PO-TIM-0612-02
12 Jun
AAH
5
£1.92
Acknowledged
PO-TIM-0605-01
5 Jun
AAH
4
£1.92
Delivered
PO-TIM-0529-03
29 May
Phoenix
4
£1.88
Delivered
PO-TIM-0522-02
22 May
AAH
3
£1.92
Delivered
Statistics are StockIQ-owned read-models over the usage-history demand pipeline (NR-8) · the PMR contributes dispense events as one demand source, never the statistics engine · order-history rows deep-link to /orders?filter=dmd:319773006 · figures carry the §5.4 dual age.
Order history — TimperleyStockIQ · read-only
First-class order-history target — date-range, owing-driven and dm+d-scoped filters resolve the /orders?filter=owing|dmd:{code} + from/to date-range deep links and the "Order history" Ctrl+K seed (§5.2).
Order history is a StockIQ read-only view (NR-1); the PMR reads status/ETA via orders.statusForOwing (SQ-16) but never owns the order or basket · owing-driven rows deep-link back into the PMR owings board · row click → per-order detail.
Order PO-TIM-0612-01 — PhoenixPartial — 3 of 4 confirmed12 Jun 09:02
SupplierPhoenixXML PDI · acc TIM-PHX-091
Lines4value £61.20
ETAtomorrow AMconfirmed 09:14
Owing-linked2 linesS. Bell · J. Okafor
Line
Ordered
Confirmed
Unit
Per-line state (SQ-16)
Owing
Atorvastatin 40mg tabs ×28
12
12
£0.89
Confirmed
—
Naproxen 500mg tabs ×28
28
14
£0.69
Partial — 14 of 28
S. Bell
Quetiapine 25mg tabs ×60
1
0
£6.29
Back-ordered — no ETA
J. Okafor
Lansoprazole 30mg caps ×28
12
12
£0.79
Confirmed
—
Back-order on an owing line is the H-ORD-4 escalation signal
Quetiapine 25mg ×60 (J. Okafor) is wholesaler back-ordered with no ETA — surfaced as a per-line state, never masked as a generic "on order". Route to the shortage surface to procure a substitute.
Order event trail
Time
Event
Detail
09:02
Created
4 lines from order pad · Tom Mills (ACT)
09:03
Sent
Phoenix XML PDI · stockiq.order_confirmed pending
09:14
Acknowledged
ETA tomorrow AM · stockiq.order_confirmed → PMR owings
09:31
Partial confirm
Naproxen 14 of 28 · Quetiapine back-ordered (SQ-16)
Order/basket/PO lifecycle is StockIQ-owned (NR-1); this detail is a read-only render through orders.statusForOwing · acknowledgement fires stockiq.order_confirmed → ETA on the PMR owings board · delivery fires stockiq.delivery_received → goods-in task.
Redeemed — single-use authorization code accepted, StockIQ session established (source: pmr_service), code stripped from the URL, branch Timperley carried, chrome suppressed. Landing on the daily review cards.
This hand-offsuccess
Target
/review
Filter
filter=owing
Branch
Timperley carried always
Code
one-time · ~60s TTL · single-use redeemed
Exchanged token
15-min · aud: stockiq-api · server-to-server only
Return
return=/dispensingorigin allow-listed
Audit
stk.deep_link_minted + redemption row
Rejected redemption states (SQ-5 AC-b/c)re-auth required
Link expired or already used — this code is no longer valid. Nothing tenant-scoped is rendered. Re-authenticate to continue.
Expired code
older than ~60s TTL → no session established
re-auth
Replayed code
second use of a single-use code → rejected
replay blocked
Assertion rejected
exchange client-assertion invalid → stk.exchange_failed (reason class only)
401
return not allow-listed
open-redirect guard → return dropped
dropped
A redemption failure renders this explicit re-auth page and renders no tenant data (AC-9); the persistent "Back to PMR" affordance stays available throughout.
The PMR never holds a bearer JWT in a URL · shell-identity owns the exchange mechanics (§1.2) · this module consumes the redemption landing + explicit expired/replayed re-auth state · embedding stays banned (X-Frame-Options: DENY), so the hand-off is top-level navigation, never an iframe.
Delivery — today3 routes · 1 exception
Out for delivery11
Delivered today9
Failed1
PoD completeness100%
Group by runAll runsFirst RunSecond RunThird Run 1 urgent
Patient
Items
Flags
Window
Run
Storage
Status
Eleanor Wright
1 bag
CDfridgeurgent
14:00
Third Run
CD cabinet
Delivered
Margaret Thompson
MDS tote
care home
am round
First Run
Bay 3
Out
H. Begum
1 bag
fridge
pm
Second Run
Fridge 1
Failed
First Run — live
Round A — Sam Doyle11 stops · 3 done · 2 CD · 1 fridgeFirst Run urgentOut 09:35
Second Run — preparing
Round B — K. Patel8 stops · manifest scan in progressSecond RunLoading
Exceptions
14 Oak Rd — not homeattempt 1 of 2 · contains fridge line → same-day returnReturn to branch
Request intake
Patient
Source
Items
Flags
Window
Eleanor Wright
dispensing handoff
1 bag
CD Sch 3AIS
today
Oakwood Care Home
MDS batch
12 totes
batch
Tue round
G. Adams
patient round pref
1 bag
Friday
Only prescriptions in dispensing state “ready” are accepted (SM-D2) — verified at intake and again at manifest scan.
Delivery — Eleanor Wright Delivered CD Sch 3
Delivery refDEL-4471
RunThird Run
DriverSam Doyle
Storage bayCD cabinet
Delivery
PatientEleanor Wright · NHS 943 476 5919
DestinationClinical site Riverside Surgery, WA15 7BX
Items1 bag · CD Sch 3 · 1 fridge line
TagsurgentINR-clinic
Sourcepatient round (Third Run)
Charge statusAge-exempt (E) resolved pre-dispatch
Attempts
#
When
Outcome
Reason / note
1
12 Jun 14:08
Failed
not_home · calling card left
2
13 Jun 14:11
Delivered
to HCP at clinical site
Attempts are append-only — never overwritten (SM-D7).
Given to clinical site / HCP recipient type: healthcare professional
ID check (CD)
Checked — OK
Signature
captured
Photo
1 image
GPS + timestamp
53.3892, −2.3261 · 13 Jun 14:11:06
Cold-chain
C-3 · 5.2 °C in range · 18 min out
Proof of age
Verified (ID sighted, not stored)
HCP particulars
Timperley District Nursing Team, WA15 7AB
Event trail — append-only
Time
Event
Actor
Detail
12 Jun 13:40
created
round job
source=patient_round · Third Run
13 Jun 13:52
scheduled
Tom Mills (ACT)
route R-Doyle-3 · stop 1
13 Jun 13:58
manifested
Sam Doyle
bag BAG-4471 scanned · PSU dispatched
13 Jun 14:02
out_for_delivery
Sam Doyle
route started · tracking token minted
13 Jun 14:11
arrived
Sam Doyle
GPS 53.3892, −2.3261
13 Jun 14:11
delivered
Sam Doyle
PoD complete · pod_confirmed → dispensing
Every transition is an audit event (actor · branch · route · GPS where captured · correlation id) — no free-form status PATCH (SM-D1). PoD blobs in Azure Blob Storage, never data-URLs.
Route planner — Fri 12 JunRun:First RunSecond RunThird Run
1 stop blocked: NHS charge/exemption must resolve pre-dispatch (SM-D10) — the doorstep is never where money resolves. Resolve in claims-finance before the manifest can build.
Unassigned stops — tray (9)drag onto a route below
FilterAll sourcesHandoffPatient roundMDS batch urgent only
Stop
Source
Flags
Run
Eleanor Wright
12 Brook Lane
handoff
CDAIS
Third
John Okafor
eRD 2/6 · 5 Pine Ct
patient round
First
Susan Bell
warfarin · 9 Birch Rd
patient round
INR-linked
Second
D. Pryce
11 Sycamore Dr
handoff
charge unresolved
First
Care-home grouped stops — one pin per home+wing (CC2, SM-D11)
Oakwood — Lavender Wing×6 bagsFirst Run · morning round
Oakwood — Rose Wing×3 bagsFirst Run · morning round
Postcode-cluster & map assist
Cluster map — WA15 / WA14stops grouped by postcode sector · drag a cluster to a route
Cluster
Stops
WA15 6xxTimperley core
4
WA15 7xxclinical sites
2
WA14 4xxAltrincham edge
3
Optimise button arrives in a later phase (OQ-5) — clustering is a manual assist for now.
Round C — Third Run, afternoon (draft)
Stop
Flags
ETA
1
Eleanor Wright — 12 Brook Lane
CDAIS urgent
14:10
2
G. Adams — 31 Mersey Ave
14:25
3
H. Begum — 7 Lime Walk
fridge
14:40
Manifest gate — constraints checked
Charge resolved (pre-dispatch, SM-D10)1 blocking — D. Pryce
Address diff vs patients moduleAll match
Care-home wing resolved (SM-D11)All wings set
CD policy — same-day return ruleOK
Fridge — cold-chain containerAssign container C-3
Attempt caps (policy: 2)OK
A chargeable prescription cannot be manifested while claims-finance charge_status = unresolved — listed as a blocking discrepancy (SM-D10). Stale-address mismatch flags the stop for planner confirmation (SM-D8).
Loading — Round Bscan each bag onto the van
Bag-barcode scan is the PSU “dispatched” trigger — physical event, not a button.
Scan next bag onto VAN-02
6 of 8 matched · retrieve from the bay shown below · point scanner at the bag barcode
6 / 8
Bag
Patient
Storage / bay
Scan
Verdict
BAG-2291
T. O'Neill
Bay 3
09:51:12
Matched
BAG-2292
H. Begum (fridge)
Fridge 1
09:51:40
Matched · container C-3
BAG-2293
R. Salim
Bay 2
—
Expected, not scanned
BAG-2294
R. Naylor (CD Sch 2)
CD cabinet
—
Expected, not scanned
BAG-2207
(yesterday's route)
—
09:52:08
Scanned, not expected — remove
Both discrepancy classes block route start until resolved. Wrong bag at the door is re-checked by the driver's doorstep re-scan.
Returns processingreceive-back queue
Same-day mandatory 1
H. Begum — fridge linefailed 14:42 · cold-chain assessment required before restockQuarantine
To process 2
14 Oak Rd — not homeattempt 1 of 2 · rebook or return to shelf
Remote cancel — D. Lloydprescriber cancellation mid-route (SM-D9) · driver alerted, bag returningIn transit back
returned_to_branch → dispensing reverts the prescription to ready + PSU back to “ready to collect” · failed CD/fridge never stays on the van overnight (SM-D5).
Delivery policies — tenant config
Policy
Attempt cap before return
CD evidence ladder
Fridge evidence
Safe-place delivery
Driver location tracking
Vans
Van
Reg
Cold chain
Status
VAN-01
MX21 KLP
container C-1, C-2
Round A
VAN-02
MX23 TRV
container C-3
Loading
Start-of-shift vehicle check
07:54 online
VAN-02 — MX23 TRV
Ford Transit Connect · white · Sam Doyle
VIR walkaround must pass before you can start the route. A defect flags the vehicle and prompts the planner.
Walkaround checklist
Mileage (odometer)
Defect notes
Skippable only where the route has no assigned vehicle. Inspection rows are append-only (SM-D20) — recorded against vehicle + driver + date.
Driver app — My routeseparate PWA · offline manifest
09:51 offline · 4 queued
Round AFirst Run· 11 stops · started 09:35
Vehicle check (VIR)Passed 07:54
3 · Eleanor Wright urgentCDAIS
→ Riverside Surgery (clinical site)
4 · G. Adams
31 Mersey Ave
7 · Oakwood — Lavender Wing×4 bags
grouped wing batch · morning round
5 · H. Begumfridge
7 Lime Walk
Stop 3 of 11 urgent
09:53 offline
Eleanor Wright
12 Brook Lane, Timperley WA15 6QX
Tags: urgent · INR-clinic
Deliver to: Riverside Surgery (clinical site — not home) 3 Riverside Rd, Timperley WA15 7BX · receiving contact: Practice Nurse
Deaf-blind — use deaf-blind manual (AIS — non-dismissible)
Driver instruction "Ring buzzer twice, allow extra time — patient is housebound." (pat note · category=delivery)
Housebound Two-person lift Oxygen cylinder
Controlled drug (Sch 3) — ID check required Authorised recipients: patient; M. Wright (daughter). Unannounced HCP → capture HCP particulars in PoD.
Stop 7 of 11 — care home
10:31 offline
Oakwood House — Lavender Wing
4 Elm Grove, Timperley WA15 6QX
Lavender Wing — north entrance Morning dose round · ask for round nurse at nurse station (not reception)
Wing batch — 4 bags, hand to round nurse together
Margaret ThompsonMDS tote
A. ColemanMDS tote
D. Prycefridge
R. NaylorCD Sch 2
Recipient defaults to care staff (wing nurse) · CD + fridge floors still apply per bag
Proof of delivery
Eleanor Wright · ladder for highest item class:
CD Sch 3fridgeage-restricted
Recipient type
Recipient name
HCP not on authorised list — free-capture required
Way-of-completion options are constrained to the recipient type + ladder: safe-place / letterbox / neighbour are disabled for CD & fridge (AC-28 floor).
Standing-round patientsrecurring auto-orders · 40 active · 1 paused
Patient
Run
Days
Next date
Status
Margaret Thompson
Oakwood Care Home
First Run
Mon · Thu
Mon 16 Jun
Active
Susan Bell
warfarin · INR-linked
Second Run
Fri
Fri 20 Jun
Active
Eleanor Wright
CD · deaf-blind (AIS)
Third Run
Tue
Tue 17 Jun
Active
John Okafor
eRD 2/6
First Run
Wed
Wed 18 Jun
Active
Ahmed Hassan
in hospital
Second Run
Mon
— paused —
Paused
Standing rounds auto-generate delivery requests on each due date (patient repeat task + default driver). Pause suppresses generation without losing the schedule — used for hospital/respite spells.
Live trackingactual vs optimised route
Branch
Run
Driver
Date
Live map placeholder Driver position updates every 30s while route in progress
Driver actual route Optimised route
Sam Doyle · near 12 Brook Lane · 09:53
Stop ETAs — First Run
#
Stop
ETA
Status
1
T. O'Neill
09:42
Delivered
2
R. Salim
09:49
Delivered
3
Eleanor Wright CD
09:56
Arriving
4
G. Adams
10:08
Pending
5
H. Begum fridge
10:21
Pending
Extra mileage vs optimised+1.4 mi
Time vs expected−3 min
GPS breadcrumb (red) is captured per stop and replayed against the optimised route (blue) on the driver performance scorecard. Tracking active only while the route is in progress (worker-privacy policy).
Concentration breach is a flag, not an auto-block (SM-D17) — legitimate concentration (a care home, a family) is suppressed by the reviewer per fingerprint. A defect verdict blocks the vehicle from assignment until cleared (SM-D20).
Cross-branch routes — live
Branch
Run
Driver
Done
Status
Timperley
First Run
Sam Doyle
3/11
Out
Timperley
Second Run
K. Patel
0/8
Loading
Chapel Lane
First Run
I. Mitchell
9/9
Complete
Altrincham
First Run
D. Okeke
6/12
Out
Sale
Second Run
L. Hughes
2/10
1 failed
Same-address concentration breach = more deliveries to one address than policy allows (diversion safeguard). CD-evidence + cold-chain deviations escalate to the responsible pharmacist for sign-off.
Collections — Timperleyclick-and-collect & locker
Booked5
Ready3
Collected today12
Uncollected ≥7d1
Booked 2
Priya Patel1 bag · click-and-collect counter urgent
John OkaforeRD 2/6 · locker pickup
Ready 2
Ahmed Hassanlocker L-04 · awaiting collectionLocker L-04
Susan Bellcounter handout · ID on collection
Collected 1
T. O'Neillcollected 11:20 · counter · PIN verifiedCollected
Uncollected 1
R. Salimlocker L-02 · booked 6 Jun · 7-day limit reachedExpired
Locker handout issues a one-time PIN (SMS to patient). Counter handout confirms recipient + ID. Uncollected past the limit → expired-returned: parcel returns to dispensing shelf, prescription reverts to ready.
Vehicle fleet5 vehicles · 2 expiry alerts
1 MOT expires within 30 days and 1 insurance has lapsed — vehicles with red expiries are blocked from route assignment.
Name
Branch
Reg
Type
Insurance
MOT
Road tax
VIR
VAN-01
Timperley
MX21 KLP
Van
14 Nov 26
02 Sep 26
01 Aug 26
Pass
VAN-02
Timperley
MX23 TRV
Van
22 Jan 27
28 Jun 26
15 Dec 26
Defect
CAR-Doyle
Timperley
MA19 OPL
Car
09 Oct 26
19 Mar 27
01 Mar 27
Pass
BIKE-03
Timperley
—
Bike
n/a
n/a
n/a
Pass
EV-Sale-01
Sale
EV72 NXG
EV
Lapsed 04 Jun
11 Nov 26
EV exempt
Due
Expiry pills: green > 30 days, amber within 30 days, red lapsed. Each vehicle carries a driver walkaround (VIR) check — defects route to the fleet manager.
VAN-02 — MX23 TRV MOT due 28 Jun
Vehicle
Reg no *
Vehicle type
Colour
Make / model
Branch
Cold-chain container
Compliance & reminders
Insurance expiry
Insurance reminder
MOT expiry
MOT reminder
Road tax expiry
Road tax reminder
VIR — driver walkaround inspections
Date
Driver
Verdict
Notes
13 Jun 2026 07:55
Sam Doyle
Defect
Nearside tyre tread low — reported
12 Jun 2026 08:02
Sam Doyle
Pass
—
11 Jun 2026 07:48
K. Patel
Pass
—
Daily VIR (configurable checklist) is recorded by the driver in the app before first delivery. A defect verdict blocks the vehicle from route assignment until cleared.
Drivers — Timperley4 drivers · 3 active
Name
Type
Branch
Assigned runs
Shift
Service area
Status
Sam Doyle
sam.doyle@timperley.nhs
Dedicated
Timperley
First RunThird Run
08:00–16:00
Set
Active · on route
K. Patel
Hybrid
Timperley · Sale
Second Run
10:00–18:00
Set
Active
D. Okeke
Shared
Timperley · Altrincham
First Run
07:30–15:30
Not set
Active
L. Hughes
Dedicated
Timperley
Second Run
—
Not set
Inactive
Driver identity reuses the ScriptIQ shell login (no separate account). Type: Dedicated = one branch · Shared = many branches · Hybrid = mixed. Service area is a geofenced zone drawn per driver.
Driver — Sam Doyle Active
App loginRunsDetailsService areaShift hours
Role
First name *
Last name *
Status
Email (app login) *
Driver type
Runs — standing-round assignment for this driver:
Mobile
Address
Training certificate
CD-handling.pdf
Service area (geofence)
Polygon-draw map placeholder — WA15 / WA14 zone set
Shift start
Shift end
Auto-logout
Auto-logout policy: driver is logged out 45 min after shift end — unless parcels are still "on the way", in which case the session stays open until all are delivered, then logs out. Cannot log back in before the next shift.
Wages / payroll (mileage / hourly / on-cost) are out of scope for the ScriptIQ delivery module.
Broadcast to drivers
Delivery raises a request — the comms module owns the channel and the send. Delivery never sends the message itself (single-channel-owner rule, §1.2). Emits delivery.driver_broadcast_requested.
Message
Scope
Subject
Message
Priority
Recipients — 3 drivers on shift
Driver
Run
Status
Sam Doyle
FirstThird
On route
K. Patel
Second
Loading
D. Okeke
First
Off shift
Channel + delivery (SMS / in-app push) is resolved by comms against each driver's contact prefs — not chosen here.
Audit: who raised it, scope, recipients and the resulting comms request ref are recorded. The send outcome is owned and surfaced by comms.
Can't deliver — Stop 3 CD Sch 3
09:58 offline · queued
Eleanor Wright
→ Riverside Surgery (clinical site) · WA15 7BX
Same-day return required — this bag contains a CD (Sch 3) + fridge line. It cannot stay on the van overnight (SM-D5) and cannot be redelivered from the van tomorrow. Returns to branch today for receive-back.
Reason *(coded)
Note
GPS + timestamp always captured
Re-attempt window Attempt 1 of 2 (policy cap: 2). Next attempt window: tomorrow, Third Run 14:00–16:00 — needs a fresh request after receive-back (CD never redelivers from the van).
Append-only del_attempts row (never overwritten, SM-D7). Emits delivery.failed (informational to dispensing — the prescription stays held, the bag is still attributed to this route until receive-back).
End of route — Round AFirst Run
12:18 online
11 stops · 9 delivered · 2 returning
Sam Doyle · VAN-02 · back at Timperley
2 bags coming back — hand to branch receive-back. A failed CD/fridge bag must never stay in the van overnight (SM-D5).
Returns summary
Eleanor Wright
id_check_failed
CD · same-day
14 Oak Rd — H. Begum
not_home (attempt 1)
fridge · same-day
Confirm the van is empty before you finish. Any undelivered bag left in the van is a roadworthiness + CD-security hazard.
Van-empty confirmation is mandatory — the Complete-route action is blocked until ticked. Emits delivery.route_completed; returns hand off to the branch Returns queue for scan-back + disposition (restock / quarantine / pharmacist review).
Driver app — sign in
07:48 online
ScriptIQ Driver
Timperley · separate PWA
Platform-standard shared auth — PMR credentials + MFA (no CIS2; drivers never hold smartcards). Sign in online before departure — fresh login is blocked offline (§7).
Email
Password
MFA code
Branch context is fixed by assignment (not chosen here). Device enrolled per platform policy. After sign-in → start-of-shift vehicle check (VIR).
Identity reuses the shell-identity login (no second credential, SM-D19). Auto-logout 45 min after shift end unless stops are still out for delivery; cannot re-login before the next shift.
Money dashboardJune 2026 · Timperley
Claimable now£4,210
Gate-blocked£830
Awaiting payment£18,940
Variance (May)−£120
NCSO / concession uplift this month+£742feature 70 · positive concession income · 7 listed lines
Service income MTD£1,486
Open alerts4
Money left unclaimed — alerts
FP34C_DEADLINE
Month not declared — due by the 5th · £18.9k at stake + advance timing
PF_THRESHOLD_NEAR
24 CP consultations by the 25th — 6 more reaches the £1,000 band
RX_VOID_RISK
3 prescriptions >150 days undispensed · est. £74 lost at day 180
NCSO_IMPACT_MONTH
June concession uplift +£742 over tariff — above the £500 threshold · positive income to ensure is claimed (concession − tariff, 7 listed lines) → review registry
Month cycle
May — FP34C declared4 Jun ✓
May — bundle dispatchedtracked ✓
May — Schedule receivedexpected ~25 Jun
June — cut-off5 Jul (provisional)
Claims boardmoney states are event-driven projections — not draggable
not applicable — no Part IX appliance item on this Rx
—
ED — extra-dispensing fee
not applicable
—
Note: header total shows £24.50 pending the SP_ED_AMOUNT resolution above; specials reimburse at invoice price (£6.20) + the £20 SP fee is additional. Fee values resolve only from claim_endorsement_fee_rates — never hard-coded (AC-21/22). Re-seeding the fee table at a new effective date changes the estimate without a code change.
Linked broken-bulk record — BB_QUANTITY evidence (AC-27 · feature 163)
Endorsement
BB broken bulk — item 1
Product
salbutamol 100mcg inhaler (dm+d ····0421)
Pack broken / dispensed
pack 200 · qty dispensed 1 · remainder 1 returned to stock
Claim basis
full pack broken for a part-pack supply — reusable remainder accounted
Recorded
Tom Mills (ACT) · 11 Jun 2026 · claim_broken_bulk_records 1:1 with BB endorsement
A BB claim requires this linked record (product, pack size, qty dispensed, reusable remainder, basis); absent it, BB_QUANTITY blocks. Retained as BB-claim evidence and shown in the item's evidence trail.
Owing ledger — unpaid NHS charges (CM-12 · never blocks the claim)
Patient
Rx
Owed
Incurred
State
Action
John Okafor
Rx ····5521
£19.80 2 × £9.90
11 Jun · took meds, no card
Open
Eleanor Wright
Rx ····5488
£9.90 £9.90 of £19.80
9 Jun · CD delivery
Part-paid
R. Singh
Rx ····5390
£0.00
2 Jun
Settledcash · 7 Jun
—
D. Frost
Rx ····5102
£9.90
21 May
Written offgone-away · mgr
—
Open/part-paid owings emit the balance delta to patients (patient balance). Write-off ≥ threshold → superintendent; reason mandatory. The NHS charge is still due to NHSBSA — the claim is correct.
HC2 / HC3 — Low Income Scheme captures
Patient
Kind
Cert no.
Valid to
HC3 max paid
Route
Priya Patel
HC2 — full help
HC2 9931 4420
31 Oct 2026
—
exemption evidence · no charge
G. Mensah
HC3 — partial help
HC3 7720 1185
14 Aug 2026
£4.10 of £9.90
balance → FP57 refund
FP57 refund receipts — issued so the patient can reclaim from NHSBSA (3-month window)
Income Support / JSA(IB) removed as exemption categories from 15 Apr 2026 — the picker rejects them after 14 Apr 2026 with a human-readable reason. RTEC covers maternity/medical/PPC/LIS/HMRC/DWP-incl-UC — not education or MoD. Age derives from DOB, never declared. This module owns the authoritative charge_status, owing, HC2/HC3 and FP57; patients holds the resulting balance.
Handout charge panel — Ahmed Hassan claims-finance componentcharge_status: unresolved
Charge status must resolve before completion (CM-4). For the delivery channel this runs at the to-delivery step — dispensing must not marshal to delivery with charge_status = unresolved (the driver carries no capture surface).
Charge context — getChargeContext(rxId)
RTEC check (at labelling)No match — service_available
Items chargeable2 items
Current rate (versioned)£9.90 / item · 2026/27
Charge due2 × £9.90 = £19.80
RTEC covers maternity/medical/PPC/LIS/HMRC/DWP-incl-UC — not education or MoD. PPC £32.05 / £114.50 · HRT PPC £19.80.
Take now, pay later — opens a claim_owings entry (D-CC5)
Owing opened£19.80 · state: open
Emits topatients — patient balance delta
An unpaid chargeable item handed out creates an owing — it does not block the claim (CM-4): the NHS charge is still due to NHSBSA and the claim is correct; the unpaid amount is a tracked debt. Captured here at counter handout and at the to-delivery step.
Component owned by claims-finance, embedded in the dispensing handout screen (counter + to-delivery). Methods: recordChargeCollection · captureDeclaration · recordChargeRefund (FP57) · recordOwing · recordLowIncomeCertificate (HC2/HC3). Evidence immutable once the claim is submitted.
FP34C month-end — June 2026cut-off in 23 days
EPS claims swept (continuous)1,311 sent
Gate-blocked to clear before cut-off3 · £830
Paper bundle (FP10/FP10MDA) — count & batch41 forms
FP34C declaration in MYS portal
Bundle dispatch — track & trace ref
FP10PCD (private CD) monthly submission
Advance payment ETAon-time submission → ~20 days earlier
Estate view: 4 of 377 branches undeclared on the 3rd — escalates to central ops on the 4th (late = £25 charge + advance lost).
Every parsed total keys to a canonical heading_code + heading-set version — no free strings (CM-7). within_tolerance resolves from claim_recon_tolerances (per-month £50 / 0.5%, finance-signed) — never a literal; a within-tolerance variance does not raise PAYMENT_VARIANCE_OPEN. The national discount-scale deduction is categorised discount_deduction, never unexplained (CM-6). Sign-off (central finance / superintendent) closes the month; original Schedule artefact retained in Blob — the module never fabricates paid figures.
Service claiming calendar — JuneMYS per-service APIs
Stream
Provisions
Deadline
Caps / bands
Status
Pharmacy First
24 CP · 6 UMS
verify by 5 Jul
24/30 to £1,000 band
Accruing
NMS
19 episodes
monthly via MYS
cap headroom 31 of 38 (0.9%)
Accruing
DMS
3 (1 partial £12+£11)
5 Jul
—
Accruing
Hypertension (HCF)
12 clinic · 2 ABPM
monthly
outlier caps TBD 2026/27
Accruing
May — all services
61
was 5 Jun
—
Submitted ✓
SERVICE_LATE_WINDOW: 1 April PF episode is in the late window — claimable but unpaid without IT-failure evidence.
PPV-audit worklist — NHSBSA Post-Payment Verification (claim_service_evidence_packs in 'requested') · respond before the deadline
SERVICE_PPV_OPEN: 2 PPV requests unanswered — value-at-risk £42.00. The evidence pack is reporting-rendered (AS-4); claims-finance holds the pinned-version pointer + records the response. Clinical evidence stays in clinical-services (read by episode_ref, never copied).
Service ref
Quarter
Service
Pinned version
PPV state
Response deadline
Value
Action
NMS-TIM-0291
Q1 2026/27 (Apr–Jun)
NMS — Susan Bell (warfarin)
content v7 · pinned
requested
due in 6 days · 20 Jun
£28.00
PF-TIM-0188
Q1 2026/27 (Apr–Jun)
Pharmacy First (CP) — A. Hassan
content v7 · pinned
requested
due in 11 days · 25 Jun
£14.00
NMS-TIM-0274
Q4 2025/26 (Jan–Mar)
NMS — John Okafor (eRD)
content v6 · pinned
responded
answered 2 Jun
£28.00
awaiting NHSBSA
NMS-TIM-0240
Q4 2025/26 (Jan–Mar)
NMS — M. Quinn
content v6 · pinned
recovered
upheld 14 May
£28.00
closed
Worklist anchored in claim_service_evidence_packs (1:1 with each assembled service claim · ppv_state requested → responded → upheld/recovered, AS-4). A PPV-sampled month is evidenceable end-to-end (D-CC4): which claims, which pinned content versions, what was retained, how the audit was answered.
PPV response — NMS-TIM-0291ppv_state: requested
Response deadline 20 Jun 2026 (6 days) · SERVICE_PPV_OPEN active. Value-at-risk £28.00 if the claim is not upheld.
clin episode ····8841 — evidence read in clinical-services, never copied (AS-1)
Pinned content version
NMS content pack v7 · pinned at assembly
Evidence pack
retained Blob ····/ppv/nms-0291 · rendered by reporting
Record NHSBSA response
Outcome
Response reference
Notes
Recording a response moves ppv_state requested → responded and clears SERVICE_PPV_OPEN once submitted. The pack document itself is produced by reporting (AS-4) — this records only the pointer + response trail.
Local-commissioner settlementthe third claim channel — direct to LPC / ICB / council
Distinct from NHSBSA EPS/FP34 reimbursement and NHSBSA MYS national service claims (§2.7, CM-13): billed and paid directly to local commissioners per their funding definitions, settled by monthly BACS remittance — never via NHSBSA. Funding definitions + provision activity are owned by clinical-services (read by episode_ref, never copied); this screen owns the money / settlement.
Claimable to commissioners£2,415
Awaiting remittance£1,176
Paid MTD£3,090
Disputed / blocked£42
LOCAL_CLAIM_BLOCKED_G2: 1 service has no live commissioner agreement (G2 not onboarded) — provisions accrue but cannot batch until the commissioner is set up.
Commissioner
Period
Services
Items
Value
Status
Remittance ref
Tees LPC BACS · monthly
May 2026
Local Minor Ailments · Supervised Consumption
38
£1,240.00
Submitted — awaiting remittance
LC-TEES-0042
PSNE Ltd
May 2026
PSNE Pharmacy Services contract
11
£415.50
Paid
remit 31 May
Middlesbrough Council
Jun 2026
Supervised Consumption · EHC
26
£760.00
Assembling
—
Newcastle PCN
—
NRT follow-up
3
£42.00
Blocked — G2 not onboarded
—
Channels never cross (CM-13): EPS/FP34 (NHSBSA) · MYS national services (Service claiming) · local-commissioner (here). Patient charge/owing stays on the NHSBSA model; local income feeds the GL export (CM-LC-3). Consumes clin.local_claim_ready (assemble) + clin.commissioner_contract_accepted (bank/ledger setup); emits claim.local_claim_submitted / _accepted / _paid / _disputed. Payment-rail particulars = OQ-15.
Veterinary POM-V is private + standard-rated VAT (20%, 2026/27) — billed to the owner or practice account, never the animal-patient; no NHS claim, no FP34/MYS, no RTEC/exemption path (D-CC1). NHS dispensing is outside the scope of VAT. Private Rx never enter the NHS claim machine (CM-10). Numbering per OQ-7 · void requires reason, full audit.
New invoice
Veterinary POM-V is a private, VAT-able supply — it bills the owner/practice and never enters the NHS reimbursement ledger (D-CC1). Selecting it swaps the customer to owner/practice and applies standard-rated VAT per line.
Invoice class *
Customer / owner *
Animal / patient ref
Description
Qty
Unit net
VAT rate
VAT
Gross
Meloxicam 1.5mg/ml oral suspension (POM-V)
1
£24.50
standard 20%
£4.90
£29.40
Net total£24.50
VAT output (20%)£4.90
Gross total£29.40
Line sums must reconcile to header totals (invariant). VAT-compliant PDF layout generated for VAT-able lines. VAT treatment of private human dispensing/services is config pending accountant sign-off (OQ-7).
Endorsement fixed fees — claim_endorsement_fee_rates · item-level fixed fees (MF/SP/ED) · the single source the CM-6 estimate and the gates both resolve from
endorsement_code
Fee
Applies to
Effective from
To
Status
MF — measured & fitted / dispensing-appliance fee
£2.64 264p
Part IX appliance items
1 Apr 2026
—
Designed; pre-build
SP — specials / extemporaneous fee
£20.00 2000p
specials / extemp items
1 Apr 2026
—
Designed; pre-build
ED — extra-dispensing / out-of-pocket-type fee
£20.00 2000p
specials / extemp items
1 Apr 2026
—
Designed; pre-build
Seeds for 2026/27 re-baselined against the issued Drug Tariff / Endorsement Guidance at EPS onboarding (alongside the gate-ruleset SCAL review). Dispensing owns adding the endorsement; this module owns valuing it and flagging its absence (ENDORSEMENT_FEE_PRESENT / SP_ED_AMOUNT). Like every money-bearing rate, fee changes are data deployments, not releases.
Veterinary POM-V is standard-rated (D-CC1, decided). NHS dispensing is outside the scope of VAT. VAT treatment of private human dispensing/services is config pending accountant sign-off (OQ-7).
Reconciliation tolerances — claim_recon_tolerances · makes "within tolerance" an auditable rule, not a magic number
Scope
heading_code
Abs bound
% bound
Effective from
Status
per_month
— (whole month)
£50.00
0.5%
1 Apr 2026
finance sign-off pending
per_heading
CATM_ADJ
£40.00
1.0%
1 Apr 2026
finance sign-off pending
per_heading
DISC_DEDUCTION
£30.00
0.5%
1 Apr 2026
finance sign-off pending
A variance within either bound is within_tolerance; claim_payment_variances.within_tolerance resolves from here, never a literal (AC-24). Designed; pre-build — conservative starting thresholds flagged for finance sign-off.
FP34 Schedule headings — claim_fp34_headings · the canonical account-heading taxonomy parsed_totals key against (v3)
heading_code
Display
Category
Sign
Effective from
BASIC_PRICE
Basic price
basic_price
credit
1 Apr 2026
DISPENSING_FEE
Dispensing fee
dispensing_fee
credit
1 Apr 2026
SAF
Single activity fee
saf
credit
1 Apr 2026
ESTABLISHMENT
Establishment payment
establishment_payment
credit
1 Apr 2026
ADVANCE_PAYMENT
Advance payment
advance_payment
credit
1 Apr 2026
CATM_ADJ
Cat M adjustment
cat_m_adjustment
debit
1 Apr 2026
SERVICE_PAYMENT
Service payment
service_payment
credit
1 Apr 2026
CLAWBACK
Clawback / recovery
clawback
debit
1 Apr 2026
DISC_DEDUCTION
Discount-scale / Margin Survey deduction
discount_deduction
debit
1 Apr 2026
OTHER
Other
other
credit/debit
1 Apr 2026
Designed; pre-build — the published heading set is re-baselined against a live FP34 Schedule at NHSBSA onboarding (a document/CSV today, not an API — OQ-1); the taxonomy ships as reference data so corrections are config, not migration. Edits are platform-admin only, effective-dated and audited · system gates undeletable · gate dry-run mode evaluates a proposed ruleset against the live queue before activation (fail-closed: a gate that errors = fail).
Daily cash-up — Timperley Designed · gated behind OQ-6June 2026
Shown only where the PMR owns the till. Allied tills run StockIQ EPOS — if EPOS owns cash-up (OQ-6), this route is hidden and the PMR exposes only its charge ledger to EPOS. This is a non-authoritative reconciliation view over the charge/invoice ledgers, never a second money store.
State: open → counted → reconciled → disputed. Schema ships now (Designed; pre-build) so enabling is config + population, not migration — same OQ-6 decision governs card-terminal integration (claim_terminal_txns).
Cash-up — 14 Jun, session #1counted
Designed; pre-build (OQ-6). Non-authoritative reconciliation over the charge/invoice ledgers — the figures below are rolled, not a second source of truth.
Expected vs counted
Expected
Counted
Δ
Cash
£27.00
−£0.50
Card
£15.30
£15.30 auto (settlement)
£0.00
Total
£42.30
£41.80
−£0.50
Banking reference
Variance note
Expected breakdown — what rolls into this session
Source
Method
Amount
Charge collections (claim_charge_records)
cash
£19.80
Owing settlement — John Okafor
cash
£7.20
Charge collections
card
£9.90
Counter invoice payment — INV-TIM-0290
card
£5.40
Session expected
—
£42.30
Rolled from claim_charge_records + claim_owings settlements + claim_private_invoices counter payments for the session. Opened by Tom Mills 09:02, closing Aisha Khan (RP).
NCSO / concession & endorsement registryJune 2026uplift +£742 this month
The positive money view of concessions (feature 70): concession price − tariff price, summed over dispensed concession-listed items, feeds claim_rpt_ncso_impact, the money-dashboard NCSO tile and the NCSO_IMPACT_MONTH alert — distinct from the per-claim NCSO_IN_CONCESSION_MONTH warn gate.
Concession-listed lines (June)7
Items dispensed148
Total uplift (June)+£742
Threshold£500crossed → NCSO_IMPACT_MONTH
Monthly concession list — published claim-period data (not code) the NCSO gates reference
Product (dm+d)
Concession price
Tariff (Cat M)
Uplift / item
Items
Line uplift
Amoxicillin 500mg caps
£3.94
£1.86
+£2.08
32
+£66.56
Carbamazepine 200mg tabs
£8.91
£3.42
+£5.49
21
+£115.29
Naproxen 500mg tabs
£6.20
£2.74
+£3.46
40
+£138.40
Quetiapine 25mg tabs
£4.78
£1.10
+£3.68
18
+£66.24
Trimethoprim 200mg tabs
£3.55
£1.49
+£2.06
22
+£45.32
Lisinopril 10mg tabs
£2.99
£0.95
+£2.04
9
+£18.36
Mirtazapine 30mg tabs
£12.40
£4.20
+£8.20
6
+£49.20
June total uplift
+£742.37
Concession lists land mid-month; an NCSO endorsement referencing a product/month not on this list raises the warn-level NCSO_IN_CONCESSION_MONTH gate on the board.
Endorsement-code reference — channel-aware vocabulary used by the §2.3 data-quality gates
Code
Meaning
Channel
Gate(s)
Carries value?
NCSO
No Cheaper Stock Obtainable (concession)
EPS + paper
NCSO_IN_CONCESSION_MONTH
references concession list
BB
Broken bulk
EPS + paper
BB_QUANTITY + linked broken-bulk record
pack / qty / remainder
XP / OOP
Out-of-pocket expense
EPS XP · paper OOP stamp
OOP_OR_XP_AMOUNT
amount (either channel)
MF
Measured & fitted appliance fee
Part IX appliance
MF_PRESENT / ENDORSEMENT_FEE_PRESENT
fixed £2.64
SP / ED
Specials / extemp fee
specials items
SP_ED_AMOUNT · SPECIALS_INVOICE_PRESENT
fixed £20 + invoice price
SSP
Serious Shortage Protocol substitution
EPS + paper
SSP_REF_FORMAT (3-digit ref)
SSP reference
PC / PNC
Prescriber Contacted / Not Contacted
paper only
PC_PNC_PRESENT
contact flag
Dispensing's endorsement engine owns capture; this module validates completeness/coherence at the gate and never edits endorsements (§1.2). The channel-aware vocabulary (XP↔OOP, PC/PNC paper-only) lives in the versioned gate rules, not code (CM-10).
Thermometer calibrationFridge 2 probe overdue — last cert 11 May 2025
Duty of candour1 statutory incident · candour step open (11 Jun)
FP10PCD submissionMay period submitted ✓ · read-only (claims owns)
AIS self-assessmentIn progress · DAPB1605 · first cycle due Mar 2027
DSPT statusStandards Met · evidence bundle ready to export
Audit trailAppend-only · record views logged
Mapped to the five GPhC principles · one click → the underlying register · designed for unannounced inspection. FP10PCD is a read-only claims surface (CD-10); thermometer-calibration / vet POM / AIS / DSPT each click through to their register.
CD registerper-premises, per drug/strength/form pages
Search drug
Schedule
Register page
Form
Running balance
Last entry
Last check
Morphine sulfate 10mg/5ml oral soln
300ml bottles
150 ml
today 09:12
Mon ✓
Methadone 1mg/ml oral soln
500ml
1,240 ml
today 08:40
Mon ✓
Methylphenidate 10mg tabs
×28
3 packs
11 Jun
Mon ✓
Morphine sulfate 10mg/5ml — register pageBalance ✓ 100 ml
Supply · C. Reilly — flagged late_entry, never blocked (CDR-4/5)
—
appended in recorded order
TM
13 Jun (annotation)
Correction
Annotation of 12 Jun supply (entry #1188): collector address mis-keyed — corrected to "12 Brook Lane". Original entry unchanged; this is a forward-posted dated annotation (correction_of_entry_id #1188). Note mandatory · fresh re-auth ≤ 5 min · online-only.
0
no balance change
AK
Append-only (UPDATE/DELETE trigger-blocked) · balance validated in recorded order · corrections are dated annotation rows shown beside the original (never overwrite, no retroactive balance recompute) · Sch 2 supply requires the full collector block · destruction needs an in-scope/in-date authorised witness, a denaturing-kit ref and a quantity_denatured that reconciles (fail-closed, online-only).
Record CD supply — Morphine sulfate 10mg/5mlSch 2 · collector block required
Routine supply: authenticated session only — no fresh re-auth, no witness (witness applies to destruction, not supply). Works offline in the 72h window. Sch 2 fails closed without the full collector block.
Quantity supplied *
Date occurred *
Prescription / source ref
Collector identity block (statutory — Sch 2)
Collector kind *
Collector name *
Collector address *
HCP registration (if HCP)
Identity asked?
Identity verified?
Instalment block (CDR-16 — optional, for instalment CDs)
Is this an instalment?
Supervised consumption?
Instalment schedule ref
Supervised-consumption status is the field a CDAO / GPhC inspector expects per instalment for treatment CDs (methadone / buprenorphine).
On save → cd.entry_recorded · balance recomputed in recorded order.
Record CD receipt — Morphine sulfate 10mg/5mlGoods-in
Receipt entries are often pre-filled from a StockIQ stockiq.delivery_received goods-in prompt. Authenticated session only — no fresh re-auth, works offline.
Supplier *
Invoice / delivery ref *
Quantity received *
Date occurred *
Batch number (CDR-15)
Expiry (CDR-15)
Batch / expiry are captured from the DataMatrix parse where available — optional, never blocking — so a CD recall sweep can tie an affected batch back to register receipts and supplies (CDR-15, H-REC-3).
Online-only · fresh re-auth (password/TOTP ≤ 5 min) for both parties. Blocks offline — the authorised-witness registry must validate live (fail closed). PIN never satisfies fresh or the witness class.
Quantity to destroy *
Reason
Date occurred *
Destruction method *
Denaturing-kit ref *
Quantity denatured *
Authorised witness (registry-validated at occurred_on)
Witness *
Selection is validated in-scope (this branch) and in-date against cd_authorised_witnesses; the appointment scope/office is snapshotted onto the entry (witness_authority_snapshot) so the entry stays self-describing. quantity_denatured must reconcile with the negative quantity_signed or the entry is rejected loudly (AC-27).
Patient-returned CDs are not recorded here — they use a staff witness and the separate patient-returns log (never touches a register balance, CD-8 / AC-8).
Re-auth both parties to confirm.
CD balance check — weekly worklistsession started 10:05 · A. Khan + witness T. Mills
Due / overdue this week (2)
Mon cadenceTimperley — full Sch 2 countlast closed 5 Jun · due 12 JunIn progress
Mon cadenceMethylphenidate spot-checkflagged from a −1 pack discrepancy last weekUnder investigation
A discrepancy cannot close without an investigation note (AC-9). Escalate → creates a comp_safety_events row + a line in the next CDAO occurrence report + a non-suppressible superintendent alert. None of these are optional or suppressible.
Closing records cd.balance_check_closed (actor + witness + per-page deltas).
Patient-returned CDs — destruction logseparate from the statutory register (CD-8)
Received
Patient ref
Product
Qty
Denatured
Witness (staff)
11 Jun
family of E. Carson (deceased)
Oxycodone 5mg caps
43
11 Jun — kit #12
T. Mills ✓
9 Jun
anonymous return
Tramadol 50mg
20
9 Jun
T. Mills ✓
Staff witness (not an authorised witness) is the correct standard for patient returns · never touches register balances · stock destructions live on the register page with an authorised witness (reg 27).
Responsible Pharmacist log — TimperleyRP: A. Khan since 08:55
You are signed in as Aisha Khan (GPhC 2069471) — you are the Responsible Pharmacist for this premises. Only you may write to this log under your own login (RP-1).
Self-service RP controls
Live absence budget today1h 25m remaining35m used of 2h aggregate · warn 90m · alert 120m
Controls are gated to the signed-in RP only — the server rejects any on-behalf-of write (RP-1). Sign-out reason recorded (end_of_day / handover / absence / emergency).
Absence budget warning fires at 90 min aggregate; a non-suppressible alert to RP + branch + central ops fires at 120 min — the system records the breach (it cannot legally prevent it) and surfaces it on the inspection dashboard (RP-3).
Date
Pharmacist (GPhC)
Became RP
Ceased
Absences (aggregate)
Cover state
Fri 12 Jun
Aisha Khan (2069471)
08:55
—
00:00 used today
Present
Thu 11 Jun
Aisha Khan (2069471)
08:52
18:31
12:30–13:05 (35m — lunch)
≤ 2h ✓
Wed 10 Jun
Locum — P. Novak (2188903)
09:00
13:40
—
No-RP 13:40–14:05 (GSL-only)
Wed 10 Jun
Locum — P. Novak (2188903)
14:05
18:02
—
Present
Operating-without-RP interval — Wed 10 Jun 13:40–14:05 (25 min)
Derived from the sign-out→next-sign-in gap during trading hours (comp_rp_no_cover view). A first-class, reportable interval — GSL-only sales lawful, no POM/P-med supply. Surfaced here and on the dashboard.
Written only by the RP under their own login (RP-1) · append-only events (5-year retention), current RP is a derived view (`comp_rp_current`) · >2h aggregate absence/day raises a warning (RP-3) · presence state gates handout estate-wide; during absence only checked-and-bagged items under a recorded reg-220B authorisation.
A derived render (not mutable state) — computed from the current RP (`comp_rp_current`) and the registered-pharmacy particulars. `GET /rp/notice` produces the on-screen and print-faithful versions.
The Responsible Pharmacist in charge of this pharmacy at the present time is:
Aisha Khan
Registration number 2069471
Statement (reg 5(3)): the above-named pharmacist is the responsible pharmacist in charge of this registered pharmacy. Generated 12 Jun 2026 08:55 · render format: screen / print-faithful PDF.
Near misses are local-only (never LFPSE) · the discovery→notification→remediation timestamps are the statutory defence evidence (Pharmacy Order 2018) · CD-related events feed quarterly CDAO occurrence reports.
SOP libraryversioned · reg 4 taxonomy
SOP
Scope
Version
Effective
Acknowledged
Review due
Sale & supply — handout during RP absence
estate
v4
7 Jan 2026
100%
Jan 2027
CD management
estate
v6
1 Mar 2026
94% — 3 outstanding
Mar 2027
Delivery & safe-place
estate
v2
12 May 2026
100%
May 2027
RP changeover (Timperley local)
branch
v1
2 Jun 2026
8 of 9
Jun 2027
Prior versions immutable · exactly one effective version per (title, scope) · new version re-triggers read-and-understood acknowledgements.
EL(26)A/19Salbutamol neb — batch S119no stock held · no supplied patients · evidenced 28 MayClosed (no_stock_held)
Date-checking sessions
Shelf section A–Fchecked 2 Jun · 3 short-dated flaggedCurrent
CD cabinetchecked 2 JunCurrent
Fridgedue 1 JulScheduled
Action + evidence live here; the stock movement (quarantine/write-off) happens in StockIQ with the reference linked. Patient-matching is computed by dispensing (D-CC3) and consumed here as a display/action cache.
Recall task — Atorvastatin 40mg (batch C8821K) Class 2 · EL(26)A/22deadline Mon 15 Jun
A task with supplied-patient matches cannot be completed while patient_contact_action is unset (H-REC-2 / AC-23). Complete is blocked below until every match has a contact action.
Stock found (StockIQ)2 packs · batch C8821Kas-of 14 Jun 08:12 · 41m old
Supplied patients3 matched (from dispensing)disp.recall_patients_matched · as-of 14 Jun 08:05
Action takenQuarantined — in progressStockIQ ref pending
stock_found is a cache with visible data age — 2 packs as-of 14 Jun 08:12 (41 min old). The quarantine/write-off movement happens in StockIQ; the resulting stockiq_movement_ref is linked back here as evidence. Deep link carries token + branch (09 §4.4).
Supplied-patient list — contact action (blocks completion until set)
Patient
Supplied
Rx item
Batch
Contact action
Susan Bell (72)
3 Jun 2026
····2289
C8821K
Contacted ✓ phoned 13 Jun
John Okafor
5 Jun 2026
····4471
C8821K
Ahmed Hassan
6 Jun 2026
····5012
C8821K (unconfirmed)
required
Matches are a display/action cache; the match truth lives in dispensing. Each row records a patient_contact_action (none_required / contact_pending / contacted / clinician_referred). recall.patient_contacted is audited per patient.
Complete task — evidence
Action taken *
StockIQ movement ref
Completion validates evidence fields + every match has a contact action.
Fridge / temperature logs
Fridge
Today (min/max/current)
Range
Gaps (30d)
Excursions
Fridge 1 — dispensary
3.1 / 4.8 / 4.2 °C
2–8 ✓
0
0
Fridge 2 — vaccine
2.8 / 5.1 / 3.9 °C
2–8 ✓
1 — Sat 7 Jun
1 open
Open excursion — Fridge 2, 9 Jun (8.9 °C for ~40 min)
V. Singh · Furosemide 40mg ×28 (6 Jun emergency-prescriber supply) — the 72h prescriber follow-up obligation passed 9 Jun with no linked prescription. Chase Dr Mehta. Surfaced on the inspection dashboard.
Append-only; corrections are dated annotation rows (online-only, fresh re-auth) · written via pomRegister.record() from the dispensing intake/handout flow · the dispensing private terminal records private_prescription here so it is never a method-less terminal.
Veterinary POM-V / POM-VPS register Batch number mandatory (VMR)
Distinct statutory register (VMR 2013 SI 2013/2033 Sch 3) — never the human POM or CD register. Batch number is mandatory; a supply recorded without it is rejected loudly. Recipient is the animal owner (no NHS number / PDS). 5-year retention.
Date
Kind
Owner (name & address)
Species / animal
Product · batch · expiry
Prescriber (RCVS)
By
10 Jun
POM-V
M. Fielding, 7 Brook Lane, Timperley
Dog — "Bramble"
Apoquel 16mg ×20 · batch VT88-2291K · exp 03/2027
Dr S. Patel MRCVS (RCVS 7041122)
A. Khan
5 Jun
POM-VPS
Oakwood Stables, Dunham Rd
Horse — "Comet"
Equest oral gel ×1 · batch EQ-5510 · exp 11/2026
SQP J. Hartley (declaration on file)
A. Khan
Capture form — vet POM-V supply
Product (VMD code)
Batch number *
Expiry *
Quantity
Owner name *
Owner address *
Species / animal
Prescriber + RCVS
Append-only (UPDATE/DELETE trigger-blocked); corrections are dated annotation rows · written via vetPomRegister.record() · rejects input lacking a batch number (VMR mandatory) — never auto-filled.
Record views are first-class audit events with care context · every event carries actor, branch, correlation id · export is a disclosure event (approval-gated).
Reg-22 requisition registerfirst-class records — the supply entry references requisition_id (CDR-14)
The standardised requisition form is mandatory for Sch 2–3 supplies on requisition (to another pharmacy, a practitioner, or a care home / institution). A supply made on a requisition requires a resolved requisition_id. 2-year retention (regs 22–23).
Date
Direction
Requisitioner (profession · address)
Purpose
Product · qty
Signed form
Linked supply
11 Jun
outbound supply
Oakwood Care Home — Sr V. Singh (RGN) · Dunham Rd, Timperley
care-home stock
Morphine sulf 10mg/5ml · 500ml
CD-REQ-0442 ✓
entry #1188 ✓
8 Jun
outbound supply
Dr R. Mehta (GP, prescriber) · Park Road Surgery, A81021
practitioner bag stock
Diamorphine 10mg amps · ×10
CD-REQ-0439 ✓
entry #1171 ✓
7 Jun
outbound supply
St Anne's Hospice — pharmacy · Altrincham
inter-pharmacy supply
Methadone 1mg/ml · 1,000ml
form pending scan
awaiting form
Capture requisition — reg-22 particulars
Direction
Requisitioner name *
Profession *
Requisitioner address *
Purpose *
Product (dm+d)
Quantity *
Requisition signed on
Standardised form ref *
On save, the resulting supply entry resolves requisition_id (CDR-14).
Append-only (the requisition is a fixed record once made) · Sch 1–3 CDs never route via hub-and-spoke (HS-4) · works offline (queued; the linked supply resolves requisition_id on replay).
MHRA Yellow Card / ADR reportingmedicine-safety reports to MHRA / VMD — distinct from incidents (LFPSE)
Distinct pipeline from LFPSE. Yellow Card reports medicine problems (ADRs, defective / falsified products, device problems) to the MHRA — veterinary ADRs route to the VMD via the scheme discriminator. Reports never appear in any LFPSE / NHS England incident queue (D-CC3).
Draft / unsubmitted (1)
MHRA-humanADRLisinopril 10mg — batch L7741angioedema · serious · patient S. Bell (72)Draft
Submitted — awaiting acknowledgement (1)
VMD-vetADRApoquel 16mg — batch VT88-2291Klethargy/vomiting · non-serious · Dog "Bramble" (owner M. Fielding)VMD ref pending
Capture works offline (queued draft); MHRA/VMD submission is online-only. Link a co-recorded incident via safety_event_id where one exists.
Append-only on report facts (review/submission fields advance; corrections as annotation rows) · 8-year retention (RC-CLIN) · capture-friendly permissions (all clinical staff record; pharmacist+ submits) · failed submission stays in submission_failed with retry + manual-portal fallback.
Extemporaneous / specials preparation registerappend-only · reconstructable years later
Long CPA product-liability retention tail — 5y standard, 11y adult, 25y paediatric where the preparation fed a child (RC-CLIN) — so the preparation is reconstructable in a product-liability or harm claim years later.
Prepared
Formula ref
Product
Qty
Finished batch · expiry
Prepared by
Checked by
11 Jun
Specials spec SP-0091
Menthol 2% in aqueous cream
200g
EX-0611-A · exp 11 Sep 2026
T. Mills (tech)
A. Khan ✓
9 Jun
RPS formula F-114 (paediatric)
Sodium chloride 0.9% nasal drops
30ml
EX-0609-C · exp 9 Jul 2026
A. Khan
T. Mills ✓paediatric — 25y retention
Capture — extemporaneous preparation
Formula reference *
Product
Quantity prepared *
Ingredients — per-ingredient batch & expiry
Ingredient
Batch number
Expiry
Quantity
Menthol crystals BP
Aqueous cream BP
Worksheet / calculation ref
Finished batch number *
Finished expiry *
Prepared by *
Checked by *
Second-person accuracy check: checked_by must differ from prepared_by (a separate accuracy check, not a witness). Rejected loudly if the same user.
Append-only (UPDATE/DELETE trigger-blocked); corrections are dated annotation rows · written via extempPreparations.record() · RPS MEP / GPhC Principle 4.
Authorised-witness appointment registryCDR-11 · stock destruction validates against this
A stock destruction is validated against this registry at occurred_on — the chosen witness must be in-scope (covering this branch) and in-date. NHSE anticipates corporates of ≥ 5 pharmacies designating trained employees. Appointment scope/office is snapshotted onto each destruction entry so it stays self-describing even if a row later changes.
Witness
Appointed by (CDAO ref)
Scope (branches / region)
Evidence
Valid from → to
Status
P. Greene(system user · GPhC 2071882)
NHSE CDAO — appt CD-W-014
NW region — Timperley, Stockport, Altrincham
appointment letter
1 Feb 2026 → 31 Jan 2028
In-date
R. Okonkwo(central ops · GPhC 2055190)
NHSE CDAO — appt CD-W-031
Estate-wide
appointment letter
10 Mar 2026 → 9 Mar 2028
In-date
D. Forsythe(external — police/CDAO officer)
Greater Manchester CDAO — appt CD-W-007
Timperley only
on file
1 Jan 2025 → 31 Dec 2025
Expired
T. Mills (ACT)
— not appointed —
staff witness only (patient returns)
n/a
—
Not an authorised witness
Appoint authorised witness
Witness (system user or external) *
Appointed by (CDAO ref) *
Appointment evidence *
Scope *
Valid from *
Valid to *
Expired or out-of-scope witnesses cannot be selected in the destruction modal (fail-closed, AC-7).
≥ 5-year retention (governance evidence) · reached from the destruction flow · a staff member whose GPhC registration lapses has their witness eligibility flagged for review (fail closed).
CD awaiting collection / entry-pendingSch 2 dispensed, not yet handed outinspection-mode read
A read of dispensing state surfaced in inspection mode (cdRegister.awaitingCollection): Sch 2 items dispensed but not yet handed out — so no register supply entry exists yet (the register entry is made at handout). Not a discrepancy; an inspection-readiness worklist showing what is bagged-and-waiting. Ties to the register-entry-timing policy for delivered CDs (OQ-7).
Dispensed
Patient
Product
Qty
Bagged location
Waiting
Status
12 Jun 14:10
John Okafor
Morphine sulfate 10mg/5ml oral soln
100 ml
CD cabinet shelf B
2 days
Awaiting collection
13 Jun 09:40
Eleanor Wright (CD delivery — deaf-blind)
Oxycodone 5mg/5ml oral soln
120 ml
Delivery bay (Sam Doyle round)
1 day
Out for delivery
The supply register entry (with the full collector block) is written at handout, not at dispense — so an item here legitimately has no register entry yet. Count on the inspection dashboard. Delivered Sch 2 CDs follow the same timing policy (the register entry resolves on confirmed delivery PoD).
CDAO quarterly occurrence reportsSI 2013/373 · per branch, per quarter
One row per branch per quarter — including "nothing to report" periods (a single nil_return line). Generation is automated from CD discrepancies / losses / destruction anomalies; submission is to the manual cdreporting.co.uk portal and tracked here with a reference (no API — manual-first by design).
Methylphenidate 10mg −1 pack discrepancy, under investigation at quarter-end.
Mark submitted to CDAO portal
Submitted via
Portal reference *
Submitted on
No API — the report content is generated here; submission is a human action recorded with its reference (occurrence_report.submitted).
"Nothing to report" quarters are still rows — generated with a single nil_return line and submitted the same way (AC-20).
Accessible Information Standard — annual self-assessmentDAPB1605 · TimperleyIn progress · due Mar 2027
Online only · governance surface. First cycle due Mar 2027. The canonical national question set + return channel are an open data dependency (OQ-12) — Phase 1 captures the five-steps self-assessment + accessible-output usage evidence locally; the accessible-format rendering lives in comms / label-engine, this is the governance record.
Self-assessment — the AIS five steps (2026/27 cycle)
Step
Self-assessment
Evidence note
1. Ask — identify needs
Met
AIS flags captured on patient record at registration (large-print / easy-read / interpreter).
2. Record — record needs
Met
Coded against pat AIS needs; surfaced on dispensing & handout screens.
3. Flag — make needs highly visible
Met
AIS strip renders on every patient-facing surface; fail-closed if format unavailable.
4. Share — share needs (with consent)
Partial
Shared within estate; cross-org share to GP not yet routed — action logged.
5. Meet need — provide accessible formats / support
Met
Large-print labels & letters produced; see usage evidence below.
Accessible-output usage evidence (this period)
Large-print148 itemse.g. Margaret Thompson
Easy-read12 letters
Braille3 items
Interpreter route6 uses
Status
Evidence pack
Next due
aisAssessment.upsert(branchId, period, responses) · one row per branch per cycle · manager+ · incomplete/overdue surfaces on the inspection dashboard (AC-31).
Data Security & Protection Toolkit — evidence exportthis module's governance contribution Standards Met
Online only. DSPT completion / submission is an organisational process and is out of scope here. This surface assembles the named governance evidence this module holds into a one-click export bundle for the organisation's DSPT return. The precise assertion-line mapping shifts year to year (OQ-13).
08:15Doris Haleowing_expiredphone preference → call_task"please contact surgery for a new Rx" · branch chase task pairedcall_task_raised
Status groups follow the §2.3 state machine (queued → gated → sent → delivered → read · or suppressed / failed / call_task_raised). suppressed, failed and call_task_raised are terminal-but-visible — a suppressed recall is information a pharmacist needs (H-COMMS-3). Sends pin the template version + language + resolved sender identity; care-home/proxy classes show the resolved target, never the resident's device (I-11). Read is additive over Delivered, never a gate (I-15). Failures retry with backoff then surface — never silently dropped.
Inbound triagegrouped by kind · matched on the most-recent outbound (90-day lookback)
Outbox / logInbound (2)CampaignsOpt-outs
New — to triage2unmatched / human reply
Keyword-action — auto-handled3routed + auto-ack
STOP / START — auto2identifier-level opt-out
Assigned — open1to branch
kind: stop / start — processed automatically (2)
09:12D. Prycestop"STOP" · identifier-level opt-out recorded (all patients on 07••• ••2381) · auto-closed opt_out · autoclosed
Yesterday(unmatched number)start"START" · opt-out revoked · no patient resolved — suppression key still cleared on identifier opt_in · autoclosed
08:20P. Whitfieldkeyword_actionmatched: "CANCEL" → already-delivered delivery (stale subject ref)route rejected by DeliveryApi — no false confirmation
kind: reply — free-text, needs a human (1)
08:50G. Adamsreply"Can I collect tomorrow instead?" · in reply to ready_to_collect (Timperley)
kind: unknown — unmatched identifier (1)
08:02no patient matchunknown"Is the pharmacy open Sunday?" · no recent outbound to this number · routed to tenant triage queue
Reveal-number-to-call-back is an audited disclosure. The callable sender identifier (from_identifier_encrypted) is encrypted at rest; "Reveal number" decrypts it on view and writes a decrypt-on-view audit entry (actor + inbound ref + timestamp) — staff need a number to phone back, never a silent reveal. The opt-out matching key (from_identifier_hash) is separate and never decrypted.
Inbound model is {stop · start · keyword_action · reply · unknown} (§1.9). STOP/START are the regulatory floor — processed automatically, shown only for awareness. A keyword_action matches the most-recent outbound to that identifier (90-day lookback) so CANCEL/COLLECTED act on the right subject ref, raises the owning module's action via its public API (never a cross-module write), and sends the configured auto-acknowledgement. A stale subject ref is rejected by the owning module and routes to triage with the reason — never a false confirmation to the patient. Anything unmatched stays free-text in triage; the keyword map never swallows a genuine human reply. Triage lifecycle: new → assigned → closed; rows route to the branch of the most recent outbound, else the matched patient's home branch, else the tenant triage queue.
Message templates
Template (class)
Channels
Version
Languages
Accessible
Status
Ready to collectready_to_collect
NHS App · SMS · letter
v3
ency
2/4
Approved
Owed item arrivedowing_arrived
SMS · email
v2
ency missing
n/a
Approved
Delivery updatedelivery_update
SMS · letter
v4
ency
4/4
Approved
Flu invitationvaccination_recall · marketing?
SMS · email
v1
ency missing
n/a
Draft — awaiting approval
Variant key is (class, channel, language, accessible_format) — only approved versions can send (I-2). A missing translation falls back to English (never silence, §1.10) but is surfaced as a coverage gap here; a missing accessible-format variant fails closed (I-13).
Ready to collect — v4 (draft)ready_to_collect · collection
Versioned editor — v3 is the live approved send version; this draft becomes v4 only on manager approval. Sends pin the exact version + rendered language + resolved sender (I-2/I-8).
Sender identity *
PECR classification
Branding (sender display name, SMS sender ID, reply number) resolves through the sender identity — never free-typed on the template (§1.11). Edit senders
Per-language variant grid (en default · cy first-class — §1.10)
Language
SMS body
Letter / email
Coverage
English (en)
✓ authored
✓
complete
Welsh (cy)
✓ authored
letter missing
falls back to en
Accessible-format variant set (letter channel — AIS, fail-closed I-13)
Standard Large print Easy read Braille — not authored Audio — n/a
A patient with a recorded print-format AIS need whose required variant is missing suppresses (accessible_template_missing) + raises a branch task — never silently sent the standard variant.
Body editor — SMS 160 chars · no clinical content (I-9)
Per-channel preview (en · standard · Timperley sender)
SMS · 07••• ••0142 → "ALLIEDPHM"
Hi Ahmed, your prescription is ready to collect at Timperley Pharmacy. Bring photo ID. Reply STOP to opt out.
Letter / large-print preview
Allied Pharmacy — Timperley Dear Mr Hassan, Your prescription is ready to collect…
Minimised content — SMS bodies never carry drug names, conditions or quantities (I-9). Marketing-class templates carry a locked opt-out placeholder on every channel (I-16). The minimisation lint (AC-7) runs over the rendered result including the instruction placeholder.
Opt-out register
Patient
Channel
Scope
Recorded
Source
D. Pryce
SMS
all non-essential
today 09:12
STOP reply
V. Singh
all digital
marketing only
3 Feb 2026
in-branch
Safety-critical messages (recall notices) ride a separate, narrow override policy — audited per send.
Sender identitiesthe registrable sender behind every template's branding (§1.11)
NHS Notify onboarding pending (OQ-C1a). The model is built now; concrete ODS / SMS sender IDs become registrable only once supplier onboarding completes. Rows marked pending render but cannot send — a £0 silent-send would otherwise be the failure mode.
Scope
ODS code
Display name
SMS sender ID
Reply number
Status
Tenant
F0000
Allied Pharmacy
ALLIEDPHM
07••• ••0142
Active
Branch
FA123
Allied Pharmacy — Timperley
ALLIEDPHM
07••• ••0142
Not yet registrable — pending NHS Notify onboarding
Branch
FB456
Allied Pharmacy — Stockport
long code
07••• ••0177
Pending Notify onboarding
Branch
FC789
Allied Pharmacy — Camden
ALLIEDPHM
07••• ••0190
Active
Templates reference a sender_identity_id (§1.11) — the branding block (display name, SMS sender ID, contact footer, reply number) resolves through it, never free-typed. The reply number must be STOP/reply-capable for reply-bearing classes (§8 reply-path constraint). Linked from Comms settings and the template editor.
This is the structured home for the NHS Notify onboarding triad — ODS + sender names + SMS sender ID (OQ-C1a). Saving with Active=No keeps the row visible to template authors but blocks send (no silent £0 dispatch).
Margaret Thompson — Comms Large print (AIS) Oakwood — Elm Wing
OverviewComms
Per-purpose channel preferences (mastered here — single master, lossless round-trip I-12)
Edits land via pat.communication_prefs_updated carrying the full per-purpose set + window so the patients round-trip is lossless (I-12). Empty channels_allowed[] for marketing suppresses marketing-class sends only — collection/delivery unaffected (§2.1a).
Message timeline — append-only system of record (I-8)
When
Class
Channel
Tpl ver
Lang
Status
Badges
Today 09:48
collection_confirmation
Home manager (proxy)
v2
en
Sent
proxy
Today 06:30
mds_batch_ready
Elm Wing nurse
v1
en
Queued — dose-round agg
care-route
2 Jun
ready_to_collect
Letter (large print)
v3
en
Delivered
large_print easy_read_pdf
28 May
vaccination_recall
Email
v1
en
Suppressed
reason: purpose_opt_out (marketing)
14 May
nms_followup
SMS
v3
en
Delivered Read
—
3 May
owing_arrived
SMS
v2
en
Failed
reason: hard_bounce → stale_contact
Merged from CommsApi.getTimeline(patientRef) — read-only on the patient record (the comms module is the system of record, §3.1). Every row pins template version + rendered language + read state + reason code; accessible-format and attachment badges render where present. This is the staff-side mirror of the portal timeline (portal--prefs is the patient-facing view).
Patient portallater phase · NHS login identity · separate deployable
Default columns Branch · Items · Services · Errors · RP Status · Wait · Margin (§5.1). RP Status renders the live pill with [● GAP!] in Alert Red; Margin carries a daily data-age badge. Hover any number for its freshness class + computed_at + plain-English definition. Central ops is the same product under RBAC scope — every remote act stamps is_remote + the performing pharmacist (claims stay attributed to the originating branch).
Branch performance boardfull-page · region-grouped · league view available
Column picker active — pinned selectable columns: Scripts→Void · MDS Due · Owings @ Risk · Δ vs Region. Saved as your default view (rep_saved_view).
Rank
Branch
Region
Items
Wait P90
Scripts→Void
MDS Due
Owings @ Risk
Δ vs Region
1
Camden
Gtr London
243
9m
14d
2
£184
+18%
2
Stockport
North West
211
41m
5d
4
£392
+11%
3
Hackney
Gtr London
198
17m
1d
0
£77
−6%
4
Timperley
North West
184
6m
11d
3
£241
+4%
Ranked by Items within the caller's branchAccess. Δ vs Region = branch value − region average (§5.11). Selectable columns are off by default so the wireframed seven-column estate layout is unchanged; pin per-user via saved views.
items_dispensed — estate trendgrain: month · trailing 12 periods
Definition (v4, effective 1 Apr 2026): count of supply-event items reaching final state dispensed (excludes not-dispensed; includes owing balances when supplied). Window: calendar month. Freshness: live + daily reconcile. Source: disp_rpt_dispense_volumes.
▌ amber bar marks a definition-version change (annotated, never read as a real movement) · the faded bar is a missing reconciled period rendered as a gap. Period-over-period delta: ▲ 3.8% vs prior month.
Estate exception queuesdeep-links into the owning module · branch-scoped RBAC
Expiring scripts · Recalls overdue · MDS due are Designed surfaces — gated on the dispensing/compliance/patients exported views. Where a view is absent the tab renders "data unavailable" with the missing view named, never an empty queue read as "nothing at risk" (§10, H-RC-7/8).
Branch
Patient / item
Downloaded
Token ver.
Status
Stockport
J. Crawford · amoxicillin 500mg
3 Jun
R2 — not actioned
Stuck — dispense notification pending
Wilmslow
F. Adebayo · ramipril 5mg
1 Jun
R1 — awaiting clear
Stuck 13d
Camden
S. Bell · warfarin 3mg
30 May
R2 — error returned
Gateway reject — re-process
Seven mandated tabs (§5.9/§5.16, route ?type=stuck_eps|unclaimed_services|expired_owings|uncollected|mds_due|expiring_scripts|recall_overdue). Rows deep-link into the owning module — stuck/expiring EPS → dispensing EPS console; expired owings → owings; uncollected → dispensing queue; MDS due → MDS-production / resident record; recalls → compliance recall task. Patient-level rows render live under branch-scoped RBAC and are never persisted into rep_* (§2.3 inv 3).
Daily — TimperleySun 14 Jun · default landing for branch roles · saved layout
1 recall task past action deadline (Emerade 300mcg)
MDS due — Oakwood
28-day cycle · 4 days to deadline · 2 scripts outstanding
/reporting defaults to the session's active branch (§5.5). Every tile carries a sparkline + freshness class; the view honours the branch user's saved default layout (rep_saved_view). All numbers are read over exported views — no patient identifiers persist in rep_aggregate.
A central clinical check is not remote supervision. An RP is still required at each pharmacy, a technician cannot be RP, the statutory 2-hour absence limit stands, and remote supervision of pharmacy staff by the RP remains unlawful. "Central clinical check" and "Responsible Pharmacist" are distinct concepts (H-RC-6). View RP board
Risk tier
Branch
Patient · items
Flags
Age
High — senior
Stockport
J. Crawford · 3 items
interactionrenal flag
22m
Medium
Camden
S. Bell · warfarin · new med
new medicine
15m
Routine
Wilmslow
F. Adebayo · 1 item · repeat
9m
Local only
Sale
K. Lim · 5 items · Sch-2 CD line
CD — never routes cross-entity
11m
Claiming calls DispensingQueueApi.claimClinicalCheck(prescriptionId, userId) — row-level locking in dispensing (no double-assignment, H-RC-3) — and opens the dispensing split-panel check with its own B0068 / CIS2 gates unchanged. Checker identity + is_remote=true are recorded on the check record; the prescription advances to accuracy check + handout at the originating branch. Stage routing is config (SM-9); Sch 1–3 CDs never route cross-entity (HS-4).
rp_absence_limitSaleAbsence budget ≤ 30m remaining (92 of 120m used)
claim_deadline_riskTimperley6 NMS consultations unclaimed · 5 days to MYS deadline · £312
mds_cycle_dueOakwood / Timperley28-day cycle 4 days out · 2 scripts outstanding · Designed
Acknowledged
recall_overdueAltrinchamEmerade 300mcg recall task overdue · ack by M. Osei 10:51 (is_remote)
Seeded system rules: rp_gap · rp_absence_limit (compliance computes the absence budget; reporting renders + escalates) · claim_deadline_risk · pf_threshold_risk · pf_cap_risk · mds_cycle_due · script_expiry_risk · recall_overdue · compliance_return_due · eps_dlq · plus aggregate_job_failed / freshness_violation meta-alerts. Critical alerts re-notify on an escalation timer. A safety check that cannot run is reported as evaluation_failed — never as "no breach" (AD-10 fail-closed). The estate Alerts tile clicks through here.
MDS production runwayhome → wing → cycle · care-home operations (D-CC2) Designed · daily · age 5h
Read-only over the dispensing/patients MDS exported views (disp_rpt_mds_cycles + pat_rpt_mds_schedule). When those views are absent or stale this board renders "MDS data unavailable" — never an empty board read as "no cycles due" (a missed MAR cycle is a medication-continuity hazard, H-RC-7).
Oakwood Care Home · Timperley branch
Elm Wing · 28-day cycleDue — 4 days18 residents · produce by 18 Jun2 scripts outstanding
Oak Wing · 28-day cycleDue — 9 days12 residents · produce by 23 Junall scripts received
Beechcroft Lodge · Altrincham branch
Ground floor · 7-day cycleOverdue — deadline passed9 residents · was due 13 Jun · not yet produced1 script outstanding
Countdown reflects each home's actual cadence (28/14/7-day, dose-round timing from the patients cycle config) — never a fixed estate cycle. Scripts-outstanding is the mds_scripts_due blocker: a cycle cannot be dispensed until all repeats are received. Rows deep-link into dispensing's MDS-production screen (produce) and the resident record (chase a missing repeat). mds_cycle_due alert: warning inside the runway, critical at the deadline. No resident identifiers persist in rep_aggregate — the outstanding-script list renders live under branch-scoped RBAC.
Remote NMS — central opscross-branch queue · estate scope · live audio/video
This surface is owned by clinical-services and composed here by route (§5.2)./central-ops/nms is a navigation entry only — reporting holds no NMS state. The queue and the active-consultation panel are /clinical/nms/remote (clin--nms-remote); claiming an episode calls clinicalServices.worklists.assignNms(episodeId, userId) directly. The centralops.nms_queue permission gates this entry; queue + claim enforcement is clinical-services'.
A remotely-delivered NMS records the remote performer's identity with is_remote=true, while the claim stays with the originating branch (EP-7 / §5.2). Assigning locks the episode to one performer (a second concurrent claim is rejected with the conflict message — H-RC-3). The scope switcher (All branches / My assigned) and Due/Overdue grouping mirror the clinical-services queue; this entry contributes navigation + estate KPIs only and persists no patient identifiers in rep_aggregate. The remote NMS queue exposes no reporting endpoints — it reads GET /api/clinical/worklists/nms-remote directly.
RP status board — estatelive · 60s re-poll of rpStatus.current · highest-value live surface3 gaps2 absence low
A branch inside trading hours with no active Responsible Pharmacist cannot lawfully trade prescriptions. Compliance owns the RP log + the statutory 2-hour aggregate absence-budget computation; reporting renders gap state live and escalates — it never recomputes absence durations.
Branch
Responsible Pharmacist
GPhC
Signed in since
Absence budget
State
Timperley
Aisha Khan
2069XXX
08:46
120m
● Active
Stockport
— none signed in
—
—
—
● GAP! — trading without RP
Sale
James Roy
2104XXX
08:30
28m left · 92m used
● Absence budget low
Hackney
unknown — last known: Active at 10:48
2233XXX
—
unknown
● Unknown — re-poll failed (data > 5m old)
Camden
Priya Shah
2188XXX
09:02
120m
● Active
A stably signed-in RP produces no events, so event absence is never read as staleness — the projector re-polls rpStatus.current(branchId) every 60s. A cell whose last successful re-poll or event is > 5 min old flips to "unknown — last known: state at HH:MM" (shown only with its visible data age, never presented as current) and fires a freshness_violation meta-alert (H-RC-1). rp_gap raises a critical alert within 60s; amber when compliance's absenceBudgetRemainingMins ≤ 30 (90 of 120m used).
Report librarygrouped by category · seed pre-built catalogue v7 · system + custom catalogue_version 7
LibraryScheduledExports & approvalsKPI targets
The library ships a seed pre-built catalogue (is_system=true) so the estate has useful reports on day one — grouped by category (§5.17). A system entry can be cloned into a private/role definition but never deleted (mirrors seeded alert rules). Every definition references only registered KPI codes + exported *_rpt_* views — validated at save (§10); a definition pinning an unregistered code or a non-_rpt_ table is rejected.
Dispensing
Dispensing volume by branch systemitems_dispensed · disp_rpt_dispense_volumes · estatedaily 07:00 · ran today ✓
NMS quarterly (activity summary) systemnms_cap_utilisation · clin_rpt_service_volumes · per quarter × branchquarterly · ran 1 Apr
PPV-readiness scorecard systemDesignedevidence-completeness · clin_rpt_service_evidence · gated on the exported view (D-CC4)data unavailable — view not yet published
Compliance
CD compliance pack systemcomp_rpt_cd_compliance · per branchweekly Mon · ran Mon ✓
Financial
Claims vs paid variance systemclaim_rpt_claim_status · estatemonthly · ran 25 May
MDS cycle & production runway systemDesigneddisp_rpt_mds_cycles + pat_rpt_mds_schedule (D-CC2)data unavailable
Custom — user / role authored (is_system=false)
NW region — Saturday waiter audit custom · A. Khancloned from "Queue-age & waiter percentiles" · visibility: roleweekly Sat
Stockport owings deep-dive custom · T. Millscloned from system financial · visibility: privateon demand
System catalogue entries are content-versioned by catalogue_version so a report's columns/maths stay reproducible (same defensibility as KPI definition-versioning). Scheduled delivery runs over the platform mail transport — never the patient-facing comms module. Designed rows whose exported view is absent render an honest "data unavailable" rather than a fabricated zero.
Targets are effective-dated (PUT /api/reporting/targets) — a new value supersedes rather than overwrites, so a KPI tile's "vs target" is read against the target in force for that period, never the latest value retroactively. A target change emits reporting.target_changed (actor + before→after). The seeded alert rule nms_conversion < target reads the in-force row.
Staff directory — Timperley9 active · grouped by branch · nothing silently green (ST-2)2 restricted3 expiry worklist
2 pharmacists are not RP-clear right now. A current registration is not automatically RP-eligible — conditioned (ST-9), flagged (ST-10) and lapsed states fail-close RP-eligibility and competency gates. This board is the at-a-glance "who is restricted" surface; hover a non-green pill for the reason. Indemnity (ST-11) and onboarding/account state render alongside.
Pill vocabulary: registration verified / conditioned (ST-9, RP-restricted but current) / flagged (ST-10, ad-hoc re-verify) / expiring (60/30/7-day worklist) / overdue / lapsed; indemnity ok / expiring / expired (ST-11); onboarding invited / not-activated (read from identity's account state, ST-1 — staff renders, identity owns); employment type employed / locum / agency / bank; headshot per photo_blob_ref. A row is never a flat green "Active" — a lapsed/conditioned/flagged registration fails-close RP-eligibility and every hasCompetency() gate. DBS / right-to-work / emergency-contact detail is manager-scope only (§6); rows show a status flag, not certificate detail. Click a row → staff profile (registrations & checks tab).
ScriptIQ
Allied Pharmacies platform
Email
Password
Forgot password? · Activating a new account? Use the link in your invite email.
One login per day — bench re-entry uses your PIN. 5 failed attempts lock the account (audited).
Two-step verification
Enter the 6-digit code from your authenticator app.
Patient-identifiable content is blanked behind this overlay. ≤3 taps from lock to working screen. Tiles show staff with a live daily full-auth bootstrap at this branch — order is advisory (today's rota); a non-rostered bootstrapped operator is never barred.
AKAisha
Pharmacist · RP
Signed in here
TMTom
Technician · rostered
MOMaria
Dispenser · rostered
SBSara
Counter · not rostered today
Full credential login
Operator switch re-attributes the session (hard-cut audit) — it never re-bootstraps. PIN never satisfies fresh-auth or CIS2. "End my day here" is branch-scoped end-of-shift — distinct from "Log out everywhere".
End my day at Timperley
This is the branch-scoped end-of-shift teardown for Aisha Khan. It revokes your daily branch bootstrap:
What this does
Removes your lock-screen tile at Timperley
Invalidates your PIN-switch on this branch's enrolled devices
Revokes your per-operator device refresh chain
A stolen bench PC after close cannot PIN-switch into your account. Unattended bootstraps are also swept at day-roll.
Distinct from Log out everywhere (kills all your sessions estate-wide). Audited as identity.logged_out · scope: branch_day. RP sign-out is a separate compliance action.
TMTom Mills
enter PIN to take over this bench
PIN is re-entry only — never primary login, never fresh-auth, never CIS2. 5 failures lock the PIN. Offline switches queue with attribution.
NHS Care Identity (CIS2) step-up
Releasing prescriptions requires your NHS Care Identity. Choose an authenticator your CIS2 account supports:
Card reader not detected. Insert your smartcard or restart the NHS identity agent — or use a fallback below. agent-health: reader_present=false · last seen 09:48
Smartcard passcode is entered into the CIS2 client, never here. Session held server-side by nhs-gateway. Status bar: NHS: ● R8003 · 59m — click to view / re-up / end. AAL3 assumed (OQ-3).
NHS session Active
URPID
555086689106
Role profile
R8003 — Pharmacist
Organisation (ODS)
Allied Timperley — FLM49
Activity codes
B0068 · B0572 · B0401
Assurance (AAL)
AAL3
Expires
in 59 min · 11:42
Ending the NHS session clears gateway tokens and the chip returns to NHS: none — it never logs you out of ScriptIQ. No token material is shown (read from idm_cis2_sessions).
Offline view (cached claim). B0068 asserted from cached CIS2 claims — valid 19h (max-age 24h). Status bar: NHS: cached (offline) · B0068 valid 19h.
Purging immediately blocks further offline NHS-gated acts (e.g. the offline clinical check); re-up online to restore.
My profile & security
Profile
Name
GPhC number
Default branch
Display initials / colour
Security
Password
MFA — authenticator appEnrolled
Bench PINSet
CIS2 identity linkLinked — URPID ✓
Active sessionsthis bench + back office
Trusted devices "remember this device" — §6.7 OFF on shared bench PCs (default)
Trust suppresses only the routine-login second-factor prompt on an enrolled device, within a short TTL. It never substitutes for fresh-auth, the witness class or any CIS2 step-up (invariant 14). It is void on un-enrolled devices and on password reset.
Device
Class
Granted
Expires
From IP
Back office — Timperleyfp_11d9…
back-office
13 Jun 08:40
in 4d 6h
10.4.7.12
Aisha's laptopfp_a91c…
personal
09 Jun 19:02
in 1d 2h
82.14.x.x
Dispensary bench 1 — Timperleyfp_8c2a…
bench (shared)
Trust disabled for this device class (shared PC, OQ-11)
Revoke writes identity.device_trust_revoked (security-sensitive: shared-PC posture change). Listing/revoke also lives at /settings/security. Final per-class enablement is OQ-11 (CSO/DSPT sign-off).
Usersplatform identity — shared UUIDs with StockIQ
User
Role
Branch access
MFA
CIS2
Status
Aisha Khan
pharmacist
Timperley
✓
linked
Active
Tom Mills
technician_act
Timperley
✓
—
Active
R. Okonkwo
central_ops
42 branches
✓
linked
Active
P. Novak
locum
Timperley (Wed only)
✓
linked
Time-boxed
Branch access is rows (idm_branch_access) — individually granted, auditable, revocable, time-boxable. Deactivation never deletes (audit attribution survives).
P. Novak — locum Provisioning: invited
Invite sent 11 Jun 14:20 — single-use, 72 h TTL, expires 14 Jun 14:20. Unredeemed. The user has no usable credential yet; provisioning is the invite-link model (no out-of-band password).
Identity & provisioning lifecycle
Email
Display initials / colour
GPhC registration
Provisioning status (idm_user_profile.provisioning_status)
Re-invite mints a fresh single-use token and invalidates the prior one (idempotent, supersedes). Activation flips status → activated and consumes the token.
Roles (idm_user_roles — rows, not a column)
Role
Scope
Valid
locum
per-engagement branch
11 Jun → 18 Jun
dispenser
own branch
permanent
Branch access (rows)
Branch
Level
Valid
Timperley
standard
11 Jun → 18 Jun (engagement)
Security admin actions — all require fresh-auth, all audited with actor
Reset MFA
Clears enrolled authenticator; next sign-in re-enrols.
Reset bench PIN
Voids current PIN; user sets a new one on next bench use.
Force-logout
Revokes all sessions + refresh chains immediately.
Force-logout, MFA reset and PIN reset are fresh-auth admin actions; all grants and resets are audited with grantor/actor. Deactivation never deletes (audit attribution survives).
Roles & permissions12 system roles (undeletable) + custom bundles
config.* · users.manage · (no clinical permissions)
9
platform_admin
cross-tenant
config.* · never clinical data by default
2
Authorisation checks permission codes, never role names · clinical grants require a GPhC number and auto-suspend on registration lapse.
Workstations & sessions
DevicesActive sessions (estate)
Device
Branch
Key fingerprint
Last seen
Offline cache
Dispensary bench 1
Timperley
fp_8c2a…
now
fresh · 72h TTL
Back office
Timperley
fp_11d9…
09:55
minimal
Driver phone — S. Doyle
Timperley
fp_e773…
09:51 (offline)
route manifest only
Device key signs the offline session envelope (non-extractable, 06 §5.5) — revoke wipes the encrypted cache on next contact.
Active sessions (estate)live · idm_sessions + idm_refresh_tokens — revocation source of truth (invariant 7)
User
Role / scope
Branch
Device
IP
Started
Last activity
MFA
Aisha Khan
pharmacist · RP
Timperley
Dispensary bench 1 fp_8c2a…
10.4.7.10
08:55
now
✓
Aisha Khan
pharmacist
Timperley
Back office fp_11d9…
10.4.7.12
08:56
09:55
trusted-dev
Tom Mills
technician_act
Timperley
Dispensary bench 2 fp_4b07…
10.4.7.11
09:02
09:58
—
R. Okonkwo
central_ops · 42 branches
remote
Back-office laptop fp_9d2f…
82.14.x.x
07:40
09:54
✓
Sam Doyle
delivery_driver · driver-app
Timperley
Driver phone fp_e773…
offline
08:30
09:51 (offline)
—
P. Novak
locum · Wed only
Timperley
— no active session (invited, not activated) —
—
—
—
—
Per-row force-logout calls DELETE /auth/sessions/:id — a fresh-auth admin action; revocation is immediate (never waits for token expiry) and writes identity.session_force_logged_out (actor + target + reason). "Log out everywhere" for a single user revokes all their rows + refresh chains at once.
ScriptIQ
Activate your account
You've been invited
Name
Priya Nair
Branch
Allied Timperley
Role
dispenser MFA required
1 · Set your password
New password *
Confirm password *
≥12 characters, upper + lower + number + symbol
Not one of your last 5 passwords (idm_password_history)
2 · Set up two-step verification
Scan with your authenticator app (e.g. Microsoft Authenticator), then enter the 6-digit code.
Invite link is single-use, 72h TTL — this one expires 16 Jun 14:20. There is no out-of-band password: password and first-MFA are set together in this one flow. Token is consumed on activation (provisioning_status → activated).
Reset your password
Enter your account email. If it matches an account, we'll send a reset link.
Always the same generic confirmation — we never reveal whether an email is registered (no account enumeration). Reset link is single-use, ~30 min TTL, rate-limited per email + per IP. Lost your authenticator instead? Use a recovery code or ask an admin.
Matches a password used in the last 5 — choose a different one
Completing this reset signs you out everywhere — every session and refresh chain is revoked (theft-recovery). Your authenticator app is unchanged and will still challenge on next sign-in.
Reset token is single-use and consumed here; the set is written to idm_password_history. A failing password returns a typed error, never a generic 400.
Signing you in to Ordering (StockIQ)…
One ScriptIQ identity — no second login. Redeeming your secure one-time link.
URL carries only a one-time, ~60s, single-use code — the 15-min exchanged JWT is server-to-server and never enters a URL. On success the code is 303-stripped from the address bar. Show expired/replayed state
Link expired or already used
This one-time sign-in link can't be redeemed — it has expired (~60s) or was already consumed. For your security, replayed and expired codes are always rejected and audited.
Re-opening from the ScriptIQ sidebar mints a fresh one-time code. No credentials are ever placed in the URL, so an expired link leaks nothing.
Notification preferencestune noise, never safety Digest: hourly
Filtering and muting change what the bell shows you — they never silence patient-safety signals. The Safety band below is locked by statute (mute-fatigue guard, invariant 12).
Per-source routing
Source
Route
Min severity
Digest
Dispensing — owings/EPS
On
live
Stock & ordering
Muted
—
hourly
Finance — claims/owings
On
daily
Comms — failed sends
On
live
Staff & rota (bell only)
On
—
hourly
Routing writes idm_notification_prefs (mute by source · min-severity floor · digest cadence: live/hourly/daily). Central-ops can batch the estate stream without missing safety.
Safety band — locked
severity = safety. Cannot be muted, snoozed, digested or filtered out. Controls are absent by design.
Fridge / cold-chain excursion Always live
Drug recall task Always live
Safety-flagged bug acknowledgement Always live
A pref row may not lower the safety band — operators tune operational noise only. The same floor holds offline (a cached safety entry cannot be cleared either).
Owing settled — Susan Bell £9.90 (snoozed until 14:00)
Filter: only unreadhide informational
Safety entries show no dismiss/snooze controls. Filtering is a view operation — it never sets dismissed_at.
Preferencespresentation only — never permission or attribution Designed (pre-build)
These are presentation-only settings (idm_user_preferences, invariant 13). They carry no permission, branch-access or credential state — an offline edit is safe. Default-landing and pinned palette items are re-validated against your live entitlement on every read: if you may no longer see a saved target it silently degrades to the role default, never widening access.
Layout & density
SidebarExpandedCollapsed
DensityComfortableCompact
Theme (OQ-10 — dark gated on token package)SystemLightDark
Sidebar-collapsed + density persist per user and are shared across products (09 §4.7). Dark theme is OPEN QUESTION 10.
Default landing
Where the shell lands after login — per role, with a sensible role default.
Default landing route
Re-validated on every read. A pharmacist who loses a branch and whose saved landing pointed there degrades to the role default — a preference never widens access (invariant 13). This same resolution is "their home" used by operator-switch context handling (§5.4).
Pinned palette items — ordered command/cross-product ids promoted to the top of Ctrl+K
Dispensing queue Order stock cross-product Goods in cross-product Owings
Entries you can't see are dropped at resolve time. Pinning personalises the palette only — the global keyboard chord set itself is not per-user-rebindable in v1 (§5.11). See the keyboard-shortcut cheat-sheet.
Report a problemone tracker for the whole platform — routes to IssueIQ
What happened?
Product
Description *
Screenshot (optional)
Attach screenshot optional
Safety flag ON → this report bypasses normal triage SLA and lands in the safety queue. The acknowledgement notification cannot be muted, snoozed or dismissed (invariant 12).
Auto-attached context
Captured automatically — you don't fill these in.
Correlation id
7f3a-c21e-90ab
Product
pmr
Branch
Allied Timperley (FLM49)
Screen route
/dispensing/clinical-check/:rxId
App version / build
2026.06.3 · build 5f21a9
Viewport
1440 × 900
Reporter
Aisha Khan (pharmacist)
Recent errors
2 console warnings
Offline? The report queues locally (idm_bug_reports, status queued) and drains to IssueIQ on reconnect. The version string here is the same one shown in the About dialog.
Bug-report triagewithin-one-working-day triage · IssueIQ remains system of record 1 possible-safety3 untriaged
This is the local triage viewer over idm_bug_reports — classify each intake defect / request / possible_safety within one working day (§9.4), set status, and follow the issueiq_ref. It is not a parallel tracker; once forwarded, IssueIQ is the system of record.
AllUntriagedPossible safety (1)Resolved
Ref
Reported
Reporter / branch
Screen
Summary
Triage class
Status
IssueIQ
BR-1042
09:58
A. Khan · Timperley
/dispensing/clinical-check
Approve enabled with unresolved severe interaction
A possible_safety classification keeps the safety-band acknowledgement live until resolved. Triage writes triaged_by/triaged_at; the viewer is online-only (offline reports queue and surface on reconnect).
Keyboard shortcutsopens on ? or Ctrl+/
The overlay is the single source of truth — no shortcut exists that isn't discoverable here. It lists every global + module binding you are entitled to (resolved through /shell/shortcuts). Chords are not rebindable in v1 (consistency-for-locums beats personalisation — §5.11).
Global shell-reserved
Command palette / search
Ctrl+K
This shortcut overlay
? / Ctrl+/
Lock / switch operator
Ctrl+L
Branch switcher
Ctrl+B
Notification bell focus
Ctrl+J
Shell-reserved chords are immutable and win every collision.
Current module — Dispensing
Next actionable item
F2
Advance status
Ctrl+↵
Open clinical check
C
Paper intake
Ctrl+P
Focus scan field
/
Module bindings register via registerShortcut() — scoped to this module's routes.
Cross-product
Order stock (StockIQ)
Ctrl+Shift+O
Goods in (StockIQ)
Ctrl+Shift+G
Review cards (StockIQ)
Ctrl+Shift+R
Cross-product chords mint a one-time deep-link code on use (§3.1) — no second login.
Collision rules: a binding clashing with a shell-reserved chord is rejected; two modules registering the same global chord is a registration-time typed error (never silent last-wins). Per-user rebinding is a future candidate, not OQ-blocking.
Branch switcher — open statetop-bar overlay · opens on Ctrl+B Active: Timperley
Switching updates idm_sessions.branch_id and re-mints the access token — it never widens access: the target must already have an idm_branch_access row valid at now (invariant 5). One active branch per session.
All typesCommunityDistance/DACHospital outpatient
Pinned · recent & favourite
TimperleyFLM49 · Community Active
StockportFE428 · Community favourite
SaleFA518 · Community recent
Greater Manchester (region)
AltrinchamFH210 · Community
WythenshaweFK883 · Distance/DAC
Cheshire East (region)
WilmslowFN104 · Community
All branches (reporting view)does not switch session
Lists only the user's current idm_branch_access branches; grouped by region, with pinned recent/favourite at the top (idm_user_preferences, §5.9). The "All branches (reporting view)" entry is a destination, not a session state — estate-wide roles (area_manager / central_ops / superintendent) route to the cross-branch reporting surface while the operational session stays single-branch (§5.9).
admin-config owns the editor + permission gate + change audit; the identity registry owns the data and validates ranges owner-side (BranchApi.updateConfig). A high-impact edit (session policy) carries a mandatory reason.
ExceptionMon 25 Aug — Summer bank holiday · Closed
ExceptionWed 16 Jul — Stocktake · open 08:30–11:00 only
Registry validates non-overlapping sessions + open < close owner-side (AC-7) · a closure exception drops that day from the rp_coverage/branches_open trading-minute denominator — this block is load-bearing for reporting and the KPIs are unbuildable without it.
EPS & Spine polling — pmr_config.eps
EPS enabled
In-hours poll cadence
Out-of-hours poll cadence
Long-poll
Per-branch polling cadence previously had no home — now written here. branch_manager / central_ops permission. EPS release AAL pinned in CIS2 admin, not here.
NHS integration — read-mostly (OQ-A3)renewal due
Layer
State
ODS confirmation
FA512 · confirmed 11 Feb 2026
CIS2 / Smartcard reader
Active
HSCN/Spine TLS-MA cert
serial 7A:2C:91 · expires 14 Aug 2026 · 61d — renewal due
EPS service assurance
Assured
MYS service assurance
Assured
NHS Notify assurance
Pending — Notify onboarding
Display + renewal-due alert only — admin-config holds no certificate material and performs no rotation (AC-16). Cert rotation is platform-ops-executed; write owner settled at OQ-A3.
Branch identity is the shared platform UUID (same as StockIQ) · status ≠ active blocks new dispensing · every block above is written via BranchApi.updateConfig and audited with actor + before/after + reason.
CD guard: Schedule 1–3 lines never route to a cross-entity hub (HS-4) — enforced in the rules engine, not policy text. Hub routing requires an active written arrangement (registry in compliance).
Feature flagsplatform_adminper-tenant/per-branch allow-lists — every risky feature ships dark
A flag that resolves to no row reads its default_state — never default-on for a risky/clinical flag (INV-F1, §10). Owner-side validation enforces requires_flags (INV-F2) and conflicts_with (INV-F3) regardless of the admin caller.
Flag flips are audited config changes (actor + before/after + reason) · clinical-gating flips additionally require CSO sign-off in the reason · high-impact flips route through change-control (§2.6a); is_kill_switch flips bypass it by design (§6) · the branch-migration runbook flips pmr_type + draw-down source as one step (SQ-9/DD-2).
Edit flag — ai.accuracy_visionclinical-gating
Clinical-gating flag — saving requires CSO sign-off recorded in the change reason (§6); the change routes through change-control (second approver, INV-C2) before it applies.
Identity & accountability
Flag key
Description
Owner (accountable)
Scope
State & fail-safe
State
default_state (fail-safe — INV-F1)
is_kill_switch
A clinical/risky flag may never default to on — a no-row read fails safe to off (INV-F1).
Dependencies & conflicts
requires_flags (INV-F2 — may only be on if every named flag is on)
ai.platform_enabled
conflicts_with (INV-F3 — at most one of the set on per scope key)
none
DD-1 expressibility:pmr.dispense_drawdown and proscript.drawdown name each other in conflicts_with — the registry cannot leave a branch with two draw-down writers (double-deduct is unrepresentable, AC-11). Ordering-stockiq's ledger writer rejects + alarms independently (defence in depth).
Allow-lists (pilot scope)
tenant_allowlist
Allied Pharmacies
branch_allowlist
Timperley
CSO sign-off (clinical-gating)
Change reason
Every flag change is an audited config event · INV-F1/F2/F3 validation runs owner-side · effective-dated · clinical-gating flags own to the CSO and route through the change-control rail.
Never silently dropped: retry with backoff, dead-letter at 24h with operator alarm · drain order is per-prescription causal (DN before claim) · signing key lives in Key Vault, sign-via-API only.
Integration relay — StockIQ event spineHealthy · lag 1.2s
Every ref_* table is a non-authoritative projection with provenance + staleness columns · CDS dataset activation is a device-change control (effective-dated, audited, emits cds.dataset_activated).
SLOs & platform healthJune · error budgets
Availability (core)99.97%target 99.9 · budget 64% left
Queue board p95340mstarget ≤500ms
EPS release p956.1sprovisional ≤10s (PERF-7)
DB pool headroom38%SCAL-1 ≥30% ✓
Deployables
pmr-core3 replicasHealthy
nhs-gateway2Healthy
integration-relay2Healthy
scheduler1Healthy
web / driver-appCDNHealthy
Backups & DR
PITR backups5-min RPO ✓
Geo-redundant backupON (DUR-4)
Last restore drill18 May — verified env, de-identified ✓
Offline soak test (G1.4)passed 02 Jun
Assurance boardthe external critical path — supplier hat
Import contract: demographics + active eRD/owings + CD register continuity (opening balances RP-attested) · cutover flips pmr_type + draw-down source as one runbook step (SQ-9/DD-2) · checksum report gates go-live.
Platform admin — tenants & productsplatform_admin only — cross-tenant
Two-level admin (§2.4): platform-super-admin over the estate vs company-superintendent within a tenant. The tenant record + branch-lifecycle states are platform-identity-resident — this is the operating surface (TenantApi), not a tenant table here. A product toggle is the commercial entitlement; a feature flag (admin--flags) is the operational rollout within an entitled product.
Entitlement → flag dependency (AC-15, mirrors INV-F2): a feature flag for a product whose tenant entitlement is offcannot be switched on — owner-side check. e.g. ai.accuracy_vision may only go pilot/on while ai_assist entitlement is pilot/on; switching ai_assist back to off forces its dependent flags off too.
Service API keys (per-tenant)4 active · rate limits ok
Tenant — Pennine Care Pharmacyonboardingplatform_admin
Onboarding wizard over platform-identity-resident records (§2.4): onboarding tenant → first branch provisioning → product toggles → go-live. The records stay platform-identity-resident; this surface is the operating wizard. The migrating→live branch transition is the moment the DD-2 draw-down switch flips — lifecycle state + draw-down source stay consistent owner-side.
Company / tenant record — platform-identity-owned, surfaced here
Company name *
tenant_status
Superintendent (company super-admin)
Head-office ODS
Billing ref
Contract start → end
Onboarding flow
1 · Tenant provisioned — record + superintendent createddone
2 · First branch provisioning — Stalybridge (lifecycle provisioning)in progress
3 · Product toggles — set entitlements (pilot first)pending
4 · Go-live — branch migrating → live (DD-2 flip)pending
Branch lifecycle states
Branch
State
Draw-down source
Stalybridge
provisioning
— (not yet dispensing)
Mossley Road
migratingProScript coexistence
ProScript (until live)
Hyde Central
live
ScriptIQ (flipped at go-live)
provisioning → migrating → live → suspended → decommissioned · the migrating→live transition flips pmr_type + draw-down source as one runbook step (kept consistent owner-side, §2.2 / DD-2).
Every tenant/product/lifecycle change is an audited TenantApi action (actor + before/after + reason) · the underlying records remain platform-identity-resident — this is the §1.1 operating surface, not a tenant table.
AI services consoleadvisory-only · fail-closed (AD-10)
Delegation marker — StockIQ's live AI estate (deep-link). Never duplicated here (single-source-of-truth).
F5/F7 share the deterministic token-equivalence validator (any number/unit/drug/frequency/dose-round token added, dropped or substituted outside the versioned CSO-approved table ⇒ validator_rejected, §10) · F7 also never sets/invents a dose, timing, dose-round or PRN limit — the dispensing MAR-chart engine remains the source of the schedule and prints the deterministic-direction chart unchanged when F7 is off/down. Every call (and refusal) is logged with the post-redaction payload as sent — images included (F1 label-mask OCR) · no AI result ever gates a dispensing transition (AD-10).
Model + prompt registryplatform_adminai_model_registry · ai_prompt_registry
Re-pin / activate is gated (AC-7 + §9.6): a clinical feature (F1–F5, F7) version may serve only when (a) an offline EVAL-GATE run against that exact prompt-version × model-id × sampling triple is on record and meets the feature's thresholds, and (b) cso_signoff = true with a link to hazard-log / DPIA / SaMD. Both required. Re-pin re-triggers the eval gate. First live exposure is shadow/canary on an allow-listed cohort.
Per-feature model pins — ai_model_registry · one active row per feature
Feature
model_id
max_tokens
timeout
temperature
top_p
seed
F1 accuracy vision
claude-opus-4-8
1024
8 s
0 — forced
1.0
42
F4 interaction-explain
claude-haiku-4-5
512
6 s
0 — forced
1.0
42
F5 directions phrasing
claude-haiku-4-5
256
5 s
0 — forced
1.0
42
F7 MAR/eMAR text
claude-haiku-4-5
256
5 s
0 — forced
1.0
42
F2 clinical-note draft
claude-sonnet-4-5
1500
12 s
0.3 — CSO-set (warm)
0.95
—
F3 patient summary
claude-sonnet-4-5
1200
12 s
0.3 — CSO-set (warm)
0.95
—
temperature = 0 forced for F1/F4/F5/F7 (INV / AC-13, H-AI-11): the registry write rejects any deterministic-adjacent feature row with temperature > 0 — a warm clinical-adjacent feature would make an eval "pass" non-reproducible. F2/F3 free-prose drafts may run warmer (CSO-set per §9.6). Sampling params are copied onto every ai_request_log row so a logged response is reproducible.
Activation rejected at the API until eval-pass andcso_signoff=true with the eval-run ref recorded — the run id + gold-set version + metrics surface in the activation audit event.
Changing any model/sampling/prompt is an audited admin action that re-triggers the §9.6 eval gate · the prior version is retained for reproduction · model deprecation by the vendor alarms (H-AI-8) · usage metering (per tenant×feature×day, est_cost, budget_state) lives on the AI console KPIs.
Care homes, wings & dose roundsD-CC2 · auditedconfig surface — writes via HomesApi.setConfig
admin-config is the config surface, permission gate and change audit only — the resident/wing/dose-round/MAR data and invariants live in patients (pat_care_homes); writes go through HomesApi.setConfig. The clinical roster + covert/crush flags live on the patients care-home screen.
Care home
Type
Serving branch
Wings
Residents
MDS cycle
Round day
eMAR
Status
Oakwood Care HomeCQC 1-2345678
Nursing
Timperley
2
12
28-day
Tuesday
Camascope
Active
Riverside LodgeCQC 1-9981234
Residential
Timperley
1
8
28-day
Thursday
None
Active
Elm CourtCQC 1-4420071
Nursing
Sale
3
21
7-day
Monday
PCS
Onboarding
Per-home config changes emit pat.care_home_resident_changed via the owning API — dispensing re-plans MDS + regenerates MAR annotations, delivery re-plans per-wing rounds (AC-6). Wing must be one of the home's defined wings; a dose-round time edit re-anchors the cycle owner-side.
Oakwood Care Home — configNursingserving branch: Timperley
Home record
Home name
CQC location ID
Status
Linked branch
GP practice
Nurse-in-charge contact
Wings & dose-round times — round schedule per wing (G3)
Wing
Residents
Dose-round times
Yellow Week
6
Blue Week Blister
6
Dose-round times drive MAR-round generation, picking output, and delivery per-wing round planning · changing a round time re-anchors the wing's cycle owner-side.
Connection state Connected · sharing consent on file
admin-config exposes the per-home enablement toggle only; the connector + its invariants are owned downstream (dispensing/integration). care_home_emar_sharing consent gates the feed (Designed; Planned until the partner connector ships).
MAR / MDS production parametersD-CC2 · auditedwrites via MarConfigApi.set
admin-config gates the surface; the MAR-chart output config + MDS production rules live in dispensing, per-home MAR defaults in patients. An invalid cycle/blister combination is rejected owner-side regardless of the admin caller (AC-6).
Estate production defaults
Cycle length
Blister / MDS format
Multi-week sheet
Print options
Picking list
Per-home MAR defaults
Home
Cycle
Format
Oakwood
28-day
4-division
Valid
Riverside Lodge
28-day
4-division
Valid
Elm Court
7-day
7-division weekly
Valid
Per-home defaults override the estate default · routes to the mar printer purpose (admin--printers default/fallback).
Invalid combination rejected (owner-side, AC-6): a 7-day cycle with a 4-division (7-day × QDS) blister is incoherent — the blister holds only one week of QDS doses, so a 7-day production cycle would under-fill. dispensing's MarConfigApi.set rejects this combination regardless of the admin-config caller; the surface cannot force it through.
No adm_ table for MAR data — config surface only · every parameter change is an audited config event · cycle/blister coherence + MDS production invariants enforced in dispensing/patients.
Patient-comms config — estatesuperintendentauditedwrites via CommsConfigApi.set
I-7 (owner-side, AC-9): a finance setting can never silently switch off transactional patient-care messaging — transactional classes alert-and-continue and are never hard-capped; only campaign classes hard-stop. This invariant is enforced in comms regardless of the admin-config caller.
Templates reference a sender_identity — never inline branding · an un-onboarded sender blocks £0 silent sends · contact-freshness max-age (PDS staleness for isContactable): 180 days.
Estate-level surface only — comms-patient owns the data + the I-7 invariant; this defers to CommsConfigApi.set and the comms budget_changed audit. Estate/region targeting via branch groups (§2.6b). No comms_budget row written directly here.
Statutory change-control evidence — reconstructs who flipped what flag / routing / policy, when, and why over any period (AC-5). Read-only projection of the platform audit_log; export is itself an audited disclosure.
Date range
Change type
Scope
Timestamp
Actor / role
Scope
Change
Before → After
Reason
14 Jun 09:42
R. Okonkwo · platform_admin
branch: Timperley
flag ai.accuracy_vision
off → pilot
CSO sign-off A. Sharief — F1 pilot
13 Jun 16:08
L. Faulkner · superintendent
estate
comms budget — marketing
£400 → £500
summer campaign uplift
13 Jun 11:20
A. Khan · branch_manager
branch: Timperley
opening hours — Wed exception
open → 08:30–11:00 (stocktake)
half-day stocktake 16 Jul
12 Jun 14:55
R. Okonkwo · platform_admin
estate
flag pmr.dispense_drawdown
off → on (Altrincham)
wave-2 cutover SQ-9
11 Jun 08:30
L. Faulkner · superintendent
estate
session policy — bench idle-lock
15 → 10 min
shared-PC security tightening
10 Jun 17:12
system · scheduler
branch: Sale
stage routing — clinical check
branch-only → branch or remote
central-ops cover rota
Every config mutation carries actor + scope + before/after + reason + correlation id · rows are never deleted · stage-routing & auth-adjacent changes feed the DCB0129 change-control evidence the CSO consumes · the change-control rail (admin--config-changes) is itself the DCB0129 change-record for high-impact changes.
High-impact changes (stage routing, clinical-gating flags, comms budgets, retention edits) route through this rail before they apply. The record governs when/whether; the owning module still validates what's valid at the applied transition (HS-4 / I-7 not bypassable). Second approver must differ from the author (INV-C2).
Pending review
pending_reviewStage routing — Sale: accuracy check → branch or remoteauthored R. Okonkwo · awaiting second approverhigh-impact
Append-only lifecycle · prior_value captured at draft = the immutable rollback baseline (INV-C1); a roll-back is a forward change through the owning-module API, not a raw restore · low-impact changes (e.g. a printer default) may apply immediately where the role permits.
Second-approver gate (INV-C2): this change was authored by L. Faulkner — the approver must be a different superintendent / platform_admin. You are signed in as R. Okonkwo (platform_admin) ✓ eligible to approve.
Owner-side guard still runs at apply: marketing is a campaign class so a hard budget is permitted; a transactional class can never be hard-capped (I-7).
Schedule effective_at (blank = immediate on approve)
The actual mutation goes through CommsConfigApi.set at the applied/effective_at transition · approve/schedule/apply/rollback are all audited (correlation id ties to the audit_log) · a rolled_back transition re-applies the captured prior_value through the same API (INV-C1).
Lengthen-never-shorten (INV-R1, AC-12): the statutory floors are authoritative in 05-data-model §4 — this surface reads them and lets min_retention be set at or above the floor, never below (rejected owner-side). This is a high-impact change class — edits route through change-control (§2.6a). The surface holds the policy; platform-ops holds the deletion mechanism — archive ≠ delete, legal-hold respected.
MDR 2001 (CD reg 2 y running) · disclosure-audit 8 y
8 y
y = floor
partition lifecycle
RC-OPSoperational rollups
ai_usage_daily, rep rollups
no statutory floor — operational
—
y
nightly
Below-floor edit rejected (owner-side, INV-R1): setting RC-REG min_retention = 1 y (below the 2 y HMR floor) is rejected — the field clamps to the floor and the save fails with the statutory citation. The edit can only lengthen; it never itself deletes anything.
Editing a class is an audited config event (actor + before/after + reason) · the class set + floors live in 05-data-model §4 (this reads them) · the governed §4.1 deletion process stays platform-ops-executed with legal-hold respected (OQ-A4: if ownership moves, this becomes a deep-link + audit view).
Branch groups & config-push targetingsuperintendentadm_branch_groups · selectors, not writers
A branch group is a selector (region / ops-cohort / pilot-ring), not a config table — a push expands the group to its member branches and applies the change per-branch through the owning-module API, so per-branch audit + per-branch owner-side validation are preserved (AC-14). Staged rollout = the same change scheduled against successive groups with distinct effective_at.
Groups
Group
Kind
Members
Pilot ring
pilot_ring
Timperley + 11
Region — North West
region
142
Care-home cohort
ops_cohort
38 MDS-heavy
Wave-2 cutover
ops_cohort
18
Membership editor — Pilot ring
Timperley Altrincham Sale Wilmslow Stockport Hyde +6 more
Add branch
Group kind
Push targeting — apply a change to a group
Change to push
Target group
effective_at (staged rollout)
Expands to 12 per-branch changes → each via the owning-module API → 12 audit events
High-impact pushes carry the second-approver gate (INV-C2) · staged rollout: schedule pilot_ring → region:north → estate with distinct effective_at · feature-flag pilot + its branch_allowlist compose with group targeting (§2.6b). No group-level config row is written.
Delivery policiessuperintendent · effective-datedwrites via PolicyApi.set (delivery owns del_policies)
admin-config is the config surface + permission gate + change audit; the policy data + invariants live in delivery (del_policies, effective-dated, audited). Attempt caps and the per-class evidence ladder are tenant/branch policy — the driver PoD flow enforces the ladder for the stop's highest item class owner-side (SM-D4).
Attempt cap & reattempt
Attempt cap (then return)
Reattempt window
Round-generation lead (round_lead_days)
Empty-round dates still advance
Every attempt is an append-only del_attempts row — never overwritten (SM-D7).
Cross-cutting handover floors
Safe-place allowed
Force cold-chain temp-OK attestation
Same-day-return classes
Per-class evidence ladder — §2.3, rendered dynamically per stop's highest item class
Item class
Recipient + GPS
Signature
Photo
ID-check
Cold-chain block
Age-proof rung
Standard
✓ always
optional
optional
not required
—
—
Fridge
✓
required
optional
not required
container-id + temp_ok_at_handover
—
Controlled drug (Sch 2/3)
✓
required
required
checked_ok (collector / HCP block)
—
—
Age-restricted
✓
optional
optional
not required
—
age_proof_attestation (verified / refused)
way_of_completion is constrained to the recipient type + ladder (e.g. left_safe_place/through_letterbox never valid for CD/fridge) · concentration thresholds (SM-D17 misuse detection: address_concentration_count, cd_concentration_count) are central-ops tunable here too · all blobs in Blob Storage, never data-URLs.
Operational thresholds — tunable vs statutory-fixed§2.7 · audited
admin-config does not silently let an operator shorten a statutory window (AC-17): tunable lead-times are editable here (written via the owning module's config API); statutory-fixed windows render read-only with their legal basis so an operator can't mistakenly try to edit a legal window.
EPS/Tariff-driven — the chase cadence above is tunable, this is not
read-only
The editor labels each window: only the genuinely operational lead-times are editable; the statutory ones surface their citation so they cannot be edited by mistake (§2.7, AC-17).
AI usage & meteringplatform_admin / superintendentGET /api/ai/usage · ai_usage_daily
Per tenant×feature×day metering rebuilt nightly from ai_request_log. est_cost prices cache-read, cache-write and uncached input at their distinct vendor rates (§8.5) — so caps reflect what was billed, not an uncached over-estimate. Budget enforcement reads the gateway's same-day running counter; this rollup is the reconciliation evidence (a mismatch alarms, AC-6).
Tenant
Feature
From
To
Tokens in (MTD)4.18Mcached 2.71M · 65% hit
Tokens out (MTD)0.62M
est_cost MTD (billed)£41.20cap £150 · budget_state ok
Cache saving£18.40vs uncached-only estimate
Date
Feature
Requests
tokens_in
cached_in
cache_write
cache-hit
tokens_out
est_cost
budget_state
14 Jun
F2 note draft
122
284,100
198,870
4,210
70%
61,200
£3.81
ok
14 Jun
F4 interaction-explain
54
41,040
30,780
1,100
75%
9,720
£0.52
ok
14 Jun
F5 directions
54
27,540
22,030
820
80%
5,940
£0.31
ok
14 Jun
F1 accuracy vision
38
389,120
0
0
n/a (image)
11,400
£2.14
ok
13 Jun
F2 note draft
118
274,260
189,440
3,980
69%
59,400
£3.69
ok
13 Jun
F4 interaction-explain
49
37,240
27,930
980
75%
8,820
£0.47
ok
12 Jun
F2 note draft
131
304,830
210,300
4,400
69%
65,500
£4.07
80% threshold
tokens_in is the full input count and cached_tokens_in ≤ tokens_in · F1 is image-input (no prompt-cache hit) · per-tenant cost attribution + caps reflect the billed cache model (§8.5, AC-6) · the cache-hit ratio surfaces here so the §8.5 saving is visible.
AI request logplatform_adminai_request_log · monthly-partitioned
A row exists for every invocation — including ones that never left the building. The fail-closed audit trail is itself the evidence. Each row stores the post-redaction payload exactly as sent (§8.2.4) so the redaction guarantee is independently inspectable per request (AC-3 tests it continuously).
Full status enum: completed · unavailable_no_key · unavailable_flag_off · unavailable_patient_excluded · unavailable_timeout · unavailable_budget · unavailable_rate_limited · refused_by_model · validator_rejected · grounding_dropped · redaction_blocked · error · sampling params (temp/top_p/seed) are copied onto every row so a logged response is reproducible · retained RC-AUD.
Request — req_5582104 · F1 accuracy visioncompletedplatform_adminGET /api/ai/requests/:id
Post-redaction payload — exactly as sent — ai_request_log.request_payload
F1 image: the redacted image actually sent — patient/bag label cropped out (capture rule §8.2.6a), residual OCR mask applied; the patient name/address region is blurred. The stored evidence is this redacted image.
Response was findings-to-display only — no pass/fail field (AiResult shape, AD-10). The human accuracy check proceeded identically; its outcome is recorded by dispensing on ai_accuracy_findings (not a transition guard).
Status enum — what each terminal reason means
redaction_blocked residual identifier found post-redaction — blocked, logged, alarmed (never sent best-effort)
unavailable_patient_excluded patient AI-objection — fail-closed before redaction (§9.4a)
validator_rejected output added/changed a token outside the equivalence table (F5/F7)
No F1–F5 flag turns on for a real branch until its hazard assessment is in the hazard log and the CSO has signed the release (§9.2). This panel is the per-clinical-flag gate evidence — hazard-log id + DPIA + SaMD determination — plus availability/health and the draft-acceptance KPIs the hazard reviews consume.
Per-clinical-flag gate evidence
Feature / flag
Hazard-log id
DPIA
SaMD device-boundary
Privacy-notice
Flag-on ready
F1 accuracy vision
H-AI-2 / H-AI-3
signed
OQ-4 — closest to boundary (in/out pending)
updated
pilot only
F4 interaction-explain
H-AI-5
signed
OQ-4 — attaches to cds device output
updated
on
F5 directions
H-AI-6
signed
admin/record-keeping rationale
updated
on
F7 MAR/eMAR
H-AI-9
draft
OQ-4 — most-exposed of F2/F3/F5/F7
pending
blocked — eval + CSO + DPIA
F3 patient summary
H-AI-4
OQ-2 free-text
rationale pending
pending
blocked — structured-fields-only until OQ-2/8
Availability / health — unavailable breakdown (today)
A draft never auto-transitions to accepted — mandatory edit-review (no one-click accept from a collapsed card) · high reject-rate or rising edit-distance re-gates the prompt/model at the next CSCR review (H-AI-4) · accepted content lives on in the owning module's record, never only in ai_drafts.
PINCER prescribing-safety indicatorsUKCA Class I device boundaryref_cds_pincer_indicators · cds.listIndicators()
Rules here, workflow there (D-CC3 / CDS-AC-8): cds owns the versioned indicator definitions + the deterministic evaluation (cds.evaluateIndicators() writes append-only cds_indicator_evaluations rows). The audit run, worklist and intervention record are clinical-services' (clin--pincer) — cds opens no case and records no outcome.
Indicator set versionpincer v62026 PRIMIS/PINCER release
Dataset health●healthy · stale after 25 Aug
Indicators active13
Evaluations (30d)9,412flagged 188
Indicator list — ref_cds_pincer_indicators (criterion logic keyed off dm+d / SNOMED)
Code
Title
At-risk criterion
Severity
Flagged (30d)
PINCER-A
NSAID without gastroprotection in peptic-ulcer history
NSAID + ulcer Hx, no PPI co-prescription
high
41
PINCER-B
NSAID in heart failure
NSAID + HF diagnosis
high
22
PINCER-C
Antiplatelet + anticoagulant without gastroprotection
naproxen 500mg + peptic-ulcer Hx (SNOMED 13200003), no PPI · run_ref ps-0612
ie_44119
PINCER-G
Susan Bell (72)
09 Jun 10:42
pincer v6
not flagged
U&E recorded 02 May 2026 (within 15m)
ie_43880
PINCER-A
John Okafor (61)
08 Jun 14:10
pincer v6
not flagged
no NSAID active
Append-only, deterministic: same patient inputs + pinned ref_cds_pincer_indicators version ⇒ same flagged set (CDS-AC-8) · no workflow/outcome columns here — the intervention record lives in clinical-services · activating a new indicator-set version is a platform_admin device-change (audited, on ops--cds).
Designed (status-bar surface): the shell status bar carries a CDS dataset-staleness chip mirroring the NHS-session chip — green when the cached dataset slice is fresh, amber when stale beyond the configurable threshold (never a silent pass). This page documents the chip states + wiring; the live chip renders in the shell status bar across every screen.
Status-bar chip states — mirrors the NHS-session chip pattern (§5/§7)
CDS datasets fresh · 2026.05
Fresh — all 8 ref_cds_* slices within the freshness threshold; informational only.
CDS dataset 9d old — verify
Stale (amber) — cached slice older than the configurable threshold; screening still runs but raises the amber "screened against vX as of T — verify" acknowledgement (offline, §7/§10).
CDS unavailable — slice missing
Unavailable (red) — a required slice (esp. ref_cds_severity_map) absent; screening fails closed and dispensing blocks clinical-check approval (CDS-AC-2/11).
Wiring
Chip reads cds.datasetStatus() (dataset · version · loadedAt · staleAfter · healthy) — same source as the ops--cds console
Staleness threshold is the configurable age — operator-tunable (config_cache_max_age / dataset age)
Stale beyond threshold also raises a cds.unavailable-class staleness alarm to ops (never a silent pass — §10)
Click-through opens the CDS dataset console for the version/health detail
The chip is a presentation surface only — it never changes the fail-closed gate (dispensing fails safe on its own stale-record rules); it mirrors the NHS-session chip so the same shell status-bar pattern carries the device-dataset health signal.
eRD management38 active regimens · Timperley
Active regimens38
Next issues due (7 days)6
Authorisations expiring ≤30d3
Prescriber cancellations1
Prescriber cancelled an unpulled issue — D. Lloyd, issue 4 of 6 (Spine cancellation 11 Jun 10:12). Remaining issues will not arrive. Acknowledge and contact the surgery if a replacement is expected.
Action needed 2
D. LloydRamipril, bisoprolol · 28-day intervalIssue 3 of 6Issue 4 cancelled by prescriberauth expires 02 Oct 2026
Mary QuinnLevothyroxine 100mcg · 28-day intervalIssue 6 of 6Final issue — re-authorisation neededauth expires 30 Jun 2026
Next issue due soon 3
John OkaforMetformin 500mg, lisinopril 10mg · 28-day intervalIssue 2 of 6Issue 3 scheduled — due 26 JunClaims sequential ✓auth expires 14 Nov 2026
Ahmed HassanBeclometasone inhaler, montelukast · 56-day intervalIssue 4 of 7Issue 5 due 18 JunClaims sequential ✓auth expires 19 Mar 2027
Eleanor WrightLatanoprost eye drops · 28-day intervalIssue 5 of 12Issue 6 due 15 JunClaim issue 4 pendingauth expires 08 Jan 2027
Scheduled — not yet due collapsed on the queue board · 4
Susan BellAtorvastatin 20mg · 28-day intervalIssue 3 of 6Auto-arrived 09 Jun — moves to Received 21 Junauth expires 12 Dec 2026
George AdamsTamsulosin 400mcg MR · 28-day intervalIssue 2 of 6Auto-arrived 10 Jun — moves to Received 24 Junauth expires 03 Nov 2026
Spine pushes the next issue 7 days before the expected end of the previous issue — auto-arrived issues sit in the collapsed “Scheduled — not yet due” group so benches are not flooded, and move to Received on due date. DN withdrawals carry the eRD issue identifier. Cancellation of unpulled issues arrives from Spine and is surfaced here, never silently dropped.
eRD regimen — John OkaforIssue 2 of 6Authorisation active
Issues2 of 6 pulled
Interval28 days
Next issue expected26 Jun prev end − 7d
Authorisation expires14 Nov 2026
Issue history & sequential-claim state
Issue
EPS ID
Arrived
Dispensing
DN
Claim
1 of 6
7B22C4
14 Apr
Collected 17 Apr
Sent
Claimed May
2 of 6
9D45A1
12 May
Clinical check
Pending
Awaits issue-1 sequence ✓
3 of 6
2F88B0
auto — 19 Jun
Scheduled · due 26 Jun
—
—
4–6
not yet pulled
—
—
—
—
Claims for eRD issues submit in sequence — the issue-2 claim queues until the issue-1 claim is accepted. Out-of-order submission is blocked, not retried blind.
Authority
Authorising Rx 7B22C4-X81004-90DD13 · Dr R. Mehta (Park Road Surgery A81021) · signed 12 Apr 2026
6 issues × 28 days · expires 14 Nov 2026
Items on each issue
Metformin 500mg tablets ×561 bd
Lisinopril 10mg tablets ×281 om
Patient
John Okafor · 58 · NHS 612 338 4790 PDS ✓
Nominated here · RTEC: PPC valid to Feb 2027
Cancellation watch
A prescriber cancellation of any unpulled issue (3–6) lands here as an action item and stops the auto-pull.
Labels & print queueTimperley · 09:47
Queued6
Printing1
Failed2
Reprints today (audited)4
LBL-01 reports “media out” since 09:41 — 2 jobs failed. Reload label stock and retry, or reroute to LBL-02.
Margaret Thompson — amlodipine, atorvastatin, levothyroxine
LBL-02
09:46 · T. Mills
Printing
J-4472
Bag label
Margaret Thompson Large print
LBL-02
09:46 · T. Mills
Queued
J-4473
Token — FP10DT
C. Reilly — Sch 2 CD collection signature
A4-01
09:45 · A. Khan
Queued
J-4474
MAR chart
Oakwood batch — 12 residents, cycle 16 Jun
A4-01
09:44 · T. Mills
Queued
J-4475
MDS tray label ×4
Harold Jenkins — trays wk 1–4
LBL-02
09:44 · T. Mills
Queued
J-4476
Owing label
Susan Bell — warfarin 3mg, 14 owed
LBL-02
09:43 · T. Mills
Queued
J-4468
Item label ×2
Leon Murphy — sertraline, salbutamol
LBL-01
09:41 · T. Mills
Failed — media out
J-4467
Token — exemption declaration
Derek Shaw
LBL-01
09:40 · T. Mills
Failed — media out
Reprint audit — reason mandatory on every reprint
Time
Label
Kind
Reprinted by
Reason
09:32
Priya Patel — methylphenidate item label
Item
T. Mills
Label creased in printer feed
09:18
Ahmed Hassan — bag label
Bag
T. Mills
Bag torn at sealing — relabelled new bag
08:55
C. Reilly — FP10DT token
Token
A. Khan
Patient lost token — identity re-verified before reissue
08:41
Oakwood — Vera Singh MAR chart
MAR chart
A. Khan
Superseded by mid-cycle dose change (ramipril)
Reprints render from the stored payload (hash-matched) — never silently re-derived. Each row records printer id, actor and reason; GPhC inspectors expect this trail.
Cautionary & advisory labels — Susan Bell · Warfarin 3mg tabletsdm+d-keyed · BNF Appendix
BNF-Appendix numbered warnings are auto-applied from a reference set keyed by the supplied product's dm+d code — not typed by hand. The pharmacist may add or remove a label under professional judgement; every add/remove is audited with a reason (§2.11 / AL-1/AL-2 / AC-28).
No.
Warning text
Source
State
10
Warning: follow the printed instructions you have been given with this medicine.
Auto (dm+d)
Applied
5
Do not take indigestion remedies, or medicines containing iron or zinc, at the same time of day as this medicine.
Auto (dm+d)
Applied
—
Tell your doctor straight away if you notice unusual bruising or bleeding (warfarin counselling).
Pharmacist-added · A. Khan
Manual add
21
Take with or just after food, or a meal.
Auto (dm+d)
Removed — A. Khan
reason: not applicable to this formulation
Each add/remove records added_or_removed_by + reason in disp_labels.advisory_labels.
Reprint fidelity (AL-3): the exact ordered set printed (auto + pharmacist edits) is snapshotted on the label; reprints render from that snapshot — never silently re-derived against a newer reference version. The set is versioned with the dm+d read-model snapshot, so a stale catalogue surfaces in the UI (AP-4 honesty), not silently (AL-4).
Statutory content checked at render: patient name (MDS: outer + immediate packaging) · supplying pharmacy name/address — always the SPOKE’s even when printed at a hub · date ready + hub assembly date on hub-printed labels · “Keep out of the reach and sight of children” on every label · CD quantities in words and figures (Sch 2/3).
MDS profile — Margaret ThompsonActive Oakwood Care Home
One MDS model only — this profile drives cycles, trays and MAR charts. Saving a change mid-cycle regenerates unchecked trays and flags checked ones for manual review.
Cycle length *
Trays per cycle
Slot scheme
Start anchor date
Collection mode
Care home
Medication grid — slot map (day × slot → dose)
Medication (dm+d)
Directions
Morning
Lunch
Evening
Night
In tray
Source Rx
Amlodipine 5mg tablets
One in the morning
1
—
—
—
Tray
9A3F2E
Levothyroxine 75microgram tablets
One 30 min before breakfast
1
—
—
—
Tray
9A3F2E
Furosemide 20mg tablets
One in the morning — not after lunch
1
—
—
—
Tray
4C19D8
Adcal-D3 chewable tablets
One twice daily
—
1
1
—
Tray
4C19D8
Atorvastatin 40mg tablets
One at night
—
—
—
1
Tray
9A3F2E
Glyceryl trinitrate 400microgram spray
1–2 sprays PRN under tongue
—
—
—
—
Original pack — MAR only
4C19D8
+ add medication…
Tray label and MAR chart both list every line — original-pack items appear on the MAR with “not in tray” marking. Patient name prints on outer and immediate packaging (multiple-dosage statutory rule).
Profile changes are audited (actor + before/after) · next cycle generates from this profile on the anchor schedule · accessible-information needs (large print) carry through to tray + MAR rendering.
MDS cycle — Oakwood Care Home · 16 Jun – 13 JulAssembling
Residents in batch12
Cycles ready5 of 12
Trays flagged for regeneration2
MAR charts printed9 of 12
Mid-cycle change — Vera Singh, ramipril dose increase effective 12 Jun. Unchecked trays (wk 2–4) regenerated automatically; the accuracy-checked wk-1 tray is flagged and must be manually swapped and re-checked.
Per-resident preparation status
Resident
Room
Trays
Stage
Flags
MAR
Margaret Thompson
4
4 × weekly
AssemblingTM
—
Printed
Harold Jenkins
7
4 × weekly
Clinical checkAK
—
Printed
Vera Singh
2
4 × weekly
Tray regeneration
Wk 1 checked tray flagged
Reprint queued
Arthur Pemberton
11
4 × weekly
Accuracy checkTM
—
Printed
Doris Whitfield
9
4 × weekly
Ready
—
Printed
Stanley Hughes
14
4 × weekly
Ready
—
Printed
Edna Kowalski
6
4 × weekly
Planned — scripts due
Awaiting eRD issue
—
+ 5 more residents ready…
Stage chain per cycle: planned → assembling → clinically checked → accuracy checked → ready → collected/delivered. Clinical and accuracy stages carry the same gates as the main queue (separate attribution, pharmacist-only approval).
Mid-cycle change log
Logged
Resident
Change
Type
Effective
Authorised by
Tray impact
10 Jun
Vera Singh
Ramipril 2.5mg → 5mg
Dose change
12 Jun
Dr R. Mehta
Wk 1 flagged · wk 2–4 regenerated
08 Jun
Harold Jenkins
Docusate 100mg stopped
Stop
16 Jun
Dr A. Osei
Next cycle only
05 Jun
Doris Whitfield
Alendronic acid 70mg weekly started
Start
16 Jun
Dr R. Mehta
Built into this cycle
Batch & handoff
Due window 13–15 Jun · 48 trays + 12 MAR charts · deliver to Oakwood with driver Sam Doyle
Batch: in production
Source prescriptions
EPS linked31
eRD issues awaited1
Paper FP102
On batch-ready
Emits to delivery (round booking) and comms (care-home notification) automatic
Tray labels and MAR charts print via the labels queue with full reprint audit · MDS tray + MAR chart are label kinds in the same audited pipeline · collected/delivered closes each member cycle.
NMS intervention — Susan Bell (72)Anticoagulation (VTE)Content pack NMS-2026-04 (pinned)Pharmacist only
Out of window: intervention window opens Tue 16 Jun (engagement + 7–14 days). Completing today (12 Jun) requires an audited reason and flags the £14 claim item for review (EP-4) — never silently claimed.
Engagement ✓InterventionFollow-up
Engagement — Tue 9 Jun, in pharmacy · consent recorded A. Khan
New medicine: Apixaban 5mg tablets ×56 — started 2 Jun (switch from warfarin)dm+d VMP
A side effect reported at follow-up offers a one-tap MHRA Yellow Card, pre-populated from the consultation — distinct from an LFPSE incident (YC-3). The offer-and-choice is auditable: a declined report is visible, never invisible (YC-2). In person or live audio/video only — text/chat may supplement, never replace. Out-of-window reason: patient requested early call before holiday (audited).
Outcome
Intervention outcome *
Matters identifiedSide effect — discussed
Adherence support agreedYes — reminder chart
GP referral (gp_referral_sent → clin_gp_notifications rail)
Three terminals: Complete · Save & schedule follow-up · lost-to-follow-up (records the contact-attempt log, claims nothing for the missed stage — no payment for uncontactable patients). Distinct from lapsed (window expiry) and dna (no-show).
Follow-up scheduling
Window: intervention + 14–21 days26 Jun – 3 Jul
Preferred: phone, after 2pm
Claim position
£14 intervention + £14 follow-up (max £28) · no payment for uncontactable patients · cap headroom 31 of 38 (0.9% of monthly items 2026/27 — warns, never blocks)
Claim item on completion
EP-6: one active NMS per therapeutic area; a decline in the last 3 months suppresses re-identification. Remote delivery records the remote performer; the claim stays with the originating branch (EP-7).
Discharge Medicines ServiceEssential service — every branch · stages deliverable by pharmacist or technician
Stage 1 — in 72 h window2
Stage 2 due (Rx received)1
Stage 3 awaiting collection2
Completed this month6 · £198
Stage 1 — receive & reconcile within 72 h 2
Ahmed HassanManchester Royal Infirmary · discharged 10 Jun · NHSmail PDFNHSmail25 h left
Margaret ThompsonWythenshawe Hospital · discharged 11 Jun · Oakwood care homePharmOutcomesDue Mon 15 Jun (Sun closed-day excluded)
Stage 2 — first post-discharge prescription check 1
D. Whittakerstage 2 complete 10 Jun · collection expected todayReady
Completed 1 this week
R. Salimall 3 stages complete 11 Jun (T. Mills, ACT)£35 claim-ready
Intake today: PharmOutcomes / Refer to Pharmacy / NHSmail (native MESH ToC rail — OPEN QUESTION) · partial fees £12 / £11 / £12, complete £35 · claim by the 5th of the month after completion (6th after a bank holiday).
Referral 9 Jun 14:20 · reconciled 10 Jun 11:42 by T. Mills (ACT) — within 72 h
Complete · £12 partial secured
Stage 2 — first Rx check
First post-discharge FP10 received 12 Jun 09:31 · verify against discharge summary before supply
In progress · £11
Stage 3 — patient consultation
At first collection · check understanding of changes
Pending · £12
Medicines reconciliation — discharge summary vs PMR repeat
Each diff line carries a structured discrepancy type (source taxonomy, §2.4) beyond the green/amber/red colour — tick a flagged line to feed the GP-referral template.
Medicine
Discharge summary
PMR (pre-admission)
Discrepancy type
Status
Atorvastatin 40mg tablets
40mg ON
40mg ON
— none —
Match
Lansoprazole 30mg capsules
30mg OM
30mg OM
— none —
Match
Ramipril 10mg capsules
10mg OM — dose increased
5mg OM
change
Dose/freq changed
Bisoprolol 2.5mg tablets
NEW — 2.5mg OM
not on PMR
addition
New medicine
Furosemide 40mg tablets
not on discharge
40mg OM — on GP repeat
omission
Omitted on discharge
Bendroflumethiazide 2.5mg tablets
STOPPED on discharge
2.5mg OM — still on GP repeat
duplication
Discrepancy
Taxonomy: addition on discharge not on PMR · change dose/form/frequency · omission PMR medicine absent from discharge · duplication overlapping medicines.
Today's prescription includes bendroflumethiazide 2.5mg — stopped on discharge (duplication with the discharge regimen). Withhold the item and flag the discrepancy to the GP before supply.
GP-referral template — auto-populated from flagged discrepancies (§2.4.2)
Pre-built referral document, auto-filled from the 4 ticked diff lines — patient, discharge source, each discrepancy + its type, your recommendation. Rendered as a clin_documents output and routed via the §8 GP-notification rail / NHSmail fallback.
To (GP practice)
Route
Auto-populated discrepancies
changeRamipril 10mg OM — dose increased from 5mg on discharge
additionBisoprolol 2.5mg OM — new on discharge, not on GP repeat
omissionFurosemide 40mg OM — on GP repeat, absent from discharge summary
duplicationBendroflumethiazide 2.5mg OM — stopped on discharge but still on GP repeat (withheld today)
Pharmacist recommendation *
"Flag to GP" (header) opens this template; sending creates the referral as a clin_documents record and a clin_gp_notifications row tracked on the GP-notification queue with the day-of/next-working-day SLA. No discrepancy is marked communicated without an evidence row.
Partial-fee rule (CL-6)
An episode terminating before stage 3 claims the completed-stage partials — £12 (S1) / £11 (S2) / £12 (S3) — never £35. All three stages complete = £35. From 1 Jul 2024, submissions within 3 months of deadline are accepted but unpaid.
72 h window excludes configured closed days · stage 2 is triggered by the first prescription received after the discharge date (verify-before-supply) · all stages pharmacist- or technician-deliverable.
BP clinic — Hypertension case-findingNICE NG136 thresholds (content pack)
Clinic monitor BP-01 (Omron HEM-907 — BIHS-validated) · calibration valid to 02/2027. Capture against an out-of-calibration or non-BIHS device is blocked. Both stages (clinic check + ABPM) must be offered.
Today's clinic 3
Gordon Fairley · 58clinic check in progress · no hypertension diagnosisCapturing
R. Kaur · 47ABPM-01 fitted 11 Jun · return today 16:00Return due
Escalated 1
S. Mensah · 61184/122 at 10:12 — same-day GP referral made, GP phoned≥180/120
Eligibility: adults 40+ without a hypertension diagnosis (+ ad-hoc GP-requested measurements for any adult) · delivery by suitably trained staff — not pharmacist-only · fees £10 clinic / £50.85 ABPM.
Clinic capture — Gordon Fairley (58)
Reading 1 (seated)
Reading 2 (seated)
Reading 3 (seated)
Average (readings 2 & 3, auto)146 / 92 mmHg
DeviceBP-01 · Omron HEM-907 · BIHS ✓ · cal 02/2027
<140/90 — reassure, advise re-check within 5 yrs—
140/90 – 179/119 — offer ABPM Selected
≥180/120 — same-day GP referral—
ABPM handoff
Issue ABPM-01 (A&D TM-2430 · BIHS ✓ · cal 09/2026)
Daytime average thresholds<135/85 normal · 135/85–149/94 GP — suspected · ≥150/95 GP — likely
Result to GPGP Connect Update Record · day-of / next working day
Fees£10 clinic · £50.85 ABPM
Contraception service (PCS)initiation · continuation · oral EC (29 Oct 2025)
Initiations this month6 · £150
Continuations11 · £275
Oral EC supplies4 · £80
GP notifications pending2
Initiation (£25) 1
N. Adeyemi · 27COC requested (Rigevidon) · BP + BMI checks in progressIn consult
Continuation (£25) 2
F. Osei · 31drospirenone 4mg · 6×28 resupply duePGD added 29 Oct 2025Booked 15:20
C. Lindqvist · 24desogestrel 75mcg · 12-month reviewInvited
Registration requires offering both initiation and continuation · contraception supplies are free to the patient (no prescription charge) · PF fixed payment bundling depends on PCS + HCF registration.
Initiation wizard — N. Adeyemi · COC (Rigevidon)
Blood pressure *
Weight
Height
BP sourceMeasured · BP-01
Weight / height sourceSelf-reported — flagged
BMI (auto)24.1
NG136-aligned BP/BMI checks for COC Pass
Migraine with aura (exclusion)No
Smoking statusNon-smoker
SupplyRigevidon ×3 cycles · PGD v3 · free to patient
Performer
Self-reported observations are acceptable when clinically judged suitable and are stored with the self_reported flag — rendered as such in the Update Record payload.
Oral EC — Priya Patel (33) · levonorgestrel 1.5mg
Patient age ≥ 16 — competence assessment not triggeredGillick/Fraser n/a
Time since UPSI · weight / BMI (UPA vs LNG choice)36 h · 71 kg
Supplylevonorgestrel 1.5mg · PGD v1 · free to patient
Under-18 safeguarding prompt (forced) — patient flag CSE concern — open read from the patients module (forced-visible, like AIS). A positive concern blocks routine supply and forces the safeguarding-referral outcome.
Cannot be persuaded to inform parent / allow pharmacist to informDeclines — recorded
Likely to continue/start intercourse with or without treatmentYes
Physical/mental health likely to suffer without treatmentYes
Best interests to receive treatment without parental consentYes
Competence outcome *
not_competent blocks PGD supply (server-side, EP-5) and routes to the content-declared safeguarding/referral path. Fraser criteria & age thresholds are content-pack data (SG-1).
Safeguarding assessment & outcome
Age of partner / coercion / exploitation indicatorsConcern present
Safeguarding concern Positive — supply blocked
Outcome *
Raise incident (compliance incident.record)
Safeguarding referral document
A positive concern forces the safeguarding-referral outcome and raises an incident via compliance’s incident.record() (§2.3.4). The competence/safeguarding judgement is pharmacist-held even where technician delivery is enabled.
Same regulated cds.screen() output as dispensing’s clinical check — stacked, colour-coded decision-support cards, each showing its dataset version. Advisory to the pharmacist; the PGD/supply decision and its audit stay with this wizard. A severe alert blocks supply (no silent pass); a recorded safeguarding concern blocks independently above.
1 warning needs acknowledgement before supply (interaction). Pregnancy/lactation is not screened — no status recorded for this patient (card below). Screening informs, never overrides, the competence/safeguarding gates.
Warning — Interaction · reduced efficacy
Enzyme-inducer on the medication set — carbamazepine 200mg (epilepsy) accelerates levonorgestrel metabolism (CYP3A4 induction · drug–drug). Double-dose LNG (3mg) or copper-IUD onward referral advised per content pack.
No coded allergy to levonorgestrel or excipients on pat_allergies. Any uncoded free-text allergy note is surfaced verbatim below the cards — not a machine-cleared result.
allergy / cross-sensitivity v89
Duplicate therapy — none
No same-class or same-active duplicate against the current medication set (no other hormonal contraceptive recorded).
duplicate v41
Pregnancy / lactation — not screened
Not screened — no pregnancy/breastfeeding status recorded for this patient. Pregnancy and lactation screening could not run; default reads unknown, never “not pregnant” / “no risk”.
pregnancy v18 · lactation v18
Dose within range
Levonorgestrel 1.5mg single dose within the licensed oral-EC range · renal/hepatic not evaluated (no eGFR on record).
dose v54
Screened by cds module · FDB Multilex 2026.05 — interactions v126, allergy v89, dose v54, duplicate v41, pregnancy v18, lactation v18 (per-card version shown above) · severity map v12 · result snapshot retained (device traceability). Fail-closed: a missing dataset slice blocks supply, never reads “no alerts”.
Smoking cessation (SCS)NHS-trust referral only
Referrals from NHS trusts only — no GP referrals, no walk-ins. Intake via hospital ToC platform or NHSmail. Delivery: pharmacist or technician with NCSCT training (4 modules).
Active programmes7
4-week quits (CO-validated)3
NRT items this month18 · Drug Tariff
Fees accrued£230
Referral received 1
T. Carragher · 49Wythenshawe respiratory ward · referred 10 JunNHSmailBook first consult
First consultation (£30) 1
John Okafor · 57quit date set 15 Jun · NRT patches + gum startedWeek 1
Interim reviews (£10) 2
D. Szymanska · 38week 2 · CO 11 ppm ↓ from 22Week 2
K. Boateng · 45week 3 · DNA Tuesday — rebookedRebooked
Final — 4-week quit (£40) 1
F. Hartley · 52week 4 · CO validation due todayCO check
Continuing NRT (to week 12) 2
M. Rowan · 60week 7 · patches step-down to 14mg/24hWeek 7
CO validation — F. Hartley (week 4)
CO reading *
Device
Previous readings22 → 11 → 4 ppm
Quit status Quit validated (<10 ppm)
Device calibrationdue 08/2026 · in service
NRT supply
Nicotine 21mg/24h patches ×14free to patient
Nicotine 2mg medicated chewing gum ×210free to patient
Reimbursementper Drug Tariff determination
Stock draw-downpmr.service_supply → StockIQ
Programme: first → interim(s) → final at ~4 weeks, CO-validated; NRT support continues to week 12 · £1,000 setup at registration · MYS SCS API in development (PharmOutcomes live in beta) · Dec 2025 draft widening — commencement TBA.
Private services — travel health consultationprivate_travel · invoice output (no MYS)
Content-declared intervals (day 0 · 7 · 21–28) — same episode engine, wizard, supply and audit machinery as NHS services; no NHS assurance gate.
Item
Schedule
Price
Status
Hepatitis A (Havrix Monodose)
booster — single dose today
£58.00
Accepted
Typhoid (Typhim Vi)
single dose today
£36.50
Accepted
Rabies (Rabipur) ×3
day 0 · 7 · 21–28
£85.00 / dose
Accepted — stages booked
Atovaquone/proguanil 250/100mg ×26
1–2 days before until 7 days after
£54.00
Accepted
Invoice total
£403.50
Private services are configurable definitions in the content registry — eligibility rules, consultation schema, PGD set, private fee schedule · supplies emit pmr.service_supply draw-down events.
GP notifications queueGP Connect Update Record (ITK3 over MESH) · NHSmail fallback
Assured Update Record services: Pharmacy First, HCF (BP) and PCS. SLA: notify the GP on the day of provision or the next working day. The status bar shows queue depth.
Due today4
Overdue SLA1
Failed — retrying1
Manual action required1
Patient
Service / episode
Completed
Channel
Due by (SLA)
Attempts
Status
Daniel Pryce
PF — sore throat · PGD supply
today 10:41
gp_connect_ur
Day-of · 17:00
0
Pending
S. Mensah
HCF — 184/122 same-day referral
today 10:12
gp_connect_ur
Same-day — GP also phoned
1
Sent
Gordon Fairley
HCF — clinic 146/92, ABPM offered
today 11:25
gp_connect_ur
Next working day · Mon 15 Jun
0
Pending
N. Adeyemi
PCS — COC initiation
today 12:05
gp_connect_ur
Day-of · 17:00
0
Pending
R. Kaur
HCF — ABPM daytime avg 137/86
11 Jun 16:10
gp_connect_ur
Met SLA
1
Delivered · ITK3 ack 16:42
L. Chen
PF — UTI · PGD nitrofurantoin
11 Jun 13:50
gp_connect_ur
Overdue — was due 11 Jun
4
Failed — MESH timeout
B. Hughes
PF — otitis media
10 Jun 15:22
nhsmail_fallback
Fallback path
5
Fallback sent
T. O'Neill
PF — impetigo
9 Jun 11:08
nhsmail_fallback
Bounce — practice mailbox full
6
Manual required
Failure path: pending → failed (retry with backoff in nhs_message_queue) → fallback_sent (NHSmail) → manual_required, with a task at each step. No episode is ever marked notified without an evidence row. The SLA clock keeps counting during outages and escalates.
PGD & clinical device registryTimperley
PGDsPractitioner sign-offsClinical devices
PGD
Service
Version
Effective
Expiry
Sign-offs
Status
Phenoxymethylpenicillin (sore throat)
PF
v4
1 Oct 2025
03/2027
8 of 9
Active
Nitrofurantoin (UTI)
PF
v2
1 Oct 2025
09/2026
6 of 9
Expires in 3 months
Aciclovir (shingles)
PF
v3
1 Oct 2025
03/2027
8 of 9
Active
Fusidic acid 2% (impetigo)
PF
v3
31 Jan 2024
01/2026
—
Expired — supply blocked (fail-closed)
Desogestrel 75mcg
PCS
v3
29 Oct 2025
10/2027
5 of 9
Active
Drospirenone 4mg
PCS
v1
29 Oct 2025
10/2027
5 of 9
Active
Levonorgestrel 1.5mg (oral EC)
PCS
v1
29 Oct 2025
10/2027
5 of 9
Active
Practitioner sign-offs
Aisha KhanPharmacist (RP) · GPhC 206123412 of 12 PGDs signed
Tom MillsTechnician (ACT) · PCS PGDs from 29 Oct 20253 of 3 signed
R. Osei (locum)GPhC 2207851 · booked Sat 13 Jun0 of 12 — sign-off required before supply
clin.content_activated invalidates the cached per-practitioner PGD competency (staff ST-4) — re-sign-off is required on each new PGD version.
Clinical devices
Device
Type
Make / model
BIHS
Calibration due
Status
BP-01
Clinic BP monitor
Omron HEM-907
✓ evidence on file
02/2027
In service
ABPM-01
ABPM
A&D TM-2430
✓
09/2026
In service
ABPM-02
ABPM
A&D TM-2430
✓
05/2026
Calibration overdue — capture blocked
CO-01
CO monitor
Bedfont Smokerlyzer piCO
n/a
08/2026
In service
HCF requires BIHS-validated monitors. Observation capture against an out-of-calibration device is blocked, raising a branch recalibrate/replace task.
Expired or withdrawn PGDs block supply fail-closed · every PGD supply records the PGD id + version (immutable provenance) · registration prerequisites (otoscope, BIHS devices, CO monitor) are content-registry data (CC-7).
Scan the shelf-edge barcode or key counts directly. Completing the session posts ledger movements keyed to the session id — on-hand is SET to the counted figure.
Progress34 / 48 linesshelf W3 in progress
Variances so far3net −3 units
Value impact−£8.58
Started09:05elapsed 1h 12m
Shelf
Product
Expected
Counted
Variance
Note
W1
Amlodipine 5mg tabs ×28
14
14
0
—
W1
Amoxicillin 500mg caps ×21
5
2
−3
checked owings tub — not there
W2
Warfarin 3mg tabs ×28
4
5
+1
extra pack behind divider
W2
Bisoprolol 2.5mg tabs ×28
9
9
0
—
W3
Atorvastatin 40mg tabs ×28
6
entering…
W3
Ramipril 5mg caps ×28
11
not counted
—
—
W4
Lansoprazole 30mg caps ×28
7
not counted
—
—
Variances above the threshold flag the session for review before posting · CD lines are counted under RP witness, with the register balance reconciled in the PMR · adjustments are idempotent on the session id.
Inter-branch transfers — Timperley
In transit3
Awaiting our receipt2
Sent this month£612.4014 transfers
Open discrepancies1
Transfer
From → To
Lines
Value
Sent
Status
TRF-0612-01
Timperley → Altrincham
4
£36.10
today 10:05 · van (Sam Doyle)
In transit
TRF-0611-04
Sale Moor → Timperley
2
£18.42
11 Jun 15:30
Awaiting receipt
TRF-0611-02
Timperley → Urmston
6
£54.90
11 Jun 09:15
Received 11 Jun 14:02
TRF-0610-03
Stretford → Timperley
3
£27.65
10 Jun 11:40
Discrepancy — 1 short
Receive TRF-0611-04 — from Sale Moor2 lines · £18.42
Line
Sent qty
Received qty
Check
Salbutamol 100mcg inhaler
2
✓
Lansoprazole 30mg caps ×28
1
✓
Sender's ledger decrements on dispatch (transfer-out) · receiver's increments only on confirm (transfer-in) — both keyed to the transfer id · CD transfers additionally require a requisition and a register entry at both ends (PMR CD register).
Expiry & date checks — Timperley
Rota by areaCapture sessionShort-dated worklist (7)
Area
Frequency
Last checked
By
Next due
Status
Dispensary shelves A–K
Monthly
14 May
Tom Mills (ACT)
14 Jun
Due in 2 days
Dispensary shelves L–Z
Monthly
28 May
Beth Hughes
28 Jun
OK
CD cabinet
Monthly
2 Jun
Aisha Khan (RP)
2 Jul
OK
Fridge
Weekly
9 Jun
Tom Mills (ACT)
16 Jun
OK
OTC fixtures F1–F3
Quarterly
1 Mar
Beth Hughes
1 Jun
Overdue 11 days
Capture — Dispensary A–K (in progress)22 of 60 shelves
Product
Batch
Expiry
Action
Amoxicillin 250mg/5ml susp 100ml
AX2241
07/2026
Adcal-D3 chewable ×112
AD9907
08/2026
Atenolol 50mg tabs ×28
AT5512
03/2028
Short-dated worklistexpiring ≤3 months
Product
Batch
Expiry
On hand
Disposition
Amoxicillin 250mg/5ml susp 100ml
AX2241
07/2026
3
Remove — return/destroy
Adcal-D3 chewable ×112
AD9907
08/2026
2
Use first — stickered
Latanoprost 50mcg/ml eye drops
LT0341
09/2026
1
Use first — fridge
Stock-credit / movement history (reverse path §4.3a)return_in · write_off · broken_bulk
The credit-side mirror of the dispense draw-down (SQ-13) — un-collected items returned to shelf, bench write-offs and broken-bulk remainders credit on-hand so it doesn't drift permanently downward. write_off/broken_bulk credit on-hand but are excluded from demand (RV-3); return_in reverses the matching demand. CD credits stay a compliance-owned non-deducting signal, never a saleable-ledger movement.
When
Product
Reason
Qty
On-hand effect
Demand effect
Source ref
By
today 11:48
Amoxicillin 500mg caps ×21
return_in
+1
credited
reverses demand
owing OWG-3381 (un-collected)
Tom Mills (ACT)
today 09:30
Amoxicillin 250mg/5ml susp 100ml
write_off
+3
credited
excluded (RV-3)
expiry 07/2026 (short-dated)
Beth Hughes
11 Jun 15:10
Methadone 1mg/ml 500ml CD2
CD return
—
non-deducting signal
n/a
patient return → CD register
Aisha Khan (RP)
10 Jun 13:22
Co-codamol 30/500 ×100
broken_bulk
+40
credited
reconciliation only
split pack — usable remainder
Tom Mills (ACT)
Each credit is keyed on its pmr.stock_returned / pmr.owing_resolved event id (idempotent, RV-1) · over-credit beyond the referenced origin quantity is rejected + alarmed (RV-5) · the same per-branch exactly-one-writer gate as the deduct side (RV-4).
Removals post ledger movements (expiry write-off) and suppress reorder suggestions for the affected pack · rota completion is auditable evidence for inspection · short-dated CD stock routes to the PMR destruction workflow.
Wholesaler claims — Timperley
Credit claims against AAH / Alliance / Phoenix, raised from goods-in discrepancies. Entirely distinct from NHSBSA FP34 reimbursement claims, which live in the PMR claims module.
Open claims6
Credit pending£148.73
Credited (June)£92.15
Rejected (30d)1
Open (6)SubmittedCreditedRejected
Claim
Supplier
Type
Lines
Value
Raised
Status
CLM-0612-01
AAH
Short delivery
1 — Warfarin 3mg ×28 (1 short)
£1.92
today · PO-TIM-0611-04
Draft
CLM-0611-02
Phoenix
Damaged
2 — crushed outer, leaking bottle
£14.30
11 Jun
Submitted — awaiting credit note
CLM-0610-01
Alliance
Price variance
1 — invoiced £8.12 vs quoted £1.67
£6.45
10 Jun
Credit issued · CN-88231
CLM-0609-03
AAH
Short delivery
1 — Salbutamol inhaler
£3.85
9 Jun
Rejected — POD signed clean
CLM-0608-02
AAH
Damaged
3
£22.10
8 Jun
Credit issued · CN-88102
Ageing
1 submitted claim >14 days without a credit note (CLM-0528-04, Alliance, £31.20) — chase with account manager.
Claims and claim lines link back to the delivery and invoice extraction that evidenced them · credit notes reconcile against the supplier statement · price-variance claims compare invoice price to the quoted cascade price at order time.
Reorder rules by product classAI-refreshed weekly from usage history · manual overrides pin until released
Class
Lines
Min
Reorder to
Auto-order
Rule source
Generics — fast movers
318
usage-based
7 days' cover
On
AI weekly refresh
Generics — slow movers
904
1
2
On
AI weekly refresh
CD Schedule 2
41
1
2
Off — manual only
Manual
Fridge lines
66
1
3 days' cover
On
AI weekly refresh
Specials / unlicensed
12
0
per order only
Never
Manual
Warfarin 3mg tabs ×28 line override
1
4
8
On
Pinned by Aisha Khan · 2 Jun
Cascade priorities
1 · AAHSOAP/XMLconnected
2 · PhoenixXML PDIconnected
3 · AllianceREST/JSONslow API
4 · BNSno account
5 · Tridentno account
Tie-break
Surcharge avoidance
Branch delivery scheduledrives owing ETAs in the PMR
AAH — days
AAH — cutoff
AAH — 2nd drop
Alliance — days
Alliance — cutoff
Alliance — 2nd drop
Phoenix — days
Phoenix — cutoff
Phoenix — 2nd drop
Branch ordering rules refresh weekly from the usage-history demand pipeline · PMR dispense events are a demand source, never a rules engine (the PMR never reimplements this) · schedule edits recalculate owing ETAs on the next order confirm.
EPOS till — Lane 1operator: Tom Millsshift open 08:30
P-line in basket — Chlorphenamine 4mg ×28. Pharmacist authorisation required before tender: RP Aisha Khan signed in ✓
Item
Qty
Price
Line total
Paracetamol 500mg tabs ×16
1
£1.19
£1.19
Chlorphenamine 4mg tabs ×28 P — gated
1
£3.20
£3.20
Elastoplast fabric plasters ×20
1
£2.75
£2.75
NHS prescription charge Rx charge
2
£9.90
£19.80
Quick keyCarrier bag 10p
Quick keyIbuprofen 200mg ×16
Quick keyRx charge £9.90
Quick keyPrice lookup
Total due£26.944 lines · VAT included
Offline-first PWA — product cache local, sales queue and sync on reconnect · sales draw down the shared ledger as reason='sale', disjoint from dispensing draw-downs · P-lines queue for authorisation when no pharmacist is signed in (RP status from the PMR) · Rx-charge takings reconcile with the PMR charge ledger.
Cash-up variances beyond the threshold escalate to the branch manager and appear on the area dashboard · safe drops and banking bags are double-signed · card takings reconcile against the Dojo settlement file.
PIP ↔ dm+d mappingsingle source of truth
Unresolvable PIPs are fixed HERE, in StockIQ admin — never worked around PMR-side. Until linked, the affected price rows are excluded from cascade results.
PIP 3302917"BLOOD GLUC STRIPS 50" · price file 10 Junno candidate — escalate to catalogue team
Fix-up — PIP 1234567 (AAH)
Supplier description
Search dm+d (AMPP)
Selected AMPP
Links land in the wholesaler product-link table; the canonical PIP→AMPP view is the locked single resolution path for cascade pricing, barcode lookup and PMR event payloads · every link records actor + evidence (price-file row) for audit.
SCR / GP record — Margaret Thompson GP Connect: StructuredRetrieved today 09:41
Permission to view captured — verbal, by Aisha Khan (RP) at 09:41, purpose: clinical check. This access is audited as a record-view (actor, patient, branch, remote flag). Permission-to-view is recorded per access — it is not a consent record and never gates direct care.
Margaret ThompsonDOB 14 Mar 1948 (78) · NHS 485 777 3456PDS ✓GP: Park Road Surgery (ODS A81021) · EMIS Web · GP record as at 12 Jun 2026 06:00
Medications (GP record)Source: GP Connect AR — Structured
Medication
Type
Last issued
Qty
Atorvastatin 40mg tablets
Repeat
21 May 2026
28
Ramipril 5mg capsules
Repeat
21 May 2026
28
Alendronic acid 70mg tablets
Repeat
21 May 2026
4
Colecalciferol 800unit capsules
Repeat
23 Apr 2026
28
Amoxicillin 500mg capsules
Acute
03 Feb 2026
21
Pharmacy structured view scope: medications · uncategorised items · investigations. Compare against local PMR history on the patient record.
Allergies & adverse reactionsSource: NCRS (SCR)
Allergies are not in the pharmacy GP Connect view. NCRS / SCR remains the national allergy source — use the in-context launch and transcribe with attribution.
Allergen
Reaction
Severity
Phenoxymethylpenicillin (Penicillin V)
Rash
Moderate
Adhesive dressing (elastoplast)
Skin reaction
Mild
Transcription pre-fills source = ncrs_scr with "NCRS viewed 12 Jun 2026"; pharmacist verification required before it counts in clinical checks.
If the GP record is unavailable — patient opt-out or practice not enabled: degrade gracefully. Use NCRS / SCR or the shared care record, ask the patient directly, or phone the practice; record the alternative source used in the consultation note.
Audit: every GP-record view is logged as a record-view with actor, role, branch, is_remote and the permission-to-view declaration. Lawful basis is direct care — consent is never the basis; the gate is the recorded permission-to-view plus CIS2 RBAC.
Restricted record — access check Sensitive (PDS restricted)
You are about to open a restricted patient record. The restriction is never shown on search results. Continue only if you have a direct-care reason; your reason and identity are recorded and reviewed.
Claire DonnellyDOB 03 Sep 1982 (43) · NHS 943 476 5919Minimum identity shown for wrong-patient avoidance — confirm DOB with the patient before continuing
Reason for access
Reason *
Detail
Accessing as
What you will see at your role
Field group
Your access
Name, DOB, clinical record, allergies
Visible
Address & telecom
"Restricted" placeholder
Related persons
"Restricted" placeholder
GP practice & nominated pharmacy
"Restricted" placeholder
Suppressed fields render as "restricted" placeholders, not blanks. Users holding the elevated RBAC right see the full record.
Audit notice. Continuing records a sensitive-record access event: actor, role, branch, is_remote, timestamp and your typed reason. These events feed the IG review queue; access without a direct-care justification is escalated to the superintendent and may be reported.
System behaviour for this record. No demographic updates are ever sent to PDS for restricted patients — edits are held as local-only divergence. Comms sends that would expose address or telecom are suppressed; delivery requires manual address confirmation.
Restricted handling follows PDS healthcare-worker conformance: no flag on search results, warning on open, role-gated field suppression, no outbound PDS updates.
Emergency contact — manager-scope, audited view. Next-of-kin is sensitive personal data (special-category-adjacent, §6 / OQ-9). It is hidden by default; revealing it writes a sensitive-data-access audit row (actor + correlation id) and is never patient-facing.
No live GPhC register interface — verifications are recorded manually against the online register with an evidence snapshot. Each verification event is a new row; status is never silently green. The verifier captures practising status and any conditions/restrictions — these are RP-eligibility-bearing facts, not optional metadata.
Registration current but RP-restricted (ST-9). Practising status: Practising · GPhC condition recorded — verified_conditioned. rpEligibility() returns false with reason gphc_conditioned: this pharmacist must not be rostered as sole RP until the condition is cleared by a fresh verification. Never silently green.
Condition · interim order — "Must not act as Responsible Pharmacist without a second pharmacist on site" · source: interim_order (GPhC) · imposed 28 Apr 2026 · review_on 28 Oct 2026 · restricts_rp = true
Check
Number / reference
Status
Verified
Expires
Re-check due
Evidence
GPhC — pharmacist
2069481
Verified — conditioned
14 May 2026 · R. Whitfield
30 Nov 2026
14 Nov 2026
Register snapshot · conditions captured
Indemnity cover
Policy MDU-PI-7741882 · insurer: The MDU
Verified
11 May 2026 · R. Whitfield
31 Jul 2026
≤ 60 days — worklisted
Certificate of cover
DBS — enhanced
00152348776
Verified
02 Feb 2026 · R. Whitfield
—
02 Feb 2029
Manager-only · view audited
Right to work
UK passport (no share code)
Verified
03 Feb 2021 · HR
—
—
Evidence ref
GPhC — pharmacist(prior event)
2069481
Superseded
09 May 2025 · A. Greaves
31 Oct 2025
—
Register snapshot
Expiry worklists fire at 60 / 30 / 7 days — indemnity cover (ST-11) is worklisted exactly like the GPhC row. A lapsed, conditioned or flagged registration flips RP-eligibility and competency-derived gates immediately — fail closed.
Training & competencies
Code
Pinned to
Signed off by
Expires
Status
pgd:pf:acute_sore_throat
PF pack v6
CSO — Dr E. Marsh
—
Re-sign-off — pack v7
pgd:pf:uti_women
PF pack v7
CSO — Dr E. Marsh
31 Mar 2027
Granted
vaccinator:flu
—
R. Whitfield (mgr)
30 Sep 2026
Granted
e-LfH safeguarding L2
training record
cert upload
31 May 2027
Complete
Data security (DSPT)
training record
cert upload
10 Apr 2027
Complete
PGD sign-offs are pinned to the content-pack version they were granted against — a new pack version re-opens the worklist, never a silent carry-forward (ST-4).
Read and written through the identity module's API — staff renders the UX, identity owns roles, permissions and branch-access grants. No idm_* writes from this module, ever.
Audit: registration verifications, competency grant/revoke, and every DBS / right-to-work detail view are recorded with actor + correlation id.
Advisory planning warning — RP coverage gap. Sat 14 Jun has no rostered pharmacist while the branch is open 09:00–13:00. This is a rota-planning flag, not a legal assertion: the branch cannot trade prescriptions without an RP, but who was RP and when comes from the compliance RP log, never this board (ST-7). Locum booking open.
Skill-mix gap — no accuracy-checker (ST/AC-12). Wed 11 Jun has a pharmacist rostered but no shift held by a can_accuracy_check ACT — final-accuracy-check work cannot proceed even though an RP is present. Distinct from the RP gap above. Roster an act shift to close the window.
Cell legend — published (planned/confirmed) draft (unpublished)open coverconfirmedno_show
Mon 9
Tue 10
Wed 11
Thu 12
Fri 13
Sat 14
Pharmacist (RP)
Khan
confirmed · published
Khan
planned · published
Locum Novak
planned · published · step-out 13:00–14:00
Khan
planned · published
Khan
confirmed · published
OPEN — no RP
open · draft
ACT (accuracy check)
Mills
confirmed · published
Mills
confirmed · published
— none
no act shift
Mills
confirmed · published
Mills
no_show · published
OPEN cover
open · draft · assign on cover board
Dispenser
Ortiz
confirmed · pub
Ortiz
planned · pub
Ortiz
planned · pub
Reed
planned · pub
Ortiz
confirmed · pub
Reed
planned · draft
Counter
Bishop
confirmed · pub
Bishop
planned · pub
Bishop
planned · pub
Bishop
planned · pub
Bishop
planned · pub
Hall
planned · draft
Driver
Doyle
confirmed · pub
Doyle
planned · pub
— (college)
Doyle
planned · pub
Doyle
planned · pub
cancelled
cancelled · pub
Every cell carries a staff_shifts.status (draft/open/planned/confirmed/worked/no_show/cancelled) and a published-vs-draft state from published_at. Sat 14 still has draft cells (dashed) alongside published ones — the header "Draft — unpublished changes" reflects exactly these. An open cell (NULL user_id) is the cover-board source.
Planned RP step-out markers (advisory, ST-7)
Wed 11 Jun · 13:00–14:00 — Locum Novak (RP) stepping out · cover: "GSL-only, no RP-required activity" · expected 60 min advisory plan
A planned within-shift step-out is a visible plan so a known cover window is not mistaken for full RP presence. It never derives the compliance "operating without RP" fact — the statutory record stays in compliance (RP-2 ≤ 2-hour guidance is operator advice, not enforced here).
Shift status & change control
draftopenplannedconfirmedworkedno_showcancelled
Editing a published shift is audited and notifies affected staff via the in-shell bell + platform-mail (ST-5) — never the patient-facing comms module. Unpublished draft edits do not notify.
Planning view only — RP status comes from the RP log (ST-7). RP-coverage and skill-mix coverage gaps are computed as views from the §2.5 enumerated role_on_shift + can_accuracy_check/can_clinical_check competency codes and feed the superintendent [● GAP!] dashboard via reporting. Staff writes are blocked offline — reconnect to publish.
Training & competency matrix — Timperley
Mandatory training coverage (DSPT)92%
PGD sign-offs current9 / 12
Expiring ≤ 60 days4
Missing / revoked3
PF content pack v7 activated 02 Jun — competency requirements changed. 3 PGD sign-offs re-opened on the worklist below (grants are not carried forward silently — ST-4).
Staff
PGD: PF supply
PGD: UTI (women)
Vaccinator: flu
Vaccinator: COVID
NCSCT: SCS
Clinical check
Accuracy check
Safeguarding L2
Data security
Aisha Khan · Pharmacist
v7 re-sign-off
✓ v7
✓ exp 09/26
✓
—
✓
n/a
✓
✓
P. Novak · Locum pharmacist
v7 pending
—
✓
—
—
✓
n/a
✓
✓
Tom Mills · Technician (ACT)
n/a
n/a
—
—
✓
n/a
✓ exp 01/27
✓
Exp 30 Jun
L. Ortiz · Dispenser
n/a
n/a
n/a
n/a
—
n/a
n/a
✓
✓
J. Reed · Dispenser
n/a
n/a
n/a
n/a
—
n/a
n/a
Expired 31 May
✓
G. Bishop · Counter
n/a
n/a
n/a
n/a
Revoked 04/26
n/a
n/a
✓
Exp 12 Jul
Sam Doyle · Driver
n/a
n/a
n/a
n/a
n/a
n/a
n/a
✓
✓
Checker coverage (the two columns are distinct competencies, §2.5).Clinical check = can_clinical_check — held by Khan + Novak (2). Accuracy check = can_accuracy_check — held by Mills only (1). A single column could not answer "do we have a clinical checker and an accuracy checker tomorrow" — the split is what the rota's skill-mix gap view (staff_rpt_skill_mix_coverage) reads to flag accuracy-checker vs clinical-checker absence independently (AC-12).
Sign-off worklist (4)
Aisha Khan — pgd:pf re-sign-off against PF pack v7 · authority: CSO (Dr E. Marsh, named + GPhC-validated)
P. Novak (locum) — pgd:pf v7 pending · cannot deliver PF supply until granted — gate fails closed (ST-3)
J. Reed — Safeguarding L2 expired 31 May · mandatory for counter SOPs — activity permission gated per policy
Tom Mills — Data security (DSPT) expires 30 Jun · re-completion reminder sent 60-day
CSV / e-LfH imports quarantine malformed rows with a per-row report — no silent partial import. Clinical-services enforces performer rules server-side via staff.hasCompetency(): missing, expired, revoked or erroring = not competent.
Leave & availability ~14.5 days (illustrative — pending OQ-10)
The staff_leave.kind enum lands now; the per-user/leave-year entitlement + remaining-balance ledger (accrual, carry-over, part-time pro-rata) is deferred — OPEN QUESTION 10 (whether the PMR carries balances or defers to payroll/HR which already owns them, tied to MP-133 time-&-attendance scope). The balance shown is illustrative only, not an authoritative figure.
My requests — Aisha KhanKind is enumerated (staff_leave.kind) — no free text
Decisions emit staff.leave_decided — you are notified via the in-shell bell; staff notifications never use the patient-facing comms module (and platform-mail for published-shift changes).
Approval queue — Timperley (manager)
Approving leave that overlaps a published shift raises a conflict on both the leave record and the rota — the shift is never auto-modified.
Awaiting decision (5)
Tom Mills · annual · 29 Jun – 03 Jul (5d) Conflict: published ACT shifts Mon–Fri w/c 29 Jun
L. Ortiz · annual · 22 – 26 Jun (5d)No rota conflict
J. Reed · sickness (retrospective) · 09 – 10 Jun (2d)Shifts already marked no-show
G. Bishop · unpaid · 04 Jul (1d) Conflict: published counter shift Sat 04 Jul
J. Reed · parental · 18 Aug – 12 Sep (20d)No rota conflict (draft week)
Declared availability (advisory to rota planning)
Staff
Pattern
Valid from
Valid to
J. Reed
Not available Saturdays
01 Jul 2026
open
G. Bishop
Mon–Thu only, 09:00–15:00
01 Jun 2026
31 Aug 2026
Sam Doyle
No Wednesdays (college)
01 Sep 2025
open
Edits to published shifts arising from leave decisions are audited and notify affected staff (ST-5). Staff writes are blocked offline — reconnect to manage leave.
Locum management
Active engagements2
Pending checks2
Open cover shifts3
Access grants expiring this week1
A locum cannot be rostered as the pharmacist for a shift, nor have an engagement activated, without both a current verified GPhC registration (ST-8) and a current professional-indemnity row — insurer + policy + expiry (ST-11). Indemnity is a co-equal fail-closed blocker: validation refuses activation at write time and names the specific missing check.
Locum
GPhC
Indemnity
Branches
Dates
Access window
Status
P. Novak
2188345 ✓ verified 06 Jun
✓ The MDU · exp 31 Jan 27
Timperley
10 – 13 Jun
10 Jun 08:00 → 13 Jun 19:00
Active
D. Adeyemi
2204918 ✓ verified 09 Jun
✗ no current indemnity row
Timperley · Sale
20 – 21 Jun
—
Pending checks — missing indemnity (ST-11)
R. Calloway
✗ no verified registration
—
Timperley
27 Jun
—
Blocked — GPhC (ST-8)
M. Osei
2147730 verified 12 May
PDA-Union · expired 31 May
Timperley
18 – 31 May
revoked at engagement end
Ended
Engagement — P. Novak · Timperley · Wed 10 – Sat 13 JunActive
GPhC number *ST-8 ✓
Relied-on GPhC verification row
Indemnity — insurer + policy *ST-11 ✓
Relied-on indemnity row (expiry-worklisted)
Branch-access window (mandatory valid_to — ST-6)
Agreed day rate (booking term — payroll external)
Activation cleared — current verified GPhC and current indemnity both present, condition-clear, practising (ST-8 + ST-9 + ST-11).
Shifts: Wed 10 Jun RP Worked · Sat 13 Jun RP Planned · is_locum
Onboarding wizard — branches on orientation_status§2.4
After verification, the wizard forks on the locum's orientation_status. A returning locum (already completed) skips platform-orientation and identity user-provisioning; a new locum (not_started) gets an extra identity user-provisioning step and a platform-orientation/training-mode step. orientation_status gates nothing legally — it only drives this branch.
D. Adeyemi · returningPending — missing indemnity
orientation_status = completed (engaged here Mar 2026) — orientation + provisioning skipped
+ Identity user-provisioningnew only — invite via identity API (PMR renders, identity owns the account)
+ Platform-orientation / training modenew only — orientation_status not_started → in_progress → completed
3 · Engagement activation — blocked until both checks current
4 · Time-boxed branch access via identity API
5 · Roster onto open cover shift · then CIS2 self-link at first NHS operation
With GPhC or indemnity missing the engagement stays pending_checks naming the specific blocker — no activation, no grant request, no shift assignment proceeds (ST-8 + ST-11). The PMR never issues or manages CIS2 credentials — the locum self-links own CIS2 at first NHS operation. End/cancel revokes outstanding grants; access past valid_to is denied by identity regardless.
Audit anchor: GPhC + indemnity verification → engagement → grant → shift → revocation is queryable by correlation id. Locum RP sign-ins run the same rpEligibility() check as employed pharmacists — a lapsed indemnity surfaces indemnity_expired in reasons[] where the locum-RP gate applies (ST-11); the statutory RP log lives in compliance.
Cover board — open shifts across the estate
Central-ops view of every open cover shift (no person assigned) across branches. Claiming or assigning a shift moves it open → planned; assigning a pharmacist shift to a locum re-runs the ST-8 + ST-11 fail-closed gate (current verified GPhC + current indemnity) before it can be confirmed.
Region: Greater Manchester Role: all Next 14 days5 open shifts
Open cover shifts (5)
Timperley · Sat 14 Jun · 09:00–13:00 · Pharmacist (RP) RP gap — branch cannot trade
Timperley · Sat 14 Jun · 09:00–17:00 · ACT (accuracy check) skill-mix gap
Sale · Mon 16 Jun · 13:00–18:00 · Dispenseropen
Altrincham · Wed 18 Jun · 09:00–18:00 · Pharmacist (RP)claimable — locum Novak available
Stretford · Fri 20 Jun · 08:30–13:00 · Counteropen
Estate-wide planning surface (central-ops scope). Assigning an open shift to a person is audited and notifies them via the in-shell bell + platform-mail on a published rota (ST-5) — never the patient-facing comms module. RP-coverage and skill-mix gaps shown here are advisory planning flags; the statutory RP presence record lives in compliance (ST-7).
Bulk campaignsaudience snapshot frozen at approval · estate-wide sends need two approvers
Outbox / logInboundCampaignsOpt-outs
Sending now1
Awaiting approval2
Campaign spend — Jun£318.26 / £500
Suppressed at dispatch — Jun214
"BP check invitations — over-40s" paused at budget cap. Campaign classes hard-stop at cap; transactional classes alert and continue.
Class vaccination_recall is treated as direct marketing under UK GDPR / PECR pending the DPO classification — consent gate enforced at dispatch: patients without invitation consent are suppressed, never sent.
AudienceLive preview: 12,480 patients
Age ≥ 65 on 31 Mar 2027OR at-risk register (clinical eligibility)No flu vaccination since 1 Sep 2026Active patient · branch in scope
Branch scope *
Frequency cap
Suppression preview (re-checked at dispatch)
1,032 no invitation consent · 87 opted out (identifier-level) · 56 stale contact details · deceased / PDS-sensitive gated at send — fail closed, logged, never silent.
Consent basis at send (PECR)11,361 with provable basis
Each marketing member is included under a live pat_consents.marketing_comms basis, snapshotted to consent_basis_at_send at dispatch (I-16) — a withdrawn basis suppresses marketing_consent_absent.
Audience member
Marketing-consent basis
Sends in 14-day window
Susan Bell · 943 476 5919
granted 14 Apr 2026 / digital
0 / 1
Ahmed Hassan · 829 014 7733
granted 02 Feb 2026 / in-branch
1 / 1 — at cap, suppress
John Okafor · 471 558 0021
granted 09 Mar 2026 / portal
0 / 1
Eleanor Wright · 615 220 8847
withdrawn 28 May 2026
— suppress at dispatch
send_sequence_in_window accounts each member's marketing volume across overlapping campaigns — a member at the frequency_cap_policy limit (Max 1 / 14 days) is held, not double-messaged. Full per-member audit
Template & schedule
Template *
Routing
Send window *
Rate limit
Budget cap
Est. spend
Locked opt-out placeholder present — {optOutLine}
mandatory locked_placeholders field verified in every channel variant (SMS / NHS App / email) of "Flu invite v2"; the editor cannot remove it (I-2 / I-16). Approval is blocked until present.
Immutable
Approval — two-person rule (scope > 1 branch)
Created — Tom Mills (manager), 9 Jun 14:02
1st approval — Aisha Khan (superintendent), 10 Jun 09:15
Only approved template versions can send · audience snapshot freezes at approval — later joiners are out, later opt-outs still suppress at dispatch · quiet hours 21:00–08:00 respected · approvals, pauses and both approver identities are audited.
Comms settings — budgets & policy Tenant admin
Quiet hours
Start
End
Non-urgent behaviour
Urgent delivery_update may pierce quiet hours (operator policy, per tenant). Ready-to-collect waits for morning — the pharmacy is shut anyway.
Aggregation
Ready-to-collect grouping
Daily cap per patient
Transports
Channel
Provider
Unit cost
Status
NHS App message
NHS Notify routing plan (via nhs-gateway)
£0
Connected
Email
NHS Notify
£0
Connected
SMS (fallback leg)
NHS Notify
2.4p + VAT
Connected
Inbound SMS (STOP / replies)
Commercial provider — procurement open
per msg
Decision pending
Letter (large print for AIS)
NHS Notify print
76p + VAT
Connected
No automatic cross-provider fallback — a failed send is a visible failure, not a trigger for a shadow path.
Per-class policyfull §2.4 message-class set · purpose group drives the per-patient channel resolution (§2.1a)
Class
Purpose group
Default channel policy
Consent basis
Quiet hours
At budget cap
ready_to_collect
collection
Routing plan: NHS App → SMS
Direct care
Queue to 08:00
Alert & continue
collection_reminder
collection
SMS / email per preference · daily sweep
Direct care
Queue to 08:00
Alert & continue
owing_arrived
collection
Routing plan: NHS App → SMS
Direct care
Queue to 08:00
Alert & continue
owing_expired
collection
SMS / email + branch task (CD day-28)
Direct care
Queue to 08:00
Alert & continue
collection_confirmation
collection
Per preference · policy-gated, default OFF
Direct care
Queue to 08:00
Alert & continue
mds_batch_ready
collection
Care-home contact (§1.4 redirect)
Direct care
Queue to 08:00
Alert & continue
delivery_update
delivery
SMS / email
Direct care
Urgent may pierce
Alert & continue
delivery_exception
delivery
SMS / email · failed-attempt notice
Direct care
Urgent may pierce
Alert & continue
appointment_reminder
appointments
SMS / email · T-24h sweep
Direct care
Queue to 08:00
Alert & continue
nms_followup
appointments
SMS / email
Direct care
Queue to 08:00
Alert & continue
vaccination_recall
invitations
Campaign rules
PECR — DPO pending
Queue to 08:00
Hard stop — pause
nomination_prompt
invitations
Portal / SMS link-out (§1.15)
PECR — DPO pending
Queue to 08:00
Hard stop — pause
campaign
marketing
Per preference · consent-gated
PECR — DPO pending
Queue to 08:00
Hard stop — pause
ad_hoc
ad_hoc
Per patient default (wrapper template)
Direct care
Queue to 08:00
Alert & continue
Legal classification of each class (direct care vs direct marketing under UK GDPR / PECR) is a DPO decision — OQ-C6; the consent schema supports either posture per class so it is configuration, not code. Sender identities & reply numbers
Collection-reminder policyOQ-C12 — policy values
Re-chase prescriptions still ready after N days, before EPS void / return (closes the "left on the shelf, silently voided" gap — H-COMMS-10 / AC-17). Daily scheduler sweep, not an event.
First reminder after
Second reminder
Max reminders / script
Void lead-out
eRD-issue cadence
Aggregated to one message per patient per sweep across all their uncollected scripts · re-checked at dispatch (I-10 → subject_not_ready if collected/voided) · cancelled by disp.collected. Lead-out computed from the real dispensing-token expiry (dispensing), never an assumed date.
Collection confirmationDefault OFF
Optional positive "collected by your representative" safeguarding signal (§1.7) — the patient learns their medicines left the pharmacy with someone. Doubles message volume, so opt-in per tenant / branch.
Send a confirmation when a representative collects
fires on disp.collected / delivery.collection_confirmed only where a named representative is recorded
Confirm patient-self collections too
off by default — most self-collections need no confirmation
Where OFF, the spec position is explicit: no confirmation is sent and cancelling the queued ready_to_collect is the only effect of disp.collected — the absence is a decision, not an oversight.
Inbound keyword → action mapmanager-editable · STOP / START are the regulatory floor and cannot be removed · §1.9 / AC-23
Maps a normalised inbound reply to an action (opt-out / opt-in) or a route raised on the owning module's public API (never a cross-module write), with an optional auto-acknowledgement. Matched against the most-recent outbound message (90-day lookback) so CANCEL hits the right subject.
Keyword
Kind
Action / route
Owning module
Auto-acknowledgement
STOP/ UNSUBSCRIBE / END
stop
opt_out (identifier-level)
Comms (regulatory)
"You'll no longer get messages on this number."
Locked
START/ UNSTOP
start
opt_in (identifier-level)
Comms (regulatory)
"You're opted back in for messages."
Locked
CANCEL
keyword_action
delivery_reschedule
Delivery — DeliveryApi
"Thanks — we've cancelled today's delivery."
COLLECTED
keyword_action
collection_handled
Dispensing — PrescriptionApi
"Thanks — marked as collected."
REPEAT
keyword_action
repeat-by-reply
OQ-C15 — phase-gated
held until portal repeat flow
Unmatched free-text replies route to the inbound triage queue at the owning branch — never auto-acknowledged. A keyword whose subject ref is stale (e.g. CANCEL on an already-delivered order) is rejected by the owning module and routed to triage with the reason — never a false confirmation.
Care-home message classes (mds_batch_ready, and any collection / delivery class whose subject is a current resident) redirect away from the resident's handset to the resolved wing / home contact (§1.4, mandatory — I-11). These set the grain and default channel for that nurse-station contact.
Aggregation grain
Default channel for nurse-station contacts
Allow a home to opt for a single home-level digest
even where the home is wing-structured — per-home / per-wing config lives in admin-config (D-CC2)
If no home / wing contact resolves
message suppresses (care_route_unresolved) and raises a branch task — never falls through to the resident's personal channel (I-11)
Example: Oakwood Care Home · 3 wings · email to nurse station · per-dose-round digest. Comms holds no care-home structure of its own — residency and wing assignment are read at enqueue via CareHomeApi (patients module).
Budgets & spend — June 2026alert threshold 80% · alerts to tenant admin + estate panel
Patient-care messaging is never silently switched off by a finance setting · spend metered from provider receipts and reconciled nightly · an unknown unit cost blocks campaign classes and alerts — never meters silently at £0 · budget changes are audited.
Allied Pharmacies · your nominated branch: Timperley Pharmacy
Use NHS login to prove who you are. It's the same email and password you use for the NHS App.
Identity verified to P9 — required before we show anything about your medicines.
We never see your NHS login password.
No NHS login? Call us on 0161 980 4412 or ask in branch — everything here can be done over the counter.
Prescription tracking lives in the NHS App — we'll send you there rather than copy it.
NHS login OIDC (P9 proofing) · portal traffic rides a dedicated, separately rate-limited /api/portal/* surface · branch offline state never affects the portal — requests queue server-side.
Portal — request a repeatcreates a pharmacy task, not a prescription
11:21portal.alliedpharmacies.uk
Request a repeat
Ahmed Hassan · tick the medicines you need
Amlodipine 5mg tablets
28 tablets · last issued 21 May · due 18 Jun
Atorvastatin 20mg tablets
28 tablets · last issued 21 May · due 18 Jun
Metformin 500mg m/r tablets
56 tablets · requested 9 Jun
Already requested
Salbutamol 100micrograms inhaler
1 inhaler · last issued 12 Mar
Timperley Pharmacy
12 Park Road, Timperley WA15 6QX · your EPS nomination
Note to pharmacy (optional)
Your GP may need to approve first. We'll message you when it's ready — track the prescription itself in the NHS App.
Submits to the dispensing-module worklist as a repeat-request task · if the branch is offline the request queues server-side and surfaces on reconnect · medication list limited to what the portal DPIA approves.
Portal — delivery trackingstop progress, not live GPS — privacy by design
13:58portal.alliedpharmacies.uk
Your delivery — today
DEL-20486 · Timperley Pharmacy · driver: Sam
Request received — Tue 10 Jun
Packed & checked — today 09:40
Out for delivery — you are stop 6 of 11
driver has completed 3 stops
Delivered
Estimated window 14:20 – 15:00
we'll ask for a signature at the door
Delivering to
14 Briar Close, Timperley WA15 7TD
Fed by delivery events (out-for-delivery, proof-of-delivery) — comms never knows the route · stop number only, no live van map: other patients' addresses are on that route · PoD confirmation triggers the "delivered" update.
Portal — message historyeverything the pharmacy has sent, by channel
13:59portal.alliedpharmacies.uk
Messages
Ahmed Hassan · newest first
NHS AppToday 13:55
Your delivery is on its way — estimated 14:20–15:00 today.
NHS AppTue 10 Jun
Your prescription is ready to collect at Timperley Pharmacy.
SMSWed 28 May
An item we owed you has arrived at Timperley Pharmacy. Pop in any time we're open.
EmailWed 14 May
Reminder: your New Medicine Service check-in is tomorrow at 2:30pm.
Letter6 Oct 2025
Flu vaccination invitation — book your free NHS flu jab at the pharmacy.
Same append-only per-patient message log the pharmacy team sees on the patient record Comms tab · content minimised — texts never name your medicines · delivery state shown per message once receipts arrive.
Portal — contact preferencesper-purpose grid · writes back lossless to the pharmacy record (I-12)
14:01portal.alliedpharmacies.uk
How we contact you
Ahmed Hassan · choose a channel for each kind of message — they don't have to be the same
For…
Ready to collect / owings
collection
2
1
3
—
Deliveries
delivery
1
2
—
—
Appointments
appointments / NMS
1
2
3
—
Health invitations
flu, NHS checks
2
—
3
1
Marketing
offers, news
Off — you'll get none of these
1 = first choice · numbers rank fallbacks · tap a cell to set a rank, or leave blank to exclude a channel. An empty row means we won't send that kind at all.
Preferred contact window
only contact me after 17:00, before 20:00 — we hold non-urgent messages until then
Quiet hours 21:00 – 08:00
on top of your window — urgent delivery updates may still come through
Language
Stop all texts on this number
same as replying STOP — applies to every message kind on 07700 900123
Per-(purpose × channel) grid with ranking + preferred-contact-window — mirrors the staff-side patient-record Comms tab so the round-trip is lossless (I-12); a flat single-channel list would be non-conformant. Saves to comms_channel_preference + comms_channel_preference_purpose (source: portal) with full audit · an empty purpose row suppresses that purpose (purpose_opt_out), never silently sends elsewhere · STOP keys on the identifier — it applies to everyone sharing the number · accessibility (AIS large-print) and deceased / sensitivity flags always override these preferences.
Portal — nominate this pharmacy Phase-gated · §1.15 / OQ-C15
The native "tap to switch your nominated pharmacy" journey is a portal-phase feature — it needs nomination capture, which the patients module masters and which is still open (patients OQ-1). Until then this surface links out to the official NHS route; it never switches your nomination over a message.
14:06portal.alliedpharmacies.uk
Make Timperley your nominated pharmacy
Ahmed Hassan · nominate us and your repeat prescriptions come straight here from your GP
Timperley Pharmacy
12 Park Road, Timperley WA15 6QX
Not yet nominated
How to nominate us
In the NHS App → Your health → Nominated pharmacy
At nhs.uk → find a pharmacy → set as nominated
Or just ask us at the counter next time — we'll set it up for you
We can't change your nomination from here — only you (or the GP) can, through the NHS. This keeps the choice yours.
Pre-portal behaviour (today, before this portal ships)
The nomination_prompt message class is live now, but its pre-portal action is tenant-configurable (§1.15) and never pretends to switch nomination over SMS:
Mode
What happens
Status
Branch task
Raises a worklist item prompting staff to ask the patient to nominate at the counter (the incumbents' real-world mechanism)
Default for Timperley
SMS / email link-out
Sends a message linking to the NHS nomination route — not an in-message switch
Available
Repeat-by-reply (REPEAT)
Texting REPEAT to re-order overlaps the inbound keyword map and the portal repeat flow
OQ-C15 — held until portal
Designed, phase-gated: the in-portal nomination switch is deferred pending nomination capture (patients OQ-1) · nomination_prompt maps to the invitations purpose group (§2.1a) and is treated as direct marketing under PECR pending the DPO classification (OQ-C6) — consent-gated at dispatch.
Security — Aisha Khan MFA enrolled
MFA is mandatory for your role (pharmacist) — any role with clinical sign-off, cross-branch or config power. Counter / driver may be exempted per-branch by policy flag.
Two-step verification (TOTP)
Authenticator appEnrolled 12 Jan 2026
Recovery codes7 of 10 remaining
WebAuthn / passkeyPhase 2
RFC 6238 TOTP, 30 s step, ±1 step skew · secret encrypted at rest · recovery codes stored only as salted hashes (argon2id), shown once.
Password & bench PIN
Passwordlast changed 03 Apr 2026
Bench PINSet
CIS2 identity linkLinked — R8003
PIN is bench re-entry only — never primary login, never fresh-auth, never witness, never CIS2. 5 failures lock the PIN (credential login required).
My active sessions
Device
Branch
Started
Last seen
State
Dispensary bench 1this device
Timperley
08:02
now
Active
Back office
Timperley
08:55
09:41
Locked (idle)
Laptop — Chrome
Timperley remote
yesterday 19:12
yesterday 19:48
Idle
HttpOnly cookies only (15-min access + 7-day refresh) — never localStorage · 8-hour absolute session cap, 30-min idle sliding refresh · idle-lock tiers: bench 10 m, back office 30 m, remote 15 m · sessions are server-revocable.
Enrolment and disable both require fresh authentication · identity.mfa_enrolled / identity.mfa_disabled are audited with actor · lost device? An admin MFA reset forces re-enrolment at next login.
Sessions & MFA — estatelive · 377 branches
Active sessions1,288
Locked benches214
Remote sessions31
MFA enrolled96%
Reset requests3
Active sessionsMFA resets (3)PIN lockouts (1)
User
Role
Branch
Device
Age
Last seen
MFA
Flags
Aisha Khan
pharmacist
Timperley
Dispensary bench 1
1h 44m
now
✓
RP
R. Okonkwo
central_ops
42-branch scope
Laptop — Chrome
3h 02m
2m
✓
is_remote
Tom Mills
technician_act
Timperley
Dispensary bench 2
2h 10m
locked 18m
✓
Locked
P. Novak
locum
Timperley
Back office
7h 41m
26m
✓
near 8h captime-boxed Wed
Sam Doyle
delivery_driver
Timperley
Driver app — Pixel 7a
1h 05m
4m
exempt (policy)
route-scoped
Force-logout revokes the refresh-token family immediately and best-effort revokes unexpired exchanged StockIQ tokens (source: pmr_service) — no waiting for token expiry.
MFA reset requests
User
Branch
Reason
Requested
Identity verified by
M. Ortiz (dispenser)
Timperley
Lost phone
today 08:20
branch_manager — in person
D. Hall (counter)
Sale
New device
yesterday
pending
K. Reed (dispenser)
Stockport
Authenticator wiped
09 Jun
area_manager — video call
Reset clears enrolment and forces re-enrolment at next login — it never disables the MFA requirement. Suspension fires identity.user_suspended → revocation worker ends every session and refresh chain.
CIS2 — identity links, role map & AAL policy
CIS2 is a step-up, not the login. Tokens are held server-side by nhs-gateway only — the browser never sees them. NHS operations require BOTH gates: local permission code AND Spine NRBAC activity code.
Identity linksRole mapAAL policy
User
CIS2 sub
Role profiles (URPID)
Activity codes
Linked
Last NHS login
Status
Aisha Khan
555042…91
R8003 @ FLM49 (Timperley) · R8003 @ FLM62
B0068 B0572 B0401 B0825
11 Feb 2026
today 08:14
Linked
P. Novak
555198…03
R8003 @ FLM49
B0068 B0572
04 Jun 2026
11 Jun
Linked
Tom Mills
556377…44
R8008 @ FLM49
B0401
20 Mar 2026
09 Jun
Linked
K. Osei
557210…58
R8003 @ FQX18
—
—
—
Blocked — name/GPhC mismatch
Linking requires an authenticated PMR session + the CIS2 assertion; a mismatched human identity (name / GPhC sanity check) blocks linking pending admin review. Selected URPID is stamped on every NHS call's audit record.
Role map (idm_cis2_role_map) — configuration, not code
CIS2 code
Description
Maps to local roles
R8003
Health Professional
pharmacist · locum
R8008
Admin / Clinical Support
technician_act · dispenser · counter
R8004
Healthcare Student (legacy)
no mapping — deny
Mapping changes are audited with before/after. A valid smartcard without the local permission is denied — and vice versa.
AAL policy per operation (nhs-gateway config)
Operation
Activity
AAL
EPS release / download
B0572
AAL3
OQ-1 · confirm vs SCAL
Dispense notification (send/amend/withdraw)
B0572
AAL3
OQ-1
Return prescription to Spine
B0572
AAL3
OQ-1
Reimbursement claim (send/amend)
B0572
AAL3
OQ-1
View medication (Prescription Tracker)
B0401
AAL2+
PDS demographic update / nomination
B0825
AAL2
PDS trace / read
—
AAL2
app-restricted where SCAL permits
AAL3-capable authenticators assumed: smartcard, FIDO2 key, Windows Hello, CIS2 iPad app. Per-operation AAL pinned here at EPS onboarding.
Cross-product handoffScriptIQ → StockIQ ordering
Opening Ordering — Timperley
Redeeming your single-use sign-in code…
Code redeemed server-side (single-use jti, ~60 s window)
15-min StockIQ token minted (aud stockiq-api, signed client assertion)
Return URL validated against the allow-list
303 redirect — code stripped from the URL
Code expired or already used
Deep-link codes are single-use and live ~60 seconds. Nothing was signed in.
Return URL rejected
The requested destination is not on the allow-list. This attempt has been audited. Correlation id: c0a8-44d1-9b2e.
Re-authentication required
Your ScriptIQ session ended mid-hop (revoked or 8-hour cap reached). Sign in again to continue.
The browser only ever carries the single-use code — URL-borne bearer tokens (history, Referer, proxy/CDN logs, shared-bench shoulder-surfing) are eliminated. Redemptions are logged in idm_exchanged_tokens; logout best-effort revokes them.
NCSO & endorsement registry — June 2026
June concession list is INTERIM — landed mid-month (10 Jun) and may be revised until month close. Expected values stay estimates (CM-6); never present them as a promise.
Concession lines (Jun)18
Claims carrying NCSO42
Gate warnings6
Est. uplift (branch)£312
Monthly concessionsEndorsement codesGate impact
Product
Pack
Tariff £
Concession £
Uplift
Granted
Status
Sertraline 100mg tablets
28
£1.69
£4.85
+£3.16
10 Jun
Interim
Quetiapine 100mg tablets
60
£2.21
£6.40
+£4.19
10 Jun
Interim
Carbamazepine 200mg tablets
84
£3.83
£7.12
+£3.29
10 Jun
Final
Estradiol 50micrograms/24hours patches
8
£4.40
£9.95
+£5.55
12 Jun
Interim
Bisoprolol 2.5mg tablets
28
£0.89
£2.30
+£1.41
10 Jun
Final
Prednisolone 5mg tablets
28
£1.04
£3.18
+£2.14
12 Jun
Interim
Endorsement code reference
Code
Meaning
Required data
DQ gate
NCSO
No cheaper stock obtainable
product + month on concession list
NCSO_IN_CONCESSION_MONTH · warn
SSP
Serious Shortage Protocol supply
3-digit SSP reference
SSP_REF_FORMAT · block
BB
Broken bulk
pack size + quantity
BB_QUANTITY · block
XP
Out-of-pocket expenses
amount + reason
XP_AMOUNT · block
MF
Measured & fitted (appliance)
fitting detail
—
ED
Extemporaneously dispensed
formula + quantities
—
SP
Unlicensed special
invoice price + supplier
—
Gate impact this month
6 claims warned — NCSO endorsement references a product/month NOT on the published list
36 NCSO claims match the concession list — claimable
Gate severity: warn (concession lists are claim-period data, not code)
Endorsement capture happens in dispensing — this registry validates completeness/coherence at the claim gate and never edits endorsements.
Versioned reference data with effective_from / effective_to — monthly list ingestion is a data deployment, not a release. Variance categorisation separates concession_delta from genuinely disallowed items.
FP10PCD submissions — private Sch 2/3 CD prescriptions
Private prescriptions for Schedule 2/3 CDs must be written on FP10PCD and the forms submitted to NHSBSA monthly — monitoring, not reimbursement. Surfaced read-only on the compliance inspection dashboard (CD-10).
Branches submitted10/12
Forms this period23
Due1
Overdue1
Branch
Period
Forms
Submitted
By
Evidence ref
Status
Timperley
May 2026
4
02 Jun
A. Khan
PCD-2605-TIM
Submitted
Sale
May 2026
0
01 Jun
J. Brennan
PCD-2605-SAL
Nil return
Wilmslow
May 2026
2
03 Jun
F. Adebayo
PCD-2605-WIL
Submitted
Altrincham
May 2026
6
—
—
—
Due
Stockport
May 2026
11
—
—
—
Overdue
Reminder worklist — unsubmitted months
Stockport — May 2026 · 11 forms counted, not yet sentreminder raised 08 Jun → branch manager + central ops
Altrincham — May 2026 · 6 forms counteddue window open
One row per branch per period (claim_fp10pcd_submissions, UNIQUE branch+period) · evidence ref retained for inspection · the private CD supplies themselves live in the POM/CD registers, not here.
Quarterly occurrence reporting to the NHSE Controlled Drugs Accountable Officer (SI 2013/373). Submission via cdreporting.co.uk is a manual portal — no API exists; record the portal reference here after submitting.
Branches generated12/12
Submitted10
Nothing-to-report7
Open lines3
Branch
Period
Lines
Nothing to report
Submitted via
Reference
Status
Stockport
2026-Q1
2
—
—
—
Awaiting submission
Altrincham
2026-Q1
0
✓
—
—
Awaiting submission
Timperley
2026-Q1
1
—
cdreporting.co.uk
CDAO-26Q1-0412
Submitted 04 Apr
Sale
2026-Q1
0
✓
cdreporting.co.uk
CDAO-26Q1-0398
Submitted 03 Apr
Wilmslow
2026-Q1
0
✓
cdreporting.co.uk
CDAO-26Q1-0399
Submitted 03 Apr
A row exists per branch per quarter INCLUDING nothing-to-report periods (AC-20). Escalated CD balance-check discrepancies auto-append a line + superintendent alert — never optional, never suppressible.
Generated 1 Apr; due per the CDAO quarterly timetable. Superintendent and central ops notified 8 Apr.
Report lines (refs into safety events + escalated balance checks)
#
Source
Occurred
Summary
Ref
1
escalated balance check
14 Feb
Methadone 1mg/ml oral solution — running balance −60 ml vs physical count; investigation closed 18 Feb (recording error; register correction CD-AMD-118)
evt_8c12
2
safety event — loss
03 Mar
Morphine sulfate 10mg/5ml oral solution — bottle breakage during tray assembly, witnessed destruction of residue; nil unaccounted
evt_91d7
Submission record
Period
Generated
CDAO region
Nothing to report
Submitted via
Portal reference
occurrence_report.generated / occurrence_report.submitted are audited · lines are read-only here — source records live in the CD register and incident log · retention ≥ 5 years from period end.
Alerts & KPI settingsestate scope
Alert queue (5)RulesKPI targetsBenchmarks
Critical
rp_gapStockporttrading with no active RP since 09:12 (41m)
pf_cap_riskWilmslow93% of NHSBSA monthly Pharmacy First cap consumed
Alert rules (rep_alert_rule)
Rule
Source
Severity
Params
Scope
Flags
Enabled
rp_gap
live signal
critical
grace 5 min within trading hours
company
is_system — tune only
on
rp_absence_limit
live signal
warning
warn at 90 of 120 min
company
is_system
on
claim_deadline_risk
kpi: claiming_completeness
warning
N = 5 days to MYS deadline
company
is_system
on
pf_threshold_risk
kpi: pf_clinical_pathways
warning
projected month-end in 20–29 band or just below 20
company
is_system
on
pf_cap_risk
kpi: pf_cap_utilisation
warning
≥ 90% of monthly cap
company
is_system
on
eps_dlq
live signal
critical
dead-letter depth > 0
company
is_system
on
freshness_violation
meta
info
aggregate older than freshness class
company
is_system · meta-alert
on
uncollected_p90_local
kpi: awaiting_handout_p90_age
info
> 7 days, > 25 bags
branch: Timperley
custom
off
Seeded system rules cannot be deleted, only tuned · escalation ladder per rule (notify → page central ops) · lifecycle open → acknowledged → resolved, transitions audited, rows never deleted.
KPI targets (rep_kpi_target — effective-dated)
KPI
Scope
Target
Effective
Set by
nms_conversion
company
≥ 80%
1 Apr 2026 →
R. Okonkwo
waiter_turnaround_p90
branch: Timperley
≤ 20 min
1 Apr 2026 →
branch_manager
pf_clinical_pathways
branch (all)
≥ 30 / month
1 Apr 2026 →
superintendent
cd_balance_check_coverage
company
≥ 95%
1 Jan 2026 →
superintendent
items_per_staff_hour shows "unavailable" until the staff module exports worked hours — no estimated denominators, and no published industry benchmark exists.
External benchmarks
NHSBSA per-contractor dispensing — Apr 2026 · 11,204 contractors · mapped via ODS codeimported 08 Jun
Pharmacy First monthly caps — 2026/27 fileimported 02 Jun
Every tile and column exposes its plain-English numerator / denominator / window on demand — definition-versioned, so history is never silently restated.
Export approvals — DLPsuperintendent view
Bulk = > 10,000 rows, OR any patient-level export spanning > 1 branch, OR full-estate patient-level data — superintendent approval required BEFORE the run executes. Every export is watermarked with the requester's identity and audited.
Pending approval2
Approved (active)1
Expired this month1
Runs this month118
Approval queue (rep_export_approval)
Req
Requested by
Scope description
Est. rows
Patient-level
Status
APP-0234
R. Okonkwo (central_ops)
Uncollected bags > 7 days — 42 assigned branches
2,140
yes · multi-branch
Pending
APP-0233
L. Faulkner (area_manager)
MDS patients + cycle dates — Sale, Altrincham
312
yes · 2 branches
Pending
APP-0231
R. Okonkwo (central_ops)
Estate dispensing volume by branch, FY25/26
137,000
no — aggregate
Approved · expires 14 Jun 18:00
APP-0226
J. Brennan (branch_manager)
Owings history, Sale + Wilmslow
11,800
yes
Expired — run blocked
An expired approval blocks the run with an explicit message; re-approval is required and the attempt is audited. rep.export_approved lands in the DLP audit trail.
Recent runs (rep_report_run)
Run
Definition
Requested by
Rows
Watermark identity
Bulk
Approval
File
RUN-9921
Estate dispensing volume FY25/26
R. Okonkwo
137,042
r.okonkwo@alliedpharmacies.com
✓
APP-0231
xlsx · 4.1 MB
RUN-9918
CD compliance pack — Timperley
A. Khan
312
aisha.khan@alliedpharmacies.com
—
—
pdf
RUN-9912
Claims vs paid variance — May
central finance
1,884
finance@alliedpharmacies.com
—
—
csv
RUN-9907
Owings history, Sale + Wilmslow
J. Brennan
—
—
✓
blocked — approval expired
—
Approvals and runs retained 8 years (audit-aligned) · no role has direct DB access · estate aggregates carry no patient identifiers — patient-level lists render live under branch-scoped RBAC, never persisted into rep_* tables.
Van registryvehicles · capacity · checks & MOT
Active vans3
Off-road1
MOT due ≤ 30d1
Cold-chain capable2
Van
Reg
Branch
Temp zones
Capacity
Daily check
MOT
Service due
Status
VAN-01
MX21 KLP
Timperley
ambient + fridge boxes C-1, C-2
18 totes
today ✓ S. Doyle
14 Mar 2027
22,000 mi
On Round A
VAN-02
MX23 TRV
Timperley
ambient + fridge box C-3
14 totes
today ✓
02 Jul 2026 · 20d
Aug 2026
Loading
VAN-03
MA70 HJX
Stockport
ambient only
12 totes
outstanding
09 Nov 2026
—
Active
VAN-04
MJ19 WPD
Sale
ambient + fridge box C-4
14 totes
—
28 Sep 2026
in workshop
Off-road — clutch
Daily walkaround checks — today
VAN-01 · Sam Doyle · 08:40 — tyres, lights, load straps ✓ · fridge C-1 4.2 °C, C-2 4.8 °C
VAN-02 · K. Reed · 08:55 — all checks ✓ · fridge C-3 3.9 °C
VAN-03 · check not recorded
Fridge boxes hold 2–8 °C; deviations open a cold-chain assessment before any restock (quarantine default). Telemetry loggers per tote/van zone are a later phase — v1 is flags + manual capture.
Breakdown & reassignment
VAN-04 off-road since 10 Jun — 9 remaining stops reassigned to VAN-02 / S. Doyle
Manifest transfer scan-verified — bags physically moved ⇒ every bag re-scanned
Original route closed with disposition notes
A route without a van is legal in v1 (del_vans is a light registry). Failed CD and fridge items always return to branch the same working day — never overnight in a van (SM-D5).
CDS dataset consoleUKCA Class I device boundary 8/8 datasets healthy
Dataset version activation is a device-change control — platform_admin only, effective-dated, audited, emits cds.dataset_activated to reporting + the compliance device-change log. No screening ever runs from an unversioned dataset (fail-closed).
Screenings today1,842all branches
Severe alerts surfaced239 overridden w/ reason (B0068)
Unavailable returns0no fail-closed blocks this week
ref_cds_severity_map is screening-critical: it is the only table that resolves a dataset's native grade to a ScriptIQ tier + blocking decision. If this slice is absent, the engine cannot resolve any tier — the whole screening returns unavailable (not one category, not partially-mapped) and dispensing blocks clinical-check approval, fail-closed (§10, CDS-AC-11). It is version-pinned + snapshotted on every cds_screenings row like any clinical dataset — changing it changes which alerts block (a device change).
Activation re-checks the device-change gate: CSO sign-off (A. Sharief) + platform_admin fresh re-auth · all 8 slices (incl. pregnancy/lactation/PINCER/severity-map) version-pin together and snapshot onto subsequent cds_screenings rows · prior version retained for unwrap/reproduction · offline client slices re-pin on next sync · a severity-map version change re-runs the DCB0129 hazard log (it changes which alerts block).
Version history (device-change log) — all 8 ref_cds_* tables
daily SHA-256 of each partition slice → immutable Blob (WORM, legal hold)
today 04:00
Anchored ✓ no drift
Blob lifecycle (documents / scans / labels)
AES-256 · CMK on audit-archive + document containers · versioned
rolling
OK
Partitions & archive jobs (monthly range, per tenant)
Table
Partition
Rows
Action
Status
disp_supply_events
2024-05
1.41M
archive → Blob, detach
Queued 30 Jun
audit_log
2024-05
3.92M
archive → Blob (digest-anchored)
Queued 30 Jun
nhs_message_queue (history)
2024-05
0.88M
archive → Blob
Queued 30 Jun
all partitioned tables
2026-07
—
create-ahead (scheduler, monthly)
Done 1 Jun
Schema migrations — latest
#
Migration
Scope
Applied
Status
0184
add_cds_screenings_runtime_col
tenantUp
10 Jun · 4s
OK
0183
ref_cds_bundle_2026_06_staging
global
10 Jun · 88s
OK
0182
del_pod_evidence_hash
tenantUp
03 Jun · 2s
OK
0181
claim_rpt_claim_status_view
tenantUp
27 May · 1s
OK
One numbered sequence, tracked in schema_migrations · every file declares tenantUp(client, schema) or scope='global' — CI lint blocks unscoped + duplicate numbers · replayed against a scratch DB per PR.
Retention schedule per record class
Class
Online
Total retention
Legal hold
Clinical / dispensing records
24 mo
8-year class minimum
supported
Children's records
24 mo
to 25th birthday
supported
Electronic CD register
24 mo
11 years
supported
Access / audit log (SCR-class)
24 mo
8 years
supported
Operational logs
24 mo
archive then purge
—
Per-class retention metadata on every store; final values pend the RMCoP confirmation (OQ-8) — the store supports per-class policies either way.
Tenant schemas (schema-per-tenant, AD-4)
Schema
Branches
Size
Migration head
Status
allied
377
612 GB
0184
Active
(next group)
—
0.2 GB
0184
Provisioned
public (ref_* reference data)
global
38 GB
global scope
Active
Tenancy middleware pins search_path per request (setCompanyContext pattern) · crons use forEachTenant fan-out · no direct PMR ↔ StockIQ DB connections (constitutional ban).
Security ops — keys, secrets & policypmr-prod-kv · managed identities only 2 rotations due ≤30d
Secrets in vault42prod · staging holds 38 (no prod NHS creds)
annual or on suspicion · old versions kept for unwrap
02 Sep 2025
02 Sep 2026
platform
OK
DEK — field encryption (v3)
wrapped, TTL ≤1h in memory
on KEK rotation · lazy re-encrypt
02 Sep 2025
sweep 92% done
identity module
Re-encrypting
Blind-index HMAC key
wrapped — separate from DEK
annual
02 Sep 2025
02 Sep 2026
identity module
OK
DB connection credentials
KV secret
≤12 months or staff change
12 Jan 2026
12 Jan 2027
platform
OK
NHS Notify webhook signing secret
KV secret
12 months
03 Oct 2025
03 Oct 2026
comms
OK
TLS — app edge cert
Front Door managed
auto 90d
04 Apr 2026
renews 03 Jul
edge
Auto
Redis access key
KV secret
12 months
09 Nov 2025
09 Nov 2026
platform
OK
Rotation is a runbook with zero-downtime double-publish (new+old valid during cutover) · no .env in production · private keys never exist outside the vault (sign-via-API) — no repo, home-directory or cloud-synced path ever holds key material (P-3).
refresh family revoked + 2 exchanged StockIQ tokens (source: pmr_service)
Revoked
09:55
scheduler (system actor)
Client-assertion auth → StockIQ
relay drain · 1,884 events today
OK
1,422 mints · 312 redemptions · 2 replays rejected today — browser only ever carries the single-use code; exchanged JWTs never leave the server.
Support triage — IssueIQTriage SLA: one working day 1 safety item awaiting CSO
ISS-2047 is flagged "patient safety may be affected" — auto-routed to the CSO safety queue: DCB0129 hazard log + LFPSE assessment + MHRA PMS where the CDS device is implicated. One incident pipeline, three regulatory outlets.
Awaiting triage3oldest 2h 12m
Triage within SLA98%rolling 30d
Open defects142 release-blocking
Safety items (30d)21 closed — LFPSE submitted
Intake (6)Safety queue (1)TriagedClosed
Ticket
Source
Reported by
Summary
Classification
Triage due
Status
ISS-2047
shell bug report
Aisha Khan · Timperley
Label printed previous dose after clinical-check edit
PATIENT SAFETY
13 Jun 09:12
Safety queue — CSO
ISS-2046
portal (via branch)
counter · Altrincham
Repeat request page rejects valid NHS number 943 476 5919
Untriaged
13 Jun 08:55
Awaiting triage
ISS-2045
shell bug report
Tom Mills (ACT) · Timperley
MDS tray label misaligned on second sheet
Defect · P3
met
Assigned — eng
ISS-2044
driver app
Sam Doyle · Timperley
Request: reorder stops after failed delivery
Request
met
Backlog
ISS-2043
EPOS
branch manager · Sale
Z-read variance vs safe count £4.20
Defect · P2
met
In progress
ISS-2041
shell bug report
locum · Hale
Owings card shows stale balance after partial supply
Defect · P2
met
Fixed in 2026.23
Every intake is triaged within one working day into defect / request / possible patient-safety incident (D11.3) · the bug-report form's safety flag bypasses triage straight to the safety queue · tickets carry correlation id, release, branch + screen context automatically.
ISS-2047 — label printed previous dose after clinical-check editPATIENT SAFETYTriage SLA met — 2m
Routed to CSO pipeline (A. Sharief) at 09:14 — DCB0129 hazard log entry drafted (HAZ-075), LFPSE assessment open. CDS device implicated: no (label-engine path) — MHRA PMS not triggered.
Report
Reported by
Received
Safety flag at intake
Release / screen
Correlation id
Subject
Description: dose edited at clinical check (1 BD → 1 OD); reprint used the pre-edit render. Caught by Tom Mills at barcode accuracy check — supply never left the bench.
Triage (one working day — due 13 Jun 09:12)
Classification *
Severity
CDS device implicated?
Assigned
Timeline
09:12Intake — shell bug report with safety flag · context auto-attached
09:14Auto-routed to safety queue (flag set — bypasses normal triage)Safety
09:40CSO acknowledged · LFPSE assessment started · HAZ-075 drafted in DCB0129 hazard log
WWKS2 robot registrystock-facade adapter — one protocol, all vendors 1 fault
Branches with robots6of 377
Adapters online41 fault · 1 commissioning
Robot outputs today1,214dispense picks
Avg output time9.8schute to bench
Branch
Vendor / model
Protocol
Adapter
Capabilities
Heartbeat
Status
Timperley
BD Rowa Vmax 210
WWKS2 2.0
1.6.2
OutputStockInfoStatusArticleInfo
8s ago
Online
Altrincham
BD Rowa Smart
WWKS2 2.0
1.6.2
OutputStockInfoStatus
12s ago
Online
Sale
Willach Consis B3
WWKS2 2.0
1.6.1
OutputStatus
10:58
Fault — output chute 2
Hale
Omnicell M5000
WWKS2 2.0
1.6.2
OutputStockInfoStatus
5s ago
Online
Didsbury
BD Rowa Vmax 130
WWKS2 2.0
1.6.2
OutputStockInfoStatus
9s ago
Online
Urmston
BD Rowa Vmax 130
WWKS2 2.0
1.6.2
Output
—
Commissioning
Adapter config — Timperley (BD Rowa Vmax 210)
Endpoint
Dialogs enabled
Timeout / retry
Output mapping
Stock reconciliation
Site attribution
Robot/automation integration goes through the WWKS2 adapter in the stock-facade module — never bespoke per-vendor protocols in module code (02 §8) · robot stock counts reconcile against StockIQ branch stock, the single stock truth · adapter faults degrade to manual picking, never block dispensing.