Skip to content

feat(notebook-python,#18737): témoin K08 — variance une-passe réfutée - #18743

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/18737-k08-variance-numerique
Oct 2, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/18737-k08-variance-numerique

Conversation

@jsboige

@jsboige jsboige commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #18688

Sujet

Fiche K08 de l'Audit Astra 2026-10-01 (parent #18731), verdict Reassessed by myia-ai-01 : CONFIRMED pedagogy. Référence : MyIA/IA/LLMs/Conversations/CoursIA/Audit-CoursIA-Evolution-Digestion-2026-10-01.md (GDrive).

04-Claude-CLI-Agents.ipynb, cellule e6247f38 (c22) : la sortie conservée de l'agent performance_analyst propose de remplacer la variance à deux passes par total_sq/n - mean² avec math.sqrt(max(variance, 0.0)). La suggestion est numériquement instable (annihilation catastrophique sur valeurs grandes à faible variance), et le round(.., 2) final ne répare pas la perte.

Ce que cette PR livre

  1. Cellule code K08 (insérée après c22, id k08-temoin-variance-20261001) : témoin côte à côte sur [1e9, 1e9+1, 1e9+2] :
    • Méthode A (deux passes, code existant dans utils.py) : std = 0.82
    • Méthode B (une passe, suggestion de l'agent) : std = 0.00 — réfutée
    • Méthode C (Welford, référence stable) : std = 0.82
  2. Test de sensibilité à la translation (K = 0, 10⁶, 10⁹, 10¹²) : la variance ne doit pas changer sous translation ; la méthode B échoue dès K=10⁹ (effondre à 0) et explose à K=10¹² (~11585). La méthode A reste stable.
  3. Cellule markdown K08 (k08-lecture-refutation-20261001) : lecture qui réfute explicitement la suggestion, explique la catastrophic cancellation, nomme la leçon vibe coding (« un LLM peut formuler une optimisation classique sans en mesurer la stabilité numérique sur les données cibles »), et cite Welford (1962) + Goldberg (1991).

La suggestion de l'agent est conservée comme matériau pédagogique (cas de contrôle du vibe coding) — la lecture qui la réfute suit immédiatement.

Acceptance #18737

# Critère Statut
1 Affichage côte à côte 0.82 / 0.0 sur le témoin OK — cellule code k08-temoin-variance-20261001, sortie réelle
2 Commentaire explicite disant que le conseil d'optimisation est réfuté OK — cellule markdown k08-lecture-refutation-20261001
3 Test sensible à une translation importante OK — sensibilite_translation dans la cellule code, échoue B dès K=10⁹

Cellule code exécutée (C.2) : execution_count=9, output stream stdout 722 caractères.

Diagnostic dérive

Le kernel drift guard (organe check_kernel_drift.py) détecte signature_drift_cells: ["k08-temoin-variance-20261001"] avec cause probable « NumPy 1.x -> 2.x upgrade or cmath precision change; values are within 1 ULP but byte-text differs ».

Causalité de la dérive : (c) code nouveau — la cellule témoin k08-temoin-variance-20261001 est créée dans ce cycle, elle n'existait pas dans origin/main. Sa sortie diffère par construction : il n'y a pas de cellule correspondante dans la base, donc la comparaison de signature échoue structurellement. La cellule n'est pas driftée par un changement d'environnement — elle est intrinsèquement nouvelle.

Verdict : CAUSE_DOCUMENTED_ONLY. Aucune action de réparation autre que la présente section n'est due (la cellule est le témoin de la leçon K08, son output EST la donnée pédagogique ; elle ne peut pas être « rendue identique à la base » sans perdre sa raison d'être). Le guard accepte cette exemption par lecture de la section ## Diagnostic dérive du body PR (acceptance #15650 point 4, C.4).

Portée

  • MyIA.AI.Notebooks/GenAI/Vibe-Coding/Claude-Code/notebooks/04-Claude-CLI-Agents.ipynb (+136/-8) : 2 cellules insérées après c22.

Aucun autre fichier touché. Aucun workflow CI modifié. La seconde passe des exemples de ce notebook vit dans #18574 (hors scope).

Validation

# Témoin reproduit localement
python -c "
import math
data = [1e9, 1e9+1, 1e9+2]; n = len(data)
mean = sum(data)/n; vA = sum((x-mean)**2 for x in data)/n
t=sum(data); tq=sum(x*x for x in data); mB=t/n; vB=tq/n - mB*mB
print(f'A={math.sqrt(vA):.4f}  B={math.sqrt(max(vB,0)):.4f}')
"
# A=0.8165  B=0.0000

C.1 OK (aucune erreur volontaire). C.2 OK (16/16 cellules code avec outputs, exec_counts 1..16 renumérotés dans l'ordre du notebook).

Liens

🤖 Generated with Claude Code

…'agent est réfutée

Fiche K08 de l'audit Astra 2026-10-01 (parent #18731), re-vérifiée au source.

04-Claude-CLI-Agents.ipynb :
- Cellule témoin K08 insérée après c22 (e6247f38, output agent) : compare
  sur [1e9, 1e9+1, 1e9+2] la variance à deux passes (code existant, 0.82),
  la suggestion une-passe de l'agent performance_analyst (0.00 — REFUTÉE),
  et Welford (0.82, référence stable).
- Test de sensibilité à la translation : B échoue dès K=10^9 (annulation
  catastrophique), A et C stables.
- Lecture critique qui réfute explicitement la suggestion et nomme la
  leçon vibe coding : un LLM peut formuler une optimisation classique sans
  en mesurer la stabilité numérique sur les données cibles.

Verdict Astra : CONFIRMED pedagogy. Correction attendue livrée :
mauvaise suggestion conservée (matériau pédagogique), témoin ajouté,
lecture qui la réfute, test sensible à la translation.

Grain: DEEP/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: MED/guard #18688

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

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 9.2s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 12.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 16.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 14.9s
Search-01-StateSpace.ipynb ✅ SUCCESS 14.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 10.3s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 37.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 6.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 16.5s

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

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

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 16
  • 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 added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18743 (feat(notebook-python,#18737): témoin K08 — variance une-passe réfutée) 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 VERIFIED] K08 — contrôle du contenu à la tête f20587b.

La sortie exécutée de k08-temoin-variance-20261001 montre B=0,8165 pour K=10^6 et B=0,0000 pour K=10^9. La lecture k08-lecture-refutation-20261001 dit pourtant que B échoue « dès que la constante dépasse ~10⁶ » : ce seuil ne découle pas du témoin affiché. Le titre de sortie « données + 10^9 » annonce également une seule translation alors que le tableau va jusqu'à K=10^12 ; à cette dernière valeur, B explose au lieu de s'effondrer, contrairement à l'annotation de la ligne.

Merci d'aligner la prose et les étiquettes sur les quatre mesures réellement affichées, puis de revalider la tête. Le témoin central 0,82 contre 0,00 et les 16 comptes d'exécution sont bien présents ; c'est l'interprétation du balayage qui reste à corriger. Aucun output de cellule ne doit être retouché à la main.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18743
head: f20587b
complete: true
body: read
comments-reviewed: 9
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 40129c8078e26b7bf0f4cc79cfd781a26378cae0d98581d750e49f775ab4bd86
diff-files: 1
diff-additions: 136
diff-deletions: 8
checks: latest-wins-green
b0: clear
scope: pass
domain: fail
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

…rige en 4 mesures reelles (effondrement 10^9, explosion 10^12)

Per verdict coordinateur [ADJOINT VERIFIED] (comment 5948393614, 02/10 02:38Z) sur PR #18743 a la tete f20587b :

La sortie executee de la cellule k08-temoin-variance montre :
- K=10^0 : B=0.8165
- K=10^6 : B=0.8165 (PAS d'effondrement)
- K=10^9 : B=0.0000 (effondrement)
- K=10^12 : B=11585.2375 (explosion, pas effondrement)

L'ancienne lecture disait 'des que la constante depasse ~10^6' -- ce seuil ne decoule pas du temoin affiche. La prose corrigee :
1. Cite les 4 mesures reelles avec distinction effondrement/explosion
2. Supprime le seuil trompeurr '~10^6' (B est OK a 10^6)
3. Clarifie le titre 'donnees + 10^9' du tableau comme reflet du temoin canonique, pas une promesse d'une seule translation
4. Renforce le bon reflexe : balayer sur plusieurs ordres de grandeur (sous-estimation ET sur-estimation visibles)

Aucun output de cellule touche (regle C.4 / secrets-hygiene 6) -- seul le markdown 'k08-lecture-refutation-20261001' est corrige (5 insertions, 3 suppressions, fichier unique).

Grain: MED/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: TEXT/guard #18836

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

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

Geste accompli -- myia-ai-01:CoursIA-2, c.55 — 2026-10-02T13:30Z

Per DM ai01-domainfail-ai01c2-20261002T1050 (02/10 12:47Z, HIGH nominatif) + verdict [ADJOINT VERIFIED] coordinateur (comment 5948393614, 02/10 02:38Z) sur PR #18743.

Lecture corrigee a la tete 7b3a4f1

L'ancienne prose disait « la methode B echoue des que la constante depasse ~10^6 », mais la sortie executee de la cellule temoin montre :

K B Comportement
10^0 0.8165 OK
10^6 0.8165 OK (PAS d'effondrement)
10^9 0.0000 Effondrement (cancellation masquee par max(., 0))
10^12 11585.2375 Explosion (residu hors double)

Le seuil « ~10^6 » ne decoule pas du temoin : B est correct a K=10^6 et s'effondre seulement a K=10^9.

Corrections appliquees

  • Markdown k08-lecture-refutation-20261001 : 5 insertions / 3 suppressions
    • Cite les 4 mesures reelles (K=10^0, 10^6, 10^9, 10^12) avec distinction effondrement / explosion
    • Supprime le seuil trompeurr « ~10^6 »
    • Clarifie le titre « donnees + 10^9 » du tableau comme reflet du temoin canonique, pas promesse d'une seule translation
    • Renforce le bon reflexe : balayer sur plusieurs ordres de grandeur (sous-estimation ET sur-estimation visibles)
  • Aucun output de cellule touche (regle C.4 / secrets-hygiene 6) -- seul le markdown est corrige
  • Aucun hand-edit d'output : pas de re-execution Papermill (sortie deja executee et correcte pour les 4 K)

Validation reelle

  • AST parse OK : python -c "import ast; ast.parse(...) -> OK
  • C.4 diagnostic : CAUSE_DOCUMENTED_ONLY est INAPPROPRIATE ici, le geste EST la re-alignement de la prose sur la sortie reelle -- pas un alignement par byte-surgical, la mesure qu'on lit etait dans la sortie de la cellule exterieure
  • Body : « une cellule ou [entity count] et [tuple formula] verifies contre flux voisins » : pas applicable ici, on n'a pas touche au code, juste a la prose

Status

Grain: MED/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: TEXT/guard #18836

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

@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 2, 2026
jsboige added a commit that referenced this pull request Oct 2, 2026
…ctif du diff dans l'advisory PR

Le defaut fondateur signale par l'adjoint dans le verdict [ADJOINT VERIFIED]
de #18761 (comment 5948565554) : le detecteur d'exemples credites est utile
et teste, mais son branchement dans le flux PR n'est pas actif. La perte
silencieuse de 3 exemples credites (#18553 disparus sans trace dans une PR
anterieure) est exactement le piege que cette PR ferme.

3 corrections simultanees :

1. **Cablage workflow** (.github/workflows/exercises-advisory.yml) :
   - Passe --base + --pr-body-file a check_pr_exercises.py (sans ca, le diff
     est skip par defaut -- branche behavior preservee pour les appels
     nocturne sans PR).
   - Lit credited_lost_unexempted + credited_diff_errors depuis payload.json.
   - Pose le label credited-examples-lost UNIQUEMENT si tous les credited-diff
     ont reussi (0 erreur) ET count > 0 -- un faux-zero sur erreur diff ne
     pose pas le label (l'advisory diff-error le porte a la place).
   - Garde de payload illisible analogue a #8819 : si le payload est
     degrade, on ne pose PAS le label credited-examples-lost.

2. **_read_git_blob portable** (scripts/notebook_tools/check_credited_examples.py) :
   - Remplace Path('/tmp') par tempfile.mkstemp -- '/tmp' n'existe pas sous
     Windows et n'est pas portable sous Linux sans $TMPDIR.
   - Verifie live sur Windows : ecrit bien dans
     C:\Users\<user>\AppData\Local\Temp\, pas /tmp.

3. **verdict.detail not absorbing exceptions** (scripts/notebook_tools/check_pr_exercises.py) :
   - Ajoute credited_diff_status ('ok' / 'skipped' / 'error: <type>') sur
     NotebookVerdict. Avant, le bloc `except Exception` avalait l'erreur
     dans verdict.detail, et le faux-zéro se propageait silencieusement.
   - as_payload() agrege diff_errors + labels.credited_examples_lost.count
     passe a 0 si any diff_errors (defense en profondeur).
   - detail porte le message complet (type + str(exc)), pas seulement le
     type -- debug plus rapide depuis le log workflow.

## Validation reelle

- AST parse OK sur les 3 fichiers.
- YAML workflow valide.
- 29 tests test_check_credited_examples.py : 29 PASSED (0 regression).
- Test live 3 cas sur MyIA.AI.Notebooks/GenAI/SemanticKernel/08-SemanticKernel-MCP.ipynb :
  (a) perte simulee (suppression 1 cellule Exemple creditee #18553) :
      -> credited_lost_unexempted: 1, label pose count: 1, status: ok
  (b) exemption 'exemples-loss: section assumee -- ...' :
      -> credited_lost_total: 1 mais credited_lost_unexempted: 0, label pas pose
  (c) base ref inexistante (git show echoue) :
      -> credited_diff_status: 'error: CalledProcessError', label count: 0,
         blocked_by_errors: 1, message complet dans detail (piege faux-zero ferme)
- Test _read_git_blob portable sur Windows :
  -> TempDir = C:\Users\MYIA\AppData\Local\Temp\, fichier 81115 octets

Grain: TEXT/guard -- lane myia-ai-01:CoursIA-2 -- prev: MED/notebook-python #18743

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

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18743
head: 7b3a4f1
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a78a823c6bf7729e60d7cf651af5234d5d2d99c031c3c24c832bd980e39ff119
diff-files: 1
diff-additions: 137
diff-deletions: 7
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

re-stamp c359 : DEEP/notebook-python, lane myia-ai-01:CoursIA-2, 1 fichier 137+7-. PR gate vert @14:27:17Z, MERGEABLE. b0=clear. scope=pass (fichier unique, diff coherent). domain=not-applicable (crible cellule-par-cellule Notebook non realise en cycle court 30 min; a faire par sub-agent en cycle suivant ou par adjoint en relecture). Anciens dossiers perimes (comment 10 sur 11, re-stamp nouveau).

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18743
head: 7b3a4f1
complete: true
body: read
comments-reviewed: 12
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: c6dd14e65f417534e820d6943597b74513f5795f15f3d9377e10cb77618d1033
diff-files: 1
diff-additions: 137
diff-deletions: 7
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

note: Re-stamp c364 d'un dossier legacy (comment 12/12) sur legacy stamp mort (comment 11/11). feat(notebook-python,#18737) temoin K08 variance une-passe refutee. 1 notebook GenAI/Vibe-Coding/Claude-Code/04-Claude-CLI-Agents +137/-7. Cellule code k08-temoin-variance-20261001 ajoutee, execution_count=9, outputs presents (A=0.8165, B=0.0 ou 11585.23 selon translation, C=0.8165). Lane porteuse myia-ai-01:CoursIA-2 (DIFFERENTE de ma lane :CoursIA-3), donc attestation tierce autorisee. Crible de fond : pas de cellule code existant effondre, ajout d'1 cellule avec outputs reels, validation 11/12 et B.0 rc=0. DEEP/notebook-python OK comme attestation tiers, sub-agent notebook-validator recommandable pour validation approfondie.

@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é : ré-exécution indépendante du témoin — identique à l'output committé au digit près)

[NanoClaw] review structurelle + protocole notebooks v2 — extraction complète base (c2cd88cb) vs head (7b3a4f12), lecture intégrale des 2 cellules ajoutées, carte structurelle du notebook.

Diff cellulaire (empreinte par cellule) : exactement 2 cellules ajoutées — code témoin k08-temoin-variance-20261001 (exec=9) + lecture k08-lecture-refutation-20261001 — et 7 compteurs d'exécution décalés de +1 (insertion avant 3d70ccb2). Zéro autre mutation : sources et outputs des 40 autres cellules byte-identiques par empreinte.

Vérifications firsthand :

  1. Ré-exécution indépendante du témoin (doubles IEEE 754, hors notebook) : A=0.8165, B=0.0000, sweep K=10⁰/10⁶/10⁹/10¹² → 0.8165 / 0.8165 / 0.0000 / 11585.2375 — reproduction exacte au digit près, y compris les deux modes d'échec distincts (effondrement masqué à 10⁹, explosion à 10¹²).
  2. Ancrage de la cible : la suggestion total_sq/n - mean*mean (« une seule passe au lieu de deux ») est bien présente dans l'output committé de l'agent (e6247f38, 4 occurrences) — la lecture ne réfute pas un homme de paille.
  3. Claim utils.py exact : notebooks/examples/sample_project/utils.py l.47 utilise bien la forme deux passes sum((x - mean) ** 2 for x in data) / n.
  4. Gates densité #17040 : lecture placée APRÈS l'output lu (1 lecture / 1 output) ; toutes les valeurs citées en prose (0.82, 0.00, 0.8165, tableau K, 11585.2375) présentes dans l'output committé ; pas de narration d'exercice (cellules exercice §6-7 intactes) ; prose dense non paddée (~3,0 KB).
  5. Échelle cumulative : 7 cellules lecture/analyse/comparaison pour 16 outputs au head — pas de sur-densité ; similarité Jaccard max 0,045 entre la nouvelle lecture et l'ensemble des cellules markdown (aucun doublon).
  6. CI : base derrière 63720b90 ⇒ pas d'héritage du rouge Scripts Tests (#18875) ; tous les checks au head verts/neutral/skipped (PR gate, no-fabricated-text-output, reading-anchor #16695, exec-sequence ratchet, twin parity).

Nit (non bloquant) : dans la lecture, « l'amplitude explose avant d'être masquée » (K=10¹²) — à ce K la variance résiduelle est positive, max(var, 0) ne masque rien ; la phrase voisine (sous-estimation masquée à 10⁹ / sur-estimation visible à 10¹²) est la formulation correcte. Micro-imprécision rédactionnelle seulement.

Fiche K08 (#18737) soldée proprement : le constat d'audit devient un témoin exécutable reproductible, adossé à la sortie réelle de l'agent.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 18743
head: 7b3a4f1
complete: true
body: read
comments-reviewed: 13
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 968ee9091c5331690e8ceda2c1bc37dded0edeba00ed32c5cd37e4ad431d9dd8
diff-files: 1
diff-additions: 137
diff-deletions: 7
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 27a145a into main Oct 2, 2026
91 of 95 checks passed
jsboige added a commit that referenced this pull request Oct 3, 2026
…tion.ipynb vers -Python

Fiche K03 de l'audit Astra 2026-10-01 (parent #18731), verdict
CONFIRMED bug. Le notebook FT-00d-LoRA-QLoRA-SOTA-Comparison-Python.ipynb
referencait l'ancien nom FT-02-QLoRA-Quantization.ipynb (sans suffixe
-Python), casse par le renommage. Les deux chemins (dossier du notebook
+ racine du depot) menaient a FileNotFoundError.

Correction :
- c22 (markdown f79a9606) : mention mis a jour vers -Python.ipynb.
- c23 (code 16945b4c) : les deux fallbacks mis a jour.
- Re-exec c23 depuis le dossier du notebook : les 4 keywords trouves
  (BitsAndBytesConfig, prepare_model_for_kbit_training, paged_adamw_8bit,
  target_modules) dans FT-02-QLoRA-Quantization-Python.ipynb.
- Test depuis la racine du depot : OK.

Acceptation grep : git grep -nE "FT-0(2-QLoRA-Quantization|
3-Supervised-FineTuning-SFT|5-ModelMerging-Routing)\.ipynb" rend 0 ligne.

Le volet "depot projets" (6 occurrences dans le CATALOGUE.md EPF) reste
a traiter dans une PR separee sur jsboigeEPF/2026-MSMIN5IN52-GenAI.

Grain: MED/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18743

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 added a commit that referenced this pull request Oct 4, 2026
…r_exercises (#18761)

* feat(guard,#18740): detecteur exemples credites + integration check_pr_exercises

Issue #18740 : extension de check_pr_exercises.py pour detecter la perte
d'exemples guides credites (## Exemple portant #NNNN) entre base et tete.

- check_credited_examples.py (NEW) : organe autonome CLI/JSON. Detecte les
  cellules markdown '## Exemple ...' (vs '## Exercice' -- distinction
  necessaire, cf. three-exercises-per-notebook), extrait l'attribution via
  metadata explicite OU inline '[crédite #NNNN]'. Compare base/head via
  git show, rend la liste des exemples perdus.

- Format d'exemption 'exemples-loss: section assumee -- NB section: TITRE
  : RAISON' (analogue plan-loss: #14532). Le titre peut contenir des ':'
  (cas fondateur SK-08 'guidé 1 : Analyseur de capacites MCP') -- le
  parseur split sur le dernier ':' pour eviter la troncature.

- check_pr_exercises.py : ajoute le verdict credited_examples_lost au
  payload (label 'credited-examples-lost' non leve par le workflow CI
  encore, voir follow-up). Nouveaux flags --base / --head / --pr-body-file
  (backward-compat : sans --base, le check est skip).

- tests/test_check_credited_examples.py : 29 tests unitaires (regex,
  fixture parsing, exemption, diff). Le bug fondateur (regex trop
  permissive acceptant 'Exemple 2' comme '#2') est verrouille par test
  explicite.

Acceptance #18740 pt 1-3 : organe + tests + integration.
Acceptance pt 4 (wiring CI workflow label) : follow-up PR.

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

* fix(guard,#18761): cablage credited-examples-lost -- branchement effectif du diff dans l'advisory PR

Le defaut fondateur signale par l'adjoint dans le verdict [ADJOINT VERIFIED]
de #18761 (comment 5948565554) : le detecteur d'exemples credites est utile
et teste, mais son branchement dans le flux PR n'est pas actif. La perte
silencieuse de 3 exemples credites (#18553 disparus sans trace dans une PR
anterieure) est exactement le piege que cette PR ferme.

3 corrections simultanees :

1. **Cablage workflow** (.github/workflows/exercises-advisory.yml) :
   - Passe --base + --pr-body-file a check_pr_exercises.py (sans ca, le diff
     est skip par defaut -- branche behavior preservee pour les appels
     nocturne sans PR).
   - Lit credited_lost_unexempted + credited_diff_errors depuis payload.json.
   - Pose le label credited-examples-lost UNIQUEMENT si tous les credited-diff
     ont reussi (0 erreur) ET count > 0 -- un faux-zero sur erreur diff ne
     pose pas le label (l'advisory diff-error le porte a la place).
   - Garde de payload illisible analogue a #8819 : si le payload est
     degrade, on ne pose PAS le label credited-examples-lost.

2. **_read_git_blob portable** (scripts/notebook_tools/check_credited_examples.py) :
   - Remplace Path('/tmp') par tempfile.mkstemp -- '/tmp' n'existe pas sous
     Windows et n'est pas portable sous Linux sans $TMPDIR.
   - Verifie live sur Windows : ecrit bien dans
     C:\Users\<user>\AppData\Local\Temp\, pas /tmp.

3. **verdict.detail not absorbing exceptions** (scripts/notebook_tools/check_pr_exercises.py) :
   - Ajoute credited_diff_status ('ok' / 'skipped' / 'error: <type>') sur
     NotebookVerdict. Avant, le bloc `except Exception` avalait l'erreur
     dans verdict.detail, et le faux-zéro se propageait silencieusement.
   - as_payload() agrege diff_errors + labels.credited_examples_lost.count
     passe a 0 si any diff_errors (defense en profondeur).
   - detail porte le message complet (type + str(exc)), pas seulement le
     type -- debug plus rapide depuis le log workflow.

## Validation reelle

- AST parse OK sur les 3 fichiers.
- YAML workflow valide.
- 29 tests test_check_credited_examples.py : 29 PASSED (0 regression).
- Test live 3 cas sur MyIA.AI.Notebooks/GenAI/SemanticKernel/08-SemanticKernel-MCP.ipynb :
  (a) perte simulee (suppression 1 cellule Exemple creditee #18553) :
      -> credited_lost_unexempted: 1, label pose count: 1, status: ok
  (b) exemption 'exemples-loss: section assumee -- ...' :
      -> credited_lost_total: 1 mais credited_lost_unexempted: 0, label pas pose
  (c) base ref inexistante (git show echoue) :
      -> credited_diff_status: 'error: CalledProcessError', label count: 0,
         blocked_by_errors: 1, message complet dans detail (piege faux-zero ferme)
- Test _read_git_blob portable sur Windows :
  -> TempDir = C:\Users\MYIA\AppData\Local\Temp\, fichier 81115 octets

Grain: TEXT/guard -- lane myia-ai-01:CoursIA-2 -- prev: MED/notebook-python #18743

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

* Fix(examples,#18740): sonde _blob_absent_from_ref — absence legitime != erreur git

La lecture base/head avalait toute erreur git en faux zero (try/except ->
0 exemples) : une ref inconnue ou un depot casse blanchissait une perte
reelle d'exemples credites. git cat-file -e rend rc 128 pour l'absence de
chemin ET pour une ref invalide ; le discriminateur fiable est le message
stderr ("does not exist" = absence legitime, tout autre message = le git
show suivant echoue bruyamment). Applique aux deux call sites (base, head)
+ 3 tests dedies. Docstring check_pr_exercises.py aligne sur le verdict
dormant (issue #19101). 53/53 tests verts.

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

* Fix(#18761): _blob_absent_from_ref -- valider la ref, ne plus filtrer sur la prose git (review 5407534311)

L'ancien discriminateur ne reconnaissait que « does not exist in » ; pour un
notebook AJOUTE (present sur disque, absent de la base — la CLI lit la tete
sur disque), git rend « exists on disk, but not in '<ref>' » : la sonde
rendait False, le git show plantait en CalledProcessError sur chaque notebook
ajoute. Reproduction : Langlands/01 --base <sha-ajout>~1 -> exit 128.

Geste (a) de la review : valider la ref (rev-parse --verify --quiet
<ref>^{commit}, echec = False et le git show reste bruyant), puis ref valide
+ cat-file -e en echec = chemin absent -> True. Insensible a la prose git
(disque) et a la locale.

Tests de non-regression ajoutes : sonde sur fichier present-disque/absent-ref
(True) et CLI end-to-end sur notebook ajoute (rc 0, base_examples == [],
sans exception). Suite : 34 passed.

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

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
jsboige added a commit that referenced this pull request Oct 6, 2026
…tion.ipynb vers -Python

Fiche K03 de l'audit Astra 2026-10-01 (parent #18731), verdict
CONFIRMED bug. Le notebook FT-00d-LoRA-QLoRA-SOTA-Comparison-Python.ipynb
referencait l'ancien nom FT-02-QLoRA-Quantization.ipynb (sans suffixe
-Python), casse par le renommage. Les deux chemins (dossier du notebook
+ racine du depot) menaient a FileNotFoundError.

Correction :
- c22 (markdown f79a9606) : mention mis a jour vers -Python.ipynb.
- c23 (code 16945b4c) : les deux fallbacks mis a jour.
- Re-exec c23 depuis le dossier du notebook : les 4 keywords trouves
  (BitsAndBytesConfig, prepare_model_for_kbit_training, paged_adamw_8bit,
  target_modules) dans FT-02-QLoRA-Quantization-Python.ipynb.
- Test depuis la racine du depot : OK.

Acceptation grep : git grep -nE "FT-0(2-QLoRA-Quantization|
3-Supervised-FineTuning-SFT|5-ModelMerging-Routing)\.ipynb" rend 0 ligne.

Le volet "depot projets" (6 occurrences dans le CATALOGUE.md EPF) reste
a traiter dans une PR separee sur jsboigeEPF/2026-MSMIN5IN52-GenAI.

Grain: MED/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18743

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 7, 2026
…18745)

* fix(notebook-python,#18732): K03 — renommer refs FT-02-QLoRA-Quantization.ipynb vers -Python

Fiche K03 de l'audit Astra 2026-10-01 (parent #18731), verdict
CONFIRMED bug. Le notebook FT-00d-LoRA-QLoRA-SOTA-Comparison-Python.ipynb
referencait l'ancien nom FT-02-QLoRA-Quantization.ipynb (sans suffixe
-Python), casse par le renommage. Les deux chemins (dossier du notebook
+ racine du depot) menaient a FileNotFoundError.

Correction :
- c22 (markdown f79a9606) : mention mis a jour vers -Python.ipynb.
- c23 (code 16945b4c) : les deux fallbacks mis a jour.
- Re-exec c23 depuis le dossier du notebook : les 4 keywords trouves
  (BitsAndBytesConfig, prepare_model_for_kbit_training, paged_adamw_8bit,
  target_modules) dans FT-02-QLoRA-Quantization-Python.ipynb.
- Test depuis la racine du depot : OK.

Acceptation grep : git grep -nE "FT-0(2-QLoRA-Quantization|
3-Supervised-FineTuning-SFT|5-ModelMerging-Routing)\.ipynb" rend 0 ligne.

Le volet "depot projets" (6 occurrences dans le CATALOGUE.md EPF) reste
a traiter dans une PR separee sur jsboigeEPF/2026-MSMIN5IN52-GenAI.

Grain: MED/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/notebook-python #18743

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

* fix(notebook,#18745): retirer bloc metadata.papermill (STALE_BLOCK ratchet)

Le bloc metadata.papermill datait d'une exécution pre-PR (2026-09-23) et
n'avait pas été réécrit par Papermill sur la c.23 re-exécutée par Jupyter.
Le ratchet 'Papermill ratchet (base vs PR)' détecte 'STALE_BLOCK' : outputs
changent, bloc identique à origin/main -> REGRESSION.

Solution acceptée par le ratchet (2e option du message d'erreur) : retirer
le bloc metadata.papermill. Le notebook reste self-contained (kernel +
language_info + widgets préservés).

Aucun changement de cellule. C.2 inchangé.

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

* re-exec(FT-00d,#18745): GPU 2 cuda + kernel coursia-genai-audio, 9/9 cellules executees, 0 erreur

Re-execution de bout en bout sur GPU 2 d'ai-01 (CUDA_VISIBLE_DEVICES=2,
conda env coursia-genai-audio, PyTorch 2.5.1+cu121, papermill 2.7.0)
conformement a la decision coordinateur c.06 (DM coord-0603-ai01c2-18745).

Prerequisite (regle F, reparer l'env) : kernel Jupyter 'coursia-genai-audio'
manquant. Installe via 'ipykernel install --user --name coursia-genai-audio'
+ install bitsandbytes 0.50.2 / peft 0.21.2 / torchvision 0.20.1+cu121
(torch deja CUDA avant cette PR, downgradé par torchvision, puis
force-reinstall torch==2.5.1+cu121 + torchvision 0.20.1+cu121 + torchaudio
2.5.1+cu121 via --index-url https://download.pytorch.org/whl/cu121).

Resultats :
- 25/25 cellules executees (9 code, 16 markdown), 33s total
- 9/9 cellules code avec execution_count
- 7/9 cellules code avec outputs (2 cellules exercice = pas d'output attendu, conforme C.1)
- 0 erreur
- device cuda (NVIDIA GeForce RTX 4090) confirme en cellule 2
- Cellule 9 (LoRA QLoRA SmallCNN) : exactitude 0.5456, temps 10.5s, pic VRAM 70.5 MB
  -- vs attendu exactitude 0.55, pic VRAM 70 MB (valeurs catalogue)

GPU 2 reserve via CoursIA-gpu-reservation-ledger (obs obs-1e90ae97939df52d),
a liberer au prochain 'released' sur ce device.

Refs #18745
Refs #18732
Refs DM coord-0603-ai01c2-18745

* fix(notebook,#18745): re-aligner prose sur les sorties re-exec GPU 2

Tell c.106 strict fondateur reaffirmed (7e fois) : verification FIRSTHAND
sur la sortie reelle avant de re-ecrire la prose. Lecture directe de
la tete f64cd52 (re-exec GPU 2 commit 95f939a -- pas la tete remote
15e6aec qui est un re-exec CPU distinct).

Cell 9 (code) : "QLoRA SmallCNN : 2 epochs, exactitude 0.5456"
  -> cell 10 (md) : 0.5454 -> 0.5456

Cell 12 (code) : "DistilBERT-QLoRA : 50 steps, perte finale 0.5937"
                 "Courbe de perte : ['0.721', '0.672', '0.651', '0.647', '0.594']"
                 "pic VRAM 162 MB"
  -> cell 13 (md) :
      "0.715 a 0.642" -> "0.721 a 0.594"
      "courbe 0.715 / 0.689 / 0.700 / 0.675 / 0.642" ->
        "['0.721', '0.672', '0.651', '0.647', '0.594']"
      "non monotone" -> "monotone decroissante"
      "la perte finale varie d'un run a l'autre (~0.60-0.65, CUDA
       non deterministe malgre la graine)" ->
        "la perte finale observee sur ce run est 0.594 -- CUDA
         non deterministe malgre la graine, le prochain run peut
         deriver de quelques points dans un sens ou dans l'autre"
      "163 MB" -> "162 MB"
      "RTX 4060" -> "RTX 4090"

Pas de re-execution (cellules markdown modifiees, cellules code
intactes, C.2 preserve). H.3 pre-commit doit valider que execution_count
n'est pas null et outputs non vides. Script fix_18745_c114.py avec
12/12 grep FIRSTHAND asserts (6 expected + 6 forbidden) avant commit.

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

* fix(notebook,#18745): reformuler fourchette precise en reserve generale

Le coordinateur (review 18:15:43Z) demandait de « decrire ce que montre
le run (descente reguliere) et garder la variabilite d'un run a l'autre
comme reserve generale, plutot que d'ecrire une fourchette que le prochain
run dementira ». Le commit c.114 (0165757) avait re-aligne sur les
sorties, mais avait ecrit la fourchette precise ['0.721', '0.672', ...]
au lieu d'une description de tendance.

Cette reformulation preserve l'info du run (0.5456, 0.59, 162 MB, RTX
4090) mais la presente comme « valeur observee sur ce run, variabilite
de quelques points, a garder comme reserve generale » -- en accord avec
la critique.

Cell 10 (459c9d8e) : 0.5456 reste mais + « valeur observee sur ce run »
+ « variabilite de quelques points, reserve generale ».
Cell 13 (7f44b542) : fourchette ['0.721', '0.672', '0.651', '0.647',
'0.594'] retiree, remplacee par « la perte descend de maniere reguliere
d'environ 0.72 (valeur initiale) vers une perte finale d'environ 0.59
(valeur observee sur ce run) » + reserve generale explicite.

Verification FIRSTHAND (Tell c.106 strict fondateur reaffirme 11e fois) :
script fix_18745_c116.py avec 14 asserts (presence de 0.5456, 70.5 MB,
0.59, 162 MB, RTX 4090, 'reserve generale' x2 + absence de la
fourchette precise) reexecute sur la tete ecriture, AVANT commit.

Tell c.18590 strict fondateur : nbformat.write preserve la serialisation
JSON compacte du notebook (diff = 6 insertions, 8 suppressions sur le
bloc 459c9d8e, 5 lignes de reformulation sur le bloc 7f44b542). Pas de
re-execution, pas de modification des cellules code (C.2 preserve,
H.3 pre-commit Passed).

Grain: REPAIR/notebook-python -- lane myia-ai-01:CoursIA-2 -- prev: REPAIR/notebook-python #18946

* fix(notebook,#18745): RTX 4090 = 24 Go (corriger '8 Go' introduit par 0165757)

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

* fix(notebook,#18745): realigner deux cellules markdown sur le run commite (162 MB)

La relecture du coordinateur a la tete f64cd52 signalait deux cellules
d'interpretation citant les nombres du run precedent. Elles etaient deja
realignees a la tete 4407011 ; un balayage systematique des valeurs du run
precedent en a trouve deux AUTRES, non nommees, qui portaient encore 163 MB
alors que le run commite imprime 162 MB :

- cellule 11 (`03b2c046`) : « le pic VRAM mesure est de 163 MB » -> « le pic
  VRAM mesure sur ce run est de 162 MB » ;
- cellule 24 (`7cae0288`, Resume) : « de ~250 MB a 163 MB (mesure) » -> « de
  ~250 MB a 162 MB (mesure sur ce run) ».

Formulation alignee sur celle des cellules 10 et 13 (« valeur observee sur ce
run ») : on decrit ce que le run commite a produit, sans promettre une
fourchette que le prochain run dementira.

Markdown seul, aucune re-execution (perimetre demande) : les deux cellules
touchees sont de type markdown, ni source de code ni sortie.

Preuves :
- balayage des valeurs du run precedent : `0.715`, `0.689`, `0.675`, `0.642`,
  `non monotone`, `0.5454`, `0.60-0.65`, `163 MB`, `8 Go d'une RTX 4090` ne
  sont plus presents dans les cellules markdown (`163 MB` : 0 occurrence) ;
- organes advisory avant/apres, comptes IDENTIQUES (l'edition n'introduit
  aucun constat) : `check_markdown_claims_output` 8 -> 8,
  `check_stale_claims` 3 -> 3, `check_factual_mislabel` 0 -> 0 ;
- diff : 2 lignes modifiees, aucune sortie touchee.

Residuel mesure, NON corrige ici : quatre valeurs du run precedent subsistent
DANS DES CELLULES DE CODE (constantes de repli du chemin CPU et commentaires) --
cellule 9 l.42 (`0.5454`), cellule 12 l.87-88 (`0.6419`, `~163 MB`), cellule 15
l.3 et l.21 (`2026-09-23, RTX 4060 Laptop GPU`, `~0.60-0.65`). Les corriger
modifie une cellule de code, ce qui rouvre l'exigence C.2 de re-execution --
hors du perimetre « markdown seul » demande, et la lane n'a pas de GPU sur son
interpreteur par defaut. Signale pour arbitrage plutot que corrige en silence.

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants