Skip to content

fix(lab7,#17387): la demo Q3 exige un calcul, l'agent invoque python_repl_ast (re-exec complete) - #18487

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/17387-lab7-q3-codeact
Sep 30, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/17387-lab7-q3-codeact

Conversation

@jsboige

@jsboige jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2024:CoursIA — prev: MED/guard #18470

Audit correctif de Lab7-Data-Analysis-Agent.ipynb (partition Hermes de #17387) : un finding CONFIRMED, corrigé et re-exécuté de bout en bout. Les deux patterns de série que l'issue déclare propres sur Lab7 sont revérifiés ci-dessous avec leur mesure.

F1 (CONFIRMED) — la démonstration « Valeurs uniques » n'invoquait pas l'outil qu'elle était censée démontrer

La démonstration posait « Liste les catégories de produits uniques. », et la sortie de main le prouve sans ambiguïté : Invoking y compte 0 occurrence, et l'agent répond lui-même « D'après l'extrait affiché, les catégories uniques sont : ['Electronique', 'Livre', 'Maison'] ». La réponse était lisible dans l'extrait de head() affiché deux cellules plus haut — les 3 catégories du DataFrame nettoyé y figurent toutes — donc la démonstration ne démontrait rien : ni l'appel de l'outil, ni la capacité annoncée par sa propre prose (« identifier et utiliser les méthodes appropriées de Pandas »). C'est le cas dégénéré du Prong B de sota-not-workaround.md.

Correction (2 lignes de source, vérifiées cellule à cellule contre origin/main — 25 cellules des deux côtés, seules les cellules #13 markdown et #14 code diffèrent en source) : la question devient « Combien y a-t-il de dates uniques dans les données ? ». La colonne date est la seule dont la réponse n'est pas lisible dans l'extrait : head() n'affiche que 3 dates, le DataFrame nettoyé en porte 4 — la ligne portant 2023-10-04 est hors extrait.

Mesure (étapes du notebook répliquées en pandas pur, sans LLM) Valeur
read_csv brut 7 lignes
après le nettoyage du notebook (dropna(subset=['quantite'])) 6 lignes
dates distinctes visibles dans head() 3 (2023-10-01/02/03)
dates distinctes dans le DataFrame nettoyé 4 (dont 2023-10-04, hors extrait)
len(df) — réponse Q1 6, identique à la sortie committée
chiffre_affaires.sum() — réponse Q2 1839.8, identique à la sortie committée

Preuve post-fix : la sortie de la cellule corrigée porte Invoking: python_repl_ast with {'query': "import pandas as pd\npd.to_datetime(df['date']).dt.date.nunique()"} → 4, en accord avec le recalcul indépendant.

Patterns de série (#17387) — revérifiés

Pattern Lab7
cellule 0 = nav + H1, puis H2 même titre + second bloc nav absent — la cellule 0 porte nav + H1 + ## Objectifs d'apprentissage + prérequis + durée, en une seule cellule
section ## Exemple guidé après ## Conclusion absent — ordre des headings : Exercices (#17, #19, #21) puis ## Conclusion (#23)

Delta de sorties hors F1 — déclaré

La re-exécution est complète (papermill, start_time 2026-09-29T21:23:03Z → end_time 21:23:26Z). Les sorties des cellules non-LLM sont byte-identiques à main ; deux cellules LLM diffèrent de sortie :

  • la cellule corrigée (attendue) ;
  • la question Q4, à source identique : même réponse (Electronique, 1440.0), mais une requête d'outil reformulée et une prose différente — variabilité du modèle, temperature=0 n'étant pas une garantie de déterminisme. Aucune régression sémantique.

Stubs d'exercice — non touchés (C.1)

Les 3 stubs (ec=8, 9, 10) restent conformes : None + print("Exercice N a completer"), indices en commentaires, aucun raise/assert False/1/0. Le code exécuté utilise gpt-5-mini (cellule ec=3) ; l'indice d'exercice qui cite gpt-4o est un commentaire dans un stub non exécuté, sans effet sur la démonstration.

Validation (relancée après le dernier commit)

Preuve Résultat
execution_count [1..10] contigus sur 10 cellules code
erreurs 0
cellules code sans sortie 0
invocations d'outil par démonstration 1 sur ec=4, 5, 6, 7 (Q3 incluse)
ancienne question 0 occurrence
nouvelle question 2 (prose + invoke)
fuites de chemin absolu 0
C.1 (raise NotImplementedError / assert False / 1/0) 0
metadata.papermill exception: null, durée 23,6 s, 21:23:03Z → 21:23:26Z, version 2.7.0
language_info 3.13.12

Portée

Le seul artefact modifié est le notebook Lab7. Cet audit ne touche ni les autres labs de la série (Lab6 est livré en #17392 par une autre lane) ni l'enrichissement markdown de la série (chantier distinct).

See #17387

🤖 Generated with Claude Code

…python_repl_ast (re-exec 3.13.12)

Audit borne du carnet Lab7 (campagne #17073, partition DSWA Track1-LangChain).
Finding CONFIRMED (stale-claim, apparu avec le passage gpt-4o -> gpt-5-mini de
#16710) : la question 3 "Liste les categories de produits uniques." etait
repondue depuis l'extrait de df.head() (5 lignes) sans aucun appel d'outil --
la sortie committee ne portait aucune invocation de python_repl_ast, ce qui
contredit la prose de la cellule d'intro et la these CodeAct du lab (cellule
Etape 2, reference 1). Question reformulee : "Combien y a-t-il de dates
uniques dans les donnees ?" (colonne date : 4 valeurs distinctes, dont une
hors de l'extrait affiche -> un calcul est necessaire) ; prose de la cellule
d'intro alignee (categories -> dates). Aucune sortie hand-editee.

Re-execution reelle (papermill via scripts/notebook_tools, kernel python31312
= 3.13.12, cle OpenAI chargee depuis .secrets/master.env, jamais affichee) :
10/10 cellules code, execution_count 1..10 contigus, 0 erreur ; Q3 ->
Invoking python_repl_ast pd.to_datetime(df['date']).dt.date.nunique() -> 4.
Q1/Q2/Q4 inchanges de sens (meme outil invoque). Metadata papermill scrubbee
au basename par l'organe canonique (hook #3436).

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

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

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2024:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-29) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

Copy link
Copy Markdown
Contributor

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

@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

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 6.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 7.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 7.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 5.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 4.3s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 48.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 6.8s

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM (vérifié: lecture intégrale du notebook base+head, protocole v2 — cellules modifiées lues avec leurs sorties complètes)

[NanoClaw] — review notebook protocole v2 : extraction complète base (b6b02bb4) + head (77eef325), outputs réduits à des empreintes sauf cellules modifiées (13/14/16) lues en entier. 25 cellules, 22 byte-identiques, diff chirurgical de 3 cellules.

F1 confirmé de façon indépendante. Cellule 14 base : la sortie ne contient aucun « Invoking » — l'agent répondait « Tu peux utiliser pandas. Exemple : … » et listait les catégories « D'après l'extrait affiché », i.e. une réponse déduite de l'aperçu df.head(), pas un résultat calculé. Détail mesuré : cette réponse tombait juste par coïncidence (la série complète de la cellule 16 montre exactement les 3 mêmes catégories) — mais rien ne le garantissait. Cellule 14 head : « Invoking: python_repl_ast with {'query': "…dt.date.nunique()"} » → 4 → réponse alignée sur la sortie calculée. La démo illustre désormais l'outil qu'elle annonce (.unique()/.nunique() en prose, nunique() en exécution).

Q4 (cellule 16) vérifiée. Même réponse (Electronique, 1440.0), requête reformulée (plus de .head(1)), la série complète (Electronique 1440 / Livre 248 / Maison 151.8) remplace le seul top-1 — la variabilité LLM signalée dans le body est réelle et sans régression sémantique.

Gates densité #17040 : rien à signaler. Aucune cellule ajoutée, markdown édité in place sans valeur numérique citée, aucune lecture après-output ajoutée, stubs d'exercices intacts (ec=8/9/10, None + print), exécution 1→10 contiguë, 0 erreur, 0 sortie manquante.

Note checks (pas d'APPROVE) : au moment de la review, tous les check-runs complétés au head sont success, mais PR gate, validate-notebooks et 5 autres sont encore in_progress (PR à ~5 min d'âge au scan). La règle locale exige des checks relevés ET verts avant tout APPROVE — je reste en COMMENT ; la décision de merge revient à Emerjesse.

@jsboige

jsboige commented Sep 30, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18487
head: 77eef32
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 56dfc5b727941faca45b05925363967a3e517941718c41a20ef43b009c478d18
diff-files: 1
diff-additions: 139
diff-deletions: 149
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 411b72e into main Sep 30, 2026
91 of 92 checks passed
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.

3 participants