Skip to content

Fix(lean,#15629): Lean-16a conway -- encoding=utf-8 sur l'appel subprocess text=True du helper lake - #19415

Merged
myia-ai-01 merged 5 commits into
mainfrom
fix/15629-lean16a-encoding
Oct 7, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
fix/15629-lean16a-encoding

Conversation

@jsboige

@jsboige jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python -- lane myia-po-2026:CoursIA -- prev: MED/notebook-python #19412

Summary — tapis #15629 (4/9)

Lean-16a-Conway-Man-and-Work.ipynb : l'appel subprocess.run(full, capture_output=True, text=True, timeout=timeout) du helper lake (cellule subprocess-setup) décodait ses pipes en cp1252 (locale Windows) — crash silencieux du thread lecteur ou mojibake selon l'environnement. Ajout de encoding="utf-8" (helper partagé avec Lean-14/#19409 et Lean-16b, même forme).

Diagnostic dérive

  • Cause (a) env/kernel : text=True sans encoding= décode en cp1252 sous locale Windows ; l'exécution précédente dépendait de PYTHONUTF8=1 dans l'environnement du lanceur — invisible dans le notebook.
  • Verdict : CAUSE_FIXED — l'encodage est désormais explicite dans la source.

Preuve A/B (outputs inchangés par le fix)

Run Commande Résultat
A (commité) env -u PYTHONUTF8 papermill ... -k python313 16 cellules, 0 erreur
B (témoin) PYTHONUTF8=1 papermill ... -k python313 16 cellules, 0 erreur

Comparaison par cellule (streams concaténés + execute_result text/plain, normalisée pour la segmentation de flush stdout) : 0 cellule avec outputs différents.

Validation

  • Papermill end-to-end sous py -3.13 -m papermill, kernel python313 (base language_info 3.13.16 ; kernelspec committé python3-lean sans équivalent local — override documenté, drift guard sur major.minor OK).
  • H.3 : chaque cellule code porte execution_count + outputs ; 0 erreur volontaire.
  • Exécution --cwd sur le checkout principal (lake conway chaud).

See #15629

🤖 Generated with Claude Code

…ocess text=True du helper lake

Le decodage cp1252 des pipes (locale Windows) faisait dependre l'executabilite
de PYTHONUTF8=1 dans l'environnement du lanceur. Encodage explicite + re-exec
complete (A/B preuve: outputs identiques sans PYTHONUTF8, 0 erreur).

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

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 16.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 9.6s

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

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

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

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

…machine que 16b

Le runA committe portait 2 bannieres 'warning: mathlib ... has local
changes' (cells 28/32) : cause racine = EOL phantom dual-vue
Windows/WSL des paquets lake conway (voir commit 16b 7e53319).
Machine reparee (sweep WSL checkout -f HEAD des 9 paquets + reset
mathlib central, canari sans warning), re-execution complete :
0 erreur, 0 banniere.

Preuve A/B normalisee : 0 diff hors variance orthogonale (fenetre
tail -20 du build parallele cell 28, verdict final identique des deux
cotes : Exit code 0, Conway compile, 0 sorry).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 6, 2026
@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Concern: il me semble avoir vu passer une erreur similaire sur un notebook pas lié à Conway. Ca mériterait un organe s'il n'existe pas.

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

Review [Hermes] — PR #19415 (head cf4b7c24)

Verdict : APPROVE — fix d'encodage vérifié firsthand au head.

Artefact de vérification réel

  • Extraction du notebook complet au head cf4b7c24 (46 cellules) : la cellule 15 (helper lake, exec=1) porte bien r = subprocess.run(full, capture_output=True, text=True, encoding="utf-8", timeout=timeout) — le encoding="utf-8" est présent sur l'appel incriminé.
  • 0 cellule en erreur dans les outputs committés (toutes exécutées, execution_count séquencés).
  • Structure (gates #17040) : 0 header dupliqué, pas de prose empilée.
  • Scan secrets sur le diff : 0 hit.
  • Le diff est chirurgical : 1 ligne de code effective (encoding="utf-8") — le reste du +269/−250 est le bruit JSON des outputs ré-exécutés (normalisés, cf. body « comparaison par cellule »), cohérent avec un fix qui ne change pas les résultats.

Cohérence du claim

  • Cause diagnostiquée (a) env/kernel — text=True sans encoding= décode en cp1252 sous locale Windows : exact, c'est le comportement documenté de subprocess (PEP 686/597 : sans encoding=, text=True utilise locale.getpreferredencoding() = cp1252 sous Windows).
  • Fix = même forme que Lean-14/#19409 et Lean-12/#19412 du tapis #15629 — série cohérente, famille déjà traitée.

Réserve honnête : pas d'exécution Lean/papermill possible depuis ce siège — la preuve A/B (runs env -u PYTHONUTF8 vs PYTHONUTF8=1, 16/16 cellules 0 erreur) est prise au crédit du body, non rejouée. Mais le fix lui-même est statiquement vérifiable et correct, et les outputs committés n'ont aucune erreur.

[Hermes hermes-pr-review, cycle :08 06/10, host f6be46d1b7a3, sig=970f004e]

@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Reponse a la remarque (« il me semble avoir vu passe une erreur similaire sur un notebook pas lie a Conway. Ca meriterait un organe s'il n'existe pas. ») : l'organe existe pour les .py — le guard pre-commit check-subprocess-encoding (#13140, refuse tout nouveau text=True sans encoding=, ratchet retro-clean) — mais il ne scanne pas les cellules de notebooks, et c'est bien la que vivait toute l'erreur du tapis (les 19 corrections du tapis etaient en source de cellule .ipynb, invisibles a l'organe actuel). Votre intuition est donc juste : le gap est reel et mesure.

Issue de suivi ouverte et nommee : #19475 — extension du ratchet aux cellules .ipynb staged (meme predicat, extraction de source en plus, toujours zero slot CI, arbitrage #13097 conserve). Acceptance en 4 points dans le body. La levée de la remarque vous revient ; ce commentaire nomme le suivi.

jsboige added a commit that referenced this pull request Oct 6, 2026
…nets Lean porteurs

Le helper WSL/Lean appelle subprocess.run(..., encoding='utf-8', ...) sans
errors= : un octet non-UTF-8 (0xe9 'é' en cp1252, message console WSL en
francais) fait crasher le reader-thread en UnicodeDecodeError. Le retour
de run() est stdout=None ; la cellule suivante crashe en cascade sur
AttributeError au lieu de montrer la cause reelle.

PR #19415 (Lean-16a) avait corrige le pattern pour 16a. Cette PR etend
le fix aux 5 autres carnets porteurs du meme pattern :
- Lean-21-MIMO-Detection-Flips (1 cellule : run_lean_snippet)
- Lean-28-Complex-Structure-S6 (2 cellules : LocalisationHopf, LeanExec)
- Lean-34-Calculabilite-et-Limites (3 cellules : lake path, build, audit)
- Lean-34b-FairBot-Loeb (3 cellules : wslpath, lean_exec, sha256sum)
- Lean-03b-Formalized-Formal-Logic-Lean-Python (2 cellules : lake path, audit)

11 cellules au total, fix strictement defensif : errors='replace' ne
change le comportement qu'en presence d'un octet non-UTF-8 (le crash
latent). Validation syntaxique AST parse OK partout (sauf %matplotlib
inline magique, pre-existant). Validation semantique : subprocess.run
avec errors='replace' execute 'wsl -e bash -lc echo hello' -> stdout OK.

C.2 (re-exec complet) : 5 carnets Lean = 5 re-exec WSL/lean4-wsl ; budget
depasse pour c.50 (DEEP/lean sur la moitie des carnets = G-VAR-1 tenu,
re-exec global differe en cycle suivant). Sorties attendues byte-identiques
(helper sans crash latent = meme stdout que sur main).

Refs : #19480 (issue), #19415 (Lean-16a fix anterieur, meme pattern),
       #19475 (garde pre-commit a etendre pour cellules .ipynb, hors scope).
@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Etat de la re-execution (cycle du 06/10, suite du desordre MACHINE_PATH signale par le ratchet) -- ce commentaire documente ou le travail s'arrete et pourquoi, pour la reprise.

Ce qui est pret (dans le worktree D:\Dev\CoursIA-15629, NON commit -- C.2 : sources modifiees exigent la re-exec avant commit)

  1. Sources corrigees sur 4 cellules (15/28/36/37) : basenames seuls dans les prints (supprime les fuites MACHINE_PATH mesurees 0->5), propagation du vrai code retour via PIPESTATUS sur les deux cellules lake build, et errors="replace" sur le decode du helper wsl (un octet cp1252 dans une sortie wsl tuait le reader-thread subprocess : stdout=None, AttributeError en cascade -- detail et famille dans Lean notebooks: helper wsl() sans errors= sur subprocess utf-8 -- crash reader-thread sur octet cp1252 (5 carnets) #19480).
  2. Branche recalce sur la tete 2168db0 (merge main du update-branch). Le conflit potentiel est deja resolu : les sources du head remote sont identiques a celles d'ou partent mes fixes.
  3. Scripts de graft et de verification prets (scratchpad session).

Pourquoi ca s'arrete la : la machine, pas le carnet

Le build prerequisite lake build Conway (8796 modules) a ete tue 4 fois aujourd'hui par l'environnement, jamais par Lean : 2 pannes WSL E_UNEXPECTED (pool de runners a 0, reparees chaque fois, 8/8 restaurées), un depot mathlib du worktree corrompu par un fetch interrompu (repare : reset --hard sur l'epingle db584cd6 du manifest), puis deux morts silencieuses du build sous contention. Mesure finale : load average 41-74 dans la VM (16 Go) pendant que le pool CI draine sa file -- mes builds massifs et les jobs CI s'entretuent. Le carnet lui-meme n'a aucun defaut bloquant : les 8782+ modules compiles sont en cache dans le worktree, et le dernier run etait en phase de compilation normale (notes linter Conway visibles) quand la VM l'a coupe.

Reprise (fenetre calme ou machine LeAN dediee)

Un seul lake build Conway sur le cache du worktree (script WSL ~/build16a.sh, setsid+nohup, log ~/build16a.log), puis papermill py -3.13 kernel python313 --cwd . dans le dossier Lean du worktree, graft des sorties, rejeu du ratchet (attendu : 0 regression, MACHINE_PATH 0), commit + push. Estimation sur machine calme : < 1 h dont ~35 min de passe de verification lake.

…r wsl() en --exec (rc honnete), statut CGTTour documente

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Réparation Output-failure ratchet (32 chemins machine, cellule 37) + découverte d'un défaut structurel du helper wsl() — source corrigée puis re-exécutée au head f7e07fb.

1. Chemins machine — cause racine et correctif source

La sortie de lake build CGTTour (cellule 37) embarque les lignes trace: .> LEAN_PATH=... du toolchain (~11 chemins absolus /mnt/d/... et /home/jesse/... chacune) — 32 occurrences MACHINE_PATH, toutes dans cette seule cellule (mesure par cellule sur l'artefact). Correctif source (jamais d'édition d'output, règle 6 secrets-hygiene) : lake build CGTTour 2>&1 | grep -v "^trace: " | tail -20 — l'écho brut de commande (zéro valeur pédagogique) est retiré avant la sortie ; toutes les lignes de sens (✔/✖, error: Lean exited with code 139, Some required targets logged failures, error: build failed) sont conservées. Validé à froid sur le log réel : 0 chemin restant.

2. Découverte : le relais wsl.exe -- fragmente les commandes multi-instructions

En ré-exécutant, Exit code : 0 + « SUCCESS » s'affichaient au-dessus d'un log d'échec — y compris avec un test d'olean produit ([ -f .lake/build/lib/lean/CGTTour.olean ] || rc=1). Sondage mécanique isolé (Python → wsl, hors git-bash) :

Test via wsl -- bash -lc <cmd> Attendu (bash) Mesuré
false; echo "R=$?" R=1 R=0
false | true; echo "PS2=${PIPESTATUS[0]}" PS2=1 PS2= (vide)
rc=; [ -f absent ] || rc=7; echo "V=[$rc]"; exit $rc V=[7], rc=7 V=[], rc=0

Mécanisme : wsl.exe -- re-joit les argv sans ré-échapper — chaque ; de la commande est réinterprété par le shell externe et la commande s'exécute en fragments séparés : le build tourne (son output arrive), mais rc=, le test d'olean et exit $rc s'exécutent chacun dans un shell frais → exit sans argument → rc=0 quel que soit le résultat réel. Le helper wsl() de la cellule 15 était donc structurellement incapable de rendre un rc honnête.

Correctif : ['wsl', '-d', 'Ubuntu', '--exec', '/bin/bash', '-lc', cmd] — --exec passe les argv 1:1 au process Linux, sans re-join. Re-sondage : R=1, PS2=1, V=[7] rc=7 — 3/3 conformes au bash attendu.

3. Re-exécution (preuve)

Head f7e07fb : 47 cellules (16 code), kernel python313 (3.13.x = base), 0 erreur, 0 chemin machine, 16/16 exécutées, metadata.papermill depuis l'artefact (end_time présent). Cellule 37 rend désormais le verdict honnête — échec SIGSEGV documenté (exit 139 sur Mathlib.Tactic.Lift et Mathlib.Init), suivi de la cellule markdown « Statut du build CGTTour (mesuré 06/10) » qui l'explique.

4. Contexte machine (honnêteté du status)

La VM WSL de po-2026 (16 Go) a connu 6 effondrements E_UNEXPECTED dans la journée (pool CI à 0 chaque fois, réparé à chaque fois ~4 min). Le build complet de conway_cgt_lean n'est pas productible ici à ce jour — reprise sur machine avec plus de RAM = voie suivie. Signalement: le même helper wsl() (forme -- bash -lc) vit dans lean_notebook_utils.py (Epic #2314) et probablement d'autres carnets — le même rc mensonger (toujours 0) y est latent ; à traiter en grain séparé, hors du périmètre de cette PR (1 carnet).

Rejeu local du ratchet au head : check_output_failure_text.py origin/main → verdict ci-dessous dans la jambe CI.

…icat (cellule 38)

Les indices de progression du build (324/1745, 319/1737) et le decompte
des oleans (~320 modules) derivent a chaque bump de Mathlib : la prose
garde les predicats (SIGSEGV exit 139 sur deux gros modules, a JOBS=8 et
JOBS=4, echec en fin de build, oleans precedents intacts, reprise sur
machine plusRam), les indices sortent de la prose (#9377).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

Mise a jour d'etat (07/10) — le point ci-dessus decrivait le travail comme pret-mais-non-commit : il est livre depuis. Chaine des tetes :

  • f7e07fbbe8 (06/10 23:15Z) : les 4 cellules corrigees (15/28/36/37) + re-execution complete, 0 chemin machine, ratchet check_output_failure_text.py re-mesure au head (0 regression).
  • 5f0bca59c0 (07/10 02:03Z, tete courante) : correctif prose-counts (markdown seul, sans effet sur les sorties ni sur le ratchet).

Les deux remarques restent couvertes par les reponses deja postees (suivi #19475 nomme ; re-execution apportee par la cause, pas par edition manuelle).

@myia-ai-01 myia-ai-01 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.

[OVERRIDE] lane myia-ai-01:CoursIA

Je lève les deux réserves de jsboige. (1) Commentaire 6012413378 (organe d'encodage étendu aux carnets) : l'issue #19475 a été ouverte avant tout merge, puis livrée par #19496, mergée le 07/10 à 02:19Z. (2) Commentaire 6027189985 (rapport de réparation « prêt mais non commis ») : livré à f7e07fb puis 5f0bca5 ; helper wsl() en --exec, sortie honnête du build CGTTour (code 139) avec sa cellule de statut, 0 chemin machine dans le diff, ratchet Output-failure vert à la tête. Le correctif de lean_notebook_utils.py renvoyé à « un grain séparé » n'a pas encore de numéro d'issue : à ouvrir par la lane.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-ai-01:CoursIA

Je lève la réserve de jsboige du 06/10 à 08:28Z (commentaire 6012413378) : l'issue de suivi #19475 a été ouverte avant merge et livrée par #19496, mergée.

Je lève aussi la réserve de jsboige du 06/10 à 23:16Z (commentaire 6027189985) : la réparation annoncée est livrée aux commits f7e07fb et 5f0bca5, le ratchet Output-failure est vert à la tête 5f0bca5.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 19415
head: 5f0bca5
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7cfab5efa0ce6e5f6c5fa2a3d8174b08d7ea506ec8df5d8c42e264adab3dbbcd
diff-files: 1
diff-additions: 257
diff-deletions: 255
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19415
head: 5f0bca5
complete: true
body: read
comments-reviewed: 14
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 716821714e477e0a91cdb56558357cc8db56b414167c639d043d8f425febbe8c
diff-files: 1
diff-additions: 257
diff-deletions: 255
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19415
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier tiers du coordinateur. Ma levée APPROVE du 07/10 15:00:12Z porte sur cette tête, 5f0bca5, et le motif y est écrit. Les checks sont lus à la source au dernier essai par nom.

@myia-ai-01
myia-ai-01 merged commit 893d35d into main Oct 7, 2026
95 of 102 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants