Repository navigation
slides: les deux verificateurs de liens ne scannent pas slides/ (108 liens non couverts, 17 liens morts ecrits en #15023 passes sous le radar) #15867
Description
Constat
La tranche de contenu #15023 sur le deck 03-logique (PR #15865) a écrit 17 liens relatifs morts vers des notebooks. Les deux organes de vérification de liens du dépôt ont rendu « 0 lien cassé » :
scripts/check_docs_links.py—SCAN_SCOPES(7 entrées, lignes 34-44) :CLAUDE.md, index.md, PARCOURS.md, docs/, .claude/rules/, .claude/agents/, .claude/skills/scripts/notebook_tools/check_link_label_agreement.py:50:SCAN_GLOBS = ("MyIA.AI.Notebooks/**/*.ipynb", "MyIA.AI.Notebooks/**/README.md", "docs/**/*.md")
slides/ n'est dans aucune des deux listes. Un deck peut donc citer 60 notebooks en pointant dans le vide, et les deux organes rendent vert.
Les 17 liens ont été rattrapés uniquement parce que j'ai construit un vérificateur deck-scoped pour la tranche. Sans lui, ils partaient en review, et l'acceptance de #15023 s'appuyait explicitement sur ces deux organes.
Ce n'est pas un trou théorique : check_docs_links.py documente lui-même le précédent exact, dans le commentaire de SCAN_SCOPES —
# Root entry points (#7422 root slice): index.md rotted historically precisely
# because no organ watched it -- the portal and the parcours front page are
# now link-checked like everything else.
index.md a pourri parce qu'aucun organe ne le regardait ; il a été ajouté au scope. slides/ est dans le même cas, en plus gros.
Ampleur mesurée (sur origin/main 77575efeb, 17 decks)
| valeur | |
|---|---|
decks sous slides/*/slides.md |
17 |
| liens relatifs présents | 108 |
| liens relatifs cassés aujourd'hui | 0 |
| liens relatifs couverts par un organe CI | 0 |
Détail des decks porteurs : 03-logique 1, 04-probabilites 27, 05-theorie-des-jeux 58, 07-elargissements 14, S2-ia-exploratoire-symbolique 8. Les 12 autres decks n'ont aucun lien relatif.
Le dépôt n'est donc pas cassé aujourd'hui — c'est un trou latent, pas un incendie. La valeur est préventive : c'est exactement le mode de défaillance du #7422 ci-dessus, et il s'est matérialisé dès qu'une tranche a ajouté du contenu.
Impact
- Une PR qui enrichit un deck peut livrer des dizaines de liens morts sans qu'aucun gate ne bronche (cas réel : PR docs(slides,#15023): ancrer l'arc de 03-logique sur son corpus (24 ancres, 3 slides neuves) #15865, 17 liens).
- 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 (« aucun lien mort, aucun label menteur ») invoque ces organes : elle est donc indécidable en l'état pour les decks.
- Le trou est structurel : il se rouvrira à chaque tranche de l'arc de cours (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) tant que
slides/n'est pas scanné.
Correctif proposé
Ajouter slides/ aux deux listes, et traiter les deux difficultés propres aux decks :
- Résolution des chemins : les liens d'un deck sont relatifs au répertoire du deck (
slides/03-logique/), pas à la racine du dépôt.check_docs_links.pyrésout depuis la racine — il faut résoudre depuisslides/<deck>/, comme le fait le vérificateur de la tranche. - Labels : la convention de citation est
*Notebooks : [Basename](../../MyIA.AI.Notebooks/...) (glose) · [...]*. Le label est le basename du notebook, pas le titre du fichier —check_link_label_agreement.pydoit accepter cette forme sous peine de faux positifs massifs (les 108 liens actuels sont dans ce format, dont 58 sur le deck 05).
Deux pièges à couvrir par le contrôle positif, sinon l'organe sera vert à tort :
JAMAISde scan silencieux : sislides/est vide ou si le glob ne matche rien, l'organe doit échouer explicitement (pas « 0 constat »).- Un lien relatif peut sortir de
slides/et viserMyIA.AI.Notebooks/: la résolution doit normaliser les..avant de tester l'existence, sans quoi tout devient « cassé » ou tout devient « valide ».
Acceptation
check_docs_links.pyetcheck_link_label_agreement.pyscannentslides/**/slides.mdet détectent les liens relatifs cassés et les labels menteurs.- Contrôle positif reproductible : l'organe, pointé sur un arbre où l'on a cassé un lien volontairement, rend rc≠0. Sans ce contrôle, l'organe peut être vert sans rien scanner (cf
scripts/notebook_tools/scan_slidev_composition.pypour le modèle de contrôle positif interne). - Les 108 liens relatifs présents sur
mainrestent tous valides → l'organe n'introduit aucun faux positif sur l'existant. - Les 17 liens de la PR docs(slides,#15023): ancrer l'arc de 03-logique sur son corpus (24 ancres, 3 slides neuves) #15865 (déjà réparés) seraient détectés par l'organe dans leur état d'origine.
Note d'implémentation — instrument de la tranche
Un vérificateur deck-scoped a été écrit pour la tranche #15023 (résolution depuis le répertoire du deck, label_ok() qui compare le label au basename avec glose strippée, mode --expect-broken N en contrôle positif). Il rend, sur les états mesurés :
| état | liens | 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 : sur un deck sain il rend 0 — il discrimine. Reproductible dans le fil de #15023 / #15865.
See #15023.
Activity
jsboige commentedon Sep 12, 2026
[CLAIMED] lane myia-po-2023:CoursIA — 2026-09-12T23:10Z —
slides/absent des DEUX organes de liens : ajout du scope avec resolution relative au repertoire du deck (slides/<deck>/) + accord de label basename (convention*Notebooks : [Basename](...) (glose) · [...]*), controle positif obligatoire (glob vide = echec explicite, jamais « 0 constat »), et non-regression des 108 liens existants (0 faux positif attendu). See #15867, entier.paths: scripts/check_docs_links.py, scripts/notebook_tools/check_link_label_agreement.py, scripts/tests/
jsboige commentedon Sep 12, 2026
@C:/Users/jsboi/AppData/Local/Temp/claude/d--Dev-CoursIA/3f32c854-d818-4829-9a45-ff9c7aac029a/scratchpad/delivered15867.md
feat(guards,#15867): les deux organes de liens couvrent les decks sli…
ci(guard,#16645): cable check_link_label_agreement en TRANCHE12 advis…