Docs : audit doc↔code — arbre §4 complet, leçons 12/13 (§11), 132 tests

Constats de l'audit systématique :
- arbre §4 sans les fichiers conteneurisation (Dockerfile, nginx.conf,
  compose, .dockerignore) ni container-test.sh / publish-release.py
- check.sh décrit 1→6 (actualisé : + mode --release 7→9)
- suite lab-trajectory absent de l'arbre tests/
- mentions « 121 tests » périmées → 132 (statut/démarrage/§2/§8/footer)
- leçons de portage v1.5.0 ajoutées au §11 (12 : clé LAB skippée de la
  légende, miroir #63 Android ; 13 : imports ESM = modules exacts)
This commit is contained in:
Siphonight 2026-09-11 16:27:56 +02:00
parent dfef8e90ef
commit 38cf62826e
2 changed files with 30 additions and 7 deletions

View File

@ -182,7 +182,7 @@ in-app s'affiche quand même à l'heure du rappel, page ouverte).
## Doc de développement ## Doc de développement
Architecture, portage fichier par fichier, format du backup, processus de Architecture, portage fichier par fichier, format du backup, processus de
test (121 tests Node + E2E navigateur), processus de push et pièges connus : test (132 tests Node + E2E navigateur), processus de push et pièges connus :
**[docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md)**. **[docs/DEVELOPPEMENT.md](docs/DEVELOPPEMENT.md)**.
## Licence ## Licence

View File

