The new patient canvas now saves where the old platform did. Phase 1 (frontend) is merged to develop via PR #506. What remains is OCR pre-fill, two backend gaps, a geocode cleanup, and one real end-to-end test.
Saving a patient in the canvas now lands these in the same PatientsV2 columns the old platform used.
Grouped by track. Effort: S small · M medium · L large.
| Item | Effort | Why it matters |
|---|---|---|
| Verification - do first | ||
| Live platform.allcare.ai round-trip | M | Everything is unit-green, but no real patient has saved through the stack yet. Save one with 3+ diagnoses, a no-comma address, meds with route/qty, a care-team member, and a face-sheet attachment, and confirm each lands. Biggest standing risk before production use. |
| Phase 2 - extractor (ai-concierge-v2) | ||
| Med Route / Qty / Dose-form OCR pre-fill | M | The canvas now captures and saves these, but the extractor does not pack them, so they do not pre-fill from a face sheet. The operator types them today. |
| Room OCR pre-fill | S | The save path already lands Room correctly; the extractor never emits a Room field, so it never pre-fills. Add Room → personal_info to the section map. |
| Phase 3 - backend (PatientsV2) | ||
| Med admin-hour schedule + RefillDate | L | A routine med's time-of-day schedule is stored as free text, so meds never enter the time-based med-pass / eMAR; RefillDate has no DTO field. Add a schedules field + RefillDate to the DTO/handler and expand into PatientMedicationSchedule / AdminHour rows. Confirm the old platform's shape via the live capture first. |
| Email-only POA persistence | S | An email-only POA is now warned about (not silently dropped), but still is not saved. Relax the CreateContact validator to allow a phone-less POA so the consent contact actually persists. |
| Frontend follow-ups | ||
| Geocode v5 → v6 consolidation | M | Save-time geocode uses Mapbox v5; seed-time verification (#504, on develop) uses v6. Dedup to one version. (Greptile outside-diff F3, deferred.) |
| place_of_service_id saved nowhere | S | The operator picks a place of service, but it routes to local-only and is saved nowhere, with no warning. Wire it to the facility-placement save, or at minimum warn. |
| Face-sheet idempotency keyed by patient | S | The "already uploaded" ledger is keyed by artifact id only. Save Patient A, switch to B with the same sheet loaded, and B's save skips re-attaching it. Key the ledger by patient + artifact (or clear it on patient switch). |
All of the above is green at the unit / lint / typecheck level and merged to develop. None of it has been exercised against the running stack. The mapping hops only a live capture can confirm: whether the old platform built real medication-schedule rows (vs free-text frequency), and which insurance table it treated as authoritative. A single live round-trip closes the verification gap and informs the Phase 3 schedule work.