mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-14 14:40:52 +00:00
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:
1 parent
1427125b7e
commit
8b7bb7914e
11 files changed
+908
-6
No files matched your search
+37
-1
@@ -8557,7 +8557,8 @@
|
||||
"viewCheckups": "Voir les examens",
|
||||
"checkinKeep": "Garder",
|
||||
"checkinAdjust": "Ajuster",
|
||||
"checkinLetGo": "Laisser tomber"
|
||||
"checkinLetGo": "Laisser tomber",
|
||||
"viewMilestone": "Voir"
|
||||
},
|
||||
"today": {
|
||||
"scoreLabel": "Score de santé",
|
||||
@@ -8567,6 +8568,41 @@
|
||||
"readFullBriefing": "Lire le briefing complet",
|
||||
"worthALook": "À regarder",
|
||||
"allClear": "Rien ne requiert ton attention aujourd'hui."
|
||||
},
|
||||
"milestone": {
|
||||
"metric": {
|
||||
"restingHeartRate": "fréquence cardiaque au repos",
|
||||
"heartRateVariability": "variabilité de la fréquence cardiaque",
|
||||
"respiratoryRate": "fréquence respiratoire",
|
||||
"weight": "poids",
|
||||
"generic": "cette valeur"
|
||||
},
|
||||
"record": {
|
||||
"title": "Nouveau record : {metric}",
|
||||
"body": "Vous avez atteint un record personnel de {metric} aujourd'hui. Noté en toute tranquillité, rien à faire."
|
||||
},
|
||||
"returnToBaseline": {
|
||||
"title": "De retour dans votre plage : {metric}",
|
||||
"body": "Votre {metric} est revenue dans votre plage habituelle. Quoi que ce fût, c'est passé."
|
||||
},
|
||||
"sustainedInRange": {
|
||||
"week1": {
|
||||
"title": "Une semaine dans la plage",
|
||||
"body": "Votre {metric} reste dans votre plage habituelle depuis une semaine. Bien régulier."
|
||||
},
|
||||
"week2": {
|
||||
"title": "Deux semaines dans la plage",
|
||||
"body": "Votre {metric} reste dans votre plage habituelle depuis deux semaines. Calme et régulier."
|
||||
},
|
||||
"week3": {
|
||||
"title": "Trois semaines dans la plage",
|
||||
"body": "Trois semaines avec votre {metric} dans votre plage habituelle. Une vraie période de stabilité."
|
||||
},
|
||||
"week4": {
|
||||
"title": "Un mois dans la plage",
|
||||
"body": "Un mois entier avec votre {metric} dans votre plage habituelle. Merveilleusement stable."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user