session_series
Returns a run as 30-second bins for over-the-run analysis, covering pace, heart rate, elevation, cadence, and run/walk/stand time by elapsed time and distance, with optional running dynamics.
Instructions
§17.1b the session as a 30 s binned series — for "over the run" reasoning.
Args:
run: run_id, activity_id or Garmin file id. Empty means the latest run.
include_dynamics: add the per-bin running-dynamics block (below).
Default false: it is the bulk of the payload, and when false it is
absent from EVERY bin, with `dynamics_included: false` saying so.
`dynamics_available` is reported either way.
NULL-DISTANCE BINS (D4). A bin with fewer than two records that carry a
distance -- a GPS gap, an indoor stretch -- reports only the DISTANCE-
DERIVED fields null (distance_start_m/end_m, mps, pace_per_mile), with
`distance_reason` saying how many distance records it had. avg_hr,
steps_per_min, elevation_m, n_records and coverage are still reported
from the records the bin does hold. A bin with NO records at all (past
the last record, inside a long gap) is null throughout with n_records 0.
(A stationary ride is the opposite case: its odometer is a constant 0.0,
not null, so its bins report mps 0.0 -- a known defect, CLAUDE.md §18.)
Pace, HR, elevation, cadence and run/walk/stand state per bin, indexed by
BOTH elapsed seconds and path distance, so "at minute 40" and "at mile 4"
are both answerable from one payload.
STATE IS SECONDS, NOT A LABEL. Each bin carries `run_s`, `walk_s` and
`stand_s`. Many run/walk walks are shorter than a 30 s bin, so a majority
label would erase much of the walking — and on a run/walk session a large
share of bins contain both running and walking.
Elevation is DEM-gated and absent on more than half the corpus; read
`elevation_available`. No position is ever emitted.
RUNNING DYNAMICS PER BIN (§17.1b-bis): stance_time_ms, step_length_mm,
vertical_oscillation_mm and vertical_ratio_pct, each {value, n, unit}.
Garmin's units, unchanged -- millimetres, milliseconds, percent -- and
vertical_ratio is the DEVICE'S OWN field, never recomputed from the other
two.
rwd_run RECORDS ONLY, which is a DIFFERENT RECORD SET from the one behind
`steps_per_min` in the same bin (all records with cadence > 0, running and
walking pooled). `filters.gait_conventions` states each field's, because
reading them as one gait is the mistake the two conventions invite.
n IS PER FIELD. The device drops the four independently -- one field can
sit on a handful of records where another sits on thousands -- so a
per-bin n would misstate the evidence behind a field by orders of
magnitude.
THREE ABSENCES, NEVER 0.0, all distinguishable: `dynamics_reason`
"no_device_channel" (this activity carries none -- FR245, phone file, or a
non-running sport), "no_running_in_bin" (the device records them, this bin
has no running), or null with n 0 (running present, device wrote nothing
for that field here).
`flags_available` says whether §15.4 flags could be applied. Where
records_enriched covers the run, flagged records are excluded; where it
does not, every record is included -- the same figure with and without
flags is NOT the same quantity, so the payload says which it is rather
than refusing the run.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | ||
| last_n | No | ||
| cluster | No | ||
| end_date | No | ||
| run_type | No | ||
| direction | No | ||
| segment_id | No | ||
| start_date | No | ||
| include_dynamics | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |