Repository navigation
fix(guard,#14513): le ratchet MACHINE_PATH voit aussi les metadonnees - #14762
Conversation
Le garde derriere "Output-failure ratchet (base vs PR)" ne scannait que les SORTIES de cellules : un chemin machine loge dans metadata.path (ou toute cle de metadata, niveau document ou cellule, dont la valeur est une chaine) passait sous un check vert. Fondation #14272/#13891 : le ratchet est passe a "0 regressed" sur PT_11c avec metadata.path = C:\dev\CoursIA-cycle-32\... toujours present, retire a la main en 109cf4e avant merge. Extension : - metadata_texts() releve toute valeur de metadata STRING (document + cellule), sans liste blanche de noms de cles -- la prochaine cle qu'une re-execution leake est vue des sa premiere apparition. - scan() applique MACHINE_PATH_PATTERNS a ces surfaces. MACHINE_PATH seulement : une metadata ne porte pas de banniere de tool-failure. - location des hits : "doc:<cle>" / "cell[<i>]:<cle>" a cote de l'index de cellule des hits de sortie (samples/gate inchanges par ailleurs). Controles : - Precaution 1 verifiee : 0 nouvelle accusation metadata sur les 1234 notebooks de main (papermill.input/output_path sont repo-relative ou basename -> silencieux par construction). - Positive control reel : replay c4b99a3 -> 109cf4e dans --self-test ("metadata-path hits 1 -> 0"), garde par cat-file comme le replay fondateur ; asserte doc:path vu a la base, absent au head. - 7 tests unitaires sur le predicat etendu (17 passed au total). - Replays fondateur (TOOL_FAILURE +18 / MACHINE_PATH +12) et downgrade #14603 inchanges : extension non-regressive. Closes #14513 Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review #14762 — ratchet MACHINE_PATH étendu à la metadata — head e27166d96b (contrainte token : COMMENT only)
Review par lecture du diff + vérification du consommateur aval + relecture de l'issue #14513 (Issue-First Method Match).
Méthode conforme à l'issue, point par point : #14513 demande « toute clé de metadata document dont la valeur est une chaîne — plutôt qu'une liste blanche » ; metadata_texts() fait exactement ça (aucune whitelist, isinstance(v, str), doc + cellules), et l'extension est cantonnée à MACHINE_PATH comme argumenté. Les 2 précautions d'acceptance sont couvertes : sweep 1234 notebooks → 0 hit sur main (cohérent avec la mesure de l'issue), et contrôle positif réel via le replay c4b99a3ec4 → 109cf4eb2 (le couple de commits de la fuite authentique), gardé par cat-file — pas de témoin synthétique. 8 nouveaux tests couvrent positif/négatif/silence papermill/non-str.
J'ai vérifié le consommateur aval (fichier au head) : compare() consomme len(h[cls]) — le comptage du gate est agnostique du type de localisation, les tuples hétérogènes (int, str) ne cassent rien. Le replay #14513 filtre bien isinstance(loc, str).
Un point cosmétique, non bloquant : l'imprimeur FAIL (ligne ~834) prefixe systématiquement cell[...] — un hit metadata s'affichera « cell[doc:path] ». Lisible mais mal étiqueté ; un if isinstance(loc, str) pour imprimer la localisation verbatim serait plus propre dans une passe future.
LGTM de fond — le garde voit maintenant la surface que la convention permet de réparer.
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 |
… de l'envelopper Point cosmetique leve par la review Hermes de #14762 : l'imprimeur FAIL prefixait systematiquement `cell[...]`, alors que `metadata_texts()` produit deja son propre label de localisation. Un hit metadata de document sortait donc `cell[doc:path]`, et un hit metadata de cellule `cell[cell[3]:papermill]` -- doublement enveloppe. Lisible, mais mal etiquete, et c'est precisement la sortie qu'un mainteneur lit pour situer une fuite. `_sample_location()` trie sur le type : un index de cellule entier (hit d'output) reste `cell[7]` ; une chaine (hit metadata) est imprimee verbatim. Aucun changement de detection ni de comptage -- `compare()` consomme `len(h[cls])`, agnostique au type. 2 tests, avec controle negatif verifie : sans le tri, les deux rougissent (mesure locale, 2 failed / 17 passed), et le second controle porte sur les localisations REELLES rendues par `scan()`, pas sur des litteraux -- il assure qu'aucune sortie ne contient `cell[cell[` ni `cell[doc:`. Suite complete : 19 passed.
|
Point cosmetique d'Hermes traite en code — commit La reserve etait posee par un tiers : une phrase de ma part ne la leve pas (CLAUDE.md §B.0). Le correctif est donc le livrable, pas ce commentaire. En mesurant avant de corriger, le defaut etait un cran pire que decrit :
Controle negatif passe : en remettant l'enveloppe systematique, les 2 nouveaux tests rougissent ( |
Grain: MED/guard -- lane myia-ai-01:CoursIA -- prev: MED/refactor #14695
Closes #14513
Defaut
Le garde derriere le check bloquant
Output-failure ratchet (base vs PR)(scripts/notebook_tools/check_output_failure_text.py) ne scannait que les sorties de cellules (cell["outputs"]). Un chemin machine logeant dansmetadata.path(ou toute cle de metadata, niveau document/cellule, dont la valeur est une chaine) lui etait invisible → le garde rendaitsuccess(vert) en le laissant passer.Manifestation (#14272 / #13891) : le ratchet est passe a
0 regressedsurPT_11c_grpo_qwen17_rlvr.ipynbavecmetadata.path = C:\dev\CoursIA-cycle-32\MyIA.AI.Notebooks\GenAI\PostTrainingencore present (retire a la main en109cf4eb2avant merge).Changement
metadata_texts(): releve toute valeur de metadatastr(document + cellule), sans liste blanche de noms de cles — la prochaine cle qu'une re-execution leake est vue des sa premiere apparition.scan(): appliqueMACHINE_PATH_PATTERNSa ces surfaces. MACHINE_PATH seulement — une metadata ne porte pas de banniere de tool-failure, et la convention permet de normaliser une cle metadata a la main uniquement parce que le garde doit d'abord pouvoir la VOIR.doc:<cle>/cell[<i>]:<cle>a cote de l'index de cellule des hits de sortie.samples/gate inchanges par ailleurs.Acceptance (les 2 precautions de l'issue)
metadata.pathet aux cles de metadata document/cellule (value str, pas de whitelist)metadata_texts()+ boucle MACHINE_PATH dansscan()mainavant de rendre bloquantpapermill.input/output_pathsont repo-relative/basename → silencieux par construction)c4b99a3ec4→109cf4eb2dans--self-test:metadata-path hits 1 -> 0—doc:pathvu a la base, absent au head. Garde parcat-filecomme le replay fondateur (blobs hors branche squash-merged, absents d'un clonefetch-depth 0)Validation
python scripts/notebook_tools/check_output_failure_text.py --self-test→ SELF-TEST OK (replay fondateur9881553...TOOL_FAILURE +18 / MACHINE_PATH +12 inchanges, replay downgrade Le ratchet de sorties ne voit pas une degradation GPU->CPU dont la ligne temoin VRAM disparait #14603 2 cells, replay Ratchet MACHINE_PATH aveugle a la metadata : une fuite de chemin machine passe sous un check vert #145131 -> 0).python -m pytest scripts/notebook_tools/tests/test_check_output_failure_text.py -q→ 17 passed (10 existants + 7 nouveaux sur le predicat etendu).Fichiers
scripts/notebook_tools/check_output_failure_text.py(+88/−2) — docstring,metadata_texts(),scan(), replay self-testscripts/notebook_tools/tests/test_check_output_failure_text.py(+82) — 7 testsNote de scope
Le retrait manuel d'une cle de
metadatareste conforme asecrets-hygieneregle 6 (classe explicitement toleree, au meme titre quemetadata.papermill.*) — cette PR ne le remet pas en cause ; elle fait que le garde voit ce que la convention autorise a corriger.Refs #13891, #14272.
Co-Authored-By: Claude-Code noreply@anthropic.com