Skip to content

[Audit #17073] Série CaseStudies — partition Hermes #17083

Description

@clusterManager-Myia

Panorama de la série (audit #17073, partition Hermes)

Arc pédagogique : trois études de cas intégratrices « CC » qui appliquent les paradigmes du cours à un domaine réel, avec une intégration croissante :

  • CC1 Diagnostic-Medical (santé, diabète T2) : IA symbolique uniquement — agent à règles, A*, algorithmes génétiques, solveur Z3. Format « Lectures ancrées » + squelettes TODO à compléter.
  • CC2 Oncology-Planning (oncologie) : trois paradigmes articulés — symbolique (RDFLib + OR-Tools CP-SAT), probabiliste (Pyro), smart contract. Squelette/corrigé avec transitions explicites entre paradigmes.
  • CC3 SmartGrid-Energy (énergie) : orchestration en 4 couches — dispatch sous contraintes, prévisionniste bayésien, optimiseur multi-objectif, décision finale. Format « Interprétation » (post-exécution).

Ordre canonique proposé : CC1 → CC2 → CC3 (mono-symbolique → tri-paradigme → multi-couches ; cohérent avec la numérotation CC1/CC2/CC3).

Niveau d'apprenant proposé : CC1 = consolidation 1er cycle (implémentation guidée, TODO scaffoldés) ; CC2/CC3 = plus autonomes (modélisation, analyse de sensibilité aux priors).

Gaps entre notebooks : CC1 garde l'ancien format « Lecture ancrée » quand CC2/CC3 utilisent « Interprétation » — incohérence de vocabulaire transversale, sans impact local par notebook. Chaque CC est autoporteur (prérequis = cours, pas le CC précédent).

Checklist notebooks

  • CaseStudies/Diagnostic-Medical/solution/Diagnostic-Medical.ipynb
  • CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb
  • CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb
  • CaseStudies/Oncology-Planning/student/Oncology-Planning.ipynb
  • CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb
  • CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb

Audits un à un (steering : 1 notebook/cycle). Commentaires détaillés ci-dessous.

Activity

  1. clusterManager-Myia commented on Sep 20, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    CaseStudies/Diagnostic-Medical/student/Diagnostic-Medical.ipynb — 1 finding

    Cellules : [20] (id lecture-genetique-005, markdown) — placée entre l'exercice A* [19] et le header ## Partie 3 : Algorithmes Génétiques [21].

    Extrait (verbatim) :

    Lecture ancrée — Algorithmes Génétiques dans le Diagnostic Médical
    L'approche par algorithmes génétiques représente une méthode d'optimisation inspirée de la sélection naturelle, particulièrement adaptée aux problèmes complexes où les solutions optimales ne peuvent pas être trouvées par des méthodes analytiques classiques. […]

    Classe : navigation-misplaced (+ rupture du contrat « ancrée »)

    Pourquoi : dans le rendu, cette « Lecture ancrée » apparaît comme conclusion de la Partie 2 (A*) alors qu'elle introduit la Partie 3 ; surtout, elle ne cite aucune sortie alors que toutes les autres lectures du notebook sont ancrées sur des outputs réels (« Z3 importé avec succès », « Protocoles chargés : 4 sections »…) — l'apprenant lit une théorie générique au mauvais endroit et le signal « lecture = ce que TU viens d'exécuter » est cassé. La version solution place bien cette lecture après le code AG, dans la Partie 3.

    Rappel cohérence : dans le notebook solution, la lecture AG suit le code AG (cellule [26] de la solution). Le déplacement idiomatique serait : après [22] (code ChromosomeDiagnostic) ou fusion dans la théorie de [21].

    Organes (passe réelle, checkout du jour)

    RAS

    • Lectures [04] [07] correctement ancrées sur outputs réels ; lecture [32] factuelle (les 4 fonctions tester_* citées existent bien en [11] [17] [24] [28]) — pas de stale-claim.
    • Typos mineures (recommnadations [36], Etendre) : hors classes de la campagne, non déposées.
  2. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    CaseStudies/Oncology-Planning/solution/Oncology-Planning.ipynb — 3 findings

    Survol de série : corrigé type CC2 (3ᵉ notebook de la série audité), lu après CC1 Diagnostic-Medical et le pair student/. Le corrigé suit le squelette student + lectures interprétatives et bilan ; les divergences ci-dessous sont des désordres d'insertion propres au corrigé (le student est correctement ordonné).


    Finding 1 — navigation-misplaced

    • Cellules : [18] (id a8271cb1, code TODO) + [19] (id 0c540f63, énoncé)
    • Extrait : « Objectif : Etudier comment le choix du prior sur les profils (Resistant/Normal/Sensible) influence le diagnostic posterieur. […] Modifiez profil_probs dans la méthode model() »
    • Classe : navigation-misplaced
    • Pourquoi : l'Exercice 2 mobilise OncoModel.model(), profil_probs et l'inférence SVI, mais il est inséré ENTRE la fin de la Partie 1 (cell [17] ---) et le header « ## Partie 2 : Le Médecin Probabiliste (Pyro) » (cell [20]) — l'apprenant rencontre un exercice sur des concepts que le corrigé n'a pas encore introduits et doit lire en avant puis revenir. (Ordre correct dans le student : Exercice 2 après le header Partie 2.)

    Finding 2 — navigation-misplaced

    • Cellules : [25] (id 7868621b, code TODO) + [26] (id 09692326, énoncé)
    • Extrait : « Objectif : Etendre la classe OncoContract pour maintenir un historique des modifications »
    • Classe : navigation-misplaced
    • Pourquoi : l'Exercice 3 (journal d'audit du smart contract) est inséré sous le header « ### 2.2. Prédiction et Prise de Décision » (cell [24]), 5 cellules AVANT le header « ## Partie 3 : Bonus Smart Contract » (cell [30]) et la définition de OncoContract (cell [31]) — l'apprenant lit un énoncé sur une classe jamais vue, dont la définition arrive après. (Student : Exercice 3 après le header Partie 3.)

    Finding 3 — output-uninterpreted (réécriture demandée, règle #13410 : une lecture existe déjà, on n'en ajoute pas une seconde)

    • Cellules : [16] (markdown, sans id, lecture du solveur) — sortie produite par [15] (id 31abc0f7)
    • Extrait : « le planning respecte la capacité maximale de 3 lits par jour tout en optimisant les dates de début de chaque protocole (AC et FOLFOX). »
    • Classe : output-uninterpreted
    • Pourquoi : la sortie réelle liste 4 protocoles (« AC (sein) […] FOLFOX (colon) […] BEP (testicule) […] CHOP (lymphome) ») et la ligne « Débuts distincts : [1, 7] » — seule trace visible de la co-optimisation (AC décalé à J7, exactement ce que l'intro cell [14] annonce comme le défi) ; la lecture n'en garde que 2 protocoles et omet les débuts, laissant BEP/CHOP et le décalage ininterprétés. Réécrire cette cellule (p.ex. : citer les 4 protocoles + lire « Débuts distincts : [1, 7] » comme le signe que CP-SAT a décalé AC pour ne pas saturer les lits), pas de seconde lecture.

    RAS ailleurs : lectures des cells [9] (ontologie 14 triplets), [23] (posterior 0.92/0.04/0.04), [28] (risque par stratégie, très complète), [32] (contrat) interprètent fidèlement leurs sorties. TODO étudiants dans le corrigé = assumé (la cell [28] dit « Une fois l'exercice ci-dessus complété ») — exclu (Parade 3).

    Organes : couverts — split_reading_cells 0 signal ; interp_positioning 0 ; output_failure_text 0 ; cell_source_parses 0/1 ; accents 15 formes hors table (etendre 2, medicaments 5, toxicite 2, renale 2…) ; check_duplicate_sections absent du checkout ; gates #17040 : 0 header dupliqué, 2 séquences md consécutives (candidates non retenues : séparateur --- et étiquette, pas de prose empilée).

  3. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    CaseStudies/Oncology-Planning/student/Oncology-Planning.ipynb — 2 findings

    Survol de série : 4ᵉ notebook de la série (CC1 Diagnostic-Medical ×2, CC2 OncoPlan corrigé, puis ce squelette). Squelette étudiant type : mêmes sections que le corrigé, code à trous + tests « Ne pas modifier » + 3 exercices déportés en fin de partie.

    Correction préalable : mon commentaire précédent (corrigé, 00:45Z) affirmait « le student est correctement ordonné » pour justifier de ne pas y chercher les désordres. C'était faux — vérifié sur le dépôt : dernier commit du student = c67776b (2026-09-02), antérieur à l'audit, et les deux désordres décrits ci-dessous y figurent. Je corrige le record : les findings 1-2 du corrigé sont communs aux deux notebooks.


    Finding 1 — navigation-misplaced

    • Cellules : [16] (id ce9bfce9, code TODO) + [17] (id 0243637f, énoncé)
    • Extrait : « # Exercice 2 : Sensibilite au prior du profil patient / # TODO etudiant : Creer une version parametrable du modele avec profil_probs en argument »
    • Classe : navigation-misplaced
    • Pourquoi : l'exercice demande de modifier profil_probs dans la méthode model() de OncoModel — mais il est inséré ENTRE la fin de la Partie 1 ([15] ---) et le header ## Partie 2 : Le Médecin Probabiliste (Pyro) ([18]). La classe OncoModel n'est définie qu'en [19] : l'étudiant rencontre un exercice sur une classe et un paradigme jamais introduits, dans un squelette où il ne peut même pas lire le code à trous concerné.

    Finding 2 — navigation-misplaced

    • Cellules : [21] (id 302de264, code TODO) + [22] (id d2746864, énoncé)
    • Extrait : « # Exercice 3 : Journal d'audit pour le contrat intelligent / # TODO etudiant : Etendre OncoContract avec un attribut historique »
    • Classe : navigation-misplaced
    • Pourquoi : l'exercice demande d'étendre OncoContract, inséré sous « ### 2.2. Prédiction et Prise de Décision » ([20]), 4 cellules AVANT « ## Partie 3 : Bonus Smart Contract » ([25]) et la définition de la classe ([26]). L'étudiant lit un énoncé mobilisant une classe qui n'existe pas encore dans son notebook.

    RAS ailleurs : les sorties vides des tests ([10] « Test 2 : [] », [14] « Jours d'administration : [] », [26] « Non implémenté ») découlent des TODO à compléter — assumé par le format squelette, exclu (Parade 3). La section [09] sans header est une préférence de style, pas un défaut.

    Organes : couverts — split_reading_cells 0 signal ; interp_positioning 0/new ; output_failure_text 0 ; cell_source_parses 0/1 ; accents 18 formes hors table (medicaments 5, toxicite 2, enregistre 2…) ; gates #17040 : 0 header dupliqué, 0 prose empilée.

    Comptage campagne navigation-misplaced : 5 occurrences (1 DM-student, 2 OP-solution, 2 OP-student) — organe déjà proposé sur #17073 au cycle précédent, pas de nouvelle proposition.

  4. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    CaseStudies/SmartGrid-Energy/solution/SmartGrid-Energy.ipynb — 4 findings

    Survol de série : 5ᵉ notebook de la série (CC1 Diagnostic-Medical ×2, CC2 Oncology-Planning ×2, puis ce CC3 corrigé). Convention de série : une seule lecture par sortie — Diagnostic-Medical utilise « Lecture ancrée — … », Oncology « ### Interprétation : … ». Ce notebook empile les DEUX conventions sur deux sorties.

    Finding 1 — paraphrase-stack (violation #13410)

    • Cellules : [12] (id absent, md « Lecture ancrée ») + [13] (id smartgrid-interp-risk-c835, md « Interprétation »)
    • Extrait : « Lecture ancrée : Les risques de défaillance calculés sont extrêmement faibles (entre 10⁻³⁸ et 10⁻²⁸⁴), ce qui indique que la capacité pilotable de 800 MW couvre largement la demande nette… »
    • Classe : paraphrase-stack
    • Pourquoi : deux lectures de la même sortie ([11], risques H0–H5) — la « Lecture ancrée » originale (sans id) puis une « Interprétation » ajoutée par densification (id c835) ; pire, la plage citée « entre 10⁻³⁸ et 10⁻²⁸⁴ » est fausse : le maximum réel affiché est 3.00e-35 (H5) — or c'est précisément H5 que la seconde lecture identifie comme « risque le plus élevé ≈ 3·10⁻³⁵ ». L'apprenant lit deux versions divergentes de la même sortie, dont une qui masque le point pédagogique central (le risque suit l'incertitude, pas la demande). Réécrire [12], pas empiler.

    Finding 2 — paraphrase-stack (violation #13410)

    • Cellules : [23] (id absent, md « Lecture ancrée ») + [24] (id smartgrid-interp-comparative-c835, md « Interprétation »)
    • Extrait : « Lecture ancrée : L'analyse montre que la stratégie 'Ecologique (min CO2)' obtient le score multi-objectif le plus bas (1.560) malgré un coût plus élevé (106 800 EUR vs 63 600 EUR)… »
    • Classe : paraphrase-stack
    • Pourquoi : deux lectures du même tableau comparatif ([22]) ; [23] est un sous-ensemble quasi strict de [24] (mêmes scores 1.560/1.596, mêmes coûts, même verdict Écologique), seule la précision « 78 % de plus » est propre à [23] — à fusionner dans une lecture unique.

    Finding 3 — stale-claim

    • Cellules : [17] (id c14, code, print final) — contamine la lecture [18]
    • Extrait : print(f'Score multi-objectif du dispatch min-cout (ref non normalise): {score_min_cost:.3f}') → sortie « Score multi-objectif du dispatch min-cout (ref non normalise): 1.137 », alors que l'appel passe norms={'cost': 200000, 'co2': 2000000, 'max_risk': 1.0} et que la docstring promet « Score = … dans [0,1] (0=meilleur) »
    • Classe : stale-claim
    • Pourquoi : trois messages irréconciliables pour l'apprenant — le label dit « non normalisé », le code normalise explicitement, la docstring promet un score dans [0,1] alors que le résultat affiché est 1.137 (puis 1.596/1.560 en Partie 4). L'interprétation [18] décompose le score en termes normalisés (0,32 + 0,82) sans relever la contradiction : l'apprenant ne peut pas savoir quelle échelle lire.

    Finding 4 — navigation-misplaced

    • Cellules : [0] (id c0, md titre) — cellule Navigation attendue absente
    • Extrait : « # CC3 : SmartGrid - Ordonnancement de la production energetique sous incertitude » (première ligne du notebook, aucun « Navigation : Index »)
    • Classe : navigation-misplaced
    • Pourquoi : les quatre notebooks précédents de la série (CC1/CC2, solution et student) ouvrent sur une cellule Navigation vers l'index CaseStudies/README.md ; l'apprenant qui arrive sur CC3 perd le fil de la série et ne peut revenir à l'index.

    RAS ailleurs : la lecture [7] (dispatch OPTIMAL 63 600 €) et l'interprétation [18] (décomposition 0,32/0,82) sont exactes ; l'arithmétique de [24] vérifiée (106 800 − 63 600 = +43 200 €, 720 000 kg évités, ≈ 0,06 €/kg) ; les exercices 1–3 sont placés après les définitions qu'ils mobilisent (contrairement à CC2) ; gates #17040 : 0 header dupliqué, 0 prose empilée.

    Organes : couverts — split_reading_cells 0 signal ; interp_positioning 0/0 ; output_failure_text 0 ; cell_source_parses 0/1 ; accents 33 formes hors table (cout 6, bayesien 4, emissions 3, capacites 3, defaillance 3…) ; check_duplicate_sections absent du checkout.

    Comptage campagne : paraphrase-stack passe à 2 occurrences (les deux ici, même cause racine : densification c835 ajoutant une lecture par-dessus une « Lecture ancrée » existante) — sous le seuil d'organe (3), mais même pattern que #13410 ; navigation-misplaced 6 (organe déjà proposé au cycle précédent) ; stale-claim 1.

  5. clusterManager-Myia commented on Sep 21, 2026

    @clusterManager-Myia
    CollaboratorAuthor

    CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb — 4 findings

    Survol de série : 6ᵉ et dernier notebook de la série CC (CC1 Diagnostic ×2, CC2 Oncology ×2, CC3 SmartGrid corrigé, puis ce squelette). Convention de série : une seule lecture par sortie — Diagnostic-Medical dit « Lecture ancrée — … », Oncology dit « ### Interprétation : … ». Ce notebook empile les deux conventions dans son propre contenu (voir finding 3) ; le corrigé frère ajoute encore une 3ᵉ dose via les cellules smartgrid-interp-*-c835.

    Finding 1 — stale-claim

    • Cellules : [02] (id c2, md « Architecture en 4 couches ») + [23] (id c19, md « Conclusion »)
    • Extrait : « Ce notebook est une fondation : le jumeau numérique (couche 0) est operationnel ; les implementations des 4 couches seront completees et executees dans les cycles suivants. »
    • Classe : stale-claim
    • Pourquoi : la variante solution/ du même notebook dit exactement l'inverse — « les 4 couches de solveurs (CP-SAT, bayésien, multi-objectif, analyse comparative) sont implémentees et exécutées (Parties 1 à 4) » — donc la phrase de squelette a survécu à la mise à jour de la variante solution ; l'apprenant qui compare les deux fichiers (usage normal du couple student/solution) lit deux états contradictoires du même artefact et n'a aucun moyen de savoir lequel croire.

    Finding 2 — output-uninterpreted

    • Cellules : [12] (id c10, code) — aucune cellule markdown n'est intercalée entre sa sortie et l'énoncé [13] « Exercice 2 »
    • Extrait : « Risque de defaillance (a completer par letudiant) : ⏎ H0: risque = None ⏎ H1: risque = None » (puis H2–H5, tous None)
    • Classe : output-uninterpreted
    • Pourquoi : c'est la seule sortie exécutée du notebook (avec [04], interprétée) — six None identiques — et rien ne dit à l'apprenant que None est l'état attendu du stub et non une erreur d'exécution ni un risque nul : les deux hypothèses sont indistinguables à l'écran, alors que le seul verdict pédagogique de la série sur cette quantité (risques de queue ~10⁻³⁵, pilotés par l'incertitude) ne vit que dans le corrigé. (Note de frontière : aucune lecture existante à réécrire ici, donc pas de réparation de densification — finding à arbitrer, pas une PR.)

    Finding 3 — stale-claim (généralisation du finding 1)

    • Cellules : [05] (id lecture-demo-network-001), [08] (id lecture-multi-objectif-002), [15] (id lecture-architecture-003), [19] (id lecture-conclusion-004) — toutes markdown, en-tête « Lecture ancrée — … »
    • Extrait : « Lecture ancrée : La dernière partie du notebook effectue une analyse comparative des différentes stratégies de dispatch en évaluant leur performance selon les trois critères principaux : coût économique, émission de CO2, et niveau de risque… » (idem « …Cette séparation des préoccupations permet une modularité accrue et facilite la maintenance et l'évolution du système. » en [15])
    • Classe : stale-claim
    • Pourquoi : le libellé « Lecture ancrée » promet la lecture d'une sortie, mais une seule des quatre ([05], qui cite mot pour mot « Reseau : 3 centrales, capacite totale 800 MW ») ancre quoi que ce soit ; les trois autres décrivent des objets du notebook (le réseau de démonstration, l'architecture censée, la Partie 4) et [19] commente une partie dont toutes les cellules de code sont des stubs sans sortie — l'apprenant qui a appris à lire ces paragraphes comme le commentaire d'un résultat n'a aucun signal lui disant lesquels interprètent une sortie et lesquels n'en ont jamais vu.

    Finding 4 — navigation-misplaced

    • Cellules : [00] (id c0, md titre) — cellule Navigation attendue absente
    • Extrait : « # CC3 : SmartGrid - Ordonnancement de la production energetique sous incertitude » (première ligne du notebook, aucun « Navigation : Index »)
    • Classe : navigation-misplaced
    • Pourquoi : les quatre notebooks précédents de la série (CC1/CC2, solution et student) ouvrent sur une cellule Navigation vers CaseStudies/README.md ; le squelette remis à l'étudiant pour CC3 est le seul à ne pas le faire, donc l'étudiant n'a pas le point de retour vers l'index de série (même défaut que la variante solution/, déjà signalé).

    RAS ailleurs : le jumeau numérique [04] est exact (3 centrales, 800 MW ; demande nette H0 420 MWh cohérente avec 500−80) ; la table « Architecture en 4 couches » [02] est cohérente avec l'ordre réel des Parties 1→4 ; les 3 exercices (réserve n-1, sensibilité au prior, équité territoriale) sont placés après la définition de ce qu'ils mobilisent (contrairement à CC2) ; gates #17040 : 0 header dupliqué, 0 séquence de prose consécutive ; aucune araignée de solution (tous les stubs retournent None).

    Organes : couverts — check_split_reading_cells 0 signal ; check_interp_positioning 0/0 (baseline vide) ; check_output_failure_text 0 régression ; check_cell_source_parses 0/1 ; restore_accents_canonical --check : 9 cures possibles dans 7/16 cellules markdown, 34 formes hors table (cout 6, bayesien 4, electrique 3, emissions 3, capacite 3, economique 2, troisieme 2, illustre 2…) ; check_duplicate_sections absent du checkout (pas de signal à rapporter, sections dupliquées : voir #17066).

    Comptage campagne (6 notebooks audités) : navigation-misplaced 7 (organe déjà proposé) ; stale-claim 3 → seuil d'organe franchi (proposition en commentaire sur #17073) ; paraphrase-stack 2 ; output-uninterpreted 2.

  6. added a commit that references this issue on Sep 21, 2026
  7. added 2 commits that reference this issue on Sep 23, 2026
  8. added 2 commits that reference this issue on Sep 24, 2026
  9. added a commit that references this issue on Sep 25, 2026
  10. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    and removed
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Sep 26, 2026
  11. jsboige commented on Oct 1, 2026

    @jsboige
    Owner

    Grain: MED/notebook-python — lane myia-po-2025:CoursIA-2 — prev: LIGHT/guard #18660
    [CLAIMED] lane myia-po-2025:CoursIA-2 — paths: MyIA.AI.Notebooks/CaseStudies/SmartGrid-Energy/student/SmartGrid-Energy.ipynb -- clarifier que les six None de la sortie c10 sont des placeholders attendus, sans résoudre l’exercice.

  12. jsboige commented on Oct 2, 2026

    @jsboige
    Owner

    [INFO] candidate-delivered (audit EPIC #17073, lot partitions Hermes) — lane myia-po-2026:CoursIA-2 — 2026-10-02

    Lot d'issues de partition pédagogique ouvertes le 30/09 et 01/10 par l'audit #17073. Toutes ont des livraisons MERGED associées et sont closes en substance.

    Preuve firsthand :

    Deux tickets (#18545, #18684) restent de pur cadrage, sans livraison nécessaire : l'audit a vocation d'inventaire. Les 6 autres sont résolus en substance.

    Aucune fermeture posée (Tell c.1502 strict fondateur), aucun label, aucune ré-implémentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions