Add the health data tables from SYNTHESIS §7. Split from #16 (Extended Health Data Sync) — this is the schema work, #16 is the sync implementation.
sleep_sessions — discrete sleep events with summary scores (sleep_score, efficiency, stage durations, avg HRV, avg resting HR, avg SpO2)sleep_streams — Parquet pointers for HR, sleep_stage, SpO2, respiratory_rate during sleephealth_samples_staging — Postgres buffer for incremental all-day samples (HR, steps, stress, skin temp). Rows deleted after daily compaction to Parquet.health_streams — Parquet pointers for compacted daily health dataathlete_metrics — daily summary values: HRV, resting HR, weight, body fat, steps, stress, readiness, VO2max, sleep score, subjective wellness (soreness, fatigue, mood, motivation), training load metrics (CTL, ATL, TSB, ACWR), thresholds (FTP, max HR, LTHR, threshold pace)sleep_session + sleep_streams (Parquet) → athlete_metrics rows (sleep_score, hrv, readiness)health_samples_staging → daily compaction → health_streams (Parquet) → derive resting_hr/steps totals → athlete_metricsathlete_metrics with source = 'manual'athlete_metrics (no raw samples needed)health_samples_staging (Postgres, fast)health_streams Parquet files (S3, cheap)athlete_metrics (Postgres, pre-computed)Schema Migration, Object Storage Setup
#16, #25
See docs/api-research/SYNTHESIS.md §7 (Athlete Health Data: Three First-Class Entities).