Skip to content

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)
  • new-compiler: close complete_rest! fn block (concurrent-edit dropped a brace) (fbe9579)
  • new-compiler: Command is now := (nominal, constructable) so app.roc can match it (30c41b1)
  • perms check used BSD stat -f, which is --file-system on Linux CI (75fea86)
  • prune activities deleted on Strava during sync (592e557)
  • re-planning revises the open session in place (no skipped tombstones) (faa5b2b)
  • resolve empty-sport activities to the global HR zones only (76e07ee)
  • return clean no-data state instead of crashing empty-db reads (22b43c9)
  • security: pass untrusted values as args/escape them instead of shell/SQL interpolation (d7bc916)
  • security: secure_perms! passes dir as sh -c positional arg, not interpolated (6063d4f)
  • stop leaking Strava credentials (config get + file permissions) (8251626)
  • validate STRIDE_API_BASE and fail-closed on secret config keys (5f4423d)
  • windows: fall back to USERPROFILE when HOME is unset (home_dir! helper) (ddf8e3c)
  • wrap long table cells across rows (keep table ≤80 cols) (4b2fb19)
  • wrap long table cells across rows instead of overflowing the terminal (58b1710)

Performance Improvements

  • early-exit cfg_f64 instead of scanning the whole config list (1913996)