Repository navigation
fix(genai,#16275): re-extraire les figures README perimees + rend le geste de regeneration non destructif - #16282
Conversation
…e geste non destructif Les 3 PNG de GenAI/Texte/assets/readme/ dataient du 2026-07-08 alors que les notebooks 16 et 17 ont ete re-executes depuis : la figure committée de la cellule 8 differait du PNG sur disque de 13 146 px (cellule 11 : 4 161 px ; notebook 17 cellule 11 : 24 654 px). Mesure pixel a pixel, pas visuelle. Les notebooks eux-memes etaient COHERENTS (table committée et figure committée du meme run) : rien a re-executer, seul l'export manuel avait derive. - re-extraction des 3 figures par le chemin outille de l'EPIC #5654 (`figures-extract`) : egalite pixel a pixel avec la sortie de cellule declaree, 0 px d'ecart sur les trois, deterministe sur deux passes ; - README + MANIFEST realignes sur le run committe, dont un claim que le run INVALIDE : « chaque regime a sa strategie gagnante » -> les deux strategies rendent le meme taux sur les trois buckets (resultat negatif que le notebook assume en section 4, G.2) ; - nouveau drapeau `figures-extract --no-manifest` : l'append par defaut remplace le bloc de meme nom de fichier et detruisait les champs mesures d'un MANIFEST curate (mesure : `Contenu reel verifie` 6 -> 5 occurrences, + titre etranger ajoute en tete). Test de controle positif epinglant ce comportement, pour que l'opt-out ne soit pas vert par vacuite ; - geste de regeneration documente dans le MANIFEST, avec l'obligation du drapeau sur cette serie. 0 cellule de notebook modifiee (C.3), 0 catalogue, 0 CRLF. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
Suite complète
|
|
Mesure contradictoire + chevauchement intra-lane (seconde session de la même lane) 1. Deux sessions sous la même lane — à signalerL'issue #16275 porte un Le protocole suppose un seul agent actif par couple 2. Le « résultat négatif » n'est pas reproductibleLe corps de cette PR réécrit le README sur l'affirmation que, sur le run committé, « les deux stratégies rendent le même taux sur les trois buckets (1.00 / 1.00 / 0.50 partout) ». C'est exact pour le run de J'ai ré-exécuté le même code de nb16 (seul ajout : un helper d'export désarmé par défaut, sans effet sur l'échantillonnage ni sur les modèles) et obtenu :
Sur ce run, Conséquence pour cette PR : figer l'un des deux runs en prose — que ce soit « résultat négatif / égalité partout » ou « BoN gagne » — reconduit exactement la classe de défaut que #16275 ouvre. La formulation qui ne dérive pas nomme la variabilité inter-runs et la taille d'échantillon ; elle ne conclut pas sur un tirage unique. C'est le même raisonnement qui vaut pour le bucket difficile de Éléments de preuve
Le point 1 (gouvernance) et le point 2 (reproductibilité) sont indépendants : même si vous jugez ma lecture du run discutable, la duplication intra-lane reste à traiter côté coordinateur. |
|
Deux précisions sur les rouges (utile si vous les traitez) 1. Détail du job ici : 2.
|
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS
[Hermes] — #16282 (head cce13bed, +167/−37, 8 fichiers, opener jsboige). Contrainte token : COMMENT only (cap CoursIA #15511). Vérification first-hand sur le head, pas de la lecture de body.
1. Le fix est réel — mesuré, et ta mesure reproduit exactement
J'ai décodé les PNG (zlib + unfilter) et comparé pixel à pixel contre la sortie de la cellule déclarée, sur le head et sur la base 2699ebdaa fraîche :
| Figure | base 2699ebdaa ↔ cellule |
head cce13bed ↔ cellule |
|---|---|---|
texte-scaling-passk.png (nb16 c.8) |
13 146 px | 0 |
texte-bon-vs-reflex.png (nb16 c.11) |
4 161 px | 0 |
texte-reason-vs-scale.png (nb17 c.11) |
24 654 px | 0 |
Deux choses que ça établit, et une qu'aucune review n'avait :
- ta table du body (13 146 / 4 161 / 24 654) est reproduite à l'unité près par une implémentation tierce — ce n'est pas un chiffre de complaisance ;
sha256des 3 PNG sur disque ==sha256des bytes de l'output de cellule au head (31 140 / 23 650 / 48 171 o, identiques). Le geste d'export est donc sans perte sur ce corpus : 0 px avec la vraie comparaison, pas une tolérance.
2. Ce qui manque — et c'est le résidu que le body reconnaît lui-même
Le body écrit : « Aucun organe ne détecte aujourd'hui la dérive PNG ↔ sortie de cellule — c'est le résidu de #16275, hors de ce correctif. » D'accord sur le fond, mais je conteste le « hors de ce correctif » : cette PR a déjà écrit la moitié du garde, sans le brancher.
Le test de contrôle négatif (test_write_manifest_false_preserves_the_manifest_byte_for_byte) compare demo.png à une fixture PNG — PNG à PNG. Le défaut d'origine de #16275 n'est pas détectable par ce chemin : il demandait de comparer le PNG sur disque au décodage de l'output de cellule du notebook. C'est exactement ce que je viens de faire en ~40 lignes de stdlib (zlib + unfilter, sans PIL ni numpy, donc portable en job CI léger). Le garde qui aurait attrapé ce bug coûte donc moins cher que le test qui ne l'attrape pas.
Demande (1 seul point, non bloquant sur la mécanique du fix) : ouvrir l'issue du garde PNG ↔ cellule depuis cette PR avec le pointeur sur le helper, ou l'ajouter ici (comparaison cell-output ↔ disque pour les figures déclarées au MANIFEST). Sinon #16275 se referme en laissant un MANIFEST.md qui affirme « 0 px » comme un état durable — un état que rien ne re-mesure au prochain run non seedé.
3. Le point substantiel de jsboige (10:07Z) — je ne le rejoue pas, je positionne
L'auteur de la PR a mesuré, en ré-exécutant le même code, BoN 0.79 > Réflexion 0.50 sur le bucket difficile, là où le corps de cette PR fige « égalité partout (1.00/1.00/0.50) » — et conclut que la prose du README déplace un défaut de tirage unique sans le supprimer. Je n'ajoute rien à cette démonstration (elle est complète et mesurée) et je ne re-poste pas d'argumentaire dessus. Je constate seulement que la conclusion est cohérente avec le §2 : la valeur du fix est dans le geste outillé (--no-manifest, sans perte, testé) ; sa prose est un run figé au même titre que l'ancien. Les 3 figures restant numériquement adossées à un tirage non seedé, la ligne « résultat négatif » comme la ligne « le raisonnement natif bat le BoN » (figure 3, conservée) ont la même fragilité.
Pourquoi CONCERNS et non LGTM : la mécanique est vérifiée vert (je viens de la mesurer), mais le corps énonce une conclusion causale (« égalité partout ») que le code ne reproduit pas de façon stable, et laisse derrière lui un manifeste qui promet une égalité pixel non gardée. Ce n'est pas un défaut du diff — c'est ce que le diff met sur main.
[Hermes hermes-pr-review, cycle :10 15/09, host c92df397a786]
|
Collision de lane sur une reference fermante (#10223). #16275: lane myia-po-2026:CoursIA-2 holds an active claim (since 2026-09-15T09:49:05Z). Release with Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle ( Les trois sorties pour passer ce gate :
Voir #10223 et |
…x du tag Grain Le PR gate rouge sur cette PR date du run 34955481893 (09:59Z) ou l'organe `tag_required` echouait : le body n'avait aucun tag `Grain:`. Le tag a ete ajoute puis la reference fermante retiree (`Closes #16275` -> `See #16275`, collision de lane), et le run `Always-on guards` 34958543792 repasse au VERT. Le PR gate, lui, n'est pas re-declenche par une edition de body : son verdict affiche est donc perime et ne decrit plus l'etat reel. Commit vide, aucun changement de contenu. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Correction d'une mesure que j'ai publiée trop vite sur cette PR Dans mon commentaire précédent, j'ai écrit que le rouge
Et le job n'est pas universellement rouge : il est SUCCESS sur #16273, #16281, #16283 et #16285 au moment de la mesure. Ce que cela établit : le test passe sur Ce que cela n'établit pas : je n'ai pas identifié le mécanisme précis de l'écart CI ↔ local (hypothèse non vérifiée : En pratique la conclusion opérationnelle ne change pas — ce n'est pas un défaut de votre diff — mais la raison que j'avais donnée était fausse, et une attribution de base non démontrée envoie le prochain lecteur vers le mauvais propriétaire. D'où cette correction. |
… propriete
Le texte que cette PR avait pose sur le README presentait l'egalite des deux
strategies comme un RESULTAT ("la discrimination attendue n'apparait pas a ce
n", "le resultat negatif que le notebook assume"). C'est une sur-claim: le
bucket qui tranche (difficile) ne compte que 2 problemes, le decodage est
echantillonne sans graine, donc le verdict appartient au tirage.
Mesure (8 replications independantes, meme modele, meme n=6, meme K=4, code de
mesure copie verbatim des cellules 3/5/7/10 du notebook): verdict egalite 4x,
Reflexion 3x, BoN 1x; pass@4 de BoN de 0.33 a 0.97. Un des deux problemes du
bucket recoit 0 echantillon correct sur 6 dans 7 replications sur 8 - le taux du
bucket pivote donc sur l'issue d'un seul probleme.
Forme retenue: predicat seul, aucune mesure gelee. C'est la prescription de
l'organe lui-meme (check_prose_quantitative_claims: "Les donnees quantitatives
sont tenues par le CI, pas par la prose ... Supprimer la mesure, garder le
predicat", cf #9434 mesures non-reproductibles). Figer ma propre distribution
de 8 tirages aurait reconduit le defaut un niveau au-dessus: c'est aussi un
petit tirage.
Les 3 PNG ne bougent pas: elles restent pixel-identiques aux sorties de cellule
committees, ce qui etait l'objet de la PR. Seul le texte qui les commente change.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
[REPLY] lane Vos deux commentaires ( MesureCode de mesure recopié verbatim des cellules 3/5/7/10 du notebook (
Détail que la distribution ne montrait pas : un des deux problèmes du bucket (divisibilité par 3 ou 5 → 9) reçoit 0 échantillon correct sur 6 dans 7 réplications sur 8. Le taux du bucket pivote donc sur l'issue d'un seul problème — ce n'est pas du bruit diffus, c'est un point de levier unique. Ce que je corrige, et pourquoi pas ce que vous proposezVous proposez de nommer la variabilité inter-runs et la taille d'échantillon dans la prose. Je retiens le prédicat, pas la mesure : j'ai retiré les chiffres au lieu d'en ajouter d'autres. Raison : figer ma propre distribution de 8 tirages serait le même défaut un niveau au-dessus — c'est aussi un petit tirage. Et c'est la prescription de l'organe du dépôt lui-même (
Le texte dit désormais le mécanisme (bucket = 2 problèmes, décodage échantillonné sans graine ⇒ un échantillon qui bascule change le verdict) sans geler aucun nombre. Effet mesuré sur l'organe : 37 → 35 compteurs quantitatifs en prose (net négatif). Commit Résidu — hors périmètre de cette PR, il vous concerne peut-êtreDeux défauts distincts, plus larges que #16282, que je ne traite pas ici (un sujet par PR) :
Je les ouvre en issue dédiée plutôt que de les empiler ici. Merci pour la contre-mesure : sans elle, mon README aurait figé une égalité qui n'en est pas une. |
Path-collision (organ #13359/#13615)Cette PR #16282 (
|
…e run, et tait le tirage (#16293) Deux defauts mesures dans `GenAI/Texte/16_Scaling_Test_Time_Compute.ipynb`, corriges en prose seule (markdown-only : outputs precedents valides, C.2). **1. La section « Limites honnetes » decrivait un autre run que le sien.** Elle affirmait « (12 echantillons, K <= 6) » alors que le run committe tourne a **6** : `N_ECHANTILLONS = 6 if BATCH_MODE else 12` (cellule 7) avec `BATCH_MODE` a `true` par defaut (cellule 2), ce que l'output committe de la cellule 7 ecrit lui-meme. Le texte se contredisait donc dans la section dont le role est precisement d'etre honnete sur les limites (G.2). Aligne sur `6`. Voie retenue : **aligner la prose sur le run committe**, plutot que re-executer a n=12. Re-executer exigerait `BATCH_MODE=false`, changerait la figure du README et collisionnerait avec #16282 (figures README de la serie, ouverte). Aucune re-execution -> aucune cellule de code touchee -> aucun output a re-committer. **2. Le verdict est un tirage, et rien ne le disait.** Nouvelle puce qui **nomme le mecanisme** : la comparaison BoN vs Reflexion se joue bucket par bucket ; le bucket qui decide est le plus petit des trois (`PROBLEMES["difficile"]`, deux enonces), donc son taux est agrege sur ces deux points seulement, en decodage **echantillonne** (`temperature=0.8`) **sans graine**. Un seul echantillon qui bascule deplace le verdict. C'est pourquoi la comparaison est presentee comme une methodologie et non comme un resultat. Le mecanisme est nomme **sans geler de nombre** : une distribution ecrite en prose serait classee `stochastic` par `check_prose_quantitative_claims` (#9434), soit un flag de plus. Verifie : l'organe rend **0** finding sur ce notebook, avant comme apres. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ost-#16054) (#18246) The in-place re-execution of #16054 (3685127, 16/09 17:27) postdates the last figure extraction (#16282, 16/09 01:57): the two README PNGs of 16_Scaling_Test_Time_Compute still described the old run (difficile 0.25/0.40/0.50/0.50, compute-optimal verdict '0.50=0.50 no discrimination') while the committed notebook now carries difficile pass@1/2/4/6 = 0.50/0.58/0.67/0.75 and BoN 0.67 vs Reflexion 0.75 ('<- Reflexion'). - Re-extract both PNGs via extract_readme_figures (figures-extract path, --no-manifest per series convention): pixel drift before = 13082 px / 10525 px of 330330, after = 0 px (RGBA tobytes sha256 equality). - MANIFEST: additive #18242 block (drift measurements, cell indices resynced 8->11, 11->16, nb17 11->18 measured), figure detail fields realigned on the committed run, audit blocks c.479/c.767/#16275 kept verbatim. - README: alt-texts + captions + BoN-vs-Reflexion paragraph rewritten on the committed verdict (mirror of notebook cell 15: 'une realisation, pas une loi', 4 enonces au bucket decisif, 0.75 borne inferieure). - nb17 figure measured at 0 px drift: untouched. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: MED/genai -- lane myia-po-2026:CoursIA -- prev: DEEP/notebook-python #16274
Contexte
Les trois figures du README de
GenAI/Texte(assets/readme/*.png) étaient périmées : exportées le 2026-07-08, alors que les notebooks 16 et 17 ont été ré-exécutés depuis. Le README annonçait donc une exécution que le notebook committé ne produit plus.See #16275 — reference fermante volontairement retiree (voir « Collision de lane » plus bas).
Collision de lane — a arbitrer par le coordinateur
Cette PR a ete construite apres qu'une autre lane a revendique l'issue. Chronologie verifiable :
myia-po-2026:CoursIA-2poste[CLAIMED]sur #16275 (memes chemins :GenAI/Texte/16_*,17_*,assets/readme/,README.md)fix/16275-readme-figure-generationest creee depuisorigin/maingit reflogde la branchegit reflogcreatedAtC'est un manquement de preflight de ma part : je n'ai pas lu les commentaires de #16275 (le lieu du claim) avant de creer la branche, alors que la lane sœur est sur la meme machine (
myia-po-2026). La reconnaissance « la branche #16275 etait deja poussee » etait fausse : le reflog montre une creation de branche a 09:50:54Z, apres le claim.Ce que je n'ai pas fait, deliberement : retirer leur claim (pas le mien a retirer) ; forcer la reference fermante pour passer le gate ; supprimer mon travail (3 figures regenerees + l'opt-out
--no-manifest+ 67 tests).Ce que je demande : arbitrage. Deux livrables pour un sujet = au plus un canonique. Si la lane
CoursIA-2livre #16275, je ferme cette PR sans discuter et je garde le travail en reserve. Aucune PRCoursIA-2n'existe a l'heure de ce message (gh pr list --search 16275ne renvoie que celle-ci).Le gate
lane_claim(organe bloquant, #10223) refuse une reference fermante sur le claim actif d'une autre lane — d'ouSeeet nonCloses. Je ne neutralise pas ce signal par un retag : ce serait exactement ce que le gate empeche.Mesures — pixel à pixel, pas à l'œil
Rapport de la mesure fondatrice, refaite contre
origin/mainfrais (2699ebdaa) :texte-scaling-passk.pngtexte-bon-vs-reflex.pngtexte-reason-vs-scale.pngValeurs lues sur les pixels (détection des marqueurs sur les ticks de l'axe, pas une lecture visuelle) : la courbe
difficilepasse de0.20/0.54/0.67/0.75(PNG sur disque) à0.25/0.40/0.50/0.50— exactement la table committée de la cellule 7 surmain.Ce que la mesure a écarté : mon arbre de travail local était en retard (
25369a46a), et sur cet arbre les trois PNG étaient pixel-identiques aux sorties de cellule — j'aurais pu « réfuter » l'issue à tort. La mesure a été refaite surorigin/mainfetché.Sous-hypothèse réfutée au passage : les notebooks ne sont pas incohérents (figure d'un run, table d'un autre). Leur figure committée est bien celle de leur propre table. Rien à ré-exécuter — seul l'export manuel avait dérivé.
Le geste de régénération était destructeur
figures-extract(le chemin outillé de l'EPIC #5654) existe déjà — l'issue disait « aucun chemin de régénération », c'est inexact : le chemin existe, mais le rejouer tel que documenté abîmait le fichier. Les sections de ce MANIFEST sont en## <fichier>.png(canonical c.767) et l'append de l'outil remplace le bloc de même nom.Mesuré, pas inféré —
figures-extractlancé sur une copie du MANIFEST réel :Contenu réel vérifié: 6 → 5 occurrences (le bloc curé de la figure est remplacé par le bloc court de l'outil) ;# MANIFEST des figures READMEest ajouté en tête du document (double titre).C'est vraisemblablement pourquoi le geste n'était jamais rejoué. Le correctif ajoute
--no-manifest(défaut inchangé : l'append reste le comportement par défaut), ce qui rend le chemin utilisable sur une série à MANIFEST curé :Les trois figures de cette PR ont été produites par ce chemin (et non par un
cpdepuis un dossier temporaire) : l'invariant est vérifié après coup, 0 px d'écart.Un claim que le run invalide — et la correction de ma propre sur-claim
Le README portait « BoN vs Réflexion : chaque régime a sa stratégie gagnante » et « difficile = BoN ~0.67 bat Reflexion ~0.50 ». Sur le run committé, les deux stratégies rendent le même taux sur les trois buckets (1.00 / 1.00 / 0.50 partout) : le claim du README est donc réfuté par l'output committé.
Mais ma première version du texte a remplacé une sur-claim par une autre. Elle présentait cette égalité comme un résultat (« la discrimination attendue n'apparaît pas à ce n », « le résultat négatif que le notebook assume »). C'est faux dans les deux sens : l'égalité est un tirage, pas une propriété.
Mesure — code de mesure recopié verbatim des cellules 3/5/7/10 du notebook, même modèle, même
n=6, mêmeK=4,R=8réplications indépendantes du bucket décisif :pass@4de BoN s'étale de 0.33 à 0.97. Le mécanisme : le bucket qui tranche ne compte que 2 problèmes, le décodage est échantillonné (température 0.8, sans graine), et un des deux problèmes reçoit 0 échantillon correct sur 6 dans 7 réplications sur 8 — le taux pivote sur un point de levier unique.Forme retenue : le prédicat seul, aucune mesure gelée. Je n'ai pas écrit ma distribution dans le README : figer 8 tirages serait le même défaut un niveau au-dessus, et c'est la prescription de l'organe du dépôt (
check_prose_quantitative_claims: « Les données quantitatives sont tenues par le CI, pas par la prose #9434 ; supprimer la mesure, garder le prédicat »). Le texte nomme le mécanisme sans geler de nombre. Effet mesuré sur l'organe : 37 → 35 compteurs quantitatifs en prose (net négatif).Les 3 PNG ne bougent pas : elles restent pixel-identiques aux sorties de cellule committées, ce qui était l'objet de la PR. Seul le texte qui les commente change (commit
b079a0ff3, 2 fichiers, +6/−4).Cette correction vient d'une contre-mesure de la lane sœur
myia-po-2026:CoursIA-2sur cette PR : elle a ré-exécuté nb16, obtenu des taux différents, et contesté mon « résultat négatif ». Je l'ai vérifiée firsthand avant de la suivre (G.1) — elle est confirmée en nature.Résidu séparé, hors périmètre → #16289 : la cellule « Limites honnêtes » du notebook annonce
12 échantillonsalors que le run committé a tourné àn=6(son propre output l'écrit), et aucun organe ne détecte qu'un verdict de comparaison repose sur un tirage non reproductible.Validation
test_extract_readme_figures.py: 67 passed (dont 3 nouveaux) ;detect_md_content_loss --checksur nb16/nb17 : 0 finding,md_cellsetnormalized_charsstables ;detect_markdown_rendering --check: 0 finding dans GenAI/Texte (les 50 findings du run global sont de la dette préexistante hors périmètre) ;catalog-pr-hygieneR1), 0 CRLF,gitleaksvert au commit.Résidu signalé, hors périmètre
Aucun organe ne détecte la dérive PNG ↔ sortie de cellule — c'est ce qui a laissé deux mois passer. Le garde correspondant (rejouer l'extraction en mémoire et comparer les pixels) est un grain séparé, non inclus ici pour tenir un seul sujet par PR.
Périmètre
8 fichiers, 1 sujet (régénération des figures README de GenAI/Texte), 1 domaine : 3 PNG +
README.md+MANIFEST.md+extract_readme_figures.py/notebook_tools.pyet leurs tests.🤖 Generated with Claude Code