Skip to content

fix(17391): Lab15 -- les lectures ne nomment plus ce que l'artefact ne contient pas - #19871

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17391-lab15-audit
Oct 8, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17391-lab15-audit

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python -- lane myia-po-2027:CoursIA -- prev: DEEP/notebook-python #19574

Contexte

Audit de Lab15-Kaggle-Challenge.ipynb (partition Hermes, campagne #17073), un carnet par cycle. Lab15 est l'un des deux carnets que le registre corrigé de la partition donne comme jamais audités (l'autre, Lab17, vit sous Day7-Production).

Périmètre

1 fichier : MyIA.AI.Notebooks/ML/DataScienceWithAgents/Track2-GoogleADK/Day6-MLE-Star/Lab15-Kaggle-Challenge.ipynb.

Nature du diff : 3 cellules markdown, 0 cellule de code. Aucun execution_count et aucun outputs n'est modifié — C.2 est satisfait sans ré-exécution, et aucune lecture chiffrée du carnet n'est invalidée. Vérifié cellule par cellule contre origin/main (comparaison source + outputs + execution_count : 0 cellule de code touchée ; pas de BOM, 0 CRLF).

Passe d'organes

Couverture avant et après l'édition, verdict identique :

Organe Verdict
check_split_reading_cells clean
check_interp_positioning 0 finding
check_density_anchor OK
check_cell_source_parses 0 finding
check_outputs_text_fragmentation 0 finding
check_null_exec (H.3) OK
check_exec_sequence 0 gap / 0 duplicate / 0 unordered
check_output_failure_text 0 régressé
check_output_collapse / check_source_collapse 0 flaggé
check_notebook_nav_chain OK
check_notebook_navlinks 0 lien cassé
check_identifier_regression OK

Findings corrigés

F1 — le simulateur est décrit avec une machinerie qu'il n'implémente pas

Cellules markdown 1 et 5. La prose y présentait le simulateur comme reproduisant le « protocole Kaggle » :

« Le simulateur reproduit le protocole Kaggle (dataset tabulaire, métrique AUC, leaderboard simulé) » (cellule 1)
« la valeur pédagogique n'est pas le dataset lui-même mais le protocole Kaggle qu'il déclenche (deadline, métrique publique/privée, leaderboard, itérations). Le simulateur encode ce protocole dans un @dataclass » (cellule 5)

Mesure : leaderboard et deadline n'apparaissent nulle part dans une cellule de code du carnet (0 occurrence) ; KaggleSimulator n'expose que deux méthodes — get_competition_info() et generate_sample_data() — et CompetitionInfo porte name, task, metric, description, data_description. Aucun leaderboard, aucune deadline, aucune découpe publique/privée : la prose décrivait un protocole absent, sur un paragraphe dont c'est justement l'argument central.

Correction : la prose décrit désormais ce que le simulateur pose réellement (une tâche nommée, une métrique officielle, un schéma de features, une cible à part) et nomme explicitement ce qu'il laisse dehors — la machinerie de compétition — en donnant la raison (elle n'apprend rien sur la méthode). L'argument pédagogique du paragraphe est conservé, et il est maintenant vrai.

F2 — la lecture du code généré nomme un modèle absent du code

Cellule markdown 20 :

« l'agent MLE-STAR a produit un pipeline complet […] : chargement pandas, train_test_split, RandomForestClassifier + XGBClassifier, métrique roc_auc_score »

Mesure : le template généré (cellule 8, generate_template_code) importe pandas, numpy, sklearn.model_selection.train_test_split, sklearn.metrics.roc_auc_score et xgboost — puis instancie xgb.XGBClassifier. RandomForestClassifier n'apparaît que 3 fois dans le carnet, et jamais dans du code exécutable : la lecture elle-même (cellule 20), une puce d'indice d'exercice (cellule 28) et une ligne commentée de l'exercice étudiant (cellule 29). Aucun sklearn.ensemble n'est importé — le carnet n'instancie jamais de forêt aléatoire.

Correction : la lecture nomme ce que le code contient (one-hot des catégorielles, XGBClassifier avec early stopping, évaluation par roc_auc_score). La phrase suivante — qui rattache le code aux modèles SOTA recommandés à l'étape précédente — reste vraie et inchangée : c'est bien la liste SOTA qui oriente le choix, mais un seul de ses trois modèles est implémenté dans le template.

Finding rapporté, non corrigé ici (il vit dans une cellule de code)

F3 — le taux de bruit annoncé n'est pas celui du code, et la plage d'AUC est démentie par l'output committé

Cellule de code 6 (docstring + commentaire) et cellule de code 27 (message d'avertissement) :

Où Ce qui est écrit Ce que le code fait
cellule 6, docstring « une règle déterministe + 15 % de bruit pour que le AUC-ROC soit mesurable (~0.82) » noise_mask = rng.random(n_samples) < 0.05 → 5 %
cellule 6, commentaire « Avec 5 % de bruit, AUC-ROC attendu ~0.82-0.88 sur 300 samples » 5 % — mais l'AUC committé est 0.9624
cellule 27, message « le bruit 15 % ne noie pas le signal » 5 %

Deux écarts, tous deux mesurables : le taux (15 % annoncé vs 5 % codé) et la plage prédite (~0.82-0.88 vs 0.9624 committé, hors bande). La lecture cohérente est celle d'un docstring resté à une version antérieure du générateur, où le bruit était plus élevé ; le code a été abaissé à 5 % sans que les nombres suivent.

Non corrigé ici volontairement : ces trois textes vivent dans des cellules de code. Les corriger engage une ré-exécution complète du carnet (règle C.2) — faisable, le carnet étant déterministe, mais c'est une décision de contenu (ajuster le taux de bruit, ou ajuster les nombres annoncés) qui appartient au propriétaire de la série, et elle élargirait le périmètre de cette PR. Consigné sur #17391 pour le cycle suivant.

Vérifications

  • Garde de collision (L898) avant édition : gh pr list --state open --limit 200 filtré sur les chemins Lab15/Lab16/Lab17/Track2/GoogleADK → 0 PR ouverte ; check_lane_claim.py 17391 --lane myia-po-2027:CoursIA → CLEAR ; aucun worktree positionné sur le chemin.
  • [CLAIMED] posé sur [Audit #17073] Série DSWA — Track2-GoogleADK — partition Hermes #17391 avant toute édition.
  • Le carnet n'est pas dans le registre des paires jumeaux : l'édition ne re-dérive aucune paire, aucune attestation n'est due.
  • Diff vérifié cellule par cellule contre origin/main : 0 cellule de code touchée (source, outputs et execution_count identiques).

See #17391

🤖 Generated with Claude Code

…e contient pas

Deux lectures de prose annonçaient du contenu que l'artefact cité ne porte pas.

- Cellules 1 et 5 : le simulateur y est décrit comme reproduisant le
  « protocole Kaggle » avec leaderboard, deadline et découpe publique/privée.
  Mesure : `KaggleSimulator` n'expose que deux méthodes
  (`get_competition_info`, `generate_sample_data`) et `CompetitionInfo` porte
  name/task/metric/description/data_description — aucune de ces trois pièces
  n'existe. La prose décrit désormais ce que le simulateur pose réellement
  (tâche, métrique, schéma de features, cible à part) et nomme ce qu'il laisse
  volontairement dehors.

- Cellule 20 : la lecture du code généré annonçait « RandomForestClassifier +
  XGBClassifier ». Le template généré (cellule 8) n'importe que `xgboost` et
  n'instancie que `xgb.XGBClassifier` — aucun `sklearn.ensemble` dans tout le
  carnet. La lecture nomme maintenant ce que le code contient réellement.

Audit #17073, partition Hermes, carnet Lab15 (édition markdown seule : 3 cellules
markdown, 0 cellule de code, aucun execution_count ni output modifié — C.2
satisfait sans ré-exécution).

Le reste de l'audit est consigné sur #17391 (passe d'organes, findings).

