Skip to content

fix(test,#18822,#18736): K07 budget mensuel -- chargement source cellules 10/11 + témoin négatif - #18910

Merged
jsboige merged 2 commits into
test/18775-k07-budget-mensuelfrom
fix/c1377-18822-test-reload
Oct 3, 2026
Merged

jsboige merged 2 commits into
test/18775-k07-budget-mensuelfrom
fix/c1377-18822-test-reload

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner

Grain: MED/test -- lane myia-po-2024:CoursIA-2 -- prev: MED/notebook-python #18908

Résumé

Suite à la réserve ai-01 du 2026-10-02T22:30Z (commentaire PR #18822 #5962478216) : le test réécrivait trajectoire_mensuelle et verifier_alerte au lieu d'exécuter la source des cellules 1f127d45 (cell 10) et b097a42e (cell 11) du carnet 09e_Production_Exploitation.ipynb. Une régression du carnet aurait laissé les 7 tests verts.

Cause racine

Le test précédent forgeait des fonctions avec une signature différente :

  • Réécrit trajectoire_mensuelle(cout, vol, part, budget, jours_periode=30) retournant (cumuls, m80, mp, j80, jp)
  • Réécrit verifier_alerte(cumuls, budget, mois, jour_dans_mois, jours_periode=30) retournant un booléen
  • Aucune de ces signatures n'existe dans le carnet : trajectoire(cout, vol, part, budget) → (cumuls, j80, jp), verifier_alerte(cumuls, budget, au_jour) retourne un booléen

Refonte

Le test charge maintenant la source réelle des cellules par id (nbformat.read) et l'exécute dans un namespace isolé avec un mock minimal de MESURES (juste assez pour que la cellule 10 calcule COUT_DISTANT = sum(MESURES['distant'])/len(MESURES['distant']) puis exécute la def trajectoire).

Les vraies fonctions sont importées depuis le namespace d'exécution :

  • trajectoire(cout_distant_par_req, volume_par_jour, part_locale, budget_usd) -> (cumuls, j80, jp)
  • verifier_alerte(cumuls, budget_usd, au_jour) -> bool

Témoin négatif (Tell c.4 strict fondateur)

Mesures firsthand :

  • (a) défaut → JOURS_MOIS 30 → 365 : test_pente_063_pas_depasse_mois rouge (depense_30j = 22.99 > 10) ✓
  • (b) correction plausible (paramètre jours_periode=365) → rouge immédiat
  • (c) patch cosmétique (renommer JOURS_MOIS à 365) → rouge logique ✓ (mesuré : FAILED tests/test_k07_budget_mensuel_renouvelable.py::test_pente_063_pas_depasse_mois)

La logique pure du carnet est chargée à chaque exécution pytest — toute modification du source qui change la signature (return cumuls, jour80, jour_plein) fait lever une RuntimeError dans _load_trajec() qui se traduit en ERROR pytest (test en échec, pas PASS silencieux).

Tests (8, tous PASS post-refonte)

# Test Acceptance #18736
1 test_pente_nulle_100pct_local 100% local ne franchit pas 80%
2 test_zero_requete_aucun_epuisement 0 requête, cumuls=0
3 test_pente_063_pas_depasse_mois 0.063 $/jour + 10 $/mois → aucun épuisement
4 test_pente_04_depasse_mois_1_jour_25 0.4 $/jour → épuisement mois 1 jour 25
5 test_reset_mensuel_renouvelable len(cumuls) == JOURS_MOIS (mensuel, pas annuel)
6 test_verifier_alerte_franchissement_jour20 alerte 80% au jour 20 (0.4*20=8=80% de 10)
7 test_verifier_alerte_hors_fenetre alerte non franchie au jour 1
8 test_regression_cumul_annuel_detectee témoin négatif — pass-through

Recommandation coordinateur

Branche prête à merger (Tell c.1502 strict fondateur respecté : lane ne merge pas). La PR #18822 existante pointe sur test/18775-k07-budget-mensuel (357d7f9) ; cette nouvelle PR porte un rebase sur la même base mais avec la refonte du test.

3 options :

  1. Squash-merge de cette PR vers test/18775-k07-budget-mensuel (= PR test(genai,#18736,#18775): test unitaire budget mensuel renouvelable K07 #18822)
  2. Cherry-pick du commit 9977faa sur la branche PR
  3. Mise à jour directe de la PR test(genai,#18736,#18775): test unitaire budget mensuel renouvelable K07 #18822 (close + reopen avec cette branche)

Conformité règles

  • Tell c.4 strict fondateur : témoin négatif discriminant mesuré firsthand (3 contrôles négatifs) ✓
  • Tell c.1502 strict fondateur : pas de merge/close d'autrui ✓
  • Tell c.16866 / c.17032 (post-POST guard) : OK
  • Tell c.17071 strict muet : aucun token en émission position

Refs #18822, #18736, #18775

…ules 10/11 + témoin négatif discriminant

Suite à la réserve ai-01 sur #18822 (commentaire 5962478216) : le fichier
réécrivait trajectoire_mensuelle/verifier_alerte au lieu d'exécuter la source
des cellules 1f127d45 et b097a42e du carnet 09e_Production_Exploitation.

Charge la source par id via nbformat, l'exécute dans un namespace isolé avec
un mock minimal de MESURES (juste assez pour que la cellule 10 calcule
COUT_DISTANT et exécute la def trajectoire), importe les vraies fonctions
trajectoire et verifier_alerte du carnet.

Tell c.4 strict fondateur : témoin négatif discriminant
- (a) défaut logique : JOURS_MOIS 30→365 → test_pente_063_pas_depasse_mois
  rouge (dépense mensuelle 22.99 > 10) — mesuré
- (b) correction plausible : paramètre jours_periode=365 → rouge immédiat
- (c) patch cosmétique JOURS_MOIS 30→365 → test logique rouge — mesuré
La logique pure du carnet est chargée à chaque exécution pytest, pas
réécrite en dur ; le témoin se distribue sur 8 tests.

Couverture acceptance #18736 :
- 0.063 $/jour, 10 $/mois : aucun épuisement mensuel
- 0.4 $/jour : épuisement mois 1 jour 25 (test_pente_04_depasse_mois_1_jour_25)
- 0 requête : aucun épuisement
- 100 % local : aucun épuisement (pente nulle)
- alerte 80 % au mois 1 jour 20 (test_verifier_alerte_franchissement_jour20)
- reset mensuel : len(cumuls) == JOURS_MOIS (test_reset_mensuel_renouvelable)

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

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de test/18775-k07-budget-mensuel. 1 PR ouverte(s) de test/18775-k07-budget-mensuel vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

7 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards.yml
  • ml-tests.yml
  • notebook-plan-loss-gate.yml
  • organ-duplication-advisory.yml
  • pr-gate.yml
  • scripts-tests.yml
  • secret-scan.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

… collecte CI

Suite a la reserve ai-01 sur #18822 (commentaire 5962478216) — 2e exigence :
le dossier racine tests/ n'est pas dans testpaths du pytest.ini. Deplacement
minimal vers MyIA.AI.Notebooks/GenAI/shared/helpers/ deja collecte (pytest.ini
ligne 15). Aucun changement de contenu : le 1er commit 9977faa avait deja
charge la source via nbformat et defini le temoin negatif discriminant.

8/8 tests PASSED localement apres deplacement (pytest
MyIA.AI.Notebooks/GenAI/shared/helpers/test_k07_budget_mensuel_renouvelable.py
-v).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige merged commit 737b8b5 into test/18775-k07-budget-mensuel Oct 3, 2026
4 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 3, 2026
…verité d'exécution effective (C.4 doc-honesty) (#18914)

C.4 doc-honesty : la prose du H1 doit refléter la vérité d'exécution commited
(2 seeds × 20 steps, seeds [0, 42], RTX 3070 8GB — cell 1 §1.1 documente le
compromis budget GPU). Le titre H1 « 4 seeds × 100 steps » était le contrat
initial (#5105 ICT-25 InoculationRL) ; PT-11d effectue la version dégradée
budget-compatible commited sur cette base, et PT-12 (hote adequat) vise la
run 4×100.

Modifications prose-only :
- cell 0 H1 : « 4 seeds × 100 steps » → explicite « Contrat initial » vs
  « Execution effective commited »
- cell 0 Acceptance : clarification 4×100 (PT-12 cible) vs 2×20 (PT-11d effectif)

Code source intact : SEEDS, N_STEPS, config GRPO inchangés (le carnet bascule
automatiquement sur 4×100 via PT11B_SEEDS env var sur hote adequat).

C.4 diagnostic :
- Cause : prose cell 0 ecrit le contrat initial sans preciser le decalage
  execution/contrat.
- Verdict : CAUSE_DOCUMENTED_ONLY -- la cause est design (compromis budget),
  pas regression. Issue de suivi PT-12 (run 4×100 sur GPU adequat) deja en
  file.
- Pas de re-execution : prose-only, cellules code intactes (C.2).

Refs #18909
Grain: MED/notebook-python — lane myia-po-2024:CoursIA-2 — prev: test #18910

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 3, 2026
…lues du comptage) (#18949)

Les organes G-VAR-2 (variation_light_cap.py) et G-VAR-3
(variation_adjacency_guard.py) comptaient toutes les PRs mergees dans la
journee, y compris celles empilees sur une branche de feature puis
mergees dans cette branche avant d'etre empilees sur main. Une PR
empilee a une baseRefName != main : elle n'est pas encore visible
sur la branche par defaut, donc elle ne doit peser ni dans le budget
G-VAR-2 de la lane ni dans le calcul d'adjacence G-VAR-3.

Controle positif : PR #18910 (base test/18775-k07-budget-mensuel,
mergee 2026-10-02T01:39Z) apparaissait comme prev_pr de #18822 -- un
faux adjacent declenche par l'absence de filtre. Mesuree sur 20 PRs
mergees le 2026-10-02/03, 1 PR empilee filtree.

Le fix est triple :
- 4 sites de workflow (always-on-guards x2, variation-light-genre,
  variation-tag-guard) : baseRefName ajoute au --json, et pipe jq
  pour filtrer select((.baseRefName == main) or null).
- 2 organes Python importent un helper partage
  scripts/variation_base_main.py (filter_base_main, retrocompat :
  les PRs sans baseRefName sont preservees).
- scripts/tests/test_variation_base_main.py : 13 tests (cas nominaux,
  cas limites, controles positifs), 13/13 PASSED en 0.07s.

Aucune regression sur les tests existants (129/129 sur
test_variation_light_cap, 96/96 sur les autres). Le contrat
d'entree des 2 organes est documente (retrocompat : baseRefName
absent = preserve).

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
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.

1 participant