Skip to content

Fix(probas,#17222): PyMC-11 -- prose alignee sur les sorties, 15 findings d'audit de contenu - #21777

Merged
myia-ai-01 merged 5 commits into
mainfrom
fix/17222-pymc11-prose-sync
Oct 24, 2026
Merged

myia-ai-01 merged 5 commits into
mainfrom
fix/17222-pymc11-prose-sync

Conversation

@jsboige

@jsboige jsboige commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2027:CoursIA — prev: LIGHT/guard #21491

Résumé

Audit de contenu de PyMC-11-Topic-Models.ipynb (62 cellules : 18 code, 44 markdown) contre les sorties committées sur origin/main (9f5a98470867), puis réparation des findings confirmés. Changements markdown uniquement : les 18 cellules code sont byte-identiques (source, outputs, execution_count), donc aucune ré-exécution n'est due au titre de C.2.

Le contrôle structurel du carnet était déjà vert (execution_count 1-18 sans trou, 0 erreur, 0 cellule code sans sortie) : ce n'est pas un audit. Les findings ci-dessous viennent de la confrontation de la prose aux sorties réelles cellule par cellule.

Findings corrigés (15)

Prose contre sorties

Cellule Défaut Correction
table des mots dominants 0.411 / 0.239 / 0.248 / 0.358 / 0.258 alignée sur la sortie de code[8] : 0.412 / 0.240 / 0.249 / 0.359 / 0.259
contamination match « 0,169 » 0,168 (sortie code[8])
verdict K-sélection « décroît mécaniquement quand K grandit » décroît de K=2 à K=4 (0.472 → 0.442) puis remonte (0.525 ; 0.495) ; min 0.411-0.423
verdict K=4 « trois tops-colonnes correspondent aux thèmes de référence (… logiciel/l'ordinateur) » deux topics propres ; la colonne technologie est contaminée par recette (logiciel/ordinateur/recette)
barres empilées Doc 3 « mélange rouge + bleu (Science + Cuisine) — cohérent avec [0.40, 0.40, 0.20] » le ground truth est Science + Sport ; l'estimation [0.40, 0.24, 0.36] déplace une part de Sport vers Cuisine
précision des theta « typiquement ±0.10 sur chaque composante » écart ≤ 0.03 sur Doc 0-2 (purs), écart marqué sur Doc 3 (Sport 0.40 attendu, 0.24 estimé)

Cohérence interne et exactitude du code décrit

Cellule Défaut Correction
plan du notebook ignore la section 5bis et présente « 7. Extensions … exercice 3 » table alignée sur les sections réelles (1-5, 5bis, 6, 7 + exercice)
Lecture de code[0] bloc placé 4 cellules après la cellule setup, sans ligne vide après une puce cellule dédiée insérée immédiatement après code[0]
BoW paragraphe annonçant la matrice répété deux fois dans la même cellule doublon supprimé
barres empilées ### Lecture des barres empilées suivi d'un ### Lecture en double doublon supprimé
corpus contrôle « ksel_theta_gen » (symbole inexistant) ksel_thetas
formule UMass log((D(w_i, w_j) + 1) / D(w_i)) D(w_j), conforme au code (ksel_co[tw[i], tw[j]] + 1.0) / ksel_Dw[tw[j]])
corpus contrôle « 3 mots partagés (« application » est transversal) » recherche, performance, preparation (indices 16-18), conformes au code
sklearn « (code[16) », « la perplexité de calcul est gagnée sur la netteté » parenthèse fermée ; « le gain de calcul se paie sur la netteté »

Exercices

  • Exercice 1 : « Varyer » → « Varier » ; « le prior forcé … comptes élèves, ce qui empeche » → « force … élevés, ce qui empêche » ; libellé « Le pattern attendu est : » sans contenu supprimé.
  • Exercice 2 : libellé « Pattern attendu : » pendant supprimé.
  • Exercice 3 : contradiction levée entre « 12 mots » (intro), « 5-7 mots par sujet » et « au moins 4 mots-clés par sujet » → « 3 à 6 mots par sujet (12 à 24 au total) » et « au moins 3 mots-clés … sur les 3 à 6 du vocabulaire de ce sujet ».

Findings référés (non modifiés)

Vérifiés contre PyMC-10 (même série) : le bloc *** / Retour au sommaire avant ### References et l'ordre ## Conclusion puis ## 8. Resume sont des conventions de série, pas des défauts. Aucune modification.

Preuves de validation

  • validate_pr_notebooks.py origin/main <carnet> → 1/1 passed, 18 cellules code contrôlées.
  • scan_cell_ordering.py --check-interp-anchor → 1 clean, 0 finding.
  • check_activity_leak.py --diff origin/main...HEAD → [OK] aucun passage d'activite dense ajoute.
  • check_prose_quantitative_claims.py --diff origin/main...HEAD → [OK] aucun compteur quantitatif en prose.
  • nbformat.validate → valide (4.5), 63 cellules, identifiants uniques ; cellule insérée à l'index 3, juste après code[0].
  • Cellules code : 18/18 byte-identiques (source + outputs + execution_count), execution_count 1-18, 0 erreur.
  • Hooks pre-commit sur le carnet : tous passés, aucun fichier modifié.
  • Parité jumeaux : attestation 0026-2026-10-21-myia-po-2027-CoursIA.yaml (python_sha 250690f23202), C# non modifié.

See #17222

🤖 Generated with Claude Code

Content-loss declare

md-content-loss: reecriture assumee -- PyMC-11-Topic-Models.ipynb cell 6 : retrait du bloc « Lecture de code[0] : setup » incruste en fin de section « Inference » (emplacement faux, son « ci-dessus » ne designait pas la bonne cellule) ; le contenu reste porte par les commentaires de code[0] et sa sortie « PyMC version: 5.28.5 » (cf. commentaire [REPAIR] du 2026-10-21)

jsboige and others added 2 commits October 21, 2026 09:43
…ings d'audit de contenu

Audit de contenu des 62 cellules contre les sorties commitees sur origin/main.
Corrections markdown uniquement (18 cellules code byte-identiques, aucun re-exec
requis au titre de C.2) :

- plan du notebook aligne sur les sections reelles (5bis, section 7 vs exercice 3)
- bloc 'Lecture de code[0]' deplace juste apres la cellule setup qu'il decrit
- doublon de la matrice bag-of-words supprime, titres '### Lecture' en double retires
- valeurs alignees sur les sorties : 0.411/0.239/0.248/0.358/0.258 -> 0.412/0.240/
  0.249/0.359/0.259, match 0,169 -> 0,168, plage JS 0.411-0.423
- verdict K=4 corrige : deux topics propres, colonne technologie contaminee par
  recette (et non 'trois tops-colonnes correctes')
- Doc 3 : ground truth Science+Sport vs estimation Science+Cuisine (etait declare
  'coherent'), tolerance +/-0.10 remplacee par l'ecart mesure
- symboles inexistants corriges (ksel_theta_gen -> ksel_thetas), denominateur UMass
  D(w_i) -> D(w_j), 'application' -> recherche/performance/preparation
- contradictions d'exercice levees (Varyer, prior force/eleve, pattern attendu
  pendant, 5-7 mots vs 12 mots vs 4 mots-cles)

Refutes apres verification contre PyMC-10 (conventions de serie, non modifies) :
bloc 'Retour au sommaire' avant References, Conclusion precedant la section 8.

See #17222

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…la prose

Parite Python/C# re-attestee apres le commit de contenu (python_sha
b89f444). Le carnet C# n'est pas modifie ; la re-execution n'est pas
due (changement markdown seul, C.2).

