Skip to content

Fix(dswa,#23802): Lab14 kernel 3.12.13->3.13.15 — modele preserve, diagnostic (c)+(e) - #23848

Merged
jsboige merged 1 commit into
mainfrom
fix/dswa-lab14-313
Nov 1, 2026
Merged

jsboige merged 1 commit into
mainfrom
fix/dswa-lab14-313

Conversation

@jsboige

@jsboige jsboige commented Oct 31, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: DEEP/notebook-python #23844

Tranche 7 de la famille ML/DataScienceWithAgents (census #23384, issue fille #23802) : Track2-GoogleADK/Day6-MLE-Star/Lab14-Ablation-Refinement.ipynb passe du kernel 3.12.13 au canon CPython 3.13.15. Ce carnet pilote une étude d'ablation à vrais appels LLM (litellm) : estimateur d'importance des blocs + TargetedRefiner. La re-exécution a été faite contre le même modèle que la run committée — au prix d'un paramètre de sampling refusé en amont (diagnostic ci-dessous).

Ce qui a été fait

Mesure Avant Après
language_info.version 3.12.13 3.13.15
kernelspec python3 python3 (inchangé)
Cellules code 13 13
execution_count non nuls 13 / 13 13 / 13
Erreurs dans les sorties 0 0
Sources code modifiées — 0
Sources md modifiées — 2 (re-dérivation, cf. diagnostic)
Sorties divergentes — 3 (code#8 classement, code#9 code raffiné, code#10 rapport final)

Le vrai outil, même modèle que la run committée

Signature reconstruite à la source : au commit d'origine du carnet (9a451e1052, 2026-10-08), la run a été servie par ACTIVE_PROVIDER=openai, modèle gpt-5.6-sol. .env du worktree (gitignored, jamais committé, clé issue de .secrets/master.env) épinglé sur cette signature exacte — le défaut du module a bougé depuis, l'épinglage évite de changer d'outil en même temps que de noyau.

Diagnostic dérive

Cause (c) — moteur upstream, mesurée. La source du carnet demande temperature=0.2 (estimateur d'importance, raffineur). Run2 : le provider refuse aujourd'hui ce paramètre pour gpt-5.6-sol tant que le raisonnement est actif (UnsupportedParamsError). Parade sans toucher la source : LITELLM_DROP_PARAMS=True dans l'environnement du process papermill — litellm abandonne le paramètre refusé et sert le même modèle que la run committée. Une run témoin sur gpt-4.1 (run3) a aussi été mesurée puis écartée : elle aurait changé l'outil en même temps que le noyau.

Cause (e) — stochasticité non-seedée, mesurée par run de contrôle. Run de contrôle (run5) : même kernel 3.13.15, même provider, même modèle, même config que la run committée ici (run4) — 45 lignes de sortie divergentes, partition des blocs différente. La segmentation LLM n'est pas reproductible d'une exécution à l'autre : la divergence base → run4 n'est pas causée par le changement de noyau.

Prose re-dérivée en voix pédagogique. md19 épinglait « 4 blocs » avec noms anglais ; md22 décrivait make_pipeline(StandardScaler(), ...) + GridSearchCV. Re-dérivation sur les valeurs imprimées par la run committée : 5 blocs (« Entraînement et évaluation » = 1.00 prioritaire, « Importation des dépendances » = 0.30 dernier — la leçon « imports = prérequis mécanique sans valeur prédictive » survit inchangée) et le raffinement réécrit (LabelEncoder, StratifiedKFold(shuffle=True, random_state=42), cross_val_predict, validation croisée imbriquée « sans fuite de données »). Le paragraphe « Pourquoi ces libellés et ces scores ne sont pas des constantes » est conservé, son récit historique étendu aux trois exécutions mesurées. L'histoire du paramètre de température refusé reste dans ce body, pas dans le carnet.

Inventaire des runs

Run Provider / modèle Verdict
base openai / gpt-5.6-sol committée sur main (4 blocs EN)
run1 vllm (défaut, sans .env) écartée : AuthenticationError → réparation rule F (.env provisionné depuis master.env)
run2 openai / gpt-5.6-sol écartée : UnsupportedParamsError temperature=0.2 — preuve cause (c)
run3 openai / gpt-4.1 écartée : modèle changé
run4 openai / gpt-5.6-sol + LITELLM_DROP_PARAMS=True committée ici (5 blocs FR)
run5 (contrôle) idem run4 divergence de 45 lignes vs run4 — preuve cause (e)

Gardes locales (depuis le worktree, tête 2e7afe2d27)

check_kernel_drift.py origin/main --json          -> findings: [], changed_notebooks: 1
check_prose_quantitative_claims.py --diff ...     -> [OK] aucun compteur quantitatif en prose
check_activity_leak.py --diff ...                 -> [OK] aucun passage d'activite dense ajoute
check_output_collapse.py origin/main              -> 1 changed, 0 flagged
check_source_collapse.py origin/main              -> 0 flagged (advisory)

Normalisations : metadata.papermill.input_path / output_path au basename (tolérance admise) ; écriture en LF, ensure_ascii=False, indent=1. Aucune sortie éditée à la main — les 2 md retouchées sont une re-dérivation de prose sur les valeurs imprimées, pas un alignement de sortie.

Portée

Un seul carnet, un seul sujet. Tranches restantes de #23802 : Lab13-Web-Search-SOTA (3.12.13, dépendance HTTP à sonder), 4.1-Conv-NumPy-Torch-Allclose (instantané HTTP — problème distinct), puis barrières CUDA ×6, API-key ×1 (Lab14 était la seconde, résolue via master.env), _archive/ ×1.

See #23802. See #23384.

🤖 Generated with Claude Code

…- modele preserve, md19/md22 re-derivees

Re-execution papermill contre le vrai provider de la run commitee (openai/gpt-5.6-sol,
temperature=0.2 source + LITELLM_DROP_PARAMS). Diagnostic C.4 causes (c)+(e) :
refus upstream du parametre de temperature mesure (run2), instabilite de la
segmentation mesuree par run de controle (45 lignes divergentes). Sorties :
5 blocs francais, prioritaire Entrainement et evaluation (1.00), code raffini
LabelEncoder/StratifiedKFold/cross_val_predict.

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

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.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.7s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.2s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 11.7s

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

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

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

✅ 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

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

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

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

@github-actions

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)

@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.

[Hermes] Deep review — tranche 7 DSWA, Lab14 kernel 3.12.13→3.13.15 (FULL READ du carnet, base↔head par blobs vérifiés 47 692/48 498 octets).

Vérifié au head 2e7afe2d :

  • Structure : 32 cellules base↔head, 0 source code modifiée, exactement 2 md retouchées (idx 19, 22), 3 sorties divergentes (idx 18/21/25) — conforme au tableau du body au détail près (voir 🟡).
  • Ancrage des prose re-dérivées : chaque numeral de md19 (5 blocs ; 1.00 / 0.90 / 0.90 / 0.85 / 0.30 ; bloc prioritaire) et de md22 (importance 1.00, random_state=42) est présent dans les outputs committés — vérification programmatique, 0 non-ancré. Les libellés FR de md19 (« Entraînement et évaluation », etc.) et le code raffiné de md22 (LabelEncoder, StratifiedKFold(shuffle=True, random_state=42), cross_val_predict, « sans fuite de données ») correspondent exactement aux sorties de la cellule 18/21.
  • Le récit de stochasticité de md19 est vrai dans l'arbre : l'output base de la cellule 18 porte bien « Training & Evaluation » en tête (4 blocs, EN) — les deux autres exécutions citées (run5) ne sont pas falsifiables depuis le siège, mais le mécanisme (température non-seedée, temperature=0.2/0.3 bien présents dans la source aux cellules 8/10/12, sources inchangées base↔head) est cohérent : la base demandait déjà ces températures, la cause (c) est bien un refus upstream récent, pas un artefact de la PR.
  • Hygiène : metadata.papermill en chemins relatifs (input Lab14-Ablation-Refinement.ipynb, output c365_lab14_out4.ipynb) — 0 MACHINE_PATH, contrairement aux sœurs #23958/#23940. Chronologie crédible : run 21:45:10→21:46:00Z, PR ouverte 21:53:21Z. 0 erreur dans les outputs, 13/13 execution_count non nuls. Scan sécu du blob propre (0 TOKEN=, 0 sk-).
  • CI : 29 check-runs au head, tous success/neutral, dont PR gate, Live-read freshness, Split-reading ratchet, No markdown content loss, twin-parity. L'advisory ⚠️ « numeric value is not anchored » du bot est contredit par la vérification ci-dessus (advisory, non bloquant — signal générique de la famille, pas un défaut de ce carnet).

🟡 Mineurs (étiquetage du body, sans impact carnet) :

  1. Le tableau du body étiquette la 3ᵉ sortie divergente « code#10 rapport final » — c'est la cellule idx 25, l'exercice TODO « votre propre pipeline » (les exercices idx 27/29 sont restés déterministes : « Exercice a completer », inchangés base↔head — donc seul l'exercice 1 a été réellement exécuté avec LLM). L'étiquette « rapport final » est trompeuse ; le contenu divergent est réel.
  2. La divergence idx 25 est base 5 fragments stream → head 4 : fusion de fragments stdout (l'un des fragments base était vide \n), contenu textuel équivalent — pas une perte d'output.

Verdict : re-exécution authentique (papermill, chemins propres, chronologie cohérente), prose re-dérivée intégralement ancrée, périmètre strict (1 fichier). Les 2 🟡 sont cosmétiques sur le body uniquement. APPROVE.

— Hermes (myia-ai-01:hermes-agent)

@jsboige

jsboige commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 23848
head: 2e7afe2
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3ae2122fc5719047182748b508d518cf1dd5cd5cf71f093f7f741c8417f97840
diff-files: 1
diff-additions: 192
diff-deletions: 195
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 23848
organ-rc: 0
[/ADJOINT PREFLIGHT]

Crible de fond rejoue a la tete 2e7afe2, carnet extrait par API brute aux deux refs, cellule par cellule.

Les trois chiffres qui commandent le verdict du body ont ete remesures et non relus. Zero source de cellule de code modifiee, deux cellules markdown modifiees, trois sorties divergentes — la mesure donne exactement cela, cinq cellules touchees au total, les 18, 21 et 25 pour les sorties et les 19 et 22 pour le markdown. Aucune source de code ne bouge d un caractere, ce qui est la propriete qui distingue une re-execution d une reecriture.

Structure mesuree aux deux refs — 32 cellules, 13 cellules de code, aucun execution_count nul, zero sortie d erreur, de chaque cote. La sequence des identifiants de cellule est identique, donc rien n a ete deplace ni recree, et le compte de cellules de code est conserve.

Les sorties divergent vers le haut, pas vers le bas — 942 vers 1085, 866 vers 881, 712 vers 734 caracteres. Aucun effondrement de sortie, aucune banniere de degradation, et aucun motif d erreur volontaire dans le carnet. Le sens de la variation compte ici parce que c est lui qui separe une re-execution honnete d une execution degradee qui passe les gardes.

Le point a lire en priorite par le coordinateur est l arbitrage declare dans le body et je ne le requalifie pas — la re-execution a ete faite avec le modele de la run committe, au prix d un parametre de sampling refuse en amont, et ce compromis est ecrit plutot que tu. C est de l information pour sa lecture, pas une reserve que je pose.

Aucun rouge au fold latest-wins de la tete, 97 jambes et 96 noms, et la review Hermes est APPROVED a cette meme tete. Les sept commentaires sont des advisories de bots verts sur ce perimetre.

Verdict READY.

@jsboige
jsboige merged commit 09031e1 into main Nov 1, 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