| name | visit-prep-pack-pdf |
| description | Build the downloadable visit-prep pack PDF for the day's clinic — cover with practitioner + date + roster, then one full pre-visit-summary page per patient. Renders via the inline HTML template + Playwright. |
| enabled | true |
Instructions
Use this skill when Dr. Solomon asks for "the pack", "the PDF", "print my prep", or any variation. This is the deliverable the persona exists to produce.
Workflow
- Gather the data by chaining other skills first:
- The roster:
daily-schedule flow against PRA-9001 for the requested date (default to today, 2026-06-02)
- Per-patient context: for each booked patient, in parallel:
epic_get_patient
epic_list_conditions
epic_list_medications (status: active)
epic_list_allergies
epic_list_observations (limit: 10 recent)
- The current
epic_get_encounter for the day's appointment (for reason_text if present)
- Render by invoking
scripts/render_visit_prep.py via code_interpreter. Pass the data as JSON:
python /app/use-cases/clinician-visit-prep/skills/visit-prep-pack-pdf/scripts/render_visit_prep.py \
--practitioner-name "Dr. Aniyah Solomon" \
--practitioner-specialty "Internal Medicine, Adult Primary Care" \
--clinic-date 2026-06-02 \
--patients-json '<JSON array of patient records>' \
--out /tmp/visit-prep-2026-06-02.pdf
- Confirm in chat: "Visit-prep pack saved to
/tmp/visit-prep-<YYYY-MM-DD>.pdf — N pages: cover + one per patient. Allergies in red, out-of-range labs flagged." Reference the path so file-sharing picks it up.
Patients-JSON shape
The script expects:
[
{
"patient": { "id": "PAT-100001", "mrn": "MRN-100001", "first_name": "Eleanor", "last_name": "Hsu", "date_of_birth": "1948-03-12", "sex": "F", "insurer": "...", "address_city": "Boston", "address_state": "MA" },
"encounter": { "id": "ENC-200003", "start": "2026-06-02T10:00:00Z", "type": "Office Visit", "reason_text": "Follow-up: BP not at goal", "duration_minutes": 30 },
"conditions": [{ "code": "I10", "display": "Essential hypertension", "onset": "2014", "status": "active" }],
"medications": [{ "name": "Lisinopril 20 mg PO daily", "indication": "Hypertension", "since": "2014" }],
"allergies": [{ "substance": "Penicillin", "severity": "moderate", "reaction": "rash" }],
"observations": [{ "code": "BP", "value": "148/92", "unit": "mmHg", "effective_at": "2026-04-15", "interpretation": "above goal" }],
"focus_notes": ["BP control — 148/92 above target", "LDL above post-MI goal"]
},
...
]
focus_notes is your suggested-focus bullet list — synthesise these from the data + the clinical-guidelines-reference skill.
Assets
assets/visit-prep-pack.html — the Jinja-style HTML template (no Jinja, just {{PLACEHOLDER}} string substitution). Clinical white-and-teal theme; cover page; one page per patient.
Constraints
- One page per patient (use
page-break-before CSS); cover stays on page 1.
- Render severe (🔴) allergies above the problem list. Moderate (⚠️) inline.
- File size budget < 2 MB. Don't embed images other than the Olympus mark in the template.
- Do not include real PHI — fixture data only.
- The "Suggested focus" bullets should reference guideline section numbers when relevant (e.g. "LDL 82 — above §3.1 target <70 post-MI").
When NOT to use
- Single-patient brief — use pre-visit-summary and answer inline.
- Roster only (no per-patient depth) — use daily-schedule and answer inline.
Available Files
This skill directory contains the following files you can read with read_file using their absolute paths (prefix /app/use-cases/clinician-visit-prep/skills/visit-prep-pack-pdf/):
assets/visit-prep-pack.html
scripts/render_visit_prep.py