Résumé
Le wrapper WSL embarqué dans les notebooks Lean (def wsl(cmd) → _wsl_raw → bash -lc '<cmd> 2>&1 | tail -20') rend comme code de sortie celui de tail, pas celui de lake : une commande lake build ... 2>&1 | tail -20 qui échoue (checkout mathlib refusé, error: external command 'git' exited with code 1, Aborting) revient avec rc=0, et la cellule imprime SUCCESS : les 3 modules Life compilent sur la foi de ce rc masqué.
Instance mesurée : #16987 (review po-2026:CoursIA-3 du 2026-09-23) — à la tête aa28e7e44e, la cellule lake-build-life (idx 46) commettait SUCCESS alors que lake venait d'écrire error: dans la même sortie. Le même socle avait produit des sorties dégradées aux cellules 38 et 42 (rc=-1, 0 verdicts parses sur 7 attendus). La panne avait été masquée par le wrapper, pas détectée.
Mécanisme
# cellule subprocess-setup (Lean-16b) :
full = ['wsl', '-d', 'Ubuntu', '--', 'bash', '-lc', cmd]
r = subprocess.run(full, capture_output=True, text=True, timeout=timeout)
return r.returncode, r.stdout, r.stderr # rc = rc du PIPELINE bash
# cellule lake-build-life :
rc, out, err = wsl(f'... lake build {targets} 2>&1 | tail -20', timeout=1500)
# en bash, le rc d'un pipeline = rc de la DERNIERE commande (tail) => toujours 0
if rc == 0:
print('SUCCESS : ...') # affirme une compilation qui n'a pas eu lieu
C'est la même classe que le tell c.1418-L2 (rc d'un pipe = rc de tail, pas de l'outil), ici côté notebook plutôt que côté session.
Périmètre (mesuré sur origin/main)
git grep -l "2>&1 | tail" origin/main -- 'MyIA.AI.Notebooks/SymbolicAI/Lean/*.ipynb' :
Lean-12-Sensitivity-Theorem.ipynb
Lean-15-Grothendieck-Tribute.ipynb (gate if rc == 0 présente)
Lean-16a-Conway-Man-and-Work.ipynb (gate if rc == 0 présente)
Lean-16b-Conway-Game-of-Life-Lean.ipynb (gate if rc == 0 présente — l'instance fondatrice)
Lean-34-Calculabilite-et-Limites.ipynb
Lean-3b-Formalized-Formal-Logic.ipynb
Fix proposé
Injecter set -o pipefail; en tête de la commande bash passée au wrapper (le rc du pipeline devient alors celui de la première commande qui échoue), ou faire porter le rc par bash lui-même (bash -lc 'set -o pipefail; <cmd> 2>&1 | tail -20'). Corriger le wrapper dans les 6 notebooks listés + re-exécuter les cellules de build concernées (C.2).
Non-bloquant
Défaut distinct des PRs en cours (signalé « non bloquant, mérite une issue » en review de #16987) : les réparations de #16987 (env lake + re-exec) avancent indépendamment.
Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-lean #16987
Résumé
Le wrapper WSL embarqué dans les notebooks Lean (
def wsl(cmd)→_wsl_raw→bash -lc '<cmd> 2>&1 | tail -20') rend comme code de sortie celui detail, pas celui delake: une commandelake build ... 2>&1 | tail -20qui échoue (checkout mathlib refusé,error: external command 'git' exited with code 1,Aborting) revient avecrc=0, et la cellule imprimeSUCCESS : les 3 modules Life compilentsur la foi de ce rc masqué.Instance mesurée : #16987 (review po-2026:CoursIA-3 du 2026-09-23) — à la tête
aa28e7e44e, la cellulelake-build-life(idx 46) commettaitSUCCESSalors quelakevenait d'écrireerror:dans la même sortie. Le même socle avait produit des sorties dégradées aux cellules 38 et 42 (rc=-1, 0 verdicts parses sur 7 attendus). La panne avait été masquée par le wrapper, pas détectée.Mécanisme
C'est la même classe que le tell c.1418-L2 (rc d'un pipe = rc de tail, pas de l'outil), ici côté notebook plutôt que côté session.
Périmètre (mesuré sur origin/main)
git grep -l "2>&1 | tail" origin/main -- 'MyIA.AI.Notebooks/SymbolicAI/Lean/*.ipynb':Lean-12-Sensitivity-Theorem.ipynbLean-15-Grothendieck-Tribute.ipynb(gateif rc == 0présente)Lean-16a-Conway-Man-and-Work.ipynb(gateif rc == 0présente)Lean-16b-Conway-Game-of-Life-Lean.ipynb(gateif rc == 0présente — l'instance fondatrice)Lean-34-Calculabilite-et-Limites.ipynbLean-3b-Formalized-Formal-Logic.ipynbFix proposé
Injecter
set -o pipefail;en tête de la commande bash passée au wrapper (le rc du pipeline devient alors celui de la première commande qui échoue), ou faire porter le rc par bash lui-même (bash -lc 'set -o pipefail; <cmd> 2>&1 | tail -20'). Corriger le wrapper dans les 6 notebooks listés + re-exécuter les cellules de build concernées (C.2).Non-bloquant
Défaut distinct des PRs en cours (signalé « non bloquant, mérite une issue » en review de #16987) : les réparations de #16987 (env lake + re-exec) avancent indépendamment.
Grain: LIGHT/guard — lane myia-po-2024:CoursIA-2 — prev: MED/notebook-lean #16987