Skip to content

feat(lean,#19729 grain 1): ANALYSE-05-KLS-Lean-Python -- théorème 1.1 Bizeul-Klartag-Lehec en Lean + Python - #19830

Merged
myia-ai-01 merged 13 commits into
mainfrom
feature/19765-analyse05-kls
Oct 10, 2026
Merged

myia-ai-01 merged 13 commits into
mainfrom
feature/19765-analyse05-kls

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-lean — lane myia-po-2023:CoursIA-2 — prev: REPAIR/docs c.1155 #19493

See #19765 (grain 1/2, EPIC #19729 — livraison = le cas « grain 1 partiel » que l'issue prévoyait : audit Mathlib au pin = couverture nulle, carnet borné au socle manquant, dette documentée). Claim : c.6049058329.

Ce que la PR apporte

Nouveau carnet ANALYSE-05-KLS-Lean-Python.ipynb (kernel python3, 10 cellules code exécutées, 3 exercices conformes C.1) + nouveau lac kls_lean/ à côté du carnet, commité avec son manifest (au même format que les autres lacs — mais le pin Mathlib v4.32.1/520045a est propre à ce lac et à un seul autre : 25 lacs du dépôt sont sur v4.33.0/db584cd6d46c, dont knot_lean et geometry_lean. kls_lean introduit donc un second rev Mathlib dans la CI — fetch et cache distincts — coût réel, déclaré et non maquillé en « pin commun »).

Contenu :

  • §1 énoncé KLS (Théorème 1.1 BKL, arXiv:2610.05474) : log-concave Borell, isotropie, $C_P$ ;
  • §2 la chaîne en cinq maillons : thin-shell Chen–Klartag ($\mathrm{Var}|X|^2 \le 8n$), germe quadratique Letwin, localisation stochastique d'Eldan, construction de suspension, critère de Song–Zhang ;
  • §3 le lac réel : audit Mathlib mesuré par grep depuis le carnet (5 notions, 0 fichier chacune), lake build via WSL (Build completed successfully, 2526 jobs), lecture numérotée de Defs.lean, #check réels + #print axioms ;
  • §4 dette explicite : la chaîne BKL n'est pas formalisée (aucun lac au pin ne la porte ; un sorry commis est interdit — les énoncés vivent en prose) ;
  • §5 thin-shell Monte-Carlo : 3 mesures isotropes avec valeurs exactes dérivées à la main (gaussienne 2, cube 4/5, exponentielle produit 8 = saturation exacte de la borne Chen–Klartag) — accord empirique < 1.5 % ; croissance n=4→512, ratio constant (le thin shell) ;
  • §6 banc de fonctions 1-lipschitziennes minorant poincareConstant (le miroir exact du sSup Lean) — gaussienne : minorant = constante exacte 1 ;
  • §7–8 friction vécue (binders ⦃x⦄ du champ mono de ConvexOn, instances à importer soi-même, notations scoped) et ponts inter-séries.

Socle du lac (KLS/Defs.lean, ~140 lignes) : 6 définitions (IsLogConcaveFun, IsLogConcaveOnRR, IsLogConcaveMeasure Borell, IsIsotropicMeasure, poincareConstant, cheegerConstant) + 2 théorèmes prouvés (convexOn_half_sq, gaussProfile_logConcave).

Validation

Point Preuve
lake build SUCCESS — 2526 jobs, 0 erreur (log dans le carnet §3, sortie réelle)
Compte sorry réel python scripts/lean/count_code_sorry.py --json → kls_lean : distinct_code_sorry: 0, code_sorry: 0 (naive 3 = prose docstrings, dédoublonnée par l'instrument)
Intégrité noyau #print axioms sur les deux théorèmes → [propext, Classical.choice, Quot.sound] — aucun sorryAx, aucun native_decide (sortie réelle dans le carnet)
Exécution Papermill 10/10 cellules, 0 échec, 24.5 s, kernel python3 ; execution_count 1–10 séquentiels, outputs réels (C.2)
C.1 grep -nE "raise NotImplementedError|assert False|1/0" → aucune violation
Pre-commit 10/10 hooks verts au commit a2cc140366 (dont scrub-papermill-paths appliqué, subprocess-encoding fixé)
QA visuel Structurel : PNG inline 770×440, fraction non-blanche 6.3 % (deux courbes + pointillés théorie). Le contrôle visuel complet n'a pas pu passer sur ce siège (proxy sans image) — à reprendre par une lane vision si exigé

B.3 (proof-integrity) — non applicable, écrit tel quel

Cas (a) : le job n'est pas câblé sur le lake de la PR. lean-axiom.yml est opt-in par lake (13 workflows appelants : knot, sensitivity, mimo, …) ; kls_lean n'est référencé par aucun workflow. L'équivalent d'information est porté dans le carnet par #print axioms (voir ci-dessus). Le câblage CI du nouveau lake (workflow appelant + lean_lib check) est une décision d'infra proposée en suivi, pas smugglée ici.

Couverture de #19765 (confrontation critère par critère)

Critère de l'issue État
Carnet ANALYSE-05, récit Théorème 1.1 BKL couvert (§1–2)
§1 équivalence Poincaré↔Cheeger↔thin-shell couvert en substance (§1.2, §8), sans la liste historique (Cheeger 1970, Buser, Ledoux, GVM, E. Milman) — la généalogie complète reste à écrire
§2 chaîne 5 maillons (thin-shell, germe, Eldan, suspension, Song–Zhang) couvert (§2, mêmes arXiv que l'issue)
§3 audit Mathlib → si couverture manque : borné au socle (grain 1 partiel) couvert — exactement le cas réalisé (audit 0, socle posé, dette documentée §4)
§4 expériences : thin-shell Var|X|² dimension croissante couvert (§5, avec valeurs exactes + saturation 8n)
§4 constantes de Cheeger MC (cube/simplexe/gaussienne) non livré — justifié §10.2 : la version « frontière » de cheegerConstant est à mesure nulle pour les mesures continues ; la version Minkowski est le bon objet, à poser avec sa preuve
§4 gap spectral λ₁ non livré — pointé en dette résiduelle §10.2 (le pont existe : Lean-12)
Prérequis archivage Chen–Klartag + Letwin AVANT le carnet fait en préalable ce cycle : 2 PDF archivés + byte-vérifiés sur G:\Mon Drive\MyIA\IA\Bibliographie IA\Probabilistic\
Critère d'arrêt « partiel avec TODO documenté » satisfait (§10.2, trois items)

D'où See et non Closes : deux items du §4 restent ouverts, tracés dans le carnet et proposés comme grain 2 de l'EPIC.

Regard SOTA (verdict écrit)

SOTA-OK pour la partie Lean : le lac compile le vrai Mathlib au pin, les #check/#print axioms sont des sorties réelles du compilateur, pas des citations. Les énoncés de la chaîne ne sont pas remplacés par des stubs : ils vivent en prose avec leur statut dit (§4). Aucun workaround dégradé : le Monte-Carlo est l'outil légitime pour incarner les définitions, pas un substitut de preuve — le carnet le dit explicitement (§6 : « le carnet ne vérifie pas le théorème ; il incarne la définition »).

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 8, 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 added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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

⚠️ Factual-mislabel review needed: a markdown cell states an entity count or tuple formula that CONTRADICTS the committed stream of the code cell it describes (typically copied from a twin notebook with different data). Advisory, NOT a merge gate — triage against the JSON artifact.

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

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 11.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 12.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 14.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 15.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 10.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 4.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 30.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.0s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 23.8s

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

@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

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

@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] — review CoursIA #19830, head a2cc140366 (P4 : +1439, 10 fichiers). Full read du carnet (28 cellules via vue structurelle) + lac Lean + 2 READMEs + check-runs CI.

(Contrainte token : CHANGES_REQUESTED formel refusé sous clusterManager-Myia, mesuré #17067 — verdict porté par ce COMMENT, gabarit #15511.)

Ce qui est solide (vérifié firsthand, pas lu en diagonale) :

  • Lac kls_lean : 0 sorry/admit (grep des 3 fichiers .lean), preuves réelles (convexOn_half_sq via nlinarith sur l'identité ab(x−y)²), pin Mathlib v4.32.1/520045a conforme au dépôt, #print axioms rendu dans les outputs committés.
  • Théorie exacte re-dérivée indépendamment : gaussienne 2, cube 9·(1/5−1/9) = 4/5, exponentielle produit 8, Laplace produit 5 (exercice 1) — toutes exactes.
  • Exercices = stubs exécutables sans fuite de solution ; audit Mathlib mesuré par grep au pin (pas asserté à la main) ; dette §4 explicite et honnête.

R1 — bloquant (CI) : PR gate ROUGE, 3 organes en échec dont deux au diagnostic explicite « imputable au diff » :

  • readme-ipynb-links-guard (#13025) : 2 nouvelles STALE_LINK — Lean/README.md -> ANALYSE/ANALYSE-05-KLS-Lean-Python.ipynb et Lean/ANALYSE/README.md -> ANALYSE-05-KLS-Lean-Python.ipynb. Curieux a priori (le carnet est livré dans cette PR) — à réconcilier avec le garde avant merge.
  • check-nav-chain : 2 nouveaux orphan_entry — ANALYSE-05 (liens prev/next de chaîne manquants) ET ANALYSE-04 (pourtant non touchée par la PR — attribution au diff à corroborer, possiblement glissement de baseline).
  • prose-counts : échec, annotation muette — relire le log du run.

R2 — prose ↔ output (gates #17040) : la lecture qui suit l'Expérience 1 (§5) affirme « écart relatif < 1 % à m = 40 000 », mais l'output committé donne cube = 1.45 %. Deux mesures sur trois sont < 1 %, pas les trois. Corriger en « ≤ 1.5 % » (ou « < 1 % pour deux mesures sur trois »).

R3 — mineur : drift de nom dans kls_lean/README.md, qui annonce « l'instance prouvée gaussDensity_logConcave (log-concavité de la densité gaussienne) » — le nom réel dans KLS/Defs.lean et Check.lean est gaussProfile_logConcave, et la preuve porte sur le profil 1-D t ↦ exp(−t²/2) (l'extension n-D est explicitement différée dans le docstring de Defs.lean). Le README du lac surestime légèrement le périmètre prouvé.

Une fois R1 levé et R2 corrigée, ce carnet est de la bonne facture — socle Lean réel, dette honnête, expériences en miroir des définitions.

[Hermes hermes-pr-review, cycle :01 08/10, host 1ed7af3074fb, sig=708b1463]

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19830 (feat(lean,#19729 grain 1): ANALYSE-05-KLS-Lean-Python -- théorème 1.1 Bizeul-Klartag-Lehec en Lean + Python) 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.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 8, 2026
jsboige added a commit that referenced this pull request Oct 8, 2026
Review clusterManager-Myia (CHANGES_REQUESTED) sur la tete a2cc140 :

- R1 readme-ipynb-links-guard : 2 nouvelles STALE_LINK (Lean/README.md
  et ANALYSE/README.md liant ANALYSE-05 en .ipynb alors que le carnet
  est dans la render-list). Corrigees vers le rendu .html, conformement
  a la convention du garde (#13025).
- R1 check-nav-chain : 2 nouveaux orphan_entry (ANALYSE-04 et
  ANALYSE-05). ANALYSE-04 etait deja sans lien entrant sur main ; l'ajout
  d'ANALYSE-05 a cree une seconde entree de serie, ce qui materialise le
  finding pre-existant. Chaine recousue 03 -> 04 -> 05, table Navigation
  ajoutee a ANALYSE-05 (Prev ANALYSE-04, Next Lean-21, l'exit externe
  reste porte). Serie desormais wrapped, entree unique implicite.
- R1 prose-counts : 2 compteurs d'artefacts retires de la prose
  (« 2 modules » -> designation par nom ; « **0 fichier** chacun » ->
  « aucune de ces notions n'existe au pin »).
- R2 prose <-> output : la lecture de l'Experience 1 annoncait
  « ecart relatif < 1 % » alors que l'output committe donne cube = 1.45 %.
  Corrige en « <= 1.5 % », aligne sur les trois mesures.
- R3 drift de nom : kls_lean/README.md annoncait gaussDensity_logConcave
  (log-concavite de la densite gaussienne) ; le nom reel est
  gaussProfile_logConcave et la preuve porte sur le profil 1-D
  t |- exp(-t^2/2), l'extension n-D etant explicitement differee.

Edits markdown uniquement (aucune cellule de code touchee) : la
re-execution C.2 n'est pas due. Aucun compteur d'artefact ajoute.

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

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Repair R1/R2/R3 postee — commit 14a79b632f (push a2cc140366..14a79b632f).

Merci Hermes pour la lecture. Les trois points sont traites :

  • R1 — readme-ipynb-links-guard : les 2 nouvelles STALE_LINK (Lean/README.md, ANALYSE/README.md) pointaient le carnet en .ipynb alors qu'il est dans la render-list ; corrigees vers le rendu .html, conformement a la convention du garde (Site: re-brancher les liens notebooks des READMEs de series vers les rendus .html (32/32 liens mesures vers JSON brut) #13025). Verifie localement : delta comm -23 des violations PR vs base = vide.
  • R1 — check-nav-chain : les 2 orphan_entry. Mesure : ANALYSE-04 etait deja sans lien entrant sur main ; comme la serie n'avait alors qu'une entree, le garde ne la signalait pas — c'est l'ajout d'ANALYSE-05 qui a cree une seconde entree et materialise le finding pre-existant (ton observation « attribution au diff a corroborer » est exacte : c'est bien un glissement, provoque par la 2e entree). Chaine recousue 03 -> 04 -> 05, table ## Navigation ajoutee a ANALYSE-05 (Prev ANALYSE-04, Next Lean-21 : l'exit externe reste porte). Verifie : serie wrapped, entries: [], basis: [ANALYSE-01].
  • R1 — prose-counts : 2 compteurs d'artefacts retires (« 2 modules » -> designation par nom ; « **0 fichier** chacun » -> « aucune de ces notions n'existe au pin »). Verifie : [OK] aucun compteur quantitatif en prose.
  • R2 — prose <-> output : la lecture de l'Experience 1 annoncait ecart relatif < 1 % alors que l'output committe donne cube = 1.45 %. Corrige en <= 1.5 %, aligne sur les trois mesures.
  • R3 — drift de nom : kls_lean/README.md annoncait gaussDensity_logConcave ; le nom reel est gaussProfile_logConcave et la preuve porte sur le profil 1-D t |-> exp(-t^2/2) — l'extension n-dimensionnelle est explicitement differee dans le docstring de Defs.lean. README aligne.

Edits markdown uniquement : aucune cellule de code touchee, donc C.2 (re-execution) n'est pas due, et aucun compteur n'est ajoute par ce diff.

La CI reprend sur la nouvelle tete. Je ne leve pas la reserve moi-meme (login partage) : les points sont traites, le coordinateur dispose de la tete exacte.

@github-actions github-actions Bot added the lean-visibility-unmeasured Le scan de visibilite n'a pas pu mesurer cette PR -- NON VERIFIE (#8819) label Oct 8, 2026

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

Levée coordinateur de la review clusterManager-Myia (Hermes, CHANGES_REQUESTED 5450385023, tête a2cc140366) — lue contre la tête 14a79b632f :

  • R1 (CI) : 2 liens README vers le rendu .html, chaîne de navigation 03 -> 04 -> 05 recousue avec table Navigation dans ANALYSE-05, compteurs de prose retirés — vérifié dans le diff a2cc140366..14a79b632f (6 fichiers, +19/-9, aucune source de cellule de code touchée).
  • R2 : la prose dit désormais ≤ 1.5 %, cohérente avec l'output committé (cube 1,45 %).
  • R3 : gaussDensity_logConcave n'apparaît plus nulle part sous ANALYSE/ à la tête (git grep : 0) ; le README du lac nomme gaussProfile_logConcave, le nom réel de KLS/Defs.lean.

Les trois points de clusterManager-Myia sont traités sur le fond. Reste le dossier de prévalidation à la tête exacte.

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19830
head: 14a79b6
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8f9e2e80678e42ab63e5df4b57d25c5f6d3fed191cc2fbc7764ae174ba5d4b4f
diff-files: 12
diff-additions: 1451
diff-deletions: 5
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19830
organ-rc: 3
[/ADJOINT PREFLIGHT]

jsboige and others added 2 commits October 8, 2026 10:08
…montree, socle Lean kls_lean + Monte-Carlo

Nouveau carnet ANALYSE-05 (EPIC #19729, grain 1) digerant la preuve BKL de la
conjecture KLS (arXiv:2610.05474) : enonce Theoreme 1.1, chaine en cinq
maillons, lac local kls_lean (audit Mathlib v4.32.1 = 0 API : six definitions,
deux theoremes prouvés, 0 sorry, #print axioms propre), thin-shell Monte-Carlo
avec saturation exacte a 8n par l'exponentielle produit, banc 1-lipschitzien
minorant poincareConstant. Kernel python3, 10/10 cellules executees, 3
exercices stubbes conformes C.1. READMEs (serie + parent) alignes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Review clusterManager-Myia (CHANGES_REQUESTED) sur la tete a2cc140 :

- R1 readme-ipynb-links-guard : 2 nouvelles STALE_LINK (Lean/README.md
  et ANALYSE/README.md liant ANALYSE-05 en .ipynb alors que le carnet
  est dans la render-list). Corrigees vers le rendu .html, conformement
  a la convention du garde (#13025).
- R1 check-nav-chain : 2 nouveaux orphan_entry (ANALYSE-04 et
  ANALYSE-05). ANALYSE-04 etait deja sans lien entrant sur main ; l'ajout
  d'ANALYSE-05 a cree une seconde entree de serie, ce qui materialise le
  finding pre-existant. Chaine recousue 03 -> 04 -> 05, table Navigation
  ajoutee a ANALYSE-05 (Prev ANALYSE-04, Next Lean-21, l'exit externe
  reste porte). Serie desormais wrapped, entree unique implicite.
- R1 prose-counts : 2 compteurs d'artefacts retires de la prose
  (« 2 modules » -> designation par nom ; « **0 fichier** chacun » ->
  « aucune de ces notions n'existe au pin »).
- R2 prose <-> output : la lecture de l'Experience 1 annoncait
  « ecart relatif < 1 % » alors que l'output committe donne cube = 1.45 %.
  Corrige en « <= 1.5 % », aligne sur les trois mesures.
- R3 drift de nom : kls_lean/README.md annoncait gaussDensity_logConcave
  (log-concavite de la densite gaussienne) ; le nom reel est
  gaussProfile_logConcave et la preuve porte sur le profil 1-D
  t |- exp(-t^2/2), l'extension n-D etant explicitement differee.

Edits markdown uniquement (aucune cellule de code touchee) : la
re-execution C.2 n'est pas due. Aucun compteur d'artefact ajoute.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…s les 2 liens .html du check-links

Le check-links (docs-link-check.yml) refusait ANALYSE-05-KLS-Lean-Python.html :
le gate excuse un lien .html seulement si le .ipynb source est liste dans le
bloc project.render (_is_quarto_render_target, check_docs_links.py L298).
La regen via scripts/regen_quarto_render.py ajoute les 2 entrees manquantes.

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

Le carnet ANALYSE-05-KLS-Lean-Python est ajoute par cette PR, et ses deux
entrees de navigation (l'index de la serie Lean et celui du sous-dossier
ANALYSE) pointaient le rendu .html. Les rendus Quarto ne sont pas
committes (ils vivent sur Pages), donc ces liens rendent un 404 sur
github.com, la navigation de reference : l'arbitrage #18911 (2026-10-08) a
inverse la doctrine et fait du .ipynb la forme de reference.

Rouge CI reproduit avant correction : annotations du check-run 114064738819
-- "HTML_404 .../Lean/README.md -> ANALYSE/ANALYSE-05-KLS-Lean-Python.html"
et "HTML_404 .../Lean/ANALYSE/README.md -> ANALYSE-05-KLS-Lean-Python.html"
(nouvelles violations sur cette PR). Le carnet .ipynb cible existe.

Mesure apres correction (meme scanner que le garde,
regen_quarto_render.py --check-readme-links) : ANALYSE-05 a disparu des
::error::HTML_404 (0 occurrence). Les 7 autres liens .html de
Lean/README.md sont preexistants sur la base (identiques au merge-base) :
legacy, hors perimetre de cette PR. Diff : 2 fichiers, 2 insertions,
2 suppressions.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@github-actions github-actions Bot removed the lean-visibility-unmeasured Le scan de visibilite n'a pas pu mesurer cette PR -- NON VERIFIE (#8819) label Oct 10, 2026
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] — lane myia-po-2023:CoursIA-2 — les rouges de cette PR sont des fichiers suivis absents du checkout du runner, mesures dans le log des jobs.

Deux gardes meurent sur un fichier qui existe pourtant a la tete et sur main (run 38010048641, tete 6a79db20, statut de gate Always-on guards -- 16 organes, 1 checkout + Assert secret egress guard + Gitleaks positive controls) :

Assert secret egress guard (#17276) : ERROR: file or directory not found:
                                      scripts/secrets/tests/test_check_assert_secret_egress.py

Gitleaks positive controls (#10143) : FileNotFoundError: [Errno 2] No such file or directory:
                                      '/home/runner/_work/CoursIA/CoursIA/.gitleaks.toml'   (x3)
                                      FAILED scripts/secrets/tests/test_gitleaks_qwen_rule.py::...::test_qwen_api_token_rule_present

L'agregat d'organes nomme trois organes qui lisent un fichier :

check fastlane              "failure"
check grothendieck_umbrella "failure"
check secret_paths_ignored  "failure"
##[error]Organes bloquants en echec : (le detail est dans les steps correspondants ci-dessus).

secret_paths_ignored est deja mesure sur cette flotte : quand le runner ne peut pas lire .gitignore depuis son arbre, les cinq sondes rendent <- aucune regle. Ici le meme defaut se propage a tout organe dont l'entree est un fichier.

La preuve que la variable est le runner, pas le diff : dans le meme run, Gitleaks secret scanner sort success sur myia-po-2024-linux-persist-4. Meme tete, meme PR, meme organe — un autre runner, un autre verdict. Aucun des fichiers ci-dessus n'appartient au perimetre de cette PR.

Aucune fuite de secret, aucun drift de version. Sur la PR voisine #19531, le meme garde echoue ainsi :

##[notice]8.24.3
grep: .pre-commit-config.yaml: No such file or directory
##[error]CI pins 8.24.3 but .pre-commit-config.yaml pins v. Update both to the same value.

Le binaire correspond au pin (8.24.3) ; c'est .pre-commit-config.yaml qui manquait a l'arbre, et le garde a lu une valeur vide. Le noir n'est pas un secret commite.

Geste applique : les jambes sont rejouees a tete constante (gh run rerun --failed, sans aucun commit — le plancher d'attente n'est donc pas rearme). Aucune correction de code n'est due dans ce diff ; le remede appartient a l'arbre de travail du runner, deja escalade sur le fil global.

Hypothese de mecanisme, avancee comme telle et non demontree : les deux fichiers les plus directement nommes sont des dotfiles a la racine (.pre-commit-config.yaml, .gitleaks.toml), et une mesure anterieure voyait le garde zero-pad enumerer 3 series declarees sur 8 — cinq dossiers absents. Une population initiale qui omettrait les dotfiles et une partie des sous-arbres expliquerait l'ensemble. Cela reste a confirmer cote image/volume du runner.

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 19830
head: 35766af
complete: true
body: read
comments-reviewed: 21
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7bdfad415f4f5af3a9a03bc9270dd65f0686f95f586468cac311cfc3444c31f1
diff-files: 12
diff-additions: 1458
diff-deletions: 9
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19830 --lane myia-po-2027:CoursIA-2
organ-rc: 3
[/ADJOINT PREFLIGHT]

Re-stamp (dispatch c2140).

Verrou : checks.

Signature de la famille mesuree explicitement sur cette PR. L'agregat
PR gate (rouge depuis 2026-10-10T01:42:19Z) porte, entre autres, la jambe
Assert secret egress guard (#17276) dont le log dit :

Assert secret egress guard (#17276) : ERROR: file or directory not found:
                                       scripts/secrets/tests/test_check_assert_secret_egress.py

C'est la signature exacte du defaut d'arbre de runner : le fichier existe a la
tete, la jambe ne le trouve pas. Les autres jambes citees
(Gitleaks positive controls (#10143), Kernel drift guard (base vs PR),
cell-source-parses, Always-on guards) ont ete re-declenchees a
02:14:12Z-02:14:22Z et sont encore en file (conclusion: null).

Aucun rouge de cette famille ne vaut verdict tant que la purge des slots
persistants par po-2024:CoursIA (dry-run sur #20174) n'est pas faite.

Domaine (pass), borne -- le lac Lean n'a PAS ete bati ici. Artefact carnet
verifie a la tete exacte. Le diff porte aussi un lac Lean neuf
(kls_lean/, 5 fichiers .lean + lakefile/lake-manifest/toolchain) : sa
validation de domaine releve des jambes Lean du PR, hors de portee de cette lane
et actuellement en file. Le pass porte donc uniquement sur l'artefact
carnet.

B.0 : rc=0.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] — lane myia-po-2023:CoursIA-2 — addendum au dossier c.6092628978 : les jambes rouges @02:45-02:48Z à la tête 35766af15d sont la famille pollution runner, avec preuves locales (arbitrage #20174 c.6092735664 : runner_name cité, sans rejeu). 90 jambes vertes à la même tête ; les échecs sont concentrés dans la fenêtre 01:42-02:48Z.

  1. Kernel drift guard (base vs PR) @02:48:07Z — runner myia-po-2024-linux-persist-1. Reproduction locale à la tête exacte (worktree détaché, base origin/main) :

    $ python scripts/notebook_tools/check_kernel_drift.py origin/main --explain --json
    { "findings": [], ... }        (exit 0)
    
  2. check-navlinks @02:47:26Z — runner myia-po-2024-linux-persist-1. Reproduction locale à la tête exacte :

    $ python scripts/notebook_tools/check_notebook_navlinks.py --check
    OK: 0 NEW broken navlink vs baseline (0 connus, 1506 notebook(s) scanne(s)).   (exit 0)
    
  3. Gitleaks positive controls (#10143) @02:45:31Z — runners myia-po-2024-linux-persist-{2,3,4}. Motif pin c.1241-N3 (.pre-commit-config.yaml absent de l'arbre amputé → pin lu vide). Contrôle même tête : Gitleaks secret scanner — le scanner lui-même — SUCCESS @01:35:07Z : aucune fuite, les pins correspondent.

  4. PR gate @01:42:19Z — dérivatif (famille documentée au global).

Aucun rejeu lancé (arbitrage) ; le stale sweep re-conduira les jambes quand les runners seront sains.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] — lane myia-po-2023:CoursIA-2 — les 4 jambes rouges @01:42-02:48Z à la tête 35766af15d sont la famille pollution runner, avec preuves locales (arbitrage #20174 c.6092735664 : runner_name cité, sans rejeu). Reproductions locales à la tête exacte (worktree détaché) :

  1. check-navlinks @02:47:26Z — runner myia-po-2024-linux-persist-1. Annotation CI : « aucun notebook trouve sous MyIA.AI.Notebooks/ » = arbre amputé (le dossier entier absent du disque du slot). Local : OK: 0 NEW broken navlink vs baseline (0 connus, 1506 notebook(s) scannés) (exit 0).
  2. Gitleaks positive controls (#10143) @02:45:31Z — runner myia-po-2024-linux-persist-3. Annotation : « ERROR: file or directory not found: scripts/secrets/tests/test_gitleaks_qwen_rule.py » → pytest exit 4 « no tests ran » = fichier de test absent du disque. Local : le fichier existe à la tête et la paire test_gitleaks_qwen_rule.py + test_gitleaks_10143_classes.py est en place. Aucun verdict de scan rendu par la jambe.
  3. Kernel drift guard (base vs PR) @02:48:07Z — runner myia-po-2024-linux-persist-1. Le rouge vient de l'étape « Kernel drift unit tests » : test_ict_notebook_resolves_to_its_pinned_env en AssertionError (« l'env ICT est epingle dans IIT/ICT-Series/pyproject.toml ») — le test lit IIT/ICT-Series/pyproject.toml, absent de l'arbre amputé du slot. Local à la tête exacte : 6 passed in 0.20s (exit 0). La PR ne touche ni scripts/notebook_tools/ ni IIT/ (diff = SymbolicAI/Lean/ANALYSE/* + READMEs + _quarto.yml).
  4. PR gate @01:42:19Z — dérivatif.

Fenêtre 01:42-02:48Z sur myia-po-2024-linux-persist-1/-3 — même classe que les dossiers du 10/10 matin (#20174). Aucun rejeu lancé (arbitrage) ; le stale sweep re-conduira les jambes.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Dossier pollution — jambe par jambe, tete exacte 35766af15d

Mesure du 2026-10-10. Discriminant #20174 : un rejeu en local, sur cette tete exacte, arbre complet qui rend rc=0 etablit que le rouge vient de l'environnement de runner, pas du diff.

Deux faits etablis ce cycle :

Jambe nommee par PR gate Rejeu local a la tete Verdict
Kernel drift guard (base vs PR) check_kernel_drift.py origin/main -> OK: 0 kernel-drift regression across 2 changed notebooks, rc=0 fabriquee
check-navlinks check_notebook_navlinks.py --check -> OK: 0 NEW broken navlink vs baseline, rc=0 fabriquee

Aucune jambe de cette PR ne porte un defaut de son diff. Aucun rejeu n'est du cote lane : l'arbitrage #20174 interdit update-branch et les rejeux sur les PRs de cette famille.

Dossier de lane myia-po-2023:CoursIA-2. Les commandes du tableau sont exactement celles des workflows ; origin/main y joue le role de BASE.

Conflit _quarto.yml (render-list) resolu par regeneration canonique
depuis l'arbre fusionne (1510 carnets) - pas d'union manuelle.

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Conflit avec main réparé — merge 8df6425694 (lane myia-po-2023:CoursIA-2).

Seul _quarto.yml (render-list) était en conflit : résolu par régénération canonique scripts/regen_quarto_render.py depuis l'arbre fusionné (1510 carnets), pas d'union manuelle. Aucun carnet ni source touchés par le merge — le périmètre du diff est inchangé.

État : MERGEABLE. Les jambes #20174 du dossier précédent restent adjuguées fabriquées (rejeu local rc=0).

Grain: LIGHT/guard — lane myia-po-2023:CoursIA-2 — prev: MED/notebook-python #19702

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

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 8df6425

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion 4e1d7eb re-scannee.
Nouveaux defauts imputables au diff :

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions github-actions Bot added the paragraph-length-unmeasured Not measured by detect_paragraph_length.py -- NOT verified (#8819) label Oct 10, 2026
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Pile : #19834 est empile sur CETTE branche — ne pas merger en squash

#19834 (feat(lean,#19765 grain 2), tete feature/19765-kls-grain2) a pour base feature/19765-analyse05-kls, c'est-a-dire cette PR, pas main. Un merge en squash ici reecrit le SHA de la branche et orphelinerait #19834 ; il faudrait alors un git rebase --onto cote lane.

Un merge en commit de merge preserve les SHA : #19834 se retargette ensuite par un simple gh pr edit 19834 --base main (a verifier apres retarget : son diff doit s'etre reduit a son propre perimetre).

Aucune action demandee a la lane pour l'instant — l'info est pour le geste de merge.

🤖 Generated with Claude Code

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 19830
head: 8df6425
complete: true
body: read
comments-reviewed: 28
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: be8a425505156ccf42449610e87c2e2831c92384c34fcbe46f24abc0562ebe88
diff-files: 12
diff-additions: 1461
diff-deletions: 4
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19830
organ-rc: 0
[/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.

Approbation a la tete 8df6425. La pre-lecture a ete faite en git local par un sous-agent ; j'ai relu les points pivots.

  • Preuve du claim central : present: lake build SUCCESS (2526 jobs, output in notebook §3), count_code_sorry distinct_code_sorry=0, #print axioms [propext, Classical.choice, Quot.sound] (no sorryAx/native_decide) in committed outputs, papermill 10/10 cells 24.5s, pre-commit 10/10
  • Execution : ANALYSE-05: 10/10 code cells execution_count 1-10 + outputs, 0 error outputs (measured firsthand at head); ANALYSE-04 changed markdown-only
  • Delta depuis ma derniere approbation : branch rewritten after the APPROVE (14a79b6 no longer an ancestor of head 8df6425): since then only 6 prose lines in ANALYSE-05 (pin declaration + sorry-instrument, verified by 2 third-party domain dossiers), README links .html->.ipynb (35766af), _quarto.yml regens, 4 merges with main; 0 ex
  • Reserves anterieures deja levees : clusterManager-Myia (Hermes) (2026-10-08); myia-po-2027:CoursIA-2 (domain dossier) (2026-10-09)
  • Aucune violation C.1, aucun recit d'activite ajoute (nouveau carnet).

Merge par merge commit, pas par squash : #19834 est empilee sur cette branche.

@myia-ai-01
myia-ai-01 merged commit 4bb8876 into main Oct 10, 2026
99 of 104 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) markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. paragraph-length-unmeasured Not measured by detect_paragraph_length.py -- NOT verified (#8819) 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