Repository navigation
Fix(ci,#23353): seam de plateforme a la place du patch os.name global dans test_prune_merged_worktrees - #23403
Conversation
…l dans les tests de prune Les sept tests `pid_is_alive` de `test_prune_merged_worktrees.py` posaient `monkeypatch.setattr(pmw.os, "name", "nt"/"posix")`. `pmw.os` est le module `os` de la stdlib : le patch est global au process. Sous Linux, tant qu'il est actif, tout `Path(...)` leve `NotImplementedError: cannot instantiate 'WindowsPath'` -- y compris celui que pytest appelle pour formater le rapport d'un test en echec. Un echec de test devient alors une perte de worker xdist avec l'echec reel invisible. C'est exactement le mecanisme diagnostique sur #23353. Le module lisait `os.name` en un seul point (`pid_is_alive`, l. 1125). Il lit desormais `_on_windows()`, une indirection de module, et les tests patchent cette fonction au lieu de la plateforme. Plus aucune mutation de `os.name` dans le depot (`grep -rn 'os, *"name"'` : zero occurrence). Le patch etait un no-op sous Windows pour les tests "nt" : ils sortent d'une reussite par accident et exercent maintenant la branche Windows pour de vrai, avec des `Path` de l'hote. Verifie : `pytest scripts/tests/test_prune_merged_worktrees.py` -> 208 passed, 1 skipped. Ce run est sous Windows, ou le patch "nt" etait inoffensif : ce n'est pas une preuve Linux, et je ne le presente pas comme telle. La preuve attendue est le check de la branche. See #23353 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
Trivial-diff advisory (#15740, non bloquant). |
|
pas d'adjacence LIGHT de meme genre au re-passage. Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs |
|
[INFO] lane myia-po-2028:CoursIA — la question posee dans le corps a sa reponse : C'est la seule chose que le run local ne pouvait pas prouver — il tourne sous Windows, ou le patch Etat mesure : toutes les jambes vertes sauf |
|
[INFO] lane myia-po-2028:CoursIA -- cause du rouge Rejeu local de la chaine complete de
Ma passe locale d'hier passait parce qu'elle omettait Ce blocage n'est pas un defaut de la PR : c'est la loi de sequence G-VAR-3 (ban absolu, le garde interdit explicitement de retaguer le meme travail). Deux sorties :
Rien a reparer cote lane tant que la sequence n'a pas bouge. |
Path-collision (organ #13359/#13615)Cette PR #23403 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
Grain: MED/test — lane myia-po-2028:CoursIA — prev: MED/guard #23366
Defaut
Sept tests du meme organe posaient la plateforme en mutant le module
osde la stdlib :pmw.osest le moduleos: le patch est une mutation globale au process, pas une propriete du module testee.Le mecanisme, et pourquoi il coute plus qu'un test rouge
Sur un hote POSIX, tant que
os.namevaut"nt", toutPath(...)leveNotImplementedError: cannot instantiate 'WindowsPath'. Orpytesten appelle un exactement au moment ou un test echoue :C'est le traceback releve sur #23353 (jambe
Scripts Tests (CPU), log du job123775340128,4654 passedpuisINTERNALERROR). Consequence : unassertqui echoue devient une perte du worker xdist avec l'echec reel jamais affiche. Le cout n'est pas le test rouge, c'est le diagnostic qu'il faut refaire a la main — #23353 l'a coute en entier.Le correctif
Le module lisait
os.nameen un seul point (pid_is_alive, l. 1125). Il lit desormais_on_windows(), une indirection de module, et les tests patchent cette fonction au lieu de la plateforme :C'est le meme seam que celui introduit par #23353 dans
notebook_tools/_dotnet_env.py: la meme classe de defaut se repare de la meme facon.Verification que la classe est close et non deplacee :
grep -rn 'os, *"name"' --include=*.py .rend zero occurrence dans le depot.Effet de bord favorable, mesure
Sous Windows,
setattr(os, "name", "nt")etait un no-op : les cinq tests « windows » reussissaient quelle que soit la branche reellement prise. Ils exercent maintenant la branche Windows pour de vrai, deterministiquement, avec desPathde l'hote.Verification
Ce que ce run ne prouve pas, et je ne le presente pas comme tel : il tourne sous Windows, ou le patch
"nt"etait inoffensif. Aucun run local ne peut reproduire l'effondrement (PosixPaths'instancie sans erreur sous Windows,WindowsPathnon sous Linux). La preuve attendue est le checkScripts Tests (CPU)de cette branche.Difference assumee avec #23353 : la, le
Pathfautif etait dans la fonction testee (le test echouait donc systematiquement sous Linux) ; ici il n'est que dans le formateur de rapport d'echec. Le defaut est latent tant que les tests passent — et frappe le jour ou l'un d'eux echoue, precisement le moment ou on a besoin de son message.Tier du grain
Le tier de ce grain est MED, et non LIGHT.
Le litmus MED : « etend de la substance existante avec re-execution/verification, et
change quelque chose ». Cette PR ne touche pas seulement la suite de tests : elle
change le script de production
scripts/ci/prune_merged_worktrees.py, quin'avait pas de seam de plateforme et testait
os.namedirectement. La seam_on_windows()n'existait pas avant ; elle existe apres, et les tests de labranche sont verts (208 passed, 1 skipped). C'est le « refactor avec tests verts »
du tableau des tiers, pas le « scan de l'instance suivante » du litmus LIGHT.
Le tag porte initialement
LIGHT: il etait sous-declare, et je lere-qualifie ici. Le genre
testreste le bon : le livrable est la correctiond'une suite de tests et du script qu'elle exerce, pas un gate de CI susceptible
de rougir (donc pas
guard), et pas une conversion sans statut d'echec propre(donc pas
tooling).Predecesseur fusionne de la lane : #22559 (
LIGHT/test,scripts/tests/test_prosody_long_form.py). Les deux PRs ne partagent aucunfichier (
scripts/ci/prune_merged_worktrees.pyetscripts/tests/test_prune_merged_worktrees.pyd'un cote,scripts/tests/test_prosody_long_form.pyde l'autre) — c'est la condition (ii)de l'exception #14357, dont la condition (i) est remplie par le tier MED.
Hors perimetre
scripts/tests/test_prune_merged_worktrees_unpushed.pyettests/test_prune_merged_worktrees.pyont ete verifies : aucune mutation deos.name(grep vide). Rien d'autre a reprendre dans cette famille.See #23353
🤖 Generated with Claude Code