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 :
- 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.
- 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.
- 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)
- 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.
- 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à.
- Vérifier que les tableaux GFM s'affichent de nouveau.
- 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.
- 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).
Constat (mesuré le 2026-09-23 sur
origin/main6e5c092410)Dans certains notebooks, chaque saut de ligne des sources est doublé :
a\nbest devenua\n\nb, et une ligne vide est devenue trois. Les conséquences, de la plus grave à la plus légère :|---|, et le tableau s'affiche comme du texte brut.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 demainhors_output.SymbolicAI/Lean/Lean-6-Mathlib-Essentials.ipynbSearch/Part1-Foundations/Search-02c-QuikGraph.ipynbSymbolicAI/SMT/Z3-API/Z3-08-Ordonnancement-Python.ipynbSymbolicAI/Argument_Analysis/Argument_Analysis_Multi_Backend_Routing.ipynbSymbolicAI/SMT/Z3-API/Z3-09-Enigme-Einstein-Python.ipynbSearch/Applications/Search/App-14-ConnectFour-Adversarial.ipynbSymbolicAI/SMT/Z3-API/Z3-Python-13-UnsatCores.ipynbSymbolicAI/SMT/Z3-API/Z3-14-BitVectors-Overflow-Python.ipynbSymbolicAI/SMT/Z3-API/Z3-12-Real-Arithmetic-Python.ipynbSymbolicAI/SMT/Z3-API/Z3-10-Cryptarithmetic-Python.ipynbGenAI/PostTraining/PT_11d_multiseed_qwen35_4x100.ipynbSudoku/Sudoku-09-GraphColoring-Csharp.ipynbProbas/DecisionTheory/DecInfer/DecInfer-07-Expert-Systems.ipynbGenAI/Video/02-Advanced/02-7-CogVideoX-Text-to-Video.ipynbGameTheory/SocialChoice/01b-Lean-SocialChoice-Formal.ipynbSymbolicAI/SemanticWeb/SW-9-CSharp-JSONLD.ipynbAucune 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-Csharpest touché par #17051,SW-9-CSharp-JSONLDpar #17056 et01b-Lean-SocialChoice-Formalpar #17192 : ces trois-là attendent l'issue de leur PR.Réparation (par notebook)
'\n'.join(L[0::2]), oùL = source.split('\n'). Le geste est déterministe.Search-02c-QuikGraph. Les sorties doivent venir de cette exécution.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
mainne rend plus que des faux positifs déclarés.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'unjoinfautif. 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).