Corrigé (audit) :
- cutoffHours : garde hasModel pour ESE (parité Kotlin) — un backup
importé ESE + ester non couvert levait TypeError → écran vide
- min/max en une passe : les spreads Math.min(...allPoints) levaient
RangeError au-delà de ~1e5 arguments (Nuage × zoom max) et allouaient
par frame
- init MCMC non bloquante : data-ready garantit désormais « asset chargé »
Perf (portage v1.8.2 Android, fin de la dérive de miroir) :
- prepareE2Context/e2AtCtx : doses groupées, cutoffs précalculés, Bateman
paresseux ; computeCurve ne recalcule plus cutoffHours par point
- résultat identique (175 tests verts)
E2E : version lue via data-version (anti-bug v1.9.3)
Docs/commentaires : pk-engine (ESE analytique), pk-calibration (JSDoc
arrondi), dialogs (ESE=6), lab-timing (import mort, JSDoc orpheline),
home (COLORS), pk-profile-store (test-only), pk_profiles.json exclu du
zip (export-ignore, −548 Ko)
- js/pk/lab-timing.js : miroir fidèle de pk/LabTiming.kt — creux prévisionnel
(minimum de la courbe E2 entre 2 injections), saut au premier creux
STABILISÉ (5 × t½ terminale : TFS/WHS analytiques, Estrannaise lue dans
la table via le nouveau pkProfileStore.terminalHalfLifeDays — refactor
de la pente d'extrapolation de sample(), zéro duplication), filtres
honnêtes (injectable actif + Posologie requis, creux ≥ now+6 h et jamais
déjà mesuré, horizon borné → null), shouldSuggestPosology (invite quand
un injectable actif est sans Posologie — demande v1.8.0).
- labs.js : encart « Prochaine prise de sang (suggestion) » ou invite,
mutuellement exclusifs (miroir carte Android).
- i18n FR/EN (labrec_*), WEB_VERSION 1.8.0, assertions E2E.
- tests/lab-timing.test.js : 7 tests miroirs (152 verts au total) + E2E
(encart rendu : titre, creux daté, créneau, stabilisation).
- Doc : §4 arbre, §8 suite + E2E, CHANGELOG [1.8.0], README.