health
Health tracking — body stats, bloodwork panels, biomarker trends, lab analysis, and Garmin daily summaries.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Health tracking — body stats, bloodwork panels, biomarker trends, lab analysis, and Garmin daily summaries.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Calendar operations with CalDAV
Git repository management, GitLab merge requests, and GitHub pull requests
Location tracking, place recognition, visit history, and calendar attendance
Persistent memory writes — USER.md (behavioral) and the knowledge graph (facts).
Accounting operations (ledger, invoicing, transactions, work log, investment portfolio) — runs in-process via the vendored money package
Send a push notification to the user's configured ntfy device(s). One-way (bot to phone), no reply channel.
| name | health |
| triggers | ["health","weight","bloodwork","labs","lab results","biomarker","biomarkers","panel","blood pressure","heart rate","body fat","cholesterol","glucose","bmi","vitals","body temp","body temperature","resting hr","spo2","sleep","sleep score","stress","body battery","steps","hrv","vo2","vo2 max","garmin","encounter","doctor","doctor visit","procedure","screening","hospitalization","diagnosis","diagnosed","condition","medical history","icd10","chronic","immunization","immunizations","vaccine","vaccines","vaccinated","vaccination","shot","booster","flu shot","tdap","mmr","shingles","hpv","covid shot","travel vaccine","mychart vaccines"] |
| description | Health tracking — body stats, bloodwork panels, biomarker trends, lab analysis, and Garmin daily summaries. |
| cli | true |
| env | [{"var":"HEALTH_DB_PATH","from":"setup_env"}] |
Body-stats time series, bloodwork panels, biomarker trends, and lab result tracking. Per-user SQLite at {workspace}/{BOT_DIR}/health/data/health.db. All values stored metric (kg, cm, °C, mmHg, bpm); the display layer converts to the user's preferred units.
Pair with transcribe / whisper when the user submits a photo of a lab report or speaks measurements.
istota-skill health --help shows the live arg list. All output is JSON. Writes are deferred under sandbox (the scheduler applies the ops post-task).
# Body stats
istota-skill health log weight 82.5 # canonical units assumed (kg)
istota-skill health log weight 182 --unit lb # converts to kg
istota-skill health log resting_hr 60
istota-skill health log blood_pressure_systolic 128
istota-skill health log blood_pressure_diastolic 82
istota-skill health log body_fat_pct 18.5 --date 2026-05-08
istota-skill health stats --metric weight --since 2026-01-01 --limit 30
istota-skill health latest # latest value per metric
# Bloodwork
istota-skill health panels --since 2026-01-01 --limit 10
istota-skill health panel 12 # show panel + biomarkers
istota-skill health add-panel --drawn-at 2026-05-08 --lab Kaiser --type CBC
istota-skill health add-biomarker 12 Hemoglobin 14.8 g/dL --ref-low 13.5 --ref-high 17.5
istota-skill health add-biomarker 12 WBC 12.5 10^3/uL --flag H
# Adding a panel and its biomarkers in ONE sandboxed task: the panel id
# doesn't exist yet (the write is deferred), so give the panel a --ref name
# and reference it as @name from add-biomarker instead of a numeric id.
istota-skill health add-panel --drawn-at 2026-05-08 --lab Kaiser --type CBC --ref cbc
istota-skill health add-biomarker @cbc Hemoglobin 14.8 g/dL --ref-low 13.5 --ref-high 17.5
istota-skill health add-biomarker @cbc WBC 12.5 10^3/uL --flag H
istota-skill health trend Cholesterol_Total --since 2026-01-01
istota-skill health upload /path/to/lab.pdf --drawn-at 2026-05-08 --lab Kaiser
# Bulk CSV (Date,Lab,Marker (unit) layout)
istota-skill health import-csv /path/to/bloodwork.csv # skip duplicate (date, lab) panels
istota-skill health import-csv /path/to/bloodwork.csv --on-collision replace
istota-skill health export-csv --output /tmp/bloodwork.csv # all confirmed panels
# Dashboard snapshot
istota-skill health summary
# Profile + display preferences
istota-skill health settings
istota-skill health set dob 1985-03-12
istota-skill health set height 178 # cm; accepts "5ft10in" / "70in" too
istota-skill health set sex M
istota-skill health set display.weight lb
istota-skill health set display.temp F
# Medical history — encounters and diagnoses
istota-skill health encounters --since 2025-01-01
istota-skill health encounter 3
istota-skill health add-encounter --date 2026-05-13 --type procedure \
--provider "Dr. Smith" --facility "Riverside Clinic" \
--specialty gastroenterology --reason "Screening colonoscopy" \
--notes "Grade I-II internal hemorrhoids found. No polyps."
istota-skill health update-encounter 3 --notes "Follow-up in 3 years"
istota-skill health delete-encounter 3
istota-skill health diagnoses --status active
istota-skill health diagnosis 7
istota-skill health add-diagnosis "Internal hemorrhoids" \
--date-diagnosed 2026-05-13 --encounter-id 3 \
--severity mild --icd10 K64.0
istota-skill health resolve-diagnosis 7 --date 2026-06-15
istota-skill health update-diagnosis 7 --status chronic
istota-skill health delete-diagnosis 7
# A condition is usually seen at more than one visit — link each of them.
istota-skill health link-encounter 7 --encounter 12
istota-skill health link-encounter 7 --encounter @followup # created this task
istota-skill health unlink-encounter 7 --encounter 12
istota-skill health history-summary # new-doctor packet
# Immunizations
istota-skill health immunizations [--name Influenza] [--since 2020-01-01]
istota-skill health immunization 12 # show one record
istota-skill health add-immunization --name Influenza --date 2025-11-28 \
--product-name "Fluzone trivalent" --manufacturer Sanofi \
--site "left deltoid" --route IM --facility "CVS Pharmacy" \
--notes "Annual 2025-26"
istota-skill health update-immunization 12 --lot-number ABC123
istota-skill health delete-immunization 12
istota-skill health vaccine-refs # bundled canonical list
istota-skill health coverage # status per ref
istota-skill health coverage --due-soon # filter
istota-skill health coverage --overdue
istota-skill health import-immunizations --paste @clipboard.txt --dry-run
istota-skill health import-immunizations --paste @clipboard.txt --confirm
istota-skill health explain-immunization Influenza # educational primer
# Documents — the paperwork behind a record
istota-skill health documents # everything stored
istota-skill health documents --entity encounter:42
istota-skill health document 9 # one doc + its links
istota-skill health attach-document --path /Users/{user_id}/inbox/card.jpg \
--to immunization:5 --notes "Pharmacy record"
istota-skill health detach-document 9 --from encounter:42
# Attaching to an encounter created earlier in the SAME sandboxed task: the
# encounter id doesn't exist yet (the write is deferred), so name it with
# --ref and reference it as encounter:@name.
istota-skill health add-encounter --date 2026-06-29 --type visit --ref visit
istota-skill health attach-document --path /Users/{user_id}/inbox/letter.pdf \
--to encounter:@visit
# Garmin (initial connect happens in the web UI — health settings page)
istota-skill health garmin-status
istota-skill health garmin-sync --days-back 7
istota-skill health garmin-disconnect
Canonical names (use these for log):
| Key | Unit | Notes |
|---|---|---|
weight | kg | lb input is converted at log time |
resting_hr | bpm | |
blood_pressure_systolic | mmHg | Paired with diastolic |
blood_pressure_diastolic | mmHg | |
body_fat_pct | % | |
body_temp | °C | °F input is converted at log time |
respiratory_rate | brpm | |
blood_oxygen | % | SpO2 |
sleep_duration_min | min | Garmin daily; total sleep time |
sleep_score | score | Garmin daily; 0–100 composite |
sleep_deep_min / sleep_light_min / sleep_rem_min / sleep_awake_min | min | Garmin sleep stages |
stress_avg / stress_max | score | Garmin daily 0–100 |
body_battery_high / body_battery_low | score | Garmin daily 0–100 |
steps | steps | Garmin daily total |
active_calories | kcal | Garmin (excl. BMR) |
spo2_avg | % | Garmin overnight average |
hrv_status | ms | Garmin RMSSD |
vo2_max | ml/kg/min | Garmin estimate |
respiration_avg | brpm | Garmin waking average |
Height is not a stat — it's a single value in settings (health set height …). BMI is derived on read from latest weight + settings height.
Use canonical names where possible (Hemoglobin, LDL, HDL, Cholesterol_Total, TSH, WBC, Glucose, …). The skill normalises common aliases (Hgb → Hemoglobin) automatically. If the lab uses a name we don't recognise, pass it through verbatim — the trend command matches on canonical name first, then aliases.
flag is H (high), L (low), or C (critical). Routes auto-compute H/L against Istota's canonical reference range (sex-aware when sex is set); C is only ever respected from the lab.
| User says | Run |
|---|---|
| "I weigh 82.5 kg" | log weight 82.5 |
| "weight is 182 lbs" | log weight 182 --unit lb |
| "BP 128/82" | log blood_pressure_systolic 128 then log blood_pressure_diastolic 82 |
| "Resting HR 60" | log resting_hr 60 |
| "What's my latest weight?" | latest and format the weight entry |
| "How's my cholesterol?" | trend Cholesterol_Total |
| "Show me my bloodwork history" | panels |
| "Any biomarkers out of range?" | summary — surface entries from alerts |
| "Here are my lab results" (+ image) | OCR via transcribe/whisper, then add-panel + add-biomarker per row |
| "I saw the GI doctor today, colonoscopy was clean" | add-encounter --date 2026-05-15 --type procedure --specialty gastroenterology --reason "Colonoscopy" --notes "Clean, no findings" |
| "Diagnosed with X today" | add-diagnosis "X" --status active --date-diagnosed 2026-05-15 (plus add-encounter if visit details given) |
| "The hemorrhoids cleared up" | resolve-diagnosis <id> --date 2026-05-15 |
| "Saw a specialist about my anemia" | add-encounter … then link-encounter <diagnosis-id> --encounter @that-visit — link, never create a second copy of the condition |
| "What are my active conditions?" | diagnoses --status active |
| "When was my last eye exam?" | encounters --since … --type screening and filter |
| "Give me a summary for my new doctor" | history-summary |
| "Got my flu shot today" | add-immunization --name Influenza --date 2026-05-16 |
| "Tdap booster 2 weeks ago at the pharmacy" | add-immunization --name Tdap --date 2026-05-02 --facility "pharmacy" |
| "Here's my MyChart vaccine list: …" | import-immunizations --paste @inline --dry-run then --confirm after the user reviews the parsed rows |
| "Am I due for anything?" | coverage --due-soon and coverage --overdue |
| "When was my last tetanus?" | immunizations --name Tdap --limit 1 |
| "What's the deal with Shingrix?" | explain-immunization Shingles |
| "Show me everything I've had" | immunizations --limit 500 |
| "Sync my Garmin data" | garmin-sync --days-back 7 |
| "Is my Garmin connected?" | garmin-status |
| "How did I sleep last night?" | latest — read sleep_duration_min / sleep_score from Garmin rows |
| "Steps yesterday?" | stats --metric steps --limit 1 |
When the user uploads a photo or PDF of a lab report through the web UI, the upload pipeline runs the OCR + LLM extraction automatically and the user confirms the extraction in the web UI. From a Talk message with an image attachment, you can transcribe the image and call add-panel + add-biomarker directly, or recommend they upload via the web UI for the full review-and-edit flow.
A condition and an encounter are many-to-many. Someone is diagnosed by their GP, referred to a specialist, and seen again at a follow-up — that is one condition linked to three encounters, not three conditions.
link-encounter that visit to the existing diagnosis. Do not add-diagnosis again: a second row splits the condition's history in two, and its trend, documents and resolution date then live on whichever copy you happened to update.diagnoses --status all for a match by name or ICD-10 code before adding one.--encounter takes a numeric id, or @ref naming an encounter you created earlier in the same task.unlink-encounter removes one link only; the condition and the encounter both survive. Removing the last link does not delete the condition.A health record and the document that proves it are separate things. attach-document links a file the user gave you to the record it evidences — a discharge summary to its encounter, a referral to the condition it names, a vaccination card to the immunization it shows.
--to / --from take a TYPE:ID token. Types are encounter, diagnosis, immunization. Nothing else (lab panels keep their own source file).add-encounter / add-diagnosis / add-immunization), then attach.detach-document when you only want it off one record.Health data is the most sensitive data in the system. The health DB is the single source of truth — quantitative health data must not be duplicated elsewhere.
istota-skill health latest or health trend NAME at the moment of use rather than caching the number.memory skill — see its classification rules. The detailed encounter/diagnosis registry stays in the health DB; only the identity-level fact (has_condition: hypertension) belongs in the KG./panels/{id}/source route, never via static file serving. Attached documents likewise go through /documents/{id}/file. Never mint a public share link for either.