What
On the patient page (/employees/[externalId]), list every open gap with an inline assign select per gap, so a case can be assigned without leaving the page.
Named in the MM-2 plan under PR 1 and deliberately not built there — #551 was already large, and this is additive rather than something the rest depends on.
Why it is worth doing
The patient page is where someone lands after clicking a name on /worklist, and it is currently read-only for assignment: to assign one of the patient's gaps you go back to a list, find the row, tick it, and use the bulk control. The work list exists to let one phone call close what one call can close; the patient page is where that call actually happens.
What already exists
Everything needed is in place after #551 — this is wiring, not new mechanism:
useAssignableUsers (frontend/features/panel/use-assignable-users.ts) — the options, the canonical-spelling resolver, and the UNASSIGN_VALUE sentinel
POST /api/cases/:id/assign — server-side validated against the same list the hook offers
EmployeeProfileResponse.openCases already carries the gaps
Notes for whoever picks it up
Context: #551, MM-2 plan PR 1(B).
What
On the patient page (
/employees/[externalId]), list every open gap with an inline assign select per gap, so a case can be assigned without leaving the page.Named in the MM-2 plan under PR 1 and deliberately not built there — #551 was already large, and this is additive rather than something the rest depends on.
Why it is worth doing
The patient page is where someone lands after clicking a name on
/worklist, and it is currently read-only for assignment: to assign one of the patient's gaps you go back to a list, find the row, tick it, and use the bulk control. The work list exists to let one phone call close what one call can close; the patient page is where that call actually happens.What already exists
Everything needed is in place after #551 — this is wiring, not new mechanism:
useAssignableUsers(frontend/features/panel/use-assignable-users.ts) — the options, the canonical-spelling resolver, and theUNASSIGN_VALUEsentinelPOST /api/cases/:id/assign— server-side validated against the same list the hook offersEmployeeProfileResponse.openCasesalready carries the gapsNotes for whoever picks it up
canonicalForanswers that question; use it for both the truth test and the displayed value.POST /api/cases/bulk-assignover a loop — it is one audited statement, and the per-case loop is what feat(worklist): a patient-first work list, panel filters by PCP and insurance, and set-based bulk assign #551 removed from/cases.Context: #551, MM-2 plan PR 1(B).