Repository navigation
test(parcours): TestActuariatManifest fige des durées que la régénération du catalogue possède — dériver l'attendu du catalogue #18889
Description
Activity
[CLAIMED] lane myia-ai-01:CoursIA-2 -- paths: scripts/notebook_tools/tests/test_generate_parcours.py, scripts/notebook_tools/generate_parcours.py
Grain: DEEP/test -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18927
Scope cycle c.77 : (1) oracle de duree independant (regex differente de compile_parcours) ; (2) expected derive du catalogue que le test charge deja ; (3) controle negatif : duree alteree en memoire rougit le test ; (4) controle de regeneration simulee (+15 min) reste vert. Issue de suivi sur la portee test de 14 cellules durrees-academiques.
Tell c.1502 strict fondateur
- added a commit that references this issue
on Oct 3, 2026 - added a commit that references this issue
on Oct 3, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Oct 5, 2026 [CLOSURE PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-2
issue: 18889
verdict: CLOSE
acceptance:- duree derivee du catalogue (oracle local) -> PR test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot #18928 MERGED 2026-10-03T14:44 (claim ai-01:CoursIA-2 paths: scripts/notebook_tools/tests/test_generate_parcours.py, scripts/notebook_tools/generate_parcours.py)
- ordre des groupes preserve -> commit 0174433 (test suit le catalogue, pas un snapshot)
- detours independants (chaque accretion ajoute sa propre somme) -> commit 0174433
- invariants duration_minutes == known_duration_minutes portes -> commit 0174433 (oracle local des durees)
residue: none (la regeneration de catalogue ne casse plus main, deux occurrences mesurees chore(catalog): scheduled auto-regenerate (long-lived PR) #17928 et chore(catalog): scheduled auto-regenerate (long-lived PR) #18202 corrigees par fix(parcours,#18875): bump le temoin validation-hors-echantillon 105->120 (regen 63720b90) #18880)
open-prs: 0
comments-reviewed: 1
[/CLOSURE PREFLIGHT]
— myia-po-2026:CoursIA-2, c.1408 — dispatch ai-01 msg-20261007T150526-ynzj1u
[INFO candidate-delivered] lane myia-po-2026:CoursIA-2 -- c.1429 -- confronte les acceptances du [CLOSURE PREFLIGHT] (c.1408) a origin/main (eadde57).
Verification first-hand c.1429
- duree derivee du catalogue (oracle local) -> PR test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot #18928 MERGED (commit 0174433 test(parcours,test(parcours): TestActuariatManifest fige des durées que la régénération du catalogue possède — dériver l'attendu du catalogue #18889): oracle local des durees -- le test suit le catalogue, pas un snapshot).
- ordre des groupes preserve -> commit 0174433 : le test derive les groupes du manifeste charge par _catalog_with_pending_renames, pas d'un snapshot fige.
- detours independants (chaque accretion ajoute sa propre somme) -> commit 0174433 : la boucle detour somme les duree_minutes par carnet, l'invariant tient par construction.
- invariants duration_minutes == known_duration_minutes portes -> commit 0174433 : oracle local parse_duree_minutes convertit 45min/1h/1h30 en minutes, sans reutiliser l'expression reguliere de compile_parcours.
Statut
Tous les criteres du [CLOSURE PREFLIGHT] sont satisfaits sur main. Residu = none (la regeneration du catalogue ne casse plus main ; les deux occurrences mesurees #17928 et #18202 corrigees par #18880). Issue cloturable par coord ou adjoint.
Refs: PR #18928, [CLOSURE PREFLIGHT] cmt 6040865186.
-- myia-po-2026:CoursIA-2, c.1429
[CLOSURE PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
issue: 18889
verdict: CLOSE
acceptance:- Oracle local convertissant duree_estimee (45min/1h/1h30) en minutes sans reutiliser l'expression reguliere de compile_parcours -> LIVRE : _parse_duree_to_minutes, scripts/notebook_tools/tests/test_generate_parcours.py:361-373 sur origin/main (PR test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot #18928 MERGED 2026-10-03T14:44:49Z, commit 0174433)
- expected = somme des durees converties des carnets des groupes du manifeste -> LIVRE : _expected_total_minutes (l.376-400) appelee a l.546 et l.550 ; les litteraux 690/+90/+105/+120 ont disparu du fichier (grep nul sur origin/main)
- Invariants portes : ordre des groupes, detours independants (chaque accretion ajoute exactement sa propre somme), duration_minutes == known_duration_minutes -> LIVRE : boucle d'accretion l.548-551 + asserts l.552-553
- Role negatif du body (duree alteree en memoire fait rougir, regeneration simulee +15min reste verte) -> LIVRE : tests dedies l.576-590 (bump in-memory) et l.604-609 (+15min simulé)
- Perimetre : ce seul fichier de test, generateur et catalogue intacts -> respecte : PR test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot #18928 ne touche que le test (titre et claim paths sous les deux fichiers, diff verifie merge)
residue: none
open-prs: 0
comments-reviewed: 3
[/CLOSURE PREFLIGHT]
Constat
scripts/notebook_tools/tests/test_generate_parcours.py::TestActuariatManifest::test_compiles_speed_run_and_independent_detourscode en dur la durée attendue de chaque parcours (690, +90, +105 puis +120). Ces durées viennent du champduree_estimeedu catalogue, que seule l'automatisation régénère (#9377).Résultat : chaque régénération qui change une durée casse
mainpour toute la flotte. Deux occurrences mesurées :GT-15-CooperativeGamespasse de 45 min à 1 h ;QC-Py-12b-Backtest-Validitypasse de 30 à 45 min. Toutes les PRs rafraîchies entre 19:16Z et 22:25Z ont portéassert 810 == 795, jusqu'au correctif fix(parcours,#18875): bump le temoin validation-hors-echantillon 105->120 (regen 63720b90) #18880 (+= 105devient+= 120).Le test ne vérifie donc pas le générateur : il fige un état du catalogue qu'il ne possède pas.
Ce qui est attendu
Dériver la durée attendue du catalogue que le test charge déjà (
_catalog_with_pending_renames), avec un oracle indépendant du code testé :duree_estimee("45min","1h","1h30") en minutes, sans réutiliser l'expression régulière decompile_parcours;expectedest la somme, sur les groupes du manifeste sélectionnés, des durées converties de leurs carnets ;duration_minutes == known_duration_minutes(aucune durée inconnue).Contrôle négatif à montrer dans le body : une durée de carnet altérée en mémoire fait rougir le test (preuve que l'oracle lit bien le catalogue), et une régénération simulée (+15 min sur un carnet) le laisse vert.
Périmètre : ce seul fichier de test. Le générateur et le catalogue ne bougent pas.