Skip to content

Releases: eschizoid/stride

v0.8.0

Choose a tag to compare

@github-actions github-actions released this 24 Aug 19:39
6ca91f7

0.8.0 (2026-08-24)

Features

  • backfill answers --json with an envelope instead of prose (#223) (8a526a3)
  • command discovery declares which error codes a form can return (#256) (1d9e790)
  • doctor reports what analyze would recompute, and why it cannot (#241) (b65312a)
  • plan reports data freshness so a coach need not call doctor (#237) (f9767f5)
  • stride sync is the only command that talks to Strava (#233) (d3f0215)
  • sync reports undecodable stream bodies instead of dropping them silently (#229) (2a7f1c2)
  • the command table describes commands, it does not merely name them (#240) (32cb222)

Bug Fixes

  • a 429 on the activity list stops the run instead of aborting it (#245) (23f841d)
  • align the help text, and stop it disagreeing with the machine payload (e041b8b)
  • derive schema-check's forms from the command table (#253) (ec6c733)
  • enforce the table budget on cells with no break opportunity (#213) (3ef5f55)
  • keep the claims gate green after #232 closed (551fabd)
  • name the row behind an unreadable date instead of internal_error (#247) (e064b90)
  • report a config value the engine cannot read, instead of guessing (#207) (2237024)
  • report the two sync-path config reads that swallowed a bad value (#211) (0e21f80)
  • scan docs for stale issue-state claims, and close two pattern gaps (#214) (019c9e9)

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 16:58
3f97246

0.7.0 (2026-08-18)

⚠ BREAKING CHANGES

  • machine output is requested, never inferred. Stride no longer reads any agent or harness environment variable to choose its format. If a caller that used to receive JSON now gets human tables, pass --json on the command (any argv position) or export STRIDE_FORMAT=json for the session — STRIDE_FORMAT is unchanged and is now the only environment input. The coach skill shipped in this repo already passes --json on every query; a copy of that skill installed outside the repo must be refreshed.

Features

  • callers ask for JSON — drop environment detection, answer machines in envelopes, and schema every published payload (535acfd)
  • coaching-language boundary guard with closed-set verdict pins (#167) (29f1d02)
  • error envelopes exit non-zero, and an unknown command stops pretending to succeed (#178) (3b64cda)
  • explicit --json / --human flags for tool-neutral output selection (#177) (e323890)
  • FTP derives from the sport family via stored sport_family (#169) (39f6a40)
  • missing values are flagged, not nulled (#168) (fde7724)
  • personal-baseline primitives — current vs own history with deterministic comparability (#175) (785ec04)
  • plan payload gains 28d history and adherence counts (#173) (827cccd)
  • platform failures reach the caller as the contract (#184) (6e7afc0)
  • publish the JSON contract as checked-in, validated schemas (#179) (68d1ff4)
  • rep-level comparison — the same workout shape across sessions (#185) (2515286)
  • spend the CP model — W′ balance and time to exhaustion (#190) (6af2e21)
  • sport words — family filters, honest empty results (#150) (25b676c)
  • stimulus history, windowed loads, and threshold trajectory as measurements (#174) (17a2f67)
  • stride season — training blocks, monthly load, polarization, FTP trajectory (#192) (b25d3e9)
  • substitute-activity links on skip and unplanned rows in week (#145) (072d99e)
  • TSS-weighted confidence coverage on the load aggregates (#172) (67430de)

Bug Fixes

  • a done session refuses skip — completions are permanent evidence (#153) (0379529)
  • refuse exponent notation in user-supplied ids and counts (#203) (768c07e)
  • repair the coach skill contract and add drift tests (#166) (1b2ecf2)
  • stop the e2e fixture changing the binary's clock mid-run (#202) (2c14649)
  • structure-gated interval detection — judge the segmentation, not the distribution (#171) (aa218ef)
  • substitution hardening — prune guard, stable ordering, truthful claim semantics (#147) (1efa473)

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 14 Aug 23:54
c742115

0.6.0 (2026-08-14)

Features

  • aerobic decoupling (Pw:HR drift) per activity (#94, #125) (5860560)
  • aerobic decoupling for pace sports and per-session drift in progress (#142) (19eacde)
  • complete a planned session from the CLI alone (#111, #112, #121) (7527985)
  • interval detection v1 — session structure (shape, per-rep HR, drift) on activity (#95, #132) (2812466)
  • plan all renders upcoming / this week / last week sections (#98) (9bbc0a1)
  • progress says a lone session is the first, not that it has a comparable (#96, #126, #128) (a4804a1)
  • show rest days and week dividers in the 14-day table (#99) (551f833)
  • sync reports how many activities were new or changed (#91, #120) (80e75f6)
  • the form verdict names the training state, counts band days honestly, and carries a weekly trend (#119, #123, #124, #127) (25e20d5)

Bug Fixes

  • bug C root-caused and fixed — SQLite bindings double-free, upstream fix shipped in basic-cli 0.22.0 (#105, #130, #131) (7f53561)
  • decoupling honesty — stored signal provenance, coverage and magnitude gates (#143) (d7889bc)

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 08 Aug 22:52
776cd3c

0.5.0 (2026-08-08)

Features

  • progress accepts asc|desc — list sessions newest-first (#77) (64e0ac6)
  • widen tables to 100 columns so the detail column is readable (#90) (308b0f6)

Bug Fixes

  • a concurrent reader can no longer abort analyze (#81) (25be2de)
  • estimated watts no longer outrank honest fallbacks (device_watts) (#74) (618edce)
  • progress bars no longer word-wrap mid-bar (#76) (c388a16)
  • say when the asked session isn't in its own progress table (#85) (df4b80f)
  • show when a session was actually completed (#89) (72cb02d)
  • stop sorting already-ordered streams, ~100x faster analyze (#78) (d640523)
  • the pace threshold is period-accurate, like FTP (#82) (a03bb0a)

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 07 Aug 10:43
7faa6bd

0.4.0 (2026-08-07)

Features

  • refuse to set a derived key instead of storing it and ignoring it (#64) (cea2d89)
  • salvage the pure-Roc improvements from the reverted #69 (4df8fe9)
  • score each activity at the FTP in force when it happened (a668cb5)
  • stream activities.csv out of the export zip instead of extracting it (6320854)

Bug Fixes

  • build the e2e harness with --opt=dev too (cbf0ef9)
  • correct the cold-start date comparison and index the period-FTP lookup (0efe594)
  • count unanalyzed activities in summary totals, and say when analyze stopped early (bee27ef)
  • emit no speed sample across an unrecorded gap (f01c199)
  • four scoring-accuracy corrections from the training-science audit (7b81c6d)
  • handle both no-baseline cases in the compare screen, and use False for False (c177e6e)
  • interpolate cumulative streams so coarse recordings don't spike NGP (df91559)
  • point the justfile at the new compiler so just test works locally (7402ca3)
  • reject pause-spanning windows when deriving bests (fc08e4b)
  • say when CTL is still warming up, and pin the load model over many days (f39bf58)
  • show the warming-up warning to humans, not only to JSON callers (0ad2304)
  • sort stream samples before resampling, and stop dropping light sessions (cda9c8f)
  • stop plan showing duplicate rows for a re-planned day you then missed (a87b752)
  • stop counting coasting as easy riding (97f369f)
  • sum real seconds in the pace intensity split, and call roc by name (3271606)
  • use the real EWMA factor so 42 and 7 days mean 42 and 7 days (8d18965)
  • warn about an unconverged CTL until 90 days, not 42 (35681d5)

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 05 Aug 21:51
d077ea6

0.3.0 (2026-08-05)

Features

  • decode all argv forms via OsStr.display (Windows UTF-16 support) (3e3ce70)
  • Windows arg support via OsStr.display (no hand-rolled decoder) (5eaad1c)

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 04 Aug 23:42
563c952

0.2.0 (2026-08-04)

⚠ BREAKING CHANGES

  • every machine JSON response is now wrapped. Success is {schema_version:1, data:}; errors are {schema_version:1, error:{code, message}} — discriminate on which key is present. Deterministic (no timestamps), so golden comparisons stay stable. Tool callers read fields under .data and branch on .error.code. Human table output is unchanged. Made default (not gated) since the user base is still small. stride skill + e2e updated to the enveloped shape.
  • rename prescriptions to plan across the CLI and data model

Features

  • add the pace-based load engine (rTSS/sTSS) as pure, tested math (2af63fa)
  • aligned time+dist+alt stream triple for the pace engine (938675d)
  • aligned time+dist+alt stream triple for the pace engine (slice 2 foundation) (b54c777)
  • auto-derive per-sport FTP so power-intensity applies to ANY sport (5780fcc)
  • compare command — this period vs the one before it (82ad357)
  • complete a rest-day prescription without an activity id (e195a92)
  • count pace (rtss) load as measured/high-confidence in reports (e6ec8f8)
  • Critical Power (CP/W') least-squares fit (0578323)
  • expand doctor with confidence distribution + config completeness (P8) (d9154a9)
  • fix pace-engine stop deflation and close review gaps (fa10961)
  • FTP is fully derived per sport — remove the config concept (4bdfe88)
  • grade-adjusted pace algorithm (Minetti 2002) for runs (67cb797)
  • grade-adjusted pace algorithm (Minetti 2002) for runs (0add058)
  • import Strava account exports, no API credentials needed (95fc3e9)
  • intensity from power for power rides (fixes hard-effort mislabel) (6ca5bf4)
  • mean-max power curve helper (best power at the duration ladder) (7bd7fa4)
  • new-compiler: app.roc compiles clean on the new compiler — 0 errors (179a56d)
  • pace engine — NGP + derived threshold pace (ADR-0003 slice 2) (c30b720)
  • pace rung in tss_ladder (power -> pace -> HR -> RPE -> RE) (661259c)
  • pace scoring for swim + indoor — flat-speed path (ADR-0003 slice 3) (bad2e78)
  • pace scoring for swim + indoor — flat-speed path (ADR-0003 slice 3) (0035fe9)
  • pace-intensity split (pi_* from pace for runs/swims) (c9ea8b1)
  • pace-intensity split for pace sports (pi_* from pace) (830cd0e)
  • per-sport HR zones (hr_z*max<sport>) with global fallback (582a1d7)
  • per-sport HR zones (hr_z*max<sport>) with global fallback (b639902)
  • per-sport pace-engine config keys (threshold_pace_<sport>, model_<sport>) (ab7cf7e)
  • persist load confidence + stop labelling mixed load as TSS (P5) (365336d)
  • power-based intensity across all surfaces, generic per-sport FTP (92705cb)
  • power-curve command — power-duration curve + Critical Power (f0ab7e3)
  • power-duration curve + Critical Power (ADR-0004) (dd312f3)
  • rename prescriptions to plan across the CLI and data model (9d8ca62)
  • request altitude streams so grade-adjusted pace has its input (d112eeb)
  • request distance stream explicitly alongside altitude (fa18498)
  • session-RPE ratings, sport-aware load ladder, doctor command, load provenance (897652a)
  • sport-aware progress — EF, speed/HR, and RPE lenses (e86a58b)
  • store per-activity power-duration curve (best_<dur>_w columns) (fadf38c)
  • stride plan shows the current week by default; plan all for full log (fb3de5e)
  • STRIDE_API_BASE override + mock Strava server for network-free sync testing (ac359f4)
  • surface measured vs estimated load share on the fitness number (grill #2) (8596805)
  • timezone-aware "today" via IANA zone (DST-correct) (8be7a6a)
  • uniform per-sport FTP (ftp_<sport>), no special-cased cycling key (3c79541)
  • version all JSON output in a { schema_version, data } envelope (8b5fea8)
  • wire NGP + derived threshold pace into scoring (slice 2) (0a6fd41)

Bug Fixes

  • add stable ORDER BY tiebreakers for deterministic output (202e305)
  • Bool-type the redacted/rest JSON fields (bare True serialized as "True") (7c356b8)
  • compare zero-prior verdict; feat: pace column for distance sports (runs/rows) (aaa4326)
  • decode UnixBytes argv from basic-cli 0.21 (commands were all showing help) (a7f1377)
  • dist_alt_time drops null sentinels in the time stream too (9370a78)
  • filter non-physiological power samples before NP/FTP (grill #4) (fd4c0f2)
  • flat-path fallback when altitude is all-null + strengthen dist_time test (7b59521)
  • freeze per-sport FTP + converge analyze to a fixed point (derived-FTP bug) (9c67470)
  • gate pi_* power/pace choice on power samples, not pi_ftp (ae4627c)
  • guard non-positive CP/W' fit + reuse shared power-curve ladder (39d9214)
  • heap-corruption crashes, FTP-less power scoring, and doctor JSON bool (532a341)
  • hide skipped tombstones from the default plan view (38d97f3)
  • honest zone-gap wording (no Z5 HR time, not 'no VO2max stimulus') (3a6cd62)
  • make token save and daily_load rebuild atomic ([35c0a5c](35c0a5c...
Read more

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 30 Jul 16:45
b5bd97f

0.1.0 (2026-07-30)

⚠ BREAKING CHANGES

  • consistent JSON contract across commands
  • progress is date-anchored; auto-named rides compare similar distances only

Features

  • add output (kJ) metric to top for total work ranking (b432178)
  • add progress command to track improvement on a repeated workout (55974c4)
  • add pz command showing power-zone watt ranges from FTP (b42123f)
  • add top command to rank activities by a metric (25b0f9e)
  • asked-date marker uses a solid triangle (df787e1)
  • auth opens the authorize URL in the browser automatically (c266b69)
  • bare progress defaults to the latest workout; honest message for EF-less days (9e4d2e2)
  • consistent full-name table headers with acronyms across commands (a8c929e)
  • consistent JSON contract across commands (ecd2e38)
  • ef bar column in progress (ASCII, scaled to best; < marks asked date) (b7964c3)
  • progress accepts a date, resolving that day's workout(s) (cf8020d)
  • progress bars scale worst-to-best, gap rows for 90-day breaks, explicit asked marker (0ce1ba7)
  • progress is date-anchored; auto-named rides compare similar distances only (f6ac8b9)
  • progress shows last-vs-best EF gap line (91ba735)
  • push FTP to Strava when set locally, so they stay in sync (0b10eda)
  • solid block ef bar (constant-height, single-width glyph) (5a3efe5)

Bug Fixes

  • auth also requests profile:read_all so athlete FTP stays readable (603626e)
  • compute form (TSB) same-day so it reflects current fatigue (ae97520)
  • honest degraded messages in best-effort paths (93ba287)
  • metrics recompute when the algorithm changes; single stream-response policy (4dc45bc)
  • progress verdict includes the average EF (668ce91)
  • re-auth reuses stored client credentials instead of requiring env vars (82451b5)
  • request profile:write scope in auth so FTP sync to Strava works for new tokens (c79bd47)
  • show per-activity distances with one decimal (50986fc)

Miscellaneous Chores

  • reset release baseline so the first public release is 0.1.0 (1520a9f)