Skip to content

fix(notebook-tools,#17044): un carnet illisible n'annule plus le recensement - #17166

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/17044-unreadable-notebook-no-abort
Sep 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/17044-unreadable-notebook-no-abort

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2023:CoursIA -- prev: MED/tooling #17135

See #17044

Le defaut, et ce qu'il coutait

scan_root faisait return 1 dans son except (OSError, json.JSONDecodeError) (l.169-171 sur main) :

        except (OSError, json.JSONDecodeError) as e:
            print(f"ERREUR lecture {path}: {e}", file=sys.stderr)
            return 1                      # <- annule TOUT le recensement

Un seul carnet corrompu n'abime donc pas le recensement : il l'annule. Le scan perd tous ses findings (pas seulement celui du carnet fautif) et rend rc=1. Consequence : l'organe est incablable en cliquet — n'importe quel carnet corrompu du depot rougit toute PR, pour une raison sans rapport avec elle. C'est le defaut que #17044 nomme « bloquant a corriger d'abord ».

Note de mesure (G.1). Sur un worktree origin/main frais, le carnet cite par #17044 (QuantConnect/ESGF-2026/lean-workspace/BTC-ML-Researcher/research.ipynb) est absent (non suivi) : le scan y rend rc=0, donc le defaut n'est pas observable par cette instance. Il est latent sur main et reel — il se declenche sur tout carnet illisible, et ce fichier existe dans les arbres de travail reels. Je corrige donc la cause, pas l'instance.

Le correctif

Fichier Δ Role
scripts/notebook_tools/check_split_reading_cells.py +33 / -5 le carnet illisible est rapporte et saute ; le mode fichier rend son rc proprement
scripts/tests/test_check_split_reading_cells.py +64 3 tests de regression, dans la suite canonique de l'organe
  • Mode dossier : le carnet illisible est rapporte (nomme sur stderr) et saute ; le recensement continue, et se declare PARTIEL (liste + compteur en fin de stderr, suffixe sur la ligne Total). Les findings des carnets sains sont rendus comme avant.
  • Mode fichier designe : le contrat documente (« 1 = fichier illisible ») etait rendu par une JSONDecodeError non rattrapee — traceback jusqu'a l'interpreteur. Meme code de retour, rendu proprement.

Deux decisions, assumees et ecrites

1. La forme du --json ne change pas. Le rapport d'illisibles passe par stderr, pas par stdout : le --json reste la liste de findings que consomment les bodies deja postes et le cliquet. Exposer le compteur en JSON aurait casse les consommateurs pour un gain de lisibilite.

2. Un carnet illisible n'est jamais ignore en silence. C'est le vrai risque de ce correctif : « ne plus avorter » peut degenerer en « avaler ». Un carnet saute se lirait comme un carnet propre — exactement ce que le cliquet doit empecher. D'ou le rapport en trois endroits (ligne par carnet, liste finale, suffixe sur Total) et la mention explicite que le total est partiel.

Ce que le correctif ne fait pas : il ne rend pas rc non-nul sur un carnet illisible. Reintroduire un rc=1 global recreerait le defaut d'origine sous une autre forme (rougir tout le depot pour un fichier sans rapport).

Preuves

  • 12 passed sur l'organe corrige (python -m pytest scripts/tests/test_check_split_reading_cells.py).
  • Controle positif — les 3 nouveaux tests ECHOUENT sur l'organe non corrige (origin/main), et passent sur le corrige : ce sont des tests de regression, pas des tautologies. Les 9 tests d'origine restent verts dans les deux etats.
  • Le carnet corrompu est place entre deux carnets sains : la preuve que le scan continue est que celui qui le suit est quand meme recense (un test qui ne verifierait que « pas de plantage » passerait aussi sur un scan qui s'arrete tot).

Perimetre, et ordre de merge

Cette PR corrige l'organe. Le volet « cablage en cliquet bloquant » de #17044 est hors perimetre : il est deja en vol dans mon #17031 (garde TRANCHE13 du registre fast_lane_registry.py). D'ou un See #17044, pas un Closes — l'issue demande les deux, cette PR n'en livre qu'un.

Ordre de merge a declarer : cette PR et #17135 touchent la meme suite de tests (scripts/tests/test_check_split_reading_cells.py). La seconde rebasera sur la premiere ; aucune des deux ne doit etre mergée en supposant l'autre acquise.

Verifie : check_unique_check_run_names.py --check OK.

🤖 Generated with Claude Code

…nsement

`scan_root` faisait `return 1` dans son `except (OSError, json.JSONDecodeError)` :
un seul carnet corrompu -- y compris sans aucun rapport avec la PR -- annulait
TOUT le recensement (rc=1, zero finding, pas seulement un recensement degrade)
et rougissait le depot entier. L'organe etait donc incablable en cliquet, ce que
#17044 nomme « bloquant a corriger d'abord ».

- mode dossier : le carnet illisible est **rapporte** (stderr, nomme) et **saute** ;
  le recensement continue et se declare PARTIEL (compteur + liste en fin de
  stderr, suffixe sur la ligne Total). Le total et les findings des carnets sains
  sont rendus comme avant.
- mode fichier designe : le contrat documente (« 1 = fichier illisible ») etait
  rendu par une JSONDecodeError NON RATTRAPEE (traceback jusqu'a
  l'interpreteur). Meme code de retour, rendu proprement.
- la forme du `--json` est INCHANGEE (liste de findings) : le rapport d'illisible
  passe par stderr, pour ne pas casser les consommateurs existants.

Le carnet illisible n'est jamais ignore en silence : un carnet saute se lirait
comme un carnet propre, ce qui est precisement le mode d'echec a eviter.

Tests (suite canonique de l'organe, aucun nouveau fichier) : carnet corrompu
place ENTRE deux carnets sains -> rc=0 et le carnet suivant est recense (preuve
que le scan continue) ; avec `--fail-on-findings` un vrai finding reste rc=2 ;
fichier designe illisible -> rc=1.

Mesure : 12 passed sur l'organe corrige. Controle positif : les 3 nouveaux tests
ECHOUENT sur l'organe non corrige (`origin/main`) -- ce sont des tests de
regression, pas des tautologies.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17166
head: f2ff155
complete: true
body: read
comments-reviewed: 0
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 5c02697e98e3b4b1f34def18194fd261d20594a878b7f6af83ea75f58d1410c6
diff-files: 2
diff-additions: 97
diff-deletions: 5
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17166 (fix(notebook-tools,#17044): un carnet illisible n'annule plus le recensement) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17166
head: f2ff155
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: dfece489f3ad3ce1c2ee2bfee455256e4f42f1d465e1aa8ab0aa85505766e88d
diff-files: 2
diff-additions: 97
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit a64bbde into main Sep 22, 2026
18 of 21 checks passed
jsboige added a commit that referenced this pull request Sep 22, 2026
…ts (rebase)

Rebase sur main courant (193 commits) + restructuration : la suite
originale de 18 tests (branche 5a74f99) est couverte a 85% par
#17135/#17166/#17170 sur le chemin canonique scripts/tests/. Livraison
du delta reel uniquement, dans le fichier canonique :

- titres ACCENTUES (« Lecture chiffrée du résultat ») : deaccent() est
  sur le chemin de detection, aucune donnee accentuee dans la suite
  existante ;
- source str (pas liste) : nbformat admet les deux, la suite existante
  ne fabrique que des listes ;
- convention epinglee « le titre compte dans la mesure » : corps
  disjoints, Jaccard = 1/8, containment rares = 1/4 (chiffres cites
  par les bodies #17040).

Le fichier parallele scripts/notebook_tools/tests/ est abandonne au
profit du chemin canonique. 48 tests collectes, 46 passed + 2 xfailed
sur l'organe courant.

Grain: po-2026 tests-delta check_split_reading_cells (#17077, rebase
post-#17135 demande par coordinateur)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 23, 2026
…ts (rebase) (#17087)

Rebase sur main courant (193 commits) + restructuration : la suite
originale de 18 tests (branche 5a74f99) est couverte a 85% par
#17135/#17166/#17170 sur le chemin canonique scripts/tests/. Livraison
du delta reel uniquement, dans le fichier canonique :

- titres ACCENTUES (« Lecture chiffrée du résultat ») : deaccent() est
  sur le chemin de detection, aucune donnee accentuee dans la suite
  existante ;
- source str (pas liste) : nbformat admet les deux, la suite existante
  ne fabrique que des listes ;
- convention epinglee « le titre compte dans la mesure » : corps
  disjoints, Jaccard = 1/8, containment rares = 1/4 (chiffres cites
  par les bodies #17040).

Le fichier parallele scripts/notebook_tools/tests/ est abandonne au
profit du chemin canonique. 48 tests collectes, 46 passed + 2 xfailed
sur l'organe courant.

Grain: po-2026 tests-delta check_split_reading_cells (#17077, rebase
post-#17135 demande par coordinateur)

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants