Marc-André Bombeck
0f6d668df1
fix(workouts): match cross-source duplicates by a start window, not a clock slot
...
Two copies of one session were collapsed only when both starts fell in the
same fixed five-minute clock slot, so a pair thirty seconds apart that
straddled a slot boundary (08:04:50 and 08:05:20) stayed as two workouts in
the list, the batch write, the calendar, strain and the Coach.
Workouts of one user and sport are now clustered by start time: a workout
joins the open cluster while it starts less than five minutes after the
cluster's first start. Wherever no pair within five minutes straddles a slot
boundary the clusters are exactly the old slots, which a parity test checks
against the previous picker on thousands of generated inputs, strain impulses
included. A property test shows any offset under five minutes now collapses,
five minutes or more never does, and a uniform shift of every start keeps the
picked set.
2026-10-22 06:16:54 +02:00
..
2026-10-22 05:58:45 +02:00
2026-10-22 00:29:19 +02:00
2026-10-19 11:06:55 +02:00
2026-10-21 21:39:15 +02:00
2026-10-20 16:52:08 +02:00
2026-10-20 09:08:40 +02:00
2026-10-20 09:15:31 +02:00
2026-10-20 09:08:40 +02:00
2026-06-28 03:20:49 +02:00
2026-10-21 19:24:21 +02:00
2026-10-05 21:57:49 +02:00
2026-07-12 11:08:59 +02:00
2026-10-15 22:55:40 +02:00
2026-10-15 22:55:40 +02:00
2026-10-04 11:33:45 +02:00
2026-10-21 19:24:21 +02:00
2026-10-21 20:26:15 +02:00
2026-07-27 23:01:33 +02:00
2026-10-04 20:00:07 +02:00
2026-10-20 09:08:40 +02:00
2026-09-27 13:03:27 +02:00
2026-10-20 09:08:40 +02:00
2026-10-21 19:24:21 +02:00
2026-10-21 21:39:15 +02:00
2026-10-21 21:39:15 +02:00
2026-10-09 10:44:17 +02:00
2026-10-21 21:39:15 +02:00
2026-10-21 21:51:36 +02:00
2026-06-19 22:20:31 +02:00
2026-10-21 21:39:15 +02:00
2026-08-08 17:56:40 +02:00
2026-07-16 09:55:35 +02:00
2026-08-08 17:56:40 +02:00
2026-10-20 09:08:40 +02:00
2026-10-21 21:12:23 +02:00
2026-10-20 09:08:40 +02:00
2026-10-05 21:22:57 +02:00
2026-10-20 09:48:30 +02:00
2026-10-20 09:47:20 +02:00
2026-10-20 09:08:40 +02:00
2026-10-20 09:43:47 +02:00
2026-10-21 22:27:20 +02:00
2026-10-20 09:08:40 +02:00
2026-10-16 05:32:13 +02:00
2026-06-01 20:26:26 +02:00
2026-10-05 21:22:57 +02:00
2026-10-20 09:08:40 +02:00
2026-09-24 09:06:22 +02:00
2026-10-21 14:32:56 +02:00
2026-10-20 09:08:40 +02:00
2026-10-21 21:39:15 +02:00
2026-10-08 09:40:12 +02:00
2026-10-09 16:25:48 +02:00
2026-10-20 04:36:54 +02:00
2026-06-28 18:33:53 +02:00
2026-10-20 09:47:20 +02:00
2026-10-20 09:08:40 +02:00
2026-07-11 08:43:41 +02:00
2026-08-08 07:40:07 +02:00
2026-10-01 09:59:57 +02:00
2026-08-08 04:02:34 +02:00
2026-10-20 16:52:08 +02:00
2026-10-15 23:39:11 +02:00
2026-10-20 04:36:54 +02:00
2026-10-20 09:15:31 +02:00
2026-07-11 08:43:41 +02:00
2026-10-20 16:52:08 +02:00
2026-10-20 09:47:20 +02:00
2026-10-20 10:01:30 +02:00
2026-10-20 05:01:18 +02:00
2026-10-21 00:05:22 +02:00
2026-10-20 09:08:40 +02:00
2026-07-19 04:47:53 +02:00
2026-10-09 16:45:39 +02:00
2026-10-09 16:45:39 +02:00
2026-10-20 09:08:40 +02:00
2026-10-20 04:36:54 +02:00
2026-10-20 04:36:54 +02:00
2026-06-11 22:49:42 +02:00
2026-10-20 09:08:40 +02:00
2026-10-20 09:08:40 +02:00
2026-10-20 09:08:40 +02:00
2026-10-16 05:38:36 +02:00
2026-10-15 22:55:40 +02:00
2026-09-24 09:06:22 +02:00
2026-09-24 09:30:23 +02:00
2026-10-22 06:16:54 +02:00
2026-10-20 09:08:40 +02:00
2026-10-01 09:59:57 +02:00
2026-10-21 14:32:56 +02:00
2026-06-04 17:47:17 +02:00
2026-09-24 09:06:22 +02:00
2026-10-22 00:25:29 +02:00
2026-10-01 09:08:11 +02:00
2026-10-20 09:08:40 +02:00
2026-09-24 09:22:50 +02:00
2026-10-01 13:23:17 +02:00
2026-06-03 08:56:20 +02:00
2026-10-20 09:15:31 +02:00
2026-06-02 17:34:52 +02:00