@ -60,7 +60,7 @@ Règles du portage, fixées au départ :
| Choix | Décision | Pourquoi | | Choix | Décision | Pourquoi |
|---|---|---| |---|---|---|
| Langage | JavaScript ES modules natifs (pas de TS, pas de build) | zéro chaîne de compilation → le déploiement = copier le dossier ; les types critiques sont documentés en JSDoc et épinglés par 121 tests | | Langage | JavaScript ES modules natifs (pas de TS, pas de build) | zéro chaîne de compilation → le déploiement = copier le dossier ; les types critiques sont documentés en JSDoc et épinglés par 132 tests |
| Framework UI | Aucun — DOM via un helper `el()` (`ui/components.js`) | même philosophie que la v1 Android (pas de ViewModel/DI) ; une seule abstraction à connaître | | Framework UI | Aucun — DOM via un helper `el()` (`ui/components.js`) | même philosophie que la v1 Android (pas de ViewModel/DI) ; une seule abstraction à connaître |
| Rendu graphique | Canvas 2D natif (portage de `CurveChart.kt`) | pas de lib de charts : fidélité du rendu, zéro dépendance | | Rendu graphique | Canvas 2D natif (portage de `CurveChart.kt`) | pas de lib de charts : fidélité du rendu, zéro dépendance |
| Persistance | `localStorage` (clés préfixées `hormonetrack.`) | données petites (JSON) ; backend INJECTABLE → testable en Node (`store.setBackend(new Map())`) | | Persistance | `localStorage` (clés préfixées `hormonetrack.`) | données petites (JSON) ; backend INJECTABLE → testable en Node (`store.setBackend(new Map())`) |
@ -140,6 +140,10 @@ HormoneTrack-web/ (dépôt séparé)
├── index.html page unique (SPA) — shell construit par app.js ├── index.html page unique (SPA) — shell construit par app.js
├── css/style.css thème (couleurs = Color.kt Android), mobile-first ├── css/style.css thème (couleurs = Color.kt Android), mobile-first
├── LICENSE GPL-3.0 (copie de l'Android — dépôt autonome) ├── LICENSE GPL-3.0 (copie de l'Android — dépôt autonome)
├── Dockerfile image de déploiement (nginx-unprivileged, §10)
├── nginx.conf server block no-cache/gzip/sécurité (§10)
├── docker-compose.yml run durci (read_only + tmpfs, §10)
├── .dockerignore runtime seulement (docs/ INCLUS — changelog)
├── .gitignore node_modules, package-lock, local-test-data ├── .gitignore node_modules, package-lock, local-test-data
├── assets/pk_profiles.json COPIE de l'asset Android (tables Estrannaise) ├── assets/pk_profiles.json COPIE de l'asset Android (tables Estrannaise)
├── js/ ├── js/
@ -219,9 +223,17 @@ HormoneTrack-web/ (dépôt séparé)
│ └── CHANGELOG.md journal web (lu par le dialog « Nouveautés ») │ └── CHANGELOG.md journal web (lu par le dialog « Nouveautés »)
├── scripts/ ├── scripts/
│ ├── serve.py serveur statique de dev (no-cache, MIME ok) │ ├── serve.py serveur statique de dev (no-cache, MIME ok)
│ ├── check.sh vérifications 1→6 (syntaxe, i18n, tests, E2E, HTTP) │ ├── check.sh vérifications 1→6 (syntaxe, i18n, tests, E2E,
│ │ smoke HTTP) + mode --release : 7→9 (cohérence
│ │ version↔changelog↔tag, arbre propre, test
│ │ conteneur si daemon — §10)
│ ├── i18n-check.mjs cohérence FR/EN + clés utilisées │ ├── i18n-check.mjs cohérence FR/EN + clés utilisées
│ └── e2e.mjs E2E playwright (Firefox headless, ?demo=1) │ ├── e2e.mjs E2E playwright (Firefox headless, ?demo=1 ;
│ │ mode conteneur via HRT_E2E_BASE)
│ ├── container-test.sh build + run DURCI + headers/gzip/MIME +
│ │ E2E contre le conteneur ([port] [platform])
│ └── publish-release.py publie la release Gitea (zip = git archive
│ AU TAG, vérifié par téléchargement)
├── tests/ ── node --test (miroirs des suites Kotlin) ── ├── tests/ ── node --test (miroirs des suites Kotlin) ──
│ ├── helpers.js fixtures (makeTreatment/makeDose/makeLab, asset) │ ├── helpers.js fixtures (makeTreatment/makeDose/makeLab, asset)
│ ├── pk-profiles.test.js ← PKProfileStoreTest.kt (pics ODS, casse #22…) │ ├── pk-profiles.test.js ← PKProfileStoreTest.kt (pics ODS, casse #22…)
@ -230,6 +242,8 @@ HormoneTrack-web/ (dépôt séparé)
│ ├── pk-engine.test.js ← PharmacokineticEngineTest.kt (+ #35, §6.bis) │ ├── pk-engine.test.js ← PharmacokineticEngineTest.kt (+ #35, §6.bis)
│ ├── 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
│ │ « Tracé labs » — passage exact, garde #61)
│ ├── 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)
@ -362,7 +376,7 @@ Pièges rencontrés :
|---|---|---|---| |---|---|---|---|
| Syntaxe | `node --check` | tous les modules ES | `bash scripts/check.sh` | | Syntaxe | `node --check` | tous les modules ES | `bash scripts/check.sh` |
| i18n | `scripts/i18n-check.mjs` | clés FR/EN synchronisées + clés utilisées | (dans check.sh) | | i18n | `scripts/i18n-check.mjs` | clés FR/EN synchronisées + clés utilisées | (dans check.sh) |
| Unitaires | `node --test` | **121 tests** : noyau PK, calibration, backup, store, helpers, alertes, rappels, changelog | `npm test` | | Unitaires | `node --test` | **132 tests** : noyau PK, calibration, backup, store, helpers, alertes, rappels, changelog, tracé labs (v1.5.0) | `npm test` |
| E2E navigateur | playwright-core + build Firefox | app réelle : rendu, canvas peint (pixels), navigation, dialog changelog, langue | `npm run e2e` | | E2E navigateur | playwright-core + build Firefox | app réelle : rendu, canvas peint (pixels), navigation, dialog changelog, langue | `npm run e2e` |
| Smoke HTTP | curl | ressources clés en 200 | `check.sh --with-serve` | | Smoke HTTP | curl | ressources clés en 200 | `check.sh --with-serve` |
@ -469,7 +483,7 @@ fonctionnalités (sauf impossibilités structurelles §12).
**v1.4.10 = la première release web publiée (8 sept. 2026, cloudyfy)** : **v1.4.10 = la première release web publiée (8 sept. 2026, cloudyfy)** :
tag + release Gitea avec l'archive zip de déploiement, APRES validation tag + release Gitea avec l'archive zip de déploiement, APRES validation
complète (121 tests unitaires + E2E navigateur local + container-test réel complète (132 tests unitaires + E2E navigateur local + container-test réel
en configuration durcie). Le dépôt farewell reste en attente de la création en configuration durcie). Le dépôt farewell reste en attente de la création
du repo (one-shot côté Gitea). du repo (one-shot côté Gitea).
@ -667,6 +681,15 @@ 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)
dans la liste `curves` est SKIPPÉE de la boucle de légende (légende
dédiée à part) — même bug qu'Android : le `else` (TFS) imprimerait la
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).
13. **Imports ESM = noms de modules EXACTS** (v1.5.0) : `labIsSignificant`
vit dans `pk-calibration.js` (pas `pk-engine.js`) — un import du
mauvais module = SyntaxError AU CHARGEMENT, l'app entière ne démarre
pas ; attrapé par `node --check` + l'E2E « aucune erreur console ».
## 12. Limites connues & non-portés ## 12. Limites connues & non-portés
@ -701,7 +724,7 @@ Structurels (plateforme), pas des bugs :
--- ---
*Doc mise à jour le 11 sept. 2026 (web v1.5.0 — sync Android, dépôt séparé *Doc mise à jour le 11 sept. 2026 (web v1.5.0 — sync Android, dépôt séparé
HormoneTrack-web) — portage de l'Android v1.4.10, 121 tests verts + E2E, HormoneTrack-web) — sync Android v1.5.0, 132 tests verts + E2E,
backup compatible bidirectionnel, historique propre (aucune donnée de backup compatible bidirectionnel, historique propre (aucune donnée de
santée, aucune dette de confidentialité), versions alignées sur santée, aucune dette de confidentialité), versions alignées sur
l'Android.* l'Android.*