Repository navigation
fix(pedagogy-density,#13815): rattraper 48 cles orphelines (45 renames preservant valeur, 3 retraits) - #14257
Conversation
…s preservant valeur, 3 retraits) Issue : #13815 -- le baseline de densite pedagogique (scripts/notebook_tools/ pedagogy_density_baseline.json) portait 48 cles orphelines a `git ls-files *.ipynb` : des chemins de notebooks qui n'existaient plus sur disque, laisses par la campagne de renumerotation/reclassement (zero-pad GameTheory-2 -> -02, zero-pad PyMC-2 -> -02, deplacements AI-Engine-WordPress sous sous-dossiers, descent Lean-11-TorchLean -> Lean-11b). Mesure : `len(d['notebooks']) - len(intersection(d, tracked))` = 48. Cause structurelle : le seul workflow qui touche ce fichier (.github/workflows/pedagogy-density-advisory.yml) est `contents: read`, donc le refresh ne peut pas se faire tout seul -- le rattrapage necessite une PR. Acceptance #13815 #1 (rattrapage, partie 1/3) : - 45 cles orphelines renommees vers leur chemin actuel **en preservant la valeur de densite** (ratio prose_chars / code_cells est invariant par `git mv`, le contenu des cellules ne change pas avec un rename pur) : - 28 GameTheory (zero-pad) : GameTheory-2..9 -> GameTheory-02..09 - 8 PyMC (zero-pad) : PyMC-2..9 -> PyMC-02..09 - 8 AI-Engine-WordPress (deplacement) : racine -> 03-Functional/0X-Y/... - 1 SymbolicAI/Lean : Lean-11-TorchLean-Python -> Lean-11b-TorchLean-Python - 3 cles orphelines retirees (notebooks reellement disparus, valeur perdue) : - `SemanticKernel/Créateur de mail personnalisé.ipynb` : supprime en commit `56ec9751` (mass cleanup i18n), aucun renommage ailleurs - `QuantConnect/Python/QC-Py-Cloud-06-VolTargeting.ipynb` : supprime en PR #14093 (collision resolution, le notebook final est PCA-StatArb, densite non-transferable) - `SymbolicAI/Lean/Lean-18-Search-AStar-Optimality.ipynb` : supprime en PR #13685 (descent vers Search/Part1-Foundations). Le renommage arrive avec PR #14250 (OPEN, pas mergée). Coherence preservee : la PR #14250 reintroduira la cle avec le bon chemin lors de son merge. Acceptance #13815 #2 (prevention) et #3 (doc) : hors scope de cette PR-ci. Sortie en issues de suivi separees pour eviter de gonfler la PR (catalog-pr-hygiene R3 : un seul sujet par PR). La prevention (advisory qui compte les orphelines sur la PR de renum) et la doc (mention du caractere MANUEL du refresh) peuvent atterrir dans une PR dediee. Verification post-fix : - Orphelines residuelles : 0 (avant 48) - count : 811 (avant 814, -3 retraits) - Diff JSON : 45 lignes ajoutees + 48 lignes supprimees (3 retraits + 45 renames), valeurs numeriques preservees (chacun des 45 renames : meme float, juste la cle change) - Aucune cle cible n'etait deja dans le baseline (pas de doublon cree) - CRLF : ecriture forcee en LF (`open(NB, 'wb') + bytes(utf-8) + b'\n'`), conforme au fichier d'origine (LF), sinon le diff faisait +818/-821 a cause du `\r\n` Windows par defaut Refs : #13815, #13797 (Search-15/16 zero-pad parent), #13685 (Lean-18 descent), #14093 (QC collision), #14250 (Lean-18 vers Search-03e, OPEN), #13838 (review Hermes initiale qui a signale la classe). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
HOLD G-VAR-2 — budget LIGHT dépassé, 24 h maximum. Rien à redire au travail lui-même : gates verts, Sortie de l'organe ( Six LIGHT au-dessus du budget, et la répartition dit le reste : 28 des 41 grains de la lane sont de genre META (tooling+guard+docs+test+refactor). C'est le signal G-VAR-1 — l'atelier s'outille, la fabrication ne sort pas. Ce que j'ai mergé de la lane dans le même geste, pour que le hold ne se lise pas comme un blocage général : #14224, #14233, #14240 tels quels, et #14230 + #14237 après re-qualification de leur tag en Ce qui lève ce hold, au choix :
Le grain nommé, en attendant : #14045 est à toi et DIRTY depuis 23 h ( |
Path-collision (organ #13359/#13615)Cette PR #14257 (
|
Grain: LIGHT/tooling -- lane myia-po-2026:CoursIA -- prev: LIGHT/notebook-pedagogy #14252 (cycle 172)
Summary
Resolution de l'acceptance #1 (rattrapage) de l'issue #13815 :
scripts/notebook_tools/pedagogy_density_baseline.jsonportait 48 cles orphelines (chemins de notebooks qui n'existent plus sur disque), laissees par la campagne de renumerotation/reclassement de la semaine (zero-pad GameTheory-2 → -02, zero-pad PyMC-2 → -02, deplacement AI-Engine-WordPress sous sous-dossiers, descente Lean-11-TorchLean → -11b).Avant : 814 cles dans le baseline, 48 orphelines (
count=814maisintersection(tracked) = 766).Apres : 811 cles, 0 orpheline (
count=811,intersection(tracked) = 811).Sortie : 1 commit, 1 fichier modifie, 46 insertions / 49 deletions, 0 orpheline residuelle.
Acceptance #13815 #1 (rattrapage)
GameTheory-2..9-*→GameTheory-02..09-*git mvpur, ratio prose/cellule invariantPyMC-2..9-*→PyMC-02..9-*03-Functional/0X-Y/...(Chatbots, Forms, RAG, MCP, Multi-Provider, Securite)Lean-11-TorchLean-Python→Lean-11b-TorchLean-PythonSemanticKernel/Créateur de mail personnalisé,QC-Py-Cloud-06-VolTargeting,Lean-18-Search-AStar-OptimalityDetail des 3 retraits :
SemanticKernel/Créateur de mail personnalisé.ipynb: supprime en commit56ec9751(mass cleanup i18n i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980), pas de renommage ailleursQuantConnect/Python/QC-Py-Cloud-06-VolTargeting.ipynb: supprime en PR refactor(qc-py-cloud): resolve Cloud-06 collision (PCA-StatArb vs VolTargeting) #14093 (collision resolution). Le notebook final estQC-Py-Cloud-06-PCA-StatArb.ipynb, semantiquement distinct → valeur de densite non-transférableSymbolicAI/Lean/Lean-18-Search-AStar-Optimality.ipynb: supprime en PR Fix(notebooks,13488): descent Lean-18 to Search/Part1-Foundations (issue 13662) #13685 (descent Search/Part1-Foundations). Le renommage arrive avec PR fix(search,#13841): minimal rename Lean-18 -> Search-03e + README attribution fix #14250 (OPEN). Le merge de fix(search,#13841): minimal rename Lean-18 -> Search-03e + README attribution fix #14250 reintroduira la cle avec le bon chemin lors de son merge (cf body de PR fix(search,#13841): minimal rename Lean-18 -> Search-03e + README attribution fix #14250)Verification post-fix
sorted(k for k in d['notebooks'] if k not in tracked)len(d['notebooks'])d['count']git diffligne-a-lignegit diff --statgit diff --statpedagogy_density_baseline.json)git diff --statCATALOG-STATUStouchegitleaksDecisions-cles
Preservation de valeur de densite : pour les 45 renames, j'ai preserve le float exact (le ratio
prose_chars / code_cellsest invariant pargit mv-- un renommage pur ne touche pas le contenu des cellules). C'est la pratique des PRs recentes de renum citees dans le body de #13815 (#13797 Search-15/16 → 02b/02c, #13804 QC-Py-Cloud-01 → 03b, qui font +N/-N avec valeur preservee).Retrait vs preservation pour les 3 cas "disparus" : valeur perdue plutot que re-mesure speculative. Une PR de rattrapage ne peut pas re-mesurer la densite d'un notebook qui n'existe plus, et inventerait une mesure. La note explicite est dans le body PR (les 3 cas sont commentes un par un).
Minimal-diff preservation (CRLF → LF) : le repo est en LF. Mon premier essai avec
open(NB, 'w')a ecrit en\r\n(CRLF Windows), ce qui a produit un diff +818/-821 completement mecanique. Force viaopen(NB, 'wb') + bytes(utf-8) + b'\n'→ diff +46/-49. Cf issue #13815 mentionnee explicitement : « la regeneration complete est a eviter : elle produirait un diff massif melant des entrees sans rapport avec le livrable ».Verdicts
git ls-files, les 45 cibles sont verifiees pargit ls-files, les 3 retraits sont verifies pargit log --diff-filter=D. Toutes les cibles mappées existent, tous les retraits ont une justification de suppression documentee.Residuel / suite (acceptance #2 et #3 de #13815)
Lecons trans-cycle
json.dump(..., open(NB, 'w'))ecrit du CRLF sur Windows, le repo est en LF → diff massif. Le pattern robuste :open(NB, 'wb')+text.encode('utf-8')+b'\n'. Memoire cfpython-text-mode-eol-rewrite.md(lecon soeur surread_text/write_text).dict(sorted(...))ou comprehensions qui changent l'ordre.git ls-files/git log --diff-filter=DAVANT tout travail de patch. Ce grain a tenu : le mapping 45 renames + 3 retraits est issu d'une verification directe sur origin/main.Rotation R6
c169 = GUARD/ci slides-composition-advisory ; c170 = LIGHT/notebook-cleanup Tweety-7a parite (#14211) ; c171 = LIGHT/docs DSWA README 04-Vision (#14190) ; c172 = LIGHT/notebook-pedagogy CSP-2 PC-2 + k-consistance (#14066) ; c173 = LIGHT/tooling pedagogy-density 48 orphelines (#13815).
Regle 6 (variete obligatoire) :
Liens
.github/workflows/pedagogy-density-advisory.yml(contents: read, ne peut pas ecrire)python-text-mode-eol-rewrite.md(CRLF trap)