Soigneur FHIR Implementation Guide
0.1.0 - ci-build
Soigneur FHIR Implementation Guide - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
| Active as of 2026-11-14 |
{
"resourceType" : "CodeSystem",
"id" : "cc-observations",
"text" : {
"status" : "generated",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: CodeSystem cc-observations</b></p><a name=\"cc-observations\"> </a><a name=\"hccc-observations\"> </a><p>This case-sensitive code system <code>https://fhir.soigneur.coach/fhir/CodeSystem/cc-observations</code> defines the following codes:</p><table class=\"codes\"><tr><td style=\"white-space:nowrap\"><b>Code</b></td><td><b>Display</b></td><td><b>Definition</b></td></tr><tr><td style=\"white-space:nowrap\">ftp<a name=\"cc-observations-ftp\"> </a></td><td>Functional Threshold Power</td><td>Athlete-set threshold-power anchor (W).</td></tr><tr><td style=\"white-space:nowrap\">eftp<a name=\"cc-observations-eftp\"> </a></td><td>Estimated FTP</td><td>Ratchet-estimated FTP from the power-duration curve (W).</td></tr><tr><td style=\"white-space:nowrap\">w-prime<a name=\"cc-observations-w-prime\"> </a></td><td>W-prime (anaerobic work capacity)</td><td>Anaerobic work capacity above CP (J).</td></tr><tr><td style=\"white-space:nowrap\">cp<a name=\"cc-observations-cp\"> </a></td><td>Critical power</td><td>Morton 2-parameter critical-power estimate (W).</td></tr><tr><td style=\"white-space:nowrap\">p-max<a name=\"cc-observations-p-max\"> </a></td><td>Maximal aerobic power</td><td>Maximal aerobic power (W).</td></tr><tr><td style=\"white-space:nowrap\">avg-power<a name=\"cc-observations-avg-power\"> </a></td><td>Average power</td><td>Per-activity mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">np<a name=\"cc-observations-np\"> </a></td><td>Weighted Power</td><td>30 s-smoothed 4th-power power (W). Internal alias: NP.</td></tr><tr><td style=\"white-space:nowrap\">if<a name=\"cc-observations-if\"> </a></td><td>Intensity</td><td>Weighted Power / FTP ratio. Internal alias: IF.</td></tr><tr><td style=\"white-space:nowrap\">power-hr-model<a name=\"cc-observations-power-hr-model\"> </a></td><td>Power-HR model</td><td>Per-athlete linear power↔HR model fitted from rides with both channels; components carry slope/intercept/R²/n/window (W per bpm).</td></tr><tr><td style=\"white-space:nowrap\">power-hr-slope<a name=\"cc-observations-power-hr-slope\"> </a></td><td>Power-HR model slope</td><td>Slope of the power↔HR linear fit (W per bpm).</td></tr><tr><td style=\"white-space:nowrap\">power-hr-intercept<a name=\"cc-observations-power-hr-intercept\"> </a></td><td>Power-HR model intercept</td><td>Intercept of the power↔HR linear fit (W).</td></tr><tr><td style=\"white-space:nowrap\">power-hr-r2<a name=\"cc-observations-power-hr-r2\"> </a></td><td>Power-HR model R-squared</td><td>Coefficient of determination of the power↔HR fit (0-1).</td></tr><tr><td style=\"white-space:nowrap\">power-hr-n<a name=\"cc-observations-power-hr-n\"> </a></td><td>Power-HR model sample count</td><td>Number of paired power+HR samples in the fit.</td></tr><tr><td style=\"white-space:nowrap\">power-hr-window-days<a name=\"cc-observations-power-hr-window-days\"> </a></td><td>Power-HR model window</td><td>Trailing window the fit's samples were collected over (days).</td></tr><tr><td style=\"white-space:nowrap\">lthr<a name=\"cc-observations-lthr\"> </a></td><td>Heart rate threshold</td><td>Athlete's lactate-threshold heart rate anchor (beats/min), from a field test or athlete acceptance (ADR 0090).</td></tr><tr><td style=\"white-space:nowrap\">tss<a name=\"cc-observations-tss\"> </a></td><td>Load</td><td>Per-activity training-load score. Internal alias: TSS.</td></tr><tr><td style=\"white-space:nowrap\">ctl<a name=\"cc-observations-ctl\"> </a></td><td>Fitness</td><td>42-day EWMA of daily Load. Internal alias: CTL.</td></tr><tr><td style=\"white-space:nowrap\">atl<a name=\"cc-observations-atl\"> </a></td><td>Fatigue</td><td>7-day EWMA of daily Load. Internal alias: ATL.</td></tr><tr><td style=\"white-space:nowrap\">tsb<a name=\"cc-observations-tsb\"> </a></td><td>Form</td><td>Fitness minus Fatigue. Internal alias: TSB.</td></tr><tr><td style=\"white-space:nowrap\">ramp-rate<a name=\"cc-observations-ramp-rate\"> </a></td><td>Fitness ramp rate</td><td>Change in Fitness per week.</td></tr><tr><td style=\"white-space:nowrap\">pmc-series<a name=\"cc-observations-pmc-series\"> </a></td><td>Load & Form series</td><td>Weekly Fitness/Fatigue/Form/Load series (one Observation per ISO week, four components as valueSampledData). ADR 0059.</td></tr><tr><td style=\"white-space:nowrap\">power-zone-time<a name=\"cc-observations-power-zone-time\"> </a></td><td>Time in power zone</td><td>Measured seconds per fixed 5-% FTP bucket (pct-<floor> components; the FTP watts denominator rode as an ftp component).</td></tr><tr><td style=\"white-space:nowrap\">hr-zone-time<a name=\"cc-observations-hr-zone-time\"> </a></td><td>Time in heart-rate zone</td><td>Measured seconds per fixed 5-% HRmax bucket (pct-<floor> components; the HRmax denominator rode as an hrmax component).</td></tr><tr><td style=\"white-space:nowrap\">hrmax<a name=\"cc-observations-hrmax\"> </a></td><td>HRmax denominator</td><td>The HRmax (beats/min) a percentage raster was computed against at ingest — pins the bucket edges so readers fold exactly.</td></tr><tr><td style=\"white-space:nowrap\">cadence<a name=\"cc-observations-cadence\"> </a></td><td>Cadence</td><td>Pedalling cadence (rpm).</td></tr><tr><td style=\"white-space:nowrap\">avg-cadence<a name=\"cc-observations-avg-cadence\"> </a></td><td>Average cadence</td><td>Per-activity mean cadence (rpm).</td></tr><tr><td style=\"white-space:nowrap\">distance<a name=\"cc-observations-distance\"> </a></td><td>Distance</td><td>Per-activity distance (m).</td></tr><tr><td style=\"white-space:nowrap\">elevation-gain<a name=\"cc-observations-elevation-gain\"> </a></td><td>Elevation gain</td><td>Per-activity elevation gain (m).</td></tr><tr><td style=\"white-space:nowrap\">carbs-used<a name=\"cc-observations-carbs-used\"> </a></td><td>Carbohydrates oxidized</td><td>Estimated carbohydrate oxidation (g).</td></tr><tr><td style=\"white-space:nowrap\">variability-index<a name=\"cc-observations-variability-index\"> </a></td><td>Variability index</td><td>Weighted Power / average power.</td></tr><tr><td style=\"white-space:nowrap\">decoupling-pw-hr<a name=\"cc-observations-decoupling-pw-hr\"> </a></td><td>Pw:Hr decoupling</td><td>Aerobic decoupling: first-half vs second-half power:HR drift (%).</td></tr><tr><td style=\"white-space:nowrap\">polarization-index<a name=\"cc-observations-polarization-index\"> </a></td><td>Polarization index</td><td>Log-based intensity-distribution index.</td></tr><tr><td style=\"white-space:nowrap\">efficiency-factor<a name=\"cc-observations-efficiency-factor\"> </a></td><td>Efficiency factor</td><td>Weighted Power / average HR.</td></tr><tr><td style=\"white-space:nowrap\">wbal-depletion-max<a name=\"cc-observations-wbal-depletion-max\"> </a></td><td>Max W-prime balance depletion</td><td>Peak W-prime depletion over the ride (J).</td></tr><tr><td style=\"white-space:nowrap\">lr-balance<a name=\"cc-observations-lr-balance\"> </a></td><td>Left-right power balance</td><td>Right-side power share (%).</td></tr><tr><td style=\"white-space:nowrap\">lap<a name=\"cc-observations-lap\"> </a></td><td>Lap</td><td>One provider lap as a component Observation (index, type, duration, and the per-lap metric values), derivedFrom the Activity Group. ADR 0176.</td></tr><tr><td style=\"white-space:nowrap\">lap-index<a name=\"cc-observations-lap-index\"> </a></td><td>Lap index</td><td>Zero-based provider lap index.</td></tr><tr><td style=\"white-space:nowrap\">lap-type<a name=\"cc-observations-lap-type\"> </a></td><td>Lap type</td><td>Provider lap type (e.g. ACTIVE, REST, lap_button).</td></tr><tr><td style=\"white-space:nowrap\">durability-decline<a name=\"cc-observations-durability-decline\"> </a></td><td>Fatigued power decline</td><td>Matched-duration fresh-vs-fatigued mean-maximal power decline after the protocol kJ dose (%), one Observation per test duration, derivedFrom the test ride.</td></tr><tr><td style=\"white-space:nowrap\">durability-test-duration<a name=\"cc-observations-durability-test-duration\"> </a></td><td>Durability test duration</td><td>The matched duration (s) the fresh/fatigued pair was measured at.</td></tr><tr><td style=\"white-space:nowrap\">durability-dose-kj<a name=\"cc-observations-durability-dose-kj\"> </a></td><td>Durability test dose</td><td>The accumulated mechanical work (kJ) that preceded the fatigued effort.</td></tr><tr><td style=\"white-space:nowrap\">durability-fresh-w<a name=\"cc-observations-durability-fresh-w\"> </a></td><td>Durability fresh power</td><td>The fresh-state matched-duration best power (W).</td></tr><tr><td style=\"white-space:nowrap\">durability-fatigued-w<a name=\"cc-observations-durability-fatigued-w\"> </a></td><td>Durability fatigued power</td><td>The post-dose matched-duration best power (W).</td></tr><tr><td style=\"white-space:nowrap\">lap-duration<a name=\"cc-observations-lap-duration\"> </a></td><td>Lap duration</td><td>Lap elapsed duration (s), including pauses.</td></tr><tr><td style=\"white-space:nowrap\">lap-moving-time<a name=\"cc-observations-lap-moving-time\"> </a></td><td>Lap moving time</td><td>Lap moving duration (s), pauses excluded.</td></tr><tr><td style=\"white-space:nowrap\">max-power<a name=\"cc-observations-max-power\"> </a></td><td>Max power</td><td>Per-lap (or per-window) maximum power (W).</td></tr><tr><td style=\"white-space:nowrap\">temperature<a name=\"cc-observations-temperature\"> </a></td><td>Temperature</td><td>Per-sample air temperature (°C).</td></tr><tr><td style=\"white-space:nowrap\">respiration<a name=\"cc-observations-respiration\"> </a></td><td>Respiration rate</td><td>Per-sample respiration rate (breaths/min).</td></tr><tr><td style=\"white-space:nowrap\">elevation<a name=\"cc-observations-elevation\"> </a></td><td>Elevation</td><td>Per-sample altitude/elevation (m).</td></tr><tr><td style=\"white-space:nowrap\">speed<a name=\"cc-observations-speed\"> </a></td><td>Speed</td><td>Per-sample speed (m/s).</td></tr><tr><td style=\"white-space:nowrap\">position<a name=\"cc-observations-position\"> </a></td><td>Route</td><td>Per-sample GPS position (latitude, longitude pairs, °). dimensions=2.</td></tr><tr><td style=\"white-space:nowrap\">torque<a name=\"cc-observations-torque\"> </a></td><td>Torque</td><td>Per-sample crank torque (N·m).</td></tr><tr><td style=\"white-space:nowrap\">trainer-power<a name=\"cc-observations-trainer-power\"> </a></td><td>Trainer power</td><td>Per-sample power (W) reported by the trainer itself (z_trainer) — the power-match bias estimator's second observation.</td></tr><tr><td style=\"white-space:nowrap\">command-power<a name=\"cc-observations-command-power\"> </a></td><td>Commanded power</td><td>Per-sample ERG target (W) the player's outer control loop wrote to the trainer.</td></tr><tr><td style=\"white-space:nowrap\">route-fingerprint<a name=\"cc-observations-route-fingerprint\"> </a></td><td>Route fingerprint</td><td>The per-ride comparability record: outdoor resampled GPS track (dimensions=2) + scalar route facts, or the indoor interval-structure signature; derivedFrom the Activity Group. ADR 0225.</td></tr><tr><td style=\"white-space:nowrap\">route-indoor<a name=\"cc-observations-route-indoor\"> </a></td><td>Route indoor</td><td>Whether the fingerprint's session was indoor (true) or outdoor (false).</td></tr><tr><td style=\"white-space:nowrap\">route-distance-m<a name=\"cc-observations-route-distance-m\"> </a></td><td>Route distance</td><td>The route's along-track length (m) from the resampled track.</td></tr><tr><td style=\"white-space:nowrap\">route-start-lat<a name=\"cc-observations-route-start-lat\"> </a></td><td>Route start latitude</td><td>The resampled track's first latitude (°).</td></tr><tr><td style=\"white-space:nowrap\">route-start-lon<a name=\"cc-observations-route-start-lon\"> </a></td><td>Route start longitude</td><td>The resampled track's first longitude (°).</td></tr><tr><td style=\"white-space:nowrap\">route-end-lat<a name=\"cc-observations-route-end-lat\"> </a></td><td>Route end latitude</td><td>The resampled track's last latitude (°).</td></tr><tr><td style=\"white-space:nowrap\">route-end-lon<a name=\"cc-observations-route-end-lon\"> </a></td><td>Route end longitude</td><td>The resampled track's last longitude (°).</td></tr><tr><td style=\"white-space:nowrap\">route-lap-count<a name=\"cc-observations-route-lap-count\"> </a></td><td>Route lap count</td><td>The indoor session's executed lap count.</td></tr><tr><td style=\"white-space:nowrap\">route-structure<a name=\"cc-observations-route-structure\"> </a></td><td>Route structure</td><td>The indoor session's quantized interval-structure signature (duration bucket × commanded-watts bucket per lap, ';'-joined).</td></tr><tr><td style=\"white-space:nowrap\">mmp<a name=\"cc-observations-mmp\"> </a></td><td>Mean maximal power</td><td>Best mean-maximal power by duration for a ride; one component per standard duration (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-60<a name=\"cc-observations-mmp-60\"> </a></td><td>MMP 1 min</td><td>Best 1-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-120<a name=\"cc-observations-mmp-120\"> </a></td><td>MMP 2 min</td><td>Best 2-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-180<a name=\"cc-observations-mmp-180\"> </a></td><td>MMP 3 min</td><td>Best 3-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-300<a name=\"cc-observations-mmp-300\"> </a></td><td>MMP 5 min</td><td>Best 5-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-480<a name=\"cc-observations-mmp-480\"> </a></td><td>MMP 8 min</td><td>Best 8-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-600<a name=\"cc-observations-mmp-600\"> </a></td><td>MMP 10 min</td><td>Best 10-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-720<a name=\"cc-observations-mmp-720\"> </a></td><td>MMP 12 min</td><td>Best 12-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-1200<a name=\"cc-observations-mmp-1200\"> </a></td><td>MMP 20 min</td><td>Best 20-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-1800<a name=\"cc-observations-mmp-1800\"> </a></td><td>MMP 30 min</td><td>Best 30-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-3600<a name=\"cc-observations-mmp-3600\"> </a></td><td>MMP 60 min</td><td>Best 60-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-5400<a name=\"cc-observations-mmp-5400\"> </a></td><td>MMP 90 min</td><td>Best 90-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-7200<a name=\"cc-observations-mmp-7200\"> </a></td><td>MMP 120 min</td><td>Best 120-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-9000<a name=\"cc-observations-mmp-9000\"> </a></td><td>MMP 150 min</td><td>Best 150-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-10800<a name=\"cc-observations-mmp-10800\"> </a></td><td>MMP 180 min</td><td>Best 180-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-12600<a name=\"cc-observations-mmp-12600\"> </a></td><td>MMP 210 min</td><td>Best 210-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-14400<a name=\"cc-observations-mmp-14400\"> </a></td><td>MMP 240 min</td><td>Best 240-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-16200<a name=\"cc-observations-mmp-16200\"> </a></td><td>MMP 270 min</td><td>Best 270-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">mmp-18000<a name=\"cc-observations-mmp-18000\"> </a></td><td>MMP 300 min</td><td>Best 300-minute mean power (W).</td></tr><tr><td style=\"white-space:nowrap\">hrv-rmssd<a name=\"cc-observations-hrv-rmssd\"> </a></td><td>HRV rMSSD (overnight)</td><td>Overnight rMSSD (ms); no LOINC exists, method = overnight-rmssd.</td></tr><tr><td style=\"white-space:nowrap\">body-battery-charged<a name=\"cc-observations-body-battery-charged\"> </a></td><td>Body Battery charged</td><td>Garmin Body Battery charge gained (0-100).</td></tr><tr><td style=\"white-space:nowrap\">body-battery-low<a name=\"cc-observations-body-battery-low\"> </a></td><td>Body Battery low</td><td>Garmin Body Battery daily low (0-100).</td></tr><tr><td style=\"white-space:nowrap\">body-battery-high<a name=\"cc-observations-body-battery-high\"> </a></td><td>Body Battery high</td><td>Garmin Body Battery daily high (0-100).</td></tr><tr><td style=\"white-space:nowrap\">body-battery-drained<a name=\"cc-observations-body-battery-drained\"> </a></td><td>Body Battery drained</td><td>Garmin Body Battery charge drained (0-100).</td></tr><tr><td style=\"white-space:nowrap\">body-battery-most-recent<a name=\"cc-observations-body-battery-most-recent\"> </a></td><td>Body Battery most recent</td><td>Most recent Garmin Body Battery (0-100).</td></tr><tr><td style=\"white-space:nowrap\">garmin-stress-avg<a name=\"cc-observations-garmin-stress-avg\"> </a></td><td>Garmin stress (average)</td><td>Garmin all-day stress average (0-100).</td></tr><tr><td style=\"white-space:nowrap\">garmin-stress-max<a name=\"cc-observations-garmin-stress-max\"> </a></td><td>Garmin stress (max)</td><td>Garmin all-day stress maximum (0-100).</td></tr><tr><td style=\"white-space:nowrap\">garmin-stress-duration<a name=\"cc-observations-garmin-stress-duration\"> </a></td><td>Garmin stress duration</td><td>Garmin all-day stress duration (s).</td></tr><tr><td style=\"white-space:nowrap\">garmin-sleep-score<a name=\"cc-observations-garmin-sleep-score\"> </a></td><td>Garmin sleep score</td><td>Garmin sleep score (0-100).</td></tr><tr><td style=\"white-space:nowrap\">sleep-score<a name=\"cc-observations-sleep-score\"> </a></td><td>Sleep score</td><td>Source-agnostic sleep score (0-100). Garmin-ingested scores keep #garmin-sleep-score; intervals.icu and later sources use this code (ADR 0081).</td></tr><tr><td style=\"white-space:nowrap\">garmin-hrv-status<a name=\"cc-observations-garmin-hrv-status\"> </a></td><td>Garmin HRV status</td><td>LEGACY (issue #641, ADR 0145): superseded by the source-agnostic #hrv-status. Kept so founder-era dev readings stay valid; new writes never use it.</td></tr><tr><td style=\"white-space:nowrap\">hrv-status<a name=\"cc-observations-hrv-status\"> </a></td><td>HRV status</td><td>Provider-reported overnight-HRV status band in the provider's own vocabulary (BALANCED / UNBALANCED / LOW / HIGH for Garmin). A reconciled input beside Soigneur's own HRV-band classification (ADR 0145) — never the coach's verdict by itself.</td></tr><tr><td style=\"white-space:nowrap\">readiness<a name=\"cc-observations-readiness\"> </a></td><td>Readiness score</td><td>Provider-computed daily readiness score (intervals.icu imports Polar's nightly-recharge status or an app score under this field) — a reconciled secondary input; Soigneur's leading readiness mechanics are its own HRV-band and Form-zone classifications (issue #641, ADR 0145).</td></tr><tr><td style=\"white-space:nowrap\">body-water-pct<a name=\"cc-observations-body-water-pct\"> </a></td><td>Body water percentage</td><td>Scale-derived body water (%).</td></tr><tr><td style=\"white-space:nowrap\">muscle-mass<a name=\"cc-observations-muscle-mass\"> </a></td><td>Muscle mass</td><td>Scale-derived muscle mass (kg).</td></tr><tr><td style=\"white-space:nowrap\">bone-mass<a name=\"cc-observations-bone-mass\"> </a></td><td>Bone mass</td><td>Scale-derived bone mass (kg).</td></tr><tr><td style=\"white-space:nowrap\">visceral-fat<a name=\"cc-observations-visceral-fat\"> </a></td><td>Visceral fat</td><td>Scale-derived visceral-fat rating.</td></tr><tr><td style=\"white-space:nowrap\">metabolic-age<a name=\"cc-observations-metabolic-age\"> </a></td><td>Metabolic age</td><td>Scale-derived metabolic age (a).</td></tr><tr><td style=\"white-space:nowrap\">training-block-review<a name=\"cc-observations-training-block-review\"> </a></td><td>Training-block review</td><td>Composed plan-outcome verdict over a training block.</td></tr><tr><td style=\"white-space:nowrap\">truncated-block-review<a name=\"cc-observations-truncated-block-review\"> </a></td><td>Truncated block review</td><td>The deterministic abbreviated outcome for a block cut mid-flight by a structural supersession (ADR 0198): the athlete-confirmed mandate + executed summary, never a composed verdict — so read_plan_outcomes is never empty for a successor build.</td></tr><tr><td style=\"white-space:nowrap\">experiment-review<a name=\"cc-observations-experiment-review\"> </a></td><td>Experiment review</td><td>Composed outcome verdict over a fueling/position/equipment experiment.</td></tr><tr><td style=\"white-space:nowrap\">rolling-baseline<a name=\"cc-observations-rolling-baseline\"> </a></td><td>Rolling baseline</td><td>Rolling-baseline derived value (method marker).</td></tr><tr><td style=\"white-space:nowrap\">life-log<a name=\"cc-observations-life-log\"> </a></td><td>Life-log event</td><td>A dated life event the coach records from chat (a new job, a crash, a stressful project) — episodic memory the timed reader returns, distinct from the physiological diary.</td></tr><tr><td style=\"white-space:nowrap\">day-call<a name=\"cc-observations-day-call\"> </a></td><td>Day call</td><td>The briefing's machine-readable verdict for the athlete-local day — one per athlete-day; gates the home schedule CTA and grounds the workout designer.</td></tr><tr><td style=\"white-space:nowrap\">day-call-headline<a name=\"cc-observations-day-call-headline\"> </a></td><td>Day call headline</td><td>The briefing's decision in one sentence — the coach call card's headline (a CcDayCallObservation component).</td></tr><tr><td style=\"white-space:nowrap\">day-call-reason<a name=\"cc-observations-day-call-reason\"> </a></td><td>Day call reason</td><td>The short why behind the day call — the coach call card's reason line (a CcDayCallObservation component).</td></tr><tr><td style=\"white-space:nowrap\">day-call-plan-action<a name=\"cc-observations-day-call-plan-action\"> </a></td><td>Day call plan action</td><td>What the coach did about the plan behind the day call (ADR 0154) — `edited` (the session changed in the same turn), `suggest_add` (an open-day add the athlete's button triggers), or `hint` (a could-do said in prose only). Absent = no plan action.</td></tr></table></div>"
},
"url" : "https://fhir.soigneur.coach/fhir/CodeSystem/cc-observations",
"version" : "0.1.0",
"name" : "CcObservations",
"title" : "Soigneur Observation Codes (cycling metrics without LOINC)",
"status" : "active",
"experimental" : false,
"date" : "2026-11-14T19:13:43+00:00",
"publisher" : "Soigneur",
"contact" : [
{
"name" : "Soigneur",
"telecom" : [
{
"system" : "url",
"value" : "https://soigneur.coach"
}
]
}
],
"description" : "Cycling / training metrics that have no LOINC concept (05 14.4). The\n`Code` identifiers are internal, stable machine keys (`np`, `if`, `tss`, `ctl`, `atl`,\n`tsb`, …). The `Display` strings are the trademark-safe product vocabulary (15 1.1):\nLoad, Weighted Power, Intensity, Fitness, Fatigue, Form — never the TrainingPeaks marks\n(TSS, NP, IF, TSB, PMC).",
"jurisdiction" : [
{
"coding" : [
{
"system" : "urn:iso:std:iso:3166",
"code" : "DE",
"display" : "Germany"
}
]
}
],
"copyright" : "Copyright (c) Soigneur. Licensed under CC0-1.0 (public domain dedication). FHIR(R) is the registered trademark of HL7 and is used with permission.",
"caseSensitive" : true,
"content" : "complete",
"count" : 110,
"concept" : [
{
"code" : "ftp",
"display" : "Functional Threshold Power",
"definition" : "Athlete-set threshold-power anchor (W)."
},
{
"code" : "eftp",
"display" : "Estimated FTP",
"definition" : "Ratchet-estimated FTP from the power-duration curve (W)."
},
{
"code" : "w-prime",
"display" : "W-prime (anaerobic work capacity)",
"definition" : "Anaerobic work capacity above CP (J)."
},
{
"code" : "cp",
"display" : "Critical power",
"definition" : "Morton 2-parameter critical-power estimate (W)."
},
{
"code" : "p-max",
"display" : "Maximal aerobic power",
"definition" : "Maximal aerobic power (W)."
},
{
"code" : "avg-power",
"display" : "Average power",
"definition" : "Per-activity mean power (W)."
},
{
"code" : "np",
"display" : "Weighted Power",
"definition" : "30 s-smoothed 4th-power power (W). Internal alias: NP."
},
{
"code" : "if",
"display" : "Intensity",
"definition" : "Weighted Power / FTP ratio. Internal alias: IF."
},
{
"code" : "power-hr-model",
"display" : "Power-HR model",
"definition" : "Per-athlete linear power↔HR model fitted from rides with both channels; components carry slope/intercept/R²/n/window (W per bpm)."
},
{
"code" : "power-hr-slope",
"display" : "Power-HR model slope",
"definition" : "Slope of the power↔HR linear fit (W per bpm)."
},
{
"code" : "power-hr-intercept",
"display" : "Power-HR model intercept",
"definition" : "Intercept of the power↔HR linear fit (W)."
},
{
"code" : "power-hr-r2",
"display" : "Power-HR model R-squared",
"definition" : "Coefficient of determination of the power↔HR fit (0-1)."
},
{
"code" : "power-hr-n",
"display" : "Power-HR model sample count",
"definition" : "Number of paired power+HR samples in the fit."
},
{
"code" : "power-hr-window-days",
"display" : "Power-HR model window",
"definition" : "Trailing window the fit's samples were collected over (days)."
},
{
"code" : "lthr",
"display" : "Heart rate threshold",
"definition" : "Athlete's lactate-threshold heart rate anchor (beats/min), from a field test or athlete acceptance (ADR 0090)."
},
{
"code" : "tss",
"display" : "Load",
"definition" : "Per-activity training-load score. Internal alias: TSS."
},
{
"code" : "ctl",
"display" : "Fitness",
"definition" : "42-day EWMA of daily Load. Internal alias: CTL."
},
{
"code" : "atl",
"display" : "Fatigue",
"definition" : "7-day EWMA of daily Load. Internal alias: ATL."
},
{
"code" : "tsb",
"display" : "Form",
"definition" : "Fitness minus Fatigue. Internal alias: TSB."
},
{
"code" : "ramp-rate",
"display" : "Fitness ramp rate",
"definition" : "Change in Fitness per week."
},
{
"code" : "pmc-series",
"display" : "Load & Form series",
"definition" : "Weekly Fitness/Fatigue/Form/Load series (one Observation per ISO week, four components as valueSampledData). ADR 0059."
},
{
"code" : "power-zone-time",
"display" : "Time in power zone",
"definition" : "Measured seconds per fixed 5-% FTP bucket (pct-<floor> components; the FTP watts denominator rode as an ftp component)."
},
{
"code" : "hr-zone-time",
"display" : "Time in heart-rate zone",
"definition" : "Measured seconds per fixed 5-% HRmax bucket (pct-<floor> components; the HRmax denominator rode as an hrmax component)."
},
{
"code" : "hrmax",
"display" : "HRmax denominator",
"definition" : "The HRmax (beats/min) a percentage raster was computed against at ingest — pins the bucket edges so readers fold exactly."
},
{
"code" : "cadence",
"display" : "Cadence",
"definition" : "Pedalling cadence (rpm)."
},
{
"code" : "avg-cadence",
"display" : "Average cadence",
"definition" : "Per-activity mean cadence (rpm)."
},
{
"code" : "distance",
"display" : "Distance",
"definition" : "Per-activity distance (m)."
},
{
"code" : "elevation-gain",
"display" : "Elevation gain",
"definition" : "Per-activity elevation gain (m)."
},
{
"code" : "carbs-used",
"display" : "Carbohydrates oxidized",
"definition" : "Estimated carbohydrate oxidation (g)."
},
{
"code" : "variability-index",
"display" : "Variability index",
"definition" : "Weighted Power / average power."
},
{
"code" : "decoupling-pw-hr",
"display" : "Pw:Hr decoupling",
"definition" : "Aerobic decoupling: first-half vs second-half power:HR drift (%)."
},
{
"code" : "polarization-index",
"display" : "Polarization index",
"definition" : "Log-based intensity-distribution index."
},
{
"code" : "efficiency-factor",
"display" : "Efficiency factor",
"definition" : "Weighted Power / average HR."
},
{
"code" : "wbal-depletion-max",
"display" : "Max W-prime balance depletion",
"definition" : "Peak W-prime depletion over the ride (J)."
},
{
"code" : "lr-balance",
"display" : "Left-right power balance",
"definition" : "Right-side power share (%)."
},
{
"code" : "lap",
"display" : "Lap",
"definition" : "One provider lap as a component Observation (index, type, duration, and the per-lap metric values), derivedFrom the Activity Group. ADR 0176."
},
{
"code" : "lap-index",
"display" : "Lap index",
"definition" : "Zero-based provider lap index."
},
{
"code" : "lap-type",
"display" : "Lap type",
"definition" : "Provider lap type (e.g. ACTIVE, REST, lap_button)."
},
{
"code" : "durability-decline",
"display" : "Fatigued power decline",
"definition" : "Matched-duration fresh-vs-fatigued mean-maximal power decline after the protocol kJ dose (%), one Observation per test duration, derivedFrom the test ride."
},
{
"code" : "durability-test-duration",
"display" : "Durability test duration",
"definition" : "The matched duration (s) the fresh/fatigued pair was measured at."
},
{
"code" : "durability-dose-kj",
"display" : "Durability test dose",
"definition" : "The accumulated mechanical work (kJ) that preceded the fatigued effort."
},
{
"code" : "durability-fresh-w",
"display" : "Durability fresh power",
"definition" : "The fresh-state matched-duration best power (W)."
},
{
"code" : "durability-fatigued-w",
"display" : "Durability fatigued power",
"definition" : "The post-dose matched-duration best power (W)."
},
{
"code" : "lap-duration",
"display" : "Lap duration",
"definition" : "Lap elapsed duration (s), including pauses."
},
{
"code" : "lap-moving-time",
"display" : "Lap moving time",
"definition" : "Lap moving duration (s), pauses excluded."
},
{
"code" : "max-power",
"display" : "Max power",
"definition" : "Per-lap (or per-window) maximum power (W)."
},
{
"code" : "temperature",
"display" : "Temperature",
"definition" : "Per-sample air temperature (°C)."
},
{
"code" : "respiration",
"display" : "Respiration rate",
"definition" : "Per-sample respiration rate (breaths/min)."
},
{
"code" : "elevation",
"display" : "Elevation",
"definition" : "Per-sample altitude/elevation (m)."
},
{
"code" : "speed",
"display" : "Speed",
"definition" : "Per-sample speed (m/s)."
},
{
"code" : "position",
"display" : "Route",
"definition" : "Per-sample GPS position (latitude, longitude pairs, °). dimensions=2."
},
{
"code" : "torque",
"display" : "Torque",
"definition" : "Per-sample crank torque (N·m)."
},
{
"code" : "trainer-power",
"display" : "Trainer power",
"definition" : "Per-sample power (W) reported by the trainer itself (z_trainer) — the power-match bias estimator's second observation."
},
{
"code" : "command-power",
"display" : "Commanded power",
"definition" : "Per-sample ERG target (W) the player's outer control loop wrote to the trainer."
},
{
"code" : "route-fingerprint",
"display" : "Route fingerprint",
"definition" : "The per-ride comparability record: outdoor resampled GPS track (dimensions=2) + scalar route facts, or the indoor interval-structure signature; derivedFrom the Activity Group. ADR 0225."
},
{
"code" : "route-indoor",
"display" : "Route indoor",
"definition" : "Whether the fingerprint's session was indoor (true) or outdoor (false)."
},
{
"code" : "route-distance-m",
"display" : "Route distance",
"definition" : "The route's along-track length (m) from the resampled track."
},
{
"code" : "route-start-lat",
"display" : "Route start latitude",
"definition" : "The resampled track's first latitude (°)."
},
{
"code" : "route-start-lon",
"display" : "Route start longitude",
"definition" : "The resampled track's first longitude (°)."
},
{
"code" : "route-end-lat",
"display" : "Route end latitude",
"definition" : "The resampled track's last latitude (°)."
},
{
"code" : "route-end-lon",
"display" : "Route end longitude",
"definition" : "The resampled track's last longitude (°)."
},
{
"code" : "route-lap-count",
"display" : "Route lap count",
"definition" : "The indoor session's executed lap count."
},
{
"code" : "route-structure",
"display" : "Route structure",
"definition" : "The indoor session's quantized interval-structure signature (duration bucket × commanded-watts bucket per lap, ';'-joined)."
},
{
"code" : "mmp",
"display" : "Mean maximal power",
"definition" : "Best mean-maximal power by duration for a ride; one component per standard duration (W)."
},
{
"code" : "mmp-60",
"display" : "MMP 1 min",
"definition" : "Best 1-minute mean power (W)."
},
{
"code" : "mmp-120",
"display" : "MMP 2 min",
"definition" : "Best 2-minute mean power (W)."
},
{
"code" : "mmp-180",
"display" : "MMP 3 min",
"definition" : "Best 3-minute mean power (W)."
},
{
"code" : "mmp-300",
"display" : "MMP 5 min",
"definition" : "Best 5-minute mean power (W)."
},
{
"code" : "mmp-480",
"display" : "MMP 8 min",
"definition" : "Best 8-minute mean power (W)."
},
{
"code" : "mmp-600",
"display" : "MMP 10 min",
"definition" : "Best 10-minute mean power (W)."
},
{
"code" : "mmp-720",
"display" : "MMP 12 min",
"definition" : "Best 12-minute mean power (W)."
},
{
"code" : "mmp-1200",
"display" : "MMP 20 min",
"definition" : "Best 20-minute mean power (W)."
},
{
"code" : "mmp-1800",
"display" : "MMP 30 min",
"definition" : "Best 30-minute mean power (W)."
},
{
"code" : "mmp-3600",
"display" : "MMP 60 min",
"definition" : "Best 60-minute mean power (W)."
},
{
"code" : "mmp-5400",
"display" : "MMP 90 min",
"definition" : "Best 90-minute mean power (W)."
},
{
"code" : "mmp-7200",
"display" : "MMP 120 min",
"definition" : "Best 120-minute mean power (W)."
},
{
"code" : "mmp-9000",
"display" : "MMP 150 min",
"definition" : "Best 150-minute mean power (W)."
},
{
"code" : "mmp-10800",
"display" : "MMP 180 min",
"definition" : "Best 180-minute mean power (W)."
},
{
"code" : "mmp-12600",
"display" : "MMP 210 min",
"definition" : "Best 210-minute mean power (W)."
},
{
"code" : "mmp-14400",
"display" : "MMP 240 min",
"definition" : "Best 240-minute mean power (W)."
},
{
"code" : "mmp-16200",
"display" : "MMP 270 min",
"definition" : "Best 270-minute mean power (W)."
},
{
"code" : "mmp-18000",
"display" : "MMP 300 min",
"definition" : "Best 300-minute mean power (W)."
},
{
"code" : "hrv-rmssd",
"display" : "HRV rMSSD (overnight)",
"definition" : "Overnight rMSSD (ms); no LOINC exists, method = overnight-rmssd."
},
{
"code" : "body-battery-charged",
"display" : "Body Battery charged",
"definition" : "Garmin Body Battery charge gained (0-100)."
},
{
"code" : "body-battery-low",
"display" : "Body Battery low",
"definition" : "Garmin Body Battery daily low (0-100)."
},
{
"code" : "body-battery-high",
"display" : "Body Battery high",
"definition" : "Garmin Body Battery daily high (0-100)."
},
{
"code" : "body-battery-drained",
"display" : "Body Battery drained",
"definition" : "Garmin Body Battery charge drained (0-100)."
},
{
"code" : "body-battery-most-recent",
"display" : "Body Battery most recent",
"definition" : "Most recent Garmin Body Battery (0-100)."
},
{
"code" : "garmin-stress-avg",
"display" : "Garmin stress (average)",
"definition" : "Garmin all-day stress average (0-100)."
},
{
"code" : "garmin-stress-max",
"display" : "Garmin stress (max)",
"definition" : "Garmin all-day stress maximum (0-100)."
},
{
"code" : "garmin-stress-duration",
"display" : "Garmin stress duration",
"definition" : "Garmin all-day stress duration (s)."
},
{
"code" : "garmin-sleep-score",
"display" : "Garmin sleep score",
"definition" : "Garmin sleep score (0-100)."
},
{
"code" : "sleep-score",
"display" : "Sleep score",
"definition" : "Source-agnostic sleep score (0-100). Garmin-ingested scores keep #garmin-sleep-score; intervals.icu and later sources use this code (ADR 0081)."
},
{
"code" : "garmin-hrv-status",
"display" : "Garmin HRV status",
"definition" : "LEGACY (issue #641, ADR 0145): superseded by the source-agnostic #hrv-status. Kept so founder-era dev readings stay valid; new writes never use it."
},
{
"code" : "hrv-status",
"display" : "HRV status",
"definition" : "Provider-reported overnight-HRV status band in the provider's own vocabulary (BALANCED / UNBALANCED / LOW / HIGH for Garmin). A reconciled input beside Soigneur's own HRV-band classification (ADR 0145) — never the coach's verdict by itself."
},
{
"code" : "readiness",
"display" : "Readiness score",
"definition" : "Provider-computed daily readiness score (intervals.icu imports Polar's nightly-recharge status or an app score under this field) — a reconciled secondary input; Soigneur's leading readiness mechanics are its own HRV-band and Form-zone classifications (issue #641, ADR 0145)."
},
{
"code" : "body-water-pct",
"display" : "Body water percentage",
"definition" : "Scale-derived body water (%)."
},
{
"code" : "muscle-mass",
"display" : "Muscle mass",
"definition" : "Scale-derived muscle mass (kg)."
},
{
"code" : "bone-mass",
"display" : "Bone mass",
"definition" : "Scale-derived bone mass (kg)."
},
{
"code" : "visceral-fat",
"display" : "Visceral fat",
"definition" : "Scale-derived visceral-fat rating."
},
{
"code" : "metabolic-age",
"display" : "Metabolic age",
"definition" : "Scale-derived metabolic age (a)."
},
{
"code" : "training-block-review",
"display" : "Training-block review",
"definition" : "Composed plan-outcome verdict over a training block."
},
{
"code" : "truncated-block-review",
"display" : "Truncated block review",
"definition" : "The deterministic abbreviated outcome for a block cut mid-flight by a structural supersession (ADR 0198): the athlete-confirmed mandate + executed summary, never a composed verdict — so read_plan_outcomes is never empty for a successor build."
},
{
"code" : "experiment-review",
"display" : "Experiment review",
"definition" : "Composed outcome verdict over a fueling/position/equipment experiment."
},
{
"code" : "rolling-baseline",
"display" : "Rolling baseline",
"definition" : "Rolling-baseline derived value (method marker)."
},
{
"code" : "life-log",
"display" : "Life-log event",
"definition" : "A dated life event the coach records from chat (a new job, a crash, a stressful project) — episodic memory the timed reader returns, distinct from the physiological diary."
},
{
"code" : "day-call",
"display" : "Day call",
"definition" : "The briefing's machine-readable verdict for the athlete-local day — one per athlete-day; gates the home schedule CTA and grounds the workout designer."
},
{
"code" : "day-call-headline",
"display" : "Day call headline",
"definition" : "The briefing's decision in one sentence — the coach call card's headline (a CcDayCallObservation component)."
},
{
"code" : "day-call-reason",
"display" : "Day call reason",
"definition" : "The short why behind the day call — the coach call card's reason line (a CcDayCallObservation component)."
},
{
"code" : "day-call-plan-action",
"display" : "Day call plan action",
"definition" : "What the coach did about the plan behind the day call (ADR 0154) — `edited` (the session changed in the same turn), `suggest_add` (an open-day add the athlete's button triggers), or `hint` (a could-do said in prose only). Absent = no plan action."
}
]
}