Skip to content

fix(notebooks,#18736): 09e — budget mensuel renouvelable dans trajectoire - #18751

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/18736-budget-mensuel-renouvelable
Oct 2, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/18736-budget-mensuel-renouvelable

Conversation

@jsboige

@jsboige jsboige commented Oct 1, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2024:CoursIA — prev: MED/tooling #18742

Ce que livre la PR

K07 (issue #18736, fiche de l'audit tiers Astra #18731) : la cellule trajectoire (c10, id 1f127d45) accumulait la dépense sur 365 jours alors que le budget documenté dans le carnet est mensuel (« $10/mois ») — la table committée montrait « alerte jour 128 / épuisé jour 160 / > 1 an », une lecture annuelle d'un budget mensuel.

Le geste

  • trajectoire() simule désormais le mois courant : compteur remis à zéro à chaque frontière de mois, et comme la pente est constante, la trajectoire d'un mois vaut pour tous. Colonnes renommées « jour du mois » ; le break de l'ancienne boucle annuelle disparaît (le mois continue, épuisé ou non).
  • Témoins d'acceptance intégrés à la cellule : pente 0,40 $/jour (alerte jour 20, épuisé jour 25) et zéro requête (jamais/jamais).
  • Ligne part locale = 1.0 ajoutée à la table (cas 100 % local de l'acceptance).
  • Organe d'alerte (c11) testé dans les deux régimes : calme (seuil non franchi au jour 30) et tendu (franchi — ALERTE au jour 20).
  • Prose alignée : intro de section (mensuel renouvelable, pas un cumul annuel), Lecture c12 (les deux régimes et pourquoi une lecture annuelle les cacherait), Exercice 1 (« jour du mois »).

Preuves — re-exécution complète (papermill, kernel python3, 2026-10-01, commit 6a531d1)

  • Pentes mesurées 0,0639 / 0,0319 / 0,0064 $/jour → jamais en alerte et en épuisement sur toutes les lignes (le mois complet consomme 1,92 $ des 10 $).
  • Témoin 0,40 $/jour → alerte 80 % au jour 20, budget épuisé au jour 25 du mois — franchissement mensuel observable.
  • Témoin zéro requête → jamais / jamais ; ligne 100 % local → jamais.
  • Carnet exécuté de bout en bout, 0 erreur, execution_count réels partout (C.2) ; grep raise NotImplementedError|assert False|1/0 : 0 (C.1).

See #18736 (acceptance couverte point par point). Parent : #18731.

🤖 Generated with Claude Code

La cellule trajectoire (c10) accumulait la depense sur 365 jours alors que le budget
documente est mensuel ($10/mois). Le modele devient : compteur remis a zero a chaque
frontiere de mois, colonnes en jour du mois, temoins d'acceptance (0.40 USD/j -> alerte
jour 20 / epuisement jour 25 ; zero requete -> jamais), ligne 100% locale, organe
d'alerte teste dans les deux regimes, prose alignee. Carnet re-execute integralement
(papermill, kernel python3).

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

github-actions Bot commented Oct 1, 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 commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.9s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.2s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s

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

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

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • 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)

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

github-actions Bot commented Oct 1, 2026

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

github-actions Bot commented Oct 1, 2026

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

@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18751 (fix(notebooks,#18736): 09e — budget mensuel renouvelable dans trajectoire) 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.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18751
head: 6a531d1
complete: true
body: read
comments-reviewed: 8
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d9e8dc0dec7e79854fdf64da02d3938ca0e566efb92258ff03e5f7de92abaebc
diff-files: 1
diff-additions: 230
diff-deletions: 197
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 214f68e into main Oct 2, 2026
90 of 92 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 3, 2026
…K07 (#18822)

* test(genai,#18736,#18775): test unitaire budget mensuel renouvelable K07 (extrait de #18775 fermee, credit a #18751)

Acceptance #18736 verifiee par 7 tests unitaires (test_k07_budget_mensuel_renouvelable) :
- 0.063 USD/jour + 10 USD/mois : aucun epuisement mensuel (1.89 < 10)
- 0.4 USD/jour : epuisement mois 1 jour 25 (10/0.4 = 25)
- 0 requete : aucun epuisement
- 100% local : aucun epuisement (pente nulle)
- l'organe d'alerte detecte le seuil 80% en mois 1 jour 20 (a 0.4 USD/jour, 8/0.4)
- le reset mensuel : la valeur de cumuls_mois[30] (jour 1 de mois 2) doit etre
  strictement inferieure a cumuls_mois[29] (jour 30 de mois 1) pour pente > 0

Le test reproduit la logique pure de trajectoire_mensuelle() et verifier_alerte()
telle qu'elle apparait dans le carnet 09e_Production_Exploitation c10/c11 (post-#18751 merge).
Le test permet de detecter toute regression de la trajectoire apres evolution du carnet.

Apres merge de cette PR de test seule, l'acceptance #18736 sera couverte par le harnais
de tests : toute modification future de la trajectoire dans le carnet 09e devra faire
passer ces 7 tests.

* fix(test,#18822,#18736): K07 budget mensuel -- chargement source cellules 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>

* fix(test,#18822,#18736): déplace K07 budget sous shared/helpers/ pour 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>

* fix(ci,#18822): genai-helpers-tests install nbformat

Le test K07 budget mensuel (#18822) charge la source des cellules
1f127d45 et b097a42e du carnet 09e_Production_Exploitation.ipynb
via nbformat. Le runner CI (Python 3.11) n'installait pas cette
dependance, ce qui faisait echouer la collecte (138 -> 1 error).

Ajout de nbformat au pip install de genai-helpers-tests.yml. Aucun
autre test n'importe nbformat dans ce dossier, mais le 138-collected
floor-guard echouait deja, le fix est borne et necessaire au refonte
du test K07.

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

---------

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

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants