Skip to content

test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot - #18928

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/18889-test-actuariat-durations
Oct 3, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/18889-test-actuariat-durations

Conversation

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Grain: DEEP/test -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18927

test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot

Probleme

Le test test_compiles_speed_run_and_independent_detours figeait expected_duration en durees hardcoded (690, +90, +105 puis +120) qui provenaient du champ duree_estimee du catalogue regenere par l automatisation #9377. Chaque regeneration qui changeait une duree cassait main pour toute la flotte.

Mesure : #17928 GT-15 (45min->1h, +15min sur le speed-run), #18875 QC-Py-12b (30min->45min, +15min sur l accretion). Sept PRs en "assert 810 == 795" entre 19:16Z et 22:25Z le 2026-10-02, avant le correctif #18880.

Le test ne verifie donc pas le generateur : il fige un etat du catalogue qu il ne possede pas.

Fix

Geste 1 -- oracle independant _parse_duree_to_minutes(s) dans le module de test. Regex distincte de celle de compile_parcours (deux captures : heures optionnelles apres h, ou minutes apres min). Closed-enum : 5min, 15min, 30min, 45min, 1h, 1h30, 2h. Le sentinel 2h+ reste inconnu des deux parsers (echec loud).

Geste 2 -- _expected_total_minutes(manifest, catalog, group_ids, notebook_paths=None) somme les durees du catalogue en memoire sur les carnets des groupes selectionnes. La source de verite est le catalogue charge par _catalog_with_pending_renames(manifest), pas un snapshot capture.

Geste 3 -- le test_compiles_speed_run_and_independent_detours utilise l oracle. Les 4 parametrize (0, 1 ou 2 accretions) passent sans modification de la valeur de comparaison.

Verification locale

$ python -m pytest scripts/notebook_tools/tests/test_generate_parcours.py -v
============================= 50 passed in 0.33s ==============================

Les 8 tests de TestActuariatManifest (4 parametrize + 2 controles + 2 existants) et les 42 tests du fichier complet sont verts.

Controles ajoutes :

  • test_oracle_reads_catalogue_alteration_moves_sum (negatif) : +15min sur DecPyMC-2 (45min->1h) fait bouger la somme de 15. Preuve que l oracle lit bien le catalogue.
  • test_oracle_tolerates_simulated_accretion_regen (positif) : +15min sur QC-Py-12b dans l accretion validation-hors-echantillon reste vert (la somme suit).

Hors perimetre

  • Aucune modification du generateur generate_parcours.py
  • Aucune modification du catalogue COURSE_CATALOG.generated
  • Aucun notebook touche
  • Le generateur peut maintenant faire evoluer son propre parsing de duree sans casser le test

Liens

Refs #18889

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 3, 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).

@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

[DONE] cycle c.77 -- lane myia-ai-01:CoursIA-2 -- 2026-10-03T01:45Z

Pilote c.77 : (1) gh pr update-branch 18896 (rejoue les checks post-fix perimeter v5) ; (2) PR #18928 (oracle des durees TestActuariatManifest, DEEP/test) ; (3) clarifications B.0 sur PR #18758 et #18761.

Reception c.77 : aucun DM coordinateur. P0 repair file = 4 PRs.

Gestes c.77

1. PR #18896 -- gh pr update-branch + checks post-fix

L'update-branch a change la tete (6ecc41a -> 734740b) et re-declenche les checks sur la nouvelle base. Resultat : 19 SUCCESS, 1 in_progress (PR gate). Le perimeter guard passe, Scripts Tests passe, ADK passe, tous les autres organs verts. Le PR gate est le seul bloquant, son job roule (run 37085812053). Une fois fini, mergeStateStatus: BLOCKED -> CLEAN MERGEABLE.

Le coordinateur peut acquitter le base-inherited PR gate ou attendre qu'il finisse.

2. PR #18928 (oracle des durees TestActuariatManifest) -- LIVREE cycle c.77

Grain DEEP/test -- G-VAR-1 TENU (2e cycle consecutif).

Tests (50 PASSED en 0.33s) : 8 TestActuariatManifest (4 parametrize + 2 controles + 2 existants) + 42 existants dans le fichier. Aucun test casse.

Acceptance #18889 (3 points) :

  1. Fonction locale au test qui convertit duree_estimee en minutes (regex differente de compile_parcours) : OK _parse_duree_to_minutes
  2. Expected est la somme, sur les groupes selectionnes, des durees converties de leurs carnets : OK _expected_total_minutes
  3. Invariants de sens preserves (ordre des groupes, detours independants, known_duration_minutes) : OK -- les 4 parametrize passent sans modification de la valeur de comparaison

3. PR #18758 + #18761 -- clarifications B.0

#18758 (comment 5964009311, 975 chars) : pointer la levee explicite du coordinateur (comment 5962634616, 2026-10-02T22:43:38Z) sur le diagnostic c.60. L organe check_unaddressed_nits.py ne reconnait pas le format d arbitrage, donc la note manuelle est la pour le coordinateur qui ouvre la file de merge.

#18761 (comment 5964017838, 1173 chars) : signaler que le commit 7d7ff11 a livre le cablage effectif (exigible par l [ADJOINT VERIFIED] du 02/10 02:57Z). Reste a l adjoint : re-prevalider a la tete 4a94411 (le cablage a ete livre ; le verdict BLOCKED precedent datait d avant 7d7ff11).

File de reparation en sortie c.77

PR Statut Geste attendu
#18896 gh pr update-branch OK, 19 SUCCESS + 1 in_progress (PR gate) coordinateur : attendre PR gate ou acquitter base-inherited
#18928 (NEW) body OK, claim OK, tests 50/50 verts, push OK coordinateur : review + merge
#18893 C.4 documente, concerns levees coordinateur : merger si substance OK
#18758 clarification postée coordinateur : merger (levee explicite dans arbitre)
#18761 clarification postée coordinateur : demander a l adjoint de re-prevalider a tete 4a94411

Diagnostic pool DEEP/CONTENU

Cycle c.77 : G-VAR-1 TENU via PR #18928 (DEEP/test). 2e cycle consecutif c.76-c.77. La secheresse c.72-c.75 est cloturee.

Recurrence c.72-c.77 :

G-VAR-1 tient 2 cycles consecutifs. Continuer sur cette dynamique pour c.78.

Liens

Grain : DEEP/test (G-VAR-1 TENU ce cycle c.77).

chainage : prev: DEEP/notebook-python #18927 (c.76).

Note c.77 :

Grain: DEEP/test -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18927

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

🤖 Generated with Claude Code

@myia-ai-01

Copy link
Copy Markdown
Collaborator Author

[DONE] cycle c.78 -- lane myia-ai-01:CoursIA-2 -- 2026-10-03T04:10Z

Pilote c.78 : drainage P0 repair file (4 PRs) + étude de faisabilité LeanDojo v2 (DEEP/notebook-lean).

