Zetaris
Every read in the app and every accept-time check runs through one federated SQL layer over four separately owned sources. Without it, the app would need four integrations and a sync job, and the accept check would run on stale data.
Platelets last about five days. One hospital throws them out while another nearby runs short. Bloodshift reads every hospital's stock live from its own system, proposes transfers that would prevent waste, and moves a unit only after re-checking the sender's own record.
Every read in the app and every accept-time check runs through one federated SQL layer over four separately owned sources. Without it, the app would need four integrations and a sync job, and the accept check would run on stale data.
Chooses one option per unit from a list that already passed the rules, weighs each lab's past decline reasons, and writes the request. Its reply is validated: any unit, site, slot or option it wasn't offered is dropped. If it fails, the plan uses a standard template and says so.
Every transfer and every state change is an event with provenance. The log replays on restart, so history survives refreshes and server restarts. Each transfer's Proof section reads from it.
Keeps each decline reason with the site, unit, transfer and time. Later plans pass these notes to Nemotron as data, with an instruction never to follow text inside them.
Zetaris only reads. Reservations go to each hospital's own system through small adapters: a conditional update in Postgres, and a rewrite of Site C's CSV. Each write only succeeds if the unit is still available, so a change between the check and the write can't be overwritten. Hospitals keep control of their own records.
| Rule | What it does | Basis |
|---|---|---|
| BR-001 | A unit must arrive with at least 12 hours of shelf life left | Working assumption |
| BR-002 | Every planned unit must be in the latest Zetaris read and available | Design invariant |
| BR-003 | At accept, re-read the unit and slot. Refuse if the unit isn't available, has expired or the slot isn't open | Design invariant |
| BR-004 | The sending site keeps one unit of each blood group | Working assumption |
| BR-005 | Units move from slower-using sites to faster-using ones, oldest first | BloodMove, Zhang et al. 2023 |
| BR-006 | A unit is transferred at most once | Working assumption |
| BR-007 | Irradiated units go first to sites that need them | Working assumption |
| BR-008 | A site that declined a unit is never offered it again | Design |
| BR-009 | Model output naming anything outside the offered options is dropped | Design |
| BR-010 | A unit with an active transfer can't appear in another proposal | Design |
| Matching | Identical blood group first, then compatible groups. Group O never goes to non-O patients, and RhD-positive never goes to RhD-negative patients | SNBTS Policy for Platelet Selection (2014) |