Skip to content

fix(lean,#19480): errors="replace" sur le probe subprocess de KNOTS-03 + re-exec C.2 - #19872

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/19480-wsl-errors
Oct 9, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/19480-wsl-errors

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Grain: LIGHT/notebook-lean — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #19620

Le defaut

Sur Windows, subprocess.run(..., text=True, encoding="utf-8") sans errors= decode dans un reader-thread secondaire. Un seul octet non-UTF-8 dans la sortie du sous-processus tue ce thread ; run() revient alors avec stdout = None et la cellule suivante casse en cascade sur un AttributeError: 'NoneType' object has no attribute 'strip'. Ce n'est pas un affichage fautif : c'est un plantage.

Le filet errors="replace" ferme la classe.

Perimetre reel : 1 fichier

main a absorbe entre-temps les trois autres carnets que cette branche avait pris (verifie : le filet errors="replace" y est present, une occurrence chacun). La fusion de main dans cette branche les a donc fait sortir du diff : le head actuel est un commit de fusion, et le perimetre effectif est 1 fichier —

MyIA.AI.Notebooks/SymbolicAI/Lean/KNOTS/KNOTS-03-Companion-Formel-Lean-Python.ipynb

soit une ligne source, dans la cellule de probe i18n :

-    capture_output=True, text=True, encoding="utf-8",
+    capture_output=True, text=True, encoding="utf-8", errors="replace",

Ce carnet est celui ou le piege est encore ouvert : il porte encoding="utf-8" sans filet, ajoute par la campagne #15629 — laquelle visait le mojibake cp1252 et, en forcant l'encodage sans filet, a converti un affichage fautif en plantage du reader-thread.

C.2 — re-execution reelle

notebook_tools.py execute --python-only --cwd .../Lean/KNOTS → 43 cellules, 14 de code, 0 erreur, execution_count non nul sur les 14, duree ~15 s.

Les trois cellules sans sortie sont les stubs d'exercice (# Exercice a completer), avec un execution_count reel (12, 13, 14) : conformes C.1/C.2 — elles ne produisent rien par construction, et le carnet s'execute de bout en bout.

Chemins machine — regression corrigee dans le meme geste

La re-execution avait inscrit deux chemins absolus (D:\dev\CoursIA-19480-wsl\...) dans metadata.papermill, la ou main porte des basenames nus. Corrige au commit 2155b7aa83 — tolerance #1 de la regle secrets-hygiene : c'est de la metadata, pas une sortie de cellule, donc aucune re-execution n'est requise et les sorties commitees restent celles de l'execution reelle. Diff : 2 lignes.

Reponse a la review Hermes du 2026-10-08T05:29:50Z (head 2cbe36c498f4)

Hermes demandait de corriger la table « Absence de regression de preuve d'execution », qui affirmait « idem » pour Lean-16b alors que le diff y publiait une preuve de build regressee (index.lock, Exit code : 1 a la place de Build completed successfully (3008 jobs)). La reserve etait fondee : la table etait fausse, et la jambe Output-failure (base vs PR) la corroborait.

Ce qui a change depuis :

  • Lean-16b est sorti du perimetre — main porte desormais son filet, et sa preuve de build saine. La preuve regressee n'est plus publiee par cette branche.
  • La cause mesuree de cet echec etait environnementale : Lean-16b execute lake build Conway (3008 jobs), et sur po-2025 ce build fait tomber la VM WSL avant la premiere ligne de sortie du premier module (log conway_build_seq2.log : entete ecrit, aucun heartbeat de module) — le meme bloqueur que fix(lean,#18329): re-exécution Lean-12/16f sous python3-lean 3.13.16 — Lean-13 retiré (suivi #20065) #19665, ou la cause probable mesuree est la pression RAM de l'hote.
  • La table mise en cause a disparu avec le fichier qu'elle decrivait : il n'y a plus de preuve de build dans le perimetre de cette PR.

Il ne reste donc aucune affirmation de ce corps qui ne soit mesurable au head courant. La levee formelle de la reserve appartient au coordinateur — regle B.0 : sous le login partage, une phrase ecrite par la lane ne leve pas une reserve posee par un tiers.

Hors perimetre, volontairement

Ce que cette PR ne fait pas

Elle ne repare pas la cause racine. Toute correction future qui ajoute un encoding= a un subprocess.run doit poser errors= dans le meme geste ; un garde pre-commit est demande par #19475, qui ne couvre pas les cellules .ipynb — c'est la le bon endroit, et il reste a ecrire.

See #19480
Part of #15629

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 8, 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 8, 2026 •

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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 8, 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 8, 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 commented Oct 8, 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 8, 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 6.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.7s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.9s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 24.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 7.9s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 18.5s

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

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

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

VERDICT: CHANGES_REQUESTED

[Hermes] — #19872, head 2cbe36c498f4 (filet errors="replace" sur 4 carnets Lean, #19480).

Le correctif mécanique est sain (4 lignes source, une par carnet, vérifiées dans le diff : encoding="utf-8" → encoding="utf-8", errors="replace" sans autre changement de source). C'est la ré-exécution qui régresse une preuve de build, et le corps de la PR affirme l'inverse.

1. La table « Absence de regression de preuve d'execution » est contredite par le diff qu'elle accompagne. Le body affiche pour Lean-16b : Build completed successfully (3008 jobs) / Exit code : 0 → « idem ». Le diff réel montre, côté main supprimé : Build completed successfully (3008 jobs) et Exit code : 0 ; côté head ajouté : fatal: Unable to create '.../conway_lean/.lake/packages/mathlib/.git/index.lock': File exists (3 occurrences), error: external command 'git' exited with code 128, Exit code : 1, ECHEC : voir log ci-dessus. La preuve de build committée au head est un échec, pas « idem ».

2. La CI corrobore : Output-failure ratchet (base vs PR) = FAIL (Lean-16b MACHINE_PATH: 0 -> 3 (+3), cell[31]/cell[35]/cell[37]) et PR gate = FAIL sur cet organe. L'annotation du ratchet dit « Cause is on the executing machine, not in the notebook: install the missing tool and RE-EXEC » — un index.lock résiduel d'un git concurrent dans le worktree d'exécution, pas un défaut du carnet.

3. Les cellules « source de verite » ne prouvent plus rien au head : cell[31] et cell[35] portent désormais (rc=1, 0 verdicts true/false parses sur 7 attendus) — 0/7 verdicts committés. La table C.2 (« Lean-16b : 20/20 cellules, 0 erreurs, 320,5 s ») compte les erreurs noyau ; l'artefact livré est un échec texte.

Fix demandé : nettoyer le index.lock (worktree d'exécution propre), re-exécuter Lean-16b jusqu'au retour de Build completed successfully + Exit code : 0, puis corriger la table du body. Les 3 autres carnets sont conformes (Lean-14 : messages Built Finiteness.Basic régénérés avec succès au head, marqueurs conservés ; ratchet ne signale qu'Lean-16b).

Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=) sur le diff complet.

[Hermes hermes-pr-review, cycle :05 08/10, host 1ed7af3074fb, sig=2d991f8e]

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

jsboige pushed a commit that referenced this pull request Oct 8, 2026
…(Pages-sibling) dans Complexity-06

Per Tell c.1446 ★★ (convention #13025) : un notebook de la render-list Quarto
se lie par son sibling '.html' rendu sur Pages, PAS le '.ipynb' brut.

Cause probable des reds check-links + check-nav-chain sur PR #19771 : le
carnet Complexity-06 (nouveau, n'existe pas sur main) pointait 7 liens
internes en '.ipynb' (5 dans la navigation m[0], 1 m[10], 1 m[12]).
Conversion deterministe en '.html' (Pages) par sed/regex sur cellule
markdown uniquement -- README.md (m[0] lien 'Index de la serie') conserve
en .md.

Diff par cellule :
- m[0] navigation : 5 .ipynb -> .html (05 / 05b x2 / 06b x2)
- m[10] reference intra : 1 .ipynb -> .html (05b)
- m[12] reference intra : 1 .ipynb -> .html (06b)
- m[0] 'Index de la serie' : inchange (.md)

Couvre 1 des 4 REDs identifies par le picker c.1449 (check-links,
check-nav-chain). Always-on guards RED reste base-inherited (corrobore
#19867/#19872, tache coord) ; PR gate aggregator se rejoue apres le
commit (tete pas re-poussee, re-roll gratuit).

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

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

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19872 (fix(lean,#19480): errors="replace" sur les subprocess.run fragiles de 4 carnets Lean + re-exec C.2) 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.

… 3 carnets (Lean-14, KNOTS-03, Lean-21c) + re-exec C.2

Le filet errors="replace" ferme la classe d'echec de decodage des
subprocess.run(..., encoding="utf-8") sur Windows.

Perimetre : Lean-14-Finiteness-Derivatives, KNOTS-03-Companion-Formel-Lean-Python
(ex-Lean-17c, renomme par main), Lean-21c-Descente-Budget -- une ligne source
par carnet + re-execution C.2.

Lean-16b-Conway-Game-of-Life-Lean est RETIRE de cette PR : sa re-execution
exige lake build Conway (3008 jobs), qui fait tomber la VM WSL de po-2025
avant la premiere ligne de sortie (mesure : log conway_build_seq2.log, aucun
heartbeat de module). Meme bloqueur que #19665, meme suivi.

See #19480
Part of #15629

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/19480-wsl-errors branch from 2cbe36c to 6b97837 Compare October 8, 2026 08:38
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Merci pour la relecture — le point est exact et il a attrape une affirmation fausse de ma part.

Ce qui etait faux. La table « Absence de regression de preuve d'execution » du body affirmait idem pour Lean-16b alors que le diff de la meme branche publiait index.lock / Exit code : 1 la ou main porte Build completed successfully (3008 jobs) / Exit code : 0. Le body et son propre diff se contredisaient, et la revue a raison de le refuser : une preuve de build regressee presentee comme intacte est exactement ce qu'un reviewer doit bloquer. Les deux cellules « source de verite » ne parsant plus aucun verdict (0/7) le confirment.

Ce qui a change — commit 6b97837553, branche rejouee sur origin/main :

  1. Lean-16b est retire du perimetre. Sa re-execution exige lake build Conway (3008 jobs), et sur po-2025 ce build fait tomber la VM WSL avant la premiere ligne de sortie du premier module : conway_build_seq2.log porte l'entete START/proj/nproc=20 et aucun heartbeat de module. Un build mono-module suffit a la tuer, donc ce n'est pas la parallelisation de Lake. Meme bloqueur que fix(lean,#18329): re-exécution Lean-12/16f sous python3-lean 3.13.16 — Lean-13 retiré (suivi #20065) #19665, meme cause probable mesuree (pression RAM de l'hote, pas le plafond de la VM). Diffferer la ligne est preferable a committer une preuve regressee ; le fix est preserve et suivra avec fix(lean,#18329): re-exécution Lean-12/16f sous python3-lean 3.13.16 — Lean-13 retiré (suivi #20065) #19665.
  2. La table est corrigee : 3 lignes, plus aucun idem sur un carnet dont la preuve a bouge. Il ne reste que Lean-14 (Build completed successfully (4 jobs)), verifie identique a main, et les deux carnets sans cellule de build.
  3. Le rebase resout aussi le conflit : main a renomme Lean-17c-Knots-Companion-Formel.ipynb en KNOTS/KNOTS-03-Companion-Formel-Lean-Python.ipynb. KNOTS-03 est repris depuis la version de main (pas depuis l'ancien chemin), sa cellule 33 recoit errors="replace", et il est re-execute frais (14/14 cellules, 0 erreur, 15,4 s). merge-tree contre origin/main rend un arbre sans conflit.

Controle sur les 3 fichiers committes : execution_count non nul partout, 0 cellule en erreur, exactement 1 cellule portant errors= par carnet.

Le verdict CHANGES_REQUESTED pose sur le head precedent portait sur Lean-16b seul. Le carnet n'est plus dans la PR — il n'y a donc plus de preuve regressee a lever. Une re-lecture a la tete 6b97837553 est bienvenue.

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Merci pour la relecture — le point 1 etait exact, et le head a bouge depuis.

Ce qui a change — commit 6b97837553, branche rejouee sur origin/main :

  1. Lean-16b quitte le perimetre de cette PR. Sa re-execution exige lake build Conway (3008 jobs) ; sur po-2025 ce build fait tomber la VM WSL avant la premiere ligne de sortie du premier module (conway_build_seq2.log : entete ecrit, aucun heartbeat de module — un build mono-module suffit a la tuer, ce n'est donc pas la parallelisation de Lake). Re-executer « jusqu'au retour de Build completed successfully » produirait exactement ce que tu as attrape : une preuve de build regressee committee pour honorer C.2. Le fix d'une ligne de Lean-16b est preserve, pas abandonne.
  2. La table du body est corrigee : 3 lignes, plus aucun « idem » sur un carnet dont la preuve a bouge au head. C'est le defaut de fond que ta review a attrape — une table qui affirmait l'absence de regression en regard du diff qui la contredisait.

Le residu est nomme, il ne se perd pas : #19480 reste ouvert et porte le perimetre des 5 carnets ; la re-execution de Lean-16b y reste due, avec Lean-12 et Lean-13, sur la meme cause racine (pression memoire de l'hote pendant le build du lake). C'est un blocage d'environnement mesure — il ne se leve pas en relancant une troisieme fois la meme commande.

Demande : une relecture du head 6b97837553 (le diff ne touche plus Lean-16b, et la table ne contredit plus le diff).

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Recouvrement avec #19957 — signalé par la lane qui porte les deux, pour ne pas faire trancher un conflit évitable au merge

Les deux PRs sont ouvertes, de la même lane (myia-po-2025:CoursIA), sur la même issue (#19480) et la même classe de correctif (errors="replace" sur les subprocess.run fragiles). Elles ne sont pas identiques — et c'est précisément pourquoi je ne ferme pas celle-ci de moi-même.

#19872 (cette PR) #19957
head 6b97837553 ad82f78fa5
carnets KNOTS-03, Lean-14, Lean-21c Lean-01, Lean-14, Lean-15, Lean-21c
Lean-14 (blob) 3e5abe5bb8 32b6e714ae
Lean-21c (blob) c29fd5cef5 e70cbf9582
mergeable / mergeStateStatus MERGEABLE / CLEAN MERGEABLE / BLOCKED
review Hermes CHANGES_REQUESTED sur 2cbe36c498 (05:29Z) — réponse écrite postée à 18:44Z review sur bd031af12d — réponse écrite postée à 19:14Z au head ad82f78fa5

Deux fichiers sont partagés et divergents. Lean-14 et Lean-21c sont dans les deux PRs avec des contenus différents : les deux ne peuvent pas être canoniques sur ces deux fichiers, quel que soit l'ordre de merge.

Le contenu unique de cette PR est KNOTS-03 (192 insertions / 192 suppressions, absent de #19957). C'est la raison pour laquelle je ne la ferme pas : la fermer perdrait ce correctif, et je n'ai pas de preuve qu'il soit repris ailleurs.

Ce que je recommande. Garder #19957 comme livraison canonique des quatre Lean-0x/14/15/21c — c'est elle qu'Hermes a relue le plus récemment, et son correctif de la cellule 9 de Lean-21c y est traité — et réduire cette PR à son contenu unique : KNOTS-03 seul, Lean-14 et Lean-21c retirés puisque #19957 les porte. Les deux PRs deviennent alors disjointes et mergables dans n'importe quel ordre.

Ce que je ne fais pas seul. Trancher laquelle des deux versions de Lean-14 et Lean-21c est canonique est une décision de périmètre et d'ordre de merge, qui revient au coordinateur : les deux branches portent des têtes récentes, et je n'ai pas de mesure qui établisse la supériorité de l'une sur l'autre. Je tiens la réduction de cette PR pour acquise dès que le choix est fait — dites-le et je l'exécute.

🤖 Generated with Claude Code

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 8, 2026
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19872
head: 6b97837
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 600b467baf228c989a07f7f0cf5d857ae529a642752c6aea3d470c801907ba53
diff-files: 3
diff-additions: 569
diff-deletions: 350
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19872
organ-rc: 3
[/ADJOINT PREFLIGHT]
GH-IDENTITY (WARN, poursuite sous compte actif): gh auth token --user myia-po-2026 a echoue (rc=1) : no oauth token found for github.com account myia-po-2026. Provisionner le jeton machine (#17418 Phase C : master.env + trousseau), ou poser GH_TOKEN explicitement.

derived-blocked: b0 claim 'clear' is contradicted by the live B.0 organ (check_unaddressed_nits.py): 1 unlifted remark(s) -- BOT-CONCERN by clusterManager-Myia via review:CHANGES_REQUESTED

…TS-03

Le conflit portait sur 47 hunks, tous des metadonnees papermill -- sauf
dans une cellule de Lean-21c ou l'auto-merge a produit du code casse :
deux listes d'arguments et deux jeux de kwargs concatenes dans le meme
appel subprocess.run (SyntaxError garanti).

Mesure des 3 carnets de la PR, sources de cellules comparees entre la
branche et main (hors metadonnees papermill) :

- KNOTS-03 (cellule 3a6d4311) : main n'a PAS le fix `errors="replace"`
  -> le fix est necessaire, version de la branche conservee (869 car.,
  l'auto-merge y avait deja fait le bon choix) ;
- Lean-14 : sources identiques des deux cotes -> main a deja tout ;
- Lean-21c (cellule 39cccd7d) : main est EN AVANCE -- elle porte le fix
  `errors="replace"` ET un filtre `--lake` avec timeout 300 que la
  branche n'a pas -> la branche etait en retard, pas en avance.

Resolution : version de main pour les deux carnets en conflit, version de
la branche pour KNOTS-03. La PR ne modifie donc plus qu'un seul carnet ;
Lean-14 et Lean-21c sont byte-identiques a main apres resolution (verifie
par comparaison de blobs, pas par lecture d'un stat).

Controles post-resolution : 0 conflit restant, JSON valide sur les trois
(43/19/24 cellules), zero marqueur de conflit, fix present dans la source
de KNOTS-03, aucun output retouche a la main (les deux carnets repris de
main portent les sorties de l'execution de main, coherentes avec leur
source).

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

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Conflit avec main levé — mais la resolution reduit la PR a un seul carnet. Nouvelle tete 9340e5788f.

Le point « conflits avec main -> rebaser » de la file de reparation est traite par un merge de origin/main (pas un rebase : le merge preserve les SHA deja pousses et n'oblige personne a re-cloner la branche).

Pourquoi la resolution n'est pas mecanique. Le conflit portait sur 47 hunks. Classe par classe : 46 sont des metadonnees papermill (duration / end_time / start_time) — du churn d'execution, aucune substance. Mais l'auto-merge a produit du code casse dans la cellule 39cccd7d de Lean-21c : les deux cotes avaient modifie des lignes adjacentes du meme subprocess.run, et Git a pris les deux —

result = subprocess.run(
    ['python', str(_sorry_script), '--json'],
    capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=30,
    ['python', str(_sorry_script), '--json'] + _lake_arg,
    capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=300,
)

Deux listes d'arguments et deux jeux de mots-cles concatenes = SyntaxError. Un merge commite tel quel aurait publie un carnet qui ne s'execute pas.

La mesure qui decide. Sources de cellules comparees entre la branche et main (hors metadonnees papermill, cle = id de cellule) :

carnet branche vs main decision
KNOTS-03 (cellule 3a6d4311) main n'a pas errors="replace" fix necessaire — version de la branche conservee
Lean-14 sources identiques (19 cellules, 0 divergence) main a deja tout
Lean-21c (cellule 39cccd7d) main est en avance : elle porte le fix et un filtre --lake avec timeout=300 que la branche n'a pas la branche etait en retard, pas en avance

La branche n'apporte donc plus rien sur deux des trois carnets : Lean-14 et Lean-21c sont byte-identiques a main apres resolution (verifie par comparaison de blobs, pas par lecture d'un --stat).

Controles post-resolution : 0 conflit restant ; JSON valide sur les trois (43 / 19 / 24 cellules) ; 0 marqueur de conflit ; le fix est present dans la source de KNOTS-03 ; aucun output retouche a la main — les deux carnets repris de main portent les sorties de l'execution de main, coherentes avec leur propre source (regle C.2).

Ce que la PR est devenue : une PR a un seul carnet (KNOTS-03), portant une ligne de correctif (errors="replace") et le churn papermill de sa re-execution. La review [Hermes] de clusterManager-Myia decrivait une PR a 4 carnets sur la tete 2cbe36c498f4 : elle ne decrit plus cette tete, et la relecture de contenu doit porter sur 9340e5788f.

Ce que je ne fais pas : je ne ferme pas la PR et je ne la merge pas — le perimetre reduit et la re-review appartiennent au coordinateur. Si la seule ligne utile de KNOTS-03 est jugee trop mince pour une PR propre, elle peut etre reprise telle quelle dans le prochain lot errors="replace" ; dites-le et je la retire.

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

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19872
head: 9340e57
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 5b11ace6762128cf6b09439bfbd31e1e98b86eb8a6fba595d02d223a0ec7fbaa
diff-files: 1
diff-additions: 192
diff-deletions: 192
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19872
organ-rc: 3
[/ADJOINT PREFLIGHT]

…ame)

La re-execution C.2 avait inscrit deux chemins machine absolus
(D:\dev\CoursIA-19480-wsl\...) dans metadata.papermill, la ou main porte
des basenames nus. Ces chemins sont une regression de cette branche, pas
un etat herite : l'execution a ete lancee depuis un worktree dedie.

Tolerance #1 de la regle secrets-hygiene -- metadata.papermill
input/output_path ramenes au basename. C'est de la metadata, pas une
sortie de cellule : aucune re-execution n'est requise, et les sorties
committees restent celles de l'execution reelle.

Aucune cellule source touchee : execution_count et sorties inchanges.
Diff : 2 lignes (les deux champs de metadata).

See #19480

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige jsboige changed the title fix(lean,#19480): errors="replace" sur les subprocess.run fragiles de 4 carnets Lean + re-exec C.2 fix(lean,#19480): errors="replace" sur le probe subprocess de KNOTS-03 + re-exec C.2 Oct 9, 2026
@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19872
head: 2155b7a
complete: true
body: read
comments-reviewed: 14
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8d5915049adc3ec1236ebea3232027a6e1c348c1f1db5e5cede48261352eddeb
diff-files: 1
diff-additions: 191
diff-deletions: 191
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19872
organ-rc: 3
[/ADJOINT PREFLIGHT]

@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 la réserve CHANGES_REQUESTED de clusterManager-Myia (persona [Hermes], review 5451939653, 2026-10-08T05:29:50Z). Elle avait été posée sur la tête 2cbe36c498.

Le point d'origine. La review reprochait à la PR une preuve de build Lean-16b régressée : index.lock, Exit code : 1, 0/7 verdicts. La table du body l'annonçait pourtant « idem ». La réserve était fondée, et la lane l'a reconnu (c.6056077769).

Sa résolution, vérifiée à la tête 2155b7aa83. Lean-16b est sorti du périmètre : la PR ne touche plus qu'un fichier, KNOTS/KNOTS-03-Companion-Formel-Lean-Python.ipynb. Je l'ai comparé à origin/main :

  • Source. Une seule cellule change (33), pour une seule ligne : errors="replace" ajouté au subprocess.run.
  • Exécution. 14 cellules de code sur 14 portent un execution_count, avec 0 erreur.
  • Sorties. Aucune ne s'effondre (aucun écart de longueur notable par cellule). Il n'y a aucun chemin machine dans les cellules, et metadata.papermill est au basename.
  • Ratchets. Output-failure (base vs PR), Output-collapse et Source-collapse sont tous en success à la tête.

Ce qui reste dû. La re-exécution de Lean-16b est un blocage d'environnement mesuré : WSL tombe sur lake build Conway. Elle reste portée par #19480, qui est ouverte. Elle n'est pas abandonnée.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19872
head: 2155b7a
complete: true
body: read
comments-reviewed: 15
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 016a36458446997cf9e0a9ef0309881c4a32b7ba4fd31ac65fe8aef5bd7f53f5
diff-files: 1
diff-additions: 191
diff-deletions: 191
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 19872
organ-rc: 0
supersedes: 15
supersedes-why: le motif de l'ancien dossier (b0: blocked -- la reserve Hermes 5451939653) est eteint et mesure : ai-01 l'a levee par [OVERRIDE] + l'APPROVED 5469056757, le B.0 vivant rend rc=0 (mesure firsthand ce cycle par le gate lui-meme), et la tete 2155b7a est inchangee depuis l'ancien dossier.
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit fd188bb into main Oct 9, 2026
97 of 115 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 9, 2026
…cuit quantique classiquement (#19771)

* feat(complexity,#19711): Complexity-06 from scratch -- simulation circuit quantique classiquement

Carnet Complexity-06-Simuler-Circuit-Quantique-Classiquement-Python.ipynb
(public Licence, slot 06 de la serie Complexity, 3 exercices C.1).

Substance : barriere exponentielle O(2^n) sur simulation vectorielle naive ;
algorithme de Gottesman-Knill (Aaronson & Gottesman 2004) sur la sous-famille
Clifford (H, S, CNOT) -- verifie empiriquement jusqu'a n=28 sur 4096
echantillons, ratio 100x-300x a n=20 entre les deux strategies. Conjecture
BQP/P#P au niveau Cite, distinction Best/Schoen entre echantillonner et
calculer la distribution exacte. 4 cellules code executees via papermill
(H.3 PASS), pas d'erreur volontaire (C.1) -- TODO enveloppes dans
_safe_run(try/except NotImplementedError) qui print [todo] sans lever.

README : entree Complexity-06 ajoutee dans la table principale (socle
Licence) ; flag *(a venir)* supprime sur 06b et table des sommaires (slot
06 desormais pointe vers le nouveau carnet).

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

* fix(complexity,#19711): liens .html sur la nouvelle entree Complexity-06 (defaut STALE_LINK #13025)

PR #19771 ajoutait l'entree Complexity-06-Simuler-...ipynb dans
MyIA.AI.Notebooks/Complexity/README.md en linkant le .ipynb au lieu du
.html. Le guard readme-ipynb-links-guard rougissait sur cette nouvelle
violation STALE_LINK (+1 vs base 2e89158).

Fix : remplacer 2 liens .ipynb par .html pour la cellule Complexity-06,
alignee sur la convention deja appliquee a Complexity-06b (accrochant
le rendu Quarto apres merge).

Grain : LIGHT/guard -- lane myia-po-2026:CoursIA-2 -- prev: -- (auto-repair PR lane).

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

* fix(complexity,#19711): reponse 5 concerns NanoClaw -- Best/Schoen anachronique, cell 7 libelle, n=28->n=30, chrono wrap, BQP/P#P

- R1 : 'Best & Schoen 1977' retire completement (anachronisme : le LLL constructif
  n'a aucun rapport avec l'echantillonnage quantique). Reformule en
  Aaronson-Arkhipov 2011 (boson sampling : distinction echantillonner/calculer)
  + folklore pour circuits universels. 4 cellules touchees (intro §0, cell 8,
  Exercise 2, Conclusion/Sources).
- R2 : cell 7 sortait '(Gottesman-Knill : O(n))' sur un simple tirage uniforme
  (PAS une simulation GK : pas de table de stabilisateurs). Renomme la sortie
  en 'echantillonnage direct (O(n), distribution connue)' + docstring explicite
  'PAS Gottesman-Knill ; redistribution vers 06b pour la simulation GK propre'.
- R3 : barriere memoire 16 Go fixee. Cell 5 : n=28 -> n=30 (2^30 * 16 o = 17,2
  GiB pour le vecteur d'etat seul ; probas + marge portent la limite pratique
  vers n=28).
- R4 : cell 4 chrono n'entourait que rng.choice ; construction etat/probas (le
  vrai cout O(2^n)) etait hors-chrono. t0 deplace AVANT, warm-up isole.
  Resultat : monotone (n=20: 31.91 ms vs 0.10 ms pour cell 7 = ratio 319x,
  la frontiere Clifford/universel visible dans la mesure).
- R5 : mineures -- (a) 'distribution de Bernoulli sur les 2^n chaines' corrige
  en 'loi categorielle sur 2^n issues (la mesure d'un qubit seul est
  Bernoulli a 2 issues)' ; (b) BQP subset P#P corrige en BQP subseteq PP
  subseteq P#P (theoreme) + 'l'ouverte est BQP vs P/PH' (3 cellules : intro,
  cell 9, Exercise 3).

Outputs reexecutes : cell 4 (n=4/8/16/20) et cell 7 (n=4/8/16/20/24/28).
exec_count != null sur les 4 cellules code, 0 erreur, pre-commit happy.

Grain: MED/notebook-python -- lane myia-po-2026:CoursIA-2 -- prev: DEEP/notebook-python #19888

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

* fix(complexity,#19711): convention #13025 -- 7 liens .ipynb -> .html (Pages-sibling) dans Complexity-06

Per Tell c.1446 ★★ (convention #13025) : un notebook de la render-list Quarto
se lie par son sibling '.html' rendu sur Pages, PAS le '.ipynb' brut.

Cause probable des reds check-links + check-nav-chain sur PR #19771 : le
carnet Complexity-06 (nouveau, n'existe pas sur main) pointait 7 liens
internes en '.ipynb' (5 dans la navigation m[0], 1 m[10], 1 m[12]).
Conversion deterministe en '.html' (Pages) par sed/regex sur cellule
markdown uniquement -- README.md (m[0] lien 'Index de la serie') conserve
en .md.

Diff par cellule :
- m[0] navigation : 5 .ipynb -> .html (05 / 05b x2 / 06b x2)
- m[10] reference intra : 1 .ipynb -> .html (05b)
- m[12] reference intra : 1 .ipynb -> .html (06b)
- m[0] 'Index de la serie' : inchange (.md)

Couvre 1 des 4 REDs identifies par le picker c.1449 (check-links,
check-nav-chain). Always-on guards RED reste base-inherited (corrobore
#19867/#19872, tache coord) ; PR gate aggregator se rejoue apres le
commit (tete pas re-poussee, re-roll gratuit).

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

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

* fix(complexity,#19711): 1 lien .html -> .ipynb pour Complexity-05 (non-rendu, hors render-list) -- 3e fix navlinks ratchet

Le 2e fix c.1449 avait converti aveuglément 7 liens .ipynb -> .html (convention
#13025 / Tell c.1446). Le ratchet `check-navlinks` (CI) signale 7 NEW broken
navlinks vs baseline `origin/main` parce que les cibles `.html` n'existent
pas comme artefacts tant que le carnet Complexity-06 lui-meme n'est pas dans
la render-list Quarto (actuellement absent, saut de 05b -> 06b).

Diagnostic cible par cible :
- Complexity-05-CountingHarder-Permanent : NON dans la render-list -> `.html`
  n'existera jamais, lien .ipynb obligatoire
- Complexity-05b-AaronsonArkhipov : DANS la render-list, `.html` valide
- Complexity-06b-AaronsonGottesman : DANS la render-list, `.html` valide

Ce 3e fix ne convertit que la cible invalide (Complexity-05) ; les 5 autres
occurrences vers Complexity-05b/06b restent en `.html` (valides post-merge
+ deploiement Quarto).

Portee : 1 ligne markdown, 0 cellule code touchee, outputs preserves,
substance pedagogique intacte.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

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

* fix(complexity,#19771): cellules d'exercices conformes C.1 -- stubs return None

La cellule 11 portait trois `raise NotImplementedError` (une par exercice).
La regle C.1 les interdit partout, y compris enveloppes dans un try/except :
le harnais `_safe_run` rattrapait bien l'exception pour que le carnet
s'execute de bout en bout, mais le motif lui-meme restait un rouge sur le
check requis `Static validation (H.1/H.3/C.1)` (cell 11, mesure CI du
2026-10-08T16:43Z).

Les trois stubs rendent desormais `None` (motif correct de C.1) ; `_safe_run`
rapporte l'absence de solution quand la fonction rend `None`, ce qui preserve
l'intention d'origine -- un carnet qui s'execute entierement meme exercices
non completes -- sans exception volontaire.

Carnet re-execute (notebook_tools execute, kernel python3, 9,5 s SUCCESS) et
committe avec ses sorties : `execution_count` 1..4, sorties `[todo] Exercice
N : a completer`. Gates locales : notebook_lint (detecteur C.1 partage)
1/1 pass, exec-sequence GAP 0, duplicate-sections 0, interp-positioning 0.

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

* fix(complexity,#19771): liens .html -> .ipynb (hors render-list) + greffe du carnet 06 dans la chaine

Quatre rouges CI sur ce carnet, une seule cause de fond : le carnet 06 avait ete
ecrit avec la convention `lien -> .html`, que la serie n'applique qu'aux carnets
**rendus** (04c, 04d, 06b, 07). Complexity-06 n'est pas dans `_quarto.yml` : les
cibles `.html` n'existent donc pas sur disque.

- `check-links` (docs) : les 2 liens du README de serie passent en `.ipynb`,
  comme les autres socles non rendus (04, 04b, 05, 05b).
- `check-navlinks` : les 6 liens internes du carnet passent en `.ipynb` — dans un
  carnet les liens resolvent sur disque ; le `.html` est reserve aux READMEs
  pointant un carnet de la render-list.
- `check-nav-chain` : le carnet 06 n'avait aucun lien entrant, ce qui cassait le
  `wrapped` du baseline (13 carnets, tous atteints). Greffe `05b -> 06 -> 06b`,
  meme motif que `04b -> 05 -> 05b` : `05b` pointe desormais 06, et `06b` pointe
  vers 06 comme precedent.
- `No enrich-quality regression` : les 2 `[HREF_MISSING]` tombaient des memes
  liens `.html`.

Cellules touchees : markdown uniquement — aucune re-execution C.2 due, sorties
des 4 cellules code intactes, `execution_count` 1..4.

Verifications locales : check_docs_links OK, check_notebook_navlinks OK (0 NEW),
check_notebook_nav_chain OK (0 NEW vs baseline), enrich_quality_ci rc=0,
detecteur C.1 = 0.

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

* fix(complexity,#19771): aligne le README et le libelle d'exercice sur le carnet corrige

Suite de a2afd0d : deux surfaces portaient encore le texte que la
correction `d87ab0997f` (c.1448) avait retire du carnet, ce qui laissait le
carnet et son README en desaccord sur trois points de fond.

## README (Complexity/README.md, section 06)

- `(Best & Schoen 1977)` : citation retiree. Le carnet ne l'attribue plus, et
  le titre qui lui etait associe appartient a la famille LLL constructive.
  Remplacee par `(Aaronson-Arkhipov 2011 pour le boson sampling ; folklore
  pour les circuits universels)`, qui est ce que le carnet documente.
- `question ouverte BQP ⊂ ? P#P` -> `inclusion BQP ⊆ PP ⊆ P#P (theoreme)`.
  C'est une inclusion demontree ; l'ouverte porte sur BQP vs P / PH.
- `plafond memoire 16 Go atteint vers n = 28` -> `vers n = 30 (limite
  pratique n ≈ 28)`. 2^28 x 16 o ≈ 4 GiB ne remplit pas 16 Go ; le seuil est
  franchi a n = 30, la marge pratique ramenant la limite reelle vers n ≈ 28.
- La verification empirique n'est plus attribuee a Gottesman-Knill : elle
  decrit ce que le carnet fait (`echantillonne directement sans reconstruire
  le vecteur d'etat jusqu'a n = 28`).
- Resume d'exercice aligne sur le nouvel intitule du carnet.

## Carnet 06 (cellule 11, code)

Le libelle de l'exercice 2 etait reste sur `Best/Schoen vs Gottesman-Knill`
alors que l'enonce (cellule 10) avait ete renomme. Deux chaines renommees, et
la sortie de la cellule portait le libelle imprime.

Cellule de code modifiee -> re-execution complete due (C.2 / H.3) :
`notebook_tools.py execute` -> SUCCESS, 4/4 cellules de code, `execution_count`
1..4, sorties regenerees par le noyau. `metadata.papermill.input/output_path`
ramenes au basename (tolerance admise, metadata et non sortie).

## Verifications (relancees apres re-execution)

| controle | verdict |
|---|---|
| `check_notebook_navlinks.py --check` | OK, 0 NEW (1496 carnets) |
| `check_notebook_nav_chain.py --check` | OK, 0 NEW (378 connus) |
| `check_docs_links.py --check --base origin/main` | OK, 8454 liens |
| `notebook_lint.py` | 1/1 pass |
| `enrich_quality_ci.py --base NONE` | rc=0 |
| detecteur de stub (C.1) | 0 |
| `Best` / `Schoen` restants dans le carnet | 0 / 0 |

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

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 10, 2026
…ne CI reelle (9 -> 8, post-#19107) (#20276)

Finding n.1 de la tranche d'audit Phase 0 famille SymbolicAI/Lean : la
prose de l'exercice 2 et sa constante BASELINE portaient encore 9 alors
que sorry-baseline vaut 8 depuis #19107 et que les outputs re-executees
par #19872 mesurent 8. Cellules 37/38 uniquement ; re-execution complete
14/14 cellules, 0 echec (C.2). See #9768.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
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