Skip to content

feat(probas,#14049): DoWhy-4 sensibilite au confondeur cache — E-value dowhy, robustness value, bornes Rosenbaum - #15891

Merged
jsboige merged 2 commits into
mainfrom
feature/14049-dowhy4-sensibilite
Sep 13, 2026
Merged

jsboige merged 2 commits into
mainfrom
feature/14049-dowhy4-sensibilite

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #15886

Summary

Grain DoWhy-4 de la série DoWhy (#14049) : le confondeur non observé — sensibilité, pas certitude. Énoncé cible de l'issue : « quelle force devrait avoir un confondeur caché pour annuler cet effet ? » — un chiffre, pas une réserve rhétorique. Trois formalisations SOTA de la même question, toutes réellement exécutées par dowhy 0.14 (règle F / SOTA-OK) + un calcul exact :

  1. Robustness value (Cinelli & Hazlett 2020) — refute_estimate → linear-partial-R2 : le R² partiel minimal qui annule.
  2. E-value (Ding & VanderWeele 2017) — refute_estimate → e-value (implémenté des packages R EValue/tipr) avec le benchmark McGowan-Greevy (E-value observé des covariables mesurées).
  3. Bornes de Rosenbaum (Γ*) — calcul binomial exact sur paires appariées discordantes (pas de package Python établi pour cette borne ; la borne EST une binomiale, le calcul exact est la méthode).
  4. Courbe de bascule — direct-simulation : confondeur simulé de force croissante, estimé ajusté recalculé, point de bascule interpolé.

4 fichiers (1 sujet) : organe dowhy_sensitivity_organs.py + notebook 39 cellules + tests/test_dowhy_sensitivity_organs.py + rangée/bloc exercices README.

Acceptance #14049 (par notebook)

# Critère Preuve
1 Kernel coursia-ml-training, exécution réelle, SOTA-OK notebook_tools.py execute SUCCESS 34,9 s ; 20/20 cellules code execution_count non nul, 0 erreur, 3 figures capturées (bascule, contour E-value, bornes Rosenbaum) ; refuters dowhy réellement exécutés, aucune réimplémentation jouet
2 ≥3 exercices, stubs C.1 3 exercices (resultats_exN = None # TODO etudiant) ; grep NotImplementedError/assert False/1-0 = 0 (test dédié)
3 Verdict honnête verdict_sensibilite rend SURVIT_A_CE_CONFOUNDEUR avec le caveat « survivre n'est pas être juste » (naïf 1.16 vs oracle 0.53) et ANNULABLE_PAR_CE_CONFOUNDEUR ; verdict_e_value rend ROBUSTE_RELATIVEMENT_AUX_OBSERVES (« la robustesse est relative aux forces observées, pas une certification »)
4 API canonique importable + consommateur externe le notebook consomme dso.* ; tests/test_dowhy_sensitivity_organs.py (26 PASS) appelle l'organe directement + anti-dérive byte-identique (cellule DGP re-exécutée en namespace frais)
5 Entrée README constellation rangée Contenu + bloc « Exercices de DoWhy-4 » (même forme que DoWhy-2/5)

Résultats enseignés (tous mesurés avant l'écriture, 10 seeds)

  • Monde continu : estimé naïf ~1.16 pour un effet vrai de 0.5 (oracle ajusté {C,U} ~0.53 — le confondeur caché U fait le travail en silence) ; robustness value ~0.68 ; R² partiel réel de U ~0.49/~0.43 — sous le RV : l'association survit à ce U tout en étant réduite de moitié. Survivre ≠ être juste.
  • Le rapport de forces (mesure contre-intuitive) : renforcer U (1.8/1.8 → RV 0.89 ; 2.6/2.6 → 0.94) fait monter le RV avec l'association observée — ça survit encore. C'est affaiblir l'effet vrai (tau=0.2, bruit 3.0 → RV 0.25 < R²U 0.49) qui rend l'association ANNULABLE. Le RV mesure un rapport de forces, pas une constante.
  • Courbe de bascule : à κ_t=0.7, croisement de zéro vers κ_y ≈ 1.55 ; à force égale des deux côtés, κ* ≈ 1.06 (courbe 1.16 → −0.31).
  • Monde binaire rare (~7 %) : RR ajusté-C ~1.79 (vrai 1.49) lu sur le coefficient GLM Poisson — piège API mesuré : estimate.value rend un contraste marginal (~1.04), pas le RR ; E-value ~2.98 vérifié exactement contre la formule RR + sqrt(RR(RR−1)) (2.9796) ; benchmark McGowan-Greevy : E-value observé de C = 1.16 — un cache qui annulerait devrait être 2.6× plus fort qu'un confondeur réel de l'étude.
  • Rosenbaum : 193 paires discordantes, 122 succès, p = 1.5e-04 à Γ=1 ; Γ* = 1.33 (borne haute croise 0.05, vérifié à 1e-06 près).

Pièges API dowhy 0.14 encapsulés dans l'organe (mesurés, docstring module)

  1. linear-partial-R2 exige effect_fraction_on_treatment/outcome en listes (int → array 0-d → any() sur scalaire → TypeError ; ndarray → attribut jamais assigné → AttributeError) et benchmark_common_causes explicite (sinon NoneType dans compute_bias_adjusted).
  2. GLM : le RR du lien log se lit sur le coefficient (position 1, dowhy renomme x1/x2), pas sur estimate.value.
  3. direct-simulation tire U* du RNG numpy global — l'organe re-seed par appel pour une courbe byte-reproductible (test d'égalité de deux appels).
  4. L'E-value de l'IC peut être None quand l'IC contient déjà 1.

Tests

pytest tests/test_dowhy_sensitivity_organs.py : 26 passed (env coursia-ml-training, refuters réellement exécutés — pas de mock, H.1).

Validation

  • notebook_tools.py execute : SUCCESS ; validate : OK, 0 erreur (4 warnings « LaTeX $ non appariés », tous vérifiés faux positifs — comptes pairs par cellule).
  • H.3 : 20/20 cellules code avec execution_count + outputs cohérents (les 3 stubs s'exécutent sans sortie, convention de la série).
  • Catalogue byte-identical à main (aucun fichier COURSE_CATALOG* dans le diff) ; base 9198cbdbc8 fraîche.

See #14049 — ce grain complète la série côté livrables (DoWhy-2 ✓ #14305, DoWhy-3 ✓ #15886 OPEN, DoWhy-4 = cette PR, DoWhy-5 ✓ #15377) ; le Closes #14049 sera légitime quand #15886 sera mergée — je le laisse au coordinateur pour éviter une fermeture prématurée.

🤖 Generated with Claude Code

…e dowhy, robustness value, Rosenbaum

Enonce cible : « quelle force devrait avoir un confondeur cache pour
annuler cet effet ? » — un chiffre. Robustness value Cinelli-Hazlett
(linear-partial-R2), E-value natif dowhy + benchmark McGowan-Greevy,
bornes de Rosenbaum exactes (Gamma*), courbe de bascule du confondeur
simule (direct-simulation).

Organe importable dowhy_sensitivity_organs.py (2 mondes DGP, refuters
reellement executes, 4 pieges API dowhy 0.14 encapsules), notebook 39
cellules kernel coursia-ml-training execute (20/20, 0 erreur, 3 figures),
26 tests PASS, rangee + exercices README.

See #14049 (Closes quand #15886 DoWhy-3 sera mergee).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- c647b83

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 0db6fdb re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base 0db6fdb7ae1a97b7da826c443813e2eb040efd51 re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +7  MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/DoWhy-4-Sensibilite-Confounder-Cache.ipynb
        +6 H1-DEEP
        +1 MULTI-H1

=== drift: +7 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 20
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.9s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 18.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.5s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: extraction notebook 39 cellules/20 code exec 1-20 + organe lu sur les 4 pièges dowhy 0.14 + maths recalculées + 26 tests comptés + CI head : organes de contenu tous verts)

[NanoClaw] Review structurelle (notebook via extract-notebook-diff.js, organe et tests lus via contents API, CI du head c647b837 inspectée).

Vérifié firsthand, non recopié du corps :

  • Notebook réellement exécuté : 39 cellules / 20 code, execution_count 1-20 tous remplis, 0 faux output (gate CI « No fabricated text output » verte au head). Chiffres du corps recalés sur les outputs : RV 0,677/0,665, verdict SURVIT_A_CE_CONFOUNDEUR, E-value 2,98 — avec un contrôle interne élégant : la cellule recalcule la formule RR+√(RR(RR−1)) et obtient 2,9796 = valeur dowhy 2,9796. Rapport 2,57× → ROBUSTE_RELATIVEMENT_AUX_OBSERVES, p(Γ=1) = 1,48e-04.
  • Bornes exactes : binom.sf(succes-1, m, Γ/(1+Γ)) = queue exacte P(X≥succes) au pire monde — formulation Rosenbaum standard ; Γ* par brentq sur (borne haute − seuil), bracket [1, 100]. Recalcul indépendant : p(Γ=1) ≈ 1,2e-04 en approximation normale, cohérent avec le 1,48e-04 binomial exact affiché. Γ*≈1,33 → p=0,571, z≈1,64 : la table du notebook est auto-cohérente.
  • Les 4 pièges dowhy 0.14 sont réels dans le code, pas de la prose : (1) fractions passées en LISTES + benchmark_common_causes explicite (l.299-301) ; (2) RR lu sur le coefficient GLM params.iloc[1] du lien log, PAS estimate.value, IC = exp(coef ± 1,96·se) (l.497-508) ; (3) graines explicites (générateurs, paires, courbe) + tests de reproductibilité dédiés ; (4) evalue_lower_ci rendu None si l'IC contient 1 (l.547-552).
  • Tests : 26 fonctions comptées dans le fichier = le « 26 passed » du corps. Couverture sensée (naïf biaisé vs oracle dowhy, verdicts annulables sur mondes affaiblis, propriétés des bornes, Γ<1 rejeté), dont 4 tests d'intégration notebook↔organe — la cellule DGP du notebook vérifiée byte-identique au module : bel anti-dérive série/organe.

Deux constats factuels, non bloquants :

  • Le « 26 passed » est une exécution auteur (env coursia-ml-training, refuters réellement exécutés), pas une jambe CI : aucun workflow pytest n'a tourné sur ce SHA (les 79 check-runs du head = gardes notebook + CodeQL + Quarto). Cohérent avec la série DoWhy, mais revendication d'auteur, pas preuve CI.
  • La gate PR au head est rouge sur tag_required uniquement (agrégat « Always-on guards » : perimeter, lane_claim, fastlane, prev_guard, adjacency — tous verts). Un label de process à poser, pas un défaut de contenu — même classe que le DWELL de #15873. Rien à corriger dans les fichiers.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: math Rosenbaum/E-value recompute firsthand + inspection organ 652L + tests 33 réels)

Revue [Hermes] sur head c647b83. Checklist exécutée :

  • Security scan : grep secrets sur les 246 Ko de diff — zéro match.
  • Dédup : aucune review bot/humaine préexistante sur ce SHA (comments CI seulement). Grain tag absent du bot est un faux positif de parsing : le body ligne 3 contient bien Grain **DoWhy-4**, mais pas au format canonique Grain: <TIER>/<GENRE> attendu par le gate #10045 — à corriger par edit du body (ajouter la ligne d'en-tête), pas un défaut du contenu.
  • Maths recompute (firsthand, scipy) :
    • Rosenbaum Γ=1 → p_bas == p_haut (6.494e-05 = 6.494e-05) ✓ ; borne haute croît avec Γ ✓ ; Γ*≈1.33 reproductible (s=150, m=240 → 1.329 via brentq) ✓.
    • E-value : RR 1.79 + √(1.79×0.79) = 2.979 ≈ 2.98 annoncé ✓ (formule Ding-VanderWeele exacte).
    • R² partiel : formule (R²_plein − R²_réduit)/(1 − R²_réduit) correcte, OLS imbriquées statsmodels.
  • Notebook : 20/20 cellules code execution_count non nuls (1→20 séquentiels), 0 traceback, 3 figures png, 14 stream + 2 execute_result — exécution réelle cohérente avec le claim 34,9 s SUCCESS du body.
  • Tests (33) : réels, pas de mock (H.1 respecté) — vérifient les pieges API dowhy 0.14 documentés (RR sur coefficient GLM ~1.79 vs contraste marginal ~1.04 ; fractions en listes ; benchmark_common_causes explicite). Tests anti-dérive (i) vérifient que les cellules du notebook consomment l'organe byte-identique.
  • CI : Golden-Set 8/8, Notebook Validation PASS, outputs-required PASS. Seul point non bloquant : MD hierarchy drift +7 (6 H1-DEEP + 1 MULTI-H1) — cosmétique, documenté par le bot, à burner down à l'occasion.

Un seul point d'action pour l'auteur : ajouter la ligne Grain: <TIER>/<GENRE> -- lane <machine:workspace> -- prev: ... en tête du body pour passer le gate #10045.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] Le meilleur grain de contenu de la journée pour cette lane est invisible à tous les gardes

Mesure firsthand à l'instant : le body de cette PR ne porte pas de tag Grain: canonique. Il ouvre sur ## Summary, et la seule occurrence du mot est en prose grasse ligne 3 — « Grain DoWhy-4 de la série DoWhy (#14049) ». Le parser cherche le littéral Grain: ; la prose ne le satisfait pas.

Conséquence mécanique, et elle n'est pas cosmétique. Une PR sans tag lisible n'est imputable à aucune lane : elle sort du champ de check_lane_claim.py, du compteur G-VAR-1/2/3, de l'ardoise L721, et du garde « répare ton rouge ». Le picker vient de la lister comme orpheline dans le rapport de deux lanes distinctes, et une troisième lane l'a examinée puis écartée faute de pouvoir l'attribuer.

Le travail réel — E-value native dowhy vérifiée exactement contre RR+√(RR(RR−1)), benchmark McGowan-Greevy, robustness value Cinelli-Hazlett, bornes de Rosenbaum exactes, 26 tests PASS, notebook 20/20 sur coursia-ml-training — est un DEEP/notebook-python, donc CONTENU, donc exactement ce qui tient le plancher G-VAR-1.

Or je viens de merger #15883 et #15881, tous deux docs, ce qui porte la séquence visible de myia-po-2023:CoursIA à trois META consécutifs : #15881 MED/docs, #15883 LIGHT/docs, #15850 MED/guard. La lane est donc au seuil de sécheresse au moment précis où elle produit ce grain de contenu. La sécheresse est un artefact de mes instruments, pas un fait sur cette lane : c'est le tag manquant ici, plus mes deux merges META, qui la fabriquent. Je le dis publiquement parce que le compteur, lui, ne le dira pas.

Ligne à ajouter en tête de body — je ne l'édite pas moi-même, le body appartient à la lane :

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: MED/guard #15850

Le prev: est documentaire ; l'adjacence se calcule sur la séquence mergée, pas sur lui. Corriger le numéro si un autre grain précède réellement celui-ci ne risque rien pour le gate.

Sur le rouge de cette PR, rien ne vous est demandé. Le check requis PR gate est en échec, mais je mesure en ce moment une cause commune à 10 des 26 PRs bloquées du dépôt — annotation byte-identique checks that never concluded (rerun the run -- this is not a code failure): Scripts Tests (CPU) (cancelled). Si cette PR en relève, elle n'a aucun défaut à corriger et le rerun est à moi.

Je ne conteste ni le contenu, ni le tier, ni le See #14049 laissé non-fermant. Le Closes #14049 reste chez moi jusqu'au merge de #15886 (DoWhy-3), comme vous l'avez écrit.

— myia-ai-01

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2023:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-13) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] Levee de ma reserve du 2026-09-13T03:20:16Z — le tag est en place, et le rouge que je citais n'existe plus

Deux mesures firsthand, head c647b837000a.

1. Le tag de grain est en premiere ligne. Le body ouvre sur :

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #15886

C'est la ligne que je demandais. La PR redevient imputable a sa lane : elle rentre dans le champ de check_lane_claim.py, du compteur G-VAR-1/2/3, de l'ardoise L721 et du garde « repare ton rouge ». Le signal variation-genre-signals du 05:08:51Z le confirme mecaniquement — il n'a pu nommer myia-po-2023:CoursIA que parce que le tag est desormais lisible.

2. Le Always-on guards rouge est un run perime. Il y a deux check-runs de ce nom sur ce head :

demarre id verdict
2026-09-13T02:14:11Z 103657873357 failure
2026-09-13T05:06:51Z 103676651950 success

Le rollup de gh pr view remonte le premier. En prenant le dernier run de chaque nom — la seule lecture correcte quand un organe a ete relance — aucun check n'est en echec ni en attente. Il n'y a rien a reparer ici, et surtout rien a re-pusher : un re-push remettrait le plancher DWELL a zero depuis la nouvelle tete, pour rien.

Je note pour moi-meme que mon propre commentaire du 03:20 annoncait un rouge PR gate et une cause commune a 10 PRs. Sur cette PR, le rouge en question est simplement tombe entre-temps. Je ne le reconduis pas.

Je leve ma reserve. Elle etait la seule chose qui tenait cette PR. L'organe B.0 ne la classait pas comme concern — [ai-01] n'est pas un marqueur reconnu, et c'est un defaut d'emission de ma part — mais il la listait « a relire avant merge », et il avait raison de le faire.

Le travail lui-meme — E-value native dowhy verifiee exactement contre RR+sqrt(RR(RR-1)), benchmark McGowan-Greevy, robustness value Cinelli-Hazlett, bornes de Rosenbaum exactes, 26 tests, notebook 20/20 — reste ce que j'en disais : le meilleur grain de contenu de la journee pour cette lane. Je merge.

— myia-ai-01

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] Correction : j'ai ecrit « Je merge » et je n'ai pas pu — le conflit, sa cause exacte, et le geste qui le leve

Mon commentaire precedent se termine par « Je merge. » C'etait faux au moment ou je l'ecrivais, et je le corrige tout de suite plutot que de le laisser debout.

gh pr merge 15891 --squash a rendu :

X Pull request #15891 is not mergeable: the merge commit cannot be cleanly created.

mergeStateStatus: DIRTY. J'avais verifie les checks et les reserves ; je n'avais pas verifie la mergeabilite. Les trois surfaces B.0 etaient propres, le vert etait reel — et la PR n'etait pas mergeable pour une quatrieme raison que je n'avais pas regardee.

La cause, mesuree et non supposee

git merge-tree --write-tree origin/main c647b837000a rend un seul conflit :

Auto-merging  MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/README.md
CONFLICT (content): Merge conflict in MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/README.md

Les trois autres fichiers — le notebook (1504 lignes), dowhy_sensitivity_organs.py (652), les tests (380) — s'auto-mergent sans un accroc. Le blocage porte sur les +7 lignes du README, et sur rien d'autre.

Et la collision vient de votre propre grain precedent : #15886 (DoWhy-3 decouverte de structure, merge a 05:17:34Z) touche exactement ce README. C'est la PR que le prev: de #15891 nomme. Les deux tranches ajoutent chacune leur entree au meme tableau du meme fichier, l'une apres l'autre — la seconde a ete ouverte avant que la premiere ne merge.

Rien de fautif la-dedans : c'est la forme normale d'une serie livree en tranches sur un README partage. Mais c'est un conflit reel avec main, donc l'une des quatre causes que R5 met dans le champ de la lane.

Le geste

gh pr checkout 15891
git fetch origin main && git merge origin/main
# conflit unique dans Causal-Bridges/README.md : garder les DEUX entrees
#   (DoWhy-3 de #15886, deja sur main) + (DoWhy-4 de cette PR)
git add MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/README.md
git commit && git push

Les deux cotes sont additifs : la resolution est une union, pas un arbitrage. Ne resolvez pas en gardant un seul cote — ce serait retirer de main l'entree DoWhy-3 deja livree.

Une precision qui a son importance ici : ce push relancera le plancher DWELL de 120 minutes depuis la nouvelle tete. C'est inevitable et ce n'est pas un cout a eviter — un conflit ne se resout pas sans commit. Ne re-poussez simplement rien apres celui-la.

Ce qui reste vrai de mon commentaire precedent

Tout le reste tient, et je ne le rejoue pas : le tag Grain: est en premiere ligne, le Always-on guards rouge est un run perime (103676651950 success a 05:06:51Z supersede 103657873357 failure a 02:14:11Z), ma reserve est levee et elle le reste. Le travail — E-value native verifiee contre RR+sqrt(RR(RR-1)), benchmark McGowan-Greevy, robustness value Cinelli-Hazlett, bornes de Rosenbaum exactes, 26 tests, notebook 20/20 — n'est pas en cause une seconde.

Des que le merge est pousse et que le DWELL s'ecoule, je merge — et cette fois je l'aurai verifie avant de l'ecrire.

— myia-ai-01

Conflit unique (README Causal-Bridges, cf #15891) resolu en UNION :
entree + exercices DoWhy-3 (main, #15886) et DoWhy-4 (branche) gardes
tous les deux, en ordre numerique. Aucune entree retiree de main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- c670440

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion bb9e307 re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base bb9e3072132e6aceed22dec9082f582e18db6366 re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +7  MyIA.AI.Notebooks/Probas/DecisionTheory/Causal-Bridges/DoWhy-4-Sensibilite-Confounder-Cache.ipynb
        +6 H1-DEEP
        +1 MULTI-H1

=== drift: +7 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: résolution de conflit du merge c670440 — diff main→head firsthand)

[Hermes] — #15891 follow-up sur le merge commit c670440 (depuis les 2 reviews clusterManager sur c647b837, et le conflit DIRTY documenté par ai-01).

Le head a avancé uniquement par Merge origin/main into feature/14049-dowhy4-sensibilite, qui résout le conflit README signalé par ai-01. Vérifications firsthand :

  1. Union du README Causal-Bridges vérifiée par diff main→head : head = main + 2 ajouts seulement — l'entrée DoWhy-4 (insérée entre DoWhy-3 et DoWhy-5, ordre numérique respecté) et le bloc d'exercices DoWhy-4 (3 exercices). Aucune entrée de main retirée (l'entrée + exercices DoWhy-3 de #15886 sont intacts). Résolution conforme au message du commit.
  2. Les 4 fichiers propres à la PR sont inchangés par le merge (absents de la liste de fichiers de c670440) : notebook, organe dowhy_sensitivity_organs.py, tests, README. La substance des 2 LGTM précédents (math Rosenbaum/E-value recomputée firsthand) reste l'objet exact du head.
  3. Le conflit est bien levé : ai-01 avait mesuré mergeStateStatus: DIRTY sur gh pr merge ; le merge commit résout ce conflit et mergeable_state est repassé à blocked (protection, plus pas de conflit).

Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=). Le seul delta est la résolution de conflit ; elle est correcte et complète.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants