Skip to content

fix(guard,#14513): le ratchet MACHINE_PATH voit aussi les metadonnees - #14762

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/14513-ratchet-machine-path-metadata
Sep 5, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/14513-ratchet-machine-path-metadata

Conversation

@jsboige

@jsboige jsboige commented Sep 5, 2026 •

Copy link
Copy Markdown
Owner

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 dans metadata.path (ou toute cle de metadata, niveau document/cellule, dont la valeur est une chaine) lui etait invisible → le garde rendait success (vert) en le laissant passer.

Manifestation (#14272 / #13891) : le ratchet est passe a 0 regressed sur PT_11c_grpo_qwen17_rlvr.ipynb avec metadata.path = C:\dev\CoursIA-cycle-32\MyIA.AI.Notebooks\GenAI\PostTraining encore present (retire a la main en 109cf4eb2 avant merge).

Changement

  • metadata_texts() : releve toute valeur de metadata str (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, et la convention permet de normaliser une cle metadata a la main uniquement parce que le garde doit d'abord pouvoir la VOIR.
  • Location des hits : 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)

Item Resultat
Predicat etendu a metadata.path et aux cles de metadata document/cellule (value str, pas de whitelist) Fait — metadata_texts() + boucle MACHINE_PATH dans scan()
Precaution 1 : 0 nouvelle accusation sur main avant de rendre bloquant Verifie — sweep des 1234 notebooks : 0 notebook porte un hit MACHINE_PATH metadata (papermill.input/output_path sont repo-relative/basename → silencieux par construction)
Precaution 2 : controle positif reel Replay c4b99a3ec4 → 109cf4eb2 dans --self-test : metadata-path hits 1 -> 0 — doc:path vu a la base, absent au head. Garde par cat-file comme le replay fondateur (blobs hors branche squash-merged, absents d'un clone fetch-depth 0)

Validation

Fichiers

  • scripts/notebook_tools/check_output_failure_text.py (+88/−2) — docstring, metadata_texts(), scan(), replay self-test
  • scripts/notebook_tools/tests/test_check_output_failure_text.py (+82) — 7 tests

Note de scope

Le retrait manuel d'une cle de metadata reste conforme a secrets-hygiene regle 6 (classe explicitement toleree, au meme titre que metadata.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

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>
@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 5, 2026
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@github-actions github-actions Bot added variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) and removed variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) labels Sep 5, 2026
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA a deja consomme son budget LIGHT du jour (une LIGHT anterieure de cette lane).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Sep 5, 2026
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-05) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=1 genre=3 cap=1)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=3 cap=1)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Sep 5, 2026
… 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.
@myia-ai-01

Copy link
Copy Markdown
Collaborator

Point cosmetique d'Hermes traite en code — commit 57653f426.

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 : metadata_texts() produit deja son propre label (doc:<cle> ou cell[<i>]:<cle>), donc l'enveloppe systematique donnait deux sorties fausses, pas une :

Origine du hit Avant Apres
output (index entier) cell[7] cell[7] (inchange)
metadata de document cell[doc:path] doc:path
metadata de cellule cell[cell[3]:papermill] cell[3]:papermill

_sample_location() trie sur le type. Aucun changement de detection ni de comptage : compare() consomme len(h[cls]), agnostique au type — c'est le meme constat que ta verification du consommateur aval.

Controle negatif passe : en remettant l'enveloppe systematique, les 2 nouveaux tests rougissent (2 failed, 17 passed) ; avec le tri, 19 passed. Le second test porte sur les localisations reelles rendues par scan(), pas sur des litteraux — il interdit cell[cell[ et cell[doc: dans la sortie, donc il attrape la regression meme si le format des labels evolue en amont.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ratchet MACHINE_PATH aveugle a la metadata : une fuite de chemin machine passe sous un check vert

2 participants