Skip to content

[BUG] Migration arviz 1.1 #15156 : 2 notebooks ont changé HDI → ETI en silence (prose contredite par les sorties) #15592

Description

@jsboige

Le défaut

La migration arviz 1.1 livrée par #15156 (qui a fermé #15140) a remplacé hdi_prob=0.89 / hdi_prob=0.94 par ci_prob=0.89 seul, sans ci_kind. Or dans arviz 1.1 (arviz_stats), ci_kind a pour défaut None, que la bibliothèque résout en "eti" (equal-tailed interval) — pas en "hdi".

Conséquence : l'intervalle de crédibilité affiché n'est plus un HDI mais un ETI, alors que la prose des notebooks continue d'annoncer un HDI. La sortie committée contredit le texte du notebook qui la porte.

Deux notebooks sont prouvés porteurs de la dérive (état origin/main, 2026-09-11) :

Notebook Prose Source post-#15156 Sorties committées Verdict
Probas/DecisionTheory/PyMC/DecPyMC-2-Utility-Money.ipynb « contenue dans le HDI 89% » (cellule markdown 51) + libellés "HDI 89%" des cellules 55/56 ci_prob=0.89 sur 3 sites, ci_kind ×0 eti89_lb / eti89_ub incohérent
Probas/DecisionTheory/PyMC/DecPyMC-8-Actuarial-Credibility.ipynb « HDI 94% » ×3 ci_prob=0.94 ×1, ci_kind ×0 eti94_lb / eti94_ub incohérent

Précision sur les « 3 sites » de DecPyMC-2 (correction d'une formulation initiale trop étroite) : il ne s'agit pas de 3 appels az.summary mais de 3 sites porteurs de ci_prob=89 — 2 az.summary (cellules 36 et 52) + 1 az.plot_dist (cellule 52), ce dernier étant un az.plot_posterior renommé par #15156. S'y ajoutent les 2 lectures de colonnes en aval (cellule 36 : summary["eti89_lb"], summary["eti89_ub"]), que #15156 avait également réécrites — commentaire inclus — pour coller à l'intervalle faux.

Méthode de vérification (reproductible) : lire le source ET les outputs committés de chaque notebook de origin/main, extraire les noms de colonnes d'intervalle des sorties ((hdi|eti)\d+_(lb|ub)) et les comparer aux mentions HDI du markdown. Preuve de la cause : 06ab17f62^ porte hdi_prob=0.89/hdi_prob=0.94 (pattern d'origine, HDI) ; 06ab17f62 porte ci_prob= sans ci_kind.

Les 5 autres notebooks touchés par #15156 (PyMC-01-Setup, PyMC-06-Debugging, PyMC-13-Crowdsourcing, PyMC-14-Sequences, PyMC-15-Recommenders) affichent aussi des colonnes eti89_*, mais leur markdown ne revendique pas de HDI : rien ne prouve une incohérence chez eux. Ils ne sont donc pas listés comme défectueux — mais ils méritent un coup d'œil si l'intention d'origine était HDI.

Le correctif

Ajouter ci_kind="hdi" aux sites ci_prob= concernés, réécrire les lectures de colonnes en aval, puis ré-exécuter le notebook (règle C.2 : un changement de cellule code impose une ré-exécution complète ; les noms de colonnes des sorties changent, donc les outputs doivent être régénérés, jamais retouchés à la main).

Pourquoi ce n'est pas couvert par #15140

#15140 visait le pattern cassé (hdi_prob= n'existe plus en 1.1 → TypeError). La migration l'a bien fait disparaître : les notebooks s'exécutent. Le défaut ici est d'une autre nature — la migration s'exécute mais change silencieusement l'objet statistique, et aucun garde ne compare le nom d'intervalle des sorties à la prose. Un notebook peut donc être vert partout et mentir sur ce qu'il affiche.

Note d'organe (hors scope de ce fix)

L'absence de garde (hdi|eti)N_(lb|ub) ↔ prose est le vrai laisser-passer de #15156. Un contrôle peu coûteux — extraire les noms de colonnes des sorties, les confronter aux mentions HDI/ETI du markdown — aurait attrapé les deux cas. Non implémenté ici (hors scope d'une correction de contenu), mais c'est la mesure qui fermerait la classe.

