Repository navigation
fix(ci,#14598): re-poser le plafond ICT contre la mesure (30 -> 60 min) - #15761
Conversation
Trois PRs de CONTENU sont mortes le 2026-09-12 sur `timeout-minutes: 30` de `ict-tests.yml` -- #15657 (30,5 min), #15660 (30,4 min), #15609 (30,4 min) -- toutes rendues `cancelled`, aucune `failure`, sur trois lanes et deux workspaces, et toutes porteuses d'un grain `notebook-python`. Le plafond de l'infrastructure tuait exactement le contenu que le protocole demande de produire. Le passage 15 -> 30 (#14598 Option A) avait DEPLACE le mur sans mesurer sa position. Cette PR la mesure. Sonde hors plafond (`ict-tests-profile.yml`, timeout 90 min, MEME commande, MEME pool de runners), job 103508457858 / run 34676978324, runner po-2024-linux-docker-2 : 1076 passed, 3 skipped, 7 warnings in 890.36s (0:14:50) step `Run` = 15,23 min mur Run tue (#15609, job 103531764037, runner po-2024-linux-docker-4), compare sur le PREFIXE STRICTEMENT IDENTIQUE de la suite, memes deux items d'ancrage dans les deux logs : prefixe sonde = 847,22 s prefixe tue = 1737,00 s ratio = 2,050 x Extrapole au total : 30,42 min contre un budget de step de 28,94 min (30 min de job moins 1,06 min d'install). Deficit 89 s, soit 5,1 %. Le plafond de 30 etait pose SUR la frontiere, pas au-dessus : le run tue progressait normalement, a 58 % de la suite, une seconde avant la coupe. 60 min = 3,94 x le nominal mesure et 1,97 x le pire cas observe. Ce n'est pas le correctif de fond : 89 % du temps vit dans 25 items sur 6 modules, et `-n --dist loadscope` ramene le chemin critique a ~4,25 min nominal. C'est le plafond qui cesse de tuer du contenu pendant que la parallelisation se valide -- et le commentaire dit explicitement de le relire quand elle atterrit. Aucune autre region du fichier n'est touchee : les cinq PRs ouvertes sur `ict-tests.yml` (#15665, #15660, #15657, #15627, #15547) editent toutes le bloc de prose des floors (lignes 12-32) et la matrice (lignes 90-110). Ce diff est confine aux lignes 70-76 et ne leur cree aucun conflit. See #14598 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 |
Mesure firsthand du plafond — 4/4 tues au chronometreQuatre derniers passages de la jambe
4/4 tues au plafond Pourquoi c'est une reparation de capacite, pas un confortUn plafond qu'une jambe ne peut pas tenir ne rend aucun verdict. Il rend
Chaque tour consomme 30 min pleines d'un runner du pool le plus charge. Mesure a 13:24Z : Perimetre de ce que la mesure etablit — et de ce qu'elle n'etablit pasElle etablit que 30 min est trop bas. Elle n'etablit pas que 60 est le bon chiffre : la vraie duree de Le controle est deja rendu, lui : la jambe |
Path-collision (organ #13359/#13615)Cette PR #15761 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
La jambe a conclu — le plafond se juge maintenant sur un chiffre, plus sur une coupureComplement a mon commentaire precedent sur les quatre coupures. La mesure pairee a rendu son premier resultat.
Ce que ca etablit pour cette PR precisement :
Une remarque de perimetre, parce qu'elle change l'ordre de valeur des deux PRs : #15762 ramene la jambe a 18.88 min, sous l'ancien plafond de 30, avec 11 min de marge. La parallelisation seule suffisait donc a rendre la jambe verte. Le relevement porte par cette PR est la marge de securite qui absorbe la variance — ce qui reste utile, et se dit mieux ainsi que comme le correctif principal. Mesure faite par ai-01 sur les runs |
Les deux jambes ont conclu — le plafond de 60 min repose maintenant sur une mesureLe contrat annonce plus haut est complet. Les deux jambes
Acceleration mesuree : 1,90x. Ce que ce chiffre etablit, et ce qu'il n'etablit pasIl etablit que 30 etait trop bas. La jambe sequentielle demande 35,85 min : Il etablit aussi que 60 n'est plus une estimation. Le pire cas observe sans Ce qu'il n'etablit pas : que le plafond soit la reparation principale. Avec ControleLe temoin |
Grain: MED/guard — lane myia-ai-01:CoursIA — prev: LIGHT/guard #15732
Résumé
ict-tests.ymlportetimeout-minutes: 30au niveau du job. Le 2026-09-12, trois PRs de contenu sont mortes dessus — #15657 (30,5 min), #15660 (30,4 min), #15609 (30,4 min) — sur trois lanes et deux workspaces, toutes renduescancelled, aucunefailure, et toutes porteuses d'un grainnotebook-python. L'organe d'infrastructure tuait exactement le contenu que le protocole demande de produire.Le passage 15 → 30 (#14598 Option A) avait déplacé le mur sans mesurer sa position. Cette PR la mesure, puis pose le plafond contre la mesure.
La mesure
Sonde hors plafond —
ict-tests-profile.yml(timeout-minutes: 90), même commande (pytest tests, matricetest-args: tests), mêmetest-cwd, même pool de runners ([self-hosted, coursia-ephemeral, coursia-linux]). Job103508457858, run34676978324, runnermyia-po-2024-linux-docker-2:Run tué — #15609, job
103531764037, runnermyia-po-2024-linux-docker-4, stepRun29,13 min, coupé à 58 % de la suite.Les deux runs ne parcourent pas la même portion de la suite : comparer leurs totaux n'aurait aucun sens. La comparaison est donc faite sur le préfixe strictement identique, avec les mêmes deux items d'ancrage présents dans les deux logs :
test_active_inference.py::test_belief_pdf_normalizedtest_pregnance_animat.py::test_behavioral_reversibility_verdictRatio = 2,050 ×. C'est une variance de runner, pas une dérive de la suite : même commande, même code, même pool.
Extrapolé au total : 30,42 min contre un budget de step de 28,94 min (30 min de job − 1,06 min d'install).
Le choix du 60
Choisi contre la mesure, pas contre une marge de confort.
Ce que cette PR n'est pas
Ce n'est pas le correctif de fond. La concentration mesurée sur la sonde (
--durations=25 --durations-min=0) :Les 25 items vivent dans 6 modules ; sous
-n --dist loadscopele chemin critique tombe à ~4,25 min nominal (~8,7 min à 2,05 ×). C'est la suite (#14598 lever (b)), à mon nom également.Le plafond posé ici est ce qui cesse de tuer du contenu pendant que la parallélisation se valide — et le commentaire du fichier le dit explicitement : « A RELIRE quand la parallelisation atterrit : un plafond dimensionne pour une suite sequentielle de 30 min n'a plus de sens sur une suite de 9 min. »
Portée du diff — zéro conflit avec les cinq PRs ouvertes
Cinq PRs ouvertes touchent
ict-tests.yml: #15665, #15660, #15657, #15627, #15547. Toutes éditent le bloc de prose des floors (lignes 12-32) et/ou la matrice (lignes 90-110), avec des valeurs mutuellement contradictoires (678 / 681 / 686 / 686 / 703) issues d'une base où le floor valait 670.Ce diff est confiné aux lignes 70-76. Vérifié hunk par hunk sur les cinq : aucun ne touche cette région. Elles ne prennent donc aucun conflit de ma part.
Le fait que cinq PRs doivent toutes réécrire les mêmes quatre lignes de prose pour ajouter des tests est un aimant à conflits structurel — la prose duplique un nombre qui vit dans la matrice, donc elle ne peut que dériver (elle dit aujourd'hui
1046/670contre1071/692en matrice). Je le traite séparément et après ces cinq merges, pour ne pas imposer un rebase à des PRs de contenu déjà bloquées.Validation
python -c "import yaml; …"→timeout-minutes = 60, YAML valide.python scripts/ci/check_self_hosted_runner_policy.py→OK -- all self-hosted jobs satisfy isolation policy(workflows=159 jobs=202 self_hosted=131).ICT tests/ (56)de cette PR est le contrôle.Note de lecture pour les lanes
Un kill par
timeout-minutesrend conclusioncancelled, jamaisfailure. La couleur ne distingue pas « le code est faux » de « la machine a été coupée ». Le commentaire du fichier porte désormais cet avertissement, pour qu'aucune lane ne se voie imputer un rouge produit par cette ligne.See #14598
🤖 Generated with Claude Code