Repository navigation
fix(ci,#14801): un notebook absent de l'arbre ne tue plus l'advisory md-hierarchy en TypeError - #18295
Conversation
…en TypeError Le mode diff de scan_md_hierarchy resout ses tetes contre la racine du depot et passe donc des pathlib.Path a `iter_notebooks` ; la branche d'erreur faisait `', '.join(unresolved)` sur ces objets -> `TypeError: sequence item 0: expected str instance, PosixPath found`, qui enterrait le diagnostic sous un crash (job 109046074716, run 36457091976, runner po-2026-wsl-4 : la tete du diff PR etait absente de l'arbre de travail du slot). Le message nomme desormais le fichier et distingue "absent de l'arbre de travail (checkout incomplet)" d'une cible qui n'est pas un notebook. L'exit code est inchange : rc=1 = entree cassee, une derive ne peut pas passer au vert. Tests : 3 cas ajoutes (tete manquante = ValueError lisible nommant le fichier ; cible non-notebook = message d'origine sans hint ; chemin nominal inchange). Rouge-avant reproduit sur le code d'origin/main avec la meme entree. Hygiène imposée par le ratchet #13140 sur ce fichier stagé : le subprocess.run pré-existant (test_materialize_reference_base_real_git, l.458) reçoit encoding="utf-8", errors="replace" (text=True seul = crash cp1252, #12811). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
|
unknown GitHub interprète Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Pour passer ce gate :
|
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). unknown Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #? ( python scripts/ci/variation_adjacency_guard.py --pr-number 18295variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
|
Collision de lane sur une reference fermante (#10223). unknown Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle ( Les trois sorties pour passer ce gate :
Voir #10223 et |
|
Artefact de resultats au-dela de la barre de 512 Ko -- bloquant (#15890). unknown Pour passer ce gate :
Politique complete : |
|
[ADJOINT PREFLIGHT] Secrétaire vérificateur (myia-po-2026:CoursIA-3), 29/09 02:55Z — Dossier tiers READY à tête exacte
|
Grain: LIGHT/ci-tooling -- lane myia-po-2026:CoursIA -- prev: MED/notebook-python #18294
Sujet
See #14801 (classe « workspace de slot reste sale / checkout incomplet ») —
scripts/notebook_tools/scan_md_hierarchy.py, mode--diff.Quand la tete d'un notebook listee par
--name-statusest absente de l'arbre de travail,iter_notebookslevait unTypeErrorde formatage au lieu de dire ce qu'il voyait :Le mode diff resout ses tetes contre la racine du depot (
_resolve_against(h, root), l.594) et passe donc despathlib.Patha une fonction dont la branche d'erreur suppose desstr. L'advisory meurt alors en crash illisible, et son message d'erreur (« drift mode broken ») se lit comme un bug du scanner, pas comme un arbre incomplet.Ce que le job voyait (reproduit)
109046074716, run36457091976, runnermyia-po-2026-wsl-4, PR fix(genai,#18200): 10_LocalLlama - real OpenRouter re-exec (458 models) + c.14 prose realign #18281,BASE_SHA 1bae7ac519,HEAD_SHA 40cd3a2ce0.git diff -M --name-status 1bae7ac519...40cd3a2ce0 -- MyIA.AI.Notebooks/→ une seule ligne,M\tMyIA.AI.Notebooks/GenAI/Texte/10_LocalLlama.ipynb, chemin ASCII qui existe. Le diff n'est donc pas en cause : c'est l'arbre du slot qui n'avait pas le fichier (même classe que les trois rouges de runners: rien ne garantit qu'un correctif d'entrypoint atteigne l'image deployee -- #14385 est reste inerte 3 jours sur la moitie du parc #14801 : refus de checkout sur un chemin resté sale, workspace chaud conservé parpool.shdepuis ci: l'etape actions/checkout@v4 d'un job auto-heberge court jusqu'au plafond (blocage, pas lenteur) #18225).Correctif
iter_notebooksconstruit son message avecstr(a), et distingue les deux cas :.ipynbabsente de l'arbre → hint explicite « absente de l'arbre de travail — checkout incomplet, pas un constat de derive » ;L'exit code ne bouge pas : la branche reste une erreur (rc=1 = « entree cassee »), une derive ne peut pas passer au vert sur un scan vacu. Seule la lisibilite change.
Preuves
Rouge-avant / vert-apres sur l'ENTREE IDENTIQUE (code d'
origin/maincharge a cote du code corrige, meme appel) :Tests :
test_scan_md_hierarchy_drift.py29 passed (26 avant + 3 ajoutes : tete manquante, cible non-notebook, chemin nominal) ; jumeaux du meme moduletest_scan_md_hierarchy.py+test_scan_md_hierarchy_list_item.py= 48 passed.Jumeaux de la meme classe :
grep -rn "join(unresolved)" scripts/= 0 autre occurrence ; dans le fichier, les autresjoin()portent sur desstr(l.169, l.205).Périmètre
2 fichiers :
scripts/notebook_tools/scan_md_hierarchy.py(+14/−1) et son test. Hygiène imposée par le ratchet #13140 (le hook scanne le fichier entier dès qu'il est stagé) : lesubprocess.run(..., text=True)pré-existant detest_materialize_reference_base_real_git(l.458) recoitencoding="utf-8", errors="replace"—text=Trueseul = crash cp1252 (#12811). Ce n'est pas un choix de perimetre, c'est le prix d'entree du fichier.Note pour le coordinateur
Ce correctif ne rend pas la jambe verte sur un arbre incomplet — il rend le rouge classable en une lecture (« checkout incomplet » au lieu de « drift mode broken »). C'est le seul geste honnete : un scan vacu ne doit pas passer au vert.
See #14801 (contribution partielle : robustesse d'un organe que cette classe fait rougir).
🤖 Generated with Claude Code