v1.10.0 (web) : fix #68 — creux pré-injection dans la reco de prise de sang (miroir Android)
Le « creux » était le minimum de la fenêtre entière (créneau N−1 → N) : pour un ester à montée lente (EEn, pic ~J+5 ≈ intervalle 7 j) il tombait juste après l'injection PRÉCÉDENTE — date antérieure à la stabilisation affichée sur la même carte, et « juste avant ton injection du … » faux de plusieurs jours. Le creux est désormais le niveau PRÉ-INJECTION du créneau (principe v1.8.0 restauré ; EV inchangé — le point pré-injection EST son minimum de fenêtre). WEB_VERSION alignée sur 1.10.0. 180 tests + E2E verts (check.sh) ; suite lab-timing inchangée (sa sémantique épinglée était celle du fix).
This commit is contained in:
parent
ff4a1374db
commit
992b9e41c4
@ -5,6 +5,29 @@
|
||||
> section la plus récente EN PREMIER ; ce fichier est lu par le dialog
|
||||
> « Nouveautés » de l'app web (fetch `docs/CHANGELOG.md`).
|
||||
|
||||
## [1.10.0] — 2026-09-27
|
||||
|
||||
### Corrigé — la recommandation de prise de sang précédait la stabilisation (#68)
|
||||
|
||||
- Miroir de l'Android v1.10.0 (remontée + données réelles → 6ᵉ régression
|
||||
épinglée côté Android) : le « creux » était le **minimum de la fenêtre
|
||||
entière** (créneau N−1 → créneau N). Pour un ester à montée lente (EEn :
|
||||
pic ~J+5 ≈ intervalle 7 j), ce minimum tombe **juste après l'injection
|
||||
PRÉCÉDENTE** (creux d'absorption, ~3 h) — la date proposée était gouvernée
|
||||
par l'injection N−1, antérieure à la stabilisation, et le texte « juste
|
||||
avant ton injection du … » était faux de plusieurs jours.
|
||||
- **Fix** : le creux = **niveau PRÉ-INJECTION du créneau** (dernier point de
|
||||
courbe avant l'injection) — restaure le principe v1.8.0 documenté et rend
|
||||
la carte cohérente. Pour les esters à t½ courte (EV), le point
|
||||
pré-injection EST le minimum de fenêtre : comportement inchangé.
|
||||
- Tests : la suite lab-timing (12) passe inchangée — sa sémantique épinglée
|
||||
(« creux juste avant l'injection, écart ≤ 2 h ») était déjà celle du fix ;
|
||||
180 tests + E2E verts (`check.sh`).
|
||||
|
||||
Les autres changements de la v1.10.0 Android (dialog fantôme #69, rappel
|
||||
sauté si dose déjà loggée) n'ont pas d'équivalent web (notifications et
|
||||
intents de notification sont spécifiques Android).
|
||||
|
||||
## [1.9.7] — 2026-09-20
|
||||
|
||||
### Corrigé — la suggestion de prise de sang « change tout le temps » à chaque injection
|
||||
|
||||
@ -115,18 +115,25 @@ export function nextBloodDrawRecommendation(treatments, doseLogs, labs, nowMs =
|
||||
const minTroughMs = nowMs + MIN_HORIZON_HOURS * HOUR_MS;
|
||||
let windowStart = nowMs;
|
||||
for (const slot of slots) {
|
||||
// Creux du créneau = minimum de la courbe entre l'injection précédente
|
||||
// (ou maintenant) et ce créneau
|
||||
const window = curve.filter((p) => p.timestamp > windowStart && p.timestamp < slot.timestamp);
|
||||
// ⚠️ FIX #68 (v1.10.0, miroir du Kotlin) : le creux = niveau
|
||||
// PRÉ-INJECTION du créneau (dernier point de courbe avant l'injection —
|
||||
// principe 1, « le moment le plus comparable »). L'ancien MINIMUM DE LA
|
||||
// FENÊTRE ENTIÈRE tombait au DÉBUT de la fenêtre pour les esters à
|
||||
// montée lente (EEn : pic ~J+5 ≈ intervalle 7 j → le minimum local est
|
||||
// le creux d'absorption, quelques heures après l'injection PRÉCÉDENTE) :
|
||||
// la date proposée précédait la stabilisation affichée sur la MÊME
|
||||
// carte, et le texte « juste avant ton injection du … » était faux de
|
||||
// plusieurs jours (remontée v1.9.8). Pour les esters à t½ courte (EV),
|
||||
// le point pré-injection EST le minimum de fenêtre : inchangé.
|
||||
let trough = null;
|
||||
for (const p of window) {
|
||||
if (trough === null || p.e2 < trough.e2) trough = p;
|
||||
for (const p of curve) {
|
||||
if (p.timestamp > windowStart && p.timestamp < slot.timestamp) trough = p;
|
||||
}
|
||||
if (
|
||||
trough !== null
|
||||
&& trough.timestamp >= minTroughMs
|
||||
&& trough.timestamp > lastLabMs
|
||||
&& slot.timestamp >= stabilizedAtMs // sauter au premier creux stabilisé
|
||||
&& trough.timestamp >= stabilizedAtMs // sauter au premier creux stabilisé
|
||||
) {
|
||||
return {
|
||||
troughMs: trough.timestamp,
|
||||
|
||||
@ -31,7 +31,7 @@ import { el, showDialog, field, switchRow, filterChip, toast } from './component
|
||||
* (APK + web au MÊME numéro, tags appariés `vX.Y.Z` + `vX.Y.Z-web`).
|
||||
* v1.4.10 = portage initial de l'Android v1.4.10.
|
||||
*/
|
||||
export const WEB_VERSION = '1.9.7';
|
||||
export const WEB_VERSION = '1.10.0';
|
||||
|
||||
/** Parse un champ numérique FR (virgule → point) ; null si vide/invalide. */
|
||||
function parseNumOrNull(text) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user