A case now carries pictures, and a button that turns it into a deck. THE CHARTS (Briefing.tsx) answer the same three questions the page does, visually: the spike (the flagged slice's weekly denials, with the payer's rule change drawn as a line — weeks after it in the accent, before in gray), where it sits (denial rate by insurer, baseline vs now), where the money stands (the slice's denied dollars by what can still happen to them), and appeals about to expire by insurer. Every chart has a table twin. Data comes from six pre-aggregated Databricks views (sm2/…/chart_views.py) read through the ordinary record-view API, filtered by the slice Ava now records in four structured fields (slice_payer, slice_department, slice_reason_code, spike_start). Nothing is computed from raw claims in the browser. COLOUR WAS COMPUTED, NOT EYEBALLED. The palette is the dataviz reference set (blue 1, orange 2, green 6, violet 7, gray) run through validate_palette.js against this console's own surfaces, both themes — all checks pass. Two things the validator caught: the brand teal fails the chroma floor and would read as gray on a chart, so it is never a data hue; and red beside orange in the recovery stack fails adjacent-pair separation even for normal vision (ΔE 7.1), so "lost on appeal" is violet. THE SLIDES (lib/slides.ts) are six native-chart PowerPoint slides built in the browser with pptxgenjs from the same rows: what happened, the spike, where it sits, the money, the recommendations, the method. Text is Ava's verbatim. Lazy-imported so the 700 KB library is paid for only on click. Backend counterpart: sm2/custom-apps/denials-investigator/10_briefing.sql. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
||
|---|---|---|
| src | ||
| .env.example | ||
| .gitignore | ||
| index.html | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
Northlake Health — Denials Desk
The operator console for the Denials Investigator app (dev, org 900000109
/ app 900000102). A revenue-cycle manager asks why claim denials rose; an AI
employee — Ava — investigates the hospital's Databricks lakehouse and comes
back with a cause, a dollar figure and a recommendation. The manager approves.
This repo is outside sm2 on purpose: it is a frontgen artifact. A push to
main triggers a build, and the artifact is placed at
https://preview-dev.getzino.in/northlake-health/.
What is where
| Path | What it is |
|---|---|
src/api/config.ts |
Every id: app, workflow, activities, record views, stages, per-stage actions |
src/api/client.ts |
The gateway client. App-scoped routes plus the two rdbms views that carry Ava's trace |
src/screens/QueueScreen.tsx |
A queue — the record view filtered on current_state_name |
src/screens/CaseScreen.tsx |
One investigation: findings, recommendations, Ava's live work, the actions |
src/screens/NewInvestigationScreen.tsx |
Ask a question — the INIT activity's form, read live from view-service |
src/components/AvaLive.tsx |
The demo. Every query Ava runs, as she runs it |
Running locally
npm install
npm run dev # http://localhost:5174 — talks to dev.getzino.in via .env
Sign in as dan.reyes@northlake.example. The org is fixed in config.ts.
Two things that will bite
- No API URL is compiled in.
config.js, written by the server when it places the build, carriesVITE_ZINO_API_URL. A production build with noconfig.jsfails loudly rather than calling whichever backend built it. - Ava's trace does not come from the monitor API. That endpoint needs an
org-scoped studio token; an app sign-in gets "no organization scope on this
account". It comes from two views (
northlake_app.ava_trace,ava_decisions) exposed as ordinary rdbms record views. Seeded bysm2/custom-apps/denials-investigator/07_console_views.sql.