Skip to content

fix(gametheory,#15615): reparer la couche de renvois cassee par la renum #15586 - #15987

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/15615-gt-reference-rot
Sep 14, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/15615-gt-reference-rot

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2026:CoursIA — prev: DEEP/slides #15865

Contexte

La renumérotation mécanique (#14944, tranches #15586 / #15613) a refermé les trous de numérotation de la série GameTheory sans toucher au contenu. Résultat : une partie de la couche de renvois est devenue fausse sans être cassée — les références pointent encore vers des fichiers qui existent, mais qui ne sont plus les notebooks dont la prose parle. Aucun lien mort, donc aucun instrument ne les voit.

Cette PR est la tranche « renvois » de l'étape 3 de #15615. Elle ne réordonne rien : l'acceptance 2 exige un « ordre cible validé (user ou coordinateur) avant toute exécution », donc aucune permutation, aucun git mv, aucune renumérotation ici. Le périmètre est exactement : réparer ce que la renum a cassé ou rendu faux.

Livrable — 13 substitutions, mesure sur origin/main (8cbe1828c)

# Fichier Constat mesuré Corrigé en
R1 GameTheory-23b-Lean-Assignment-Native.ipynb titre encore « GameTheory 27b » + 2 renvois « compagnon 27b » (reliquats de 27b → 23b) 23b ×3
R2 GameTheory-03a-Chemins-de-Swaps.ipynb cite GameTheory-21 comme « deux espèces de flèches » — or 21 est désormais Loi-II-Translateur-Life : le renvoi ne casse pas, il résout silencieusement sur le mauvais notebook GameTheory-03h ×3
R2 GameTheory-03g-Derivation-Quotient.ipynb même cible fausse (« le versant morphismes ») GameTheory-03h ×2
R3 GameTheory-04b-Lean-NashExistence.ipynb renvoie aux « définitions de base » du « notebook 17 » — les définitions sont en 02b GameTheory-02b-Lean-Definitions ×2
R4 GameTheory-02b-Lean-Definitions.ipynb prérequis « les notebooks Python 1-4 » alors que ce notebook est le n° 2 — dépendance avant→arrière 01-02 ×1
R5 GameTheory-02b-Lean-Definitions.ipynb prev = GameTheory-17-MultiAgent-RL GameTheory-02-NormalForm (palier parent) ×1
R5 GameTheory-19-Abstraction-a-Dette.ipynb prev = 17 et next = 03h — soit un retour de 16 crans dans la chaîne 18b-Casser-la-Composition / 20-Chemin-Minimal-Robinson-Goforth ×2
R7 GameTheory/index.qmd globs non zero-paddés ([2-6], [89], 1, 7) → 16 notebooks rendus sur 96 ; count annoncé « 27 racine + 4 SocialChoice » 4 globs + count 96 + 8

Contrôle positif du balayage : le même relevé trouve les renvois légitimes (GameTheory-03a, GT-3b, GameTheory-04c…). Les constats ci-dessus sont des lectures, pas un silence d'instrument.

Résolution des cibles — les 13 substitutions pointent vers des fichiers dont l'existence a été vérifiée : 03h-Deux-Especes-de-Fleches, 18b-Casser-la-Composition, 20-Chemin-Minimal-Robinson-Goforth, 02-NormalForm, 02b-Lean-Definitions, README.md. 0 cible manquante (vérifié fichier par fichier).

Effet mesuré sur le rendu

avant après
notebooks racine rendus par index.qmd 16 35
globs acceptant les noms zero-paddés non oui
count annoncé 27 + 4 96 + 8 (mesuré : 96 .ipynb racine sans variante _en/_output, 8 SocialChoice)

Preuve de non-changement de contenu (C.2, exception markdown-only)

Aucune cellule de code n'a été touchée : digest SHA-256 des cellules code (JSON canonique) identique à origin/main pour les 6 notebooks — donc execution_count et outputs sont préservés, l'exception markdown-only de C.2 s'applique et aucune ré-exécution n'est requise.

Le sérialiseur a été validé avant édition : re-sérialiser un notebook non modifié doit rendre les octets du disque à l'identique (contrôle sur les 6 fichiers, passé). La forme "source": [ligne, ligne, …] du disque est préservée — nbformat accepte aussi une chaîne unique, mais l'effondrement du tableau réécrit chaque cellule source et noie l'édition dans le churn.

Résiduel — hors périmètre, nommé

  1. README.md non touché (volontairement). Sa table « Ce que chaque notebook apporte » (l.381-389) est en numérotation pré-Reorganisation : ranger en sides (-b/-c) les ajouts recents qui ont pris un numero sequentiel (GT-19..23, Lean-25/26, Audio 04-7..13, ICT-Life, rlpt_, Planners-13) #12375 et contredit la table « Partie 4 » du même fichier (l.312-316, mise à jour par renum(gametheory,#14944): refermer la colonne canonique (trou 20-23) -- tranche A #15586) : deux tables incompatibles. Non corrigé ici parce que verify_catalog_readme.py croise le compte de prose du README avec le marqueur CATALOG-STATUS, et parce que la PR chore(catalog): scheduled auto-regenerate (long-lived PR) #15942 (bot catalogue) touche ce fichier. À traiter comme tranche propre.
  2. 61 notebooks racine restent non rendus par index.qmd (side-tracks lettrés + 18..24b). Ajouter un bloc de listing au-delà de 17 est la décision d'ordre cible que l'acceptance 2 exige de faire valider avant exécution — je ne la préempte pas.
  3. Les acceptance 1 (tableau de gradation) et 2 (ordre cible) de GameTheory(#14944): passe de coherence de gradation de la serie apres renum — la sequence refermee n'a pas la gradation des premiers numeros #15615 restent ouvertes : ce sont les étapes 1 et 2 de la passe, pas la mienne.

Vérifications passées

Note de diff : le hook fix-hr-separator a normalisé 11 séparateurs décoratifs --- → *** dans 04b-Lean-NashExistence.ipynb (convention déjà en vigueur dans la série, cf la cellule Conclusion de 23b). C'est l'auto-fix du dépôt qui s'applique dès qu'un fichier est touché, pas une édition de ma part.

See #15615 (contribution partielle — les acceptance 1 et 2 restent ouvertes)

🤖 Generated with Claude Code

…num #15586

La renum #15586 a laisse des renvois FAUX-MAIS-NON-CASSES : les references
pointent vers des fichiers qui existent encore, mais qui ne sont plus les
notebooks dont la prose parle. Aucun lien mort, donc aucun instrument ne les
voit -- il faut lire la cible.

Perimetre = tranche « renvois » de l'etape 3 seulement : aucune permutation,
aucun git mv, aucune renum (l'acceptance 2 de l'issue reserve l'ordre cible a
une validation user/coordinateur).

13 substitutions dans 6 notebooks + 4 globs/count de index.qmd :
- 23b : titre et prose « 27b » -> « 23b » (reliquats de 27b -> 23b)
- 03a/03g : « GameTheory-21 = deux especes de fleches » -> 03h (21 est
  desormais Loi-II-Translateur-Life : le renvoi resolu sur le MAUVAIS notebook)
- 04b : « notebook 17 » (definitions) -> GameTheory-02b-Lean-Definitions
- 02b : prerequis « 1-4 » -> 01-02, prev 17 -> 02-NormalForm, Index -> README
- 19 : chaine prev/next (retour de 16 crans) -> 18b / 20
- index.qmd : globs zero-paddes + count « 96 racine + 8 SocialChoice »

Rendu index.qmd : 16 -> 35 notebooks racine couverts (sur 96).

Preuve de non-changement de contenu : digest SHA-256 des cellules code
identique a origin/main sur les 6 notebooks (execution_count + outputs
preserves) -> exception C.2 markdown-only, pas de re-execution requise.
La forme "source": [ligne, ...] du disque est preservee (un effondrement en
chaine unique reecrirait chaque cellule source).

See #15615

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

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 6
  • Code cells validated: 80
  • 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 Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 22.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 7.9s

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

@github-actions

Copy link
Copy Markdown
Contributor

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

@jsboige

jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner Author

Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: LIGHT/readme #15552

Diagnostic du rouge : le seul garde en echec est un faux positif du detecteur — correctif en review dans #15994

Reproduction locale firsthand (detect_md_content_loss.py --base origin/main --head origin/fix/15615-gt-reference-rot, les 6 notebooks touches) :

GameTheory-02b-Lean-Definitions.ipynb : findings=1
  - LOST_NAV_LINKS: 1 lien(s) de navigation en moins (4 -> 3)
GameTheory-03a / 03g / 04b / 19 / 23b : findings=0

La comparaison de la cellule de navigation basse isole la cause :

BASE : [Index](GameTheory-01-Setup.ipynb)
HEAD : [Index](README.md)

Le lien Index n'a pas disparu : sa cible passe d'un notebook au README.md
de serie. NAV_LINK_RE ne comptait que les cibles *.ipynb, donc le compte
tombe de 4 a 3 et le detecteur rapporte une perte — alors que cette re-cible est
l'objet meme de la PR et conforme a la convention (le sommaire haut du meme
fichier
utilise deja [Index](README.md) ; les barres basses 03d et
04-NashEquilibrium-Csharp aussi ; seule 02b pointait un notebook).

Les deux checks rouges de cette PR (Always-on guards et No markdown content loss in changed notebooks) sont la meme cause unique — le second est le
check-run ombre publie par le premier pour ce garde. Le PR gate en echec est
l'agregat.

Correctif propose : #15994 — NAV_LINK_RE compte desormais les cibles
README.md au meme titre que *.ipynb, avec contre-epreuve (la suppression
reelle d'un lien decremente toujours le compte). Validations dans le body :
86/86 tests du detecteur, detecteur rejoue findings=0 sur les 6 notebooks,
5717 tests notebook_tools sans echec.

Apres merge de #15994 : cette PR doit rejouer ses checks sur une tete
fraiche (gh pr update-branch 15987 ou le balayage horaire) — le garde corrige
la rejuge. Aucun changement de notebook n'est requis ici : le contenu de la PR
est juste.

jsboige added a commit that referenced this pull request Sep 13, 2026
…ble n'est pas une perte (#15994)

detect_md_content_loss.py ne comptait que les cibles *.ipynb : un lien de
navigation re-cible d'un notebook vers le README.md de serie (convention du
sommaire haut du meme fichier, et majoritaire sur les barres de navigation
basse de GameTheory) etait rapporte comme LOST_NAV_LINKS (4 -> 3) et bloquait
la PR #15987 dont l'objet meme etait cette re-cible. Le lien n'a pas disparu,
sa cible a change.

Contre-epreuve : la suppression reelle d'un lien decremente toujours le compte
(test_nav_link_real_removal_still_signals). Detecteur rejoue sur les 6
notebooks de #15987 : findings=0 partout. 86/86 tests du detecteur + 5717
tests notebook_tools : aucun echec.

See #8655. See #15987.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-13) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants