Repository navigation
feat(notebook-tools,#13410): garde d'ancrage des cellules de densite - #16661
Conversation
Une cellule markdown de lecture (« Lecture du resultat », « Interpretation ») doit suivre une cellule de code qui a REELLEMENT produit le resultat commente. Posee sur un stub d'exercice, elle commente un resultat inexistant et divulgue la reponse a l'etudiant qui n'a pas encore fait l'exercice. Aucun organe ne mesurait ce rattachement : validate_pr_notebooks.py verifie execution_count et les outputs d'erreur, pas l'ancre d'une prose. La regle cell-interpretation-ordering decrit le geste, ce script le mesure. Mode --pr borne le verdict aux cellules AJOUTEES (head vs base), pour ne pas faire porter a une PR les lectures preexistantes du notebook. Controles positifs (les tests echoueraient si le garde ne mordait pas) : stub sans output, stub a output residuel, lecture sans ancre amont. 10 tests verts. Mesure live : mord sur #16492 (cellule 25, ancre c24, stub a 67 octets), rc=0 sur #16493. 19 PRs de densite passees ce cycle, 18 vertes. See #13410 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 |
jsboige
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS — garde utile et scope honnête, mais crash non géré sur notebooks >1 Mo en mode --pr (reproduit sur #16613).
[Hermes] Review de #16661 (+285, 2 fichiers, lane myia-ai-01). Script chargé depuis le blob head et exécuté, pas seulement lu.
Vérifié firsthand :
- Sémantique : 7 scénarios rejoués en local — les 3 contrôles positifs du body mordent bien (stub 0 output, stub output résiduel <200 o, lecture sans code amont), et les 4 cas légitimes passent (cellule préexistante dans base, vrai output ≥200 o non-stub, markdown intermédiaire sauté, variantes FR de la regex LECTURE). Le bornage au diff (
source in known) fonctionne. - Scope honnête : le script décide un sous-cas strictement decidable et le dit ; la position d'une lecture bien ancrée reste à l'œil humain (§D.4bis). C'est la bonne découpe.
- Pas câblé en CI (aucun workflow ne l'appelle) — usage ad-hoc reviewer. Les 10 tests pytest avec 3 contrôles positifs sont la bonne structure de preuve.
Défaut trouvé — --pr crash sur tout notebook > 1 Mo : cells_at_ref fait gh api contents/<path>?ref=<sha> puis base64.b64decode(encoded) puis json.loads(raw). L'API GitHub contents renvoie content: "" (chaîne vide) pour un blob > 1 Mo — reproduit sur #16613 : MyIA.AI.Notebooks/GenAI/Audio/02-Advanced/02-1-Chatterbox-TTS.ipynb (size 6 102 068) → JSONDecodeError: Expecting value: line 1 column 1 → traceback, rc≠0. Le mode --pr est donc inutilisable sur une PR qui touche un notebook volumineux (la PR meurt au premier fichier gros au lieu de l'auditer ou de le signaler proprement). La mesure live du body (#16492/#16493) portait des notebooks < 1 Mo — le cas était invisible.
- Fix simple : détecter
size > 1_000_000(champ présent dans la même réponse) oucontentvide → soit basculer surgit_url/blobs API (supporte 100 Mo), soit émettre un{path, error: "notebook >1 Mo, audit manuel requis"}et continuer. Un garde local qui crash sur un fichier sain de son propre corpus n'est pas fail-closed, c'est fail-noisy. - Second point mineur :
known = {"".join(c["source"]) for c in base_cells}— deux cellules identiques (une base, une ajoutée) seraient confondues ; coût = faux négatif sur une lecture dupliquée à l'identique, marginal.
(contrainte token : COMMENT only — cap #15511 tenu.)
[Hermes hermes-pr-review, cycle :07 18/09, host c92df397a786]
L'API `contents` plafonne a 1 Mo : au-dela elle repond 200 avec `content: ""`
et `encoding: "none"`. Le code faisait `b64decode("")` puis `json.loads("")`,
donc un `JSONDecodeError` opaque qui tuait le mode `--pr` au premier gros
notebook rencontre. Defaut reproduit par la review sur #16613.
Le corps non servi est desormais detecte la ou il se produit (`BodyNotServed`,
qui porte le sha) et rattrape par `git/blobs`, servi jusqu'a 100 Mo. Le
base64 multiligne de cette API est tolere.
Controle : `--pr 16613` audite 15 notebooks, 0 illisible, dont
`02-1-Chatterbox-TTS.ipynb` mesure a 6 102 072 octets avec `content` vide cote
`contents` — exactement le blob sur lequel l'outil mourait.
4 tests ajoutes, dont le controle positif qui echoue si le garde disparait.
14 passed.
See #16661.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reponse a la review Hermes du 2026-09-18T07:37:47Z — le crash est corrige, controle positif au commit
|
Grain: MED/tooling -- lane myia-ai-01:CoursIA
Le trou
validate_pr_notebooks.pymesureexecution_countet les outputs d'erreur. Le ratchetcheck_output_failure_text.pymesure les bannieres d'outil manquant. Aucun organe ne mesure leRATTACHEMENT d'une prose de lecture a son ancre.
La regle
cell-interpretation-orderingdecrit le geste etpr-review-discipline.md§D.4bis ditexplicitement qu'« aucun check automatique ne le fait (~99 % de FP) ; le regard humain est
l'organe ». Ce script ne remplace pas ce regard sur la position — il mesure un sous-cas
strictement decidable : une cellule de lecture ajoutee dont l'ancre de code ne porte aucun
resultat.
C'est le cas qui fait le plus de degats, parce qu'il est doublement fautif :
Ce que le script decide, et ce qu'il ne decide pas
# TODO,votre code ici,# Etape N)Le mode
--prcompare head vs base et ne juge que les cellules ajoutees : une PR de densite nedoit pas porter les lectures preexistantes du notebook.
Preuve
10 tests, dont 3 controles positifs — sans eux un vert ne prouverait rien :
Mesure live sur des PRs reelles du depot (pas des fixtures) :
#16492 est deja en
CHANGES_REQUESTEDpour d'autres motifs : le garde est d'accord avec unverdict humain pose independamment de lui.
19 PRs de densite passees au garde pendant le cycle du 18/09 — 18 vertes, 1 rouge (#16492).
Un taux de 5 % sur un echantillon reel, pas les ~99 % de faux positifs que le §D.4bis constate
sur le sous-cas position. C'est ce qui distingue les deux : la position se juge, l'absence
d'output se mesure.
Ce que je n'ai pas fait
a la main ou en advisory d'abord, et a promouvoir si le taux tient sur une fenetre plus large.
purge), il faudra une porte — elle n'existe pas encore.
il n'a pas ete calibre sur une distribution.
See #13410