addedInput schema / properties / marathonPr
Added value: +{
+ "description": "Marathon PR. Preferred over vo2max for deriving pace: the athlete's cost of running is back-solved from it, so their marathon-effort intensity reproduces this time exactly.",
+ "pattern": "^\\d{1,2}(:\\d{2}){1,2}$",
+ "type": "string"
+}
addedInput schema / properties / vo2max
Added value: +{
+ "description": "Used to derive pace at the target %HRR when no marathon PR is given.",
+ "maximum": 95,
+ "minimum": 20,
+ "type": "number"
+}
addedOutput schema / properties / dominantDriftCause
Added value: +{
+ "description": "Which cause contributes the most drift.",
+ "enum": [
+ "pacing",
+ "heat",
+ "fluid",
+ "none"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / driftBpmByCause
Added value: +{
+ "additionalProperties": false,
+ "description": "Total drift split by cause. Decoupling % alone conflates pacing strain with dehydration, and the two move in opposite directions with intensity.",
+ "properties": {
+ "fluidBpm": {
+ "description": "Drift from fluid deficit, bpm — rises with race DURATION, so it grows as intensity falls.",
+ "type": "number"
+ },
+ "pacingBpm": {
+ "description": "Drift from the intensity held, bpm — rises with effort.",
+ "type": "number"
+ },
+ "thermalBpm": {
+ "description": "Drift from ambient heat, bpm.",
+ "type": "number"
+ }
+ },
+ "required": [
+ "pacingBpm",
+ "thermalBpm",
+ "fluidBpm"
+ ],
+ "type": "object"
+}
addedOutput schema / properties / hrCeilingKm
Added value: +{
+ "anyOf": [
+ {
+ "type": "number"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Kilometre from which holding this pace would demand a heart rate above HRmax, or null. Non-null means the pace is not sustainable: the athlete slows instead."
+}
addedOutput schema / properties / marathonEffortPctHrr
Added value: +{
+ "description": "The %HRR that reproduces this athlete's marathon-effort oxygen uptake — their marathon race intensity.",
+ "type": "number"
+}
addedOutput schema / properties / paceSource
Added value: +{
+ "description": "What the pace was derived from. \"assumed\" means neither marathonPr nor vo2max was supplied and a recreational reference VO₂max was used — say so when reporting the finish time.",
+ "enum": [
+ "pr",
+ "vo2max",
+ "assumed"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / vo2maxUsed
Added value: +{
+ "description": "VO₂max the pace was derived from, mL·kg⁻¹·min⁻¹.",
+ "type": "number"
+}
changedOutput schema / required
Previous value: -[
- "input",
- "finishTime",
- "pacingKmh",
- "hrMax",
- "hrStart",
- "lt1",
- "lt2",
- "lt2BreachKm",
- "totalDriftBpm",
- "decouplingPct",
- "actualSweatRateLPerHr",
- "totalFluidDeficitL",
- "totalSodiumDeficitMg",
- "finalPlasmaNa",
- "pctBodyWeightLost",
- "checkpoints"
-]New value: +[
+ "input",
+ "finishTime",
+ "pacingKmh",
+ "hrMax",
+ "hrStart",
+ "lt1",
+ "lt2",
+ "lt2BreachKm",
+ "hrCeilingKm",
+ "totalDriftBpm",
+ "decouplingPct",
+ "driftBpmByCause",
+ "dominantDriftCause",
+ "paceSource",
+ "vo2maxUsed",
+ "marathonEffortPctHrr",
+ "actualSweatRateLPerHr",
+ "totalFluidDeficitL",
+ "totalSodiumDeficitMg",
+ "finalPlasmaNa",
+ "pctBodyWeightLost",
+ "checkpoints"
+]