Skip to content

fix(notebook-tools): rename_notebooks.py laisse un 404 silencieux quand un lien relatif change de repertoire #19154

Description

@jsboige

Ce qui se passe

scripts/notebook_tools/rename_notebooks.py réécrit le basename d'un lien relatif mais jamais
son préfixe de répertoire
. Quand la cible change de dossier, le lien produit pointe un chemin qui
n'existe pas — un 404 silencieux : l'organe écrit le fichier, et seuls les gardes CI le
découvrent après coup.

Mesure (PR #19151, mouvement 09d → Discrepancy/)

Table de mapping :

Ancien chemin Nouveau chemin
MyIA.AI.Notebooks/Search/Part1-Foundations/Search-09d-Lean-Discrepancy-Komlos.ipynb MyIA.AI.Notebooks/Search/Discrepancy/Discrepancy-02-Komlos-Lean.ipynb

Résultat : MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-08-Agentic-Proving-Python.ipynb a reçu

[Search-09d](../../Search/Part1-Foundations/Discrepancy-02-Komlos-Lean.ipynb)

— le nom a suivi, le dossier non (Part1-Foundations/ au lieu de Discrepancy/).

Le git mv a de plus cassé, dans le notebook déplacé lui-même, ses liens vers Search-09c (son
voisin de dossier avant le mouvement). La CI n'en a signalé qu'un des six ; les trois du notebook
déplacé lui sont structurellement invisibles, puisque le fichier est déplacé et que le garde ne
recompare pas ses liens internes à sa nouvelle base.

Mécanisme

build_patterns() (l.444-476) construit quatre formes par renommage — full, filename, stem,
urlencoded — triées par longueur décroissante. Sur un lien relatif, seule la forme filename
matche : le préfixe ../../Search/Part1-Foundations/ survit intact.

Le commentaire l.469-472 dit qu'« un référent embarqué dans un chemin relatif est un référent comme
un autre ». C'est vrai du nom, faux du chemin : le préfixe est justement ce qu'il faut
recalculer, et rien dans l'outil ne le fait.

Comportement attendu

Deux options, la seconde étant la plus petite :

  1. Recalculer le préfixe relatif — résoudre le lien depuis le fichier porteur, appliquer le
    déplacement, réécrire le chemin relatif complet. C'est le geste juste, mais il demande de
    distinguer un lien d'une mention en prose.
  2. Refuser en fail-closed un fichier qui contient un lien relatif dont la cible change de
    dossier — c'est exactement la doctrine que l'outil applique déjà aux cellules de code (I2) et aux
    sorties committées (I3). Un refus se voit dans le plan ; un 404 silencieux, non.

L'organe check_notebook_navlinks.py figure bien dans organ_argv() (l.724), mais il tourne
après l'écriture : il signale au lieu d'empêcher. La garde fail-closed de rewrite_file
(l.685-707) ne couvre que les surfaces ipynb, pas la validité des liens.

Point connexe, à trancher plutôt qu'à corriger ici

Lean-07b-Examples-Python.ipynb a été refusé en bloc parce qu'une cellule de code (cellule
30) cite l'ancien nom — alors que son lien markdown (cellule 28) était réparable et l'a été
manuellement dans #19151. Le refus en bloc est défendable (il évite un état mixte), mais il laisse un
404 que l'outil aurait pu nommer comme résidu dans son plan. Une sortie « surfaces refusées +
occurrences restantes par surface » rendrait le résidu directement actionnable.

Références

Activity

  1. myia-ai-01 commented on Oct 4, 2026

    @myia-ai-01
    Collaborator

    [CLAIMED] lane myia-po-2024:CoursIA — recalcul du préfixe relatif des liens au renommage, posé au dispatch par le coordinateur (la même lane porte #19157 et #19159 sur ce fichier, en série) -- paths: scripts/notebook_tools/rename_notebooks.py, scripts/notebook_tools/tests/test_rename_notebooks.py

  2. added a commit that references this issue on Oct 5, 2026
  3. added a commit that references this issue on Oct 5, 2026
  4. added
    candidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
    on Oct 5, 2026
  5. added 2 commits that reference this issue on Oct 6, 2026
  6. added 2 commits that reference this issue on Oct 7, 2026
  7. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLOSURE PREFLIGHT]
    schema: 1
    lane: myia-po-2026:CoursIA-3
    issue: 19154
    verdict: CLOSE
    acceptance:

    • Choix d'option parmi les deux du body -> TRANCHE : option 2 (refus fail-closed d'un lien relatif dont la cible change de dossier), la plus petite, livree par myia-po-2024:CoursIA
    • Implementation de la garde -> LIVREE : PR fix(tool,#19154): rename_notebooks.py -- refus fail-closed des liens relatifs au changement de dossier #19173 MERGED ; verifie firsthand sur origin/main : helper _path_context_hits + champ Plan.path_refused (rename_notebooks.py l.554, tagge fix(notebook-tools): rename_notebooks.py laisse un 404 silencieux quand un lien relatif change de repertoire #19154) + extension _same_name_detection (renommages a nom conserve, nee de la validation sur arbre reel -- reserve Hermes) ; docstrings l.522-570 documentent la doctrine fail-closed assumee
    • Validation -> LIVREE : 7 tests nouveaux dans TestRelativeLinkDirChangeRefused (classe presente sur origin/main), 42/42 verts en run local ; dry-run sur arbre reel avec renommage inter-repertoires (Search-11d Part1-Foundations vers Part2-Structures) : 4 reecrits + 2 refus exacts, arbre intact ; regression meme-dossier testee (garde sautee quand dir_change vide)
    • Le cas mesure du body (lien Lean-08 vers Search-09d, prefixe Part1-Foundations au lieu de Discrepancy/) -> couvert par la garde a venir : ce mouvement a deja ete repare manuellement dans refactor(search,#17802): descente de 09d dans Discrepancy/ -- Discrepancy-02-Komlos-Lean #19151 ; la garde empeche sa reproduction
    • Points connexes (refus en bloc Lean-07b cellule 30, sortie surfaces refusees + occurrences restantes) -> hors scope declare par le body lui-meme (« a trancher plutôt qu'à corriger ici ») et par la PR, pas une acceptance de cette issue
      residue: none
      open-prs: 0
      comments-reviewed: 1
      [/CLOSURE PREFLIGHT]
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

    bugSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions