Skip to content

docs(slides,#15023): ancrer l'arc de 03-logique sur son corpus (24 ancres, 3 slides neuves) - #15865

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/15023-deck03-logique-contenu
Sep 13, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/15023-deck03-logique-contenu

Conversation

@jsboige

@jsboige jsboige commented Sep 12, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/slides — lane myia-po-2026:CoursIA — prev: DEEP/ml #15548

Deck 03-logique — l'arc conceptuel ancré sur son corpus (59 citations, 3 slides neuves)

See #15023 (tranche partielle : un deck par tranche, l'epic reste ouverte).

Contexte

#15023 mesure que les decks de l'arc principal citent zéro notebook du dépôt. Sur origin/main (77575efeb), le deck 03-logique porte 1 seul lien relatif (.claude/rules/wsl-kernels.md, Quick-start Lean) : 129 slides de logique — KB agents, Wumpus, résolution, DPLL, SAT, FOL, modale, argumentation, SMT, planification, DL/OWL, smart contracts — sans un seul renvoi vers les notebooks qui les exercent. Le corpus existe : SymbolicAI/{Tweety,SMT,Planners,SemanticWeb,Argument_Analysis,SmartContracts}, Search/Applications.

Acceptance corrigée par ai-01 (le comptage grep -icE 'ipynb' était devenu la cible) : (1) zéro ancre terminale — chaque référence vit dans la slide qui traite son sujet ; (2) ≥1 slide de contenu neuve tirée du notebook ; (3) liens morts réparés au passage.

Livrable — Périmètre : 1 fichier

slides/03-logique/slides.md uniquement, +172 / −0 (git diff --numstat = 172 0) : aucune ligne supprimée (3 slides insérées, 24 ancres ajoutées en queue de flux, 9 blocs <style scoped> de densité, 2 contraintes de largeur ajoutées dans des blocs préexistants).

  • 24 ancres in-slide, 59 liens notebook. Style *Notebooks : [Basename](../../MyIA.AI.Notebooks/...)* (convention du deck 05, verdict « conforme ») — jamais de bloc « Corpus associé » terminal.
  • 3 slides de contenu neuves, chacune ancrée sur ses notebooks :
Slide Sujet Notebooks
Resolution inverse et apprentissage inductif remonter la règle depuis la conséquence ; ILP SL-5-InverseResolution, SL-4-InductiveLogicProgramming, SL-1-LogicalLearning
Expliquer l'incohérence : MUS, MCS et noyaux d'insatisfiabilité dualité MUS/MCS, diagnostic, révision AGM Z3-Python-13-UnsatCores, 17_UnsatCores, Tweety-4-Belief-Revision
Logiques de description et OWL TBox/ABox, subsomption calculée, profils OWL, HermiT/Pellet SW-13-Python-Reasoners, SW-14-Python-Coup-Ontologique, Tweety-3-Advanced-Logics-Csharp

Ce que la mesure a rattrapé — et qui serait passé en CI

1. Mon premier plan d'ancrage était faux : 17 des 59 liens pointaient dans le vide

Le plan avait été construit sur des chemins supposés, pas sur l'arbre :

Série Plan (faux) Réalité sur main
Planners Planners/Planners-3-State-Space.ipynb série restructurée : 01-Foundation/, 02-Classical/, 03-Advanced/, 04-NeuroSymbolic/
SMT (Python) SMT/Z3-Python-01-Introduction.ipynb SMT/Z3-API/Z3-Python-01-Introduction.ipynb
Z3-Linq2Z3 Z3-Python-14-Optimize-MaxSAT.ipynb SMT/Z3-Linq2Z3/14_Optimize_MaxSAT.ipynb (nom NN_Sujet)
SmartContracts SmartContracts/SC-14-Formal-Verification.ipynb SmartContracts/03-Foundry-Testing/SC-14-…
Search Search/App-23-… Search/Applications/Hybrid/App-23-…
SemanticWeb SW-12-GraphRAG.ipynb SW-12-Python-GraphRAG.ipynb

Aucun organe CI ne l'aurait vu. scripts/check_docs_links.py a SCAN_SCOPES = ["CLAUDE.md", "index.md", "PARCOURS.md", "docs/", ".claude/rules/", ".claude/agents/", ".claude/skills/"] — slides/ n'y est pas. scripts/notebook_tools/check_link_label_agreement.py a SCAN_GLOBS = ("MyIA.AI.Notebooks/**/*.ipynb", "MyIA.AI.Notebooks/**/README.md", "docs/**/*.md") — slides/ n'y est pas non plus. Un « 0 lien cassé » de ces deux outils ne dit rien d'un deck, alors que l'acceptance de #15023 s'appuyait dessus.

Instrument construit pour combler le trou, avec contrôle positif — c'est lui qui a trouvé les 17 :

Deck Liens relatifs Cassés Labels menteurs
05-theorie-des-jeux (référence saine) 58 0 0
03-logique avant réparation 44 17 0
03-logique après réparation 60 0 0

Le contrôle n'est pas décoratif : le même instrument, sur un deck sain, rend 0 — il discrimine.

2. Trois défauts de composition que j'ai introduits, mesurés puis corrigés

L'ancre est le dernier élément en flux de chaque slide ; sur les slides déjà à ras, elle pousse le flux hors du canvas 980×552.

  1. 5 slides de plus en débordement de contenu — 8 sur la branche avant correction, contre 3 en référence (mesure du § suivant). Corrigé par l'idiome de densité déjà utilisé par ce deck (<style scoped> : font-size: 0.88em + marges h2 resserrées — cf. « Systèmes à maintenance de vérité », « Décomposition hiérarchique »), appliqué à 9 slides de la tranche : « Unification », « Resolution en FOL », « Resolution inverse… », « Logiques d'ordre supérieur », « Expliquer l'incohérence… », « Applications », « Web sémantique », « Logiques de description et OWL », « Smart Contracts ». Aucune suppression de contenu : on reclaim de la hauteur, on ne retire rien.
  2. 2 ancres passant SOUS un bloc d'images absolu (glyphes repeints — signal recouvrement, cf slides: scan_slidev_composition.py est aveugle au recouvrement texte-image (occupation 6->0 sur un deck qui empire) #15351) sur « Décomposition hiérarchique » (img_036) et « Web sémantique » (pile img_039/040/043). Corrigé en bornant le dernier paragraphe en flux : .slidev-layout > p:last-of-type { max-width: … }, largeur calculée depuis le bord gauche de l'image (right:58px; width:200px → x=722 ; right:30px; width:320px → x=630).
  3. 2 slides cassées : mon commentaire CSS d'explication contenait un <p> littéral, que Vue lit comme du balisage → Tags with side effect (<script> and <style>) are ignored in client component templates, et les slides « Web sémantique » et « Ontologies » rendaient « An error occurred on this slide ». Détecté par un signal indirect : le compteur recouvrements est passé de 5 à 2 en « réparant » trois slides que je n'avais pas touchées — résultat implausible, donc investigué. Corrigé en retirant les chevrons du commentaire (issue 15351 au lieu de #15351). Aucun organe ne signale directement « cette slide n'a pas rendu » (cf. résiduel n°3).

Non-régression de composition — instrument canonique du dépôt

scripts/notebook_tools/scan_slidev_composition.py, deck entier, les deux états servis en parallèle (worktree origin/main vs branche), résultats alignés par contenu (text_head) — les numéros ne sont pas comparables, la branche ajoutant 3 slides :

Signal origin/main (129 slides) branche (132 slides)
hors_canvas (contenu) 3 3 — les 3 mêmes
hors_canvas (boîte seule) 8 8 — aucun introduit
chevauchements 0 0
recouvrements (ADVISORY) 5 5
occupation (ADVISORY) 33 33

Zéro régression sur tous les signaux. Les 3 slides en débordement de contenu le sont déjà sur main (« Sémantique de la logique propositionnelle », « Règles d'inférence », « Définition d'un domaine de planification ») — hors de ma tranche.

Contrôle de stabilité : le même deck main scanné deux fois rend exactement les mêmes compteurs (3/8/0/5/33). Le signal ne bouge pas tout seul ; les écarts observés pendant le travail (7 recouvrements, puis 2) étaient la conséquence de mes propres slides cassées, pas du bruit de l'instrument.

Le « rendu » se mesure sur le build de production, pas sur le serveur de dev

Pendant la campagne A/B, le serveur de dev a affiché « An error occurred on this slide » sur quelques slides de main comme de la branche. J'ai d'abord attribué cela au contenu (diagramme mermaid de la slide « Cartographie des 24 notebooks »). C'était faux — la console navigateur donne la cause réelle :

SyntaxError: The requested module
  '/@fs/C:/dev/CoursIA/slides/node_modules/lz-string/libs/lz-string.js'
  does not provide an export named 'default'

C'est une résolution de module du serveur de dev local (lz-string, dépendance de Slidev), pas un défaut du deck : le symptôme est apparu sur 1 ou 3 slides selon le moment de la sonde, et symétriquement des deux côtés de l'A/B.

La mesure qui fait foi est le build de production (DOM pré-rendu, pas de bundler de dev, pas de lz-string en ESM à la volée) :

Deck de la branche, slidev build valeur
pages .slidev-page dans le DOM 132
pages à texte vide 0
pages contenant « An error occurred » 0
contrôle positif « Cartographie des 24 notebooks » trouvée, slide 98

Le contrôle positif n'est pas décoratif : une première marche de navigation rendait « 132 slides, 0 erreur » sur une page 404 de mon propre serveur statique (python -m http.server ne fait pas de repli SPA : /<n> n'existe pas comme fichier). Un « 0 erreur » sans contrôle positif ne vaut rien. La slide mermaid mise en cause rend correctement.

Acceptance #15023

# Critère Mesure
1 Zéro ancre terminale ✅ 24 ancres, toutes dans la slide de leur sujet ; aucun bloc « Corpus associé » avant layout: end
2 ≥1 slide de contenu neuve ✅ 3 slides, chacune ancrée (tableau ci-dessus)
3 Aucun lien mort, aucun label menteur ✅ 60 liens, 0 cassé, 0 label menteur (contrôle positif ci-dessus) ; check_slidev_structure.py → 0 constat
4 Le deck rend toujours ✅ slidev build exit 0 (1088 modules) et le build de production rend 132/132 slides : 0 texte vide, 0 « An error occurred », contrôle positif « Cartographie des 24 notebooks » trouvé (slide 98). Mesuré sur le DOM pré-rendu — cf. section « Le rendu se mesure sur le build »
5 Pas de mélange avec le volet calage (#13237/#14226) ✅ 1 fichier, aucune retouche d'images ni de style.css de deck

Résiduel — signalé, non traité (sujets distincts)

  1. slides/** hors du scope des deux vérificateurs de liens (check_docs_links.py SCAN_SCOPES, check_link_label_agreement.py SCAN_GLOBS). L'acceptance de slides: l'arc de cours principal ne cite aucun notebook du depot (6 decks a zero, 103 notebooks GenAI ignores par le deck 08) #15023 les invoquait ; ils ne regardent pas les decks. Les 17 liens morts écrits puis réparés ici seraient passés sans bruit. → issue à ouvrir.
  2. Le serveur de dev local casse des slides via lz-string — dépendance Slidev qui ne fournit pas d'export default dans node_modules (SyntaxError: … does not provide an export named 'default'). Symptôme : des slides affichent « An error occurred on this slide », en nombre variable et des deux côtés de l'A/B. Le build de production, lui, rend les 132 slides. C'est un défaut d'environnement (prebundle/node_modules de C:\dev\CoursIA\slides), pas de contenu — mais il pollue toute campagne A/B faite sur le serveur de dev. → signalé.
  3. Le scan de composition n'a aucun signal « la slide n'a pas rendu » : le compteur de slides en erreur n'existe pas dans ses sorties ; un deck qui affiche des slides en erreur reste vert (hors_canvas inchangés). C'est ce qui a failli laisser passer mon propre défaut n°3 (commentaire CSS avec <p>) — détecté seulement par un recouvrements qui baissait, c'est-à-dire l'inverse du réflexe attendu. → signalé.
  4. slides/README.md:50 est faux sur la taille de ce deck : annonce ~1969 lignes ; réalité 2774 sur main, 2946 sur cette branche. Déjà faux de ~800 lignes avant ma tranche → l'inventaire demande un ré-audit complet, pas une retouche de ligne. Signalé, non corrigé (un sujet par PR).
  5. slides/03-logique/analysis/mapping-20260419.md décrit un état Slidev de 53 slides (2026-04-19) contre 132 aujourd'hui. Obsolète indépendamment de cette tranche.
  6. QA visuel de la densité : les 9 slides passées en 0.88em, les 2 largeurs d'ancre et les 3 slides neuves méritent un regard à capacité vision (lane CoursIA-2 / merge-gate) — cette lane (GLM) ne voit pas les rendus.

Base — à jour au moment du push, en retard de 21 commits à l'instant du rapport

Branche issue de origin/main 77575efeb ; origin/main est depuis passé à c29574410 (21 commits d'avance). Aucun de ces 21 commits ne touche slides/ :

$ git log --oneline 77575efeb..origin/main -- slides/
(vide)

Le merge est donc sans conflit et le catalogue est byte-identique à main (cette PR ne touche aucun artefact généré). Je ne force-push pas (règle git-workflow.md) : la mise à jour de la base revient au merge-gate / coordinateur, si elle est jugée nécessaire.

Reproductibilité

# deck de la branche et deck de reference, servis en parallele
cd slides && ./node_modules/.bin/slidev <branche>/slides/03-logique/slides.md --port 3041
cd slides && ./node_modules/.bin/slidev <baseline>/slides/03-logique/slides.md --port 3042

# composition (deck entier), sur les deux etats
python scripts/notebook_tools/scan_slidev_composition.py --url http://localhost:3041 \
  --slides-md slides/03-logique/slides.md --out /tmp/branche.json
python scripts/notebook_tools/scan_slidev_composition.py --url http://localhost:3042 \
  --slides-md <baseline>/slides/03-logique/slides.md --out /tmp/base.json

# structure Slidev + build
python scripts/check_slidev_structure.py slides/03-logique/slides.md
./node_modules/.bin/slidev build slides/03-logique/slides.md

Le vérificateur de liens deck-scoped (et le trou de scope ci-dessus) est un script de session, reproduit dans le fil de #15023.

🤖 Generated with Claude Code

…cres, 3 slides neuves)

Le deck 03-logique (129 slides) ne citait qu'un seul lien relatif et zero
notebook du depot, alors que le corpus qui l'exerce existe (SymbolicAI/Tweety,
SMT, Planners, SemanticWeb, Argument_Analysis, SmartContracts ; Search/
Applications). Ajout de 24 ancres in-slide (59 citations notebook, style
relatif du deck 05) et de 3 slides de contenu tirrees des notebooks :
resolution inverse/ILP, MUS-MCS et noyaux d'insatisfiabilite, logiques de
description et OWL.

Acceptance #15023 : zero ancre terminale, >=1 slide neuve par tranche, liens
morts repares. Mesure : 60 liens relatifs, 0 casse, 0 label menteur ; scan de
composition du depot inchange (hors_canvas 3, chevauchements 0, aucune erreur
de rendu introduite) ; slidev build OK.

+172 / -0 sur un seul fichier ; slides.marp.md non touche (precedent #15818).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 13, 2026
…des/**/slides.md (#15871)

`slides/` n'etait dans le scope d'AUCUN des deux organes de liens : la tranche
#15023 (PR #15865) a ecrit 17 liens relatifs morts sur 03-logique et les deux
organes rendaient « 0 casse ». Meme mode de defaillance que #7422 (index.md
pourrissait parce que rien ne le regardait).

- check_docs_links.py : scope deck `slides/**/slides.md` (DECK_DIR), resolu
  DEPUIS le repertoire du deck (le `..` sort de slides/ vers
  MyIA.AI.Notebooks/). Le scope reste deck-only, mesure : slides/**/*.md =
  119 fichiers, 734 casses/1367 (analysis/, extracted/, *.marp.md) -- l'elargir
  rougirait toute PR.
- DeckScopeEmpty : slides/ present sans aucun deck => exit 2 explicite, jamais
  un « 0 casse » depuis une portee vide (piege 1 de l'issue).
- --expect-broken N : controle positif en bande (modele
  scan_slidev_composition.py). Arme et non atteint => exit 2. Matrix mesuree
  sur un lien casse volontairement : bare=1, --expect-broken 1=1 (controle
  satisfait), --expect-broken 2=2, --check --base origin/main=1 (regression
  non excusee). Advisory « controle non arme » confinee au bare scan : --check
  garde son contrat d'une ligne unique.
- check_link_label_agreement.py : DECK_GLOB + meme garde anti-scan-silencieux.
  Le predicat existant n'a PAS ete assoupli : il compare un identifiant de
  famille extrait des DEUX cotes, donc le basename sans extension et la glose
  hors crochets ne le concernent pas (l'egalite naive label==basename
  ferait 108/108 faux positifs, mesure).
- fast_lane_registry.py : le garde check-links declenche maintenant sur
  slides/** -- sans quoi une PR deck-only (#15865) ne lance jamais l'organe
  (entree de registre != cablage). La parite test trouve AUSSI que
  .claude/agents/** et .claude/skills/** etaient scannes depuis #7422 sans
  jamais declencher le garde : couverts.

Mesures sur origin/main : 702->720 fichiers, 6845->6953 liens (+108, le compte
exact de l'issue), 0 casse avant/apres ; label organ 2076->2093 fichiers
(+17 decks, _archive exclu -- divergence documentee et epinglee), 0
desaccord sur tout le depot.

Acceptance 4 : l'etat des 17 liens casses n'est PAS dans l'historique git (les
deux commits de #15865 sont deja a 60 liens / 0 casse -- mesure). Demontree
par reconstruction : lien casse volontairement sur un deck => detecte et
nomme (slides/05-theorie-des-jeux/slides.md:116), restaure par cp backup.

Closes #15867.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
@myia-ai-01
myia-ai-01 merged commit 1330eec into main Sep 13, 2026
18 of 19 checks passed
This was referenced Sep 13, 2026
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