Skip to content

[audit notebooks] Cellules de print() verbatim multi-lignes — pattern degenere repandu (~780 cellules sur 364 notebooks) #18874

Description

@jsboige

{
"title": "[audit notebooks] Cellules de print() verbatim multi-lignes — pattern dégénéré répandu (~780 cellules sur 364 notebooks)",
"body": "## Constat\n\nAudit first-hand du dépôt (1472 notebooks scannés, find MyIA.AI.Notebooks -name '*.ipynb').\n\nDeux filtres appliqués, mesures reproductibles :\n\n| Filtre | Critère | Compte |\n|---|---|---|\n| Dégénérées (degen) | Cellule code avec ≥5 instructions print(...) consécutives, ≤2 assignations, pas de def/class | 337 cellules |\n| Verbatim (verb) | Cellule code avec ≥5 prints ET ≥60% de la cellule = prints, pas de def/class | 443 cellules |\n| Total fichiers touchés | Au moins une cellule degen ou verb | 364 notebooks |\n\nLa cellule que tu signales dans GameTheory-15-CooperativeGames-Python.ipynb (Core vide du jeu de majorité, lignes 5–9 du print block) en est l'archétype : 5 lignes print(\" - v({A,B}) = ...\") sont du texte statique d'explication, pas du calcul. Le compute_core(majority_game) est appelé, le résultat est dans core_exists, et ensuite on imprime 5 lignes d'argumentation figée. C'est un cas où l'explication vit dans le print au lieu de vivre dans le markdown qui suit.\n\n## Pourquoi c'est dégénéré\n\nLe pattern viole l'esprit du notebook pédagogique :\n\n- On imprime du texte qu'on aurait pu écrire en prose. Une cellule markdown coûte le même prix qu'un print(), et elle s'affiche aussi bien dans Jupyter, sur GitHub, et dans un export HTML/PDF. Elle évite en plus le préfixe Out[N] qui pollue la sortie et empêche de copier-coller la valeur.\n- On sépare le calcul de l'explication. La cellule fait compute_core(...) puis bascule en mode « affiche 5 lignes argumentatives ». Le markdown adjacent peut déjà les porter ; la cellule devrait se borner au compute_core et (au plus) print(f\"core_exists = {core_exists}\").\n- Les bannières ASCII (print(\"=\"*50)) sont des remplissage qui imitent une console alors que le notebook est un document, pas un terminal.\n- Le format tableau manuel (cell #45 du même notebook : législatives 2024) est exactement ce que pandas.DataFrame ou tabulate sait faire en 1 ligne. Un print(tabulate(...)) calcule depuis les données ; un print(f\"{'Parti':<6} | ...\") les duplique en dur.\n\n## Ampleur mesurée first-hand\n\nTop 5 fichiers touchés :\n\n| Fichier | degen | verb |\n|---|---|---|\n| IIT/IIT-02-AdvancedTopics.ipynb | 5 | 6 |\n| ML/DataScienceWithAgents/.../1.2-Manipulation_de_Donnees_avec_NumPy.ipynb | 5 | 5 |\n| GameTheory/GameTheory-15-CooperativeGames-Python.ipynb | 4 | 4 |\n| IIT/ICT-Series/ICT-Dissociation-PhatSelfReference.ipynb | 4 | 4 |\n| QuantConnect/ML-Training-Pipeline/research_what_dl_can_predict.ipynb | 4 | 4 |\n\nExemples représentatifs dans GameTheory-15-CooperativeGames-Python.ipynb :\n\n- Cell #7 (5 prints, 1 assign) : shapley_value_exact calculé, puis 5 lignes de print(f\" {name}: {shapley_majority[i]:.4f}\") → pourrait être print(shapley_majority) ou un pandas.Series ; l'argumentation « → Tous les joueurs sont symétriques » devrait être en markdown.\n- Cell #9 (5 prints, 2 assigns) : idem pour board_game + double boucle Shapley/Banzhaf.\n- Cell #17 (9 prints, 1 assign) : la cellule que tu pointes — Core vide + 5 lignes d'argumentation statique.\n- Cell #27 (5 prints, 3 assigns) : 3 scénarios de Paperclip avec un seul print par scénario.\n- Cell #45 (9 prints, 2 assigns) : législatives 2024 avec format tableau ASCII manuel.\n\n## Acceptance\n\nRefactoring (peut se faire en plusieurs PRs groupés par série) :\n\n1. Convertir les bannières ASCII en ### Titre markdown quand elles introduisent une section.\n2. Déplacer les argumentations statiques en markdown sous la cellule de calcul, pas en print() au sein de la cellule.\n3. Remplacer les tableaux manuels par pandas.DataFrame ou tabulate quand les données viennent d'un calcul réel.\n4. Conserver un print(...) final qui affiche la valeur (liste, scalaire, court message) — c'est la sortie utile d'un notebook ; c'est le print(\"=\"*50) print(\"TITRE\") print(\"=\"*50) print(\"...5 lignes argumentatives figées...\") qui est dégénéré.\n\n## Périmètre proposé\n\n- Priorité 1 : GameTheory-15-CooperativeGames-Python.ipynb (le cas que tu signales, ticket source) — 4 cellules à refactorer.\n- Priorité 2 : top 5 fichiers de la table ci-dessus — 22 cellules à refactorer, livrable d'un seul PR possible.\n- Priorité 3 : balayage complet des 364 fichiers en plusieurs PRs (par série) — 780 cellules au total.\n\n## Garde-fou d'audit\n\nLe script de mesure est reproductible. Si on veut un jour le faire tourner en CI, l'organe d'audit existe déjà sous forme de snippet Python — la consolidation en script scripts/notebook_tools/audit_print_verbatim.py est un candidat à issue fille, mais pas le périmètre ici.\n\n## Notes\n\n- Conformité H.3 (pre-commit notebooks) : pas de contrainte sur le contenu des cellules code, seulement sur l'exécution. Ces cellules ne violent pas H.3 (elles s'exécutent et produisent la sortie attendue), elles violent la convention de style C.2 (outputs pédagogiques propres) et F (lisibilité).\n- Conformité C.1 (pas d'erreur volontaire) : OK, pas de raise NotImplementedError.\n- L'output actuel est conservé par execution_count: <int> et outputs: [...] ; le refactoring n'altère pas les outputs existants tant que la cellule produit au moins un print. C'est un changement de forme, pas de substance.\n\nRef tag : Grain: LIGHT/audit (petit par cellule, mais × 780 = 25+ cycles). À scoper en PRs par série.\n",
"labels": ["audit", "quality", "documentation"]
}

No activity

Activity on this issue will appear here.

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

    auditAutomated quality audit findingsdocumentationImprovements or additions to documentationqualityNotebook quality issues

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions