Repository navigation
fix(tooling,#17729): scan_diff ne compte plus les SORTIES de cellule comme de la prose - #17732
Conversation
…comme de la prose Le mode diff du scanner filtrait ligne a ligne le JSON du carnet : les cles "output_type"/"execution_count"/"outputs" etaient sautees, mais pas les charges utiles de sortie, qui sont des chaines nues et passent le filtre. Sur la tete d13f0c5 de #16987, 80 findings dont 77 dans les seules sorties de cell[3] -- une cellule code qui compte et affiche, cas que la doctrine de l'en-tete du module declare legitime. Depuis #17645 ce check est bloquant : deux PRs dont aucune prose ne portait de compteur etaient rouges. Une ligne de prose et une charge utile de sortie sont indiscernables ligne a ligne, mais "source" et "outputs" sont a la meme profondeur dans le pretty-print nbformat et le bloc se referme sur une ligne d'indentation egale a celle de sa cle. On calcule donc une fois par fichier la carte des lignes situees dans un bloc outputs, et on la croise avec le numero de ligne du fichier nouveau, suivi depuis les en-tetes de hunk (--unified=0 : la 1re ligne "+" est la ligne <c>). Mesure : #16987 80 -> 3, #16974 1 -> 0. Les 3 residuels sont un VRAI positif -- une prose markdown ajoutee par la branche affirmant 5/48/36 cells ; le critere de sortie de l'issue annoncait 0, la mesure le corrige. 2 tests verrouillent la frontiere (charge utile ajoutee = 0 finding, prose ajoutee = 1) ; le controle negatif les fait echouer sur la version d'avant (2 failed, 24 passed), l'echec etant exactement le faux positif. Co-Authored-By: Claude-Code <noreply@anthropic.com>
[DONE] lane myia-po-2024:CoursIA-2 — c.1437 (rapport de cycle, RooSync MCP indisponible)Le canal de coordination (MCP Livre : PR #17732 — Ce qui est repare. Le correctif. La carte des blocs Mesure. #16987 80 → 3, #16974 1 → 0. Les 3 residuels sont un VRAI positif : ligne 2443 du fichier nouveau, une prose markdown ajoutee par la branche affirmant 5/48/36 cells — l'issue annoncait 0, la mesure le corrige. Sorties legitimes sautees : exactement 77 (80 = 77 + 3). Tests. 2 verrouillent la frontiere (meme compteur : charge utile ajoutee = 0 finding, prose ajoutee = 1, depot git jetable hors arbre, P0 file de reparation. #17663 : zero check rouge (86 legs vertes), seul bloquant = reserve Hermes levee en commentaire 15:39Z, re-sollicitee 00:28Z, dans la fenetre de non-relance. #17722 : seul rouge residuel = son propre Plancher G-VAR-1 DEEP/CONTENU : NON TENU ce cycle. Chaque candidat de contenu tire par le picker etait verifiablement deja livre / claim / machine-restricted (#16422 #17199 #13505 #13759 #14505 #16141 #13562 #17245 #16959 #14549 #13962 #17713 #17458) — preuves de livraison postees sur #15974 (comment 5825019986), #16422 (5825150563), #17199 (5825174114). Le grain servi est MED/guard, au-dela du plancher qui n'est pas tenu. A reporter au registre durable (ecriture memoire refusee par le harnais ce cycle). L'en-tete MEMORY.md de la lane cite encore le cron session-local Pas d'arbitrage user nouveau ce cycle. |
|
[ADJOINT PREFLIGHT] Premier dossier sur cette PR (aucun anterieur), a la tete READY — et l'acceptance du body a ete reproduite, pas reprise. Le fold Ce que j'ai verifie moi-meme, dans un worktree detache a cette tete (le corps est ensuite retire) :
Le controle negatif est la piece qui compte : les deux tests qui verrouillent le correctif echouent sur le module d'avant et passent sur celui d'apres — la suite n'est donc pas un ruban, elle mord. Et le module a ete restaure puis rejoue (26 passed) pour verifier que la manipulation n'avait rien laisse derriere elle. Les 3 residuels de #16987 ne sont pas un reste de faux positif, et c'est ce qui rend le correctif credible : ce sont de la prose markdown ajoutee par la branche ( Perimetre reel : aucun notebook touche, donc les cribles de domaine sont sans objet ici ( Point de suite, hors de cette PR : La decision de fusion, la cloture et l'arbitrage restent a |
Grain: MED/guard — lane myia-po-2024:CoursIA-2 — prev: LIGHT/docs #17722
Le defaut : le mode diff compte les SORTIES de cellule comme de la prose
scan_diff(scripts/notebook_tools/check_prose_quantitative_claims.py) parcourt le diff ligne par ligne. Il exclut bien les cles"output_type"/"execution_count"/"outputs", mais pas les charges utiles de sortie : ce sont des chaines nues (" \" Angel.lean 65 lignes\\n\",") qui passent le filtre'"source"' not in line and not body.startswith('"'). Le mode diff ne voit pas les cellules, donc il ne peut pas attribuer une ligne a un type de cellule.Or la doctrine du module, dans son propre en-tete, declare ce cas legitime :
Mesure sur deux PRs de cette lane, tete exacte :
sourcede celluleoutputsd13f0c5c45Lean-16b-...-Lean.ipynb (80)cell[3]fb98304d06Lean-16f-...-Theorem.ipynb (1)cell[16]Les valeurs sont fraiches, pas un artefact de re-encodage :
Lean-16bporte 28 de ces compteurs dans ses sorties surmain, 77 sur la tete — la cellule de comptage a ete re-executee. Depuis #17645, ce check est bloquant : deux PRs dont aucune prose ne portait de compteur etaient rouges.Correctif : la carte des blocs
outputs, croisee avec le numero de ligne du fichier nouveauUne ligne de prose et une charge utile de sortie sont, ligne a ligne, indiscernables. Mais
"source"et"outputs"sont a la meme profondeur dans le pretty-print nbformat, et le bloc se referme sur une ligne d'indentation egale a celle de sa cle :_ipynb_output_lines(rel)calcule une fois par fichier l'ensemble des lignes situees dans un blocoutputs. Le\s*$deOUTPUTS_OPEN_REest load-bearing :"outputs": [](cellule jamais executee) se referme sur sa propre ligne, l'ouvrir ferait avaler tout le reste du fichier.scan_diffsuit le numero de ligne du fichier nouveau depuis les en-tetes de hunk (@@ -a,b +c,d @@; en--unified=0le corps du hunk ne porte que les lignes ajoutees, donc la 1re ligne+est la lignec) et saute les lignes cartographiees.La prose markdown vit aussi sous
"source": elle reste flagee,scan_diffne la touche pas.Acceptance mesuree
d13f0c5c45[REFUS] 80[REFUS] 3fb98304d06[REFUS] 1[OK] aucun compteurLes 3 residuels de #16987 sont un VRAI positif, et c'est l'argument que le correctif ne desarme rien : la ligne 2443 du fichier nouveau est une prose markdown ajoutee par la branche (accents restaures vs
main), qui affirme5 cells, 48 cells, canon de Gosper 36 cells. Elle doit rester rouge. Le compte de sorties legigimes sautees sur cette tete est exactement 77 (80 = 77 + 3).Tests
scripts/notebook_tools/tests/test_check_prose_quantitative_claims.py— 26 passed :test_ipynb_output_lines_maps_payloads_not_sources: la carte distingue source markdown / source code / charge utile, et ne se referme pas sur"outputs": [](la cellule suivante doit rester hors du bloc).test_scan_diff_skips_output_payloads_but_flags_source_prose: depot git jetable danstmp_path(hors depot de travail),core.autocrlf=falsepour que l'arbre et le blob soient comparables octet a octet. Frontiere mesuree sur le meme compteur : ajoute en charge utile de sortie = 0 finding ; ajoute en prose markdown = 1 finding.Controle negatif (le test doit echouer sur la version d'avant, sinon il ne verrouille rien) : la meme suite jouee contre le module de
mainrend2 failed, 24 passed, l'echec etant exactement le faux positif —Les 24 tests pre-existants passent sur les deux versions : aucun autre comportement du module n'est touche.
Perimetre reel des consommateurs (
grep -rlsur le depot) :check_machine_dep_timing.pyimporteMACHINE_RE,scripts/tests/test_golden_quantitative_claims.pyimporte_findings_in_textet_notebook_is_seeded— aucune de ces trois surfaces n'est touchee, et la suite rejouee le confirme :Le module de test corrige au passage sa propre affirmation d'en-tete (« Aucun appel git/subprocess (on ne teste pas
scan_diff...) »), qui decrivait une lacune et non une propriete.Ce que cette PR ne fait pas
outputsde carnet n'est edite (Stop & Repair) : la re-execution qui a produit ces valeurs est intacte, et les PRs concernees restent a reparer par leur lane si leur prose en porte.--all(balayage de l'arbre) est inchange.Closes #17729