Skip to content

fix(pedagogy-density,#13815): rattraper 48 cles orphelines (45 renames preservant valeur, 3 retraits) - #14257

Merged
jsboige merged 1 commit into
mainfrom
feature/c173-cycle
Sep 2, 2026
Merged

jsboige merged 1 commit into
mainfrom
feature/c173-cycle

Conversation

@jsboige

@jsboige jsboige commented Sep 2, 2026

Copy link
Copy Markdown
Owner

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.json portait 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=814 mais intersection(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)

Sous-livraison Volume Action Justification preservation valeur
28 GameTheory (zero-pad) 28 cles GameTheory-2..9-* → GameTheory-02..09-* git mv pur, ratio prose/cellule invariant
8 PyMC (zero-pad) 8 cles PyMC-2..9-* → PyMC-02..9-* idem
8 AI-Engine-WordPress 8 cles racine → 03-Functional/0X-Y/... (Chatbots, Forms, RAG, MCP, Multi-Provider, Securite) deplacement sous-dossier, contenu identique
1 SymbolicAI/Lean 1 cle Lean-11-TorchLean-Python → Lean-11b-TorchLean-Python zero-pad slot side
3 retraits purs 3 cles SemanticKernel/Créateur de mail personnalisé, QC-Py-Cloud-06-VolTargeting, Lean-18-Search-AStar-Optimality notebooks reellement disparus, valeur non-transférable

Detail des 3 retraits :

  1. SemanticKernel/Créateur de mail personnalisé.ipynb : supprime en commit 56ec9751 (mass cleanup i18n i18n(lean): harmoniser les fichiers .lean en francais + traduction anglaise — inventaire, convention, PR pilote #4980), pas de renommage ailleurs
  2. QuantConnect/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 est QC-Py-Cloud-06-PCA-StatArb.ipynb, semantiquement distinct → valeur de densite non-transférable
  3. SymbolicAI/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

Mesure Avant Apres Source
Orphelines residuelles 48 0 script Python : sorted(k for k in d['notebooks'] if k not in tracked)
Clés dans le baseline 814 811 len(d['notebooks'])
count declare 814 811 d['count']
Valeurs preservees (45 renames) n/a 45/45 memes floats (chacun verifie sur la cle avant/apres) git diff ligne-a-ligne
Doublons crees n/a 0 script pre-flight : intersection(45 cibles, baseline) = 0
Lignes ajoutees dans le JSON n/a 45 + 1 (count) = 46 git diff --stat
Lignes supprimees du JSON n/a 45 + 3 = 48 git diff --stat
Fichiers touches n/a 1 (pedagogy_density_baseline.json) git diff --stat
catalog-pr-hygiene R1 (catalogue byte-identique) OK OK aucun marqueur CATALOG-STATUS touche
Pre-commit hook gitleaks n/a Passed log ci-dessus
Anti-regression D OK OK aucun code de production touche, aucune cellule de notebook modifiee

Decisions-cles

Preservation de valeur de densite : pour les 45 renames, j'ai preserve le float exact (le ratio prose_chars / code_cells est invariant par git 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 via open(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

  • SOTA-OK : pas de workaround degrade. Le baseline est un artefact de mesure, je ne le modifie que pour corriger des cles obsoletes (45 renames) ou supprimer des mesures devenues caduques (3 retraits). Aucun outil externe n'est sollicite.
  • C.1 / C.2 / H.3 / catalog-pr-hygiene R1 : N/A (pas de notebook touche, pas de marqueur catalogue touche).
  • Anti-regression D : OK (baseline = mesure, pas code de production ; les float preserves restent coherents avec les notebooks reels).
  • pr-review-discipline §E (audit fichier-entier) : OK, le fichier de baseline est une serialisation JSON lineaire, pas un README avec des listes ; le diff chirurgical suffit.
  • model-delegation : N/A (pas de sous-agent delegue).
  • G.9 / verify-before-claiming : les 48 orphelines sont verifiees par git ls-files, les 45 cibles sont verifiees par git ls-files, les 3 retraits sont verifies par git 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

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

…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>
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA a deja consomme son budget LIGHT du jour (#13987 (merge a 2026-09-02T00:13:22Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-02) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

HOLD G-VAR-2 — budget LIGHT dépassé, 24 h maximum. Rien à redire au travail lui-même : gates verts, check_unaddressed_nits rc=0, aucune réserve ouverte. Le hold porte sur la composition du cycle de la lane, pas sur cette PR.

Sortie de l'organe (variation_light_cap.py --replay <200 mergées> --check-pr <N>), mesurée à 09:52Z avant ma passe de merge :

lane myia-po-2026:CoursIA
  lane_grains 42 · budget 14 · spent 20 · light_genre 19 · genre_cap 14
  CAP-EXCEEDED-BY-GENRE  true
  GENRE-RUN              true   (guard x3 : #13971 #13994 #13812 ; guard x2 : #13899 #13917)
  VEIN-RUN               true   (vein 13410 x3 : #14149 #14156 #14159)
  by_genre : tooling 11 · guard 9 · notebook-python 7 · docs 5 · refactor 3 · test 3 · notebook-lean 2

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 MED/tooling. Les deux étaient déclarés LIGHT alors qu'ils réparent un défaut mesuré avec table d'acceptance et contrôle positif — le litmus LIGHT (« pourrais-je en générer une douzaine en scannant l'instance suivante ? ») ne passe pas sur eux. #14055 aussi, comme plus ancienne LIGHT approchant les 24 h.

Ce qui lève ce hold, au choix :

  1. la lane livre d'abord un grain de genre CONTENU (notebook-python / notebook-lean / lean / qc / training / genai / slides / research-code) — ce hold tombe au merge de celui-ci ;
  2. ou 24 h s'écoulent : je merge alors sans autre condition. Le protocole interdit de tenir une LIGHT plus d'une journée, et un hold que je ne lève pas devient de la pourriture dont je suis responsable.

Le grain nommé, en attendant : #14045 est à toi et DIRTY depuis 23 h (test(#13927): +7 tests audit_engine_named_not_invoked). La règle « répare ton rouge d'abord » la met devant tout tirage neuf — et c'est le seul travail que personne d'autre ne peut faire à ta place : le coordinateur ne peut ni rebaser ni corriger une branche de lane.

@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #14257 (fix(pedagogy-density,#13815): rattraper 48 cles orphelines (45 renames preservant valeur, 3 retraits)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Sep 2, 2026
@jsboige
jsboige merged commit 8b5a24c into main Sep 2, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants