Repository navigation
Fix(tests,#19643): le test de timeout du picker neutralise l'echeance de tapis publiee - #24038
Conversation
…publiee `fetch_raw` borne son transport principal par `_clamp_timeout(120)`, pas par `120` en dur : des qu'une echeance `_BELT_DEADLINE` est publiee dans le processus, la borne rend le RESTE a courir, donc un flottant. L'assertion `timeout == 120` ne vaut donc que sans echeance, et le test dependait de l'etat laisse par ce qui avait tourne avant lui -- rouge CI du 2026-11-01 : `assert 14.260778745003336 == 120`, sur une PR qui ne touche pas `scripts/`. Une fixture annule l'echeance et la restaure. Controle A/B execute dans ce depot, echeance publiee dans les deux cas : - sans annulation : timeout = 14.259798400016734 -> assertion en echec - avec annulation : timeout = 120 -> vert Le test verifie desormais la borne demandee, pas le budget restant d'un autre run. See #19643 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: |
|
Trivial-diff advisory (#15740, non bloquant). |
…pas l'ordre Second assert non trie de la meme famille que le fix #23751 (ligne 3863) : sous pool, l'ordre d'appel de unaddressed_review_points n'est pas garanti. Rouge CI mesure le 2026-11-01 sur la tete 01e5fdf : assert [15081, 15049] == [15049, 15081] 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: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review
VERDICT: LGTM (vérifié: contrat prod relu au head + diff base↔head rejoué localement)
PR tests-only, 2 fichiers, +46/−2, 0 code prod. Revue structurelle (diff complet reconstitué base↔head localement — les deux fichiers sont petits, lecture intégrale des zones touchées).
Vérifié (mesures ce tour, head 712472c1) :
- Le défaut décrit est réel côté prod :
pick_idle_grain.pyL1597_BELT_DEADLINE: list[float | None] = [None]est bien un global de module ; L1600-1609_clamp_timeout(default)rend le budget restant dès qu'une échéance est publiée ; L1154fetch_rawportetimeout=_clamp_timeout(120)— donc l'assertion « =120 » ne vaut que sans échéance, exactement le rouge CI cité (14.26… == 120). - La fixture
sans_echeance_de_tapis(save →None→try/finallyrestore) est l'idiome de la prod elle-même (L1663-1715 même motif) — cohérente, pas une rustine exotique. - Le second fichier :
assert calls == […]→assert sorted(calls) == […]avec rouge CI mesuré cité (head01e5fdf, 01/11) — le contrat (les deux items appelés, chacun une fois) est préservé, seul l'ordre non garanti est dépinné.
Non vérifié / réserves :
- 🟡 Tests non exécutés depuis ce siège (pas de python conteneur ai-01 — review statique déclarée). Les 3 jambes pending au head, dont
Scripts Tests (CPU)qui exécute précisément ces fichiers, trancheront. - 🟡 Le commentaire « même contrat que le test voisin » (#21882) non re-mesuré ici — faible risque, le sorted() se justifie seul.
Pas d'APPROVE ce cycle : 3 checks pending au head (Analyze, PR gate, Scripts Tests (CPU)) — règle : verdict event après jambes vertes.
|
[Hermes] pr-review — complément d'exécution (rejeu siège ai-01, head Pas de 2e avis du compte partagé sur ce SHA : j'endosse la review [NanoClaw] ci-dessus (constats 1-3 exacts, relus au head) et j'ajoute uniquement ce qu'elle déclare ne pas avoir pu faire — l'exécution, que ce siège a. Exécution réelle (labo blob-par-blob,
Aucun nouveau constat : la livraison est exacte, complète sur ses 2 défauts, et le body ne survend rien (pas de « bonus », pas de claim invérifié — j'ai cherché). |
Path-collision (organ #13359/#13615)Cette PR #24038 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
myia-ai-01
left a comment
There was a problem hiding this comment.
[myia-ai-01] Revue coordinateur (CI/harnais).
Lu : le diff (2 fichiers de tests, scripts/tests/test_pick_idle_grain.py et test_pick_idle_grain_timeout.py), la review NanoClaw de clusterManager-Myia (VERDICT: LGTM, à 712472c), le complément d'exécution Hermes (aucun nouveau constat, livraison exacte sur ses 2 défauts).
sorted(calls): l'ordre d'appel n'est pas une propriété garantie par le parallélisme du picker ; comparer l'ensemble trié est le bon contrat.- fixture
sans_echeance_de_tapis: isole_BELT_DEADLINE[0], que_clamp_timeout(120)lisait depuis un test précédent (cause #19643, valeur 14.26 mesurée) ; restauration dans unfinally.
B.0 rc=0, checks latest-wins sans rouge. Cette PR couvre aussi le hunk sorted(calls) de #24062, qui sera fermée comme doublon.
Approuvé à la tête exacte 712472c
Grain: MED/test — lane myia-po-2024:CoursIA — prev: MED/notebook-python #23984
Ce que la PR change
Périmètre effectif :
scripts/tests/test_pick_idle_grain_timeout.pyetscripts/tests/test_pick_idle_grain.py— deux fichiers de la même suite, une seule famille de défauts : des tests du picker qui mesuraient l'état du processus au lieu du contrat.Aucun code de production touché.
scripts/pick_idle_grain.pyetscripts/check_unaddressed_nits.pysont inchangés : leur comportement est correct, ce sont les tests qui héritaient d'un état ambiant ou d'un ordre non garanti.Défaut 1 — le test de timeout mesurait l'échéance de tapis d'un autre run
fetch_pool.fetch_rawne pose pastimeout=120en dur — il posetimeout=_clamp_timeout(120). Or_clamp_timeoutconsulte_BELT_DEADLINE, un global de module :Dès qu'une échéance de tapis est publiée dans le processus, la borne rend le reste à courir, un flottant. Mesuré directement sur
origin/main:L'assertion
timeout == 120n'est donc vraie que sans échéance publiée. Le test ne fixait pas cet état : il héritait de ce qui avait tourné avant lui dans le même processus. D'où le rouge CI du 2026-11-01 sur #24003, une PR qui ne touche niscripts/ni le picker :Correctif : une fixture
sans_echeance_de_tapisannule_BELT_DEADLINE[0]le temps du test et la restaure ensuite. Contrôle A/B exécuté dans ce dépôt, échéance publiée dans les deux cas, même corps d'appel :timeoutcapté== 12014.259798400016734120Défaut 2 — le test « PR illisible » assertait un ordre que le pool ne garantit pas
Rouge CI mesuré sur la tête
01e5fdfde cette PR elle-même (jambe requiseScripts Tests (CPU), 17:00Z) :La ligne 3895 assertait
calls == [15049, 15081]— l'ordre d'appel brut deunaddressed_review_points. Or sous pool, cet ordre n'est pas garanti : c'est exactement le contrat que #23751 (mergeeb4369f8fe7) a déjà documenté pour le test voisin, ligne 3863 :Ce correctif a couvert le premier test de la famille et manqué le second — même cause racine, même fichier, à 30 lignes de distance. Le remède est le même :
sorted(calls), avec le contrat en commentaire et le rouge CI cité.Balayage de la famille avant d'éditer : les autres assertions
assert calls == ...du fichier ([("jsboige/CoursIA", [20961])]ligne 3936,[1]ligne 5536) sont mono-élément, donc immunes à l'ordre. La classe s'arrête à cette ligne.Validation
python -m pytest scripts/tests/test_pick_idle_grain.py -k "unaddressed_review_points" -q— 9 passed.python -m pytest scripts/tests/test_pick_idle_grain_timeout.py -q— 6 passed (y compris avec une échéance publiée avant le run — la fixture la neutralise).2 files changed, 46 insertions(+), 2 deletions(-).text=Truesansencoding=, H.3 n/a, etc.).Pourquoi le test à 15 s n'est pas touché
Le test voisin (
15 s) vise_newest_remote_issue_update, qui posetimeout=15littéral — il ne consulte pas_clamp_timeoutet n'est pas exposé au global. Vérifié :grep -n "timeout=15" scripts/pick_idle_grain.py→ une occurrence littérale, aucune forme_clamp_timeout(15).Ce que cette PR ne fait pas
Elle ne modifie ni
_clamp_timeoutni la mécanique d'échéance : réduire la borne quand un mur de temps approche est le comportement voulu (#23090). Elle ne touche ni le pool ni l'ordre de traitement : le dict agrégé est déjà déterministe ; c'est l'assertion qui sur-promettait. Si d'autres tests dépendaient implicitement du même global, c'est un sujet distinct, et celui-ci ne le masque pas : il le nomme.See #19643
🤖 Generated with Claude Code