-
v1.9.2 Stable
released this
2026-09-19 22:10:35 +02:00 | 20 commits to main since this releaseCorrigé — le nuage d'incertitude exigeait un traitement STOCKÉ en ESE
- Bug remonté : activer Estrannaise dans le graphique puis le nuage
n'affichait rien tant qu'aucun traitement n'était stocké avec le
modèle ESE — « la seule méthode trouvée était de mettre un traitement en
cours sur le modèle ESE, mais ça ne devrait pas être un prérequis ». - Cause : le filtre du nuage testait le
pkModelSTOCKÉ du
traitement, alors que la courbe ESE affichée redessine toutes les doses
E2 avecmodelOverride = "ESE"(peu importe le modèle stocké) — courbe
et nuage n'utilisaient pas la même définition de « quelles doses sont
tracées en ESE ». - Fix : le nuage couvre toutes les doses E2 à profil injectable dont
l'ester effectif (override compris) est couvert par le fit Estrannaise
— indépendamment du modèle stocké. L'exclusivité ESE reste portée par le
chip (activable seulement si ESE est affiché). L'oral Bateman reste hors
nuage (pas d'ester échantillonnable). Les traitements inactifs sont
inclus (§6.bis : la courbe ESE les trace aussi). - 2 tests réécrits (237 au total / 207 sans les données locales) :
« doses d'un traitement TFS couvertes quand ESE est affiché » (le fix,
épinglé des deux plateformes) ; oral seul → vide (conservé). - Validé émulateur §16.ter sur le profil réel (EEn stocké TFS, ESE
activé) : nuage visible autour de la courbe ESE, 0 crash.
Downloads
- Bug remonté : activer Estrannaise dans le graphique puis le nuage
-
v1.9.1 Stable
released this
2026-09-19 21:13:17 +02:00 | 21 commits to main since this releaseCorrigé — le nuage d'incertitude entoure maintenant la courbe Estrannaise calibrée
- Bug remonté : le nuage ne s'activait « que autour du tracé, pas autour
du modèle Estrannaise » — la courbe ESE affichée est calibrée
(scalePerEster des labs) mais le nuage était tracé brut : les deux
flottaient à des échelles différentes. - Fix : le nuage reçoit le MÊME
scalePerEsterque la courbe ESE
(autoByModel ESE) — il entoure désormais la courbe calibrée (Android +
web en miroir). - 1 nouveau test : nuage calibré ×2 = nuage brut ×2 (le nuage suit la
calibration).
Note — pourquoi le taux affiché a bougé depuis v1.8.2 (+4 pg/mL)
- v1.8.2 a corrigé l'arrondi de la médiane de calibration (troncature
flottante → arrondi au plus proche) : une échelle dont la médiane brute
tombait à 0,8999… était tronquée en 0,89 au lieu de 0,90. Avec le modèle
ESE analytique (v1.9.0) déplaçant ce dernier bit, le piège est devenu
visible : les échelles auto-calibrées ont bougé d'un cran d'affichage →
le niveau estimé a monté d'environ 1 % (+4 pg/mL sur ~320). - Le niveau actuel est le CORRIGÉ (l'arrondi est plus juste que la
troncature). Le web applique la même règle depuis v1.9.1 (harmonisation
des niveaux entre plateformes).
Downloads
- Bug remonté : le nuage ne s'activait « que autour du tracé, pas autour
-
v1.9.0 Stable
released this
2026-09-19 20:44:30 +02:00 | 22 commits to main since this releaseModèle Estrannaise ANALYTIQUE (abandon de l'ODS) + nuage d'incertitude MCMC
- Le modèle ESE n'est plus les tables horaires ODS : il est désormais la
forme close 3C publiée par estrannaise.js (les sources originelles
dont l'ODS n'était que l'échantillonnage horaire) — fidélité épinglée :
RMS 0,00 vs les tables sur 0→200 j, écart de pic ≤ 0,1 %. - Décision (utilisatrice) : « tous les modèles ont maintenant leurs
sources originelles — on abandonne complètement les liens avec le fichier
ODS ». Concrètement : plus aucune lecture des tables au runtime
(concentrationOfDosedispatche ESE → forme close ;cutoffHoursESE →
10 × t½ terminale analytique ; l'assetpk_profiles.jsonquitte l'APK,
−550 Ko, et ne sert plus qu'aux tests de fidélité). - 6 esters injectables couverts (EV, EU, EEn, EC, EB + EUCS,
undécylate suspension cristalline, exclusif à ce fit) — l'ancien ESE
n'en couvrait que 3. TFS reste à 7 (liste explicite : EUCS n'a pas de
V3C TFS), WHSAH à 6. - NUAGE D'INCERTITUDE (exclusif ESE) : Estrannaise publie le posterior
MCMC de ses paramètres (313 échantillons/ester, asset ≈ 48 Ko) — chip
Nuage(off par défaut, activable à volonté, actif SEULEMENT si ESE est
affiché, coupure automatique si ESE est éteint) → nuage diffus de 32
courbes du posterior montrant la plage d'imprécision du modèle, comme
sur le site estrannaise. Dessiné en alpha faible sous les courbes, hors
échelles/labels/extrema. - t½ terminale ESE désormais analytique (ln2/min(k1,k2,k3)) — la
recommandation de prise de sang n'estime plus la t½ par pente de table. - 11 nouveaux tests (234 au total / 204 sans les données locales) :
fidélité (RMS, pics ±0,2 %), cas dégénérés (taux égaux → limites sans
NaN), MCMC 313 × 6, nuage (32 courbes à dispersion réelle, fenêtre,
exclusivité ESE, gardes), choicesForModel ESE=6, t½ analytique. - Porté web (web v1.9.0, versions sync) :
estrannaise-models.js+
estrannaise-cloud.jsmiroirs, nuage canvas, fetch MCMC au démarrage
(l'ODS web quitte aussi le runtime), 11 tests miroirs + E2E nuage. - Validé émulateur §16.ter (APK release, seed réel v1.7.0) : courbe ESE
analytique affichée, chips Extend/Cloud présents, recommandation
de prise de sang fonctionnelle, 0 crash.
Downloads
- Le modèle ESE n'est plus les tables horaires ODS : il est désormais la
-
v1.8.2 Stable
released this
2026-09-18 14:21:32 +02:00 | 24 commits to main since this releaseMaintenance — performance du moteur + fraîcheur de l'interface
Aucune nouvelle fonctionnalité : session d'audit complet (code + doc), avec
les optimisations et corrections sûres qui en sont sorties.Performance du moteur PK
e2At/computeCurve:cutoffHourset les paramètres Bateman
(bisection 50 itérations) ne sont plus recalculés à chaque (point ×
dose × traitement) — pré-calculés par traitement, et Bateman devient
paresseux (inutile pour les traitements à profil). Le chemin le plus
chaud (tracé labs : ~720 points × N × D appels de cutoff par refresh)
s'allège d'un facteur P × T. Doses pré-groupées par traitement (fin des
scans complets). Résultat identique (ordre de sommation préservé —
223 tests verts inchangés).AppLog: purge du buffer sans recopie à chaque ligne loggée.ChangelogHelper: Regex précompilées (dialog « Nouveautés »).CurveChart: SimpleDateFormat créé hors boucle de dessin.
Corrigé — fraîcheur de l'interface
- Accueil : éditer un scaleFactor ou le modèle T rafraîchit la courbe
immédiatement (clés du producteur incomplètes — l'ancien trio attendait
le tick de 60 s). - Graphiques : éditer la VALEUR d'une analyse rafraîchit les courbes
(la clé n'était que le NOMBRE d'analyses).
Maintenance — code & documentation
- Code mort supprimé (Repository/DAO sans appelants,
currentLevel,
variable et scheduler dupliqués), imports morts/redondants nettoyés,
médiane de calibration factorisée (4 copies → 1 helper),
qualifications raccourcies, en-têtes/KDoc obsolètes mis à jour. - Documentation : ~35 corrections (compteurs de tests obsolètes, TOC et
ancres réparées, inventaire des suites de tests à jour et fusionné,
titres CHANGELOG doublés supprimés, versions « à jour v1.2.0 » /
« Gradle 8.9 » / « API 34 » corrigées, fautes).
Downloads
-
v1.8.1 Stable
released this
2026-09-17 19:48:20 +02:00 | 25 commits to main since this releaseCorrigé — la stabilisation ignorait les changements récents (dose/ester/intervalle)
- Bug remonté : la recommandation disait « stabilisée depuis février »
alors que l'ester, le dosage ET la posologie venaient de changer —
l'ancien calcul partait de la 1ʳᵉ dose du traitement (proxy aveugle
aux changements récents). - Fix : le régime courant = la séquence terminale de doses à
(ester effectif, dose mg, écart inter-doses) constants — tout
changement récent réinitialise la stabilisation : la recommandation saute
au premier creux après la stabilisation du nouveau régime (règle des
~5 demi-vies conservée, intervalle comparé exactement). La carte porte
désormais l'ester effectif de la dernière dose (override compris). - Nouveau : suggestion aussi sur l'Accueil (demande) — carte compacte
(creux daté + créneau associé), avec la mention de stabilisation
seulement si le régime n'était pas déjà stable. - Validé émulateur sur l'export réel : la carte passe de « stabilisé depuis
le 06/02 » (v1.8.0) à « EEN pas stabilisé avant le 29/09 — premier
creux fiable après ton dernier changement », creux recommandé 27/09
22:43, 0 crash. - 3 nouveaux tests (223 au total / 193 sans les données locales) :
changement de dose / d'intervalle / d'ester → réinitialisation épinglée. - Web : même fix en miroir + encart Accueil (web v1.8.1, versions sync).
Downloads
- Bug remonté : la recommandation disait « stabilisée depuis février »
-
v1.8.0 Stable
released this
2026-09-17 18:47:38 +02:00 | 26 commits to main since this releaseProchaine prise de sang recommandée (page Analyses)
- Nouvelle carte sur la page Analyses : « Prochaine prise de sang
(suggestion) » — l'app déduit de ses courbes quand refaire une analyse :
au creux estimé, juste avant l'injection suivante (le creux est le
moment le plus informatif et comparable ; l'heure exacte du creux calculé
est affichée, avec la mention « ou simplement la veille du créneau »). - Condition de stabilité (choix v1.8.0) : un creux n'est interprétable
que si l'ester est stabilisé — règle des ~5 demi-vies terminales
(≈ 97 % de l'équilibre). L'app saute donc au premier creux stabilisé
après un changement d'ester/dose/rythme, et la carte l'explique
(« stabilisé depuis le … (~5 demi-vies) » / « c'est le premier creux fiable
depuis ton dernier changement »). Le modèle Estrannaise lit sa demi-vie
dans les tables (nouveauPKProfileStore.terminalHalfLifeDays), TFS/WHSAH
la calculent analytiquement. - Périmètre honnête : la carte n'apparaît que s'il existe un traitement
E2 injectable actif avec une Posologie (sinon pas de creux prévisible) ;
et si un injectable actif est SANS Posologie, la page affiche une invite
« renseigne une Posologie pour recevoir des recommandations » (demande
v1.8.0). Créneaux déjà mesurés jamais re-recommandés (prise en compte des
analyses existantes). Calcul hors UI thread + rafraîchi chaque minute ;
disclaimer estimation visible sur la carte. - 11 nouveaux tests (220 au total / 190 sans les données locales) :
LabTimingTest (8 : creux avant créneau, saut de stabilisation, stabilisé,
prise récente → creux suivant, sans Posologie → null, oral → null,
invite, Estrannaise lit sa t½ dans la table) + régression n°5 étendue
(recommandation cohérente sur l'export réel). - Porté web (web v1.8.0, versions sync) :
js/pk/lab-timing.jsmiroir +
encart + scénario E2E. - Validé émulateur §16.ter (APK release, seed réel v1.7.0) : carte rendue —
« creux 20/09 10:37, juste avant l'injection EEN du 20/09 11:20, EEN
stabilisé depuis le 06/02 » — 0 crash.
Downloads
- Nouvelle carte sur la page Analyses : « Prochaine prise de sang
-
v1.7.1 Stable
released this
2026-09-17 12:29:44 +02:00 | 27 commits to main since this releaseCorrigé — une seule note sur deux s'affichait dans les Analyses
- Bug remonté (identique côté web) : dans une prise de sang E2+T, quand
les deux entrées portent des notes distinctes, une seule s'affichait
dans l'écran Analyses — l'autre était bien conservée (export/import
l'avaient) mais perdue à l'affichage. - Cause : l'affichage ne prenait que la première note non vide du groupe
(hypothèse historique « toutes identiques en pratique » — vraie à l'époque
du dialog de création, fausse depuis l'édition unitaire E2/T). - Fix :
labNotesForDisplay(helper pur, testé) — notes distinctes →
une ligne par note préfixée du marqueur (« E2 : … » / « T : … ») ;
note identique sur les deux entrées → une seule ligne (pas de doublon) ;
notes vides ignorées ; une seule note → brute (comportement v1.0 gardé). - Épinglé par : 5 nouveaux tests LabsGroupingTest + régression n°5
data-driven sur le nouvel export réel (v1.7.0 : la dernière prise
porte exactement ce cas — deux notes distinctes E2/T, les deux
affichées). Validé émulateur sur l'APK release seedé avec cet export. - Web : même fix en miroir (web v1.7.1, versions sync).
Downloads
- Bug remonté (identique côté web) : dans une prise de sang E2+T, quand
-
v1.7.0 Stable
released this
2026-09-16 19:52:04 +02:00 | 28 commits to main since this releaseSauvegarde automatique quotidienne (opt-in)
- Nouvelle option Paramètres → « Sauvegarde automatique quotidienne »
(désactivée par défaut, en PLUS de l'export manuel qui reste inchangé) :
chaque jour, l'app écrit une sauvegarde JSON complète (MÊME format que
l'export manuel — importable tel quel) dans le dossier que tu choisis
(ex. un dossier Owncloud synchronisé → le backup atterrit dans ton cloud). - Aucune permission de stockage : le dossier est choisi UNE FOIS via le
sélecteur système (SAF) — la permission persiste (survit au reboot), tu
peux la révoquer à tout moment dans les réglages système. 100 % local :
l'écriture va uniquement dans CE dossier. - Rétention configurable (1–30 copies, défaut 7) : chaque run crée un
NOUVEAU fichier horodatéhormonetrack-auto-20260913-1830.json(jamais
d'écrasement — les N dernières copies saines restent disponibles) et les
plus vieilles sont supprimées. Tes exports manuels, tes logs et tout
fichier étranger du dossier ne sont JAMAIS touchés (rétention pure,
épinglée par tests). - Statut visible : « Dernière sauvegarde : OK/ÉCHEC (date) » dans
Paramètres + journalisation AppLog complète (diagnostic à distance).
À l'activation, un premier backup est écrit immédiatement (pas
d'attente de 24 h) ; ensuite WorkManager (24 h, survit au reboot, gère
le Doze). - 9 nouveaux tests (200 au total / 177 sans les données locales) : noms
horodatés (règle anti-#48 : signature LocalDateTime obligatoire), garde
de rétention (jamais de suppression hors auto-backups reconnaissables,
keep clampé ≥ 1 —keep=0ne supprime jamais la dernière copie). - Validé sur émulateur (§16.ter, APK release + recette standard) : dossier
choisi via le sélecteur SAF, fichierhormonetrack-auto-…jsonécrit,
rétention appliquée, 0 crash.
Unités des axes du graphique
- pg/mL (E2, axe gauche) et ng/mL (T, axe droit) affichées au sommet
des colonnes de labels du graphique de simulation — remontée : « on n'a
jamais ajouté les unités des mesures dans les axes » (des nombres nus
depuis la v1.0). Portées aussi côté web (v1.7.0 web, versions sync).
Downloads
- Nouvelle option Paramètres → « Sauvegarde automatique quotidienne »
-
v1.6.0 Stable
released this
2026-09-13 03:43:11 +02:00 | 29 commits to main since this release« Tracé labs » prolongé au-delà du dernier lab
- Nouveau chip
Prolonger(à côté deTracé labs, off par défaut,
sans effet — donc désactivé — tant que Tracé labs est off) : la courbe
ancrée sur tes prises de sang se PROLONGE désormais au-delà du dernier lab,
au lieu de s'arrêter là (limite v1.5.0 : justement la période la plus
récente était invisible). - Recette de la prolongation :
courbe(t) = M(t) × ρ_dernier laboù
M(t) = le modèle PK brut (porte TOUTE la dynamique : Tmax, queues,
accumulation et les doses loguées après le dernier lab — une nouvelle
injection, même à un autre ester, fait repartir la courbe en pic) et
ρ = le ratio corps-réel ÷ modèle observé au dernier lab, supposé constant.
Demande couverte : simuler à partir des labs précédents, du dosage et du
type d'ester injecté, et de l'évolution classique de l'ester. - Horizon honnête : la prolongation s'arrête quand le MODÈLE lui-même
s'éteint (dernière dose + coupure moteur = 10 t½ terminales V3C/WHS, fin
de table ODS, 30 t½ Bateman) — jamais de ligne à zéro inventée au-delà. - Lisibilité : la partie prolongée est dessinée SÉPARÉMENT (même rose,
atténué) avec sa propre légende — « estimation, plus ancrée » : la partie
mesurée (qui passe par les labs) ne peut pas se confondre avec la partie
simulée. - Avertissement visible (demande) : tant que la partie prolongée est
affichée, un texte sous la légende rappelle que c'est une simple
simulation sans garantie de correspondre au réel, extrapolée à partir
de tes résultats de laboratoire — qui peuvent eux-mêmes être erronés
— et qu'il faut se fier à la prochaine prise de sang, pas à cette courbe. - Garde anti-ratés inchangée : seuls les labs SIGNIFICATIFS ancrent
(leçon #61) — un lab tardif hors fenêtre d'action ne prolonge pas la
courbe et n'est jamais traversé. - Limites documentées (cf doc de développement §7.10.bis) : ρ est
constant (pas d'extrapolation de pente — elle divergerait sans base
physiologique) ; après un changement d'ester, l'amplitude reste calibrée
par le ρ de l'ancien ester (même limite que la calibration classique) ;
les doses PRÉVISIONNELLES ne participent pas (la projection reste la
série Prévision). - 8 nouveaux tests (191 au total / 168 sans les données locales) :
identité ρ constant + continuité de suture, horizon = cutoff du
traitement, montée après une dose EV loguée après le dernier lab,
flag off = comportement v1.5.0 bit-compatible, garde #61 sur la
prolongation, gardes du helper d'horizon,lastAnchorMs. - Validé sur émulateur (recette §16.ter, APK release + données
réelles seedées) — et heureusement : la validation a TROUVÉ le bug
#64 (courbe vide en release seule, inlining destructeur de R8 full
mode surLabTrajectoryModel, cf doc §14). FIX : garde R8 explicite ;
re-validé en release : ancrée, prolongée, avertissement, 0 crash.
Downloads
- Nouveau chip
-
v1.5.0 Stable
released this
2026-09-11 16:11:02 +02:00 | 33 commits to main since this release« Tracé labs » — courbe ancrée sur tes prises de sang
-
- Nouvelle courbe superposable (chip
Tracé labs, off par défaut) courbe(t) = M(t) × ρ(t)— le modèle PK garde la forme biologique
(Tmax, queues, accumulation) et l'amplitude est recalée sur CHAQUE prise
de sang : la trajectoire réelle que tes labs tracent, avec la dynamique
du modèle entre les points.
- Nouvelle courbe superposable (chip
- Passage exact garanti sur chaque lab ; transition continue
(log-linéaire) d'un lab au suivant — jamais de saut vertical. - Garde anti-ratés : un lab qui ne « gouverne » plus la prédiction du
modèle (< 15 % du max, cf leçon #61) n'est PAS forcé-traversé — une
dose de test de janvier ne crée pas de zigzag. - E2 uniquement (unité pg/mL) ; fenêtre = entre le 1er et le dernier
lab significatif — rien avant/après : la courbe s'arrête à ta dernière
prise de sang (honnête, pas d'extrapolation). - Indépendante de la calibration (elle est SA propre référence) et
n'entre JAMAIS dans l'accueil/les seuils d'alerte/les rappels — une
courbe de comparaison, pas une estimation d'action. - Couleur dédiée rose foncé pointillé, hors pics/creux.
Améliorations UI
- La rangée de chips du graphique défile horizontalement (le 4ᵉ chip
était coupé hors fenêtre sur écrans étroits — constat émulateur v1.5.0).
Downloads
-