Skip to content

refactor(serie,#17417): T2-01 -- renomme 01-PythonForDataScience -> 01-Python-For-Data-Science (kebab, 21 referents vivants) - #20274

Open
jsboige wants to merge 5 commits into
mainfrom
feature/17417-dsa-t2-01
Open

jsboige wants to merge 5 commits into
mainfrom
feature/17417-dsa-t2-01

Conversation

@jsboige

@jsboige jsboige commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/refactor — lane myia-po-2023:CoursIA — prev: MED/tooling #20267

Sous-tranche T2-01 du chantier de nommage #17417 : renommage kebab 01-PythonForDataScience → 01-Python-For-Data-Science (option la moins sensible, pré-autorisée par la table de mapping #20273 — précédent 04b-Wavelet-Scattering).

Le geste

Diff effectif : 35 fichiers — 13 déplacés par le git mv seul (6 notebooks, 2 tests, 3 data, README, PROVENANCE ; historique préservé) + 20 référents vivants mis à jour (remplacement littéral du token : workflows CI genai-helpers-tests/scripts-tests, pytest.ini, _quarto.yml, 6 READMEs série DSA + parents ML, 2.1-Workflow-ML.ipynb, curriculum ml-engineer.json+.compiled.json+trading.md, guides notebook-enricher-guide.md+quant-prose-census.md, baselines re-keyées baseline_nb_nav_chain.json+pedagogy_density_baseline.json, check_testpaths_coverage.py, test_scan_quant_classify.py) + 2 organes ajoutés par la réparation post-CI (comparateur diff_readme_link_violations.py + ses tests).

Exclusions délibérées (mesurées, pas sautées)

Surface Résidu ancien token Raison
COURSE_CATALOG.generated.json/.md 2 fichiers Automatisation : jamais régénérés à la main sur une branche feature (catalog-pr-hygiene) — vérifié byte-identiques à main. Régénération post-merge.
translations/ml-datascience/** 38 refs (37 CSV + 1 README) Garde #20232 : modifier translations/** sur une branche feature = rouge structurel (double-clé mainteneur). Dette documentée, règlement au moment de la fusion de série.
5 fichiers historiques 7 occurrences Règle ci-dessous.

Règle historique vs vivant

Référent vivant (résout un chemin au moment de la lecture/exécution) → mis à jour. Fait historique daté (le chemin était vrai au moment de l'écriture) → préservé tel quel :

  • scripts/notebook_tools/migrate_dsa_mlpython.py — carte d'une migration terminée (DSA→ML.Python) ; ses chemins sont ses données.
  • scripts/notebook_tools/_archive/_fix_leaks_batch4_remaining.py — enregistrement historique sous _archive/.
  • docs/archive/ledgers-reviews/2026-07-11-h4-sweep-6034.md — relevé de vérification daté (2026-07-11).
  • docs/ledgers/13746-tests-eclates-dissipation.md — ledger daté citant la config d'alors.
  • docs/ledgers/3801-sota-axe2.md — 3 refs dans des entrées datées (provenance des mesures).

git grep -l 01-PythonForDataScience après le diff : exactement 9 fichiers = 2 catalogue + 2 translations + 5 historiques. Zéro fuite ailleurs.

Validation (mesurée sur la branche, post-dernier-commit)

Organe Verdict
check_notebook_nav_chain.py --check 0 (baseline re-keyée)
check_notebook_navlinks.py --check 0
check_link_label_agreement.py --fail 16 findings base-inherited (mesuré 16 = 16 avec diff retiré par stash ; tous GameTheory/ML.Net dans curriculum, aucun lié au rename)
check_notebook_link_render.py --tracked-only RC 0, MANQUE 0
check_docs_links.py --check --base origin/main No new broken links (0 pre-existing, 8536 total)
_quarto.yml paths 0 manquant (chaque entrée existe sur disque)
check_testpaths_coverage.py RC 0 (pytest.ini ↔ workflows cohérents)
pedagogy_density.py --check-orphans 0 ORPHAN_KEY, 0 LOST_KEY (811 clés)
pytest suites touchées 112 passed (tests déplacés + test_scan_quant_classify)

Translation drift

check_pr_translation_drift.py : les 37 enregistrements CSV pointant l'ancien chemin sont skippés par l'organe (notebook absent du diff → continue), le garde ne rougit pas — c'est la dette documentée ci-dessus, pas une omission.

Réparations post-CI (2 commits)

c8997e11e2 — fins de ligne CRLF. Le sed initial avait converti CRLF→LF sur les référents, produisant des diffs fichier-entier (2017/2017 nav-chain, 242/242 guide) : les ratchets différentiels y voyaient 13 compteurs de prose et 4 violations README-link « nouvelles ». Restauration depuis origin/main + perl -pi binaire (préserve les octets de fin de ligne). Diff redevenu chirurgical : 46 insertions / 46 délétions au merge-base (le compte de fichiers GitHub — 35 — est détaillé en tête, section « Le geste »). Rejou prose-counts --strict : [OK] aucun compteur quantitatif en prose (rc 0).

80aaf5a374 — comparateur readme-link : appariement des renames. Le rejeu local montrait base=493 head=493 NOUVELLES=12 CORRIGEES=12 — strictement symétrique : les 12 violations sont préexistantes sur main, re-keyées par le renommage (8 dans le README du dossier renommé, 4 dans les READMEs référents dont le href suit le dossier). Le set-diff pur du comparateur comptait un git mv comme 12 introductions — toute PR de renommage serait rouge à tort. Deux passes d'appariement, chacune prouvée sur disque à l'état head : forme 1 (README de base disparu), forme 2 (ancien parent du href résolu disparu, nouveau parent présent). Les contrôles négatifs (fichier/répertoire de base toujours présent) restent des NOUVELLES — un copier-coller de lien cassé ne se blanchit pas. Rejou T2-01 : NOUVELLES=0 CORRIGEES=0 DEPLACEES=12 (rc 0). Tests : 10 passed (comparator, dont 4 témoins d'appariement positifs/négatifs) + 7 passed (workflow guard — le format ::error:: greppé est inchangé).

See #17417
See #20273

🤖 Generated with Claude Code

…For-Data-Science (T2-01)

Rename kebab pre-autorise par le plan de mapping #20273 (porte libre, precedent 04b-Wavelet-Scattering).
- git mv seul (13 fichiers, historique preserve)
- 21 referents vivants mis a jour (workflows, pytest.ini, _quarto.yml, READMEs, curriculum, baselines nav-chain + pedagogy density, guides)
- COURSE_CATALOG.generated.* byte-identique a main (automatisation)
- translations/** intact (garde #20232)
- 5 fichiers historiques preserves (migration terminee, _archive/, ledgers dates)

Organes: nav-chain 0, navlinks 0, label-agreement 16=16 base-inherited, link-render 0, docs-links 0/8536, quarto 0 manquant, testpaths 0, density orphans 0, tests 112 passed.

See #17417, See #20273

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

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 10, 2026
@github-actions

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).

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 16.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 13.8s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions github-actions Bot added the paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. label Oct 10, 2026
This was referenced Oct 10, 2026
@github-actions

github-actions Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20274 (refactor(serie,#17417): T2-01 -- renomme 01-PythonForDataScience -> 01-Python-For-Data-Science (kebab, 21 referents vivants)) 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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 17
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

…rent files

sed sous Git Bash avait converti CRLF->LF sur chaque fichier touche, produisant
des diffs fichier-entier (2017/2017 baseline nav-chain, 242/242 guide enricher).
Les ratchets differentiels y voyaient 13 compteurs de prose et 4 violations
HTML_404 'nouvelles' -- artefact de fins de ligne, pas de contenu.

Reparation : restauration depuis origin/main + remplacement perl binaire
(preserve les octets de fin de ligne), README du dossier renomme reconstruit
depuis son chemin d'origine. Diffs chirurgicaux verifies (1-7 lignes/fichier).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/17417-dsa-t2-01 branch from c1aa76f to c8997e1 Compare October 10, 2026 15:56
…-keyed by a directory rename

Un git mv de dossier re-keye chaque violation le touchant, en deux formes :
le triple identique sous un nouveau chemin de README (8/12 sur T2-01), et
le href change dans un README referent inchange (4/12). Le set-diff pur les
comptait comme NOUVELLES+CORRIGEES symetriques (12/12, backlog inchange),
rendant toute PR de renommage rouge a tort.

Deux passes d'appariement, chacune prouvee sur le disque a l'etat head :
- forme 1 : jumeau (class, href) exact dont le README de base a disparu ;
- forme 2 : href re-key dans un README identique dont l'ancien parent
  resolu a disparu et le nouveau parent existe.
Les controles negatifs (README/fichier de base toujours present) restent
des NOUVELLES -- un copier-coller de lien casse ne se blanchit pas.

Rejou local T2-01 : base=493 head=493 NOUVELLES=0 CORRIGEES=0 DEPLACEES=12.
Tests : 10 passed (comparator) + 7 passed (workflow guard).

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Diagnostic jambe « Scripts Tests (CPU) » @22:15Z (head 80aaf5a374) — non imputable à la PR, rejeu lancé.

  • L'unique échec est scripts/lean/tests/test_lean_exec.py::test_recover_cli_inspect_then_yes (18550 passed / 1 failed). Aucun fichier scripts/lean/ ni apparenté n'est dans le diff (les 35 fichiers : 13 renommages DSA + 20 référents + 2 organes readme-link, cf body).
  • Rejeu local à la tête exacte du contenu de origin/main : le test passe (1 passed, 0.58 s).
  • main lui-même a rendu la même jambe en échec à 22:14Z (run 38090645884), une minute avant la jambe de cette PR — pendant que renum/12933-probas-tranche-a passait à 22:15Z. Fenêtre transitoire du pool posix, pas un défaut du diff.
  • Geste : un seul rejeu du job lancé (premier rejeu de cette jambe). Si l'échec persiste au rejeu, il sera traité comme rouge base-inherited et routé au coordinateur avec cette preuve.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Suivi du commentaire precedent (flake Scripts Tests) : le rejeu du job 114325995880 est success (run 38090577526, attempt 2) — flake clos, aucun traitement base-inherited requis.

Rejeu de la jambe PR gate (attempt 2, check-run 114332039003, 22:48Z) : 103/103 checks green — le seul rouge restant est le minuteur DWELL (tete du 21:35:51Z, plancher 120 min, ecoule 2026-10-11T00:07:00Z). Rien a corriger ; la jambe se re-agregera au balayage pr-gate-stale-sweep ou au premier rejeu poste-00:07Z. La candidate attend, pas la lane.

jsboige and others added 2 commits October 11, 2026 01:09
Conflit README DataScienceWithAgents resolu : table complete 1.1-1.6 de
#20254 conservee (liens .ipynb canoniques, blockquote accretion, lien
Documentation complete) avec token dossier renomme 01-Python-For-Data-Science.
_quarto.yml + 02-ML-Cours/README.md auto-merges (entrees renommees 212/1277-80 intactes).
Nav-chain ICT-15d unreachable = base-inherited (reproduit sur origin/main pur).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…le (import merge e4b3155)

Root cause: #20100 (e4b3155) ajoute le renvoi Lean-25 -> ICT-15d ; ce lien
entrant cross-serie retire 15d des entries du graphe nav et le reclasse
unreachable (lacune externally_anchored, arbitrage #19076 ouvert). Reproduit
sur origin/main pur 57f4c84 -- rouge preexistant main, invisible en CI main
(workflow PR-only), importe par le merge de ce cycle.

Reparation dans le precedent #19075 option b: le baseline enregistre l'etat
mesure. Full check ET diff-files check: 0 NEW (verifies locaux, argv exacts CI).
Le fix durable (inclure externally_anchored dans le basis du checker) reste a
trancher en #19076 -- signale au coordinateur.

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Rouge nav-chain au head 9968a79 — diagnostic complet + réparation (22dff34)

Le merge 9968a79054 a rougi check-nav-chain (via organe fastlane → Always-on → PR gate). Diagnostic firsthand :

  1. Cause racine : e4b3155a10 (fix(notebook,#17357): Lean-25 temoin -- ligne 159, Loi I requalifiee, renvoi Cech 15d (F1-F3) #20100, arrivé sur main dans la fourchette du merge) ajoute le renvoi Lean-25-Coherence-et-Temoin → ICT-15d-CechObstruction-Python. Ce lien entrant cross-série retire ICT-15d des entries du graphe nav et le reclasse unreachable alors que sa convention de série (table README, 46 entries sans inbound) en faisait une orphan_entry.
  2. Rouge préexistant sur main : reproduit sur origin/main pur 57f4c84c23 (worktree détaché, --check plein → FAIL 1 NEW). Invisible en CI main : le workflow notebook-nav-chain-guard est PR-only. Toute PR mergée à jour de main qui touche notebooks/READMEs rencontrera le même rouge (le shadow fastlane court le check sans --diff-files).
  3. Lacune du checker : un carnet à lien entrant uniquement externe à sa série est l'entrée légitime pour le lecteur (le checker le sait — liste externally_anchored informative) mais n'entre pas dans le basis du BFS → classé unreachable. C'est exactement l'arbitrage ouvert nav-chain: un lien entrant inter-series fait perdre a un carnet son statut d'entree dans sa propre serie #19076.
  4. Réparation (précédent fix(nav-chain): baseline 07-Aspire orphan_entry -> unreachable (arbitrage coord b) #19075 option b) : le baseline enregistre l'état mesuré — finding[105] orphan_entry → unreachable, 1 ligne (un premier essai par réécriture JSON complète a produit un diff 4034 lignes de reformatage : reverté, édition chirurgicale à la place). Vérifié localement avec les deux argv exacts de CI (full + --diff-files) : 0 NEW finding chacun.

Le fix durable (inclure externally_anchored dans le basis, ou normaliser le renvoi) reste à trancher en #19076 — signalé au coordinateur (dashboard workspace-CoursIA 00:2xZ + ce commentaire).

🤖 Generated with Claude Code

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Flake Scripts Tests (CPU) au head 22dff3414f : XDIST-WATCHDOG: COLLECT_CRASH — KeyError: <WorkerController gw8>, signature #19915 (collecte xdist), même classe que les deux rejeus clos plus tôt ce cycle au head précédent (c.6102912924, c.6103032247). Rejeu de la jambe sans commit (gh run rerun 38095466480 --failed) : run 38095466480 -> conclusion success, Scripts Tests (CPU) success (nouvel check-run id, leçon rerun-creates-new-checkrun-id). Aucun défaut de la PR. Reste attendu au head : DWELL uniquement (ré-armé par le commit de fix baseline, minuteur).

@jsboige

jsboige commented Oct 11, 2026

Copy link
Copy Markdown
Owner Author

Etat consolide au head 22dff3414f pour revue : tous les constituants sont verts latest-wins — nav-chain success, Always-on guards success, Always-on metadata success, Scripts Tests (CPU) success au rejeu (flake xdist #19915, c.6103530132, run 38095466480 attempt 2). Le seul rouge restant est DWELL, minuteur dont le plancher a expire a 2026-10-11T02:07:00Z (message du gate : rien a corriger). Le gate attend une re-evaluation : le balayage pr-gate-stale-sweep (dernier passage ~00:12Z, cadence mesuree 2h33-5h18) doit la declencher seul ; trois rejeus manuels du run 38095466520 (02:45-03:10Z, CLI et REST) n'ont pas produit de nouvelle tentative — les tentatives 3/4/6 enregistrees datent toutes de 00:12-00:17Z. Si le balayage tarde, rejouer la jambe depuis la PR (ou label merge-dwell-waived si urgence main). Aucun geste de lane restant : c'est la candidate qui attend, pas la lane.

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

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant