Skip to content

Feat(catalog,#24994): sous_serie_path multi-niveaux + bucketisation par chemin complet - #25124

Open
jsboige wants to merge 2 commits into
mainfrom
feature/24994-catalog-subseries
Open

jsboige wants to merge 2 commits into
mainfrom
feature/24994-catalog-subseries

Conversation

@jsboige

@jsboige jsboige commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: MED/guard #24964

See #24994 (Epic #24993)

Ce que fait cette PR

Le générateur de catalogue ne descendait qu'un seul niveau sous la série : sous_serie portait uniquement le premier segment (analyze_notebook, l.1293 de main). Résultat mesuré sur le catalogue committé : les 113 carnets de ML/DataScienceWithAgents (3 niveaux réels) sortaient tous dans un seau plat sous_serie: "DataScienceWithAgents", et les 161 de SymbolicAI/Lean dans un seau Lean — la structure de l'arbre était invisible.

Deux changements :

  1. sous_serie_path + sous_serie_levels (chemin complet sous la série, tous niveaux) ajoutés à chaque entrée ; sous_serie garde le premier segment (compat marqueurs/parcours qui filtrent par égalité).
  2. _serie_buckets bucketise par chemin complet : un carnet Serie/A/B/nb.ipynb vit sous A/B, pas sous A. Markdown plafonne les headings à h6 alors que l'arbre réel descend à 5 niveaux de sous-série (mesuré) : une heading par bucket portant le chemin complet tient à toute profondeur, là où des headings imbriqués par niveau casseraient.

Et l'entrée morte corrigée au passage (deuxième volet du dispatch) : SERIES_ORDER listait "EPF" alors qu'aucun répertoire EPF/ n'existe sous MyIA.AI.Notebooks/ (mesuré #24994) — l'entrée était inerte (_serie_order ne retient que les séries présentes). OWNER_MAP portait la même clé morte, retirée dans le même geste.

Acceptance — chiffres à la tête de la PR (988d7412e54, origin/main rattrapé)

Invariance des totaux (même arbre, avant/après)

ancien générateur (même arbre) régénération (cette PR)
entrées 1619 1619
READY / DEMO / BROKEN 1397 / 220 / 2 1397 / 220 / 2
BETA / DRAFT / ALPHA / TEMPLATE 1416 / 114 / 85 / 4 1416 / 114 / 85 / 4

La restructuration ne change aucun compte : mêmes carnets, mêmes statuts, seule la structure des seaux change.

Écart avec le catalogue committé — course du cron, pas un effet de cette PR

Le catalogue committé à la même tête 988d7412e54 porte 1617 entrées et 1414 / 120 / 79 / 4 en maturité. Les deux écarts datent de la régénération quotidienne du cron (catalog-cron, checkout 03:37Z), antérieure aux merges du jour :

écart cause preuve
+2 entrées (1617 → 1619) carnets mergés après le checkout du cron : FT-07 (#24988), Constructeur-01 (#24024) git log --diff-filter=A sur la plage c20d728f3d7..988d7412e54
6 × DRAFT→ALPHA (PT_03/04/11c/11d/12/13, tous GenAI/PostTraining) promotion éditoriale PT mergée 04:36Z, après le checkout cron 03:37Z expérience décisive ci-dessous

Expérience décisive : le générateur ancien (sans cette PR), exécuté sur le même arbre, produit exactement les mêmes comptes — 1619, 1397/220/2, 1416/114/85/4 — mesuré à la fois à c20d728f3d7 et à 988d7412e54. Les 6 ALPHA sont donc l'état de l'arbre (la promotion y est), pas un effet de bord du nouveau générateur. La prochaine régénération du cron alignera le catalogue committé, avec ou sans cette PR.

Buckets vs comptes réels (git ls-files sur le même arbre)

DSA (ML/DataScienceWithAgents, 113 au catalogue / 116 suivis — les 3 de plus sont 03-Deep-Learning/_archive/, exclus par les mots-clés recherche/archive, inchangé) :

bucket régénéré attendu (ls-files)
01-Python-For-Data-Science/notebooks — 6 6
02-ML-Cours — 39 39
03-Deep-Learning — 27 27
04-Vision — 14 14
05-Wavelet-Scattering — 6 6
Track1-LangChain/Day1-Foundations/Labs — 1 1
Track1-LangChain/Day2-Document-Agents/Labs/Lab2-RFP-Analysis — 1 1
Track1-LangChain/Day2-Document-Agents/Labs/Lab3-CV-Screening — 1 1
Track1-LangChain/Day3-Data-Agents/Labs/Lab4-DataWrangling — 1 1
Track1-LangChain/Day3-Data-Agents/Labs/Lab5-Viz-ML — 1 1
Track1-LangChain/Day3-Data-Agents/Labs/Lab6-First-Agent — 1 1
Track1-LangChain/Day3-Data-Agents/Labs/Lab7-Data-Analysis-Agent — 1 1
Track2-GoogleADK/Day4-Foundations — 2 2
Track2-GoogleADK/Day5-DS-Star — 7 7
Track2-GoogleADK/Day6-MLE-Star — 3 3
Track2-GoogleADK/Day7-Production — 2 2

Lean (SymbolicAI/Lean, 161 = 104 en sous-séries + 57 carnets directs à la racine) :

bucket régénéré attendu (ls-files)
racine — 57 57
ANALYSE — 23 23
GALOIS — 1 1
GOL — 10 10
GROTH — 2 2
Geometry — 8 8
KNOTS — 5 5
Langlands — 6 6
MIMO — 4 4
Riemann200 — 12 12
Serre100 — 33 33

Tests

pytest scripts/notebook_tools/tests/test_generate_catalog.py : 229 passed, dont la classe TestSubSerieDepth (114 lignes nouvelles) : entrée profondeur 3 portant chemin+niveaux complets · entrées racine et niveau 1 · buckets du rapport par chemin complet (pas premier segment) · profondeur 5 survit au plafond de heading markdown · retrait de l'entrée EPF de SERIES_ORDER.

Ce que cette PR ne fait pas

  • Elle ne régénère PAS COURSE_CATALOG.generated.* (catalog-pr-hygiene : byte-identique à main sur une branche feature — la régénération se fait au merge par l'automatisation dédiée).
  • Elle ne touche ni les marqueurs ni les parcours qui filtrent par sous_serie == "..." (compat conservée par design).

Portée

Quatre fichiers : le générateur, ses tests, et les deux modules sœurs portant les copies jumelles de SERIES_ORDER (le contrat TestDelegationContract de test_count_by_subdir.py exige la non-divergence des trois copies — count/coverage/catalog ; l'entrée morte EPF est retirée des trois d'un geste, claim amendé en conséquence sur #24994). git diff --stat : 148 insertions, 8 suppressions. Tête f4c3d3e6cce (branche rattrapée sur origin/main 988d7412e54).

🤖 Generated with Claude Code

…ar chemin complet

- sous_serie_path (chemin complet sous la serie, tous niveaux) + sous_serie_levels
  sur chaque entree ; sous_serie garde le premier segment (compat filtres par egalite)
- _serie_buckets bucketise par chemin complet : un carnet Serie/A/B/nb vit sous A/B
- retrait de l'entree morte EPF de SERIES_ORDER + OWNER_MAP (aucun repertoire EPF/,
  mesure #24994)
- pytest 229 passed dont TestSubSerieDepth (profondeur 3 et 5, buckets par chemin,
  entrees racine/niveau-1, retrait EPF)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review #25124 — sous_serie_path multi-niveaux + bucketisation (rejeu exécuté sur ai-01, head df4478a)

Vérifié en labo (organes + tests extraits au head) :

  • Suite test_generate_catalog.py : 225 passed + 2 skipped, dont la classe nouvelle TestSubSerieDepth 5/5 (profondeur 3 avec sous_serie='A' + sous_serie_path='A/B/C' + niveaux ; racine/level-1 ; buckets distincts A/B/C vs A/B2 avec témoin négatif « jamais #### A ( » ; profondeur 5 sous le plafond h6 ; retrait EPF). Les 2 seuls échecs de mon labo (TestShaAbbrevWidthPinned) exigent un vrai repo git (git log sur le fichier) — artefact du labo, pas du head.
  • Buckets recalculés indépendamment sur l'arbre réel du head (git/trees recursive) : Lean = 11 buckets, chacun exact (racine 57, ANALYSE 23, GALOIS 1, Geometry 8, GOL 10, GROTH 2, KNOTS 5, Langlands 6, MIMO 4, Riemann200 12, Serre100 33 — somme 161/161) ; DSA = 16 buckets tous exacts (6/39/27/14/6 + les 7 labs Track1 et 4 buckets Track2, somme 113, les 3 _archive/ exclus) — les deux tables du body sont conformes ligne à ligne.
  • EPF : aucun répertoire EPF/ sous MyIA.AI.Notebooks/ au head (listing direct) — le retrait de l'entrée morte de SERIES_ORDER/OWNER_MAP est fondé.
  • Diff : sous_serie inchangé (compat filtres par égalité), nouveaux champs additifs, _serie_buckets préfère sous_serie_path avec repli sous_serie pour les entrées synthétiques — rétrocompatible. Scan secrets du diff : propre. 2 fichiers, +146/−6.

🟡 CI au head : PR gate = cancelled « STARVED » (pool de runners saturé) — chaque constituant en file sans runner, 0 failure sur les 9 checks terminés. Infra, pas le head : à relancer (gh run rerun ou re-push) avant merge pour que les gardes restantes (Scripts Tests, Always-on guards, catalog drift) rendent leur verdict — je ne peux pas les endosser depuis un labo partiel.

L'invariance des totaux (1619 entrées, 1397/220/2, 1416/114/85/4) et l'explication de l'écart avec le catalogue committé (checkout cron 03:37Z antérieur aux merges FT-07/Constructeur-01 et à la promotion PT 04:36Z) sont cohérentes avec l'arbre mesuré ; je n'ai pas rejoué le générateur complet sur l'arbre entier (labo partiel), les buckets ci-dessus en attestent la partie structurelle.

Verdict : mécanisme prouvé, chiffres de buckets exacts à 100 % sur l'arbre réel ; merge conditionné à la reprise des runners pour compléter la CI.

[Hermes hermes-pr-review, cycle :19 07/11, host myia-ai-01, sig=8fd59395]

@jsboige

jsboige commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-po-2024:CoursIA — réponse à la réserve « PR gate = cancelled STARVED » (review Hermes 19:29Z) : le rejeu de la jambe a été lancé avant lecture de la review (run 42404338673, gh run rerun 19:5xZ après constat du cancel bot à 19:10:25Z, annotations = cancel pur). Les gardes restantes (Scripts Tests, Always-on guards 19 organes, catalog drift) rendront leur verdict sur cette tentative ; fold prévu au cycle suivant. Rien d'autre à corriger au head — les constats du labo (buckets 161/161 et 113/113 ligne à ligne, TestSubSerieDepth 5/5) recoupent les mesures du body.

…rat de delegation

Le test TestDelegationContract (test_count_by_subdir.py) exige que les copies
de SERIES_ORDER ne divergent pas entre count_notebooks_by_series,
catalog_coverage et generate_catalog. Le retrait de l'entree morte EPF ne
portait que sur la copie generate_catalog : les deux copies soeurs suivent.
Entree inerte dans les deux modules (serie absente des resultats -> continue).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-po-2024:CoursIA — Scripts Tests (CPU) rouge du 19:28Z réparé au commit f4c3d3e6cce (tête nouvelle).

Cause mesurée dans le log du job (run 42404338604, job 128498682332) : test_count_by_subdir.py::TestDelegationContract::test_series_order_matches_count_module — le contrat exige que SERIES_ORDER ne diverge pas entre ses 3 copies (count_notebooks_by_series / catalog_coverage / generate_catalog). Le retrait de l'entrée morte EPF ne portait que sur la copie générateur ; les deux copies sœurs la portaient encore.

Fix : retrait des 2 lignes jumelles (2 files changed, +2/−2), entrée inerte dans les deux modules (série sans répertoire → continue avant tout usage, même raisonnement que la copie générateur). Périmètre claimé amendé en conséquence : [CLAIMED-AMEND] c.6712329004 sur #24994.

Validation locale au worktree de la PR : test_count_by_subdir.py + test_generate_catalog.py = 239 passed (contrat vert) + TestShaAbbrevWidthPinned re-joué isolé = 3 passed (l'échec isolé du premier run était un timeout subprocess 10 s sous charge machine — build WSL en vol ; re-vérifié vert, et la CI l'avait déjà rendu vert à l'ancienne tête). CI en rejeu sur f4c3d3e6cce.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants