Constat
MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb ne peut plus etre re-execute sur main. Toute lane qui touche une de ses cellules de code se retrouve devant une obligation C.2 qu'elle ne peut pas satisfaire : le carnet echoue, meme sur une version pristine.
Mesure du 2026-09-26, sur un worktree a origin/main (e2bede204a), sans aucune modification :
$ python scripts/notebook_tools/batch_reexecute.py \
--path MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynb \
--cwd notebook --timeout 600
[1/1] GameTheory\GameTheory-13d-Optimistic-CFR.ipynb (kernel=python3)...
KeyError Traceback (most recent call last)
Cell In[1], line 65
-> Failed: 1
Cause isolee
Le chargeur de socle de la cellule 2 exec les cellules cibles de GameTheory-13-ImperfectInfo-CFR.ipynb dans un namespace vide :
module_globals = {"__name__": "gt13_socle"}
target_cells = [5, 8, 11, 20, 23] # classes only, skip training cells
...
exec(compile(src, f"<socle ...#{idx}>", "exec"), module_globals)
Or ces cellules dependent d'autres cellules de GT-13 que le chargeur n'exec pas. Reproduction hors carnet, sur la version de main :
cellule 5 : NameError: name 'List' is not defined
cellule 8 : NameError: name 'np' is not defined
cellule 11 : NameError: name 'np' is not defined
cellule 20 : NameError: name 'CFRSolver' is not defined
cellule 23 : NameError: name 'CFRSolver' is not defined
classes exposees : []
CFRSolver est defini par la cellule 11, qui echoue elle-meme (np) ; 20 et 23 en dependent en cascade. Chaque echec est avale par le except Exception du chargeur, qui se contente d'imprimer [socle] cellule N ignoree. Le carnet echoue donc 65 lignes plus loin, sur socle["KuhnPoker"] — un KeyError qui ne dit rien de la cause reelle.
Les indices cibles sont, eux, corrects (verifie) : les cellules 5, 8, 11, 20 et 23 de GT-13 definissent exactement KuhnPoker, RegretMatcher, CFRSolver, CFRPlusSolver, MCCFRSolver. Ce n'est donc pas une derive de renumerotation.
Le commentaire du chargeur annonce pourtant l'inverse de ce qu'il fait :
# Charger toutes les cellules code jusqu'a la derniere cible (cellule 23),
# pour avoir les imports (numpy, typing.List) et utilitaires en scope.
Il n'exec que les 5 cellules cibles, pas les cellules d'import — d'ou le NameError sur np et List.
Pourquoi ca compte au-dela de ce carnet
Le defaut ne se voit pas. Les sorties commitees du carnet existent et sont completes (7/7 cellules avec execution_count), donc aucun organe ne rougit : le carnet parait sain. Il a fonctionne a une date ou GT-13 avait une disposition compatible, et rien ne signale la rupture depuis.
Consequence pratique mesuree : une tranche de purge de prose (#17781) a du retirer ce carnet de son perimetre, faute de pouvoir re-executer apres avoir modifie un commentaire. Le defaut se paie en travail abandonne, silencieusement.
Correctif attendu
Deux voies, la premiere est preferee (elle supprime la classe de defaut, pas l'instance) :
- Pre-alimenter le namespace avec ce dont les cellules cibles ont besoin (
import numpy as np, from typing import List, Dict, ...) au lieu de compter sur un exec sequentiel ; ou executer explicitement la ou les cellules d'import de GT-13 avant les cellules de classes.
- A defaut, executer toutes les cellules de code jusqu'a
max(target_cells) — ce que le commentaire annonce deja.
Dans les deux cas, faire remonter l'echec : un except qui imprime une ligne et continue transforme une erreur de chargement en KeyError opaque. Un echec de socle doit etre visible.
Criteres d'acceptation
batch_reexecute.py --path GameTheory-13d-Optimistic-CFR.ipynb --cwd notebook rend SUCCESS, 0 erreur, tous les execution_count presents.
- Les 5 classes (
KuhnPoker, RegretMatcher, CFRSolver, CFRPlusSolver, MCCFRSolver) sont exposees par le socle — a prouver, pas a supposer.
- Le carnet re-execute ne perd pas de sortie (ratchet output-collapse) et l'AST de ses cellules de code reste sain (
ast.parse sur chacune).
- Un echec de chargement de socle ne peut plus etre avale en silence.
Provenance
Constate pendant la tranche notebooks de #17712 (purge des citations « Tell c.N »). Diagnostic etabli par la lane myia-po-2025:CoursIA ; le carnet a ete retire de la PR #17881 plutot que livre avec une cellule de code modifiee non re-executee (C.2). Prouve base-inherited : la version pristine de main echoue a l'identique, et le diff de la PR sur ce carnet etait commentaire seul (ast.dump des 7 cellules de code identique avant/apres).
Constat
MyIA.AI.Notebooks/GameTheory/GameTheory-13d-Optimistic-CFR.ipynbne peut plus etre re-execute surmain. Toute lane qui touche une de ses cellules de code se retrouve devant une obligation C.2 qu'elle ne peut pas satisfaire : le carnet echoue, meme sur une version pristine.Mesure du 2026-09-26, sur un worktree a
origin/main(e2bede204a), sans aucune modification :Cause isolee
Le chargeur de socle de la cellule 2 exec les cellules cibles de
GameTheory-13-ImperfectInfo-CFR.ipynbdans un namespace vide :Or ces cellules dependent d'autres cellules de GT-13 que le chargeur n'exec pas. Reproduction hors carnet, sur la version de
main:CFRSolverest defini par la cellule 11, qui echoue elle-meme (np) ; 20 et 23 en dependent en cascade. Chaque echec est avale par leexcept Exceptiondu chargeur, qui se contente d'imprimer[socle] cellule N ignoree. Le carnet echoue donc 65 lignes plus loin, sursocle["KuhnPoker"]— unKeyErrorqui ne dit rien de la cause reelle.Les indices cibles sont, eux, corrects (verifie) : les cellules 5, 8, 11, 20 et 23 de GT-13 definissent exactement
KuhnPoker,RegretMatcher,CFRSolver,CFRPlusSolver,MCCFRSolver. Ce n'est donc pas une derive de renumerotation.Le commentaire du chargeur annonce pourtant l'inverse de ce qu'il fait :
Il n'exec que les 5 cellules cibles, pas les cellules d'import — d'ou le
NameErrorsurnpetList.Pourquoi ca compte au-dela de ce carnet
Le defaut ne se voit pas. Les sorties commitees du carnet existent et sont completes (7/7 cellules avec
execution_count), donc aucun organe ne rougit : le carnet parait sain. Il a fonctionne a une date ou GT-13 avait une disposition compatible, et rien ne signale la rupture depuis.Consequence pratique mesuree : une tranche de purge de prose (#17781) a du retirer ce carnet de son perimetre, faute de pouvoir re-executer apres avoir modifie un commentaire. Le defaut se paie en travail abandonne, silencieusement.
Correctif attendu
Deux voies, la premiere est preferee (elle supprime la classe de defaut, pas l'instance) :
import numpy as np,from typing import List, Dict, ...) au lieu de compter sur unexecsequentiel ; ou executer explicitement la ou les cellules d'import de GT-13 avant les cellules de classes.max(target_cells)— ce que le commentaire annonce deja.Dans les deux cas, faire remonter l'echec : un
exceptqui imprime une ligne et continue transforme une erreur de chargement enKeyErroropaque. Un echec de socle doit etre visible.Criteres d'acceptation
batch_reexecute.py --path GameTheory-13d-Optimistic-CFR.ipynb --cwd notebookrend SUCCESS, 0 erreur, tous lesexecution_countpresents.KuhnPoker,RegretMatcher,CFRSolver,CFRPlusSolver,MCCFRSolver) sont exposees par le socle — a prouver, pas a supposer.ast.parsesur chacune).Provenance
Constate pendant la tranche notebooks de #17712 (purge des citations « Tell c.N »). Diagnostic etabli par la lane
myia-po-2025:CoursIA; le carnet a ete retire de la PR #17881 plutot que livre avec une cellule de code modifiee non re-executee (C.2). Prouve base-inherited : la version pristine demainechoue a l'identique, et le diff de la PR sur ce carnet etait commentaire seul (ast.dumpdes 7 cellules de code identique avant/apres).