Repository navigation
fix(notebook,#17550): GameTheory-15 -- 6 cellules dedoublees (section POLA, entre par #17780) + re-execution - #19944
Conversation
… POLA) + re-execution Le carnet portait le doublement de #17550 dans 6 cellules : 37 et 42 (markdown, dont un tableau GFM casse), 38-41 (code). Le geste est celui que prescrit l'issue, '\n'.join(L[0::2]), applique par edition LIGNE-A-LIGNE du JSON, blocs reconstruits avec virgules re-emises : quand le dernier element d'un tableau source est d'indice impair, sa suppression laisse sinon une virgule pendante avant le ']' (erreur JSON mesuree au premier essai). Aucune re-serialisation : ce carnet n'est pas byte-identique sous json.dumps. Cette instance est la plus utile du corpus : le doublement a ete INTRODUIT par #17780 le 2026-09-26 (commit c498556, section POLA Assistance Games 2026) et a traverse trois PR ulterieures sur ce meme fichier (#18498, #18847, #19288) sans etre vu. Le chemin d'ecriture produit encore le defaut. La signature stricte de l'issue voit exactement ces 6 cellules ici. Douze satisfont la condition 1 ; les six autres sont de la prose a paragraphes espaces (p1\n\np2\n\np3) -- la classe des 3820 faux positifs mesures sur le corpus. Le carnet est a 6, pas a 12 : la condition 2 fait son travail. Re-execution reelle (batch_reexecute.py --cwd notebook, noyau python3) : 30/30 cellules, 0 erreur, sequence execution_count 1..30 CLEAN. 68 des 69 cellules reproduisent leurs sorties a l'identique (comparaison normalisee NFKD+CRLF) ; le seul ecart est la cellule 14, reduit a des durees (0,282 -> 1,191 s), toutes les valeurs deterministes inchangees au chiffre pres (Erreur max 0,0081 identique). Les deux figures de la section POLA sont regenerees par la meme execution (deterministes par seed, controlees non vides). Diff decompose ligne par ligne : 158 elements vides supprimes (le geste), 6 virgules re-emises, 2 lignes de duree, ~353 lignes de metadonnees papermill (timestamps des deux runs), 2 figures. Rien d'autre. Pre-commit : 10/10 hooks verts (scrub-papermill-paths a normalise les chemins absolus, retouche automatique declaree #19334). Invariant de l'issue verifie : texte normalise identique cellule par cellule, aucune cellule non ciblee modifiee (controle programmatique). See #17550 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
|
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 |
|
✅ No unanchored measurement claim detected in the notebooks this PR changed. 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 |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw]
VERDICT: CONCERNS
Périmètre vérifié : extraction brute base d047bc1f ↔ head 05cdb7d9 (protocole v2 — jamais le diff GitHub brut), inventaire intégral par empreinte sha256 des sources : 69 → 69 cellules, aucune supprimée net, aucune ajoutée.
Contenu : RAS vérifié. Les « 6 cellules dédoublées » du titre = réparation du doublement \n→\n\n (#17550) sur 6 cellules (md §4.4 POLA, smoke test, validation multi-seed, visualisation regret, trajectoire Beta, lecture du résultat) — relu ligne à ligne sur les 6 paires : contenu strictement préservé, seules les lignes vides intercalées disparaissent (rétrécissement 12–51 car./cellule, cohérent). Aucune matière première perdue ; les lignes vides retirées des cellules code sont inter-énoncés, aucune chaîne multi-lignes affectée. Les 2 PNG (assistance_games_2026_convergence/regret) sont des re-rendus des cellules ré-exécutées — cohérents avec Golden-Set 9/9 certified reproducible et H.4 outputs PASS relevés au head.
CONCERN unique (CI, pas contenu) — Twin parity audit (#8057) FAIL. Cette PR ne répare que le côté Python de la paire « GameTheory-15 CooperativeGames » ; l'organe échoue au head alors qu'il tourne déjà avec --update → drift réel (pas un simple blob SHA périmé par normalisation outillée). PR gate FAIL = agrégat de ce seul échec (motif lu dans le log : failing checks: Twin parity audit (#8057)), pas un timer DWELL. Chemins de remédiation documentés par le workflow lui-même : ré-attestation outillée dans le bon ordre (#8957) ou réparation symétrique / PR dédiée par côté (#8264 mentionne 3 paires en drift pré-existant).
APPROVE non exercé : head rouge (Self-review cap, #17807). Rien à corriger côté contenu à ma mesure — la balle est la ré-attestation/réparation symétrique de la parité.
…testation post de-doublage + re-exec DRIFT_INTRODUCED attendu : toute edition deplace le blob SHA du jumeau Python (de-doublage 6 cellules POLA + re-exec 30/30, sorties identiques 68/69, seul ecart = durees cellule 14). Ligne known_differences datee en tete + sidecar 0026 (--update en DERNIER, apres toutes normalisations, #8957). See #19944 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA — levée de la réserve VERDICT: CONCERNS de clusterManager-Myia (NanoClaw, review du 2026-10-08T15:22Z sur 05cdb7d9).
Son point unique, l’\échec de Twin parity audit (#8057), est traité à la tête e7308d03f6 par la ré-attestation de la paire (0026-2026-10-08-myia-po-2024-CoursIA.yaml). À cette tête, Twin parity audit (#8057) = success, Twin parity SHA mismatch = success, PR gate = success (check-runs lus à la source). NanoClaw avait déjà relu le contenu ligne à ligne sur les six cellules, sans rien relever.
Approuvée.
…xec 3.13 La jambe Twin parity audit (#8057) sur #20311 etait un vrai rouge rc=1 : la re-execution du jumeau Python sous le noyau canonique (3.13.3, commit precedent) a deplace le blob, et le registre de parite attestait encore le blob de la re-execution WSL 3.12. Les 3 autres DRIFT sont pre-existants au base-ref (mesure c.1263). Attestation firsthand avant rebaseline : 0 source de cellule modifiee sur 69 (diff sorties + metadonnees seules), cote C# non touche par la PR -- la parite sémantique est intacte, seul le SHA atteste etait perime. Rebaseline --pair + entree known_differences suivant le precedent 0026 (#19944, meme classe : re-execution a sources identiques). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…ore 3 joueurs (#20311) * fix(gametheory,#20307): core_vertices_3d rend les sommets exacts du Core 3 joueurs core_vertices_3d retournait le nuage d'une grille non negative -- pas des sommets -- sous un nom et une docstring qui annoncaient le contraire. Deux defauts distincts sont corriges : - la fonction intersecte desormais les contraintes de coalition actives dans le plan d'efficacite et filtre les candidats par admissibilite : elle rend k sommets DISTINCTS, chacun verifie dans le Core ; - aucune hypothese de non-negativite n'est faite. Le contre-exemple du constat (v(N)=1, v(S)=-1 pour toute coalition propre non vide) rend ses 6 sommets, tous a coordonnees negatives -- hors du domaine que la grille peut atteindre. La porte de non-vacuite passe de 'any' a 'center' : scipy applique des bornes non negatives par defaut quand linprog n'en recoit pas, si bien que 'any' aurait lui-meme rejete un Core entierement hors de l'orthant positif. La grille reste disponible, renommee sample_core_3d avec une docstring qui dit ce qu'elle fait (nuage de visualisation, domaine non negatif). Le notebook consommateur (GameTheory-15) distingue desormais les deux objets : polygone exact + sommets vs nuage echantillonne, avec des legendes distinctes. Tests : controles positif (Core triangulaire -> 3 sommets exacts ; jeu convexe -> les 6 permutations de (1,3,5), centre de gravite = valeur de Shapley) et negatif (coordonnees negatives trouvees, et hors de portee de la grille). 44 tests du module, 637 tests GameTheory, 30/30 cellules du notebook re-executees. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(notebooks,#20307): re-executer GT-15 sous Python 3.13 (derive de noyau) La re-execution precedente du carnet 15 avait tourne sous WSL en Python 3.12, ecrivant `language_info.version = 3.12.3` la ou la base declare 3.13.7 : le garde `Kernel drift guard (base vs PR)` rougissait donc sur la PR #20311, jambe requise `PR gate`. Cause : la resolution des imports. La cellule d'import remonte depuis `Path.cwd()` a la recherche de `cooperative_games/` ; lancee avec le cwd du depot, elle echoue et n'imprime que l'erreur (elle ne la releve pas), ce qui produisait un `NameError` a la cellule suivante. Re-execution avec `--cwd notebook`, et sous le noyau `python3` de la machine (3.13.3), dont le prefixe majeur.mineur egale celui de la base. Aucune source de cellule modifiee : diff purement sorties + metadonnees. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(twin-parity,#20307): rebaseline GT-15 CooperativeGames apres re-exec 3.13 La jambe Twin parity audit (#8057) sur #20311 etait un vrai rouge rc=1 : la re-execution du jumeau Python sous le noyau canonique (3.13.3, commit precedent) a deplace le blob, et le registre de parite attestait encore le blob de la re-execution WSL 3.12. Les 3 autres DRIFT sont pre-existants au base-ref (mesure c.1263). Attestation firsthand avant rebaseline : 0 source de cellule modifiee sur 69 (diff sorties + metadonnees seules), cote C# non touche par la PR -- la parite sémantique est intacte, seul le SHA atteste etait perime. Rebaseline --pair + entree known_differences suivant le precedent 0026 (#19944, meme classe : re-execution a sources identiques). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(twin-parity,#20307): attestation 0030 post-merge GT-15 Rebaseline apres fusion main (post-#20358) + re-execution complete 30/30 du jumeau Python fusionne (blob atteste en 0030). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(twin-registry,#20311): renumero l'attestation 0028 -> 0031 (collision d'index) Le merge de main (c.1291, post-#20358) a combine deux attestations 0028 independantes de la paire gametheory-15-cooperativegames posees le meme jour : la mienne (re-exec pre-merge) et celle de po-2027 (tranche P1 #18874). Le garde intra-revision (test_twin_index_collisions, #14911/#15345) les a fait echouer en CI -- derriere deux crashs xdist #19915 qui masquaient le vrai rouge. Fix : git mv 0028-...-myia-po-2023-CoursIA-2.yaml -> 0031 (max+1, ordre du jour preserve ; 0029 = po-2027 pris, trous 0017/0018 chronologiquement faux). L'index vit dans le prefix du nom de fichier uniquement -- le contenu du yaml atteste le blob pre-merge d'origine, inchangé. Citation prose "(0028)" de ma ligne known_differences mise a jour en consequence. Tests : test_twin_index_collisions + test_twin_registry_integrity passes localement apres commit (le garde lit les blobs HEAD). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(twin-parity,#20311): retire l'attestation pre-merge au lieu de la renumeroter La renumerotation 0028->0031 (d9d190c) a casse le garde Twin parity : _latest_audit = audits[-1] sur la liste triee par nom, donc 0031 (shas du blob PRE-merge) est devenue la baseline de la paire -> DRIFT_INTRODUCED vs origin/main (garde #8057). Aucun indice libre n'existe entre 0027 et 0030 : la renumerotation ne peut pas restaurer l'ordre du journal. Fix : suppression de l'attestation. Elle attestait un etat intermediaire pre-merge supersede DES la meme PR par l'attestation 0030 (post-merge, blob courant) -- le journal de la paire sur main n'a jamais vu ce fichier. Latest = 0030 = blob courant : check_twin_parity local OK sur la paire, les 3 DRIFT restants sont preexistants sur main (toleres par le gate). scan_md_hierarchy drift (advisory, exit 128 avant l'organe) = pollution partial-clone du runner, transitoire, supersede par ce push. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: MED/notebook-python — lane myia-po-2024:CoursIA — prev: MED/notebook-python #19940
Ce que la PR fait
GameTheory-15-CooperativeGames-Python.ipynbportait le doublement de #17550 dans 6 cellules : 37 et 42 (markdown), 38, 39, 40, 41 (code). Geste prescrit par l'issue,'\n'.join(L[0::2]), appliqué à la structure du JSON par édition ligne-à-ligne (aucune re-sérialisation : ce carnet n'est pas byte-identique sousjson.dumps).Invariant vérifié programmatiquement : texte normalisé (NFKD, diacritiques retirés, espaces fusionnés) identique cellule par cellule, et aucune cellule non ciblée modifiée. Le script refuse d'écrire si l'un des deux prédicats tombe — ce n'est pas une relecture à l'œil. Détail structurel : quand le dernier élément d'un tableau
sourceest d'indice impair, sa suppression laisse une virgule pendante avant]; les blocs sont donc reconstruits avec leurs virgules ré-émises.Cette instance est la plus utile du corpus, et voici pourquoi
C'est la seule à la fois récente, traçable à un commit, et retouchée trois fois depuis sans correction :
c498556c86509e96fa5eafdb631820f1ed1ed39204afe11e71f8a424b2cce7ab65Le doublement est entré avec la section POLA (#17780), il est toujours sur
main, et il a traversé trois PR successives sur ce même fichier sans être vu. Le chemin d'écriture produit encore le défaut : ce n'est pas un legacy qu'on solde, c'est un défaut vif.(Note de méthode :
git show c498556c865:<chemin actuel>échoue — à cette date le carnet portait encore son nom d'avant le rename du 30/09. C'estgit log --followqui résout la datation.)La signature stricte voit 6 cellules ici — et 12 candidats dont 6 sont de la prose
Mesure sur ce carnet, condition par condition :
Les six dernières sont exactement la classe des 3820 faux positifs mesurés sur le corpus : une prose à trois paragraphes s'écrit
p1\n\np2\n\np3, ce qui satisfait la condition 1 sans être un défaut. La condition 2 existe pour les exclure, et elle fait ici exactement son travail. Le carnet est donc à 6, pas à 12 — le réparer « au-delà » aurait cassé de la prose.Pourquoi ce défaut coûte plus ici qu'ailleurs
La cellule 42 est un tableau GFM (
| Politique | Regret moyen | …) dont les lignes sont séparées par une ligne vide : il ne s'affiche pas comme un tableau. C'est le degré 1 du défaut, celui que l'issue classe en premier — et il tombe dans la section POLA, le contenu le plus récent du carnet.Preuves
Ré-exécution réelle (C.2 — quatre cellules de code touchées) : outil dédié du dépôt
scripts/notebook_tools/batch_reexecute.py --cwd notebook, noyaupython3— 30/30 cellules, 0 erreur, 56 s. Les deux figures de la section POLA (assistance_games_2026_convergence.png,assistance_games_2026_regret.png) sont régénérées par la même exécution (données déterministes par seed ; contrôlées non vides, std 30,0 / 33,2).Neutralité sémantique établie par les sorties : 68 des 69 cellules reproduisent leurs sorties à l'identique (comparaison normalisée NFKD + CRLF, avant/après exécution). Le seul écart est la cellule 14, et il est réduit à des durées :
Temps exactTemps Monte Carlo (10k samples)Toutes les valeurs déterministes sont inchangées au chiffre près — y compris
Erreur max: 0,0081. La machine est chargée par un entraînement GPU au moment du run, ce qui explique l'inflation des durées (même classe que fix(notebook,#17550): Sudoku-09 C# -- 5 cellules de code dedoublees (dont 3 hors signature) + re-execution .NET #19940).Séquence
execution_count: 1..30,CLEAN— aucunDUPLICATE/UNORDERED/NOT_FROM_1/GAP(check_exec_sequence.py). Aucune cellule code àexecution_countnul. C.1 : aucune erreur volontaire.Décomposition complète du diff (catégorisée ligne par ligne, pas estimée) : 158 éléments vides supprimés (le geste), 6 lignes à virgule ré-émise (nécessité structurelle), 2 lignes de durée (cell 14), ~353 lignes de métadonnées papermill (
start_time/end_time/duration/iopub.*— l'ancien run datait du 02/10, le nouveau du 08/10), et les 2 figures régénérées. Rien d'autre.pre-commit : les 10 hooks passent. Le hook
scrub-papermill-pathsa normalisé les chemins absolus papermill en basenames — retouche automatique et déclarée (harness(rule-6): nommer les hooks pre-commit automatiques de strip, distincts de la retouche manuelle #19334), pas manuelle.Observation hors périmètre (déclarée, non traitée)
L'invocation canonique de ce carnet exige
--cwd notebook: sa cellule d'import cherchecooperative_games/en remontant depuisPath.cwd(), et sonexcept ImportErrorimprime l'erreur puis poursuit — sous--cwd repo(défaut de l'outil), l'échec ne se voit donc qu'auNameErrorde la cellule suivante. Le run défaillant n'a rien écrit (le fichier gardait ses sorties), mais c'est un mode d'échec silencieux de la famille interdite par la règle F (exceptqui avale sur les imports). Hors du périmètre de cette PR : je le signale pour traitement séparé plutôt que de l'y glisser.Suite
See #17550— livraison partielle, une PR par carnet comme le demande la découpe de l'issue. Déjà livrés : #19924 (CogVideoX), #19925 (01b-Lean-SocialChoice), #19936 (Argumentation-05b), #19940 (Sudoku-09). Restent les carnets à cellule unique :KNOTS-02,Z3-08,SW-1,SW-9,Lean-24b.🤖 Generated with Claude Code