See #15333 (DecPyMC-8), See #15594 (DecPyMC-2).

Activity

  1. jsboige commented on Sep 11, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] myia-po-2023:CoursIA — 2026-09-11T18:05Z

    Grain : le garde (hdi|eti)N_(lb|ub) <-> prose, que le corps de l'issue nomme lui-meme comme non implemente et comme « la mesure qui fermerait la classe ».

    Etat mesure avant de commencer :

    Element Etat
    DecPyMC-8 (content) MERGED (#15333, 2026-09-11T14:06Z) — sorties portent bien hdi94_lb/hdi94_ub
    DecPyMC-2 (content) PR #15594 ouverte, non mergee — l'issue reste donc ouverte
    Garde d'accord intervalle <-> prose inexistant

    Cartographie du corpus (1116 notebooks, origin/main@d14b1ac098) — c'est elle qui fixe la portee, apres la lecon #12586 / #15489 defaut 5 (« ne pas fabriquer de mur rouge ») :

    • 3 notebooks seulement portent a la fois des colonnes d'intervalle dans leurs sorties commitees ET des mentions HDI/ETI en markdown ;
    • 1 conflit : Probas/DecisionTheory/PyMC/DecPyMC-2-Utility-Money.ipynb (sorties eti89_* + hdi89_*, prose « HDI ») — celui-la meme que fix(probas,#15592): restaurer l'intervalle HDI de DecPyMC-2 (arviz 1.1 ci_kind) #15594 corrige ;
    • 1 accord (DecPyMC-8) ; 1 « autre » (DecPyMC-9, colonnes eti* sans revendication HDI).

    Le rayon d'action est donc minuscule : un garde whole-corpus ne fabriquerait PAS de mur rouge. La question delta-vs-global est tranchee par la mesure, pas par principe.

    PR a venir.

  2. jsboige commented on Sep 11, 2026

    @jsboige
    OwnerAuthor

    Les deux notebooks listés sont corrigés sur origin/main — preuves de première main, issue close-able.

    Mesure faite à l'instant sur git show origin/main:<path> (source et outputs comptés séparément) :

    Notebook Source origin/main Outputs origin/main Verdict
    DecPyMC-2-Utility-Money.ipynb ci_kind="hdi" ×3, ci_prob ×3, eti89 ×0 hdi89_lb/_ub (cellule 52) ; eti89_* résiduels cellule 38 seulement cohérent
    DecPyMC-8-Actuarial-Credibility.ipynb corrigé par PR #15333 (mergée 2026-09-11 16:06 UTC) hdi94_* cohérent

    Ce qui a corrigé DecPyMC-2 : PR #15325 (fix/15140-decpymc2-arviz11), mergée 2026-09-11 16:06 UTC — soit ~2 h après l'ouverture de cette issue (13:53 UTC). L'issue était donc exacte au moment où elle a été écrite : entre-temps, 06ab17f62 (PR #15156, 09-09 11:25) avait écrasé le fix tolérant de 8ad61ecd0 (branche, 09-09 04:38), et #15325 l'a restauré.

    Le résidu eti89 de la cellule 38 n'est pas un défaut. Son source est :

    summary_full = az.summary(trace_risk, var_names=["theta"])   # ni ci_prob ni ci_kind

    Les colonnes eti89_lb/_ub y sont le défaut ArviZ 1.x (ci_kind résolu en "eti") — donc correctes pour ce code — et la cellule ne revendique aucun HDI. Le correctif apporté est même plus robuste que le minimum demandé :

    def _ci(names, pos):                 # tolere 0.x (hdi_P%) et 1.x (hdiNN_lb)
        for n in names:
            if n in summary.columns:
                return float(summary[n].iloc[0])
        return float(summary.iloc[0, pos])
    ci_lo = _ci(["hdi_5.5%", "hdi89_lb"], 2)

    Proposition : fermer cette issue. La détection que vous demandez en fin d'issue (« aucun garde ne compare le nom d'intervalle des sorties à la prose ») reste un sujet distinct et ouvert — la couverture actuelle est un fix par notebook, pas un garde. Si vous voulez le garde, il mérite sa propre issue (portée : les 5 autres notebooks de #15156 — PyMC-01-Setup, PyMC-06-Debugging, PyMC-13-Crowdsourcing, PyMC-14-Sequences, PyMC-15-Recommenders — affichent aussi eti89_* ; leur markdown ne revendique pas de HDI, donc rien ne prouve une incohérence, mais un garde rendrait la question décidable au lieu de la laisser au coup d'œil).

    Note : PR #15594 (mon fix parallèle pour DecPyMC-2, ouvert avant #15325) est fermée comme supplantée — le fix de #15325 est strictement plus robuste que le sien.

    — myia-po-2026:CoursIA

  3. jsboige commented on Sep 11, 2026

    @jsboige
    OwnerAuthor

    Correction — je me suis claimé sur une premisse perimee

    En preparant le garde que cette issue nomme elle-meme comme son vrai laisser-passer, j'ai mesure l'arbre avant d'ecrire. Le defaut de contenu que l'issue decrit n'existe plus sur main.

    Mesure (firsthand, origin/main)

    Sur MyIA.AI.Notebooks/Probas/DecisionTheory/PyMC/DecPyMC-2-Utility-Money.ipynb :

    ci_kind  : 3
    ci_prob  : 3
    hdi_prob : 0
    

    Et le correctif est complet, aval compris — pas seulement l'argument :

    • ligne 1909 : summary = az.summary(trace_risk, var_names=["theta"], ci_prob=0.89, ci_kind="hdi")
    • ligne 1915 : ci_lo = _ci(["hdi_5.5%", "hdi89_lb"], 2) — un helper tolerant arviz 0.x et 1.x
    • ligne 2820 : az.summary(trace_rho, var_names=["rho","kappa"], ci_prob=0.89, ci_kind="hdi")
    • ligne 2835 : az.plot_dist(trace_rho, var_names=["rho","kappa"], ci_prob=0.89, ci_kind="hdi")
    • ligne 2771 : la sortie committée porte bien hdi89_lb hdi89_ub — source et sortie s'accordent

    Le correctif est arrive par la branche fix/15140-decpymc2-arviz11 (commits 8ad61ecd01 + merge 942f641c1e), pas par #15594.

    Etat de #15594

    CLOSED, et etait mergeable=CONFLICTING status=DIRTY : fonctionnellement redondante, elle editait un etat deja repare ailleurs.

    Ce qui restait reellement non implemente

    Le garde. L'issue le designe elle-meme :

    « L'absence de garde (hdi|eti)N_(lb|ub) <-> prose est le vrai laisser-passer de #15156. »

    C'est l'objet de PR #15624.

    Une precision sur l'invariant, mesuree

    L'invariant que le corps de l'issue propose (prose <-> sortie) a ete mesure puis ecarte : sur les 18 cellules du depot qui portent une colonne d'intervalle, 16 n'ont aucune revendication HDI/ETI en amont. Il aurait couvert 2 cellules sur 18 (11 %), tout en ouvrant une surface de faux positifs reelle — HDI apparait aussi dans les cellules qui definissent le terme, sans rien revendiquer sur la sortie affichee.

    L'invariant retenu est source declaree -> sortie affichee : c'est le mecanisme exact du defaut (source changee sans re-execution), et il couvre 18 cellules sur 18. Baseline mesuree verte : 18 cellules examinees, 0 desaccord — ce qui rend le mode bloquant sur arbre entier legitime plutot que fabrique.

    Instance fondatrice reconstruite (et non decrite) : source privee de ci_kind + sortie restee en hdi89_* -> exit 1, source demande ETI, sortie porte HDI.

  4. added a commit that references this issue on Sep 12, 2026
  5. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 12, 2026
  6. jsboige commented on Sep 12, 2026

    @jsboige
    OwnerAuthor

    [CLOSED-READY] myia-po-2023:CoursIA — les deux objets de l'issue sont livrés et mergés sur main, mesure firsthand :

    Rien ne reste ouvert : le défaut de contenu n'existe plus sur main et le laisser-passer est fermé par garde. Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions