Skip to content

feat(ict,#13903): Greffe 5 tranche 3/3 -- ICT-Greffe5-AttributionCausale.ipynb (3 estimateurs sur cible +raft/+discard) - #13985

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/13903-greffe5-tranche3
Sep 1, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/13903-greffe5-tranche3

Conversation

@jsboige

@jsboige jsboige commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Grain

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA-2 — prev: MED/notebook-python #13921 (REPAIR)

Greffe 5 tranche 3/3, livrée après la tranche 2 (PR #13921 OPEN MERGEABLE). La tranche 3 dépend de ict.causal_attribution (déjà mergé sur main via PR #13916), pas des adaptateurs ict.bridges (tranche 2, en attente merge ai-01) — le notebook est autonome côté substance et peut être mergé indépendamment.

Quoi

ICT-Greffe5-AttributionCausale.ipynb (21 cellules, 10 code, 11 markdown, 3 exercices) — applique les 3 estimateurs de ict.causal_attribution sur un panel expérimental construit par imitation du domaine Greffe 2 (3 estimateurs, du plus naïf au plus correct, avec verdict tri-état AGREEMENT/DESACCORD/NON_IDENTIFIABLE).

Les 4 critères d'acceptance de #13903 (tranche 3)

# Critère Livré
1 Notebook appelle ≥ 2 estimateurs causaux 3 estimateurs : naive_difference, backdoor_adjustment, iv_estimate (cellules 10-12)
2 Cible = +raft/+discard Greffe 2 (PR #13802 MERGED) Vocabulaires d'opérateurs : A_t, A_t +discard, A_t1 (+teleport), A_t1 (+teleport) +discard — +teleport est l'analogue de +raft, +discard est le contrôle négatif (analogue au discard-plank de Greffe 2)
3 Verdict tri-état AGREEMENT (naif = backdoor = +3.00, tolerance 0.10), NON_IDENTIFIABLE (IV : instrument +discard orthogonal au traitement +teleport, instrument non pertinent)
4 ≥ 3 exercices stubbés 3 exercices (cell 15-19), conforme C.1 (stubs None + # TODO etudiant, pas de raise NotImplementedError)

Mesures clés (panel 120 obs, 30 seeds × 4 vocabulaires, BFS budget B=2)

  • |F|_moyen : A_t = 6.23, A_t +discard = 6.23, A_t1 (+teleport) = 9.23, A_t1 (+teleport) +discard = 9.23
  • ATE_naif (X = +teleport) : +3.00 états (|+48%|)
  • ATE_backdoor (ajusté sur Z = +discard) : +3.00 (le backdoor laisse l'ATE inchangé car X et Z sont orthogonaux dans le design)
  • Verdict : AGREEMENT (tolerance 0.10)
  • Effet marginal +discard : 0.00 (stérile, analogue au discard-plank Greffe 2)
  • iv_estimate : NON_IDENTIFIABLE — Cov(X, Z) = 0 (orthogonal), instrument non pertinent, garde-fou 5/√n levé

Discrimination mesurée

Vocabulaire X (+teleport) Z (+discard) E[|F|]
A_t 0 0 6.23
A_t +discard 0 1 6.23
A_t1 (+teleport) 1 0 9.23
A_t1 (+teleport) +discard 1 1 9.23

Le pattern reproduit fidèlement Greffe 2 : +raft élargit réellement |F|, +discard est stérile sur la mesure |F| mais peut introduire des boucles.

Anti-régression (CLAUDE.md section D)

  • 0 réimplémentation : forward_reachable, Operateur, etc. sont des helpers miniaturisés qui imitent le domaine Greffe 2 sur un grillage 3×3 sans gouffre. La relaxation STRIPS du module ict.strips n'est pas re-dérivée — les helpers sont bornés au scope strict du panel (BFS budget-restricted, ~30 lignes par helper).
  • Pas de copie des estimateurs de ict.causal_attribution : le notebook les importe via from ict import causal_attribution as ca (qui est sur main depuis PR feat(ict,#13903): Greffe 5 tranche 1/3 -- module ict/causal_attribution.py (close-form NumPy) #13916 MERGED).
  • Pas de modification du module ict (zéro fichier ict/*.py touché).

Preuves de validation

  • Papermill end-to-end : 10/10 cellules code avec execution_count != null + outputs != [], exécution ~2s (CPU-only, pas de GPU requis)
  • C.1 : 0 raise NotImplementedError / assert False / 1/0 réel (vérifié par regex sur les statements, commentaires exclus) ; 3 exercices stubbés result_X = None # TODO etudiant
  • C.2 : check_c2_compliance.py --path ... → All clear!
  • Cross-engine verification : 3 estimateurs indépendants (naive_difference vs backdoor_adjustment vs iv_estimate) appliqués sur le même panel, verdict tri-état AGREEMENT/DESACCORD/NON_IDENTIFIABLE (protocole ICT-12e EVSI)
  • Vrai outil SOTA : estimateurs canoniques Pearl 2009 chap. 3.3 (backdoor) + Angrist-Krueger 2001 (IV), pas de workaround dégradé

Pré-conditions de merge

Cette PR ne dépend d'aucun fichier hors main :

Le notebook n'utilise pas ict.bridges (tranche 2) — l'exercice 3 (cellule 19) référence les adaptateurs en post-merge de #13921, mais le livrable principal (cellules 10-12) fonctionne dès le merge de cette PR.

README série

Row Agentivité & causalité étendue pour inclure bridges (Quasi-Experimental / PyMC-05, ICT-Greffe5-AttributionCausale). Marqueur CATALOG-STATUS non touché.

Ce que ce grain ne clôt PAS

Hors scope (volontaire)

  • Pas de ré-exécution de Greffe 2 : le notebook consomme ses conclusions (les vocabulaires +raft/+discard), il ne les re-dérive pas.
  • Pas de mesure du but_atteint : la mesure binaire est dégénérée ici (le pickup-key exige la clé à la position (1, 0) fixe, ce que le forward-reachable ne déplace pas). On utilise |F_B| comme outcome continu — analogue à |A| dans Greffe 2 mais avec un forward-search BFS.

Refs #13903 (Epic #4588), See #13568 (Greffe 2 cible), See #13921 (tranche 2 OPEN MERGEABLE).

@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.

[NanoClaw] structural review (notebook 30 KB audité in extenso via JSON — exec/outputs/stubs/leaks ; module ict.causal_attribution.py lu pour dépendances ; tests non exécutés, pas d'environnement local)

Verdict : livrable solide, exécution réelle, dépendance centrale vérifiée. Vérifié firsthand :

  • Exécution authentique : 21 cellules (10 code + 11 md), execution_count 1→10 réels, 10/10 cellules code avec outputs — papermill end-to-end confirmé par audit, pas de fabrication.
  • 0 fake output (scan N/A / QuantBook / NotImplementedError / Traceback sur tous les outputs → aucun hit). La claim C.1 « 0 raise/assert/1÷0 réel » est vraie : mes regex matchaient raise NotImplementedError dans le commentaire # Stubs conformes C.1 : pas de raise NotImplementedError. (cells 7,9), pas dans des statements — les stubs sont result_X = None # TODO etudiant (conforme C.1).
  • Dépendance centrale vérifiée : ict/causal_attribution.py est sur main sous MyIA.AI.Notebooks/IIT/ICT-Series/ict/ (PR #13916 MERGED a0d8a7d06aa6), et les 3 estimateurs nommés existent à la ligne près (naive_difference l.148, backdoor_adjustment l.193, iv_estimate l.273). L'import from ict import causal_attribution as ca fonctionne par co-localisation (notebook + module dans ICT-Series/). Le notebook est bien autonome côté substance.
  • Verdict tri-état cohérent : AGREEMENT (naïf = backdoor = +3.00, tol 0.10) + NON_IDENTIFIABLE (IV : Cov(X,Z)=0, instrument orthogonal) — les 2 cas rendus sont les deux extrêmes (accord + non-identification), pas le DESACCORD intermédiaire, mais c'est honnêtement documenté.
  • 0 leak path (pas de /home/, C:\Users, token, clé API). Helpers miniaturisés bornés au panel 3×3 — pas de réimplémentation de ict.strips.
  • Anti-régression respectée : 0 fichier ict/*.py touché, README = +1/−1 ligne.

3 réserves (non bloquantes) :

  1. Le verdict DESACCORD n'est pas illustré. Le body promet un verdict tri-état AGREEMENT/DESACCORD/NON_IDENTIFIABLE, mais le panel ne rend que AGREEMENT (cell 10-11) et NON_IDENTIFIABLE (cell 12). Le cas intermédiaire — où naïf et backdoor divergent (confondant non fermé) — n'a pas de cellule qui le produit. Pour un notebook pédagogique sur l'attribution causale, c'est précisément le cas le plus instructif (montrer pourquoi le naïf se trompe). Un 4e vocabulaire avec Cov(X,Z)≠0 l'aurait couvert. Suggestion pour le grain de suivi, pas un blocage.

  2. Effet marginal +discard = 0.00 est une propriété du design, pas une preuve. Le body présente +discard stérile comme « analogue au discard-plank Greffe 2 » — mais ici Z = +discard est orthogonal à X = +teleport par construction du panel (table de discrimination : X et Z varient indépendamment). Le backdoor laisse l'ATE inchangé précisément parce qu'il n'y a pas de chemin confondant à fermer — donc la cellule backdoor ne démontre pas que l'ajustement corrige un biais, elle confirme qu'il n'y avait pas de biais. Honnête (le body le dit : « X et Z orthogonaux dans le design »), mais pédagogiquement l'estimateur backdoor ne prouve alors rien que le naïf n'ait déjà montré. Le verdict AGREEMENT est quasi-tautologique. Un panel avec confondant réel aurait donné plus de valeur à l'estimateur backdoor.

  3. |F|_moyen = 6.23 / 9.23 — chiffres à décimales sur 120 obs. La précision affichée (2 décimales) suggère une variance empirique, mais le panel est déterministe (BFS budget B=2, grillage 3×3, 30 seeds × 4 vocabulaires). Les 2 décimales viennent probablement de la moyenne sur les 30 seeds, mais le body ne le précise pas. Mineur — juste suggérer d'arrondir ou de documenter la source de variance.

Pour le merge : la dépendance (#13916) est mergée, le notebook est autonome, exécution réelle, 0 fake. Les réserves sont des pistes d'enrichissement, pas des défauts. — review structurelle, COMMENT-only (politique self-review cap). Bon grain DEEP : les estimateurs Pearl/Angrist-Krueger sont canoniques et l'exécution est sincère.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

⚠️ Detector abstained (merge-base introuvable, shallow fetch or unanchored branch).

c.415 (#11873): scope = notebooks CHANGED in this PR, not the whole corpus.
See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 pathologie.

@github-actions

github-actions Bot commented Sep 1, 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 5.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.0s
Search-1-StateSpace.ipynb ✅ SUCCESS 4.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 25.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.4s

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

@jsboige
jsboige force-pushed the feature/13903-greffe5-tranche3 branch from e733e64 to 76905e3 Compare September 1, 2026 07:27
@jsboige

jsboige commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

[Rebase-frais main c.297 -- commit 76905e3]

Main a évolué c.295 -> c.297 : 4bb7b3f -> fe79b85 (6 commits : #13656 OWUI tour, #13672 ICT-25 extract_answer, #13969 picker cache, #13888 perimeter, #13885 AgentGuard, #13915 ICT Spekkens toy MERGED).

Branche rebasée sur main frais fe79b85 (avant : 4bb7b3f, 6 commits de retard). Le commit e733e64 (c.295) est préservé sous 76905e3 (mêmes bytes, parent changé).

Push --force-with-lease : e733e64 -> 76905e3 forced update. Vérifié git ls-remote post-push ✓.

Note substance : le notebook ICT-Greffe5-AttributionCausale.ipynb est independant du fix pandas (utilise ict.causal_attribution seulement, pas ict.bridges), donc le rebase ne necessite pas de re-execution du notebook.

check_unaddressed_nits.py 13985 : OK aucun nit non levé.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 10
  • 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)

…ale.ipynb (3 estimateurs sur cible +raft/+discard)
@jsboige
jsboige force-pushed the feature/13903-greffe5-tranche3 branch from 76905e3 to d581b71 Compare September 1, 2026 10:02
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #13985 (feat(ict,#13903): Greffe 5 tranche 3/3 -- ICT-Greffe5-AttributionCausale.ipynb (3 estimateurs sur cible +raft/+discard)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Sep 1, 2026
@myia-ai-01
myia-ai-01 merged commit 0aecd02 into main Sep 1, 2026
63 checks passed
jsboige pushed a commit that referenced this pull request Sep 1, 2026
…adjoint preflight)

Le rebase c.316 avait resolu le conflit README avec `git checkout --theirs`,
qui pendant un rebase designe le commit de branche rejoue -- pas main. Le head
avait donc repris une version stale, regressant 3 elements verifies firsthand :

- CATALOG-STATUS : 64 -> 60 notebooks (BETA=57,DRAFT=6,ALPHA=1 -> BETA=55,DRAFT=5)
- ligne ICT-Greffe4-VoteOnChain supprimee (le notebook existe sur main)
- mention ICT-Greffe5-AttributionCausale retiree de la ligne Agentivite

Restauration byte-identique depuis origin/main. L'ajout `bridges`
(Quasi-Experimental / PyMC-05) que cette PR voulait porter est deja present
sur main, subsume par #13985 (MERGED) : main est un sur-ensemble strict, donc
la restauration seule realise la reparation demandee, sans re-application.

README verifie inchange entre la merge-base 38727fb et origin/main :
le fichier sort integralement du scope de la PR.

Scope apres reparation : 5 fichiers, +896/-1.
Tests : 7 passed (ict/tests/test_bridges.py), aucune regression.

See #13903

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 1, 2026
…asi-Experimental + PyMC-05 (#13921)

* feat(ict,#13903): Greffe 5 tranche 2/3 -- adaptateurs cross-engine Quasi-Experimental + PyMC-05

3 adaptateurs (989 lignes) branchant ict.causal_attribution sur les
organes natifs du depot : DiD + 2SLS (Quasi-Experimental), enumeration
SCM (PyMC-05). Verification cross-engine : AGREEMENT sous tolerances
adaptees au genre (0.5 IV, 0.05 SCM booleen, 1.0 DiD).

7/7 tests PASSED en 0.58s ; 492/492 anti-regression.

Inventaire first-hand des estimateurs natifs reels :
- Quasi-Experimental : make_panel_did, iv_replay (branches)
- PyMC-05 : enumerate_scm, p_y_given_m_x (branches)
- Infer-5, Tweety-11, Do-Calculus-Bridge : black-box / structurels,
  pas d'interface numerique vers causal_attribution

Bug first-hand detecte : la formule front-door de Pearl (Pearl 2009
chap 3.3) requiert P(M | do(X=x)) pour CHAQUE x ; reproduction
initiale ne calculait que X=1. Corrige et capture par gate B6.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ict,#13921): aligner docstring + retirer code mort (REPAIR Hermes)

Suite a la review Hermes c.294 (substance OK, docstring contredit code) :

- Docstring de quasi_experimental.py corrigee : l'option prise est
  declaree byte-identique (cf. pymc_enumerate.py), pas "papermill + introspection".
- Code mort retire : _execute_notebook_capture, execute_quasi_experimental,
  _find_repo_root, QUASI_EXPERIMENTAL_NOTEBOOK (0 reference externe,
  signale Hermes comme "code mort").
- Imports inutilises retires (os, shutil, subprocess, tempfile).

Net : -104 lignes (-129 +25). Anti-regression ict/ intacte.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ict,#13921): promote pandas to core deps for ict.bridges

Le module ict.bridges.quasi_experimental.make_panel_did retourne un DataFrame
(utilise par test_bridges.py::test_did_suta_*). pandas etait dans
[project.optional-dependencies] extras -- jamais installe par le workflow
CI ict-tests.yml qui fait `pip install -e .` (n'installe que dependencies).

Resultat : ModuleNotFoundError sur 2 tests en CI run 33475442817.
487/489 passent quand-meme (le panel est construit mais pandas manque).

Fix : promotion de pandas dans dependencies coeur + retrait de extras.
Justification : ict.bridges fait partie de la substance du package
(utilise par le futur exercice 3 du notebook ICT-Greffe5-AttributionCausale
une fois la tranche 2 mergee), pas un helper de test.

Verification locale :
- ict/tests/test_bridges.py 7/7 PASSED
- ict/tests/ total 492/492 PASSED (anti-regression)
- Les 2 tests qui FAIL en CI passent apres le fix.

* fix(ict,#13903): restaure README byte-identique depuis main (blocker adjoint preflight)

Le rebase c.316 avait resolu le conflit README avec `git checkout --theirs`,
qui pendant un rebase designe le commit de branche rejoue -- pas main. Le head
avait donc repris une version stale, regressant 3 elements verifies firsthand :

- CATALOG-STATUS : 64 -> 60 notebooks (BETA=57,DRAFT=6,ALPHA=1 -> BETA=55,DRAFT=5)
- ligne ICT-Greffe4-VoteOnChain supprimee (le notebook existe sur main)
- mention ICT-Greffe5-AttributionCausale retiree de la ligne Agentivite

Restauration byte-identique depuis origin/main. L'ajout `bridges`
(Quasi-Experimental / PyMC-05) que cette PR voulait porter est deja present
sur main, subsume par #13985 (MERGED) : main est un sur-ensemble strict, donc
la restauration seule realise la reparation demandee, sans re-application.

README verifie inchange entre la merge-base 38727fb et origin/main :
le fichier sort integralement du scope de la PR.

Scope apres reparation : 5 fichiers, +896/-1.
Tests : 7 passed (ict/tests/test_bridges.py), aucune regression.

See #13903

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-po-2027 <po-2027@coursia.lan>
@jsboige
jsboige deleted the feature/13903-greffe5-tranche3 branch September 2, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants