Repository navigation
fix(notebook-tools): rename_notebooks.py laisse un 404 silencieux quand un lien relatif change de repertoire #19154
Copy link
Copy link
Open
Labels
bugSomething isn't workingSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
Description
Activity
- added a commit that references this issue
on Oct 5, 2026 - added a commit that references this issue
on Oct 5, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Oct 5, 2026 [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]
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
Ce qui se passe
scripts/notebook_tools/rename_notebooks.pyréécrit le basename d'un lien relatif mais jamaisson 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 :
MyIA.AI.Notebooks/Search/Part1-Foundations/Search-09d-Lean-Discrepancy-Komlos.ipynbMyIA.AI.Notebooks/Search/Discrepancy/Discrepancy-02-Komlos-Lean.ipynbRésultat :
MyIA.AI.Notebooks/SymbolicAI/Lean/Lean-08-Agentic-Proving-Python.ipynba reçu— le nom a suivi, le dossier non (
Part1-Foundations/au lieu deDiscrepancy/).Le
git mva de plus cassé, dans le notebook déplacé lui-même, ses liens versSearch-09c(sonvoisin 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 formefilenamematche : 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 :
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.
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.pyfigure bien dansorgan_argv()(l.724), mais il tourneaprè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.ipynba été refusé en bloc parce qu'une cellule de code (cellule30) 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
2d0ec03d), commentaire c.5984464731