See #17391

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

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19871
head: ed80b13
complete: true
body: read
comments-reviewed: 0
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3a28a3a957b8775e338fc60390d426688a52e1db0557c60e68072dddd3823260
diff-files: 1
diff-additions: 3
diff-deletions: 3
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19871
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions

github-actions Bot commented Oct 8, 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 added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 8, 2026
@github-actions

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

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.5s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.4s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.1s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 17.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 12.5s

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

@github-actions

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

…-counts)

L'organe `prose-counts` (bloquant, `--strict` en CI) refusait la cellule
markdown ajoutee : « (ici **300 lignes x 8 features** pour la Tabular
Playground Series) » fige une mesure que le code du simulateur porte deja.

Remede prescrit par l'organe lui-meme : retirer la mesure, garder le
predicat. La cellule dit desormais que le @DataClass expose les dimensions
du probleme (jeu tabulaire synthetique du type Tabular Playground Series)
sans reveler la cible -- ce qui est le propos pedagogique.

Markdown-only : aucune cellule de code modifiee, pas de re-execution due.

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

jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner Author

Reparation du rouge bloquant prose-counts -- commit 3dc9a1a

Cause. Le PR gate ne portait qu'une cause bloquante (failing checks: prose-counts (failure)). L'organe check_prose_quantitative_claims.py (bloquant en CI : --diff HEAD^1...HEAD --strict) refusait une cellule markdown ajoutee par la PR.

Reproduction locale avant correctif : rc=1, 1 compteur(s) quantitatif(s) en prose -- « (ici 300 lignes x 8 features pour la Tabular Playground Series) ». Le compte figeait une mesure que le code du simulateur porte deja, dans une cellule dont le propos est justement de decrire la forme du probleme.

Remede. Celui que l'organe prescrit lui-meme -- retirer la mesure, garder le predicat : la cellule dit desormais que le @dataclass expose les dimensions du probleme (un jeu tabulaire synthetique du type Tabular Playground Series) sans reveler la cible. Le reste de la cellule est inchange. Markdown-only, une ligne de source ; apres correctif rc=0 en local.

Les trois advisories : panne de mesure, pas finding de carnet

Markdown table syntax advisory, Source-output ratchet (advisory) et scan_md_hierarchy drift (advisory) echouent a la meme minute (05:01-05:05Z), sur trois jambes distinctes du meme run, avec le meme message :

error: Could not read 56f9b061c58c2af82678066c813826396b8fe03b
fatal: Failed to traverse parents of commit 39a81cedcfffd0e23e8e661d207c3a1ab821ce69
error: remote did not send all necessary objects

C'est un echec de fetch d'objets git cote runner, pas un defaut du carnet : les trois organes relances localement sur cette meme tete rendent scan_md_table_syntax -> 0 finding, check_source_output_ratchet -> rc=0 / 0 cellule perimee, scan_md_hierarchy --baseline --diff -> +0 drift / rc=0. Ces trois jambes ne portent donc aucun point a lever ; la nouvelle tete 3dc9a1a31b23 les rejoue.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

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

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 github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 8, 2026
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19871
head: 3dc9a1a
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7ef6d77e2d3d5c4f35e1af582b47a46a5b7fd0c1927da983c4ca5541dd3ba580
diff-files: 1
diff-additions: 3
diff-deletions: 3
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19871
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01 myia-ai-01 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.

Lecture finale complete : body/comments/reviews/threads/diff, B.0 clear. Delta markdown seulement ; simulator et template lus a la tete : pas de leaderboard implemente, one-hot et XGBClassifier/early stopping/roc_auc_score effectivement presents. Les sorties et cellules code ne changent pas. Residus F3 documentes sur #17391 ; le mode deterministe du template ne constitue pas une nouvelle preuve de generation LLM.

@myia-ai-01
myia-ai-01 merged commit 517c153 into main Oct 8, 2026
97 of 98 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.

2 participants