<feed xmlns='http://www.w3.org/2005/Atom'>
<title>biking_home/ride/moving_time.go, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.kagamino.dev/biking_home/atom?h=main</id>
<link rel='self' href='https://git.kagamino.dev/biking_home/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/'/>
<updated>2026-08-27T09:21:17Z</updated>
<entry>
<title>Extract climb detection into a dedicated climb package</title>
<updated>2026-08-27T09:21:17Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-27T09:21:17Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=825cf388b55a6c8441e02149749bb6e2968477c0'/>
<id>urn:sha1:825cf388b55a6c8441e02149749bb6e2968477c0</id>
<content type='text'>
Move climb detection, slope, and Cotacol scoring out of ride into a new
climb package that operates on a geometry-only Route (distances, elevations,
coords). Ride embeds climb.Route and keeps its timing and telemetry columns.

- climb.Detect returns []DetectedClimb (Climb + ride-absolute Start).
- Climb owns its sliced geometry; indices are local, with Start reported at
  the detection boundary for absolute position.
- Detected bounds use core.Interval; freeRegions claim suppression fixed.
- ride no longer builds slices: ClimbFromDist/ClimbFromIndexes/climbFrom and
  ride.Climb/Interval/Range are removed; rideanalysis, mountain_pass MatchClimb,
  and web views are rewired to climb types.
- New internal/routetest builds climb.Route from the ride DSL; ridetest reuses
  it and adds timestamps and telemetry.
- Tests moved to climb (synthetic detection and difficulty) and kept in ride
  for GPX-example integration; ride.comparison detection coverage retained.
- mountain_pass.nearestCrossing now reuses geo.Nearest.
</content>
</entry>
<entry>
<title>Expose ride data as components and make algorithms consume only the slices they read</title>
<updated>2026-08-25T09:24:51Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-25T09:24:51Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=ff3cd6248f2b78dc76f1ce8cc2337907188fd401'/>
<id>urn:sha1:ff3cd6248f2b78dc76f1ce8cc2337907188fd401</id>
<content type='text'>
Ride now exposes its columns as component getters (Distances, Elevations,
Coords, Timestamps, and the optional Powers, Cadences, HeartRates) with the
coords field unexported. difficultyScore, movingTime, Slope and the climb
detection internals are pure functions over the specific slices they use,
and Climb carries only the component slices it needs instead of a whole
Ride.
</content>
</entry>
<entry>
<title>chore(bench): exclude rides with low moving time ratio</title>
<updated>2026-08-20T16:48:47Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T16:48:47Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=5242b55d878d56b71d443a440c7017015b9df2dd'/>
<id>urn:sha1:5242b55d878d56b71d443a440c7017015b9df2dd</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore(bench): exclude rides under 10 km</title>
<updated>2026-08-20T16:19:22Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T16:19:22Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=3c8dbdbbb13ca233bd03466de2f0ea4fc4be38d4'/>
<id>urn:sha1:3c8dbdbbb13ca233bd03466de2f0ea4fc4be38d4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore(bench): exclude short rides</title>
<updated>2026-08-20T15:23:34Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T15:23:34Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=8af7f81622ce5505f4c29ac24d63f4261e845f52'/>
<id>urn:sha1:8af7f81622ce5505f4c29ac24d63f4261e845f52</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(ride): use effort metrics for moving time</title>
<updated>2026-08-20T14:20:44Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T14:20:44Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=862f71901c3e11f9d21a33b39a110357ccc6d4c4'/>
<id>urn:sha1:862f71901c3e11f9d21a33b39a110357ccc6d4c4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(ride): improve moving time against Strava</title>
<updated>2026-08-20T14:05:20Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T14:05:20Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=15ce334f357ca4f061977ad342292b21c5e60ea6'/>
<id>urn:sha1:15ce334f357ca4f061977ad342292b21c5e60ea6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(ride): compute moving time from GPX with backtest</title>
<updated>2026-08-20T13:47:52Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-20T13:47:52Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=57e48b23987630936c84300d87ea5be682cb64bd'/>
<id>urn:sha1:57e48b23987630936c84300d87ea5be682cb64bd</id>
<content type='text'>
Add ride.MovingTime, a speed-threshold algorithm over track timestamps.
Add a -backtest CLI command comparing computed values against Strava's
reference across all stored rides, with a percentile distribution summary.

Baseline: mean err 3.9%, p50 1.6, p75 4.6, p90 8.4, p95 12.1, p99 44.9.
</content>
</entry>
</feed>
