Le defaut
Une cellule dont le source est une chaine unique au lieu d'une liste de lignes rend chaque edition ulterieure illisible en diff : corriger un mot dans une cellule de 40 lignes produit une paire +/- de 40 lignes. nbformat accepte les deux formes ; Jupyter ecrit la forme liste. Le cout n'est donc pas la validite, c'est la relecture.
Il a un cout mesure : la lane myia-po-2025:Maintenance a passe trois commits (d821fbe8, 5a3810d8, plus une relance URGENT) sur #14046 a chasser ce qu'elle croyait etre une re-serialisation. Mesure faite : les 4 cellules concernees etaient neuves, ecrites en forme string des l'origine — il n'y avait aucune forme a restaurer. Le temps a ete depense sur une premisse fausse faute d'un cadrage repo-wide.
L'etendue — mesuree le 2026-09-02 sur main
1 224 notebooks sous MyIA.AI.Notebooks/ (hors .ipynb_checkpoints, hors *_output.ipynb) :
|
notebooks |
cellules |
| MIXTES — une minorite de cellules brise la convention que le reste du meme fichier suit |
162 |
633 |
| INTEGRALEMENT string — le notebook a ete ecrit ainsi de bout en bout |
3 |
45 |
| total portant >= 1 cellule string |
165 (13,5 %) |
678 (1,72 % des 39 344) |
Seuls les 162 mixtes sont la cible. Convertir les 3 integralement-string produit un diff de fichier entier sans valeur pour un relecteur : les exclure explicitement.
Partition par famille (cellules string, notebooks mixtes seuls)
| cellules |
famille |
| 156 |
QuantConnect |
| 135 |
GenAI |
| 116 |
SymbolicAI |
| 82 |
ML |
| 37 |
Search |
| 28 |
Sudoku |
| 21 |
RL |
| 19 |
Probas |
| 15 |
CaseStudies |
| 13 |
GameTheory |
| 11 |
IIT |
Tetes de liste (string / total)
25/30 (83%) GenAI/Video/01-Foundation/01-4-Video-Enhancement-ESRGAN.ipynb
16/41 (39%) ML/ML.Net/ML-1-Introduction.ipynb
15/57 (26%) QuantConnect/Python/QC-Py-03-Data-Management.ipynb
15/40 (38%) ML/DataScienceWithAgents/Track2-GoogleADK/Day7-Production/Lab17-Final-Project.ipynb
13/26 (50%) GenAI/CaseStudies/Barbie-Schreck/barbie-schreck.ipynb
12/27 (44%) RL/rlpt_3_reward_hacking.ipynb
12/19 (63%) SymbolicAI/Lean/Lean-12b-Lean-Sensitivity-Theorem.ipynb
11/51 (22%) SymbolicAI/SemanticWeb/SW-3-CSharp-GraphOperations.ipynb
L'organe existe deja — ne pas en ecrire un autre
scripts/notebook_tools/fix_string_cells.py, 48 tests (livres par #700). Convention nbformat respectee (retour ligne sur toutes les lignes sauf la derniere), --dry-run disponible.
python scripts/notebook_tools/fix_string_cells.py <chemin> --dry-run
Garde obligatoire — la conversion ne doit RIEN changer d'autre
Une normalisation de serialisation touche la forme, jamais le contenu. Avant de committer, controle positif par notebook :
- le
source rejoint de chaque cellule est byte-identique avant/apres ;
outputs et execution_count sont inchanges sur toutes les cellules ;
- le nombre de cellules est inchange.
Si l'un des trois bouge, ce n'est plus une normalisation — c'est une edition de contenu, et elle releve de C.2 (re-execution) et non de ce grain.
Interdit explicite : ne pas en profiter pour toucher la prose, les sorties ou les accents. Un diff de ce grain ne doit contenir que des changements de forme source.
Tier et usage — a lire avant de le piocher
LIGHT. Le litmus de .claude/rules/variation-protocol.md est sans ambiguite : « pourrais-je en generer une douzaine en scannant l'instance suivante ? » — oui, onze fois, une par famille. Consequences :
- ce grain ne tient pas le plancher G-VAR-1 et consomme le budget G-VAR-2 ;
- il ne se prend pas deux fois de suite (G-VAR-3, genre LIGHT, ban absolu a 2) ;
- c'est un remplissage de fin de cycle, jamais un plat principal.
Il est mis en file parce qu'il est reel et mesure, pas parce qu'il est prioritaire.
Decoupage propose
Une PR par famille, dans l'ordre du tableau (les grosses d'abord, elles portent le plus de cout de relecture). Onze PRs au total, chacune citant :
- le compte avant/apres pour sa famille,
- la sortie du controle positif ci-dessus,
- l'exclusion nommee des 3 notebooks integralement-string s'ils tombent dans la famille.
Acceptance
Ce que ce grain ne fait PAS
Il n'ajoute pas de garde CI. Un gate qui rougirait sur toute cellule string bloquerait les outils d'enrichissement qui ecrivent en string (c'est leur sortie naturelle, cf. #14046). La question d'un garde se repose apres la normalisation, sur une base propre, et separement.
Mesure et cadrage : passe de coordination du 2026-09-02, a partir du cout reel constate sur #14046.
Le defaut
Une cellule dont le
sourceest une chaine unique au lieu d'une liste de lignes rend chaque edition ulterieure illisible en diff : corriger un mot dans une cellule de 40 lignes produit une paire+/-de 40 lignes. nbformat accepte les deux formes ; Jupyter ecrit la forme liste. Le cout n'est donc pas la validite, c'est la relecture.Il a un cout mesure : la lane
myia-po-2025:Maintenancea passe trois commits (d821fbe8,5a3810d8, plus une relance URGENT) sur #14046 a chasser ce qu'elle croyait etre une re-serialisation. Mesure faite : les 4 cellules concernees etaient neuves, ecrites en forme string des l'origine — il n'y avait aucune forme a restaurer. Le temps a ete depense sur une premisse fausse faute d'un cadrage repo-wide.L'etendue — mesuree le 2026-09-02 sur
main1 224 notebooks sous
MyIA.AI.Notebooks/(hors.ipynb_checkpoints, hors*_output.ipynb) :Seuls les 162 mixtes sont la cible. Convertir les 3 integralement-string produit un diff de fichier entier sans valeur pour un relecteur : les exclure explicitement.
Partition par famille (cellules string, notebooks mixtes seuls)
Tetes de liste (string / total)
L'organe existe deja — ne pas en ecrire un autre
scripts/notebook_tools/fix_string_cells.py, 48 tests (livres par #700). Convention nbformat respectee (retour ligne sur toutes les lignes sauf la derniere),--dry-rundisponible.Garde obligatoire — la conversion ne doit RIEN changer d'autre
Une normalisation de serialisation touche la forme, jamais le contenu. Avant de committer, controle positif par notebook :
sourcerejoint de chaque cellule est byte-identique avant/apres ;outputsetexecution_countsont inchanges sur toutes les cellules ;Si l'un des trois bouge, ce n'est plus une normalisation — c'est une edition de contenu, et elle releve de C.2 (re-execution) et non de ce grain.
Interdit explicite : ne pas en profiter pour toucher la prose, les sorties ou les accents. Un diff de ce grain ne doit contenir que des changements de forme
source.Tier et usage — a lire avant de le piocher
LIGHT. Le litmus de
.claude/rules/variation-protocol.mdest sans ambiguite : « pourrais-je en generer une douzaine en scannant l'instance suivante ? » — oui, onze fois, une par famille. Consequences :Il est mis en file parce qu'il est reel et mesure, pas parce qu'il est prioritaire.
Decoupage propose
Une PR par famille, dans l'ordre du tableau (les grosses d'abord, elles portent le plus de cout de relecture). Onze PRs au total, chacune citant :
Acceptance
sourceen forme chaineoutputsetexecution_countinchangesCe que ce grain ne fait PAS
Il n'ajoute pas de garde CI. Un gate qui rougirait sur toute cellule string bloquerait les outils d'enrichissement qui ecrivent en string (c'est leur sortie naturelle, cf. #14046). La question d'un garde se repose apres la normalisation, sur une base propre, et separement.
Mesure et cadrage : passe de coordination du 2026-09-02, a partir du cout reel constate sur #14046.