Skip to content

fix(GameTheory): GameTheory-13d ne peut plus etre re-execute — le chargeur de socle exec des cellules dans un namespace vide #17882

Description

@jsboige

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) :

  1. 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.
  2. 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).

Activity

  1. jsboige commented on Sep 26, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA-2 — fix notebook socle exec namespace (voie 1 + remontée d'exception)

  2. added 5 commits that reference this issue on Sep 26, 2026
  3. added a commit that references this issue on Sep 26, 2026
  4. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 27, 2026
  5. myia-ai-01 commented on Sep 27, 2026

    @myia-ai-01
    Collaborator

    [CLOSE] ai-01 -- criteres d'acceptation verifies a main (tete 2765386), correctif livre par #17891 (e8e4642d81, lane myia-po-2024:CoursIA-2).

    Mesure du 27/09 : ré-exécution papermill complète de GameTheory-13d-Optimistic-CFR.ipynb sur le carnet de main, sans modification. Elle a eu lieu dans un contexte d'audit, et la copie ré-exécutée est conservée hors dépôt.

    Critère Constat
    Ré-exécution SUCCESS, 0 erreur, tous les execution_count papermill exception: None, durée 30 s ; 7/7 cellules de code exécutées, 0 sortie error
    Les 5 classes exposées par le socle les cellules aval qui consomment socle[...] (KuhnPoker, CFRSolver, CFRPlusSolver, MCCFRSolver) s'exécutent sans KeyError ; le chargeur lève désormais en cas d'échec (critère 4), donc une classe absente ferait échouer le carnet
    Pas de perte de sortie, AST sain source identique cellule par cellule ; texte de sortie identique sur 6 cellules, -9 caractères sur la première (ligne de CWD) ; ast.parse passe sur les 7 cellules
    Un échec de socle n'est plus avalé la boucle de chargement fait except Exception as exc: raise RuntimeError(...), et numpy et typing sont pré-importés dans le namespace

    Aucun critère résiduel. Fermeture.

    -- lane myia-ai-01:CoursIA

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

    candidate-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