# Medical sample pack — teach-surface only

This pack is a **teach-surface** exercise for the demo bundle's
self-teaching skill creator (`ai_node/skill_birth/`, the vendored S053
topic-agnostic skill-birth engine — see
`experiments/cpa_reconcile_demo/apostol-reconcile-demo.zip`,
`ai_node/GUIDE.md` "Teach it a new skill"). It does **not** map medical
records onto the bundle's reconcile / duplicate-detection / anomaly tools —
those are money-shaped instruments built and proven for cash-basis
bookkeeping; faking a fit onto clinical data would misrepresent both what
the tools do and what this pack demonstrates. What this pack actually
proves: the engine's classify-by-threshold shape is topic-agnostic, and it
correctly refuses to invent clinical judgment your examples do not
determine.

## Record shapes

### Encounter/vitals record (systolic families + `sample_records.json`)

One encounter is a flat JSON object; `sample_records.json` carries arity 5
(the teach families for systolic BP use the same shape minus `news2_score`):

| field              | type              | meaning                                    |
|---------------------|-------------------|---------------------------------------------|
| `bp_systolic_mmhg`  | integer           | systolic blood pressure, mmHg              |
| `chart_id`          | string            | synthetic chart/encounter identifier        |
| `heart_rate_bpm`    | integer           | heart rate, beats per minute                |
| `news2_score`       | integer           | composite NEWS2 early-warning score, 0–15 (see evidence appendix) |
| `temp_c_x10`        | integer           | body temperature in °C ×10 (368 = 36.8 °C) — integer-exact, no float |

`sample_records.json` in this directory holds 12 such records, illustrating
the shape a real intake feed would produce.

### NEWS2 escalation record (news2 teach families)

The NEWS2 families use their own arity-4 shape, with field names chosen so
the target field sorts first alphabetically (the ordering rule below):

| field           | type    | meaning                                          |
|------------------|---------|---------------------------------------------------|
| `news2_score`    | integer | composite NEWS2 early-warning score, 0–15         |
| `patient_ref`    | string  | synthetic patient/encounter reference (P####-E##) |
| `resp_rate_bpm`  | integer | respiratory rate, breaths per minute              |
| `spo2_pct`       | integer | peripheral oxygen saturation, percent             |

`teach_families/*.json` holds the worked-example families actually fed to
the engine (see `RESULTS.md` for the live runs):

- `triage_review_adopt.json` / `triage_review_refuse.json` — systolic-BP
  threshold ADOPT/REFUSE pair (original).
- `news2_escalation_adopt.json` — ADOPT at the real NEWS2 high-risk
  boundary: `news2_score >= 7 -> met_call`, else `ward_review`, with the
  boundary pair 6/7 pinned in the engine's training split.
- `news2_escalation_refuse.json` — medium-band ambiguity: examples
  consistent with both a ≥5 and a ≥7 cutoff; the engine refuses and names
  the discriminating score.

Field naming is not decorative: `bp_systolic_mmhg` is deliberately the
alphabetically-first key in the record. The engine's own adversarial-mutation
stage (shape mutation / boundary / garbage inputs, generated from the
*observed* keys, documented in `ai_node/skill_birth/skill_birth.py`
`generate_adversarial`) perturbs only the first two keys in sorted order; a
threshold rule keyed on any other field gets exposed to a mutated record the
`teach.py` wire-only checker cannot recognize and is eliminated as a
"confident wrong answer." Putting the field you intend to be learned first
alphabetically (and making the second-alphabetical field a string, so a
key-swap mutation lands a non-numeric value in the target key and the
candidate refuses cleanly instead of answering) is what makes a multi-field
record family reach ADOPT at all. This is documented as a design rule, not
asserted from a single lucky run — see the reach_limit iterations in
`RESULTS.md`.

## Synthetic-only rule — no real patient data

**Every record in this pack is synthetic.** `chart_id` values are
placeholder strings only (`P0001-E01` style); there is no name, date of
birth, Social Security number, street address, insurance ID, or any other
real or realistic-looking identifier anywhere in this pack. No file in this
directory was derived from, fitted to, or references an actual patient,
encounter, or clinical dataset. If a future contributor adds records here,
this rule is not negotiable: synthetic IDs only, vitals in plausible integer
ranges, nothing traceable to a real person.

## Honest scope

A rule this engine adopts is a decision aid learned from the worked
examples **you** labeled — nothing more. It is not a clinical judgment, not
a diagnosis, not a standard of care, and it carries no medical authority.
Concretely:

- The ADOPT family below teaches the engine one threshold on
  `bp_systolic_mmhg` because six worked examples I labeled bracket that
  threshold exactly. A clinician did not review these labels; I wrote them
  to demonstrate the mechanism. Before any such rule touched real triage
  decisions it would need real clinical labels, real clinical review, and
  sign-off — none of which this pack provides or claims to provide.
- The REFUSE family below is the other half of the honest claim: when the
  worked examples leave a gap, the engine does not guess a plausible-looking
  threshold. It names the exact input that would settle the question. That
  refusal is the safety property this pack is built to demonstrate — an
  engine that will not paper over missing clinical judgment with a
  confident-sounding number.
- The NEWS2 ADOPT family mirrors the *structure* of the real NEWS2
  escalation protocol (score ≥7 triggers an immediate MET assessment — see
  the evidence appendix). Mirroring the structure is the whole claim: the
  taught rule is NOT clinical guidance, NOT the RCP's NEWS2 standard, and
  NOT a substitute for it. The labels are mine, written to demonstrate that
  a real-world protocol shape is teachable; a deployment would take its
  thresholds from the governing clinical protocol, not from this fixture.
- Scope boundary, stated plainly: this pack shows that a threshold-shaped
  rule over four-field synthetic vitals records can be taught and verified
  through the bundle's real S053 engine. It does not show, and does not
  claim, that the engine (or any rule it could learn from more examples)
  is fit for real triage, real diagnosis, or any other clinical decision.

## EVIDENCE APPENDIX — real-world workload the teach surface addresses

Each quote below is verbatim from the cited source, with an evidence grade.
The framing claim these support: clinical staff lose large fractions of
their day to documentation, vitals-recording, and alarm triage, and NEWS2
is the real threshold-review protocol whose *structure* the taught families
mirror. None of this makes the taught rule clinical guidance.

1. **Physician EHR/desk-work burden** — Sinsky et al., "Allocation of
   Physician Time in Ambulatory Practice: A Time and Motion Study in 4
   Specialties," Annals of Internal Medicine, 2016:
   > "For every hour physicians provide direct clinical face time to
   > patients, nearly 2 additional hours is spent on EHR and desk work
   > within the clinic day."
   Source URL: https://pnhp.org/news/allocation-of-physician-time-in-ambulatory-practice-a-time-and-motion-study-in-4-specialties/
   Grade: primary study text, accessed via pnhp.org citation — the
   publisher's own page (acpjournals.org) returned 403 this session.

2. **Nursing vitals-recording time** — Dall'Ora et al., "How long do
   nursing staff take to measure and record patients' vital signs
   observations in hospital? A time-and-motion study," International
   Journal of Nursing Studies, 2021 (PMC8249906):
   > "mean time per vital signs set... 5:01"
   and, per 30-bed unit:
   > "900 min of nursing time per day"
   Source URL: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8249906/
   Grade: primary, direct.

3. **Alarm burden** — Lewandowska et al., "Impact of Alarm Fatigue on the
   Work of Nurses in an Intensive Care Environment — A Systematic Review,"
   2020 (PMC7697990):
   > "alarms... from 150 to 400" (per patient per duty)
   > "Reacting to alarms constitutes 35% of the working time of a nurse in
   > an ICU"
   Source URL: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7697990/
   Grade: primary, direct.

4. **NEWS2 escalation bands** (the protocol the ADOPT family mirrors):
   > "Score 5-6 (Medium Risk): Requires an urgent review... Score ≥7 (High
   > Risk): triggers an immediate Medical Emergency Team (MET) assessment"
   Source URL: https://theimdoctor.com (secondary explainer)
   Grade: secondary explainer — the Royal College of Physicians' primary
   NEWS2 PDF was not fetchable this session; the band structure quoted here
   is the widely republished RCP scheme, but the primary text was not
   verified against directly.

5. **Coding productivity context** — For The Record, 2019 (industry
   survey):
   > "2.02 cases per hour"
   Grade: industry trade-press survey, not peer-reviewed.

Honest gap, stated rather than papered over: items 1 and 4 could not be
verified against their primary publishers this session (403 / unfetchable);
the grades above say exactly which text stands on which source.
