feat(daily): milestones — the calm reward layer

Add the durable-states Milestone primitive and a milestone card to the
daily digest. A milestone marks a state REACHED, never days maintained:
a metric settled back inside its own range, a run of weeks in range, or
a fresh personal best. It is deliberately not a streak — the type carries
a reached-date and no running counter, so nothing here can be tuned into
a flame, and a lapse is invisible rather than mourned.

The primitive is a thin wrapper over engines that already exist: the pure
detectStreak band engine (return-to-range + sustained-in-range) and the
PersonalRecord detection output (new bests). Reached-once needs no new
storage — a milestone's reached-date is a stable fact, so it surfaces only
on the day it was reached and never resurfaces the next day.

The digest emits one calm success card per day when a milestone is freshly
reached, below an overdue dose and above ambient items, with a single
action into the metric's insight. Module- and data-gated: a disabled
insights account or a day with nothing reached shows nothing. Copy carries
no streak, loss, or failure vocabulary, in all six locales.
This commit is contained in:
Marc-André Bombeck committed 2026-07-17 08:10:58 +02:00
1 parent 1427125b7e
commit 8b7bb7914e
11 files changed
+908 -6

No files matched your search

+37 -1
View File
@@ -8557,7 +8557,8 @@
"viewCheckups": "Zobacz badania",
"checkinKeep": "Zachowaj",
"checkinAdjust": "Dostosuj",
"checkinLetGo": "Odpuść"
"checkinLetGo": "Odpuść",
"viewMilestone": "Zobacz"
},
"today": {
"scoreLabel": "Wynik zdrowia",
@@ -8567,6 +8568,41 @@
"readFullBriefing": "Przeczytaj pełny briefing",
"worthALook": "Warto sprawdzić",
"allClear": "Dziś nic nie wymaga Twojej uwagi."
},
"milestone": {
"metric": {
"restingHeartRate": "tętno spoczynkowe",
"heartRateVariability": "zmienność rytmu serca",
"respiratoryRate": "częstość oddechów",
"weight": "waga",
"generic": "ta wartość"
},
"record": {
"title": "Nowy rekord: {metric}",
"body": "Dziś osiągnięto Twój najlepszy wynik dla {metric}. Spokojnie odnotowane, nic nie musisz robić."
},
"returnToBaseline": {
"title": "Znów w Twoim zakresie: {metric}",
"body": "Twoja {metric} wróciła do zwykłego zakresu. Cokolwiek to było, minęło."
},
"sustainedInRange": {
"week1": {
"title": "Tydzień w zakresie",
"body": "Twoja {metric} od tygodnia mieści się w zwykłym zakresie. Ładnie i spokojnie."
},
"week2": {
"title": "Dwa tygodnie w zakresie",
"body": "Twoja {metric} od dwóch tygodni mieści się w zwykłym zakresie. Spokojnie i stabilnie."
},
"week3": {
"title": "Trzy tygodnie w zakresie",
"body": "Trzy tygodnie z {metric} w zwykłym zakresie. Naprawdę spokojny odcinek."
},
"week4": {
"title": "Miesiąc w zakresie",
"body": "Cały miesiąc z {metric} w zwykłym zakresie. Wspaniale stabilnie."
}
}
}
}
}