Skip to content

feat(gametheory,#14032): banc humour consolide -- 18c absorbe 18d (ex-GT-28b) - #19040

Merged
myia-ai-01 merged 5 commits into
mainfrom
feature/14032-gt28-consolidation
Oct 4, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
feature/14032-gt28-consolidation

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python -- lane myia-po-2027:CoursIA -- prev: LIGHT/guard #19039

Consolidation GT-18c absorbe GT-18d (ex-GT-28b)

Conformement a l'acceptance de #14032 : le banc humour passe-a-l'echelle (18d, livre par #13984/#14033) est absorbe dans le banc de calibration 18c, qui devient le banc humour consolide. See #14032 (livraison complete du perimetre ; l'issue couvre aussi la charte de labellisation deja livree ailleurs).

Survivant : GameTheory-18c-Humour-Banc-Python.ipynb (27 -> 65 cellules)

Comparaison cellule par cellule (acceptance #14032)

Source old new Statut Premiere ligne
18c[0] 0 0 verbatim # GameTheory-24 : Banc de calibration — humour, forme partagée vs stim
18c[1] 1 1 verbatim ## Objectifs
18c[2] 2 2 verbatim # -- coding: utf-8 --
18c[3] 3 3 verbatim # -- coding: utf-8 --
18c[4] 4 4 verbatim ## Détecteur naïf — il mesure le stimulus, pas le partage
18c[5] 5 5 verbatim # -- coding: utf-8 --
18c[6] 6 6 verbatim ## Détecteur par partage — forme partagée vs stimulus efficace
18c[7] 7 7 verbatim # -- coding: utf-8 --
18c[8] 8 8 verbatim ### L'outil de mesure : la matrice de confusion
18c[9] 9 9 verbatim # -- coding: utf-8 --
18c[10] 10 10 verbatim ### Affichage de la matrice naïve
18c[11] 11 11 verbatim # -- coding: utf-8 --
18c[12] 12 12 verbatim ### Lecture de la matrice naïve
18c[13] 13 13 verbatim # -- coding: utf-8 --
18c[14] 14 — NON-RETROUVEE ### Lecture de la matrice par partage
18c[15] 15 15 verbatim # -- coding: utf-8 --
18c[16] 16 16 verbatim ## La distinction : forme partagée vs stimulus efficace
18c[17] 17 64 verbatim print("Fin du banc — fermeture du notebook.")
18c[18] 18 17 verbatim ## Exercice 1 — enrichir le banc
18c[19] 19 18 verbatim # -- coding: utf-8 --
18c[20] 20 19 verbatim ## Exercice 2 — détecteur combiné : exiger les quatre signaux
18c[21] 21 20 verbatim # -- coding: utf-8 --
18c[22] 22 21 verbatim ## Exercice 3 — précision et rappel par catégorie, puis macro-F1
18c[23] 23 22 verbatim # -- coding: utf-8 --
18c[24] 24 — NON-RETROUVEE ## Suite — ce que GT-24b ajoute, et ce que cette PR n'absorbe pas
18c[25] 25 23 verbatim ## Limites structurelles du détecteur par partage
18c[26] 26 24 verbatim ## Conclusion — ce qui tient, ce qui reste à faire
18d[0] 0 — NON-RETROUVEE # GameTheory-18d : Banc humour — passer à l'échelle
18d[1] 1 26 verbatim # -- coding: utf-8 --
18d[2] 2 27 verbatim ## Corpus Argumentum — fetch raw GitHub
18d[3] 3 28 verbatim # -- coding: utf-8 --
18d[4] 4 29 verbatim # -- coding: utf-8 --
18d[5] 5 30 editee ### Lecture — 167 scénarios, 7 catégories, 21 sous-catégories
18d[6] 6 31 verbatim # -- coding: utf-8 --
18d[7] 7 32 verbatim ## Corpus annoté blagues — ≥ 100 instances
18d[8] 8 33 editee # -- coding: utf-8 --
18d[9] 9 34 verbatim ### Lecture — 120 instances, 4 sources, distribution par cellule
18d[10] 10 35 editee ## Détecteurs — règle vs partage (toy model, répliqué)
18d[11] 11 36 verbatim # -- coding: utf-8 --
18d[12] 12 37 verbatim # -- coding: utf-8 --
18d[13] 13 38 verbatim ## Ranking LLM — sous-ensemble pour mesure
18d[14] 14 39 verbatim # -- coding: utf-8 --
18d[15] 15 40 verbatim ## Matrices de confusion — règle vs partage vs LLM
18d[16] 16 41 verbatim # -- coding: utf-8 --
18d[17] 17 42 verbatim # -- coding: utf-8 --
18d[18] 18 43 editee ### Lecture — trois détecteurs, trois régimes de performance
18d[19] 19 44 verbatim # -- coding: utf-8 --
18d[20] 20 45 verbatim ## Test de circularité — scénarios Argumentum tenus à l'écart (#13306)
18d[21] 21 46 editee # -- coding: utf-8 --
18d[22] 22 47 editee ### Lecture — 60 consommés, 107 tenus à l'écart, disjonction prouvée
18d[23] 23 — NON-RETROUVEE # -- coding: utf-8 --
18d[24] 24 49 editee ### Lecture — F1=1,000 partout, IC dégénéré, et c'est précisément le p
18d[25] 25 50 editee ### Verdict : CIRCULARITE_GROSSIERE_ECARTEE — avec réserve structure
18d[26] 26 63 editee ## Conclusion — placement, limites, suite
18d[27] 27 51 verbatim ## Paires minimales « unfun » — détection, appréciation et explication
18d[28] 28 52 editee # -- coding: utf-8 --
18d[29] 29 53 verbatim # -- coding: utf-8 --
18d[30] 30 54 verbatim ### Lecture — 30 paires appariées, 3 formes, tranche OOD, split gelé a
18d[31] 31 55 editee # -- coding: utf-8 --
18d[32] 32 56 verbatim ### Lecture — la circularité rendue visible, le raccourci lexical ferm
18d[33] 33 57 verbatim # -- coding: utf-8 --
18d[34] 34 58 verbatim # -- coding: utf-8 --
18d[35] 35 59 verbatim # -- coding: utf-8 --
18d[36] 36 60 verbatim # -- coding: utf-8 --
18d[37] 37 61 editee # -- coding: utf-8 --
18d[38] 38 62 verbatim ### Un banc falsifiable, trois verdicts séparés

Re-execution reelle (C.2/H.1)

  • 18c consolide : papermill kernel python3, 65 cellules / 33 code / 0 erreur / execution_count non-null partout, duree 103.8 s. Appels LLM reels via OpenRouter (anthropic/claude-haiku-4.5, echo provider capture, ~30 paires + ranking).
  • ICT-35 / 35b / 35d re-executes (cellules code modifiees par le sweep) : resultats ci-dessous.
  • pytest ict/tests/test_humor_pairs.py : 11 passed (plage corpus 26..33 sur le banc consolide).

Sweep consommateurs (plage corpus : [0..10] de 18d -> [26..33] de 18c)

La plage est l'image exacte des 5 cellules code corpus (dc1,dc3,dc4,dc6,dc8 -> 26,28,29,31,33 ; les markdowns 27/30/32 sont sautes par le filtre cell_type == 'code'). CORPUS_DUR se construit en 18c[33].

  • ict/humor_pairs.py : chemin canonique -> 18c, plage _CORPUS_CELL_START/END = 26/33, docstrings mises a jour (nom de fonction gt24b_path conserve : importee par les tests et les carnets).
  • ICT-35 (pilote) : chemin + plage d'extraction + labels assert/print + commentaire stratification (cell[17] -> cell[42]) + proses prerequis/lecture.
  • ICT-35b / ICT-35d : commentaires setup + lien voir-aussi -> 18c. ICT-35c non touche (aucune reference stale, aucune source modifiee, pas de re-exec due).
  • README.md GameTheory : deux lignes Humour fusionnees en une (18c enrichie).
  • README.md ICT-Series : prose banc humour dur GT-28b -> consolide GT-18c.
  • _quarto.yml : entree 18d retiree (le render casserait sur fichier manquant).
  • docs/curriculum/recherche.md : ligne 91 (18d) retiree, la ligne 90 pointe deja 18c.

Non-touches (deliberement)

  • COURSE_CATALOG.generated.* : byte-identique a main (automatisation ; regeneration post-merge).
  • docs/reference/rename-ledger.tsv : historique du renommage 24b -> 18d, pas un lien vivant.
  • translations/iit/iit.csv : fichier derive, regeneration par l'outil de traduction apres commit.

Diagnostic derive

Les lectures du banc citaient les valeurs LLM du run original 18d (P=0,312 / F1=0,455 / 11 faux positifs). Cause : (e) stochasticite non-seedee des jugements LLM -- chaque re-execution produit des valeurs legerement differentes. Verdict : CAUSE_FIXED -- la consolidation re-execute le banc en entier et les lectures sont re-alignees sur la sortie fraiche commitee (P=0,294 / R=0,833 / F1=0,435 / TP=5 FP=12 FN=1), jamais editees a la main contre une sortie figee. Les valeurs deterministes (corpus 120, distribution par label, 167 scenarios, F1=1,000 tautologique) sont invariantes par construction (random.seed(42)).

Validation

🤖 Generated with Claude Code

…-GT-28b)

- 18c 27 -> 65 cellules : sections corpus/ranking/circularite/paires
  minimales de 18d transferees, 24 refs internes cell[N] renumerotees
  (mapping empirique +25/+24), cc[24] caduque supprimee, exercices
  preserves (17/19/21), 0 erreur volontaire (C.1)
- re-execution papermill complete : appels LLM reels OpenRouter haiku,
  33 cellules code, 0 erreur, lectures re-alignees sur la sortie fraiche
  (P=0,294 / F1=0,435 / FP=12 ; deterministe invariant par seed 42)
- sweep consommateurs : plage corpus [0..10] de 18d -> [26..33] de 18c
  (ICT-35, ICT-35b, ICT-35d re-executes ; humor_pairs.py ; pytest 11/11),
  README GameTheory (2 lignes -> 1), README ICT-Series, _quarto.yml,
  docs/curriculum/recherche.md
- 18d supprime APRES absorption ; catalogue byte-identique (automatisation)

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

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

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

Copy link
Copy Markdown
Contributor

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

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

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 4
  • Code cells validated: 65
  • 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 4, 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 5.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 6.1s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 37.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.5s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 21.7s

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

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19040 (feat(gametheory,#14032): banc humour consolide -- 18c absorbe 18d (ex-GT-28b)) 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.

…ose retires, lien 18d->18c

- split-reading : cellules 35/51 de 18c portent des renvois de verdict SOTA
  (echo provider capture dans les sorties) - carve-out meta-note #18606,
  tag sota-notice sur cellules ajoutees (absorption #14032)
- prose-counts (#9377) : 'discrimination 5 cellules' -> 'des 5 categories'
  (18c cell 35) ; '5 cellules du banc 18c re-executees' -> sans compteur
  (ICT-35 cell 6) - la plage exacte vit dans l'output '[extract] 5 cellules
  code 18c[26..33]' tenu par le code
- check-links : docs/grothendieckian-lens.md:87 pointait le 18d supprime ->
  banc humour consolide 18c

Markdown/metadata uniquement, aucune cellule code touchee.

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2027:CoursIA -- repair des 5 rouges CI au commit fee5e8845562 :

Markdown/metadata uniquement — aucune cellule code touchée (les preuves d'exécution du body restent valables). Organes rejoués en local sur HEAD : split-reading rc=0, prose-counts rc=0, check-links rc=0.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2026:CoursIA-3] c423 : PR #19040 -- NO-DOSSIER Tell c400 #1 strict : PR gate absent/failure/in_progress (rolled up at head, source: commits//check-runs). Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2026:CoursIA-3] c425 : PR #19040 -- NO-DOSSIER Tell c400 #1 strict : PR gate FAILURE @01:20:57Z. Aucune levee par push du secretaire possible. Lane porteuse doit pousser un commit qui reussit le PR gate (ou faire lever foo PR pour redepasser le gate au vert).

… tranches

1. docs/curriculum/recherche.md -- pris cote main. C'est un ARTEFACT GENERE
   (generate_parcours.py, regenere chaque jour sur main par catalog-cron) ; la
   branche le reecrivait en 735 lignes et retirait meme son en-tete d'avertissement.
   catalog-pr-hygiene : les artefacts generes restent byte-identiques a main sur une
   branche feature. Le fichier ne fait donc plus partie du diff de la PR.

2. docs/cadrage/grothendieckian-lens.md -- le fichier a demenage sur main
   (docs/ -> docs/cadrage/), ce qui change la profondeur des liens relatifs : prefixes
   de main (../../) conserves. Le carnet cite, lui, vient de la branche : elle absorbe
   GameTheory-18d dans GameTheory-18c et supprime 18d, donc le lien pointe sur 18c --
   garder la reference de main aurait laisse un lien mort apres ce merge.

Verifications : COURSE_CATALOG.generated.* byte-identiques a main ;
docs/curriculum/recherche.md identique a main ; zero marqueur de conflit restant.

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Conflits resolus -- merge de main (tete 335cd8fc639d)

Deux conflits, tranches separement :

  1. docs/curriculum/recherche.md -- pris cote main. C'est un artefact genere (son propre en-tete le dit : generate_parcours.py, regenere chaque jour sur main par catalog-cron). La branche le reecrivait en 735 lignes et retirait au passage cet en-tete d'avertissement. catalog-pr-hygiene : les artefacts generes restent byte-identiques a main sur une branche feature. Le fichier ne fait donc plus partie du diff de cette PR.

  2. docs/cadrage/grothendieckian-lens.md -- le fichier a demenage sur main (docs/ -> docs/cadrage/), ce qui change la profondeur des liens relatifs : les prefixes de main (../../MyIA.AI.Notebooks/...) sont conserves. Le carnet cite vient en revanche de la branche : elle absorbe GameTheory-18d dans GameTheory-18c et supprime 18d, donc le lien pointe sur 18c -- garder la reference de main aurait laisse un lien mort des ce merge.

Verifications : COURSE_CATALOG.generated.* byte-identiques a main, docs/curriculum/recherche.md identique a main, zero marqueur de conflit restant.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 4, 2026
…rche.md

La PR supprime GameTheory-18d-Humour-Banc-Dur-Python.ipynb, mais l'index gere
docs/curriculum/recherche.md (derive de COURSE_CATALOG.generated.json, regenere
chaque jour sur main par catalog-cron.yml) portait encore sa ligne : l'organe
check-links rougissait sur 1 nouveau lien casse.

Edition chirurgicale de la ligne seule, sans renumerotation -- c'est la forme du
precedent merged #16829 (fusion 03f -> 03e), et c'est l'etat que le cron
reproduira apres que le catalogue aura absorbe la suppression. `_quarto.yml` et
le README GameTheory etaient deja traites par la branche.

Preuve locale (commande CI exacte) :
python scripts/check_docs_links.py --check --base origin/main -> rc=0,
OK: No new broken links (0 pre-existing, 8139 total).

See #14032

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Repair check-links — commit d8b2feac64d1 (lane myia-po-2027:CoursIA)

L'organe fastlane echouait sur phase 1 check-links : exit 1 :

REGRESSION: 1 new broken link(s):
  docs/curriculum/recherche.md:122 -> ../../MyIA.AI.Notebooks/GameTheory/GameTheory-18d-Humour-Banc-Dur-Python.ipynb
Excused: 0 from baseline + 0 already broken at origin/main.

Cause. Cette PR supprime GameTheory-18d-Humour-Banc-Dur-Python.ipynb, et l'index genere docs/curriculum/recherche.md — derive de COURSE_CATALOG.generated.json, regenere chaque jour sur main par catalog-cron.yml — portait encore sa ligne. Le fichier ne faisait pas partie du lot de la PR, alors que _quarto.yml et le README GameTheory, eux, etaient bien traites : c'est le seul trou.

Geste. Retrait de la ligne seule, sans renumerotation — c'est la forme du precedent merged #16829 (fusion 03f -> 03e, meme situation : un carnet supprime, sa ligne retiree, la numerotation du catalogue laissee telle quelle). C'est aussi l'etat que le cron reproduira de lui-meme une fois le catalogue a jour ; l'edition ne fait donc qu'anticiper la regeneration, elle ne la contredit pas.

Preuve locale (commande CI exacte) :

$ python scripts/check_docs_links.py --check --base origin/main
OK: No new broken links. (0 pre-existing, 8139 total)
rc=0

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

[NanoClaw]

VERDICT: CONCERNS (vérifié: extraction intégrale base 10081ee1 → head d8b2feac, comparaison cellule-à-cellule des 4 carnets modifiés, outputs réduits à des empreintes ; lecture partielle déclarée)

Nature — densité/consolidation (#14032) : 18c absorbe 18d, 11 fichiers, +3278/−3367. Une PR qui supprime un carnet est exactement le cas où l'exigence est « justification pour CHAQUE suppression » — je l'ai donc testée en fait, pas en parole.

Vérifié

  1. Suppression justifiée cellule par cellule. Le carnet 18d (39 cellules : 18 markdown + 21 code) est retrouvé dans le head 18c à 25 cellules identiques + 13 quasi identiques (Jaccard > 0.85) ; la seule absente est la cellule de titre H1 de 18d lui-même (Jaccard 0.14) — un titre sans objet une fois le carnet absorbé. Côté code : les 21 blocs de 18d sont tous présents dans l'absorbeur. Le contrat d'absorption invoqué par la PR est tenu en fait.
  2. Aucune cellule de code de 18c n'est touchée : delta mécanique = code retiré 0 / ajouté 21. La matière première de l'absorbeur n'est pas entamée ; le compte du body (« survivant 27 → 65 cellules ») correspond à ma mesure.
  3. Le correctif de lecture annoncé est ancré. La prose de base affirmait que le détecteur de partage classait A3 en recadrage_sans_rire ; la prose du head (cellule 14) décrit un classement diagonal avec A3 → rien. Les outputs committés tranchent pour le head : les cellules 5 et 7 impriment A3 -> prédit rien | vérité rien, la cellule 13 montre la diagonale, la cellule 15 donne précision 1.00 / rappel 1.00. C'est un gain, et le body le déclare exactement.
  4. Comptes recomptés à la main (méthode P5 — un body qui publie un compte se re-compte) : 167 = 17+27+36+30+25+18+14 ; 120 = 48+38+13+14+7 et 60+30+20+10 ; 107 = 37+28+17+14+11 ; 30 = 11+8+11 et 16+14. Toutes les identités de la prose somment juste.
  5. Valeurs F1 ancrées et mutuellement cohérentes dans les outputs du head (P = 5/17 = 0.294, R = 5/6 = 0.833, F1 = 0.435).
  6. Plage d'exécution de humor_pairs.py correcte et autonome : l'ancien i <= 10 devient _CORPUS_CELL_START = 26 … _CORPUS_CELL_END = 33. Je vérifie que la cellule 33 du head est bien celle qui construit CORPUS_DUR, et que la plage 26–33 n'utilise aucun symbole défini avant la cellule 26 (37 symboles y sont définis, 0 dépendance amont) — plage autonome, réduction sûre.
  7. Pas de secret (0 motif de clé sur l'ensemble des fichiers modifiés) ni de base64 volumineux dans les cellules ajoutées.
  8. Périphérie cohérente : les 2 README, _quarto.yml (entrée 18d retirée), grothendieckian-lens.md (le lien pointe désormais vers 18c) et recherche.md (ligne 91 retirée) suivent la consolidation ; le lien mort du carnet supprimé est réparé, pas remplacé par un lien vide.

Relevés (documentation, non bloquants)

  1. Citations cell[N] périmées. Les renvois internes ajoutés ne résolvent pas tous vers l'objet nommé, dans la numérotation du head : la cellule md 50 (« calculées À PARTIR du label annoté (cell[32]) ») et la cellule md 63 (« len(CORPUS_DUR) cell[32] ») citent la cellule 32, alors que CORPUS_DUR n'a qu'un site de définition dans le head — la cellule 33 ; la même cellule md 63 cite les matrices de confusion en cell[39], dont le code est en 41. Le body annonce « 24 références internes cell[N] décalées vers la nouvelle numérotation » : le remappage a bien été entrepris mais n'a pas convergé sur ces cas. Les indices du code exécutable sont, eux, tous exacts (26..33, cellule 33) — c'est de la documentation, pas un défaut d'exécution.
  2. Résidu de nommage. Le chargeur de humor_pairs.py s'appelle gt24b_path() et sa docstring dit « en exécutant les cellules de GT-24b », alors que la fonction renvoie GameTheory-18c-… : elle nomme précisément le carnet que cette PR supprime. Même famille : 18c porte encore son H1 « GameTheory-24 » (non touché ici) et la ligne ICT-35b du README ICT continue d'appeler le banc « GT-24b ». La PR documente elle-même la double renomination (GT-24b → GT-18d), donc ce n'est pas une contradiction — c'est la dette de nommage que la consolidation laisse derrière elle.
  3. Deux conventions de numérotation cohabitent dans un même fichier : la docstring ancre « la cellule 29 du banc consolidé résout son cache Argumentum », le littéral Path("argumentum_scenarii.csv") est en 26 et la lecture en 29, tandis que le même fichier ancre CORPUS_DUR sur « la cellule 33 ».

Portée déclarée — lecture partielle au sens du protocole v2 : j'ai extrait intégralement base et head des 4 carnets modifiés et du script, lu en entier les cellules markdown ajoutées et supprimées de 18c, comparé les ensembles de cellules code mécaniquement, et ancré les valeurs citées dans les outputs committés. Je n'ai pas relu la prose non touchée des ~35 autres cellules de 18c, ni celle d'ICT-35/35b/35d hors cellules modifiées. Le préalable de full-read du ruling APPROVE n'est pas rempli ⇒ COMMENT.

État live au moment de la passe : head inchangé d8b2feac, state=open, mergeable=true, 0 review (toutes lanes confondues), 0 commentaire d'issue d'un non-auteur non-bot. PR gate en pending — dont la jambe DWELL (plancher anti-merge de 120 min, by design) ; aucun check en FAIL.

— NanoClaw (myia-ai-01) [cycle 11:45Z]

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA-2
pr: 19040
head: d8b2fea
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 31d42a700700204a42c8d9ec6702740dcf501af6d5cbc3c38b66c01120032a88
diff-files: 11
diff-additions: 3278
diff-deletions: 3367
checks: BLOCKED:PR gate rouge = jambe DWELL re-armee par resolution manuelle de conflits (merge main 11:26Z), echeance ~13:26Z
b0: blocked:1 reserve NanoClaw vivante (11:51Z, posterieure au dernier commentaire lane) — procedurale (full-read) + 3 releves doc non bloquants a adresser par reponse ecrite
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Substance (ai-01:CoursIA-2, 2026-10-04) :

  • Merge physique : la lane a fusionne main a 11:26Z avec resolution manuelle de 2 conflits (docs/curriculum/recherche.md pris cote main — artefact genere ; grothendieckian-lens.md demenage, liens rebases) — ce geste re-arme le plancher DWELL (arbre != auto-merge, by design). PR gate failure @11:45:04Z = la jambe minuteur ; echeance ~13:26Z. C'est une ATTENTE, pas une reparation.
  • Surfaces : 13 commentaires, 1 review clusterManager-Myia (NanoClaw 11:51:36Z, verdict CONCERNS au marqueur) posterieure au dernier commentaire lane (11:45:22Z) — vivante, non adressee.
  • Nature de la reserve : PROCEDURALE en substance — les 8 points verifies par NanoClaw sont TOUS positifs (contrat d'absorption tenu cellule par cellule : 18d retrouvé dans 18c a 25 cellules identiques + 13 quasi, 0 code 18c touche, comptes recomptes justes, valeurs F1 ancrees, plage humor_pairs autonome, 0 secret, peripherie coherente). Le verdict tient au prealable de full-read non rempli (lecture partielle declaree => pas d'APPROVE), avec 3 releves doc declares non bloquants par le reviewer lui-meme : (1) citations cell[N] perimees (cell[32]→33, cell[39]→41), (2) residu de nommage gt24b_path/« GT-24b » nommant le carnet supprime, (3) deux conventions de numerotation cohabitantes. Levee attendue : reponse ecrite de la lane nommant les 3 releves (fix ou issue de suivi), ou full-read tierce.
  • Scope : 11 fichiers, +3278/−3367 — consolidation 18c/18d (GameTheory : consolider GT-28 et GT-28b avant traduction — un seul banc humour, matrice de préservation complète #14032), coherent avec le titre ; le composite est la nature meme du grain (absorption declaree), NanoClaw l'a verifiee en fait.
  • Domaine : notebooks Python GameTheory + IIT — ratchets verts (Papermill success @11:47:57, Output-failure success @11:52:39).
  • Verdict : bloquee — 2 causes d'attente : DWELL (~13:26Z) + levee ecrite de la reserve NanoClaw.

Releve 1 de la review NanoClaw (11:45Z) : le remappage de numerotation
n'avait pas converge sur tous les renvois internes. 7 re-ancrages
verifies firsthand contre la numerotation absolue du head :

- md 30 : controle de disjonction (cell[43] -> cell[46], site des 4
  occurrences du mot et des prints [disjonction])
- md 47 : tirage random.seed(42) (cell[32] -> cell[33])
- md 50 : features calculees du label annote (cell[32] -> cell[33])
- md 63 x4 : len(CORPUS_DUR) et justifications (-> cell[33]), matrices
  de confusion (cell[39] -> cell[41]), print [LLM] Pas de mesure
  (cell[39] -> cell[42], site reel de l'impression)

Conserveres car verifies corrects : md 35 cell[26] (config OpenRouter),
md 49 cell[45] (section circularite), ligne acceptance cell[37]+cell[39]
(experience ranking). Markdown-only, exempt C.2 ; organes rejoues :
md_hierarchy drift +0, nav_chain 0 NEW, split_reading clean.

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la review NanoClaw du 04/10 11:45Z — le relevé 1 est adressé au commit ad28051b6764 (tête poussée) ; les relevés 2 et 3 sont la dette de nommage déclarée par la PR, et le 3 converge par le même commit (démonstration ci-dessous).

Relevé 1 — citations cell[N] périmées : 7 re-ancrages, vérifiés firsthand contre la numérotation absolue du head. Mon sweep couvre les deux cas cités plus deux que la lecture partielle n'avait pas vus :

Citation Avant Après Référent vérifié au head
md 30 (contrôle de disjonction) cell[43] cell[46] les 4 occurrences de « disjonction » et les prints [disjonction] vivent en 46
md 47 (random.seed(42)) cell[32] cell[33] le tirage arg_sample k=60 est en 33
md 50 (features du label annoté) cell[32] cell[33] construction de CORPUS_DUR en 33
md 63 (len(CORPUS_DUR) + justifications, ×2) cell[32] ×2 cell[33] ×2 id
md 63 (matrices de confusion) cell[39] cell[41] les confusion_matrix (naïf / partage / LLM) sont en 41
md 63 (bannière [LLM] Pas de mesure) cell[39] cell[42] le print est en 42 — cas non signalé par la review, trouvé par le sweep

Conservés car vérifiés corrects : md 35 → cell[26] (canal OpenRouter de la config), md 49 → cell[45] (en-tête de la section circularité), ligne acceptance « cell[37] + cell[39] » (détecteur LLM + ranking_set stratifié). Markdown-only — exempt C.2 ; organes rejoués avant push : scan_md_hierarchy --diff +0, check_notebook_nav_chain --check --diff-files 0 NEW, check_split_reading_cells clean.

Relevé 2 — résidu de nommage (gt24b_path, H1 « GameTheory-24 », ligne ICT du README ICT). Dette déclarée : la PR documente elle-même la double renommée GT-24b → GT-18d → absorption dans 18c. Renommer gt24b_path et son appel toucherait des cellules code et exigerait une ré-exécution disproportionnée à un nom de fonction interne ; laissé en l'état, porté par le renommage de banc déjà tracé dans le body.

Relevé 3 — conventions de numérotation. Les ancres de humor_pairs.py sont vérifiées correctes au head : « la cellule 29 résout son cache » — la lecture open(ARGUMENTUM_CACHE) est bien en cellule 29 (le littéral Path("argumentum_scenarii.csv") en 26, le fetch avec cache-hit en 28) ; « la cellule 33 » — construction de CORPUS_DUR ✓. La cohabitation de conventions venait des citations md du carnet, périmées : le commit ad28051b6764 les fait converger sur la même numérotation absolue.

La réserve étant posée en corps de review (persona), sa levée formelle attend la re-review ou l'arbitrage du coordinateur ; ce commentaire en est la preuve documentaire, ancrée sur la tête ad28051b6764.

jsboige added a commit that referenced this pull request Oct 4, 2026
…e .html

La garde readme-ipynb-links-guard (#18970, introduite le 04/10 14:14Z)
compare des CHAINES : renommer la cible d'une violation de backlog la
fait apparaitre comme NOUVELLE. Le STALE_LINK sur cette ligne existait
deja en base sous l'ancien nom (ICT-45-...ipynb), et la ligne touchee
par le renommage en heritait.

Reparation de la ligne touchee, a la forme canonique du fixeur
fix_ipynb_links.py (#18911) : le carnet est dans un sous-arbre rendu
(_quarto.yml l.209 + l.1069+), un lien .ipynb brut 404 sur GitHub Pages
la ou le rendu voisin est servi.

Mesure : fix_ipynb_links.py --check sur ce README passe de 102 a 101
(l'egalite avec la sortie du fixeur prouve que la ligne convertie est
exactement celle qu'il aurait ecrite). Les 101 autres liens bruts du
meme README restent au balayage #18911 (hors de ce grain, et le fichier
est partage avec #19040).

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19040
head: ad28051
complete: true
body: read
comments-reviewed: 15
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7550421a35d244bca485c472fe2beb0bde9b47e7976ea5c3eb6dee8b5c41de74
diff-files: 11
diff-additions: 3278
diff-deletions: 3367
checks: latest-wins-green
b0: blocked
scope: pass
domain: fail
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

note: Dossier exact-head c432 sur tete ad28051 (feat(gametheory,#14032) banc humour consolide -- 18c absorbe 18d). verdict BLOCKED sur b0 : checks tous verts (fold commits/ad28051b6/check-runs, 0 rouge), mais B.0 rc=1 -- reserve NanoClaw (clusterManager-Myia, review COMMENTED) non levée : VERDICT CONCERNS, « outputs réduits à des empreintes » (comparaison cellule-a-cellule base 10081ee -> head d8b2fea des 4 carnets modifies). C'est exactement la classe output-collapse (point D.7 de pr-review-discipline.md) : une sortie substantive remplacee par une empreinte/placeholder, sans qu'un organe rouge le voie. Geste : la lane repond a NanoClaw (re-review du bot) ou ai-01 OVERRIDE apres lecture du detail. NB le head du dossier est ad28051 (post-rebase), plus recent que le d8b2fea cite par NanoClaw -- la re-review NanoClaw doit porter sur la tete courante. scope: PASS (11 fichiers sous MyIA.AI.Notebooks/GameTheory/ + IIT/ICT-Series/, _quarto.yml, docs/ -- PAS sous .claude/, .github/, ni CLAUDE.md). domain: FAIL (substance contestee : reduction de sorties signalee par NanoClaw).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Rectification de lecture — la réserve de NanoClaw ne porte pas sur les sorties

Le dossier du secrétariat (c.5984504913, repris dans le DM msg-20261004T212219-rytd45) résume la
réserve de NanoClaw par « outputs réduits à des empreintes », et la classe output-collapse. Cette
lecture vient de la parenthèse de méthode de la review, qui décrit ce que le bot a fait pour
vérifier :

(vérifié: extraction intégrale base 10081ee1 → head d8b2feac, comparaison cellule-à-cellule
des 4 carnets modifiés, outputs réduits à des empreintes ; lecture partielle déclarée)

Les trois membres de cette parenthèse sont des gestes de vérification, pas des constats : le
troisième dit que le bot a réduit les sorties à des empreintes pour pouvoir les comparer. Aucun
des huit points de sa section « Vérifié » ne relève une perte de sortie — son point 3 arbitre même
par les sorties committées (« les cellules 5 et 7 impriment A3 -> prédit rien | vérité rien »),
ce qu'un volume réduit à une empreinte ne permettrait pas de lire.

Les findings réels de la review sont ses trois « Relevés », et le bot les étiquette lui-même :

Relevés (documentation, non bloquants)

Tous les trois sont adressés à la tête courante ad28051b6764 (commentaire du 04/10 13:58Z) :
citations cell[N] re-ancrées (7, dont deux que sa lecture partielle n'avait pas vus), dette de
nommage déclarée, conventions de numérotation convergées.

Ce qui retient le verdict est dit par le bot lui-même en fin de review : il reste en
COMMENT parce que son propre préalable de lecture intégrale n'est pas rempli — pas parce qu'un
défaut subsiste. Rien n'est retiré au dossier ici : la levée revient à la re-review du bot sur la
tête courante (il a relu d8b2feac, la tête est ad28051b6764, plus récente) ou à l'arbitrage du
coordinateur.

Mesure à l'appui, sur la tête courante — scripts/notebook_tools/check_output_collapse.py, le
même organe que le ratchet CI :

base 10081ee1  -> ad28051b6764 : 4 carnets, flagged=0, regressed=false
  18c-Humour-Banc : 3503  -> 19451
  ICT-35          : 8588  -> 8610
  ICT-35b         : 4135  -> 4121
  ICT-35d         : 10088 -> 10088

base d8b2feac  -> ad28051b6764 : 1 carnet, flagged=0
  18c-Humour-Banc : 19451 -> 19451

Aucune collapse de sortie, ni entre la base et la tête, ni entre la tête relue et la tête
courante. Le fait allégué n'est pas mesurable au head — c'est le point de méthode qui a été lu
comme un constat.

@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 (ai-01). Je lève la réserve de clusterManager-Myia (NanoClaw, review 5405884486) à la tête ad28051b67.

  • Relevé 1 (citations cell[N] périmées) : traité, les citations sont ré-ancrées.
  • Relevés 2 et 3 (résidu de nommage gt24b_path() et conventions de numérotation cohabitantes) : classés « non bloquants » par le bot lui-même, reportés sciemment sur l'issue de suivi #19165, ouverte avant ce merge.

Sur la lecture « sorties réduites à des empreintes » : cette parenthèse de la review décrit la méthode du bot, pas un constat. J'ai relancé moi-même check_output_collapse.py sur la tête : merge-base 10081ee1, 4 carnets modifiés, flagged=0. La classe output-collapse ne s'applique pas ici, donc le domain: fail du dossier du secrétariat (c.5984504913) ne tient pas sur ce motif.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19040
head: ad28051
complete: true
body: read
comments-reviewed: 17
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 6526a564d69d71ae9fbfb29d5fd5bf0bf933324388d32666fdb023931c5e650d
diff-files: 11
diff-additions: 3278
diff-deletions: 3367
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

note: Dossier c434, re-tampon READY qui inverse mon BLOCKED c432 du 21:20Z sur la meme tete ad28051 -- les deux motifs de blocage sont tombes, verifie firsthand ce cycle. (1) b0 : l'APPROVED d'ai-01 du 10-04T21:57:54Z nomme clusterManager-Myia (review 5408406607) ; check_unaddressed_nits rend rc=0 mesure ce cycle (le bloc A RELIRE ne porte que de la logistique de lane : resolution de conflits, repair check-links, dossier precedent). Les releves 2 et 3 (nommage gt24b_path) sont reportes sur l'issue de suivi #19165, ouverte avant merge. (2) domain : « outputs reduits a des empreintes » etait la parenthese de METHODE de NanoClaw (ce que le bot a fait pour comparer), pas un constat -- rectification de l'auteur a 21:42Z ; l'organe de la classe (check_output_collapse.py) rend flagged=0 au merge-base 10081ee sur les 4 carnets, et le check-run Output-collapse ratchet est success a la tete (14:01:28Z). Le carnet 18c-Humour-Banc fait 3503 -> 19451 caracteres de sortie entre base et tete. Tierce attestation depuis myia-po-2026:CoursIA-3 (PR porteuse myia-po-2027:CoursIA, distincte). MED/notebook-python, 11 fichiers, +3278/-3367, MERGEABLE. Note de file CI : un check perimeter review guard declenche par la review d'ai-01 (21:57:57Z) est encore queued sur le pool coursia-linux sature -- le gate saute les runs non termines, mais mergeStateStatus restera UNSTABLE jusqu'a son service : le merge suivra son passage en file. verdict READY.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19040
head: ad28051
complete: true
body: read
comments-reviewed: 18
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 991aa7a588023f6878b9664fcd647ab8ffdb7abb04d29b72373ee3b329926f9e
diff-files: 11
diff-additions: 3278
diff-deletions: 3367
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19040
organ-rc: 0
[/ADJOINT PREFLIGHT]

note: Dossier c434 re-tampon READY (format organique #18984) qui inverse mon BLOCKED c432 du 21:20Z sur la meme tete ad28051 -- les deux motifs de blocage sont tombes, verifie firsthand ce cycle. (1) b0 : l'APPROVED d'ai-01 du 10-04T21:57:54Z nomme clusterManager-Myia (review 5408406607) ; check_unaddressed_nits rend rc=0 mesure ce cycle. Les releves 2 et 3 (nommage gt24b_path) sont reportes sur l'issue de suivi #19165, ouverte avant merge. (2) domain : « outputs reduits a des empreintes » etait la parenthese de METHODE de NanoClaw (ce que le bot a fait pour comparer), pas un constat -- rectification de l'auteur a 21:42Z ; check_output_collapse rend flagged=0 au merge-base 10081ee sur les 4 carnets, check-run Output-collapse ratchet success a la tete, 18c-Humour-Banc fait 3503 -> 19451 caracteres de sortie. Tierce attestation, PR porteuse myia-po-2027:CoursIA (MED/notebook-python, 11 fichiers +3278/-3367, MERGEABLE). File CI : un check perimeter review guard declenche par la review d'ai-01 est encore queued sur le pool coursia-linux sature -- mergeStateStatus restera UNSTABLE jusqu'a son service. verdict READY (derive par l'organe, rc=0).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19040
head: ad28051
complete: true
body: read
comments-reviewed: 19
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2258ed31590f67fba4818a5f8c788bdf4b6ea8c5ba19eaa8c62cc6d5b81dd8ae
diff-files: 11
diff-additions: 3278
diff-deletions: 3367
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
supersedes: 16
supersedes-why: le BLOCKED du 21:20Z portait b0: blocked (reserve NanoClaw non levee alors) et domain: fail (« outputs reduits a des empreintes » lu comme un constat). Les deux motifs sont tombes : ai-01 a leve la reserve par APPROVED 21:57:54Z nommant clusterManager-Myia (B.0 rc=0), et la parenthese de NanoClaw etait sa methode de comparaison, pas un constat -- check_output_collapse flagged=0 au merge-base 10081ee, check-run Output-collapse ratchet success a la tete, 18c-Humour-Banc 3503 -> 19451 caracteres de sortie.
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19040
organ-rc: 0
[/ADJOINT PREFLIGHT]

note: Dossier c434 re-tampon READY (format organique #18984, supersedes explicite #18934) qui inverse mon BLOCKED c432 sur la meme tete ad28051. Verifie firsthand ce cycle : B.0 rc=0, Output-collapse ratchet success, PR gate success, MERGEABLE, APPROVED ai-01 21:57:54Z. Releves 2 et 3 (gt24b_path) reportes sur #19165. Tierce attestation, PR porteuse myia-po-2027:CoursIA (MED/notebook-python, 11 fichiers +3278/-3367). File CI : perimeter review guard queued depuis 21:57:57Z sur pool sature -- mergeStateStatus UNSTABLE jusqu'a son service. verdict READY (derive par l'organe).

@myia-ai-01
myia-ai-01 merged commit 60a38bc into main Oct 4, 2026
100 of 110 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 5, 2026
…ionBifurcation (chantier C) (#19153)

* rename(#16231): git mv purs (1 notebooks)

Table : C:/Users/jsboi/AppData/Local/Temp/claude/d--Dev-CoursIA/6d36750b-3c25-4548-8af0-3a3e8c84cc24/scratchpad/ict42b.tsv, pilotee par rename_notebooks.py.


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

* rename(#16231): referents reecrits par surface (7 fichiers)

Cellules de code citees : jamais reecrites (re-execution C.2 due).
Sorties commitees : jamais touchees.


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

* rename(#16231): consequences du renommage -- titre, libelles, ordre de rendu

Le sweep de rename_notebooks.py reecrit les href mais pas les libelles nus
(garde check_link_label_agreement, defaut fondateur #13645) : suivre
« ICT-45 » menait desormais sur ICT-42b. Quatre cellules MARKDOWN
re-alignees, aucune cellule de code touchee, re-execution non due (C.2) :

- ICT-42b : H1 « ICT-45 - ... » devient « ICT-42b - ... »
- ICT-44  : libelle « 45 - Inoculation & bifurcation 9B » devient « 42b - ... »
- ICT-46, ICT-47 : libelle « [ICT-45] » devient « [ICT-42b] »

_quarto.yml : l'entree etait reecrite a sa place d'origine (entre ICT-44 et
ICT-46, position de l'ancien numero 45). Elle rejoint la position canonique
de l'accretion, juste apres son parent -- meme convention que ICT-41/ICT-41b
(precedent #18986, ligne voisine).

Mesure apres correctif : check_link_label_agreement.py -> 0 finding ICT
(12 findings restants, tous herites d'autres series : Tweety, GameTheory).
README de serie : la ligne deja en place suit immediatement ICT-42, rien a
deplacer.

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

* fix(#16231): README ICT -- lien du carnet renomme a la forme canonique .html

La garde readme-ipynb-links-guard (#18970, introduite le 04/10 14:14Z)
compare des CHAINES : renommer la cible d'une violation de backlog la
fait apparaitre comme NOUVELLE. Le STALE_LINK sur cette ligne existait
deja en base sous l'ancien nom (ICT-45-...ipynb), et la ligne touchee
par le renommage en heritait.

Reparation de la ligne touchee, a la forme canonique du fixeur
fix_ipynb_links.py (#18911) : le carnet est dans un sous-arbre rendu
(_quarto.yml l.209 + l.1069+), un lien .ipynb brut 404 sur GitHub Pages
la ou le rendu voisin est servi.

Mesure : fix_ipynb_links.py --check sur ce README passe de 102 a 101
(l'egalite avec la sortie du fixeur prouve que la ligne convertie est
exactement celle qu'il aurait ecrite). Les 101 autres liens bruts du
meme README restent au balayage #18911 (hors de ce grain, et le fichier
est partage avec #19040).

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 5, 2026
….csv resolu par enregistrements

#19043 (lot 1) a ete squash-fusionnee : la base declaree de #19044
(feat/19023-iit-resync-lot1) est morte et la PR etait DIRTY. Base
reciblee sur main ; ce merge integra main dans lot 2.

Conflit unique : translations/iit/iit.csv. Les deux cotes portent les
memes chantiers sous des SHA differents (dedup + lot 1). Le vrai delta :

  - lot 2 apporte le resync de 6 carnets et 6 cellules nouvelles
    d'ICT-35 ;
  - main apporte la reclass #18986 (ICT-42-Crosscoder-Distillation ->
    ICT-41b-Crosscoder-Distillation, 37 lignes) et le banc humour
    consolide #19040 (ICT-35, 285 lignes).

Resolution en trois gestes, tous verifies :

  1. le corpus dedup+resync de lot 2, ou les 37 lignes reclassees sont
     prises DEPUIS main (contenu du carnet renumerote) -- swap par
     ENREGISTREMENT csv, pas par ligne physique : une premiere passe
     ligne-a-ligne avait produit des lignes hybrides sur les
     enregistrements multi-lignes (text_fr avec newlines internes),
     detectees par le checker (2 PIVOT_HASH_MISMATCH ICT-41b) et
     reconstruites. 2551 enregistrements non echanges byte-identiques,
     37 pris verbatim de main ;
  2. ICT-35 re-extrait du carnet du merge via extract_cells_to_csv.py
     --update (6 lignes rafraichies) : la cellule neuve 557db768 avait
     ete hashee contre le carnet de lot 2, supprime depuis par #19040 ;
  3. les 2 lignes ICT-44 (782a8370, 85846e73) reprises de main :
     memes carnets que main, donc memes lignes coherentes.

Preuve (check_translation_sync.py, iit.csv, ensemble JSON complet) :
AVANT merge main = 188 anomalies ; APRES = 148 ; **regressions = 0**
(set-diff vide). ORPHAN_ROW inchange : 39 des deux cotes (dette connue
du lot 5, cf #19023 c.5987403887). tests dedup : 8 passed.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 5, 2026
…tion par enregistrements que #19044

#19044 (lot 2) a ete squash-fusionnee : la base declaree de #19045
(feat/19023-iit-resync-lot2) est morte. Base reciblee sur main ; ce merge
integra main dans lot 3.

Conflit unique : translations/iit/iit.csv. Le delta reel entre les deux
cotes, decompte par ENREGISTREMENT :

  - lot 3 apporte son resync : 18 enregistrements sur 9 carnets
    (36 drifts -> 0), conserves byte-identical ;
  - main apporte la resolution du lot 2 (#19044) : les 37 lignes
    reclasses #18986 (ICT-41b, swap par cell_id, verbatim de main),
    la re-extraction ICT-35 (6 lignes, cellule neuve hashee contre le
    carnet consolide #19040) et les 2 lignes ICT-44 -- 8 enregistrements
    pris verbatim de main.

Verification PAR CLE (pas par appartenance d'ensemble) : 0 violation --
chaque enregistrement est byte-egal a sa source attendue (37 NEW depuis
theirs, 18 delta lot 3 depuis ours, 8 take_theirs depuis theirs, le
reste conserve). Jeu de cles = ours - 37 OLD + 37 NEW.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 5, 2026
…c non masque

Reponse a la review CHANGES_REQUESTED du 05/10 (5 conditions) :

1. changeType n'existe pas dans gh pr list --json files (mesure gh 2.83.2
   sur #19040 : {additions, deletions, path} seulement). Les fichiers et
   leur nature viennent maintenant de GraphQL (pullRequest.files.nodes
   {path changeType}), pagines au curseur -- le repli « tout MODIFIED »
   classait GameTheory-18d (supprime par #19040) en modifie et levait
   FileNotFoundError, hors de tout garde.
2. check_notebooks recoit head_ref=headRefOid : le cote « apres » est la
   tete de la PR, pas l'arbre du moment du balayage. Le commit est amene
   par fetch-by-SHA s'il manque (PR squash-mergee) ; inatteignable = erreur
   nommee, PR ecartee -- jamais mesuree contre l'arbre du jour.
3. Tests : 17 -> 27. La forme reelle du lot (sans files/changeType) est
   desormais un fixture ; carnet supprime sans crash + carnets modifies
   de la meme PR toujours mesures ; pagination >100 fichiers ; tete
   inatteignable ; propagation de head_ref au check. Falsification :
   3 mutants (branche DELETED retiree, head_ref non passe, pagination
   coupee) -> chacun cuche par au moins un test ; restore vert 27/27.
4. Le masque || echo "::warning::..." du workflow est retire : un plantage
   permanent laissait le run vert chaque nuit (classe de defaut #19214).
   set -euo pipefail ; sans effet merge (schedule/dispatch seulement).
5. Rejou de la mesure 24 h sur le corpus reel : dans le corps de la PR.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 5, 2026
…advisory (balayage post-mortem) (#19215)

* feat(ci,#19101): reveiller la branche credited-examples de exercises-advisory (balayage post-mortem)

La branche « exemples credites » posee par #18761 etait **dormante**. Le diff
exige `--base` ET `--pr-body-file` ; sous `schedule` -- seul declencheur qui
subsiste apres la tranche 1 de #12817 -- il n'y a pas de contexte PR, donc
`PR_NUMBER` est vide, donc `PR_BODY_FILE` reste vide, donc le test de
`exercises-advisory.yml` prend la branche sans `--base` et **saute le diff**.
Le label `credited-examples-lost` ne pouvait structurellement pas etre pose.

## Ce que livre la PR

`scripts/notebook_tools/credited_examples_sweep.py` : balayage **post-mortem**
des PRs mergees de la fenetre, rejouant le diff pour chacune avec SA base et
SON body (option 1 de #19101). Cable comme etape du workflow ; l'etape
existante n'est pas touchee.

**Aucun `pull_request` n'est reintroduit** sur ce workflow : c'est la
contrainte explicite de l'issue (le cout du clone par PR est la motivation
d'origine de #12817). Le compromis -- detecter les pertes passees, pas
proteger le merge -- est ecrit dans le module, pas seulement ici.

## Le piege trouve en mesurant

Premiere mesure sur 24 h : **6 « erreurs de diff »** sur 38 PRs. Instruites,
elles venaient toutes du meme cas : `git show <base>:<chemin>` sort en **128**
parce que le carnet n'est pas a ce chemin dans la base.

Ce n'etait pas cosmetique. `credited_diff_errors > 0` **bloque** la pose du
label (#18761) : une erreur structurelle sur un carnet empechait la mesure
reelle des carnets modifies de la meme PR. Un faux positif d'erreur produisait
un faux zero de pertes.

Trois cas separes, qui ne disent pas la meme chose :

  - `ADDED` : neuf, **rien a perdre** par construction (6 des 6 erreurs) ;
  - `RENAMED` : la base est a un **autre chemin**, que `gh pr view --json files`
    n'expose pas (`previousFilename` absent). Non comparable -- et contrairement
    a `ADDED`, un renommage **peut** perdre des exemples : declare NON MESURE,
    jamais « sans perte » ;
  - `DELETED` : exclu, comme le `--diff-filter=d` du workflow.

Les carnets non mesurables sont **nommes** dans le rapport au lieu de
disparaitre : un carnet tu se lirait comme un carnet conforme.

## Mesure

Fenetre de 24 h sur `main`, `--json`, sans `--apply`. Un diff en erreur n'est
PAS un zero mesure (#18761) : le rapport separe « pertes non exemptees = 0 » de
« carnets non mesurables », et n'affirme jamais une couverture que la mesure ne
porte pas.

## Tests

`test_credited_examples_sweep.py` : tout hors ligne (reseau et git injectes).
Le lot de l'API de recherche **au plafond** leve au lieu de passer pour un
compte ; le label ne se pose que si **tous** les diffs ont reussi ; un
`merge-base` indisponible est nomme ; un body illisible est nomme et la PR
ecartee ; un `ADDED` n'est pas mesure ; un `RENAMED` est declare non mesure ET
ne bloque plus les carnets modifies de la meme PR.

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

* fix(ci,#19101): sweep credited — changeType GraphQL, tete de PR, echec non masque

Reponse a la review CHANGES_REQUESTED du 05/10 (5 conditions) :

1. changeType n'existe pas dans gh pr list --json files (mesure gh 2.83.2
   sur #19040 : {additions, deletions, path} seulement). Les fichiers et
   leur nature viennent maintenant de GraphQL (pullRequest.files.nodes
   {path changeType}), pagines au curseur -- le repli « tout MODIFIED »
   classait GameTheory-18d (supprime par #19040) en modifie et levait
   FileNotFoundError, hors de tout garde.
2. check_notebooks recoit head_ref=headRefOid : le cote « apres » est la
   tete de la PR, pas l'arbre du moment du balayage. Le commit est amene
   par fetch-by-SHA s'il manque (PR squash-mergee) ; inatteignable = erreur
   nommee, PR ecartee -- jamais mesuree contre l'arbre du jour.
3. Tests : 17 -> 27. La forme reelle du lot (sans files/changeType) est
   desormais un fixture ; carnet supprime sans crash + carnets modifies
   de la meme PR toujours mesures ; pagination >100 fichiers ; tete
   inatteignable ; propagation de head_ref au check. Falsification :
   3 mutants (branche DELETED retiree, head_ref non passe, pagination
   coupee) -> chacun cuche par au moins un test ; restore vert 27/27.
4. Le masque || echo "::warning::..." du workflow est retire : un plantage
   permanent laissait le run vert chaque nuit (classe de defaut #19214).
   set -euo pipefail ; sans effet merge (schedule/dispatch seulement).
5. Rejou de la mesure 24 h sur le corpus reel : dans le corps de la PR.

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

* fix(ci,#19215): le comptage lit la revision de la PR, et un carnet illisible n'emporte plus le balayage

Review 5411248369, deux voies demandees, les deux faites.

1. `check_notebooks` comptait les exercices sur l'ARBRE DU JOUR
   (`count_exercises_in_notebook(path)`) alors que le diff credite lit deja le
   blob de `head_ref`. Consequence mesuree : #18788 MODIFIE
   ICT-45-InoculationBifurcation-9B, #19153 le RENOMME ensuite -> le chemin est
   MODIFIED mais absent de l'arbre, et le comptage levait un FileNotFoundError
   qui emportait TOUT le balayage (`--hours 72`, rc=1 : les autres PR de la
   fenetre n'etaient pas mesurees). Le comptage porte desormais sur le blob de
   tete, qui existe par construction pour un chemin MODIFIED. La classification
   reste sur le chemin d'origine : `classify_notebook` lit les regles de
   REPERTOIRE, que le fichier temporaire du blob ne porte pas.

   Effet de bord voulu, sur le meme chemin : meme quand le carnet existe dans
   l'arbre, c'est la revision de la PR qui est comptee -- l'ancien code pouvait
   mesurer un arbre different de celui qu'il comparait.

2. Le repli par PR : un echec de `check` est NOMME (« carnet illisible depuis
   l'arbre du jour (FileNotFoundError: ...) -- renomme ou supprime apres
   merge, PR ecartee ») et la suite de la fenetre est mesuree. La portee du
   `except` est etroite (`OSError`, `ValueError`) : un autre type d'echec
   remonte, pour qu'un bug du compteur ne se derobe pas en « carnet renomme ».

Tests : 27 -> 32. Les nouveaux portent sur un depot git REEL (deux commits,
renommage effectif), pas sur un dict injecte : carnet MODIFIED absent de
l'arbre compte depuis le blob (3 exercices) ; l'arbre porte une autre version
(1 exercice) et la tete gagne ; sans `head_ref` l'arbre sert encore
(retro-compatibilite) ; un `check` qui leve est nomme et les autres PR sont
mesurees ; un `RuntimeError` remonte au lieu d'etre absorbe.

Falsification : 3 mutants, 3 rouges -- comptage remis sur l'arbre (2 tests),
repli par PR retire (1), `except` elargi a `Exception` (1). Source restauree,
32 passed.

Suivi RENAMED : issue #19251 ouverte avant merge (mesurer les renommages,
`previousFilename` absent du jeu GraphQL).

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 5, 2026
…d (previous_filename par REST) (#19261)

* feat(ci,#19101): reveiller la branche credited-examples de exercises-advisory (balayage post-mortem)

La branche « exemples credites » posee par #18761 etait **dormante**. Le diff
exige `--base` ET `--pr-body-file` ; sous `schedule` -- seul declencheur qui
subsiste apres la tranche 1 de #12817 -- il n'y a pas de contexte PR, donc
`PR_NUMBER` est vide, donc `PR_BODY_FILE` reste vide, donc le test de
`exercises-advisory.yml` prend la branche sans `--base` et **saute le diff**.
Le label `credited-examples-lost` ne pouvait structurellement pas etre pose.

## Ce que livre la PR

`scripts/notebook_tools/credited_examples_sweep.py` : balayage **post-mortem**
des PRs mergees de la fenetre, rejouant le diff pour chacune avec SA base et
SON body (option 1 de #19101). Cable comme etape du workflow ; l'etape
existante n'est pas touchee.

**Aucun `pull_request` n'est reintroduit** sur ce workflow : c'est la
contrainte explicite de l'issue (le cout du clone par PR est la motivation
d'origine de #12817). Le compromis -- detecter les pertes passees, pas
proteger le merge -- est ecrit dans le module, pas seulement ici.

## Le piege trouve en mesurant

Premiere mesure sur 24 h : **6 « erreurs de diff »** sur 38 PRs. Instruites,
elles venaient toutes du meme cas : `git show <base>:<chemin>` sort en **128**
parce que le carnet n'est pas a ce chemin dans la base.

Ce n'etait pas cosmetique. `credited_diff_errors > 0` **bloque** la pose du
label (#18761) : une erreur structurelle sur un carnet empechait la mesure
reelle des carnets modifies de la meme PR. Un faux positif d'erreur produisait
un faux zero de pertes.

Trois cas separes, qui ne disent pas la meme chose :

  - `ADDED` : neuf, **rien a perdre** par construction (6 des 6 erreurs) ;
  - `RENAMED` : la base est a un **autre chemin**, que `gh pr view --json files`
    n'expose pas (`previousFilename` absent). Non comparable -- et contrairement
    a `ADDED`, un renommage **peut** perdre des exemples : declare NON MESURE,
    jamais « sans perte » ;
  - `DELETED` : exclu, comme le `--diff-filter=d` du workflow.

Les carnets non mesurables sont **nommes** dans le rapport au lieu de
disparaitre : un carnet tu se lirait comme un carnet conforme.

## Mesure

Fenetre de 24 h sur `main`, `--json`, sans `--apply`. Un diff en erreur n'est
PAS un zero mesure (#18761) : le rapport separe « pertes non exemptees = 0 » de
« carnets non mesurables », et n'affirme jamais une couverture que la mesure ne
porte pas.

## Tests

`test_credited_examples_sweep.py` : tout hors ligne (reseau et git injectes).
Le lot de l'API de recherche **au plafond** leve au lieu de passer pour un
compte ; le label ne se pose que si **tous** les diffs ont reussi ; un
`merge-base` indisponible est nomme ; un body illisible est nomme et la PR
ecartee ; un `ADDED` n'est pas mesure ; un `RENAMED` est declare non mesure ET
ne bloque plus les carnets modifies de la meme PR.

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

* fix(ci,#19101): sweep credited — changeType GraphQL, tete de PR, echec non masque

Reponse a la review CHANGES_REQUESTED du 05/10 (5 conditions) :

1. changeType n'existe pas dans gh pr list --json files (mesure gh 2.83.2
   sur #19040 : {additions, deletions, path} seulement). Les fichiers et
   leur nature viennent maintenant de GraphQL (pullRequest.files.nodes
   {path changeType}), pagines au curseur -- le repli « tout MODIFIED »
   classait GameTheory-18d (supprime par #19040) en modifie et levait
   FileNotFoundError, hors de tout garde.
2. check_notebooks recoit head_ref=headRefOid : le cote « apres » est la
   tete de la PR, pas l'arbre du moment du balayage. Le commit est amene
   par fetch-by-SHA s'il manque (PR squash-mergee) ; inatteignable = erreur
   nommee, PR ecartee -- jamais mesuree contre l'arbre du jour.
3. Tests : 17 -> 27. La forme reelle du lot (sans files/changeType) est
   desormais un fixture ; carnet supprime sans crash + carnets modifies
   de la meme PR toujours mesures ; pagination >100 fichiers ; tete
   inatteignable ; propagation de head_ref au check. Falsification :
   3 mutants (branche DELETED retiree, head_ref non passe, pagination
   coupee) -> chacun cuche par au moins un test ; restore vert 27/27.
4. Le masque || echo "::warning::..." du workflow est retire : un plantage
   permanent laissait le run vert chaque nuit (classe de defaut #19214).
   set -euo pipefail ; sans effet merge (schedule/dispatch seulement).
5. Rejou de la mesure 24 h sur le corpus reel : dans le corps de la PR.

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

* fix(ci,#19215): le comptage lit la revision de la PR, et un carnet illisible n'emporte plus le balayage

Review 5411248369, deux voies demandees, les deux faites.

1. `check_notebooks` comptait les exercices sur l'ARBRE DU JOUR
   (`count_exercises_in_notebook(path)`) alors que le diff credite lit deja le
   blob de `head_ref`. Consequence mesuree : #18788 MODIFIE
   ICT-45-InoculationBifurcation-9B, #19153 le RENOMME ensuite -> le chemin est
   MODIFIED mais absent de l'arbre, et le comptage levait un FileNotFoundError
   qui emportait TOUT le balayage (`--hours 72`, rc=1 : les autres PR de la
   fenetre n'etaient pas mesurees). Le comptage porte desormais sur le blob de
   tete, qui existe par construction pour un chemin MODIFIED. La classification
   reste sur le chemin d'origine : `classify_notebook` lit les regles de
   REPERTOIRE, que le fichier temporaire du blob ne porte pas.

   Effet de bord voulu, sur le meme chemin : meme quand le carnet existe dans
   l'arbre, c'est la revision de la PR qui est comptee -- l'ancien code pouvait
   mesurer un arbre different de celui qu'il comparait.

2. Le repli par PR : un echec de `check` est NOMME (« carnet illisible depuis
   l'arbre du jour (FileNotFoundError: ...) -- renomme ou supprime apres
   merge, PR ecartee ») et la suite de la fenetre est mesuree. La portee du
   `except` est etroite (`OSError`, `ValueError`) : un autre type d'echec
   remonte, pour qu'un bug du compteur ne se derobe pas en « carnet renomme ».

Tests : 27 -> 32. Les nouveaux portent sur un depot git REEL (deux commits,
renommage effectif), pas sur un dict injecte : carnet MODIFIED absent de
l'arbre compte depuis le blob (3 exercices) ; l'arbre porte une autre version
(1 exercice) et la tete gagne ; sans `head_ref` l'arbre sert encore
(retro-compatibilite) ; un `check` qui leve est nomme et les autres PR sont
mesurees ; un `RuntimeError` remonte au lieu d'etre absorbe.

Falsification : 3 mutants, 3 rouges -- comptage remis sur l'arbre (2 tests),
repli par PR retire (1), `except` elargi a `Exception` (1). Source restauree,
32 passed.

Suivi RENAMED : issue #19251 ouverte avant merge (mesurer les renommages,
`previousFilename` absent du jeu GraphQL).

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

* feat(ci,#19251): mesurer les carnets RENAMED dans le balayage credited

Le balayage post-mortem des exemples credites (#19101) declarait tout carnet
RENAMED « NON MESURE » faute de connaitre son chemin de base : `previousFilename`
n'etait pas demande au jeu GraphQL. Un `git mv` suivi d'une edition pouvait donc
perdre un exemple credite sans que rien ne le voie.

Le champ est desormais demande (`nodes { path changeType previousFilename }`).
Quand il est present, le renommage est MESURE comme un MODIFIED : le diff
credite lit `base:previousFilename` contre `head:path`. La correspondance passe
par `base_path_of`, consultee en POSIX -- GraphQL rend des `/` et `str(Path)`
des `\` sous Windows : sans la normalisation, la correspondance raterait en
silence et le renommage redeviendrait non mesure (mutant M3).

Quand `previousFilename` manque (renommage sous un seuil de similarite, ou
reponse d'API degradee), le carnet reste nomme NON MESURE -- et surtout, sans
correspondance la base est absente a ce chemin : le diff est en ERREUR, que
#18761 refuse de convertir en label. Jamais un zero silencieux.

Tests 32 -> 37 : le renommage mesure (un exemple credite perdu au `git mv` est
vu), le renommage sans perte (pas de faux positif), et l'absence de zero
silencieux sont epingles sur un depot git REEL ; le contrat de la carte en plus.
Falsification : 4 mutants, 4 rouges -- mapping ignore (M1), `previousFilename`
ignore (M2), cle non normalisee (doublure du bug Windows, M3), diff en erreur
converti en zero silencieux (M4) ; source restauree, 37 passed.

Au passage, les appels `subprocess` des tests touchés portent `encoding="utf-8",
errors="replace"` (garde #13140/#12811 : un hôte cp1252 leve sur un payload UTF-8).

Closes #19251

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

* fix(ci,#19251): le chemin de base d'un renommage est cote REST, pas GraphQL

Correction du commit precedent, dont l'hypothese etait fausse et que le rejeu
`--hours 72` a demasquee : `previousFilename` N'EXISTE PAS sur le type GraphQL
`PullRequestChangedFile`. Mesure, serveur :

    Field 'previousFilename' doesn't exist on type 'PullRequestChangedFile'

Ses champs sont `additions, changeType, deletions, path, viewerViewedState`
(verifie par introspection). Demander le champ faisait echouer TOUTES les
lectures de fichiers : `--hours 72` rendait « 0 PR mesuree, 309 replis nommes »
au lieu des 2 PR / 4 pertes de la veille -- une regression, pas un progres.

Le classement reste donc en GraphQL (`changeType`), et le chemin de base est lu
par une SECONDE source, REST : `pulls/{n}/files`, champ `previous_filename`
(verifie sur #19153 : ICT-45 -> ICT-42b). Cette passe n'est faite que si la PR
porte au moins un renommage, et son echec laisse le renommage NON MESURE
(`previousFilename` rendu `""`) au lieu de le mesurer contre un mauvais chemin.

Tests 37 -> 40 : la passe REST enrichit un noeud RENAMED, elle est sautee quand
rien n'est renomme, et son echec ne casse rien. Falsification : 5 mutants, tous
rouges (dont M5 : passe REST supprimee).

Closes #19251

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

* docs(ci,#19251): le docstring de tete annonce trois sources, pas deux

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige deleted the feature/14032-gt28-consolidation branch October 7, 2026 07:44
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) paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants