Docs + process (web v1.6.0) : CHANGELOG, doc §4/§8/§11, garde de parité check.sh §3.bis
- check.sh : NOUVELLE étape 3.bis — garde de PARITÉ du portage Android↔web (si le dépôt Android voisin existe) : les symboles clés des features partagées (moteur prolongation, chip, avertissement) sont vérifiés des DEUX côtés — attrape un portage incomplet. - Doc : arbre §4, suite lab-trajectory-model (§8), scénario E2E (§8), leçons #12 étendue (LABX) et #14 (parité) (§11). - CHANGELOG web : entrée [1.6.0] (séparé du CHANGELOG Android). - README : statut web v1.6.0, 140 tests verts.
This commit is contained in:
parent
551d8fa29e
commit
ed623b786b
@ -17,7 +17,7 @@
|
|||||||
> Fie-toi toujours à tes analyses de sang et aux consignes de ton
|
> Fie-toi toujours à tes analyses de sang et aux consignes de ton
|
||||||
> endocrinologue.
|
> endocrinologue.
|
||||||
|
|
||||||
- **Statut** : web v1.5.0 — portage de l'Android v1.5.0 · **132 tests verts** ·
|
- **Statut** : web v1.6.0 — portage de l'Android v1.6.0 · **140 tests verts** ·
|
||||||
E2E navigateur ✅ · conteneur testé en configuration durcie ✅ · lint/i18n ✅
|
E2E navigateur ✅ · conteneur testé en configuration durcie ✅ · lint/i18n ✅
|
||||||
- **Journal des versions web** : [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
- **Journal des versions web** : [docs/CHANGELOG.md](docs/CHANGELOG.md)
|
||||||
- **Releases** : [gitea.cloudyfy.fr/Siphonight/HormoneTrack-web/releases](https://gitea.cloudyfy.fr/Siphonight/HormoneTrack-web/releases)
|
- **Releases** : [gitea.cloudyfy.fr/Siphonight/HormoneTrack-web/releases](https://gitea.cloudyfy.fr/Siphonight/HormoneTrack-web/releases)
|
||||||
|
|||||||
@ -5,6 +5,33 @@
|
|||||||
> section la plus récente EN PREMIER ; ce fichier est lu par le dialog
|
> section la plus récente EN PREMIER ; ce fichier est lu par le dialog
|
||||||
> « Nouveautés » de l'app web (fetch `docs/CHANGELOG.md`).
|
> « Nouveautés » de l'app web (fetch `docs/CHANGELOG.md`).
|
||||||
|
|
||||||
|
## [1.6.0] — 2026-09-12
|
||||||
|
|
||||||
|
### « Tracé labs » prolongé au-delà du dernier lab — portage de l'Android v1.6.0
|
||||||
|
|
||||||
|
- **Nouveau chip `Prolonger`** (à côté de `Tracé labs`, **off par défaut**,
|
||||||
|
désactivé tant que Tracé labs est off) : la courbe ancrée sur tes
|
||||||
|
prises de sang se PROLONGE au-delà du dernier lab — la limite v1.5.0
|
||||||
|
rendait invisible justement la période la plus récente.
|
||||||
|
- **Recette** : au-delà du dernier lab significatif, `courbe(t) = M(t) ×
|
||||||
|
ρ_dernier lab` — le modèle PK (dosages, esters injectés depuis, pics et
|
||||||
|
descentes classiques) × le ratio mesuré au dernier lab, supposé constant.
|
||||||
|
Les doses loguées APRÈS le dernier lab font repartir la courbe en pic
|
||||||
|
(override d'ester compris).
|
||||||
|
- **Horizon honnête** : la prolongation s'arrête quand le MODÈLE lui-même
|
||||||
|
s'éteint (dernière dose + cutoff moteur : 10 t½ terminales V3C/WHS, fin
|
||||||
|
de table ODS, 30 t½ Bateman) — jamais de ligne à zéro inventée.
|
||||||
|
- **Lisibilité** : partie prolongée dessinée SÉPARÉMENT (même rose,
|
||||||
|
atténué) avec sa légende dédiée + **AVERTISSEMENT visible** sous la
|
||||||
|
légende : 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. Fie-toi à ta prochaine prise de sang.
|
||||||
|
- Garde anti-ratés inchangée (#61) : un lab hors fenêtre d'action ne
|
||||||
|
prolonge pas la courbe et n'est jamais traversé.
|
||||||
|
- Portage fidèle : `extensionHorizonEndMs`/`lastAnchorMs` (miroir du
|
||||||
|
Kotlin), 8 nouveaux tests unitaires miroirs + **scénario E2E navigateur**
|
||||||
|
(activation des chips, légende et avertissement rendus).
|
||||||
|
|
||||||
## [1.5.0] — 2026-09-11
|
## [1.5.0] — 2026-09-11
|
||||||
|
|
||||||
### « Tracé labs » — portage de la version Android v1.5.0 (versions synchronisées)
|
### « Tracé labs » — portage de la version Android v1.5.0 (versions synchronisées)
|
||||||
|
|||||||
@ -163,7 +163,8 @@ HormoneTrack-web/ (dépôt séparé)
|
|||||||
│ │ ├── transfem-science-models.js V3C méta-analyse TFS (7 esters, params
|
│ │ ├── transfem-science-models.js V3C méta-analyse TFS (7 esters, params
|
||||||
│ │ │ copiés à l'identique du Kotlin)
|
│ │ │ copiés à l'identique du Kotlin)
|
||||||
│ │ ├── whsah-models.js fit WHSAH de Mona (6 esters, params identiques)
|
│ │ ├── whsah-models.js fit WHSAH de Mona (6 esters, params identiques)
|
||||||
│ │ ├── lab-trajectory-model.js « Tracé labs » (v1.5.0) : courbe hybride
|
│ │ ├── lab-trajectory-model.js « Tracé labs » (v1.5.0 + PROLONGATION
|
||||||
|
│ │ v1.6.0) : courbe hybride + extension ρ const
|
||||||
│ │ M(t)×ρ(t) ancrée sur les labs (miroir strict
|
│ │ M(t)×ρ(t) ancrée sur les labs (miroir strict
|
||||||
│ │ de pk/LabTrajectoryModel.kt — garde #61,
|
│ │ de pk/LabTrajectoryModel.kt — garde #61,
|
||||||
│ │ ρ log-linéaire, fenêtre labs)
|
│ │ ρ log-linéaire, fenêtre labs)
|
||||||
@ -243,7 +244,8 @@ HormoneTrack-web/ (dépôt séparé)
|
|||||||
│ ├── calibration.test.js ← CalibrationPerModel/ScaleFactorWhsahRepro/
|
│ ├── calibration.test.js ← CalibrationPerModel/ScaleFactorWhsahRepro/
|
||||||
│ │ V120Features (fixes #60/#61, périodes d'ester)
|
│ │ V120Features (fixes #60/#61, périodes d'ester)
|
||||||
│ ├── lab-trajectory-model.test.js ← LabTrajectoryModelTest.kt (v1.5.0
|
│ ├── lab-trajectory-model.test.js ← LabTrajectoryModelTest.kt (v1.5.0
|
||||||
│ │ « Tracé labs » — passage exact, garde #61)
|
│ │ « Tracé labs » + v1.6.0 prolongation —
|
||||||
|
│ │ passage exact, garde #61, horizon cutoff)
|
||||||
│ ├── backup.test.js ← BackupGsonTest.kt + exports Android RÉELS
|
│ ├── backup.test.js ← BackupGsonTest.kt + exports Android RÉELS
|
||||||
│ │ (local-test-data/ si présent, sinon skip)
|
│ │ (local-test-data/ si présent, sinon skip)
|
||||||
│ ├── chart-helpers.test.js ← ChartZoomTest.kt (#53/#54/#55/#58/#62)
|
│ ├── chart-helpers.test.js ← ChartZoomTest.kt (#53/#54/#55/#58/#62)
|
||||||
@ -411,7 +413,13 @@ launch) — d'où le build dédié dans le cache Playwright, hors dépôt.
|
|||||||
pipelines — jamais de médiane contaminée), k T contre l'E2 CALIBRÉE.
|
pipelines — jamais de médiane contaminée), k T contre l'E2 CALIBRÉE.
|
||||||
- **lab-trajectory-model** : v1.5.0 « Tracé labs » — miroir du Kotlin
|
- **lab-trajectory-model** : v1.5.0 « Tracé labs » — miroir du Kotlin
|
||||||
(passage exact, ρ log-linéaire, garde #61, fenêtres, indépendance du
|
(passage exact, ρ log-linéaire, garde #61, fenêtres, indépendance du
|
||||||
scaleFactor, modelOverride, doublons, bornes).
|
scaleFactor, modelOverride, doublons, bornes). v1.6.0 **prolongation**
|
||||||
|
(miroir §7.10.bis Android) : identité `M × ρ_last` exacte au-delà du
|
||||||
|
dernier lab, suture exacte, horizon = cutoff du traitement
|
||||||
|
(`extensionHorizonEndMs` — gardes : pas de dose / modèle déjà éteint →
|
||||||
|
null), dose EV loguée après le dernier lab → pic de prolongation,
|
||||||
|
garde #61 sur la prolongation, flag off = v1.5.0 bit-compatible,
|
||||||
|
`lastAnchorMs`.
|
||||||
- **backup** : round-trip v2, rétrocompat v1, écrasement + IDs conservés,
|
- **backup** : round-trip v2, rétrocompat v1, écrasement + IDs conservés,
|
||||||
**imports des exports Android réels** (data-driven, hors dépôt).
|
**imports des exports Android réels** (data-driven, hors dépôt).
|
||||||
- **chart-helpers** : cumul fractionnaire du pan (#62), minuit local (#55),
|
- **chart-helpers** : cumul fractionnaire du pan (#62), minuit local (#55),
|
||||||
@ -441,6 +449,12 @@ launch) — d'où le build dédié dans le cache Playwright, hors dépôt.
|
|||||||
- vérifie le **rendu réel** : cartes, valeurs, dialog « Nouveautés »
|
- vérifie le **rendu réel** : cartes, valeurs, dialog « Nouveautés »
|
||||||
(markdown rendu), navigation des 5 onglets + Paramètres, **pixels du
|
(markdown rendu), navigation des 5 onglets + Paramètres, **pixels du
|
||||||
canvas** (`getImageData` — le graphique PEINT vraiment) ;
|
canvas** (`getImageData` — le graphique PEINT vraiment) ;
|
||||||
|
- **v1.6.0 : scénario « Tracé labs prolongé »** — dézoome (dernier lab de
|
||||||
|
la démo à now − 7 j), vérifie que `Prolonger` est DÉSACTIVÉ tant que
|
||||||
|
`Tracé labs` est off, active les deux chips, asserting la légende
|
||||||
|
ancrée, la légende prolongée et l'**AVERTISSEMENT simulation** (sans
|
||||||
|
garantie, labs potentiellement erronés) — puis désactive et vérifie
|
||||||
|
qu'ils disparaissent ;
|
||||||
- vérifie l'**absence d'erreur console/page** sur toute la session ;
|
- vérifie l'**absence d'erreur console/page** sur toute la session ;
|
||||||
- captures dans `/tmp/hrt-web-shots/` (inspection visuelle).
|
- captures dans `/tmp/hrt-web-shots/` (inspection visuelle).
|
||||||
- ⚠️ Course au screenshot évitée par le marqueur `body[data-ready="1"]`
|
- ⚠️ Course au screenshot évitée par le marqueur `body[data-ready="1"]`
|
||||||
@ -681,15 +695,21 @@ Trouvés pendant l'écriture (à ne pas réintroduire) :
|
|||||||
11. **`getSettings()` fusionne les défauts** : un stockage partiel ne doit
|
11. **`getSettings()` fusionne les défauts** : un stockage partiel ne doit
|
||||||
jamais exposer des champs `undefined` (les gardes `!== null` deviennent
|
jamais exposer des champs `undefined` (les gardes `!== null` deviennent
|
||||||
fausses autrement).
|
fausses autrement).
|
||||||
12. **Miroir du fix #63 Android** (v1.5.0) : la clé `'LAB'` (Tracé labs)
|
12. **Miroir du fix #63 Android** (v1.5.0, étendu v1.6.0) : les clés
|
||||||
dans la liste `curves` est SKIPPÉE de la boucle de légende (légende
|
`'LAB'` ET `'LABX'` (Tracé labs ancré / prolongé) dans la liste
|
||||||
dédiée à part) — même bug qu'Android : le `else` (TFS) imprimerait la
|
`curves` sont SKIPPÉES de la boucle de légende (légendes dédiées à
|
||||||
|
part) — même bug qu'Android : le catchall (TFS) imprimerait la
|
||||||
légende TFS en doublon. Quand une liste clé→série reçoit une clé,
|
légende TFS en doublon. Quand une liste clé→série reçoit une clé,
|
||||||
grepper chaque consommateur de la liste (légende, stats, styles).
|
grepper chaque consommateur de la liste (légende, stats, styles).
|
||||||
13. **Imports ESM = noms de modules EXACTS** (v1.5.0) : `labIsSignificant`
|
13. **Imports ESM = noms de modules EXACTS** (v1.5.0) : `labIsSignificant`
|
||||||
vit dans `pk-calibration.js` (pas `pk-engine.js`) — un import du
|
vit dans `pk-calibration.js` (pas `pk-engine.js`) — un import du
|
||||||
mauvais module = SyntaxError AU CHARGEMENT, l'app entière ne démarre
|
mauvais module = SyntaxError AU CHARGEMENT, l'app entière ne démarre
|
||||||
pas ; attrapé par `node --check` + l'E2E « aucune erreur console ».
|
pas ; attrapé par `node --check` + l'E2E « aucune erreur console ».
|
||||||
|
14. **Parité du portage** (v1.6.0) : une feature Android portée à moitié
|
||||||
|
(moteur sans UI, clés i18n sans miroir) ne casse aucun test existant —
|
||||||
|
d'où la garde `check.sh` §3.bis : quand le dépôt Android voisin
|
||||||
|
existe, les symboles clés des features partagées sont vérifiés des
|
||||||
|
DEUX côtés (moteur + chip + avertissement).
|
||||||
|
|
||||||
## 12. Limites connues & non-portés
|
## 12. Limites connues & non-portés
|
||||||
|
|
||||||
|
|||||||
@ -63,6 +63,44 @@ if ! node scripts/i18n-check.mjs; then
|
|||||||
fail=1
|
fail=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "── 3.bis Garde de PARITÉ du portage Android ↔ web (soft) ──"
|
||||||
|
# v1.6.0 (leçon de la session « Prolonger ») : le web est un PORTAGE fidèle
|
||||||
|
# de l'Android — quand les deux dépôts sont côte à côte (layout standard,
|
||||||
|
# cf docs/DEVELOPPEMENT.md §3), on vérifie que les symboles CLÉS des
|
||||||
|
# dernières features partagées existent des DEUX côtés. Attrape le portage
|
||||||
|
# incomplet (ex. modèle porté mais pas l'UI, ou clés i18n Android sans
|
||||||
|
# miroir web). Soft : si le dépôt Android voisin est absent (clone web
|
||||||
|
# isolé, CI), la garde est ignorée avec un message.
|
||||||
|
ANDROID_DIR="$(dirname "$PWD")/HormoneTrack"
|
||||||
|
if [[ -d "$ANDROID_DIR" ]]; then
|
||||||
|
parity=1
|
||||||
|
check_pair() { # <desc> <fichier-android:pattern> <fichier-web:pattern>
|
||||||
|
local desc="$1" andro="$2" web="$3"
|
||||||
|
local af="${andro%%:*}" ap="${andro#*:}"
|
||||||
|
local wf="${web%%:*}" wp="${web#*:}"
|
||||||
|
if grep -qE "$ap" "$ANDROID_DIR/$af" 2>/dev/null \
|
||||||
|
&& grep -qE "$wp" "$wf" 2>/dev/null; then
|
||||||
|
echo " ✓ $desc"
|
||||||
|
else
|
||||||
|
echo "✗ PARITÉ rompue : $desc (Android: $ANDROID_DIR/$af =~ $ap ; web: $wf =~ $wp)"
|
||||||
|
parity=0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
# Le modèle de prolongation doit exister des deux côtés (v1.6.0)
|
||||||
|
check_pair "prolongation tracé labs : moteur" \
|
||||||
|
"app/src/main/java/com/hormonetrack/pk/LabTrajectoryModel.kt:extensionHorizonEndMs" \
|
||||||
|
"js/pk/lab-trajectory-model.js:extensionHorizonEndMs"
|
||||||
|
check_pair "prolongation tracé labs : UI (chip)" \
|
||||||
|
"app/src/main/res/values/strings.xml:show_lab_track_extend" \
|
||||||
|
"js/util/i18n.js:show_lab_track_extend"
|
||||||
|
check_pair "prolongation tracé labs : avertissement" \
|
||||||
|
"app/src/main/res/values/strings.xml:lab_track_extend_warning" \
|
||||||
|
"js/util/i18n.js:lab_track_extend_warning"
|
||||||
|
[[ $parity -eq 1 ]] || fail=1
|
||||||
|
else
|
||||||
|
echo " (ignoré : dépôt Android voisin absent — $ANDROID_DIR)"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "── 4. Tests unitaires ──"
|
echo "── 4. Tests unitaires ──"
|
||||||
if ! node --test tests/ 2>&1 | tail -6; then
|
if ! node --test tests/ 2>&1 | tail -6; then
|
||||||
fail=1
|
fail=1
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user