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
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)**.
## Licence

View File

@ -60,7 +60,7 @@ Règles du portage, fixées au départ :
| 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 |
| 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())`) |
@ -140,6 +140,10 @@ HormoneTrack-web/ (dépôt séparé)
├── index.html page unique (SPA) — shell construit par app.js
├── css/style.css thème (couleurs = Color.kt Android), mobile-first
├── 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
├── assets/pk_profiles.json COPIE de l'asset Android (tables Estrannaise)
├── js/
@ -219,9 +223,17 @@ HormoneTrack-web/ (dépôt séparé)
│ └── CHANGELOG.md journal web (lu par le dialog « Nouveautés »)
├── scripts/
│ ├── 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
│ └── 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) ──
│ ├── helpers.js fixtures (makeTreatment/makeDose/makeLab, asset)
│ ├── 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)
│ ├── calibration.test.js ← CalibrationPerModel/ScaleFactorWhsahRepro/
│ │ 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
│ │ (local-test-data/ si présent, sinon skip)
│ ├── 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` |
| 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` |
| 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)** :
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
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
jamais exposer des champs `undefined` (les gardes `!== null` deviennent
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
@ -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é
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
santée, aucune dette de confidentialité), versions alignées sur
l'Android.*