The primary action is now "Run daily review": no form, no question. It starts the new INIT door dni-act-review, which is the same activity a scheduler performs at 6am; the button exists so a room does not have to wait until 6am. Ava sweeps every payer, department and front desk against a materiality bar and, if nothing clears it, records "nothing to report" and closes the case herself — it never reaches a desk. "Ask a question" stays, demoted to a ghost button, for the follow-up path. A second button replays a quiet morning: the demo data is static, so every live sweep would flag the same August spike. Anchoring one run on 2026-07-26 lets it genuinely come back empty, and the contrast — one quiet morning beside one $1.09M morning — is the pitch. Queue cards and the case page now carry the sweep outcome: what she reviewed, how many patterns she flagged, and what kind (payer rule change, front desk, expiring appeals, …). A closed quiet case reads "Nothing to report" rather than "Closed", because those are different outcomes. Backend counterpart: sm2/custom-apps/denials-investigator/08_daily_review.sql and the sweep-first charter in 05_ai_employee.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.