Skip to content

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

Closed

Description

@jsboige

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

  1. 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).
  2. 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.
  3. 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 :

  1. 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.py résout depuis la racine — il faut résoudre depuis slides/<deck>/, comme le fait le vérificateur de la tranche.
  2. 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.py doit 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 :

  • JAMAIS de scan silencieux : si slides/ 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 viser MyIA.AI.Notebooks/ : la résolution doit normaliser les .. avant de tester l'existence, sans quoi tout devient « cassé » ou tout devient « valide ».

Acceptation

  1. check_docs_links.py et check_link_label_agreement.py scannent slides/**/slides.md et détectent les liens relatifs cassés et les labels menteurs.
  2. 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.py pour le modèle de contrôle positif interne).
  3. Les 108 liens relatifs présents sur main restent tous valides → l'organe n'introduit aucun faux positif sur l'existant.
  4. 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

  1. jsboige commented on Sep 12, 2026

    @jsboige
    OwnerAuthor

    [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/

  2. jsboige commented on Sep 12, 2026

    @jsboige
    OwnerAuthor

    @C:/Users/jsboi/AppData/Local/Temp/claude/d--Dev-CoursIA/3f32c854-d818-4829-9a45-ff9c7aac029a/scratchpad/delivered15867.md

  3. added a commit that references this issue on Sep 13, 2026
  4. added a commit that references this issue on Sep 21, 2026
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