Skip to content

fix(notebooks): sauts de ligne doublés dans 16 notebooks de main — 4 tableaux GFM cassés, code illisible #17550

Description

@jsboige

Constat (mesuré le 2026-09-23 sur origin/main 6e5c092410)

Dans certains notebooks, chaque saut de ligne des sources est doublé : a\nb est devenu a\n\nb, et une ligne vide est devenue trois. Les conséquences, de la plus grave à la plus légère :

  1. Tableaux GFM cassés. Une ligne vide s'intercale entre l'en-tête et la ligne |---|, et le tableau s'affiche comme du texte brut.
  2. Cellules de code doublées. Une ligne vide sépare chaque ligne de code. La lecture est dégradée, et le contenu des chaînes multi-lignes change aussi.
  3. Cellules markdown doublées sans tableau. L'affichage est quasi inchangé, mais les listes deviennent « lâches ».

L'instance découverte en premier est Lean-6-Mathlib-Essentials.ipynb, réparée par #17110. Là, la cause est datée : #16862 REPAIR-7 puis REPAIR-8 (détail dans le body de #17110). Pour les autres notebooks, le doublement est déjà présent au commit racine de l'historique disponible (7e69518092, 2026-07-21) : leur cause est antérieure et n'est pas datable ici.

Signature et organe de mesure

Une cellule est comptée si ses lignes d'indice impair sont toutes vides, avec au moins trois lignes non vides, et si elle contient trois lignes vides consécutives (\n\n\n\n). La seconde condition écarte la prose légitime à paragraphes espacés. Un tableau est compté cassé sur le motif ligne |…|, ligne vide, séparateur |---|. Le balayage porte sur les 1383 notebooks de main hors _output.

Notebook Tableaux GFM cassés Cellules doublées (3 lignes vides consécutives) Cellules de code doublées
SymbolicAI/Lean/Lean-6-Mathlib-Essentials.ipynb 5 23 15
Search/Part1-Foundations/Search-02c-QuikGraph.ipynb 4 15 6
SymbolicAI/SMT/Z3-API/Z3-08-Ordonnancement-Python.ipynb 1 16 9
SymbolicAI/Argument_Analysis/Argument_Analysis_Multi_Backend_Routing.ipynb 1 13 10
SymbolicAI/SMT/Z3-API/Z3-09-Enigme-Einstein-Python.ipynb 0 15 7
Search/Applications/Search/App-14-ConnectFour-Adversarial.ipynb 0 6 0
SymbolicAI/SMT/Z3-API/Z3-Python-13-UnsatCores.ipynb 0 4 0
SymbolicAI/SMT/Z3-API/Z3-14-BitVectors-Overflow-Python.ipynb 0 4 0
SymbolicAI/SMT/Z3-API/Z3-12-Real-Arithmetic-Python.ipynb 0 4 0
SymbolicAI/SMT/Z3-API/Z3-10-Cryptarithmetic-Python.ipynb 0 4 0
GenAI/PostTraining/PT_11d_multiseed_qwen35_4x100.ipynb 0 3 3
Sudoku/Sudoku-09-GraphColoring-Csharp.ipynb 0 2 5
Probas/DecisionTheory/DecInfer/DecInfer-07-Expert-Systems.ipynb 0 1 1
GenAI/Video/02-Advanced/02-7-CogVideoX-Text-to-Video.ipynb 0 1 0
GameTheory/SocialChoice/01b-Lean-SocialChoice-Formal.ipynb 0 1 0
SymbolicAI/SemanticWeb/SW-9-CSharp-JSONLD.ipynb 0 0 1

Aucune PR ouverte ne touche les quatre premières lignes après Lean-6 (vérifié sur les fichiers des 163 PRs ouvertes). Sudoku-09-GraphColoring-Csharp est touché par #17051, SW-9-CSharp-JSONLD par #17056 et 01b-Lean-SocialChoice-Formal par #17192 : ces trois-là attendent l'issue de leur PR.

Réparation (par notebook)

  1. Dans chaque cellule qui porte la signature, retirer les lignes d'indice impair : '\n'.join(L[0::2]), où L = source.split('\n'). Le geste est déterministe.
  2. Vérifier que le texte normalisé (accents repliés, espaces fusionnés) de chaque cellule est identique avant et après. Un écart signifie que le geste a touché autre chose qu'un saut de ligne, et la PR s'arrête là.
  3. Vérifier que les tableaux GFM s'affichent de nouveau.
  4. Si une cellule de code a changé, ré-exécuter le notebook avec son vrai noyau, comme l'exige C.2 : Python pour Z3, .NET Interactive pour Search-02c-QuikGraph. Les sorties doivent venir de cette exécution.
  5. Ne rien faire d'autre dans la même PR : ni densification, ni réaccentuation, ni réécriture.

Découpe : une PR par notebook, ou trois d'une même série au plus. Ordre : les tableaux cassés d'abord (Search-02c-QuikGraph, Z3-08-Ordonnancement-Python, Argument_Analysis_Multi_Backend_Routing), puis le code doublé (Z3-09-Enigme-Einstein-Python, PT_11d_multiseed_qwen35_4x100), puis le reste. Les lignes marquées d'une seule cellule sont à confirmer à la lecture avant tout geste : la signature peut s'y déclencher sur une cellule légitime.

Critères d'acceptation

Piste d'outillage (non incluse)

fix_list_newlines (scripts/notebook_tools/fix_string_cells.py) a matérialisé le doublement de Lean-6. Une liste ['a', '', '', '', 'b'] est ambiguë, et l'outil ne peut pas savoir qu'elle vient d'un join fautif. Le faire refuser ce motif plutôt que le réparer fermerait la porte d'entrée. C'est un grain séparé.

Voir #17110 (instance Lean-6) et #16862 (REPAIR-7/8).

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