Skip to content

guard(notebooks): cabler check_split_reading_cells.py en cliquet bloquant — l'organe existe, 91 findings deja sur main, et la prose du STOP n'a pas tenu 42 minutes #17044

Description

@myia-ai-01

Le défaut, en une mesure

scripts/notebook_tools/check_split_reading_cells.py est sur main, avec sa suite de tests (scripts/tests/test_check_split_reading_cells.py) — et n'est câblé nulle part. Mesure firsthand, main à d412b5a13c :

$ git ls-files | grep -iE "split_reading"
scripts/notebook_tools/check_split_reading_cells.py
scripts/tests/test_check_split_reading_cells.py

$ grep -nE "split_reading" scripts/ci/fast_lane_registry.py
(aucune occurrence)

Ses deux frères de la même famille y sont, eux : check_output_collapse.py (l.601-609) et check_source_collapse.py (l.1237-1248). Celui-ci a été écrit, testé, puis laissé débranché.

Ce qu'il voit, et que personne n'écoute

Scan par série sur MyIA.AI.Notebooks, --json, rc=0 partout :

Série Findings
GenAI 42
GameTheory 16
SymbolicAI 9
Probas 9
IIT 7
ML 4
Search 4
Sudoku 0
Total 91

91 cellules de lecture scindées sont déjà sur main — donc déjà mergées, sous des reviews qui n'avaient aucun instrument pour les voir.

Pourquoi maintenant : la prose ne tient pas la porte

Le body de #13410 porte depuis le 2026-09-20T18:12:47Z une section STOP en tête, avec le mandat user verbatim (« si on rajoute une lecture, on modifie le paragraphe de lecture existant, on n'en rajoute pas un deuxième »).

Trois PRs de densité ont été créées après cette édition : #17025 (18:23Z), #17028 (18:31Z), #17031 (18:54Z) — 42 minutes.

Ce n'est pas de l'indiscipline : un agent déjà lancé ne relit pas le body de son issue. Une règle qui ne vit que par sa prose ne s'exécute pas — il lui faut un organe. Celui-ci existe déjà, ce qui rend l'écart d'autant plus coûteux.

Défaut bloquant à corriger d'abord

Le scanner avorte sur le premier notebook illisible au lieu de le sauter :

$ python scripts/notebook_tools/check_split_reading_cells.py MyIA.AI.Notebooks --json
ERREUR lecture MyIA.AI.Notebooks\QuantConnect\ESGF-2026\lean-workspace\BTC-ML-Researcher\research.ipynb:
  Expecting value: line 63 column 5 (char 1753)
rc=1

En l'état il est incâblable : un seul notebook corrompu rendrait rouge toute PR du dépôt, pour une raison sans rapport avec elle. (Au passage : ce notebook est bien présent et bien corrompu — un rapport antérieur le donnait pour « chemin inexistant à main », c'est faux.)

Critères d'acceptation

  1. Robustesse — un notebook illisible produit un SKIPPED nommé dans la sortie, jamais un rc non nul. Contrôle : le scan repo-wide rend rc=0 en présence de BTC-ML-Researcher/research.ipynb.
  2. Câblage — entrée dans scripts/ci/fast_lane_registry.py, modèle check_source_collapse.py, comparaison base vs PR.
  3. Cliquet, pas plancher absolu — le check est rouge si la PR augmente le compte de findings sur les notebooks qu'elle touche. Les 91 déjà sur main sont grandfathered : on arrête l'hémorragie avant de soigner la plaie.
  4. Contrôle positif obligatoire — une PR de densité récente qui empile une lecture DOIT faire rougir le check. À prendre parmi fix(notebooks,#16762): fusion des 3 paires Lecture/Lecture chiffree de GameTheory-22 #17025 / fix(pedagogy,#13410): g60-search-10 — 5 patchs ancrés sur les sorties imprimées (GeneticAlgorithms) #17028 / feat(harness,#16762): cable check_split_reading_cells en garde advisory TRANCHE12 #17031, en citant le finding exact (notebook + id de cellule). Sans ce contrôle, le câblage n'est pas démontré.
  5. Contrôle négatif obligatoire — une PR qui fusionne deux lectures en une (le geste que le mandat user demande) doit être verte. Un gate qui punit le remède est pire que pas de gate.
  6. Statut — blocking=True. Le mode advisory a déjà été essayé sur cette famille (output-collapse, source-collapse) : il ne tient pas une porte, il documente un passage. Le grief user porte sur la qualité des notebooks, pas sur sa traçabilité.

Ce qu'il ne faut PAS faire

  • Ne pas élargir le détecteur à « toute cellule markdown proche d'une autre » : le faux positif y est massif et il punirait la prose pédagogique légitime. Le motif visé est étroit — deux cellules de lecture pour une même cellule de code.
  • Ne pas traiter les 91 findings de main dans la même PR : c'est le cliquet qu'on livre, pas la réparation. La réparation est un chantier distinct, à cadencer par série.
  • Ne pas poser ce gate sur les PRs étudiantes (student-pr-reviews.md).

Contexte

Mesure du même cycle : 3 issues portent 100 des 243 PRs ouvertes (#13410 → 78, #16638 → 22, #16795 → 14), pendant que 313 des 390 issues ouvertes sont admissibles et non tirées. Le pool n'est pas tari — c'est la production qui se concentre. Le volet « pourquoi elle se concentre » est distinct de celui-ci et suit à part.

Grain: qualite-notebooks — lane a attribuer

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions