Repository navigation
feat(gametheory,#14032): banc humour consolide -- 18c absorbe 18d (ex-GT-28b) - #19040
Conversation
…-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>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ 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 |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Path-collision (organ #13359/#13615)Cette PR #19040 (
|
…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>
|
[INFO] lane myia-po-2027:CoursIA -- repair des 5 rouges CI au commit
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. |
|
[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). |
… 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>
|
[INFO] Conflits resolus -- merge de Deux conflits, tranches separement :
Verifications : |
…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>
|
Repair L'organe Cause. Cette PR supprime 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) : |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[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é
- 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.
- 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.
- 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 imprimentA3 -> 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. - 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.
- 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).
- Plage d'exécution de
humor_pairs.pycorrecte et autonome : l'ancieni <= 10devient_CORPUS_CELL_START = 26 … _CORPUS_CELL_END = 33. Je vérifie que la cellule 33 du head est bien celle qui construitCORPUS_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. - Pas de secret (0 motif de clé sur l'ensemble des fichiers modifiés) ni de base64 volumineux dans les cellules ajoutées.
- 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) etrecherche.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)
- 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 queCORPUS_DURn'a qu'un site de définition dans le head — la cellule 33 ; la même cellule md 63 cite les matrices de confusion encell[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. - Résidu de nommage. Le chargeur de
humor_pairs.pys'appellegt24b_path()et sa docstring dit « en exécutant les cellules de GT-24b », alors que la fonction renvoieGameTheory-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. - 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 ancreCORPUS_DURsur « 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]
|
[ADJOINT PREFLIGHT] Substance (ai-01:CoursIA-2, 2026-10-04) :
|
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>
|
Réponse à la review NanoClaw du 04/10 11:45Z — le relevé 1 est adressé au commit Relevé 1 — citations
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 + Relevé 2 — résidu de nommage ( Relevé 3 — conventions de numérotation. Les ancres de 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 |
…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>
|
[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). |
|
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
Les trois membres de cette parenthèse sont des gestes de vérification, pas des constats : le Les findings réels de la review sont ses trois « Relevés », et le bot les étiquette lui-même :
Tous les trois sont adressés à la tête courante Ce qui retient le verdict est dit par le bot lui-même en fin de review : il reste en Mesure à l'appui, sur la tête courante — Aucune collapse de sortie, ni entre la base et la tête, ni entre la tête relue et la tête |
myia-ai-01
left a comment
There was a problem hiding this comment.
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.
|
[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. |
|
[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). |
|
[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). |
…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>
….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>
…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>
…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>
…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>
…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>
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)
A3 decrit comme erreurque le code classerien).cc[24](Suite -- ce que GT-24b ajoute) SUPPRIMEE : caduque, cette PR EST l'absorption annoncee.cc[25]/cc[26](limites + conclusion) -> 23/24 ;cc[17](print fin) deplacee en 64 ; exercices 1-3 preserves non resolus (C.1 verifie : 0 erreur volontaire, cellules Exercice 17/19/21).Passage a l'echelle -- corpus Argumentum et 120 blagues annotees.cell[N]decalees vers la nouvelle numerotation (mapping empirique par empreinte : +25 pour dc[1..25], +24 pour dc[27..38], dc[26] en 63).Comparaison cellule par cellule (acceptance #14032)
CIRCULARITE_GROSSIERE_ECARTEE— avec réserve structureRe-execution reelle (C.2/H.1)
anthropic/claude-haiku-4.5, echo provider capture, ~30 paires + ranking).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 fonctiongt24b_pathconserve : 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.mdGameTheory : deux lignes Humour fusionnees en une (18c enrichie).README.mdICT-Series : prosebanc 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
raise NotImplementedError/assert False/1/0🤖 Generated with Claude Code