feat: piano sensibile al protocollo digiuno (PRD §5.6 + §9.4)

Finora il fastingProtocol era una preferenza salvata ma ignorata dal
planner — ogni giorno generava 4 pasti. Ora cambia struttura per protocollo
e per giorno della settimana.

@ketopath/shared/planner
- protocolPlanForDay(protocol, dayOfWeek) → { share, kcalMultiplier }
- 14:10  → tutti e 4 i pasti, share default
- 16:8   → niente colazione: pranzo 50%, spuntino 10%, cena 40%
- 18:6   → niente colazione: pranzo 55%, spuntino 5%, cena 40%
- 20:4   → solo spuntino+cena (10/90)
- ESE 24h → mercoledì kcalMultiplier=0 (giorno saltato), altri default
- 5:2    → lunedì + giovedì kcalMultiplier=0.25, share 100% cena
- 7 unit test in protocol.test.ts

apps/api/plan
- POST /me/meal-plans: legge preferences.fastingProtocol, deriva il piano
  per ogni giorno, salta MealSlot con share=0 e giorni a kcalMultiplier=0
- GET /me/meal-plans/current: include fastingProtocol nella risposta
- baseDailyTarget restituito invariato per il client

apps/web
- /plan mostra "Finestra alimentare 16:8" sotto il titolo della settimana
- plan-week distingue i giorni "fasting" (digiuno completo) e "leggeri"
  (5:2 fasting day) con copy dedicato; rimuove totali calorici inappropriati
- i18n: Plan.protocolLabel + Plan.fastingDay/lightDay

Smoke tested: settato 16:8 da /profile, rigenerato il piano, verificato
che l'etichetta appaia e che ogni giorno abbia esattamente 3 pasti
(Pranzo / Spuntino / Cena, niente Colazione).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
lucianoandClaude Opus 4.7 committed 2026-04-29 22:27:49 +02:00
1 parent ded4215664
commit feb54c1f9a
7 files changed
+258 -25

No files matched your search

+13
View File
@@ -391,6 +391,19 @@
"hideAlternatives": "Nascondi",
"swap": "Scegli",
"dayTotal": "{kcal} kcal totali",
"window": "Finestra alimentare",
"fastingDay": "Giorno di digiuno",
"fastingDayHint": "Acqua, tè e tisane. Niente cibo solido.",
"lightDay": "Giorno leggero",
"lightDayHint": "Solo cena, kcal ridotte (~25% del giornaliero abituale).",
"protocolLabel": {
"FOURTEEN_TEN": "14:10 — finestra di 10h",
"SIXTEEN_EIGHT": "16:8 — finestra di 8h",
"EIGHTEEN_SIX": "18:6 — finestra di 6h",
"TWENTY_FOUR": "20:4 — finestra di 4h",
"ESE_24": "ESE 24h — un giorno di digiuno completo a settimana",
"FIVE_TWO": "5:2 — due giorni leggeri a settimana"
},
"meals": {
"COLAZIONE": "Colazione",
"PRANZO": "Pranzo",