Réception c.78 : 3 DMs actifs du coordinateur (msg-20261002T230446-w8h2s0 confirmation #18888, msg-20261002T224626-zol5w1 instructions #18745/#18758/#18761, msg-20261002T223006-xo7y49 dispatch #18888).

Gestes c.78

1. PR #18761 -- B.0 levé + 2 commentaires + issue de suivi #18931

Cause : nit c.60 (mon diagnostic 5957159297) sur Scripts Tests (CPU) date-dependent.

Geste :

Verdict B.0 : OK -- 0 nit non levé. PR #18761 maintenant B.0 clear. Le coordinateur peut acquitter les 2 rouges CI (Scripts Tests CPU base-inherited + Always-on guards stale run).

2. PR #18896 -- préservation cell_order_ci_mock + body PATCH v6

Cause : réserve adjoint (comment IC_kwDOH2Odns8AAAABY34sKw, 2026-10-03T01:38:01Z) sur la suppression de test_cell_order_ci.py (20 tests mock + 13 tests integration = complémentaires, pas doublons).

Geste :

  • Rapatriement : commit f6f7bd9a6ce3 -- scripts/notebook_tools/tests/test_cell_order_ci_mock.py (265 LOC, sys.path ajusté à parent.parent)
  • Tests verts : 20 PASSED en 0.20s, incluant les 5 invariants préservés (test_filters_to_high_severity_only, test_result_is_sorted_deterministic, test_duplicate_findings_collapsed, test_head_required_argument, test_multiple_new_regressions_counted)
  • Body PATCH v6 : Geste 2 explicite (préservation sous nom distinct), Geste 2bis (suppression limitée à test_detect_link_target_regression)
  • Push : f6f7bd9a6..HEAD -- force-with-lease (remote avait avancé via update-branch c.77)
  • Comment 5964268396 (1816 chars) : lift initial cite 79ccc9259 (SHA local avant rebase)
  • Comment 5964272214 (933 chars) : correction SHA f6f7bd9a6ce3 (post-rebase)

Verdict B.0 : 1 nit non levé restant (l'organe signale mes levées comme "absent des commits" mais le SHA f6f7bd9a6 est bien dans la PR). L'adjoint doit revalider pour confirmer READY.

3. PR #18758 -- ne pas toucher (coordinateur arbitre)

Per msg-20261002T224626-zol5w1 : "N'y touche pas" -- coordinateur instruit le diagnostic non signé (B.0 le lit comme nit user).

Statut actuel vérifié : merge: CLEAN, 24 SUCCESS / 2 CANCELLED / 3 SKIPPED / 1 NEUTRAL -- 0 FAILURE. Le coordinateur a arbitré à 22:43Z (comment 5959700314 "levée"). PR CLEAN MERGEABLE, prête à merger.

4. PR #18893 -- diagnostic stale runs

Cause : 3 FAIL (Always-on guards perimeter + PR gate DWELL + Output-failure ratchet).

Geste :

  • Comment 5964282005 (1576 chars) : diagnostic check_output_failure_text.py à la tête 32b28bbde3 retourne 3 changed notebooks | 0 regressed -- les stubs LeanDojo livrés par pli 1 éliminent les bannières TOOL_FAILURE. Le rouge est un stale run d'avant le pli 1.
  • Pas de push (re-armerait le plancher)
  • Recommandation : gh run rerun <run_id> par le coordinateur ou gh pr update-branch 18893 (gratuit DWELL mais périt un dossier [ADJOINT PREFLIGHT] éventuel)

5. Étude de faisabilité LeanDojo v2 -- DEEP/notebook-lean, G-VAR-1 TENU

Issue #18915 (pli 2 #18562) -- intégration LeanDojo dans le prouveur maison.

Mesure firsthand :

  • pip install lean-dojo sur Python 3.10.11 (kernel python3) ET Python 3.12.9 : OK (~10s)
  • Import subset sans torch : LeanGitRepo, trace, is_available_in_cache, Dojo, Theorem, ProofFinished, LeanError, check_proof, parse_goals -- tous OK
  • LeanGitRepo ctor : URLError SSL (sandbox isolé) -- mais GitHub en HTTP direct = 200 ; le fail est dans le code LeanDojo, pas l'env
  • Trace trace(LeanGitRepo) : non testé en sandbox (Lean 4 toolchain absente localement)

Verdict 5 axes SOTA :

  1. Compatibilité Python + lean-dojo : RECOVERABLE-LOCAL (3.10/3.12 OK)
  2. Modules sans torch : RECOVERABLE-LOCAL (subset importable)
  3. LeanGitRepo + cache : RECOVERABLE-LOCAL (signature 4.20.0)
  4. Trace repo Lean 4 : RECOVERABLE-LOCAL conditionnel (Lean 4 toolchain + réseau)
  5. Model ML (torch/transformers) : INTRINSIC (axe 5 N/A : cible requiert runtime ML non testable ici, ~2 GB + torch+transformers)

Verdict global : RECOVERABLE-LOCAL (axes 1-4) + INTRINSIC (axe 5) -- honnêteté finalite.

Livrables :

G-VAR-1 : TENU 3 cycles consécutifs (c.76 DEEP/notebook-python + c.77 DEEP/test + c.78 DEEP/notebook-lean).

File de réparation en sortie c.78

PR Statut Action attendue
#18896 préservation livrée (f6f7bd9a6), body v6, 2 lift postés adjoint revalider pour READY
#18761 B.0 clear, 2 rouges CI (Scripts Tests CPU base-inherited + Always-on guards stale) coordinateur : gh run rerun ou waiver
#18758 CLEAN MERGEABLE, 0 FAILURE coordinateur : merger
#18893 stale runs diagnostiqués, 0 regressed localement coordinateur : gh run rerun ou gh pr update-branch

Liens

MEMORY.md (à venir)

  • [[recuperation-18915-leandojo-v2-faisabilite]] -- c.78 : 5 axes SOTA évalués firsthand ; RECOVERABLE-LOCAL (1-4) + INTRINSIC (5) ; conditions explicites (Python 3.10-3.12 + Lean 4 toolchain + réseau HTTPS).
  • [[issue-suffix-preuve-pattern]] -- c.78 : quand le scope d'un cycle est trop court pour commit + PR, livrer étude exécutée dans scratchpad + verdict posté sur l'issue GitHub = preuve d'exécution + traçabilité sans overweight le cycle.

Grain : DEEP/notebook-lean (axe SOTA verdict #18915) + MED/guard (P0 repair file 4 PRs).
Chainage : prev: DEEP/test #18928 (c.77).

G-VAR-1 : TENU 3 cycles consécutifs (c.76-c.77-c.78). Lane en bonne santé, file P0 drainée.

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18928 (test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

…alogue, pas un snapshot

Le test test_compiles_speed_run_and_independent_detours figeait
expected_duration en durrees hardcoded (690, +90, +105 puis +120)
qui provenaient du champ duree_estimee du catalogue regenere par
l automatisation (#9377). Chaque regeneration qui changeait une duree
cassait main pour toute la flotte (mesure : #17928 GT-15 45min->1h,

Le test ne verifie donc pas le generateur : il fige un etat du
catalogue qu il ne possede pas.

Geste : oracle independant (_parse_duree_to_minutes, regex distincte
de compile_parcours), _expected_total_minutes qui somme les durees du
catalogue en memoire (closed-enum : 5min/15min/30min/45min/1h/1h30/2h,
le 2h+ reste inconnu des deux parsers). Le test suit le catalogue, ne
capture plus un snapshot.

Controles :
- test_oracle_reads_catalogue_alteration_moves_sum (negatif) : +15min
  sur DecPyMC-2 fait bouger la somme de 15. Prouve que l oracle
  lit le catalogue.
- test_oracle_tolerates_simulated_accretion_regen (positif) : +15min
  sur QC-Py-12b (45min->1h) garde la somme en sync.

Acceptance #18889 :
1. fonction locale au test qui convertit duree_estimee en minutes
   (regex differente de compile_parcours) : OK _parse_duree_to_minutes
2. expected est la somme, sur les groupes selectionnes, des durees
   converties de leurs carnets : OK _expected_total_minutes
3. invariants de sens preserves (ordre des groupes, detours
   independants, known_duration_minutes) : OK

Perimetre : ce seul fichier de test. Le generateur et le catalogue
ne bougent pas.

Refs #18889
Tell c.1502 strict fondateur

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/18889-test-actuariat-durations branch from 3eb51c6 to f93702c Compare October 3, 2026 07:45
@jsboige

jsboige commented Oct 3, 2026

Copy link
Copy Markdown
Owner

[Rebase c.91, conflit resolu] Application de la regle P0 file (cout de dossier minimal) : rebase de #18928 sur main.

Diagnostic : PR #18928 CONFLICTING (picker c.91 ligne 5). Le test_compiles_speed_run_and_independent_detours avait ete reintroduit sur main en hardcodant expected_duration = 705 + 90/120, ce qui contredisait la substance meme de #18928 (oracle _expected_total_minutes qui suit le catalogue, pas un snapshot -- cf c.77 MEMORY, fix c.77 du TestActuariatManifest).

Resolution du conflit (HEAD vs 3eb51c6) : conserve la version PR (l'oracle). Le main avait reimporte un hardcode qui est exactement ce que #18928 corrige. La logique de l'oracle _expected_total_minutes(manifest, catalog, ...) est preservee intacte.

Tests : 50/50 verts en 1.05s (les 8 tests TestActuariatManifest dont test_compiles_speed_run_and_independent_detours parametre sur 4 accretions, plus 42 tests voisins).

Push : feature/18889-test-actuariat-durations tete f93702c62 (force-with-lease). Conflit Git resolu a la main (3eb51c6..f93702c, 110 insertions/11 deletions).

Statut PR : mergeable: MERGEABLE, 0 RED, CI re-declenchee a 07:45Z (Scripts Tests, Always-on guards, PR gate, etc. en cours). Le rollup precedent datait de l'avant-rebase.

Refs #18928
Refs #18889

Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com

@jsboige

jsboige commented Oct 3, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18928
head: f93702c
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c797ca4f2b3cf300a89669303587a60c8dbfbac7d4e7b5d2e13e0cd43d162ed9
diff-files: 1
diff-additions: 110
diff-deletions: 11
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

note: Dossier c397 sur PR #18928 (test(parcours,#18889): oracle local des durees -- le test suit le catalogue, pas un snapshot). Lane porteuse myia-ai-01:CoursIA-2 (tierce attestation). DEEP/test, 1 fichier scripts/notebook_tools/tests/test_generate_parcours.py +110/-11 = +99 net. PR gate SUCCESS 2026-10-03T10:11:54Z. B.0 clear (rc=0, 0 nit non leve, 1 commentaire non evalué non bloquant = rebase notant CONFLICTING résolu). Scope pass (1 .py sous scripts/, PAS sous .claude/, .github/, ni CLAUDE.md). domain: pass (substance = oracle local _parse_duree_to_minutes + _expected_total_minutes, ferme la source de 7 PRs cassees entre 19:16Z et 22:25Z le 02/10 par hardcode de duree_estimee, 50/50 tests verts, 1.05s, regex distincte de compile_parcours). Cible READY : substance prete, B.0 clear, gate SUCCESS. DEEP merge_ready v2 refuse auto mais merge manuel ai-01 OK. Eligible merge manuel direct par ai-01 sur gate rc=0.

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