- computeEsterScaleFactors : chaque lab est attribué à la période d'injection dans laquelle il tombe (dernière dose E2 <= lab → son ester) ; facteur final par ester = médiane des ratios de cette période. Corrige le mélange des périodes valerate/enanthate qui gonflait les courbes (250-375 pg/mL) - e2At/computeCurve : paramètre scalePerEster (chaque dose scalée par le facteur de SON ester, fallback = scaleFactor stocké du traitement) - autoCalibrated : renvoie esterScales + tConfig recalibré, traitements inchangés - convertTToNgMl : conversion défensive pg/mL et µg/L (un lab T « 38 pg/mL » écrasait l'axe T et rendait la courbe T invisible — remonté utilisateur) - LabDialog create/edit : tap sur une ligne de l'écran Analyses → édition pré-remplie (formatLabValue préserve les décimales) - Home : tap sur le mini-graphique → écran Graphiques + mini-légende E2/T - Settings : UNE seule option « Calibration automatique (E2 + T) » (E2 par période d'ester + modèle T), placée au-dessus des réglages T manuels - RegressionUserCase2Test : 2e export réel épinglé (9 doses EEn/TFS, 8 labs, fréquence 6 j) — vérifie l'état d'équilibre EEn (~270 pg/mL calibré, cohérent labs 306/248 ; non calibré ≈ 367 = les « 375 » rapportés) - V120FeaturesTest : attribution des labs par période d'ester + scalePerEster - 44 tests verts ; versionCode 4, versionName 1.2.1 - Docs : CHANGELOG, DEVELOPPEMENT (§7.6 réécrit), GUIDE, README
124 lines
7.3 KiB
Markdown
124 lines
7.3 KiB
Markdown
# Changelog — HormoneTrack
|
||
|
||
Format : [Keep a Changelog](https://keepachangelog.com/fr-FR/1.1.0/).
|
||
Versionnage : [SemVer](https://semver.org/). Releases taguées dans git (`v1.2.1`, …).
|
||
|
||
## [1.2.1] — 2026-09-05 (versionCode 4)
|
||
|
||
### Corrigé
|
||
- **Calibration par PÉRIODE D'ESTER** (le fond du problème « courbes à 250–375 ») :
|
||
la calibration automatique calculait UN facteur par traitement, mélangeant les labs
|
||
de toutes les périodes — un lab valerate comparé à une prédiction enanthate donne un
|
||
ratio aberrant qui gonfle la courbe. Désormais chaque lab est **attribué à la période
|
||
d'injection dans laquelle il tombe** (dernière dose E2 ≤ lab → son ester) et le
|
||
facteur est la médiane des ratios de CETTE période : labs valerate → doses
|
||
valerate, labs enanthate → doses enanthate (`computeEsterScaleFactors` +
|
||
paramètre `scalePerEster` dans `e2At`/`computeCurve`).
|
||
Vérifié sur les données réelles : l'état d'équilibre EEn (t½ ≈ 6,7 j, doses tous
|
||
les 6–7 j → accumulation ×2) donne ~270 pg/mL calibré — cohérent avec les labs
|
||
300/250 ; les « 375 » rapportés = le même calcul **non calibré** (268/0,72 ≈ 367).
|
||
- **Lab T saisi en "pg/mL"** (38 "pg/mL" — faute de frappe) : renvoyé brut, il
|
||
écrasait l'axe T (~40) et **rendait la courbe T invisible** (écrasée en bas).
|
||
Conversion défensive ajoutée (`pg` → ÷1000, `µg/L` → ÷1000).
|
||
|
||
### Ajouté
|
||
- **Édition des résultats de labo** (comme les doses) : appuyer sur une ligne de
|
||
l'écran Analyses ouvre le dialog pré-rempli (marqueur, valeur, unité, date/heure,
|
||
notes). Nouveau formateur `formatLabValue` (préserve les décimales : 0,44 reste
|
||
0,44, contrairement à formatDose).
|
||
- **Tap sur le graphique de l'accueil → écran Graphiques** + mini-légende (E2 bleu /
|
||
T rose) + indication.
|
||
- **Calibration automatique fusionnée** : UNE seule option dans Paramètres qui couvre
|
||
**E2 (par période d'ester) ET T** — plus de réglage T isolé ; le bouton manuel
|
||
« Calibrer avec les analyses » (T) reste comme action ponctuelle.
|
||
- **8 nouveaux tests** (44 au total) dont `RegressionUserCase2Test` épinglé sur le
|
||
2ᵉ export réel (9 doses EEn/TFS, 8 labs, fréquence 6 j) — inclut la vérification
|
||
de l'état d'équilibre et du lab T en unité aberrante.
|
||
|
||
### Modifié
|
||
- `AutoCalibrated` : `treatments` inchangés (plus de copies avec SF modifié), nouveau
|
||
champ `esterScales: Map<String, Double>` + `calibratedEsters`.
|
||
|
||
## [1.2.0] — 2026-09-05 (versionCode 3)
|
||
|
||
### Ajouté
|
||
- **Panoramique du graphique** : fais glisser le graphique vers la droite pour
|
||
remonter dans le passé (fenêtre glissante sur tout l'historique) ; bouton
|
||
« Revenir à maintenant ».
|
||
- **Les deux modèles PK superposables** : Estrannaise (bleu) et Transfem Science
|
||
(turquoise) tracées simultanément sur le même graphique, avec toggles
|
||
indépendants (override de modèle dans le moteur, indépendant du modèle stocké
|
||
par traitement).
|
||
- **Simulation prévisionnelle** : nouvelle section « Fréquence d'injection » dans
|
||
l'éditeur de traitement (intervalle en jours) → chip « Prévision » du graphique
|
||
qui projette les doses à venir (2× l'intervalle, borné 7–30 j) à partir de la
|
||
dernière injection réelle ; les doses projetées ne sont jamais sauvegardées et
|
||
conservent l'ester override de la dernière injection.
|
||
- **Calibration automatique (optionnelle)** : dans les Paramètres, option
|
||
« Calibration automatique » — ajuste à la volée (affichage seul) les facteurs
|
||
d'échelle et le modèle T depuis les labs ; désactivée par défaut, les valeurs
|
||
stockées ne sont jamais modifiées.
|
||
- **Intervalle entre dosages** : l'écran Doses affiche Δ (jours) entre chaque dose
|
||
et la précédente du même traitement (colonne « Interval (d) » du `.ods`).
|
||
- 6 nouveaux tests (`V120FeaturesTest`) → **36 tests**.
|
||
|
||
### Modifié
|
||
- **Montée des toolchains** : Gradle 9.7.1, **AGP 9.4.0** (Kotlin intégré — plus de
|
||
plugin `org.jetbrains.kotlin.android`, `kotlinOptions` supprimé), Kotlin 2.3.21,
|
||
KSP 2.3.11, **Compose BOM 2026.08.00** (Compose 1.12), Room 2.8.4,
|
||
Navigation 2.10.0, Activity 1.13.0, AppCompat 1.8.0, DataStore 1.2.1, Gson 2.14.0,
|
||
compileSdk/targetSdk **37**.
|
||
- Note Material You / Expressive : la BOM récente apporte composants et comportements
|
||
Material You ; `MaterialExpressiveTheme` reste **internal** dans la ligne material3
|
||
pinnée (vérifié par compilation) → `MaterialTheme` standard conservé, à basculer
|
||
dès que l'API devient publique (commenté dans `ui/theme/Theme.kt`).
|
||
|
||
### Corrigé
|
||
- **Horloge du TimePicker décentrée** (partait vers la gauche dans les dialogs de
|
||
saisie) : centrage explicite (Box + Center) dans `DateTimeField` et l'éditeur de
|
||
traitement.
|
||
- Migration Room **v1 → v2** propre (colonne `forecastIntervalDays`) avec
|
||
suppression du `fallbackToDestructiveMigration()` — les données réelles sont
|
||
protégées : une migration manquante plante bruyamment au lieu d'effacer.
|
||
|
||
## [1.1.0] — 2026-09-05 (versionCode 2)
|
||
|
||
### Corrigé
|
||
- **Courbes EEn plates à zéro** (le bug rapporté : « les graphiques ne se génèrent pas »).
|
||
Cause : casse des clés de profils — l'asset JSON (verbatim du `.ods`) contient
|
||
`"EEn_ese"`/`"EEn_tfs"` (n minuscule) alors que la constante `Esters.EEN = "EEN"` ;
|
||
le lookup exact échouait silencieusement → `sample() = 0` pour **tous** les traitements
|
||
EEn (EV et EU marchaient, ce qui masquait le bug). Fix : lookup **insensible à la casse**
|
||
dans `PKProfileStore` (`lookup()`), test de régression épinglé sur les données réelles
|
||
de l'utilisatrice (`RegressionUserCaseTest`, export v1.0.0 fourni).
|
||
- **Unités de testostérone** : les labs T pouvaient être saisis en ng/dL (cas réel :
|
||
33 et 44 ng/dL). L'axe T du chart mélangeait alors des ng/dL avec des estimations en
|
||
ng/mL (erreur ×100, courbe T invisible) et la calibration T aurait été faussée d'un
|
||
facteur 100. Fix : `PharmacokineticEngine.convertTToNgMl()` (ng/dL → ×0,01 ;
|
||
ng/L → ×0,001 ; nmol/L → ×0,2884 ; ng/mL inchangé), appliqué à la calibration **et
|
||
au rendu du chart**.
|
||
|
||
### Ajouté
|
||
- **Édition des doses** (le bug rapporté : « on ne peut pas modifier les entrées
|
||
d'injection ») : appuyer sur une ligne de l'écran Doses ouvre le dialog en mode
|
||
édition (traitement, dose, date/heure, notes) → enregistre sans recréer.
|
||
- **Choix de l'ester par injection** dans le dialog de dose (comme dans le `.ods`) :
|
||
« Défaut (EEn) », EV, EU, EEn — override stocké par dose, utilisé par le moteur PK.
|
||
- 6 tests de régression sur les données réelles de l'utilisatrice (30 tests au total).
|
||
|
||
### Technique
|
||
- `versionCode 2`, `versionName 1.1.0` ; APK debug régénérée.
|
||
|
||
## [1.0.0] — 2026-09-05 (versionCode 1)
|
||
|
||
Première version fonctionnelle :
|
||
- Courbes estimées E2/T heure par heure (24 h / 7 j / 30 j), modèles **Estrannaise** et
|
||
**Transfem Science** (tables horaires extraites de `Estrogen.ods` : EV/EU/EEn)
|
||
- Modèle Bateman paramétrable (gel/patch/oral)
|
||
- Log des doses, analyses de sang, calibration (facteur d'échelle médian lab÷prédiction)
|
||
- Estimation T empirique calibrable
|
||
- Rappels quotidiens (alarmes exactes) avec actions « Pris » / « Reporter 1 h »,
|
||
notifications remontant sur Huawei Watch GT 3 (Gadgetbridge ou Huawei Health)
|
||
- Sauvegarde/Restauration JSON (SAF), FR/EN (langue par app), 100 % local
|
||
- 24 tests unitaires (moteur PK, profils ODS, round-trip backup)
|