• v1.9.2 Stable

    Siphonight released this 2026-09-19 22:10:35 +02:00 | 20 commits to main since this release

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

    • Bug remonté : activer Estrannaise dans le graphique puis le nuage
      n'affichait rien tant qu'aucun traitement n'était stocké avec le
      modèle ESE — « la seule méthode trouvée était de mettre un traitement en
      cours sur le modèle ESE, mais ça ne devrait pas être un prérequis ».
    • Cause : 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" (peu importe le modèle stocké) — courbe
      et nuage n'utilisaient pas la même définition de « quelles doses sont
      tracées 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 (activable seulement si ESE est affiché). L'oral Bateman reste hors
      nuage (pas d'ester échantillonnable). Les traitements inactifs sont
      inclus (§6.bis : la courbe ESE les trace aussi).
    • 2 tests réécrits (237 au total / 207 sans les données locales) :
      « doses d'un traitement TFS couvertes quand ESE est affiché » (le fix,
      épinglé des deux plateformes) ; oral seul → vide (conservé).
    • Validé émulateur §16.ter sur le profil réel (EEn stocké TFS, ESE
      activé) : nuage visible autour de la courbe ESE, 0 crash.
    Downloads
  • v1.9.1 Stable

    Siphonight released this 2026-09-19 21:13:17 +02:00 | 21 commits to main since this release

    Corrigé — le nuage d'incertitude entoure maintenant la courbe Estrannaise calibrée

    • Bug remonté : le nuage ne s'activait « que autour du tracé, pas autour
      du modèle Estrannaise » — la courbe ESE affichée est calibrée
      (scalePerEster des labs) mais le nuage était tracé brut : les deux
      flottaient à des échelles différentes.
    • Fix : le nuage reçoit le MÊME scalePerEster que la courbe ESE
      (autoByModel ESE) — il entoure désormais la courbe calibrée (Android +
      web en miroir).
    • 1 nouveau test : nuage calibré ×2 = nuage brut ×2 (le nuage suit la
      calibration).

    Note — pourquoi le taux affiché a bougé depuis v1.8.2 (+4 pg/mL)

    • v1.8.2 a corrigé l'arrondi de la médiane de calibration (troncature
      flottante → arrondi au plus proche) : une échelle dont la médiane brute
      tombait à 0,8999… était tronquée en 0,89 au lieu de 0,90. Avec le modèle
      ESE analytique (v1.9.0) déplaçant ce dernier bit, le piège est devenu
      visible : les échelles auto-calibrées ont bougé d'un cran d'affichage →
      le niveau estimé a monté d'environ 1 % (+4 pg/mL sur ~320).
    • Le niveau actuel est le CORRIGÉ (l'arrondi est plus juste que la
      troncature). Le web applique la même règle depuis v1.9.1 (harmonisation
      des niveaux entre plateformes).
    Downloads
  • v1.9.0 Stable

    Siphonight released this 2026-09-19 20:44:30 +02:00 | 22 commits to main since this release

    Modèle Estrannaise ANALYTIQUE (abandon de l'ODS) + nuage d'incertitude MCMC

    • Le modèle ESE n'est plus les tables horaires ODS : il est désormais la
      forme close 3C publiée par estrannaise.js (les sources originelles
      dont l'ODS n'était que l'échantillonnage horaire) — fidélité épinglée :
      RMS 0,00 vs les tables sur 0→200 j, écart de pic ≤ 0,1 %.
    • Décision (utilisatrice) : « tous les modèles ont maintenant leurs
      sources originelles — on abandonne complètement les liens avec le fichier
      ODS ». Concrètement : plus aucune lecture des tables au runtime
      (concentrationOfDose dispatche ESE → forme close ; cutoffHours ESE →
      10 × t½ terminale analytique ; l'asset pk_profiles.json quitte l'APK,
      −550 Ko, et ne sert plus qu'aux tests de fidélité).
    • 6 esters injectables couverts (EV, EU, EEn, EC, EB + EUCS,
      undécylate suspension cristalline, exclusif à ce fit) — l'ancien ESE
      n'en couvrait que 3. TFS reste à 7 (liste explicite : EUCS n'a pas de
      V3C TFS), WHSAH à 6.
    • NUAGE D'INCERTITUDE (exclusif ESE) : Estrannaise publie le posterior
      MCMC de ses paramètres (313 échantillons/ester, asset ≈ 48 Ko) — chip
      Nuage (off par défaut, activable à volonté, actif SEULEMENT si ESE est
      affiché, coupure automatique si ESE est éteint) → nuage diffus de 32
      courbes du posterior montrant la plage d'imprécision du modèle, comme
      sur le site estrannaise. Dessiné en alpha faible sous les courbes, hors
      échelles/labels/extrema.
    • t½ terminale ESE désormais analytique (ln2/min(k1,k2,k3)) — la
      recommandation de prise de sang n'estime plus la t½ par pente de table.
    • 11 nouveaux tests (234 au total / 204 sans les données locales) :
      fidélité (RMS, pics ±0,2 %), cas dégénérés (taux égaux → limites sans
      NaN), MCMC 313 × 6, nuage (32 courbes à dispersion réelle, fenêtre,
      exclusivité ESE, gardes), choicesForModel ESE=6, t½ analytique.
    • Porté web (web v1.9.0, versions sync) : estrannaise-models.js +
      estrannaise-cloud.js miroirs, nuage canvas, fetch MCMC au démarrage
      (l'ODS web quitte aussi le runtime), 11 tests miroirs + E2E nuage.
    • Validé émulateur §16.ter (APK release, seed réel v1.7.0) : courbe ESE
      analytique affichée, chips Extend/Cloud présents, recommandation
      de prise de sang fonctionnelle, 0 crash.
    Downloads
  • v1.8.2 Stable

    Siphonight released this 2026-09-18 14:21:32 +02:00 | 24 commits to main since this release

    Maintenance — performance du moteur + fraîcheur de l'interface

    Aucune nouvelle fonctionnalité : session d'audit complet (code + doc), avec
    les optimisations et corrections sûres qui en sont sorties.

    Performance du moteur PK

    • e2At/computeCurve : cutoffHours et les paramètres Bateman
      (bisection 50 itérations) ne sont plus recalculés à chaque (point ×
      dose × traitement) — pré-calculés par traitement, et Bateman devient
      paresseux (inutile pour les traitements à profil). Le chemin le plus
      chaud (tracé labs : ~720 points × N × D appels de cutoff par refresh)
      s'allège d'un facteur P × T. Doses pré-groupées par traitement (fin des
      scans complets). Résultat identique (ordre de sommation préservé —
      223 tests verts inchangés).
    • AppLog : purge du buffer sans recopie à chaque ligne loggée.
    • ChangelogHelper : Regex précompilées (dialog « Nouveautés »).
    • CurveChart : SimpleDateFormat créé hors boucle de dessin.

    Corrigé — fraîcheur de l'interface

    • Accueil : éditer un scaleFactor ou le modèle T rafraîchit la courbe
      immédiatement (clés du producteur incomplètes — l'ancien trio attendait
      le tick de 60 s).
    • Graphiques : éditer la VALEUR d'une analyse rafraîchit les courbes
      (la clé n'était que le NOMBRE d'analyses).

    Maintenance — code & documentation

    • Code mort supprimé (Repository/DAO sans appelants, currentLevel,
      variable et scheduler dupliqués), imports morts/redondants nettoyés,
      médiane de calibration factorisée (4 copies → 1 helper),
      qualifications raccourcies, en-têtes/KDoc obsolètes mis à jour.
    • Documentation : ~35 corrections (compteurs de tests obsolètes, TOC et
      ancres réparées, inventaire des suites de tests à jour et fusionné,
      titres CHANGELOG doublés supprimés, versions « à jour v1.2.0 » /
      « Gradle 8.9 » / « API 34 » corrigées, fautes).
    Downloads
  • v1.8.1 Stable

    Siphonight released this 2026-09-17 19:48:20 +02:00 | 25 commits to main since this release

    Corrigé — la stabilisation ignorait les changements récents (dose/ester/intervalle)

    • Bug remonté : la recommandation disait « stabilisée depuis février »
      alors que l'ester, le dosage ET la posologie venaient de changer —
      l'ancien calcul partait de la 1ʳᵉ dose du traitement (proxy aveugle
      aux changements récents).
    • Fix : le régime courant = la séquence terminale de doses à
      (ester effectif, dose mg, écart inter-doses) constants — tout
      changement récent réinitialise la stabilisation : la recommandation saute
      au premier creux après la stabilisation du nouveau régime (règle des
      ~5 demi-vies conservée, intervalle comparé exactement). La carte porte
      désormais l'ester effectif de la dernière dose (override compris).
    • Nouveau : suggestion aussi sur l'Accueil (demande) — carte compacte
      (creux daté + créneau associé), avec la mention de stabilisation
      seulement si le régime n'était pas déjà stable.
    • Validé émulateur sur l'export réel : la carte passe de « stabilisé depuis
      le 06/02 » (v1.8.0) à « EEN pas stabilisé avant le 29/09 — premier
      creux fiable après ton dernier changement
      », creux recommandé 27/09
      22:43, 0 crash.
    • 3 nouveaux tests (223 au total / 193 sans les données locales) :
      changement de dose / d'intervalle / d'ester → réinitialisation épinglée.
    • Web : même fix en miroir + encart Accueil (web v1.8.1, versions sync).
    Downloads
  • v1.8.0 Stable

    Siphonight released this 2026-09-17 18:47:38 +02:00 | 26 commits to main since this release

    Prochaine prise de sang recommandée (page Analyses)

    • Nouvelle carte sur la page Analyses : « Prochaine prise de sang
      (suggestion) » — l'app déduit de ses courbes quand refaire une analyse :
      au creux estimé, juste avant l'injection suivante (le creux est le
      moment le plus informatif et comparable ; l'heure exacte du creux calculé
      est affichée, avec la mention « ou simplement la veille du créneau »).
    • Condition de stabilité (choix v1.8.0) : un creux n'est interprétable
      que si l'ester est stabilisé — règle des ~5 demi-vies terminales
      (≈ 97 % de l'équilibre). L'app saute donc au premier creux stabilisé
      après un changement d'ester/dose/rythme, et la carte l'explique
      (« stabilisé depuis le … (~5 demi-vies) » / « c'est le premier creux fiable
      depuis ton dernier changement »). Le modèle Estrannaise lit sa demi-vie
      dans les tables (nouveau PKProfileStore.terminalHalfLifeDays), TFS/WHSAH
      la calculent analytiquement.
    • Périmètre honnête : la carte n'apparaît que s'il existe un traitement
      E2 injectable actif avec une Posologie (sinon pas de creux prévisible) ;
      et si un injectable actif est SANS Posologie, la page affiche une invite
      « renseigne une Posologie pour recevoir des recommandations » (demande
      v1.8.0). Créneaux déjà mesurés jamais re-recommandés (prise en compte des
      analyses existantes). Calcul hors UI thread + rafraîchi chaque minute ;
      disclaimer estimation visible sur la carte.
    • 11 nouveaux tests (220 au total / 190 sans les données locales) :
      LabTimingTest (8 : creux avant créneau, saut de stabilisation, stabilisé,
      prise récente → creux suivant, sans Posologie → null, oral → null,
      invite, Estrannaise lit sa t½ dans la table) + régression n°5 étendue
      (recommandation cohérente sur l'export réel).
    • Porté web (web v1.8.0, versions sync) : js/pk/lab-timing.js miroir +
      encart + scénario E2E.
    • Validé émulateur §16.ter (APK release, seed réel v1.7.0) : carte rendue —
      « creux 20/09 10:37, juste avant l'injection EEN du 20/09 11:20, EEN
      stabilisé depuis le 06/02 » — 0 crash.
    Downloads
  • v1.7.1 Stable

    Siphonight released this 2026-09-17 12:29:44 +02:00 | 27 commits to main since this release

    Corrigé — une seule note sur deux s'affichait dans les Analyses

    • Bug remonté (identique côté web) : dans une prise de sang E2+T, quand
      les deux entrées portent des notes distinctes, une seule s'affichait
      dans l'écran Analyses — l'autre était bien conservée (export/import
      l'avaient) mais perdue à l'affichage.
    • Cause : l'affichage ne prenait que la première note non vide du groupe
      (hypothèse historique « toutes identiques en pratique » — vraie à l'époque
      du dialog de création, fausse depuis l'édition unitaire E2/T).
    • Fix : labNotesForDisplay (helper pur, testé) — notes distinctes →
      une ligne par note préfixée du marqueur (« E2 : … » / « T : … ») ;
      note identique sur les deux entrées → une seule ligne (pas de doublon) ;
      notes vides ignorées ; une seule note → brute (comportement v1.0 gardé).
    • Épinglé par : 5 nouveaux tests LabsGroupingTest + régression n°5
      data-driven sur le nouvel export réel
      (v1.7.0 : la dernière prise
      porte exactement ce cas — deux notes distinctes E2/T, les deux
      affichées). Validé émulateur sur l'APK release seedé avec cet export.
    • Web : même fix en miroir (web v1.7.1, versions sync).
    Downloads
  • v1.7.0 Stable

    Siphonight released this 2026-09-16 19:52:04 +02:00 | 28 commits to main since this release

    Sauvegarde automatique quotidienne (opt-in)

    • Nouvelle option Paramètres → « Sauvegarde automatique quotidienne »
      (désactivée par défaut, en PLUS de l'export manuel qui reste inchangé) :
      chaque jour, l'app écrit une sauvegarde JSON complète (MÊME format que
      l'export manuel — importable tel quel) dans le dossier que tu choisis
      (ex. un dossier Owncloud synchronisé → le backup atterrit dans ton cloud).
    • Aucune permission de stockage : le dossier est choisi UNE FOIS via le
      sélecteur système (SAF) — la permission persiste (survit au reboot), tu
      peux la révoquer à tout moment dans les réglages système. 100 % local :
      l'écriture va uniquement dans CE dossier.
    • Rétention configurable (1–30 copies, défaut 7) : chaque run crée un
      NOUVEAU fichier horodaté hormonetrack-auto-20260913-1830.json (jamais
      d'écrasement — les N dernières copies saines restent disponibles) et les
      plus vieilles sont supprimées. Tes exports manuels, tes logs et tout
      fichier étranger du dossier ne sont JAMAIS touchés
      (rétention pure,
      épinglée par tests).
    • Statut visible : « Dernière sauvegarde : OK/ÉCHEC (date) » dans
      Paramètres + journalisation AppLog complète (diagnostic à distance).
      À l'activation, un premier backup est écrit immédiatement (pas
      d'attente de 24 h) ; ensuite WorkManager (24 h, survit au reboot, gère
      le Doze).
    • 9 nouveaux tests (200 au total / 177 sans les données locales) : noms
      horodatés (règle anti-#48 : signature LocalDateTime obligatoire), garde
      de rétention (jamais de suppression hors auto-backups reconnaissables,
      keep clampé ≥ 1 — keep=0 ne supprime jamais la dernière copie).
    • Validé sur émulateur (§16.ter, APK release + recette standard) : dossier
      choisi via le sélecteur SAF, fichier hormonetrack-auto-…json écrit,
      rétention appliquée, 0 crash.

    Unités des axes du graphique

    • pg/mL (E2, axe gauche) et ng/mL (T, axe droit) affichées au sommet
      des colonnes de labels du graphique de simulation — remontée : « on n'a
      jamais ajouté les unités des mesures dans les axes » (des nombres nus
      depuis la v1.0). Portées aussi côté web (v1.7.0 web, versions sync).
    Downloads
  • v1.6.0 Stable

    Siphonight released this 2026-09-13 03:43:11 +02:00 | 29 commits to main since this release

    « Tracé labs » prolongé au-delà du dernier lab

    • Nouveau chip Prolonger (à côté de Tracé labs, off par défaut,
      sans effet — donc désactivé — tant que Tracé labs est off) : la courbe
      ancrée sur tes prises de sang se PROLONGE désormais au-delà du dernier lab,
      au lieu de s'arrêter là (limite v1.5.0 : justement la période la plus
      récente était invisible).
    • Recette de la prolongation : courbe(t) = M(t) × ρ_dernier lab où
      M(t) = le modèle PK brut (porte TOUTE la dynamique : Tmax, queues,
      accumulation et les doses loguées après le dernier lab — une nouvelle
      injection, même à un autre ester, fait repartir la courbe en pic) et
      ρ = le ratio corps-réel ÷ modèle observé au dernier lab, supposé constant.
      Demande couverte : simuler à partir des labs précédents, du dosage et du
      type d'ester injecté, et de l'évolution classique de l'ester.
    • Horizon honnête : la prolongation s'arrête quand le MODÈLE lui-même
      s'éteint (dernière dose + coupure moteur = 10 t½ terminales V3C/WHS, fin
      de table ODS, 30 t½ Bateman) — jamais de ligne à zéro inventée au-delà.
    • Lisibilité : la partie prolongée est dessinée SÉPARÉMENT (même rose,
      atténué) avec sa propre légende — « estimation, plus ancrée » : la partie
      mesurée (qui passe par les labs) ne peut pas se confondre avec la partie
      simulée.
    • Avertissement visible (demande) : tant que la partie prolongée est
      affichée, un texte sous la légende rappelle que c'est une 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
      — et qu'il faut se fier à la prochaine prise de sang, pas à cette courbe.
    • Garde anti-ratés inchangée : seuls les labs SIGNIFICATIFS ancrent
      (leçon #61) — un lab tardif hors fenêtre d'action ne prolonge pas la
      courbe et n'est jamais traversé.
    • Limites documentées (cf doc de développement §7.10.bis) : ρ est
      constant (pas d'extrapolation de pente — elle divergerait sans base
      physiologique) ; après un changement d'ester, l'amplitude reste calibrée
      par le ρ de l'ancien ester (même limite que la calibration classique) ;
      les doses PRÉVISIONNELLES ne participent pas (la projection reste la
      série Prévision).
    • 8 nouveaux tests (191 au total / 168 sans les données locales) :
      identité ρ constant + continuité de suture, horizon = cutoff du
      traitement, montée après une dose EV loguée après le dernier lab,
      flag off = comportement v1.5.0 bit-compatible, garde #61 sur la
      prolongation, gardes du helper d'horizon, lastAnchorMs.
    • Validé sur émulateur (recette §16.ter, APK release + données
      réelles seedées) — et heureusement : la validation a TROUVÉ le bug
      #64 (courbe vide en release seule, inlining destructeur de R8 full
      mode sur LabTrajectoryModel, cf doc §14). FIX : garde R8 explicite ;
      re-validé en release : ancrée, prolongée, avertissement, 0 crash.
    Downloads
  • v1.5.0 Stable

    Siphonight released this 2026-09-11 16:11:02 +02:00 | 33 commits to main since this release

    « Tracé labs » — courbe ancrée sur tes prises de sang

    • Nouvelle courbe superposable (chip Tracé labs, off par défaut)
      courbe(t) = M(t) × ρ(t) — le modèle PK garde la forme biologique
      (Tmax, queues, accumulation) et l'amplitude est recalée sur CHAQUE prise
      de sang : la trajectoire réelle que tes labs tracent, avec la dynamique
      du modèle entre les points.
    • Passage exact garanti sur chaque lab ; transition continue
      (log-linéaire) d'un lab au suivant — jamais de saut vertical.
    • Garde anti-ratés : un lab qui ne « gouverne » plus la prédiction du
      modèle (< 15 % du max, cf leçon #61) n'est PAS forcé-traversé — une
      dose de test de janvier ne crée pas de zigzag.
    • E2 uniquement (unité pg/mL) ; fenêtre = entre le 1er et le dernier
      lab significatif — rien avant/après : la courbe s'arrête à ta dernière
      prise de sang (honnête, pas d'extrapolation).
    • Indépendante de la calibration (elle est SA propre référence) et
      n'entre JAMAIS dans l'accueil/les seuils d'alerte/les rappels — une
      courbe de comparaison, pas une estimation d'action.
    • Couleur dédiée rose foncé pointillé, hors pics/creux.

    Améliorations UI

    • La rangée de chips du graphique défile horizontalement (le 4ᵉ chip
      était coupé hors fenêtre sur écrans étroits — constat émulateur v1.5.0).
    Downloads