Seed starter splits deterministically with immutable clone-on-edit seeds

Starter splits ship as byte-canonical SplitDocument JSON with fixed
ULIDs (Workouts/Resources/StarterSplits, regenerated by
Scripts/generate_starter_splits.swift) and auto-seed after connect into
a verifiably empty container, re-checked after a settle delay — wrong
guesses are harmless because identical bytes make same-path conflicts
empty and tombstones reap resurrected seeds. Seeds are immutable:
SyncEngine.save(split:) forks an edited seed to a fresh ULID and
soft-deletes the original, whose stub is exempt from pruning
(IndieSync 0.3.0 prune(exempting:)) and vetoes resurrection forever;
split views resolve by id through a redirect map to follow the swap.
Add Starter Splits in Settings restores deleted seeds by lifting the
veto stub and rewriting the bundle bytes.

Also fixes ingestFromWatch bypassing the tombstone veto (a phone-deleted
workout resurrected when a stale watch resent it) and reaps a live file
immediately when its tombstone arrives.

SplitDetailView also picks up the category-grouped exercise sections
from the exercise-category work.
This commit is contained in:
2026-07-06 01:16:05 -04:00
parent 7274f155e9
commit 936a585ece
16 changed files with 1088 additions and 242 deletions
+18
View File
@@ -1,5 +1,23 @@
**July 2026**
Starter routines now appear automatically the first time you use the app, instead of waiting behind a button in Settings.
Editing a starter split now turns it into your own copy, so the built-in version can always be brought back later.
Add Starter Splits in Settings now restores any starters you've deleted or customized, without duplicating the ones you already have.
Fixed a deleted workout reappearing when your Apple Watch hadn't yet heard about the deletion.
The exercise screen now shows an animated figure demonstrating proper form, starting with the Bodyweight Core moves like Bird Dog and Plank.
New Bodyweight Core starter split: a short warm-up plus a three-round circuit of planks, holds, and slow core moves — no equipment needed.
Exercises in a split can now be marked as warm-up or main circuit, and the split screen groups its list accordingly.
Opening an exercise you've already completed now shows a big green check instead of dropping you back into its timers.
Timed exercises like planks now show their hold time in exercise lists instead of reps and weight.
When deleting a workout that was saved to Apple Health, you can now choose to remove it from Apple Health too. Workouts recorded by Apple Watch may need to be deleted in the Health app instead.
Sync problems are now shown in Settings instead of failing silently.