# Application Logic — index

> Deep, dev-friendly documentation of how each part of the ped-ai app
> actually works. Written so a human developer can understand the
> codebase without spelunking, and so an AI assistant can confidently
> modify code without breaking high-risk workflows.

These docs explain **application logic** — what the user does, what the
system does in response, what the data flow is, and **why** the design
looks the way it does. They are not API reference (see
[`../api-reference.md`](../api-reference.md)) and not deployment
recipes (see [`../deployment.md`](../deployment.md)).

## Read in this order

For someone brand new to the codebase:

1. **[architecture.md](architecture.md)** — Start here. The big picture:
   current frontend pattern, lazy tab loading, backend route convention,
   PostgreSQL schema, encryption at rest, Dockerfile + compose layout,
   and high-risk zones.

2. **[clinical-notes.md](clinical-notes.md)** — How every clinical note
   tab works. The shared "record → transcribe → generate → save"
   lifecycle, then per-tab deep dives for Encounter HPI, Dictation HPI,
   Sick Visit, Well Visit, SOAP, Hospital Course, Chart Review, and
   Personal Notes. Includes the helper trio (refine / billing-codes /
   don't-miss).

3. **[ed-encounters.md](ed-encounters.md)** — The ED encounter feature
   (multi-stage notes, per-stage don't-miss, consolidate→MDM finalize).
   Newest, most explicit explanation of how a clinical workflow gets
   composed in this codebase. Read this for a worked example.

4. **[bedside-and-calculators.md](bedside-and-calculators.md)** —
   Bedside emergencies module, the pediatric calculators (BP percentile, Fenton growth,
   bilirubin nomograms, etc.), the PE Guide, vax schedule, milestones.
   Includes the suture selector. **Important:** lists every clinical
   formula that must NOT be modified without test vectors.

5. **[ai-and-voice.md](ai-and-voice.md)** — AI provider routing
   (`callAI`), the centralized `PROMPTS` object with DB overrides, the
   `wrapUserText` + `INJECTION_GUARD` safety pattern, server-side STT
   routing, TTS, and the AudioRecorder. Voice/STT plumbing is high-risk — the
   doc describes it without proposing changes.

6. **[auth-admin-learning.md](auth-admin-learning.md)** — Authentication
   (local + OIDC SSO + 2FA), session management, OpenBao secret loading
   at container start, the Admin panel (model allowlist, prompt
   overrides, milestone editor), and the Learning Hub (AI-authored
   quizzes / outlines / Marp presentations).

## What's NOT here

- **Reference data details.** Every clinical formula's *math* lives in
  the source files; this doc series points to the formula and explains
  *what it does* but doesn't reproduce the lookup tables.
- **API endpoint signatures.** See [`../api-reference.md`](../api-reference.md).
- **Operational runbooks.** See [`../deployment.md`](../deployment.md),
  [`../configuration.md`](../configuration.md).
- **Recent change history.** See git log + the rollback tags
  (`pre-ts-migration-2026-04-26`, `pre-ed-encounters-2026-04-26`, etc.).

## Voice + conventions

Each doc follows the same structure:

- **Overview** — what this part is and why it exists
- **User flow** — what the physician does and sees
- **Data flow** — what HTTP calls happen, what the server does
- **File map** — which files do what
- **Key design decisions** — *why* it works the way it does
- **High-risk zones** — what requires small, tested changes
- **How to extend** — concrete recipes for adding a new X

When a doc mentions a high-risk zone, changes should be small, well-tested, and
directly tied to the requested behavior. Current high-risk areas:

| Zone | Why |
|---|---|
| `public/js/encounters.js` save/load/idempotency | Save/version/idempotency logic has been carefully tuned; refactors keep silently breaking it. |
| Voice/STT plumbing (`audioBackup.js`, `speechRecognition.js`, `voicePreferences.js`, `transcriptionSettings.js`, recorder paths in each clinical tab) | Recording UX has been hardened against many edge cases; refactor only with smallest-diff bug fixes. |
| Validated clinical formulas (BP percentile LMS, Fenton 2013, bilirubin AAP 2022, Bhutani, APLS / Best-Guess weight, PE Guide SCALES) | Validated against peditools / AAP tables; modifying without test vectors risks miscoding patient care. |
| Auth + crypto (`crypto.js`, `passwords.js`, `sessions.js`, `auth.js`, `oidc.js`) | Security; changes without security review are unsafe. |
| MDM rubric in `PROMPTS.edFinalize` | Load-bearing for billing accuracy; trim only with explicit AMA/coding source citation. |

## Cross-cutting topics

A few topics span multiple docs. Use these as your jump-off points:

| Topic | Where to look |
|---|---|
| Frontend globals, ES modules, and lazy tab loading | architecture.md |
| Lazy tab loading (`loadComponent`, `tabChanged` event) | architecture.md |
| `getUserMemoryContext` → templates feeding into AI prompts | clinical-notes.md §6, ed-encounters.md §9 |
| The helper trio: `refineDocument`, `suggestBillingCodes`, `suggestDontMiss` | ai-and-voice.md §12, clinical-notes.md §5 |
| `wrapUserText` + `INJECTION_GUARD` prompt-injection defense | ai-and-voice.md §5 |
| `saveEncounter` API + optimistic locking + idempotency keys | architecture.md §13, clinical-notes.md §4, ed-encounters.md §5 |
| `cryptoUtil.encryptString` / `encryptBuffer` "enc1:" format | architecture.md §12 |
| AI provider routing (`callAI`) | ai-and-voice.md §2-3 |
| 2023 AMA E/M MDM rubric | ed-encounters.md §6 |
| User templates (`user_memories` table, `template_*` categories) | clinical-notes.md §6, ed-encounters.md §9 |

## How to keep these docs current

Each doc has a date implicit in the most recent feature it describes.
When you add a feature, update the relevant doc in the same commit.
When you remove a feature (e.g., the Dragon-style AI corrections
removal in late April 2026), remove its section + leave a one-line
historical note in the relevant doc.

When you write a new doc, follow the same structure as these (Overview /
User flow / Data flow / File map / Design decisions / Sacred zones /
How to extend) and add it to this index.