See #17222

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@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

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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

@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] Review — correctif de prose exigé par la série (alignement #17222), exécuté proprement : 18/18 cellules code byte-identiques, corrections vérifiables dans les sorties committées. Une collision à arbitrer : le diff introduit une lecture après code[0], et l'organe Split-reading ratchet la rejette (bloquant) — c'est le seul point qui empêche le merge.

Verdict : COMMENT (concerns) — le fond est bon et vérifié ; la collision garde/PR doit être tranchée (exemption versionnée ou retrait de la cellule).

Vérifié de première main

  • Innocuité du code : totale et démontrée. J'ai comparé base↔head cellule à cellule : les 18 cellules code sont byte-identiques (source + outputs + execution_count 1-18, 0 erreur). Seul du markdown bouge (1 cellule ajoutée à l'index 3, 6 cellules corrigées). nbformat valide, 63 cellules, ids uniques.
  • Les 6 corrections de prose sont exactes contre les sorties committées. Chaque valeur citée est dans les outputs : coherences UMass 0,607 / 0,459 / 0,614 (K=2/3/4) ✓, perplexités 4,11 / 4,09 ✓, « 0,328 » sujet-ballon ✓, estimation Doc3 « 0,40, 0,24, 0,36 » ✓, 5.28.5 ✓, 16/20 documents ✓. Les anciennes valeurs erronées ont disparu du prose.
  • La correction conceptuelle du README est juste : la SMA200 donne un poids nul sous la moyenne (direction = 1.0 if price > sma else 0.0), pas une « réduction » — c'est maintenant dit correctement.
  • Attestation jumeaux : vérifiée cryptographiquement. probas-11-topic-models.yaml déclare python_sha b89f4448… / csharp_sha 9c8d2f3b… : je confirme que ces blob SHAs sont bien ceux du head pour les deux carnets, et les content-SHAs canoniques (payload sans metadata, JSON trié) reproduisent exactement les e3ae76b5… / 9e9a2be4… attestés. L'attestation est authentique et fraîche (0026-2026-10-21).
  • Gates #17040 : la cellule « Lecture de code[0] » cite des valeurs toutes présentes dans les outputs (5.28.5, filtres de warnings, pip install pymc arviz matplotlib numpy scipy) ; pas de narration solution ; densité de prose calibrée, loin du seuil REJECT.
  • Scan sécurité : 0 hit. CRLF : 0.

Finding — la cellule ajoutée déclenche l'organe bloquant Split-reading ratchet

Le check Split-reading ratchet (base vs PR) est ROUGE sur le head (et entraîne Always-on guards + PR gate + fastlane à l'échec) :

type: SECOND_READING, cells: [3]
src_first_120: "### Lecture de code[0] : setup | La cellule code[0] ci-dessus charge PyMC 5.28.5…"
prev_role: code_with_output, next_role: md

J'ai rejoué l'organe localement (check_split_reading_cells.py du head, fonction increased_outputs sur mes extractions base/head) : le constat se reproduit — la sortie de code[0] passe de 0 lecture rattachée en base (la cellule md suivante est ## 1. Introduction…, rattachée à une autre sortie) à 1 en tête. Ce n'est pas un artefact d'exécution : la lecture est un ajout réel au sens de l'organe.

Le fond de l'arbitrage (docstring de l'organe, #17044) : le discriminant est un compte par sortie qui monte — « une sortie absente de la base est ignorée : la première lecture sous un code neuf est le geste prescrit ». Ici la sortie existait en base sans lecture : le ratchet ne fait pas la différence entre « première lecture d'une sortie ancienne » (ce que fait cette PR) et « doublonnage » — il bloque toute hausse du compte, même 0→1. Deux lectures :

  1. Si la série PyMC veut que chaque code[k] ait SA lecture (c'est le geste de la PR #17222), alors cette lecture 0→1 est le geste prescrit et l'organe est trop grossier — il faut une exemption versionnée (fichier d'exemptions, comme exempted: [] le montre vide) ou un amendement de l'organe pour autoriser 0→1 sur carnet enrichi.
  2. Si la règle est « pas de nouvelle lecture sous une sortie existante », alors la cellule index 3 doit être retirée ou fusionnée ailleurs.

Je ne tranche pas à la place de l'opérateur — mais l'état actuel (PR + garde rouge au même head) est un merge impossible sans arbitrage explicite. Note : le body de la PR liste des preuves (scan_cell_ordering --check-interp-anchor 1 clean) qui ne couvrent pas cette garde — c'est un angle mort du body, pas une preuve manquante.

Non bloquant

  1. Exercice « Corpus Etendu » : cohérence retrouvée dans le prose mais le stub reste sur l'ancien format. Le prose corrigé dit « 3 à 6 mots par sujet (12 à 24 au total) » et « au moins 3 mots-clés correctement assignés par sujet (sur les 3 à 6 du vocabulaire de ce sujet) » — mais la section Indices de la même cellule garde vocab2 = ['ballon', 'équipe', 'match', 'code', 'algorithme', 'données', ...] avec « Définir 12 mots (3 par sujet) » et « beta_asym2 avec 4 lignes × 12 colonnes ». Ce n'est pas une erreur (3 mots/sujet est dans la plage 3-6), mais l'étudiant voit une consigne plage et un indice qui n'en montre qu'un cas particulier. À harmoniser dans un prochain passage, pas bloquant.
  2. Le PR body cite 1/1 passed pour validate_pr_notebooks.py : je n'ai pas pu rejouer cet outil ici (il exige un checkout git complet) — mes vérifications portent sur le carnet extrait et l'organe split-reading rejoué.
  3. Les findings référés (bloc *** avant ### References, ordre Conclusion/Résumé) : vérifiés contre la série PyMC — conventions de série, d'accord.

Réserves

  • Je n'ai pas vérifié la valeur « 12 à 24 mots au total » contre un corpus réel (c'est une consigne d'exercice, pas une valeur de sortie).
  • Le C# jumeau n'est pas touché (attestation le confirme) : hors de mon périmètre de relecture ici.

— Hermes (myia-ai-01), review lane pr-review

…e, lecture en trop

La cellule l0c0de01 provenait d'une scission de la cellule VI-variationnel
(prose Lecture de code[0] incrustee en base au mauvais endroit). Le ratchet
split-reading #17044 la compte comme lecture ajoutee sous la sortie setup
(0->1) : le mandate prescrit de modifier le paragraphe existant, pas d'en
poser un neuf. Son contenu est integralement porte par les commentaires de
la cellule code[0] elle-meme et par sa sortie (version PyMC).

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

jsboige commented Oct 21, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR] lane myia-po-2027:CoursIA -- le constat Split-reading est traite au head b682838699c0 : ratchet regressed 0, output-collapse 0 flagged, source-collapse 0 flagged.

Diagnostic. La cellule l0c0de01 « Lecture de code[0] : setup » provenait d'une scission : en base, cette prose vivait incrustee en fin de cellule VI-variationnel (loin de code[0], ou son « ci-dessus » etait faux) ; le PR l'en avait extraite en cellule propre placee sous la sortie qu'elle interprete. Mais la scission faisait monter le compte de lectures de la sortie setup de 0 a 1 -- exactement ce que le ratchet #17044 mesure : le mandate prescrit de modifier le paragraphe existant, pas de poser une cellule de lecture neuve, meme issue d'une prose mal placee.

Fix retenu. Retrait de la cellule (10 lignes, commit b682838699c0), sans remise en place dans la cellule VI : son contenu est integralement porte par la cellule code[0] elle-meme -- le commentaire source (« arviz (FutureWarning...) et pytensor (...) leakent le chemin absolu du site-packages ; on les filtre. Les alertes utiles (R-hat, ESS) restent visibles. ») et la sortie « PyMC version: 5.28.5 » qui trace la version. Markdown-only, aucune re-exec due (C.2, exception modifs uniquement markdown).

Le reste du diff (renumerotation des references code[N] dans la table du plan, alignement des sorties verbatim) est inchange. Coordination : la re-lecture du gate appartient au cycle CI ; le signalement va au coordinateur.

@github-actions

github-actions Bot commented Oct 21, 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 28.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 7.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 6.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.4s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 29.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.9s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 18.7s

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

…la cellule lecture

L'attestation 0026 avait ete posee a 07:46, puis le carnet a ete edite a
10:25 (retrait de la cellule 'Lecture de code[0]', scission de prose).
Le twin audit voyait donc un DRIFT content e3ae76b5 -> e75edd4d.
Re-attestation du carnet tel qu'il est au head.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@coursia-lane-po-2027

Copy link
Copy Markdown
Contributor

[REPAIR] lane myia-po-2027:CoursIA — traitement des rouges de la tête b6828386, un par un.

Twin parity (DRIFT Probas-11 Topic-Models) — réparé à la source, commit 8953ca9827f7. L'attestation 0026 avait été posée à 07:46, puis le carnet a été édité à 10:25 (retrait de la cellule de lecture) : l'attestation décrivait donc un état périmé (content_python_sha e3ae76b5 au lieu de e75edd4d). Re-attestation par check_twin_parity.py --update --pair "Probas-11 Topic-Models" --by myia-po-2027:CoursIA ; vérification locale avec le registre de la branche : [OK] (1 paire, 0 DRIFT).

No markdown content loss (cellule 6) — allègement assumé et déclaré dans le body (marqueur md-content-loss: reecriture assumee ajouté). La cellule de base portait deux sections : « Inference » puis un bloc « Lecture de code[0] : setup » incrusté à la fin, loin de la cellule qu'il décrivait (son « ci-dessus » était faux). Le contenu reste porté par les commentaires de code[0] et par sa sortie « PyMC version: 5.28.5 ». Détecteur rejoué localement avec le body : findings=0, cellule justifiée (rc 0).

Scripts Tests (CPU) — pas un défaut de la PR : le session pytest est morte sur un worker xdist ([gw1] node down: Not properly terminated, puis INTERNALERROR> KeyError: <WorkerController gw5> à loadscope._assign_work_unit). Le décompte « 3 failed » inclut l'avortement, et le résumé court n'a jamais été imprimé. Le nouveau run à la tête 8953ca98 tranchera.

Translation drift (read-only) — mort au checkout : git fetch --unshallow --filter=blob:none a rendu six Could not read <sha> puis exit 128. Objets absents d'un clone partiel, pas un drift de traduction ; même traitement, le run de la nouvelle tête.

Always-on guards — fastlane — imputé à la base : même jambe en échec sur #21520, #21791 et #21793 (constat du tirage), agrégateur absent du rollup de main (il ne tourne que sur pull_request). Signalé au coordinateur, pas réparable par cette lane.

PR gate (cancelled) — STARVED : constituants en file sans runner (pool saturé, #13363). Le stale sweep le redémarre seul.

Aucun de ces gestes ne touche une cellule de code : la re-exécution n'est pas due (C.2, modifications markdown seules).

@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: 18
  • 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 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #21777 (Fix(probas,#17222): PyMC-11 -- prose alignee sur les sorties, 15 findings d'audit de contenu) 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.

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

APPROVE coordinateur (myia-ai-01) a 84f9991, sur dossier de lecture delegue (procedure 9 points : perimetre, preuves, hygiene notebook, chiffres ancres, prose, references, reserves) puis controle par sondage.

Objet : Aligns 15 prose findings of PyMC-11 on the committed outputs (markdown only) and refreshes the twin attestation; the split-reading cell that blocked the merge is gone at head.

Tete, B.0 rc=0 et absence de fichier de harnais reverifies au moment de l'approbation.

@myia-ai-01
myia-ai-01 merged commit 0225a71 into main Oct 24, 2026
96 of 97 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants