- predictedE2 : valeur brute au creux × facteur du ester (auto-calibration
ON requise — sinon rien, une valeur brute serait trompeuse) ; rendu
coloré face à la cible dans labs.js + home.js.
- pooledRegimeDoses : les doses de tous les traitements partageant (ester
effectif, mg) forment UNE séquence — le re-parenting d'historique
(« 6d-old ») ne redémarre plus la stabilisation. Garde-fous : ester ≠
jamais poolé, dose ≠ exclue.
- Cible de creux E2 (opt-in) : store + carte settings + backup
(rétrocompatible — un backup ancien n'efface pas la cible locale) +
i18n FR/EN. ⚠️ DISTINCT des seuils d'alerte : jamais de notification.
- 15 tests (pooling ×3, statut cible, round-trip backup) ; leçon E2E :
bump WEB_VERSION sans section CHANGELOG = dialog vide.
199 tests + E2E verts (check.sh). WEB_VERSION alignée sur 1.13.0.
- FIX#70 : generateForecastDoses garde !isActive — un traitement archivé
à Posologie ne projette plus de créneaux ; l'horizon du chip Prévision
(chart.js) ne considère que les Posologies ACTIVES. §6.bis inchangé :
l'historique reste simulé, seul le FUTUR s'arrête. 3 tests miroirs.
- Page Doses : routeGlyph (💊💉💧🩹🧴, miroir routeIcon) + encarts
« prise de sang le même jour » 🧪↑/🧪↓ (labMarkersForDose, miroir) ;
i18n FR/EN ; 10 tests doses-extras.test.js (⚠️ makeDose(ts, amount,
overrides)).
194 tests + E2E verts (check.sh). WEB_VERSION alignée sur 1.12.0.
- Helper pur treatmentsForDisplay dans js/data/models.js (miroir du Kotlin,
tri STABLE : actifs d'abord, inactifs après, ordre relatif conservé dans
chaque groupe) — demande : « peu discernables, à placer à la fin ».
- Rendu : en-tête « Traitements inactifs » (seulement s'il en existe),
cartes opacity 0.55 en plus du badge — lisibles et cliquables.
- Clés i18n inactive_section FR/EN ; WEB_VERSION alignée sur 1.11.0.
- 4 tests treatments-display.test.js (miroir TreatmentsDisplayTest.kt).
184 tests + E2E verts (check.sh).