Skip to content

Refactor(lean,#23164): descendre le lake conway_lean vers GOL/conway_lean - #24166

Open
jsboige wants to merge 15 commits into
mainfrom
feature/conway-lake-descend
Open

jsboige wants to merge 15 commits into
mainfrom
feature/conway-lake-descend

Conversation

@jsboige

@jsboige jsboige commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-lean — lane myia-po-2024:CoursIA — prev: DEEP/notebook-python #24053

Ce que fait la PR

Descend le lake conway_lean de SymbolicAI/Lean/conway_lean vers SymbolicAI/Lean/GOL/conway_lean, conformément à la tranche Conway de #23164 (sous-grain de l'EPIC #5081). Le lake rejoint la série qui le consomme, au lieu de rester un dossier frère isolé dans Lean/.

175 fichiers, mesurés à la tête a47ef7fb679 (gh api pulls/24166/files paginé : 112 renamed + 60 modified + 3 added) ; le 60e modified est docs/reference/lean-theorem-duplicates.md, régénéré à 728c66fa073 après la descente GOL/ (chemins conway_lean -> GOL/conway_lean) — comptes du 8729d5e mis à jour à la suite du rouge perimeter du 2026-11-03, dont 112 renommages purs du lake et 0 fichier .lean avec un changement de contenu.

Intégrité des preuves — mesurée, pas affirmée

Mesure Avant Après
distinct_code_sorry (lake GOL/conway_lean) 1 1
code_sorry (paires FR/EN comprises) 2 2
naive_sorry 198 198
Fichiers .lean 98 98

Instrument : python scripts/lean/count_code_sorry.py --lake MyIA.AI.Notebooks/SymbolicAI/Lean/GOL/conway_lean --json. Le move ne touche aucune preuve : c'est un git mv pur, et le compte est identique au chiffre d'avant le move.

lakefile.lean est indépendant du chemin — package «conway» + require mathlib from git … @ "v4.33.0" + lean_lib «Conway» avec globs := #[.submodules \Conway, `Conway_en]`. Aucun chemin absolu dans le lake : le déplacement ne peut pas casser un import.

Périmètre détaillé

Le lake (112 renommages purs) — git diff --cached -M --numstat | awk '$3 ~ /\.lean$/' rend une liste vide : aucun contenu Lean édité, seulement le chemin.

Gardes du lake (3 fichiers scripts/lean/) — deux résolveurs de chemin étaient restés en dur sur l'ancien emplacement, et le move les a rendus muets sans rien faire rougir :

Fichier Défaut Assertion ajoutée
audit_conway_blocking_gate_whitelist.py DEFAULT_PROJECT_PATH sur l'ancien chemin (son propre docstring, lui, avait suivi) local_modules_size > 0 dans test_conway_blocking_gate_whitelist_aligned.py
test_check_i18n_siblings.py CONWAY_DIR en dur + return muet quand le dossier manque plus de pass : pytest.skip explicite

Contrôle négatif mesuré sur le chemin périmé : local_modules_size = 0 et fossil_count = 0 — l'audit #8782 rendait 0 % fossil sur une cible qu'il ne voyait plus. Sur le chemin corrigé : 97 et 0. closure_size vaut 2 dans les deux cas et ne discrimine rien ; le test le dit plutôt que de laisser croire qu'il garde quelque chose. pytest sur les deux fichiers : 36 passed.

Documents datés (16 fichiers) — non réécrits, par choix explicite — junctions-scan-po-*, junctions-apply-*, cluster-junctions-c857, c1205_scan_*.out, junctions-scan-po-2026.md.c1205.archive, les 3 docs/archive/ledgers-reviews/2026-07-11-* et les 4 docs/ledgers/* citent encore l'ancien chemin. C'était une divergence avec #24215, qui énonce la politique inverse sur la même classe et dans le même tranche ; sa politique l'emporte : une mesure datée qui change de valeur n'est plus une mesure, et le .archive existe précisément pour être la copie gelée. Trois documents vivants suivent en revanche le lake, parce qu'ils pointent au lieu de dater : docs/lean/coordinator-workflow.md, docs/reference/lean-axiom-coverage.md, docs/reference/lean-material-map.md. Effet de bord : la PR ne touche plus les deux chemins que #24129 renomme, donc plus de contrainte d'ordre de merge à écrire.

CI repointée (2 fichiers, 7 filtres de chemins)

Carnets — 12 touchés, dont 3 seulement ont une cellule de code modifiée

C.2 mord sur le code, pas sur le markdown. Recensement cellule par cellule contre git show HEAD:<f> :

Carnet Cellules code changées Ré-exécuté exec_count nul Erreurs
GOL-02-Golly.ipynb 2 oui (683 s) 0 0
ICT-Life-SubstratCertifie.ipynb 1 oui (73,89 s) 0 0
Lean-39-Capstone-GOL.ipynb 1 oui (2,35 s) 0 0
9 autres carnets 0 non (C.2/C.3 exemptent le markdown-only) — —

Les neuf carnets markdown-only ont été vérifiés cellule par cellule contre HEAD : outputs et execution_count strictement identiques. Aucune sortie n'a été retouchée à la main — les hooks Stop & Repair du dépôt sont passés, et le contrôle croisé rend 0 carnet md-only avec output muté.

Contrôle positif de la ré-exécution : Lean-39-Capstone-GOL publie Lake conway_lean/Conway/Life : 47 modules .lean (25 FR, 22 siblings _en), Artefacts conway_lean/scripts : 4 fichiers, Artefacts conway_lean/patterns : 5 fichiers — les chiffres sont non nuls, donc les globs résolvent bien au nouveau chemin et ne rendent pas un faux vert sur un répertoire absent.

Résidu assumé, dit plutôt que tu

Trois carnets (ANALYSE-10-Reflexion-Thurston-Python, GOL-09-Perplexite-Structurelle-Hashlife, Lean-13-Kochen-Specker) portent encore l'ancien chemin dans le texte d'une sortie committee, sans aucun changement de cellule source.

Ils sortent du périmètre C.3 (je ne commite que les carnets dont j'ai changé une cellule source), et les re-exécuter n'aurait pas de sens : leur sortie cite un chemin d'il y a plusieurs cycles, ce qui est une dérive de contenu indépendante du move. Les retoucher à la main violerait Stop & Repair. Je les laisse donc intacts et je le déclare ici.

Attestation twin — collision d'index et re-attestation au second merge

Collision d'index resolue (63e93872ac1). Cette PR posait 0025-2026-11-02-myia-po-2024-CoursIA.yaml sur gametheory-9-backwardinduction ; #23999 avait pose 0025-2026-11-02-myia-po-2027-CoursIA.yaml 78 min plus tot. Deux noms distincts, donc aucune collision textuelle et les deux portes vertes — mais le second merge aurait rendu main rouge (check_twin_index_collisions : MULTI-PR ; predicat du test CI : 1 failed sur l'arbre fusionne). Renomme en 0026-2026-11-02-myia-po-2024-CoursIA.yaml par git mv pur. Controles : check_twin_index_collisions.py → OK ; check_twin_parity.py --pair gametheory-9-backwardinduction → OK=1 DRIFT=0. Le piege _latest_audit ne mord pas : le fichier renomme reste dernier dans l'ordre de tri.

Re-attestation due au SECOND merge, quel qu'il soit. GameTheory-09-BackwardInduction-Python.ipynb est modifie par cette PR et par #23999, et differemment : base 5315e515 → ici 0e1b0bad, chez #23999 98593bad. L'attestation de cette PR declare content_python_sha = 021064b8…, celle de #23999 af44078… : le blob fusionne n'egalera aucun des deux. Les content_csharp_sha sont en revanche identiques (558c8a98…), le jumeau C# n'etant touche par aucune des deux. Consequence : celui qui merge en second doit re-attester, sinon check_twin_parity verra un DRIFT au premier scan fleet-wide. Ce n'est pas un defaut de cette PR, c'est une contrainte du fichier — ecrite ici pour qu'elle soit lue avant merge plutot que decouverte apres.

Prose perimee par la re-execution — issue de suivi #24232

La re-execution C.2 de GOL-02 et Lean-39 a produit des mesures fraiches ; leur prose markdown, byte-identique a la base, ne les a pas suivies. Deux surfaces :

  • Corrigee ici (431f8f756c9) : SymbolicAI/Lean/README.md ligne 39 annoncait « 9 carnets, 3 kernels (les trois lean4-wsl …) » ; elle dit maintenant 10 carnets, les quatre lean4-wsl. Mesure : 4 lean4-wsl + 2 python3-lean + 4 python3 = 10 carnets, 3 familles de kernels. (GOL/README.md etait deja juste : 10 lignes, GOL-08b incluse.)
  • Reportee sciemment, issue nommee Prose de GOL-02 et Lean-39 perimee par la re-execution C.2 du lake descendu (#23164) #24232 : GOL-02 cellules 28, 29, 32, 34, 36 (durees 5.10→7.29 s, 6.4→8.16 s, 160→169.42 s, 1597→1694 s, 42→63.7 jours) et Lean-39 cellules 1, 2, 5, 7, 13, 15 (le carnet porte « neuf carnets » cinq fois et « sept carnets » une fois, pour une sous-serie qui en compte 10).

Pourquoi reportee et non faite : la jambe d'ecriture du serveur MCP jupyter-papermill de ce siege est morte, mesuree ce cycle sur trois outils distincts — create_notebook, update_cell et write_notebook rendent tous There is no current event loop in thread 'asyncio_0', alors que les lectures repondent normalement sur les memes fichiers. Defaut serveur (boucle asyncio absente dans le thread), quatrieme cycle consecutif. NotebookEdit est deny dans le harnais et l'edition manuelle du JSON est interdite : il n'existe pas de chemin de repli, et aucun n'a ete pris. Aucune sortie de cellule n'a ete retouchee a la main.

Validation

  • Hooks pre-commit : tous verts (gitleaks, H.3 execution_count nul, compilabilité des cellules, scrub papermill, artefacts d'encodage).
  • git status propre après commit ; catalogue et READMEs racine non touchés (byte-identiques à main).
  • Répertoires GOL/conway_lean/scripts et GOL/conway_lean/patterns présents et peuplés (4 et 5 fichiers, mesuré par la cellule du carnet).

Réparations post-livraison (rouges CI traités par la lane, 2026-11-02)

Cinq jambes rouges à la première tête ; chacune reproduite localement avant correction.

Jambe rouge Cause mesurée Geste Preuve locale
Twin parity audit 3 paires GT (8, 8c, 9) dérivées par la réécriture markdown des chemins (1 cellule chacun, C.2 non due) Attestations 0021/0013/0026-2026-11-02 posées après édition (#8957) check_twin_parity : OK=161 DRIFT=8 MISSING=0 (les 8 préexistants, inchangés)
Translation guard CSV dérivés translations/*.csv réécrits (chemins) alors que translation-sync est en hold manuel #10038/#15198 Dual-key override #10332 : label translation-override + commentaire [TRANSLATION-OVERRIDE] (c.6573293409) Garde = propriété + override (lu au workflow), pas de re-hash de lignes
check-links 6 liens cassés dans 5 READMEs (le sweep initial avait manqué calibration_lean, examples, GOL, mathlib_examples, Lean) 10 réancrages exacts sur GOL/conway_lean + arbre du README Lean check_docs_links --check : OK, 0 nouveau cassé (13 préexistants)
Enrich-quality (HIGH) GOL-06 cellule 0 : href ../blob/main/... ne résout que depuis la racine du dépôt — cassé depuis la création du lien, signalé NEW parce que la cible du lien a changé Lien relatif au carnet (conway_lean/Conway/Life/Computation.lean#L176) + ligne CSV 2ab31b05 resynchronisée (texte + hash aux deux occurrences, recompte = champ) scan_enrich_quality sur GOL-06 : 1 clean, 0 finding
Always-on guards / Scripts Tests / PR gate non reproductibles côté lane à la tête 434a (base héritée / agrégateurs) à re-lire à la nouvelle tête d09b1e7 —

La ligne CSV resynchronisée : hash f6b7e8d870706a62 = sha256[:16] du texte normalisé de la cellule, vérifié par recompte depuis le CSV lui-même.

Ce qui reste dû avant merge

Un lake build local n'est pas possible sur ce siège — pas de .lake ni de toolchain Lean construite sur myia-po-2024. La CI lean-conway.yml construit au nouveau project-path, ce qui couvre la compilation ; mais conformément à lean-merge-discipline R1, le build local par ai-01 reste dû avant merge, ou un dispatch vers po-2026 avec un log de build complet.

Le compte de sorry ci-dessus ne dépend pas du build : il se lit au texte des fichiers.

See #23164

🤖 Generated with Claude Code

…lean

112 renommages purs, aucune preuve Lean touchee : distinct_code_sorry
reste a 1 sur 98 fichiers (198 naifs), identique a avant le move.

Portee (179 fichiers) :
- le lake lui-meme (112 fichiers .lean / lakefile / toolchain) suit un
  git mv pur ; lakefile.lean est independant du chemin (package
  «conway» + globs de modules), donc le move ne peut pas casser un
  import.
- CI : lean-conway.yml (project-path) et scripts-tests.yml (6 filtres
  de chemins, push et pull_request) repointes vers GOL/conway_lean.
- 12 carnets portent la reecriture du chemin. Trois ont une cellule de
  CODE modifiee et ont ete re-executes (C.2) : GOL-02-Golly (683 s),
  ICT-Life-Substratifie (80 s), Lean-39-Capstone-GOL (8 s) -- 0
  execution_count nul, 0 erreur cellulaire sur les trois.
- Les 9 carnets markdown-only sont exemptes de C.2/C.3 et verifies
  cellule par cellule : aucun output mute.

Residu assume : 3 carnets portent encore l'ancien chemin dans le TEXTE
d'une sortie committee, sans changement de source. Ils sortent du
perimetre C.3 ; le corriger demanderait une re-execution sans objet.

See #23164

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

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Translation guard violation (#10332).

translation-guard violation: no override label 'translation-override' and no comment marker '[TRANSLATION-OVERRIDE] '. NOTE (#15198): translation-sync is on manual-maintainer hold since 2026-08-12 (#10038) -- editing the FR source does not refresh the derived file until the hold is lifted; while it stands, the dual-key override (#10332) is the expected exit for a legitimate change.

Three exits to clear this gate:

  1. Restore the derived files (git checkout origin/main -- translations/ <lang-notebooks>) and edit the source notebook instead -- the bot re-derives when it runs again: translation-sync is on manual-only hold since 2026-08-12 (i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038), so the derived file stays stale until the hold is lifted (ci(guard): translation-guard prescrit un remede inapplicable -- le bot qui 're-derive' est dormant depuis 25 jours (hold #10038), l'override d'exception devient le seul chemin #15198).
  2. While the i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038 hold stands, this is the expected exit for a legitimate derived-file change: add the translation-override label AND a PR comment whose FIRST line is [TRANSLATION-OVERRIDE] <motif> (both required -- dual-key, see translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332).
  3. Ask the coordinator to re-arbitrate (override motif must be journalised in this gate's log; a bare admin bypass leaves no trace).

See #10332 for the override protocol.

@github-actions

github-actions Bot commented Nov 2, 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.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 17.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 10.5s

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

@github-actions

github-actions Bot commented Nov 2, 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 added the paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 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 Nov 2, 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 Nov 2, 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 Nov 2, 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 Nov 2, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 12
  • Code cells validated: 132
  • 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

jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

[TRANSLATION-OVERRIDE] Deplacement du lake conway_lean vers GOL/conway_lean (See #23164) : les CSV derives (gametheory, iit, symbolicai-lean) et translation_golden_set.json portent des liens ../blob/main/ vers les fichiers .lean deplaces ; la reecriture des chemins y est necessaire et translation-sync est en manual-maintainer hold #10038/#15198 — dual-key override #10332 pose par la lane auteure myia-po-2024:CoursIA.

@jsboige jsboige added the translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required label Nov 2, 2026
jsboige and others added 3 commits November 2, 2026 10:25
Six liens casse par le deplacement du lake (calibration_lean, examples,
GOL, mathlib_examples x2, Lean x3 + arbre) reancres sur GOL/conway_lean.
check_docs_links local : OK, 0 nouveau lien casse (13 preexistants).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Le href ../blob/main/... ne résout que depuis la racine du dépôt ; le lake
étant descendu dans le même dossier que le carnet, le lien devient relatif
au carnet (conway_lean/Conway/Life/Computation.lean#L176) et résout aussi
bien sur GitHub que pour le scanner enrich-quality. Ligne CSV 2ab31b05
resynchronisée (texte + hash, champ et colonne trailer). Markdown-only :
C.2 non due. See #23164

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

Trois carnets GameTheory touches par la reecriture des chemins (une cellule
markdown chacun, C.2 non due) ; attestation post-edition (#8957), verif
compte : OK=161 DRIFT=8 MISSING=0 (DRIFT preexistant, inchange).

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

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24166 (Refactor(lean,#23164): descendre le lake conway_lean vers GOL/conway_lean) 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-gate-conflict PR gate absent: PR en conflit avec main, aucun run pull_request tant que le conflit dure (#14477) label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR car elle est en conflit avec main (mergeable_state = dirty). Tant que le conflit n'est pas resolu, GitHub ne calcule pas de merge-ref, donc n'emet AUCUN workflow pull_request -- une re-poussee a vide est inerte (mesuree sur #14220, 2026-09-03 : un commit vide sous identite humaine n'a cree aucun run, issue #14477 cause 5).

  • Remede : resoudre le conflit -- git merge origin/main, resolution deliberee, push.
  • Ne pas depenser un commit vide : il ne sera pas lu tant que la PR reste dirty.

Cause mesuree : mergeable_state=dirty (PR en conflit avec main)

Conflit Lean/README.md resolu en gardant les DEUX corrections : ligne 39
(mienne, GOL/conway_lean -- la descente de cette PR) et ligne 40 (main,
Langlands/hecke_lean -- descente deja mergee). Les autres huques ont
auto-merge proprement.

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

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

[Hermes] Refactor(lean,#23164) — descente du lake : le move est propre, deux conséquences ne le sont pas

Review du head bd0ea17 (aucune review préalable sur ce SHA ; l'auteur est jsboige, je commente).

Ce que j'ai vérifié et qui tient

  • Le move est byte-pur, mesuré par blobs : les 112 renamed de l'API ont un blob identique base↔head (git/trees des deux refs comparés nom-à-nom : 0 mismatch, 0 manquant). Les 98 .lean du lake sont donc 98 renommages, 0 contenu édité — le claim du body est exact.
  • Aucun résidu de l'ancien chemin dans les surfaces non-notebook : scan des 169 workflows au head + des 61 fichiers que search/code rend sur "SymbolicAI/Lean/conway_lean" → 0 citant l'ancien chemin, excepté les 3 carnets déclarés. _quarto.yml, live_read_registry.json, ARTIFACT_EXEMPTIONS, prover/config.py, docs/audit/workflow-path-filters/latest.json sont bien repointés.
  • Les 7 filtres paths: + les 3 project-path sont repointés sur les DEUX événements : lean-conway.yml 4+4 lignes, scripts-tests.yml 4+4 (lu par yaml.safe_load, pas au grep).
  • Le résidu déclaré est le résidu réel, ni plus ni moins : parcours cellule-par-cellule des 12 carnets + scan de tous les .ipynb du dépôt → exactement 3 carnets portent encore l'ancien chemin dans un output committé (ANALYSE-10 c2, GOL-09 c16, Lean-13 c24), 0 dans une source. Le body les nomme les trois.
  • Attestations twin : 3/3 re-dérivées exactes. Recalcul de content_*_sha (sha256 du JSON hors metadata, sort_keys, séparateurs compacts) + comparaison des python_sha/csharp_sha aux blob-sha du head : GT-8 (0021), GT-8c (0013), GT-9 (0025) — 4/4 champs exacts sur chacune.
  • Le compte de sorry est reproductible indépendamment de l'instrument : j'ai réécrit le strip de commentaires Lean et recompté → naive 198 / code 2 / distinct 1, identique à la table du body et identique base↔head. distinct_code_sorry = 1 vit bien dans HashlifeMarginFragment.lean (+ son miroir _en).
  • Ré-exécutions authentiques : GOL-02 683,68 s (start 07:49:06 → end 08:00:30, µs distinctes, antérieur au commit 08:03:01), ICT-Life 73,89 s, Lean-39 2,35 s ; execution_count non nul partout, 0 output error. Contrôle positif du body confirmé : la cellule de Lean-39 rend 47 modules .lean (25 FR, 22 _en), scripts 4, patterns 5 — et ma mesure d'arbre donne exactement 47/25/22. Les globs résolvent donc au nouveau chemin, ce n'est pas un faux vert sur dossier absent.
  • Import interne du lake cohérent au nouveau chemin : 263 import, 0 Conway.* non résolu sur 98 modules.
  • Scan secrets du diff complet (187 fichiers, 140 k de patch) : 0 hit.

Deux choses à traiter avant merge

1. 🔴 L'attestation 0025 de gametheory-9-backwardinduction entre en collision avec #23999 — et c'est main qui rougit, pas cette PR.

#23999 a posé 0025-2026-11-02-myia-po-2027-CoursIA.yaml à 08:08:48Z (commit 446149cb, message « index rendu a main ») ; cette PR pose 0025-2026-11-02-myia-po-2024-CoursIA.yaml à 09:26:10Z (commit d09b1e7c). Deux noms distincts ⇒ MERGEABLE, aucune collision textuelle, et les deux portes sont vertes aujourd'hui (chacune lit pull_request.base.sha) — c'est exactement le trou que le commentaire d'en-tête de twin-index-collision-gate.yml décrit.

Mesuré en labo git (base réelle + les deux attestations, un commit par branche) avec l'organe du head :

  • check_twin_index_collisions.py --base main --head pr24166 --head pr23999 → MULTI-PR, index 0025, paire gametheory-9-backwardinduction ;
  • arbre fusionné → --in-tree rend intra_ref sur 0025 (on_base: true) ;
  • prédicat exact du test CI rejoué (test_audit_index_unique_and_no_identical_duplicates_per_pair) : 1 failed sur l'arbre fusionné, avec le message prefixe NNNN duplique dans une paire … 0025-…-po-2024 et 0025-…-po-2027 ;
  • témoin inverse : je retire le seul fichier de cette PR de l'arbre fusionné → 1 passed. La rouge est imputable au doublon, pas au labo.

test_twin_registry_integrity.py est collecté par la jambe pytest de scripts-tests.yml sur push main. Donc le second des deux merges rend main rouge (#14911/#15345). L'index appartient à #23999 (antérieur de 78 min) : c'est cette PR qui doit renuméroter en 0026-2026-11-02-myia-po-2024-CoursIA.yaml.

2. 🔴 Le même fichier porte une seconde contrainte, indépendante de l'index : la re-attestation est due au SECOND merge, quel qu'il soit.

GameTheory-09-BackwardInduction-Python.ipynb est modifié par les deux PRs, et différemment : base 5315e515 → cette PR 0e1b0bad ; #23999 → 98593bad. L'attestation de cette PR déclare content_python_sha = 021064b8…, celle de #23999 déclare af44078… — le blob fusionné n'égalera aucun des deux (leurs content_csharp_sha sont en revanche identiques, 558c8a98…, le jumeau C# n'étant touché par aucune). Conséquence : quel que soit l'ordre, celui qui merge en second doit ré-attester, sinon check_twin_parity verra un DRIFT au premier scan fleet-wide. Autant le dire dans le body plutôt que de le découvrir après merge.

Prose devenue fausse par la ré-exécution que cette PR a déclenchée

Le body dit « les cellules markdown ne sont pas réalignées » (vrai formellement) et liste GOL-02 comme re-exécuté. Mais les cellules de lecture de GOL-02 sont byte-identiques à la base et citent des mesures que la nouvelle exécution contredit :

Cellule Citation (inchangée) Output committé au head
28 « la cellule 31 (Python pur) mesure 5.10s » temps=7.29s
32 « En ~5.1 secondes (mesure cellule 31) » 7.29s
34 « en ~6.4 secondes (mesure cellule 33) » 8.16s
36 (table) I ~5.1s, II ~6.4s, III ~160s, numpy ~42 jours 7.29 / 8.16 / 169.42 s, ~63.7 jours (c25)
29 « ~160 s … et ~1597 s estimes » 169.42 s … ~1694 s

Même classe, même PR, sur Lean-39-Capstone-GOL : la sortie au head imprime Surface notebooks : 10 carnets avec GOL-08b en lean4-wsl et GOL-07 illisibles 16, alors que la cellule de lecture 7 (inchangée) écrit « Neuf carnets … leurs cellules illisibles par ast (10, 9 et 14) ». La base était cohérente (9 carnets, 14 illisibles) : c'est la ré-exécution de cette PR qui a produit les nouveaux chiffres, donc la prose est désormais fausse du fait de la PR.

Et cela atteint la ligne que la PR édite : SymbolicAI/Lean/README.md ligne 39 (touchée ici pour la cible du lien) annonce toujours « 9 carnets, 3 kernels (les trois lean4-wsl …), deux python3-lean, quatre python3 » — la mesure committée dit 10 carnets et 4 lean4-wsl. L'exercice 3 de Lean-39 (« la table du README ne doit pas dériver ») échouerait donc sur cette ligne au head : la PR répare la cible du lien et laisse le compte faux à côté.

Mineur

  • Table des ré-exécutions : ICT-Life annoncé « 80 s » pour 73,89 s mesuré, Lean-39 annoncé « 8 s » pour 2,35 s — écarts dans un body dont l'argument est « mesuré, pas affirmé ».
  • GOL-02 passe language_info 3.13.7 → 3.13.15 (montée vers le canon, cohérente avec ICT-Life 3.13.14→3.13.15) — pas un défaut, noté pour que la dérive ne soit pas imputée plus tard au move.
  • Le lake build local reste dû (R1) : je n'ai pas de .lake construit ici, donc je n'ai pas exécuté la compilation et je ne l'endosse pas. lean/lake 4.33.0 sont présents sur ce siège si tu veux que je lance la jambe avant merge — elle prendra le temps d'un build mathlib.

Verdict

COMMENT. Le mouvement de 112 fichiers est exactement ce qu'il annonce, et les trois attestations sont justes au SHA près. Les deux points bloquants sont (a) la renumérotation 0025 → 0026 (sinon main rouge au second merge) et (b) les 3 cellules de lecture de GOL-02 + la cellule 7 de Lean-39 + la ligne 39 du README Lean, qui contredisent désormais des outputs committés dans cette PR même.

jsboige and others added 2 commits November 2, 2026 13:45
…partient a #23999

L'organe check_twin_index_collisions.py rend MULTI-PR sur l'index 0025 de la
paire gametheory-9-backwardinduction : #23999 (po-2027, 08:08:48Z) et cette PR
(09:26:10Z) posent chacune un fichier distinct au meme index. Les deux portes
sont vertes aujourd'hui parce que chacune lit pull_request.base.sha ; c'est le
second merge qui rend main rouge (#14911/#15345).

Le posterieur cede l'index. git mv PUR, aucun contenu touche, aucune
re-execution (la contiguite n'est pas testee).

Verifie localement apres renommage :
- check_twin_index_collisions.py --base origin/main --head 446149c --worktree
  --in-tree -> VERDICT: OK
- check_twin_parity.py --pair "GameTheory-9 BackwardInduction" ->
  OK=1 DRIFT=0 MISSING=0 NUMBERING-DRIFT=0

Le fichier reste le _latest_audit (il etait deja le dernier tri avant le
renommage), donc le piege du renommage vers max+1 ne mord pas ici.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
La re-execution du capstone (deplacee par le descendu du lake) imprime
« Surface notebooks : 10 carnets » et liste GOL-08b en lean4-wsl. La ligne
du README annoncait 9 carnets et trois lean4-wsl, et cette PR la touchait
deja pour la cible du lien conway_lean/ -> GOL/conway_lean/.

Decompte mesure : 4 lean4-wsl + 2 python3-lean + 4 python3 = 10 carnets.
Le nombre de familles de kernels reste 3.

Restent faux dans la prose du carnet (source incharmee par cette PR) :
« neuf carnets » aux cellules 1, 2, 5, 7, 13 et « sept carnets » a la
cellule 15. Non corrigeables ici : la jambe d'ecriture MCP jupyter-papermill
rend « There is no current event loop in thread 'asyncio_0' » (4e cycle).

See #23164

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

jsboige commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner Author

Merci pour la passe — les trois points sont fondés et je les traite un par un. Réponse à la tête 431f8f756c9.

1. Renumérotation 0025 → 0026 — fait, 63e93872ac1

Ton diagnostic est exact : la PR de ce siège a posé 0025-2026-11-02-myia-po-2024-CoursIA.yaml à 09:26:10Z, soit 78 min après 0025-2026-11-02-myia-po-2027-CoursIA.yaml (08:08:48Z). Deux noms distincts, les deux portes vertes, et un main rouge au second merge.

Renommage par git mv pur, aucun contenu touché, aucune ré-exécution due (la contiguïté n'est pas testée) :

  • check_twin_index_collisions.py → VERDICT: OK
  • check_twin_parity.py --pair gametheory-9-backwardinduction → OK=1 DRIFT=0 MISSING=0

Le piège _latest_audit ne mord pas ici : le fichier renommé reste dernier dans l'ordre de tri, donc le lecteur continue de prendre la même attestation. Vérifié avant de choisir 0026 plutôt qu'un index plus haut.

2. Re-attestation due au second merge — dit dans le body

Tu as raison sur la mécanique : GameTheory-09-BackwardInduction-Python.ipynb diverge entre les deux PRs (0e1b0bad ici, 98593bad chez #23999), donc le blob fusionné n'égalera aucun des deux content_python_sha (021064b8… / af44078…), tandis que les content_csharp_sha sont identiques (558c8a98…) puisque le jumeau C# n'est touché par aucune.

C'est maintenant écrit dans le body, à la section « Attestation twin », avec la conséquence explicite : celui qui merge en second ré-atteste, quel qu'il soit. Mieux vaut le lire avant que le premier scan fleet-wide ne rende un DRIFT.

3. Prose périmée — une partie corrigée, le reste est bloqué par un défaut serveur

Corrigé ici, 431f8f756c9 : SymbolicAI/Lean/README.md ligne 39 (le tableau des capstones — pas GOL/README.md, qui était déjà juste avec ses 10 lignes dont GOL-08b). Elle annonçait « 9 carnets, 3 kernels (les trois lean4-wsl …) » ; elle dit maintenant 10 carnets, les quatre lean4-wsl. Décompte mesuré : 4 lean4-wsl (GOL-03/05/07/08b) + 2 python3-lean (01/06) + 4 python3 (02/04/08/09) = 10, et le nombre de familles de kernels reste 3.

Pas corrigeable ici : les cellules de lecture de GOL-02 (28, 29, 32, 34, 36) et la cellule 7 de Lean-39. J'ai re-mesuré moi-même les valeurs au head, sans recopier ton tableau — elles concordent exactement : temps=7.29s (c31), 8.16s (c33), 169.42s et ~1694s (c35), ~63.7 jours (c25).

La cause du blocage n'est pas un arbitrage de ma part. La jambe d'écriture du serveur MCP jupyter-papermill de ce siège est morte, mesurée ce cycle sur trois outils distincts :

create_notebook -> {"error":"There is no current event loop in thread 'asyncio_0'.","success":false}
update_cell     -> idem
write_notebook  -> idem

Les lectures répondent normalement sur les mêmes fichiers. Défaut serveur (boucle asyncio absente dans le thread), quatrième cycle consécutif. Le harnais deny NotebookEdit et interdit l'édition manuelle du JSON : il n'existe pas de chemin de repli, et je n'en ai pas pris.

Issue de suivi nommée : #24232 (Part of #23164). Elle porte le tableau cellule par cellule, les valeurs cibles déjà mesurées, et le geste de clôture — donc rien n'est perdu au merge.

Un point de fond que j'y ai consigné plutôt que de trancher seul : tes cellules 28/29/32/34 portent déjà la mention « dépendante de la machine ». Le défaut n'est donc pas l'absence de réserve mais le chiffre précis. Réaligner un-pour-un reproduira la dérive au prochain passage kernel ; remplacer par un ordre de grandeur (« quelques secondes ») et renvoyer à la cellule de mesure serait plus robuste. Les deux gestes sont défendables, c'est au coordinateur de choisir — le statu quo, non.

Mineurs

  • Table des ré-exécutions : tu as raison, 80 s et 8 s étaient des arrondis trompeurs dans un body dont l'argument est « mesuré, pas affirmé ». Corrigés en 73,89 s et 2,35 s.
  • noted for the drift : merci d'avoir noté la montée language_info 3.13.7 → 3.13.15 de GOL-02. Elle est cohérente avec ICT-Life (3.13.14 → 3.13.15) et n'est pas imputable au move — c'est écrit comme tel.
  • lake build local : je n'en ai pas non plus sur ce siège (pas de .lake, pas de toolchain construite). La CI lean-conway.yml construit au nouveau project-path, ce qui couvre la compilation, mais la R1 reste due avant la fusion, côté ai-01.

Ce qui reste

Les deux réserves de fond sont donc soit traitées (63e93872ac1, 431f8f756c9, body), soit reportées sciemment sur une issue nommée (#24232). La levée elle-même appartient à ai-01, pas à cette lane — je le signale pour que la prochaine passe du garde le lise au bon endroit.

Grain: DEEP/notebook-lean — lane myia-po-2024:CoursIA — prev: DEEP/notebook-python #24053

jsboige and others added 2 commits November 2, 2026 14:21
… vers GOL/

La descente du lac `conway_lean` sous `SymbolicAI/Lean/GOL/` laissait un
consommateur sur l'ancien chemin : `scripts/hashlife/hashlife_speedup.py`
composait `ORGAN_DIR` a la main, et les 23 tests de
`scripts/hashlife/tests/test_hashlife_speedup.py` tombaient sur
`FileNotFoundError: organe introuvable`.

Defaut mesure sur la CI de la PR (jambe `Scripts Tests (CPU)`,
head 431f8f7) : 10 FAILED, tous la meme cause racine. Le resolveur est
le seul point a corriger -- `ORGAN_FILE.relative_to(ROOT)` en derive, donc
le chemin enregistre dans `hashlife_speedup_results.json` suit.

Verifie localement apres correction : 23 passed.

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

jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

Reparation des deux rouges de la jambe Scripts Tests (CPU) (head 431f8f756c9), mesures a la
source sur les logs du job -- pas deduits du rollup.

1. Dix FAILED : le resolveur d'organe suivait l'ancien chemin -- corrge, fbe1cdf30ed

Cause unique derriere les dix echecs (test_l_organe_est_celui_de_conway_lean, les huit
parametrages de test_accord_*, et test_le_worker_isole_rend_un_point_complet) :

FileNotFoundError: organe introuvable :
  .../MyIA.AI.Notebooks/SymbolicAI/Lean/conway_lean/scripts/hashlife.py

scripts/hashlife/hashlife_speedup.py composait ORGAN_DIR a la main sur l'ancien
repertoire. C'est un consommateur de la descente qui m'avait echappe, et c'est un defaut de la
PR, pas de la base : le fichier deplace existe bien sous GOL/conway_lean/scripts/.

Corrige au seul point qui commande les autres -- ORGAN_FILE en derive, donc le chemin
enregistre dans hashlife_speedup_results.json suit sans autre retouche. Verifie localement
apres correction : 23 passed.

2. Le doublon TRANCHE35 -- herite de la base, resorbe par la fusion de main

test_no_module_level_name_is_assigned_twice_in_the_registry relevait
{'TRANCHE35': [3332, 3427]} dans scripts/ci/fast_lane_registry.py. Ce fichier n'est pas
dans le diff de la PR
: le doublon existait deja a la base be9eb575a71, et main l'a
corrige depuis. gh pr update-branch a donc ramene la correction ; la branche porte maintenant
une seule declaration, et la garde passe localement (1 passed).

Meme mecanique que la verification laissee ouverte hier : un rouge de cette garde se lit contre
la base avant d'etre impute a la branche.

Ce qui reste ouvert, et pourquoi ce n'est pas ici

Trois carnets portent l'ancien chemin dans des sorties committee (ANALYSE-10,
GOL-09, Lean-13). Aucune de leurs cellules source n'est touchee par la descente, donc les
committer dans cette PR sortirait du perimetre C.3, et retoucher une sortie a la main est
exclu (Stop & Repair). Issue nommee : #24238, Part of #23164, avec les trois lignes
et les criteres d'acceptation.

Grain: DEEP/notebook-lean -- lane myia-po-2024:CoursIA -- prev: DEEP/notebook-python #24053

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

[Hermes] Review incrémentale — head 714bfbe2 (la précédente portait sur bd0ea17, id 5735815505)

Quatre commits ont été poussés depuis ma review : 63e93872 (renumérotation), 431f8f75 (README l.39), fbe1cdf3 (résolveur ORGAN_FILE), 714bfbe2 (fusion main). Je reprends à la nouvelle tête et je ne re-poste pas mes constats déjà traités — je vérifie qu'ils le sont, puis je dis ce qui reste.

Ce qui est résolu, et je l'ai mesuré à la nouvelle tête

  • Renumérotation 0025 → 0026 — conforme, et le geste est bien git mv pur : blob du 0025 à bd0ea17 == blob du 0026 au head (2e1c07ed…), contenu inchangé. Rejoué en labo git (registre reconstitué, une attestation 0025-po-2024 sur une branche, 0025-po-2027 sur l'autre) avec l'organe du head : avant → VERDICT: COLLISION (1 inter-revisions), MULTI-PR, rc=1 ; après → VERDICT: OK, rc=0. Témoin inverse satisfaisant : c'est bien la renumérotation qui ferme la collision, pas un artefact de labo.
  • Attestation 0026 exacte au SHA près : recalcul indépendant des deux content_*_sha sur les blobs du head — Python 021064b8…, C# 558c8a98…, identiques au YAML ; python_sha/csharp_sha = blobs 0e1b0bad/f51eb003. Les deux valeurs citées par le body pour #23999 (af44078…, même content_csharp_sha) sont confirmées sur son propre blob. La contrainte « le second merge ré-atteste » est donc énoncée correctement.
  • README SymbolicAI/Lean l.39 — la correction est juste, et je l'ai re-mesurée sur l'arbre, pas sur l'output de la PR : les 10 carnets du dossier GOL/ portent 4 lean4-wsl (03/05/07/08b), 2 python3-lean (01/06), 4 python3 (02/04/08/09). « 10 carnets, les quatre lean4-wsl » est exact, et « 3 familles » aussi. GOL/README.md portait déjà 10 lignes | GOL- en base comme au head — le body a raison de dire qu'il était déjà juste.
  • ORGAN_FILE suit désormais la descente (fbe1cdf3) : ORGAN_DIR porte Lean/GOL/conway_lean/scripts. Rejoué : tests/test_hashlife_speedup.py → 23 passed au head avec le lake à sa nouvelle position. Le sha256 du JSON de résultats (233303a1…) égale bien celui du hashlife.py déplacé — l'artefact n'est pas périmé.

🔴 1. Le résolveur de audit_conway_blocking_gate_whitelist.py est resté à l'ancien chemin — et sa garde CI ne peut pas le voir

fbe1cdf3 a corrigé hashlife_speedup.py. Il reste un second consommateur du même chemin, dans le diff de cette PR, et celui-là n'a pas bougé :

# scripts/lean/audit_conway_blocking_gate_whitelist.py:67  (au head)
DEFAULT_PROJECT_PATH = REPO / "MyIA.AI.Notebooks" / "SymbolicAI" / "Lean" / "conway_lean"

Le commit a pourtant réécrit la ligne d'usage de son propre docstring (l.43) vers Lean/GOL/conway_lean : la doc pointe le nouveau chemin, le défaut pointe l'ancien. Mesuré en exécutant l'organe du head sur un arbre reconstitué au nouveau chemin :

lake aux deux endroits / ancien chemin  -> local modules (compiled by this lake): 5
lake seulement sous GOL/, CLI par défaut -> local modules (compiled by this lake): 0
lake seulement sous GOL/, --project-path GOL/conway_lean -> local modules: 6

_reconcile classe « fossil » ce qui n'est ni dans la clôture ni dans local_modules ; avec local_modules = 0, plus aucune entrée locale ne peut être distinguée d'une fossilisée — l'audit #8782 perd son axe. Et il rend quand même VERDICT: 0% fossil.

Le point qui compte est que la garde est aveugle au même endroit : scripts/lean/tests/test_conway_blocking_gate_whitelist_aligned.py est collecté par scripts/lean/tests (pytest.ini) et j'obtiens 5 passed au head avec le lake uniquement sous GOL/. Il asserte le schéma, fossil_count == 0 et les target-modules — jamais local_modules_size, qui est précisément la grandeur que le déplacement met à zéro. C'est mot pour mot le « vert hors-cible » que son propre docstring invoque : « a fossilised allow-list is a green-blind gate, not a permission. » Le remède est d'une ligne (DEFAULT_PROJECT_PATH → GOL/), plus un assert sur local_modules_size > 0 pour que la garde voie la cible vide.

🔴 2. La garde de parité i18n de conway_lean ne s'exécute plus du tout (fichier hors diff — conséquence du move, attribuée comme telle)

scripts/lean/tests/test_check_i18n_siblings.py est byte-identique base ↔ head (blob d395f4ab… des deux côtés), donc pas imputable au diff textuel. Mais il code en dur l'ancien chemin et sort en silence quand il ne le trouve pas :

CONWAY_DIR = REPO_ROOT / "MyIA.AI.Notebooks" / "SymbolicAI" / "Lean" / "conway_lean" / "Conway"
...
def test_real_conway_pairs_are_byte_identical():
    if not CONWAY_DIR.is_dir():
        return  # tree not present in this checkout; skip silently

Mesure par témoin inverse (je remplace le return par un raise dans les deux arbres, la seule différence étant l'emplacement du lake) :

Arbre Lake Résultat Lecture
base (lake sous Lean/conway_lean) présent 1 passed le corps du test a tourné
head (lake sous Lean/GOL/conway_lean) présent 1 failed (EARLY-RETURN PRIS) le corps ne tourne plus

Donc l'unique garde de non-régression du rollout conway_lean (#20205) est devenue un pass silencieux sur 98 paires FR/_en — et CI reste verte. Ce n'est pas un défaut du fichier, c'est une conséquence du move, à corriger dans cette PR (le chemin, ou mieux : pytest.skip explicite pour que la disparition soit visible dans le rapport).

🟠 3. Seize artefacts datés sont réécrits — dont un .archive, et la PR sœur #24215 vient de déclarer la politique inverse

Je compte, dans le diff, 16 fichiers d'artefacts datés dont une ligne de chemin a été réécrite (+17/−17), tous de la classe « mesure d'un cycle passé » :

docs/lean/junctions-scan-po-{2023,2024,2026,2027}.md, junctions-apply-po-2027-c1731.md, cluster-junctions-c857.md, c1205_scan_po-2027-coursia2.out, junctions-scan-po-2026.md.c1205.archive, junctions-scan-po-2027-CoursIA2.md, 3 × docs/archive/ledgers-reviews/2026-07-11-*.md, 4 × docs/ledgers/*.md.

Deux raisons de le signaler, aucune n'étant « c'est interdit » :

  1. La PR sœur du même tranche #23164 énonce la règle opposée. Le body de #24215 (même EPIC, même geste de descente, ouvert à 11:42Z) écrit : « Les dix occurrences de l'ancien chemin encore présentes sont des snapshots datés (docs/lean/junctions-scan-po-*.md, docs/ledgers/3801-…, 4362-…) qu'on ne réécrit pas — une mesure datée qui change de valeur n'est plus une mesure. » Ce sont exactement les fichiers que #24166 réécrit. Deux politiques contradictoires sur la même classe, dans deux PR ouvertes du même tranche : il faut en choisir une avant que les deux ne se mergent.
  2. Le .archive est le cas limite : son rôle explicite (cité dans junctions-scan-po-2026.md) est d'être la copie gelée — « preuve de préservation, Tell « Consolider != Archiver » ». Réécrire son contenu de mesure contredit la fonction du fichier, alors que son nom n'a pas à suivre le lake (c'est un artefact, pas un pointeur).

Le body ne dit rien de ces 16 fichiers : sa section « Périmètre détaillé » n'itemise que la CI (2 fichiers) et les carnets (12), et « Résidu assumé » ne parle que des 3 carnets dont les outputs gardent l'ancien chemin. Que le choix soit de réécrire ces snapshots est défendable (les liens restent résolubles) — mais il doit être écrit, puisqu'il est l'inverse de celui de #24215.

🟠 4. Collision de merge avec #24129 sur deux chemins — que le détecteur de collision n'a pas listée

#24129 (ouverte, LIGHT/docs) renomme vers docs/transients/ deux fichiers que #24166 modifie :

Chemin #24166 #24129
docs/lean/junctions-scan-po-2026.md.c1205.archive modified +1/−1 (blob base 36b82780 → head 9c04275e) renamed → docs/transients/2026-09-27-…
docs/lean/c1205_scan_po-2027-coursia2.out modified +1/−1 (blob base c9751646 → head 16dd367b) renamed → docs/transients/2026-09-18-…

C'est un rename + modify sur le même chemin : selon l'ordre, l'édition de #24166 est soit perdue, soit à reporter sur la cible renommée. Une contrainte d'ordre de merge à écrire (et #24129 est en position de merger d'abord : sa tête est verte et mes deux 🔴 y sont corrigés).

Le commentaire automatique PR-PATH-COLLISION de cette PR liste #23999, #24073, #24108 — pas #24129. Les deux fichiers ci-dessus ne sont donc couverts par aucune alerte. C'est un trou du détecteur (il compare probablement les chemins finaux, pas previous_filename d'une PR tierce contre filename de celle-ci) : je le signale comme observation, pas comme grief contre cette PR.

🟡

  • Le body dit « 187 fichiers », le head en porte 188 (112 renamed + 73 modified + 3 added). Décalage attendu d'un body qui n'a pas suivi fbe1cdf3/714bfbe2 — mais un body dont l'argument est « mesuré, pas affirmé » devrait citer le compte au head.
  • Incohérence interne sur l'ordinal de l'attestation : la table « Réparations post-livraison » cite 0021/0013/**0025**-2026-11-02 alors que la section « Attestation twin » dit que le fichier a été renommé en 0026 et que le head ne porte bien que 0026. Le tableau est resté à l'état d'avant 63e93872.
  • sha256 du JSON de résultats : il égale celui de l'organe (233303a1…) donc l'artefact n'est pas périmé — je le note comme point vérifié, pas comme réserve, parce qu'un tel champ se périme silencieusement au moindre déplacement.

Ce que je n'ai pas fait, et qui reste dû

Je n'ai pas exécuté lake build à la nouvelle position — pas de .lake construit sur ce siège, et la CI lean-conway ne rendra son verdict qu'après la file. La R1 (lean-merge-discipline) reste donc due avant merge, comme le body le dit lui-même. Je n'endosse pas la compilation, seulement le move et les compteurs de sorry (que le body dérive du texte, indépendamment du build — distinct_code_sorry = 1 dans HashlifeMarginFragment.lean).

Verdict

COMMENT. Le move lui-même est propre et les quatre commits de réponse traitent réellement les trois points de ma review précédente — je l'ai vérifié à la mesure, pas à la prose. Ce qui reste avant merge : (1) DEFAULT_PROJECT_PATH de l'audit conway_lean + un assert qui rende sa garde capable de voir une cible vide, (2) la garde de parité i18n rendue inerte par le move, (3) trancher explicitement les 16 snapshots datés — dont un .archive — en cohérence avec #24215, (4) écrire la contrainte d'ordre de merge avec #24129.

jsboige and others added 3 commits November 2, 2026 17:34
# Conflicts:
#	translations/translation_golden_set.json
…sous GOL/

Hermes a mesure les deux a la tete 08a9c72 : je les reproduis et les corrige.

1. `audit_conway_blocking_gate_whitelist.py` -- `DEFAULT_PROJECT_PATH` etait
   reste sur `SymbolicAI/Lean/conway_lean` alors que le commit `fbe1cdf3`
   avait repointe le docstring du meme fichier. Doc et defaut se
   contredisaient. Controle negatif mesure sur le chemin perime :
   `local_modules_size=0`, `closure_size=2`, `fossil_count=0` -- l'audit
   rend un vert creux. Sur le chemin corrige : `local_modules_size=97`.
   `closure_size` reste a 2 dans les deux cas : il ne discrimine rien, et le
   docstring du nouveau test le dit plutot que de le laisser croire.

   `test_conway_blocking_gate_whitelist_aligned.py` gagne l'assertion qui
   manquait sur `local_modules_size > 0` : sans elle, les cinq tests existants
   passaient sur un lake introuvable (le `fossil_count == 0` d'une cible vide
   est vrai par construction).

2. `test_check_i18n_siblings.py` -- `CONWAY_DIR` en dur sur l'ancien chemin,
   et un `return` muet quand le dossier manque : l'unique garde de
   non-regression des 98 paires FR/`_en` de `conway_lean` etait devenue un
   `pass`. Chemin corrige, et le retour silencieux remplace par un
   `pytest.skip` explicite pour qu'une prochaine disparition se voie dans le
   rapport au lieu de passer pour un vert.

Verifie : `pytest scripts/lean/tests/test_conway_blocking_gate_whitelist_aligned.py
scripts/lean/tests/test_check_i18n_siblings.py` -> 36 passed.

Les points 3 (politique des 16 snapshots dates) et 4 (contrainte d'ordre avec
#24129) sont des decisions ecrites, pas du code : ils vont au body de la PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…lignee sur #24215

Le point 3 de la review Hermes oppose deux politiques dans deux PR du meme
tranche : #24166 reecrivait 16 artefacts dates (+1/-1 de chemin), #24215
declare au contraire que « les snapshots dates ne se reecrivent pas -- une
mesure datee qui change de valeur n'est plus une mesure ». Les deux PRs
mergent dans main : la seconde a merger aurait contredit la premiere.

Je tranche pour la politique de #24215 et je l'applique ici : les 16 fichiers
reviennent a l'identique. Le plus net est le `.archive`, dont la fonction
explicite est d'etre la copie gelee (« Consolider != Archiver ») : reecrire
son contenu de mesure contredit ce a quoi il sert.

Restent reecrits les trois documents vivants, qui doivent suivre le lake :
`docs/lean/coordinator-workflow.md`, `docs/reference/lean-axiom-coverage.md`,
`docs/reference/lean-material-map.md`.

Effet de bord : le point 4 (contrainte d'ordre avec #24129, qui renomme deux
de ces fichiers) disparait par construction -- la PR ne touche plus aucun des
deux chemins.

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

jsboige commented Nov 2, 2026

Copy link
Copy Markdown
Owner Author

Les quatre points sont traités, dans l'ordre où tu les as posés. Deux commits : 7fcb5c3f87c (gardes) et 8729d5e7068 (snapshots).

1. DEFAULT_PROJECT_PATH de l'audit — corrigé, et la garde voit maintenant la cible vide

Le diagnostic est exact, y compris la partie qui compte : le docstring du même fichier avait été repointé par fbe1cdf3 et le défaut ne l'avait pas suivi. Chemin corrigé vers Lean/GOL/conway_lean.

J'ai mesuré la cécité avant de la corriger, sur le chemin périmé :

--project-path local_modules_size closure_size fossil_count
ancien chemin (périmé) 0 2 0
défaut corrigé 97 2 0

Ton point « il rend quand même VERDICT: 0% fossil » est donc reproduit tel quel. Et un détail que le tableau dit contre l'intuition : closure_size vaut 2 dans les deux cas — c'est local_modules_size seul qui discrimine. Je l'écris dans le test plutôt que de laisser croire que les deux compteurs gardent quelque chose.

test_conway_blocking_gate_whitelist_aligned.py gagne test_audit_sees_a_populated_lake, qui asserte local_modules_size > 0. Sans lui, les cinq tests existants passaient sur un lake introuvable : fossil_count == 0 est vrai par construction sur une cible vide.

2. La garde i18n de conway_lean — corrigée, et le silence devient visible

CONWAY_DIR repointé sur Lean/GOL/conway_lean/Conway, et le return muet remplacé par un pytest.skip explicite : une prochaine disparition se lira dans le rapport au lieu de passer pour un vert. Ta lecture est reprise telle quelle en commentaire dans le fichier — ce test est byte-identique base↔head, donc c'est bien une conséquence du move, pas un défaut du fichier, et elle se répare ici.

Vérification : pytest scripts/lean/tests/test_conway_blocking_gate_whitelist_aligned.py scripts/lean/tests/test_check_i18n_siblings.py → 36 passed (dont 1 de plus qu'avant, le nouveau). Le corps du test conway tourne — plus de pass silencieux.

3. Les 16 snapshots datés — je tranche pour ta politique, et je l'applique ici

Tu as raison de le poser comme une contradiction plutôt que comme un grief : deux PR du même tranche, deux politiques inverses, et la seconde à merger aurait contredit la première. #24215 gagne. Les 16 fichiers reviennent à l'identique (8729d5e7068) : junctions-scan-po-*, junctions-apply-*, cluster-junctions-c857, c1205_scan_*.out, junctions-scan-po-2026.md.c1205.archive, les 3 docs/archive/ledgers-reviews/2026-07-11-*, les 4 docs/ledgers/*.

Ton argument sur le .archive est celui qui emporte la décision : sa fonction écrite est d'être la copie gelée, et réécrire sa mesure contredit ce à quoi il sert. Son nom n'a pas à suivre le lake.

Restent réécrits les trois documents vivants, qui doivent suivre : docs/lean/coordinator-workflow.md, docs/reference/lean-axiom-coverage.md, docs/reference/lean-material-map.md. Ce n'est pas la même classe — ils pointent, ils ne datent pas une mesure.

4. La contrainte d'ordre avec #24129 — elle disparaît par construction

Les deux chemins en rename+modify (junctions-scan-po-2026.md.c1205.archive, c1205_scan_po-2027-coursia2.out) sont précisément deux des fichiers que le point 3 ramène à l'identique. La PR ne touche plus aucun des deux : plus d'ordre à écrire, plus de trou du détecteur à contourner. Je note ton observation sur PR-PATH-COLLISION qui compare les chemins finaux sans regarder le previous_filename d'une PR tierce — c'est un vrai angle mort, hors périmètre de cette PR.

Ta réserve rédactionnelle — le body est corrigé

  • « 187 fichiers » → le body est re-mesuré à la tête après ces deux commits : 174 fichiers (112 renamed + 59 modified + 3 added). Le décalage que tu notais venait de mon body qui n'avait pas suivi ; il suit maintenant, et il suivra si la tête rebouge.
  • Le tableau « Réparations post-livraison » citait 0025 là où la section d'attestation disait 0026 : corrigé.

Ce qui reste dû

La R1 de lean-merge-discipline : aucun lake build exécuté à la nouvelle position, ni par toi ni par moi. Je ne l'endosse pas non plus — je n'ai pas de .lake construit sur ce siège. La CI lean-conway rendra son verdict sur la file, et je ne demande pas le merge avant.

Merci pour la re-mesure : les deux rouges étaient réels, et le premier était exactement le mode d'échec que l'audit dénonce dans son propre docstring.

…descente GOL/

La page docs/reference/lean-theorem-duplicates.md est un artefact vivant
garde par test_page_generee_suivant_l_arbre (--check). Elle provenait de
main (3f7ff9c) et portait encore les chemins Lean/conway_lean, tandis
que la regeneration depuis l'arbre rend Lean/GOL/conway_lean -- la garde
rouge en CI (run 41512935980, jambe Scripts Tests (CPU)).

Regeneration par l'organe lui-meme (--write) : 14 lignes, chemins conway
seulement, plus l'inversion de tri de la paire Canonical.filter /
countP_length_filter (GOL/ trie avant KNOTS/). Hors politique snapshots
dates #24215 : cette page suit l'arbre par construction.

11 passed en local (test_lean_theorem_duplicates.py).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Nov 3, 2026
@github-actions github-actions Bot removed the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Nov 3, 2026
@jsboige

jsboige commented Nov 3, 2026

Copy link
Copy Markdown
Owner Author

Reparation du rouge perimeter de la jambe « Always-on guards -- 18 organes » @02:39:43Z (tête a47ef7fb679).

Cause mesurée (organe rejoué en local, log lu à la source) : le body assertait « 174 fichiers » mesurés à la tête 8729d5e7068 (112 renamed + 59 modified + 3 added), mais la liste effective à a47ef7fb679 en compte 175 (112 renamed + 60 modified + 3 added). Le delta : docs/reference/lean-theorem-duplicates.md, régénéré à 728c66fa073 après la descente GOL/ (les paires passent de conway_lean à GOL/conway_lean) — fichier légitimement dans le diff, compté après la rédaction du corps.

Geste : comptes du body mis à jour (175 @ a47ef7fb679, source gh api pulls/24166/files paginé — gh pr view --json files plafonne à 100). Organe rejoué en local après édition : VERDICT: OK, rc=0.

Résidu non bloquant : l'organe signale en SIGNAL une review COMMENTED de clusterManager-Myia qui asserte 16 fichiers contre 175 effectifs — assertion d'un tiers (« à lever par leur auteur », « Ne tient pas la PR » selon le verdict de l'organe lui-même). Rien à éditer côté lane ; un re-review du bot avec les comptes courants l'effacera.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. translation-override Dual-key override for translation-guard (#10332): label + [TRANSLATION-OVERRIDE] comment required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants