• v1.13.0 Stable

    Siphonight released this 2026-10-07 09:58:52 +02:00 | 0 commits to main since this release

    Ajouté — recommandation de prise de sang : valeur prédite, régime poolé, cible de creux

    • Valeur E2 attendue au creux recommandé : la carte affiche désormais
      « ≈ X pg/mL » quand l'auto-calibration fournit ses facteurs (sinon rien —
      une valeur brute non calibrée serait trompeuse). Miroir de
      LabRecommendation.predictedE2.
    • Régime poolé (pooledRegimeDoses, miroir du Kotlin) : les doses de
      tous les traitements partageant (ester effectif, mg) forment UNE séquence
      — un re-parenting d'historique (« … - old » créé a posteriori) ne
      redémarre plus la stabilisation. Garde-fous : ester ≠ → jamais poolé ;
      dose ≠ → exclue (le trou qui suit casse la séquence, conservateur).
    • Cible de creux E2 (opt-in, Paramètres) : référence personnelle pour la
      prochaine prise de sang — la valeur prédite est colorée dans/hors cible.
      ⚠️ DISTINCT des seuils d'alerte (surveillance continue + notifications) :
      la cible ne notifie jamais. Voyage dans le backup (champs optionnels,
      rétrocompatibles).

    Vérifié : 198 tests + E2E verts (check.sh).

    Downloads
  • v1.12.0 Stable

    Siphonight released this 2026-09-29 23:24:18 +02:00 | 2 commits to main since this release

    Corrigé — un traitement inactif à Posologie projetait encore ses injections (#70)

    • Miroir de l'Android v1.12.0 (remontée : « un traitement mis en inactif ne
      devrait plus être pris en compte pour les futures prédictions ») :
      generateForecastDoses (js/pk/pk-engine.js) garde !isActive — et
      l'horizon du chip Prévision du graphique (js/ui/chart.js) ne considère
      que les Posologies ACTIVES.
    • §6.bis inchangé : l'historique d'un inactif reste simulé — seul le FUTUR
      s'arrête. 3 tests miroirs (inactif vide, actif inchangé, avant/après
      archivage).

    Ajouté — page Doses : glyphes de forme de prise + marqueurs « prise de sang le même jour »

    • Chaque ligne de dose porte le glyphe de sa forme (💊 oral, 💉 injection
      IM/SC, 💧 gel, 🩹 patch, 🧴 autre — helper pur routeGlyph dans
      js/data/models.js, miroir de routeIcon).
    • Une analyse de sang LE MÊME JOUR qu'une dose affiche un encart latéral
      🧪↑ (avant la dose) et/ou 🧪↓ (après) — helper pur labMarkersForDose
      (js/util/format.js, jour calendaire LOCAL ; lab à l'heure exacte =
      APRÈS, convention documentée).
    • 10 tests (tests/doses-extras.test.js, miroirs de DosesExtrasTest.kt).

    Vérifié : 194 tests verts + E2E (check.sh).

    Downloads
  • v1.11.0 Stable

    Siphonight released this 2026-09-29 07:30:59 +02:00 | 3 commits to main since this release

    Ajouté — les traitements inactifs regroupés en bas de la page Traitements

    • Miroir de l'Android v1.11.0 (demande : « les traitements inactifs sont
      peu discernables — les placer à la fin, et peut-être les rendre plus
      distincts ») : les ACTIFS d'abord, les INACTIFS regroupés tout en bas
      sous un en-tête « Traitements inactifs » (seulement s'il en existe),
      cartes atténuées (opacity 0,55) en plus du badge.
    • Tri STABLE : l'ordre relatif à l'intérieur de chaque groupe est conservé.
      Helper pur treatmentsForDisplay dans js/data/models.js (miroir du
      Kotlin, node-safe) — 4 tests (tests/treatments-display.test.js,
      miroir de TreatmentsDisplayTest.kt).

    Vérifié : 184 tests verts + E2E (check.sh).

    Downloads
  • v1.10.0 Stable

    Siphonight released this 2026-09-27 23:10:10 +02:00 | 5 commits to main since this release

    Corrigé — la recommandation de prise de sang précédait la stabilisation (#68)

    • Miroir de l'Android v1.10.0 (remontée + données réelles → 6ᵉ régression
      épinglée côté Android) : le « creux » était le minimum de la fenêtre
      entière
      (créneau N−1 → créneau N). Pour un ester à montée lente (EEn :
      pic ~J+5 ≈ intervalle 7 j), ce minimum tombe juste après l'injection
      PRÉCÉDENTE
      (creux d'absorption, ~3 h) — la date proposée était gouvernée
      par l'injection N−1, antérieure à la stabilisation, et le texte « juste
      avant ton injection du … » était faux de plusieurs jours.
    • Fix : le creux = niveau PRÉ-INJECTION du créneau (dernier point de
      courbe avant l'injection) — restaure le principe v1.8.0 documenté et rend
      la carte cohérente. Pour les esters à t½ courte (EV), le point
      pré-injection EST le minimum de fenêtre : comportement inchangé.
    • Tests : la suite lab-timing (12) passe inchangée — sa sémantique épinglée
      (« creux juste avant l'injection, écart ≤ 2 h ») était déjà celle du fix ;
      180 tests + E2E verts (check.sh).

    Les autres changements de la v1.10.0 Android (dialog fantôme #69, rappel
    sauté si dose déjà loggée) n'ont pas d'équivalent web (notifications et
    intents de notification sont spécifiques Android).

    Downloads
  • v1.9.7 Stable

    Siphonight released this 2026-09-21 22:20:21 +02:00 | 6 commits to main since this release

    Corrigé — la suggestion de prise de sang « change tout le temps » à chaque injection

    • Miroir de l'Android v1.9.7 (remontée + données réelles) : la règle de
      stabilisation comparait l'écart inter-doses EXACTEMENT à l'écart
      précédent — un log 30 min plus tard cassait le régime et repoussait la
      stabilisation de 5 × t½ à chaque injection (creux recommandé fuyant).
    • Fix (tolérance) : chaque écart doit rester dans l'intervalle de
      Posologie ± 24 h
      (GAP_TOLERANCE_MS, fenêtre vs l'intervalle
      THÉORIQUE). Un vrai changement de créneau (2 j au lieu de 7 j) reste
      hors fenêtre. Tests : « interval change » ré-épinglé (+21 j) + 2 tests
      de tolérance miroirs (12 verts lab-timing).
    Downloads
  • v1.9.6 Stable

    Siphonight released this 2026-09-21 21:57:04 +02:00 | 7 commits to main since this release

    Modifié — la carte de l'accueil liste TOUTES les prochaines prises

    • Miroir de l'Android v1.9.6 (remontée : le rappel quotidien CPA masquait
      le rappel hebdomadaire EEn — « je ne le vois quasiment pas ») : la carte
      « Prochaine dose » devient « Prochaines doses » (titre pluriel dès 2
      lignes) — une ligne par traitement, TRIÉES par prochaine prise ;
      la 1ʳᵉ ligne (la plus proche) reste mise en avant. Format de ligne
      inchangé (Xj Yh · sam. 26 10:00 (nom), XhMM · HH:mm, N min).
    • Moteur : helper PUR nextDoseLineText dans format.js (miroir du
      Kotlin nextDoseLine) — 3 tests miroirs dans misc.test.js.
    • Les NOTIFICATIONS de rappel sont inchangées.
    Downloads
  • v1.9.5 Stable

    Siphonight released this 2026-09-20 12:55:51 +02:00 | 8 commits to main since this release

    Corrigé — revue de code post-v1.9.4 (audit lecture-seule des deux dépôts)

    • Garde de cutoffHours pour ESE (parité du Kotlin) : la branche ESE ne
      vérifiait pas hasModel(ester) — un traitement IMPORTÉ (le backup accepte
      toute string de pkModel/ester) avec un ester non couvert (ex. ECS/PEP en
      ESE) levait TypeError et laissait un écran vide. Retombe maintenant sur
      la garde Bateman (≥ 24 h), comme TFS/WHS le faisaient déjà.
    • min/max en UNE passe : les spreads Math.min(...allPoints) (≈ 5 par
      frame) lèvent RangeError au-delà de ~10⁵ arguments — atteignable avec
      le Nuage actif × zoom max (≈ 230 000 points) — et allouaient un tableau
      intermédiaire par appel. Remplacés par une boucle (chart.js +
      chart-canvas.js).
    • Init MCMC non bloquante : le démarrage n'attend plus le fetch de
      l'asset (seul le nuage lit le posterior, qui renvoie [] proprement) ;
      l'init re-rend à la fin et pose data-ready — la garantie E2E
      « data-ready ⇒ asset chargé » est maintenant RÉELLE (le commentaire
      antérieur était faux : le marqueur était posé avant le fetch).
    • Portage des optimisations Android v1.8.2 (la dérive de miroir était
      réelle) : contexte moteur pré-calculé (prepareE2Context/e2AtCtx —
      doses groupées, cutoffs par traitement, Bateman paresseux),
      computeCurve ne recalcule plus cutoffHours PAR POINT × traitement ni
      le scan complet de doseLogs. Résultats identiques (175 tests verts).
    • E2E version paramétrée : les asserts lisent data-version posé par
      l'app au lieu de strings codées en dur à bump à chaque release (l'oubli a
      produit le bug v1.9.3).

    Documenté — miroir nettoyé

    • En-tête de pk-engine.js à jour (ESE analytique v1.9.0, plus de tables
      ODS) ; JSDoc « troncature » de pk-calibration.js alignée sur
      Math.round (fix v1.9.2) ; dialogs.js (ESE=6) ; import mort et JSDoc
      orpheline de lab-timing.js retirés ; couleurs de l'accueil via
      COLORS (source unique avec le canvas).
    • pk_profiles.json exclu du zip de release (.gitattributes
      export-ignore, −548 Ko livrés) : plus fetché au runtime depuis v1.9.0 —
      l'asset ne survit que pour le test de fidélité RMS (miroir Android),
      pk-profile-store.js documenté test-only.
    Downloads
  • v1.9.4 Stable

    Siphonight released this 2026-09-19 23:29:41 +02:00 | 9 commits to main since this release

    Ajouté — les presets du modèle ESE couvrent ses 6 esters injectables

    • Remontée : depuis l'ajout du modèle source Estrannaise (v1.9.0), les
      presets de création n'offraient toujours que EV/EU/EEn — « les presets
      n'ont pas été mis à jour lors de l'ajout du modèle source pour ESE ».
    • Presets : 3 presets ESE ajoutés (25 entrées, miroir de
      PKPresets.kt) — EC huile (5 mg IM), EB (1 mg IM), EUCS undécylate
      suspension cristalline (10 mg SC, ester exclusif à ce fit). Champs
      Bateman informatifs = t½ terminales des fits (pas utilisés au calcul).
    • Éditeur : la liste des esters suit la couverture RÉELLE du modèle
      choisi (choicesForModel, parité Android v1.9.0) — ESE liste ses 6
      esters injectables ; au changement de modèle, si l'ester courant sort de
      la couverture (ex. EUCS + TFS), il rebascule sur EV (garde anti
      « 0 pg/mL ») et le formulaire se re-rend.
    • Corrigé (portage v1.9.0 incomplet) : Esters.EUCS manquait dans
      pk-engine.js (le preset référençait undefined) et choicesForModel
      (js/data/models.js) était resté sur la couverture des tables ODS
      (3 esters) avec sa KDoc obsolète « produirait 0 pg/mL ».
    • Tests : tests/presets.test.js (nouveau, 6 tests) — couverture des
      6 esters ESE, unicité, clés i18n EN/FR, TFS (7) / WHSAH (6) inchangés,
      choicesForModel aligné sur les dispatchs. Suite web : 175 tests.
    Downloads
  • v1.9.3 Stable

    Siphonight released this 2026-09-19 22:22:57 +02:00 | 12 commits to main since this release

    Corrigé — le numéro de version annoncé

    • Le dialog « Nouveautés » et Paramètres annonçaient 1.9.1 au lieu de
      1.9.2 (le commit de fix du nuage n'incluait pas la mise à jour de
      WEB_VERSION) — méta-correction de version, aucune autre différence
      avec 1.9.2
      (mêmes fonctionnalités que l'Android 1.9.2).
    Downloads
  • v1.9.2 Stable

    Siphonight released this 2026-09-19 22:16:13 +02:00 | 14 commits to main since this release

    Corrigé — le nuage d'incertitude exigeait un traitement STOCKÉ en ESE

    • Miroir du fix Android v1.9.2 : le filtre du nuage testait le pkModel
      STOCKÉ du traitement, alors que la courbe ESE affichée redessine
      toutes les doses E2 avec modelOverride = "ESE" — le nuage restait vide
      dès qu'aucun traitement n'était stocké 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. L'oral Bateman reste hors nuage.
    • Test réécrit : « les doses d'un traitement TFS sont couvertes quand ESE
      est affiché » (épinglé des deux plateformes) ; oral seul → vide.
    Downloads