Repository navigation
tests(picker): la suite du tapis sort sur le reseau -- fetch_visits non simule, timeout selon le cache #20021
Description
Activity
[CLAIMED] lane myia-ai-01:CoursIA-2 -- fond hors ligne pour la suite du tapis (fetch_visits + sondes a defaut reseau) et sentinelle subprocess -- paths: scripts/tests/test_pick_idle_grain_belt.py, scripts/tests/test_pick_idle_grain.py, scripts/tests/conftest.py
[DELIVERED] lane myia-ai-01:CoursIA-2 — PR #20052 (
Grain: MED/guard, headb8001d205).Ce qui manquait :
_patch_belt_networksimulait les sources atteintes avant le garde rouge, maismain()en atteint trois de plus apres (fetch_visitsx2,fetch_series_visits,fetch_merged), et_neutralize_organsne neutralisait pasfetch_check_dwell(gh api .../annotationspar run rouge). Cache chaud → vert ; worktree neuf →ghpour de vrai.La sentinelle demandee :
forbid_shell_escape(conftest) patchesubprocess.run/Popen/check_outputet leve en nommant la commande refusee. Elle derive deBaseException: le code sous test avaleOSError/RuntimeErrordans sesexcept, unAssertionErroraurait disparu et le test serait reste vert sur un corpus vide.Controle positif (cache froid,
GH_TOKEN=invalid, sur le code d'avant) — la sentinelle rougit et nomme la source :ShellEscape: reseau non simule : ce test a lance un processus (gh pr list --state merged --search merged:>=2026-10-08 merged:<2026-10-10 --limit 1000 --json number,title,body,mergedAt) 3 failed, 44 passed in 0.93sApres correctif :
297 passed in 0.85s(worktree neuf,LOCALAPPDATAsur un repertoire vide,GH_TOKEN=invalid), et 0 processus lance sous un bannissement global (-p probe_sentinel, qui refusesubprocess.run/Popen/check_outputpour toute la famille, pas seulement les modules touches).Note de mesure : il n'y a pas de
timeoutdanspytest.ini(ni--timeoutdans les workflows qui lancent cette suite) — le critere de mort tient donc sur la duree mesuree et sur le zero processus, pas sur un plafond chiffre que je n'ai pas trouve.Effet de bord mesure : le bannissement global a fait rougir 4 tests de
test_pick_idle_grain.pyqui passaient parred_backlog(test_distinct_organs_under_one_aggregate_are_not_imputed,test_aggregate_with_unreadable_organ_stays_with_lane,test_untagged_pr_never_corroborates,test_rollup_stack_does_not_self_corroborate) — corriges par la neutralisation par defaut defetch_check_dwell, pas test par test. Les deux tests DWELL re-patchent desormais apres_patch_backlog(convention deja en vigueur dans le fichier pourfetch_lane_record_prs).Je ferme cette issue : son critère de mort est atteint sur
main, mesuré par le coordinateur le 2026-10-09 à 10:5xZ.Mesure. Worktree neuf, détaché sur
origin/maindfaacc3574, cache pytest désactivé (-p no:cacheprovider),GH_TOKEN=invalid:python -m pytest scripts/tests/test_pick_idle_grain*.py -q 303 passed, 1 warning in 4.95sLa suite passe sans réseau, très en dessous du plafond de 30 s de
pytest.ini.Qui l'a livré. #19913 (mergée à 10:14:34Z) a coupé les sources réseau du fichier du tapis. Elle y a aussi posé la sentinelle
_RealGhReached(scripts/tests/test_pick_idle_grain_belt.py:67), qui lève si un test atteintgh. Cela couvre les attendus 1 et 2 pour le fichier où le défaut avait été mesuré.#20052 reste ouverte, comme extension au fichier frère
test_pick_idle_grain.py. Elle cite cette issue parSee, ne la ferme pas, et n'est pas nécessaire à sa mort. Cette mesure a été rapportée d'abord par la lanemyia-ai-01:CoursIA-2(258 passed), puis re-mesurée ici de première main.
Constat (mesuré le 2026-10-09 par le coordinateur)
scripts/tests/test_pick_idle_grain_belt.py::test_belt_json_emits_single_document_when_red_presentn'est pas hors ligne._patch_belt_networksimulefetch_open_prs,fetch_pool,fetch_pr_stateset les claims, mais pasfetch_visits. Ormain()l'appelle deux fois, la seconde sur la fenêtre longueLONG_VISITS_WINDOW_DAYS, présente depuisb3a7444cc5(2026-09-18).pytest.ini. Trace :pick_idle_grain.pymain → fetch_visits → cited_issues.subprocess.communicateréel même avec-o timeout=240. fix(picker,#19907): 3e surface de livraison (PR MERGEE <90j citant #N) #19913 ajoute une 3e sonde de livraison (merged_pr_signal) dont le défaut sort sur le réseau. La PR l'inerte explicitement dans 3 tests, et c'est ce qui révèle la forme du défaut : chaque test doit penser à couper le réseau.Ce qui est attendu
_patch_belt_network(ou une fixture commune) coupe toutes les sources réseau demain(),fetch_visitscompris.subprocess.run/Popenqui lève si un test du tapis lancegh. Un futur appel réseau non simulé devient alors un échec immédiat et nommé, au lieu d'un timeout dépendant du cache.mainactuel pour..._red_present, et verdit après le correctif, dans un worktree au cache froid.Critère de mort
La suite
test_pick_idle_grain*.pypasse dans un worktree neuf sans réseau (par exempleGH_TOKEN=invalid), sous le plafond depytest.ini.See #19913 · See #19907