Le fait
scripts/notebook_tools/pedagogy_density_baseline.json porte 48 cles orphelines : des chemins de notebooks qui n'existent plus, laisses par la campagne de renumerotation/reclassement.
count declare : 814
cles dans le fichier : 814
notebooks traques : 1198
CLES ORPHELINES : 48
Mesure (sur main a 9803c6de2, 2026-08-31) :
import json, subprocess
d = json.load(open('scripts/notebook_tools/pedagogy_density_baseline.json', encoding='utf-8'))
tracked = set(x for x in subprocess.run(['git','ls-files','*.ipynb'],
capture_output=True, text=True).stdout.split('\n') if x)
orph = sorted(k for k in d['notebooks'] if k not in tracked)
print(len(orph)) # -> 48
D'ou elles viennent — ce sont des renommages, pas des suppressions
Les familles orphelines correspondent une a une a des reclassements deja mergés :
| Famille orpheline |
Cles |
Renommage a l'origine |
GameTheory-2..9* |
28 |
reclassement de la serie GameTheory |
GenAI/.../AI-Engine-WordPress/* |
8 |
deplacement de sous-serie |
Probas/PyMC/PyMC-2..9 |
8 |
0d3b026f9 — zero-pad PyMC 1-9 en 01-09 |
Search/Applications/Search/App-12-ConnectFour* |
2 |
07bf76093 — App-12 devient App-14b/14c |
SymbolicAI/Lean/Lean-11-TorchLean-Python |
1 |
b56d8f116 — devient Lean-11b |
GenAI/SemanticKernel/Createur de mail personnalise |
1 |
a tracer |
Le cas App-12-ConnectFour est le meme renommage qui a laisse main rouge sur check-navlinks le 2026-08-31 au matin (referents non suivis dans Search-17, repare par #13805). Le baseline est la seconde surface que ce renommage a laissee derriere lui — celle qui, elle, n'a rougi nulle part.
Pourquoi ca ne se repare pas tout seul
Le seul workflow qui touche ce fichier est .github/workflows/pedagogy-density-advisory.yml, et il ne peut pas ecrire :
permissions:
contents: read # <-- pas write
Aucune etape git commit / git push / create-pull-request n'y figure. Le refresh est manuel (python scripts/notebook_tools/pedagogy_density.py --update-baseline).
C'est une correction a apporter a la lecture courante : la review Hermes de #13796 ecrit que « le baseline se regenere au prochain refresh ». Il n'y a pas de prochain refresh automatique. Une cle orpheline y reste jusqu'a ce que quelqu'un lance la commande.
Ce que la campagne fait deja bien — et qu'il suffit de generaliser
Deux PRs de renum ouvertes mettent deja le baseline a jour, et de la bonne facon : un renommage chirurgical de la cle qui preserve la valeur de densite, pas une regeneration complete.
# #13797 (Search-15/16 -> 02b/02c) : +3/-3
- "…/Search-15-NetworkX.ipynb": 772.048,
+ "…/Search-02b-NetworkX.ipynb": 772.048,
# #13804 (QC-Py-Cloud-01 -> 03b) : +1/-1
- "…/QC-Py-Cloud-01-RiskParity-Composite.ipynb": 2224.667,
+ "…/QC-Py-Cloud-03b-RiskParity-Composite.ipynb": 2224.667,
La regeneration complete est a eviter : elle produirait un diff massif melant des entrees sans rapport avec le livrable — le poison-catalogue que catalog-pr-hygiene.md ferme deja pour COURSE_CATALOG.generated.json.
Acceptance
- Rattrapage : les 48 cles orphelines resolues — chacune soit renommee vers son chemin actuel en preservant sa valeur, soit retiree si le notebook a reellement disparu (a trancher cle par cle, pas en bloc : une valeur de densite perdue est une mesure perdue).
- Prevention : que la prochaine PR de renum ne puisse plus l'oublier. Deux voies, a trancher — (a) un organe advisory qui compte les cles orphelines et le signale sur la PR qui renomme ; (b) une ligne dans la procedure de renum. La (a) est preferable : la (b) repose sur la vigilance, et c'est precisement ce qui a produit 48 orphelines.
- Correction de doc : partout ou l'on suppose un refresh automatique de ce baseline, ecrire qu'il est manuel.
Hors scope
Origine
Trouve en arbitrant la reserve Hermes de #13796 (reclassement Z3-Python-07 -> 01b), qui signalait l'instance n° 49. Cette issue porte les 48 autres, que personne ne regardait.
Le fait
scripts/notebook_tools/pedagogy_density_baseline.jsonporte 48 cles orphelines : des chemins de notebooks qui n'existent plus, laisses par la campagne de renumerotation/reclassement.Mesure (sur
maina9803c6de2, 2026-08-31) :D'ou elles viennent — ce sont des renommages, pas des suppressions
Les familles orphelines correspondent une a une a des reclassements deja mergés :
GameTheory-2..9*GenAI/.../AI-Engine-WordPress/*Probas/PyMC/PyMC-2..90d3b026f9— zero-padPyMC 1-9en01-09Search/Applications/Search/App-12-ConnectFour*07bf76093— App-12 devient App-14b/14cSymbolicAI/Lean/Lean-11-TorchLean-Pythonb56d8f116— devient Lean-11bGenAI/SemanticKernel/Createur de mail personnaliseLe cas
App-12-ConnectFourest le meme renommage qui a laissemainrouge surcheck-navlinksle 2026-08-31 au matin (referents non suivis dansSearch-17, repare par #13805). Le baseline est la seconde surface que ce renommage a laissee derriere lui — celle qui, elle, n'a rougi nulle part.Pourquoi ca ne se repare pas tout seul
Le seul workflow qui touche ce fichier est
.github/workflows/pedagogy-density-advisory.yml, et il ne peut pas ecrire :Aucune etape
git commit/git push/create-pull-requestn'y figure. Le refresh est manuel (python scripts/notebook_tools/pedagogy_density.py --update-baseline).C'est une correction a apporter a la lecture courante : la review Hermes de #13796 ecrit que « le baseline se regenere au prochain refresh ». Il n'y a pas de prochain refresh automatique. Une cle orpheline y reste jusqu'a ce que quelqu'un lance la commande.
Ce que la campagne fait deja bien — et qu'il suffit de generaliser
Deux PRs de renum ouvertes mettent deja le baseline a jour, et de la bonne facon : un renommage chirurgical de la cle qui preserve la valeur de densite, pas une regeneration complete.
La regeneration complete est a eviter : elle produirait un diff massif melant des entrees sans rapport avec le livrable — le poison-catalogue que
catalog-pr-hygiene.mdferme deja pourCOURSE_CATALOG.generated.json.Acceptance
Hors scope
count_exercises.py, pas un defaut.translations/smt/z3-api.csv: meme classe, autre surface, et le moteur de traduction est sous hold user i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038. A traiter avec la famille Les CSV de traduction GenAI produisent des rendus non traduits (21 cell_id orphelins, 19 text_en vides) -- et render_notebook.py ne fait que WARN #13546 / fix(translation,#13546): purger 110 lignes CSV orphelines genai + render_notebook --fail-on-stale #13706, pas ici.COURSE_CATALOG.generated.jsonetdocs/archive/**: appartiennent respectivement a l'automatisation et a l'histoire. Ne pas les toucher.Origine
Trouve en arbitrant la reserve Hermes de #13796 (reclassement Z3-Python-07 -> 01b), qui signalait l'instance n° 49. Cette issue porte les 48 autres, que personne ne regardait.