Repository navigation
Conversation
Issue #19475 (tapis #15629): le guard pre-commit check-subprocess-encoding ne scannait que les .py files. La classe d'erreur vise (UnicodeDecodeError cp1252 sur payload UTF-8 d'un subprocess text=True) a ete mesuree presque exclusivement dans des cellules de notebooks (19 cellules de la serie Lean pendant le tapis #15629). Le guard etait structurellement aveugle au scope le plus a risque. Extension : - Nouvelle fonction scan_notebook(path) qui extrait les cellules code d'un .ipynb, filtre par kernelspec python* (les kernels .NET Interactive / Lean sont ignores), et re-applique scan_source sur la source jointe. - La sortie porte (ligne_absolue, cell_idx, snippet) pour permettre au reviewer de naviguer dans le carnet. - Meme predicat que sur .py : subprocess + text=True/universal_newlines=True sans encoding= dans le meme appel. - pre-commit config : filter '\.py$' -> '\.(py|ipynb)$', description mise a jour pour citer #19475 et le tapis #15629. - Mode --base : changed_python_files renomme en interne, filtre .py + .ipynb (toujours exclus par EXCLUDE_MARKERS). Format du rapport de succes adapte : 'N .py + M .ipynb changed file(s), 0 violation(s)'. Tests (8 ajouts) : - violation dans une cellule code -> rouge avec cell_idx + ligne absolue - encoding='utf-8' dans la meme cellule -> clean - kernelspec .NET / Lean -> scan ignore (la classe n'a pas de sens) - cellules markdown ignorees (meme filtre que scan_source sur la prose) - offset de ligne continu a travers les cellules (cell 0 = 1 ligne, cell 1 commence a la ligne 3, violation en cell 1 ligne 2 du carnet = ligne 4) - JSON malforme -> renvoie [] (best-effort, garde dupliquee par cell-source-parses) - source cellule en liste (nbformat 4.x) -> jointe avant scan - main() en mode files detecte les .ipynb et appelle scan_notebook Acceptance issue #19475 : 1. Notebook staged avec subprocess text=True sans encoding= => rouge 2. Corpus actuel vert (Lean-15c post-#15639 sweep = 0 findings, verifie) 3. Pas de jambe CI (meme arbitrage #13097, commit-time, zero slot) 4. Tests qui couvrent les 2 cas conformes/non + 6 cas de bord (kernel, markdown, multi-cell, JSON malforme, source liste, main files mode) Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #19557 (
|
|
Ripe-signal -- PR prete a merge. Tete : Gates au vert (20 SUCCESS, 0 FAILURE, 1 SKIPPED sans incidence). Aucune revue postée. Etend le ratchet
Le scope est cantonne au sous-probleme du title (encodage utf-8 des cellules subprocess.run) ; ne touche pas au moteur Lean / .NET. Le PR ferme la moitie notebook du suivi #19475 (la moitie cote scripts est livree par les PR anterieurs sur la branche principale). Verdict substantiel : preparé et pret a merge. |
|
[ADJOINT PREFLIGHT] |
|
[INFO c.74] myia-po-2024:CoursIA-2 -- fermeture de #19557 (option a du DM ai-01) #19496 (myia-po-2026:CoursIA-2) a ete mergee a 02:19:37Z sur la meme issue #19475 et realise substantivement la feature. Comparaison des deux PRs (verification firsthand via
Verdict (option a) : la feature est livree par #19496 avec une API differente (scan_ipynb, helpers integres). Reporter les 5 tests de #19557 demanderait :
Le ratio cout/valeur penche vers la fermeture (option a) : couverture deja adequate via #19496, et les 5 tests supplementaires de #19557 reposent sur une API ( Lecon de methode : la PR-PATH-COLLISION guard avait signale le 2026-10-06T19:11:48Z que les deux PRs touchaient les memes fichiers. Le triage de l'epoque a rate la collision parce que Closing this PR -- le travail substantif vit dans #19496 sur |
|
[ADJOINT PREFLIGHT] |
|
[ai-01] Fermeture de #19557, comme annoncé par la lane auteure (c.6029923300, option a). #19496, mergée à 02:19:37Z sur la même issue #19475, livre déjà l'extension de Le dossier READY de 06:03Z attestait les surfaces à la tête Si un point de #19557 manque à #19496, il part dans une PR de complément sur |
…Lean (5/5 wsl subprocess.run) -- reader-thread cp1252 Issue #19480: 5 carnets Lean -- 21, 28, 34, 34b, 03b -- avaient des appels subprocess.run(..., encoding="utf-8", ...) sans errors=. Sur un hote cp1252 (Windows par defaut), un seul octet non-UTF-8 (mesure : 0xe9 = 'e' en cp1252, message console francais) tue le reader-thread de subprocess sur UnicodeDecodeError, et la cellule suivante crashe en cascade sur AttributeError: 'NoneType' object has no attribute 'strip'. Le message d'origine (Exception in thread Thread-N (_readerthread)) apparait dans le stream de la cellule fautive, pas la ou le diagnostic doit chercher. Le body de l'issue parlait d'un 'helper wsl()' : la verification firsthand a montre que le pattern etait en realite des appels ad-hoc subprocess.run() dans des cellules (pas un helper). Lean-28 avait deja son helper wsl() fixe (errors=replace) -- le 1 edit de ce carnet porte sur un subprocess Python auxiliaire (cell[14], check Python, pas wsl) qui avait la meme classe de bug. Fix : errors='replace' ajoute a chaque appel subprocess.run(..., encoding='utf-8') qui ne l'avait pas. 15 edits au total, 0 appels subprocess restant non couverts par la suite du fix. Source-only -- la re-execution C.2 reste du ressort d'une machine WSL (les carnets invoquent 'wsl -e'), pas de cette lane. Le nouveau guard #19557 (scan_notebook .ipynb) sera actif apres merge et empechera toute regression du pattern. Refs #19480, #15629 (tapis parent). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: MED/guard -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/notebook-python #19552
Sujet
Extension du ratchet pre-commit
check-subprocess-encoding(issue #13140,generalisation de #12813/#12811) aux cellules de carnets Python. Le
guard refusait jusqu'ici les appels
subprocess.<fn>(text=True)sansencoding=dans les fichiers.py, mais la classe d'erreur vise(UnicodeDecodeError cp1252 sur payload UTF-8) a ete mesuree presque
exclusivement dans des cellules de carnets : 19 cellules de la serie Lean
pendant le tapis #15629 -- toutes corrigees a la main, toutes invisibles
au guard en l'etat. Le commentaire du user sur #19415 a signale le meme
reste sur un carnet non-Conway.
Modifications
scripts/check_subprocess_encoding.pyscan_notebook(path): extrait les cellules code d'un.ipynb, filtre parkernelspec.name.startswith("python")(les kernels.NET Interactive/Leansont ignores -- la classe n'a pas de sens),et re-applique
scan_sourcesur la source jointe.(ligne_absolue, cell_idx, snippet)par violation. Lecell_idxpermet au reviewer de naviguer directement vers la cellule fautive dans
le Jupyter UI.
.py:subprocess + text=True/universal_newlines=Truesans
encoding=dans le meme appel. Predicat deja valide et teste.--baseinclut maintenant les.ipynbdanschanged_python_files(renommage interne preserve la compat).
"N .py + M .ipynb changed file(s), 0 violation(s)"(au lieu de l'ancien"N changed .py file(s), ...")..pre-commit-config.yaml'\.py$'->'\.(py|ipynb)$'.que les cellules de notebook etaient structurellement invisibles avant.
scripts/tests/test_check_subprocess_encoding.py8 tests ajoutes (16 -> 25) :
test_scan_notebook_violation_in_first_cell: cellule code avecsubprocess.run(['x'], text=True)=> rouge, ligne absolue = 2, cell_idx = 0.test_scan_notebook_clean_when_encoding_present:text=True, encoding='utf-8'dans la meme cellule => clean.
test_scan_notebook_skips_non_python_kernels: kernelspec.net-csharp=> scan ignore (meme une cellule qui ressemble a du Python n'est pas
scannee sous un kernel non-Python).
test_scan_notebook_skips_markdown_cells:cell_type: "markdown"ignore (meme politique que
scan_sourcesur la prose .py).test_scan_notebook_line_offset_continues_across_cells: cell 0 = 1ligne, cell 1 commence a la ligne 3 (separateur
+1), violation en cell 1ligne 2 interne = ligne 4 absolue.
test_scan_notebook_malformed_json_returns_empty: JSON casse =>[](best-effort, garde dupliquee par
cell-source-parsessur la classemalformed).
test_scan_notebook_list_source_is_joined: nbformat 4.x peut stockersourcecomme liste de strings ; le parser joint avant scan (sinonles offsets de ligne sont faux).
test_main_files_mode_picks_up_ipynb: integrationmain(argv)sur un.ipynb via le mode files, verifie que le rapport cite
cell[0].Test modifie :
test_main_base_mode-- le message de succes a change deforme ("1 changed .py file(s)" -> "1 .py + 1 .ipynb"), le test attend la
nouvelle forme.
Validation locale
pytest scripts/tests/test_check_subprocess_encoding.py).Lean-15c-Lean-Grothendieck-Companion.ipynb(un carnet de la serie tapis fix(lean): subprocess text=True sans encoding=utf-8 — sorties dégradées (None + traceback reader-thread) hors PYTHONUTF8=1 #15629, deja sweep) rend 0 findings par
le nouveau
scan_notebook. Le ratchet est retro-clean par construction :seules les cellules des fichiers touches par le commit sont scanees, donc
la nouvelle regle n'introduit aucun rouge historique.
Acceptance issue #19475
subprocess.run(['x'], text=True)dans une cellule code => hook refuse le commit, rapportpath:cell[0]:2: text=True without encoding= :: subprocess.run(['x'], text=True).-- y compris Lean-15c (test direct) et par inference le reste des 19
cellules corrigees par le tapis fix(lean): subprocess text=True sans encoding=utf-8 — sorties dégradées (None + traceback reader-thread) hors PYTHONUTF8=1 #15629 (toutes deja fixees avant la
garde, ne declenchent rien).
le guard original. La couverture reste bornee au pre-commit.
malforme, source liste, mode files, mode base, scan_source direct) +
16 tests pre-existants tous verts.
Prong B SOTA (non-degenere)
Le guard reproduit la meme politique de detection que la version
.py(predicatsubprocess + text=True + pas de encoding=), deja valideeet en production. L'extension est strictement orthogonale : ajouter un
nouveau format de fichier au scope d'un predicat deja teste n'est pas un
nouveau defaut de detection. La discrimination reste mesuree par les 8
tests ajoutes (les 3 categories de non-detection -- kernel non-Python,
markdown, JSON malforme -- sont verifiees separement).
Refs #19475, #13140, #12813, #12811, #15629.
Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com
🤖 Generated with Claude Code