From 73a8e224c9e986e8053aedb7be45ca9ed0919f67 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 14 Sep 2026 03:01:23 +0200 Subject: [PATCH 1/5] fix(ci,#15853): relever le plafond de Scripts Tests (CPU) de 20 a 30 min Les jambes qui vont au bout montent a 19,8 min post-xdist (mediane 17,5) contre un plafond a 20 : une marge d'une minute, qui fait rougir un check REQUIS sur la variance du pool plutot que sur du fond. 30 reste sous les deux plafonds englobants (pr_gate.py --timeout-min 45, pr-gate.yml timeout-minutes: 52). Portee honnete : 1 des 16 annulations mesurees depuis le merge de xdist. Les 15 autres sont des supplantations de file sur main (job jamais demarre), cause distincte documentee sur #15853. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/scripts-tests.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index 0ddff03c8e..9a86e8d64a 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -125,7 +125,18 @@ jobs: # fork n'atteint le runner. Retour arriere = revert de la PR. runs-on: [self-hosted, coursia-ephemeral, coursia-linux] if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository - timeout-minutes: 20 + # Plafond 20 -> 30 (#15853). Mesure du 2026-09-14 sur les 26 runs conclus + # depuis le merge de xdist (#15833, 2026-09-13T23:08:18Z) : les jambes qui + # vont au bout tiennent 17,5 min de mediane, mais montent a 19,8 min -- + # une minute sous l'ancien plafond. Une marge d'une minute fait rougir un + # check REQUIS sur la variance du pool, jamais sur du fond. + # 30 reste sous les deux plafonds qui l'englobent : l'agregateur pr_gate.py + # (--timeout-min 45) et le job pr-gate.yml (timeout-minutes: 52). + # NB -- ce relevement ne traite QU'UNE des 16 annulations mesurees sur la + # periode. Les 15 autres sont des supplantations de file (rafale de merges + # sur main, meme groupe de concurrence, job jamais demarre : le tableau + # "jobs" de ces runs y est vide). Cause distincte, mesuree sur #15853. + timeout-minutes: 30 steps: # ------------------------------------------------------------------ From 9e1c4fefa5d63e4e19bb41056992304511c170f5 Mon Sep 17 00:00:00 2001 From: jsboige Date: Mon, 14 Sep 2026 03:30:34 +0200 Subject: [PATCH 2/5] test(ci,#15853): deplacer le cliquet du plafond declare avec le workflow (20 -> 30) test_declared_wall_is_read_from_the_real_workflows lit le depot REEL et non une fixture : y epingler la valeur est delibere -- c'est ce qui rend un changement de plafond visible et impossible a glisser en silence. Le cliquet a fait son travail en rougissant sur cette PR. Il se deplace donc AVEC le workflow, dans le meme commit, plutot que d'etre desserre en assertion lache. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/tests/test_pr_gate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/tests/test_pr_gate.py b/scripts/tests/test_pr_gate.py index 8cff95586e..e75ee987da 100644 --- a/scripts/tests/test_pr_gate.py +++ b/scripts/tests/test_pr_gate.py @@ -1991,7 +1991,7 @@ def _decide_with_walls(checks, walls): def test_declared_wall_is_read_from_the_real_workflows(): """Le cas fondateur, lu sur le depot et non sur une fixture.""" walls = pr_gate.derive_declared_timeouts() - assert walls.get("Scripts Tests (CPU)") == 20 + assert walls.get("Scripts Tests (CPU)") == 30 def test_declared_timeouts_tolerate_an_unreadable_state(tmp_path): From cb82d050135598f1b4db156735fa7086cb8d2d29 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 15 Sep 2026 06:20:43 +0200 Subject: [PATCH 3/5] =?UTF-8?q?fix(ci,#15853):=20reecrire=20le=20commentai?= =?UTF-8?q?re=20du=20plafond=20au=20niveau=20job=20=E2=80=94=20chiffres=20?= =?UTF-8?q?run-level=20retires=20(#16087)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 --- .github/workflows/scripts-tests.yml | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index 9a86e8d64a..b92f1392c8 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -125,17 +125,23 @@ jobs: # fork n'atteint le runner. Retour arriere = revert de la PR. runs-on: [self-hosted, coursia-ephemeral, coursia-linux] if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository - # Plafond 20 -> 30 (#15853). Mesure du 2026-09-14 sur les 26 runs conclus - # depuis le merge de xdist (#15833, 2026-09-13T23:08:18Z) : les jambes qui - # vont au bout tiennent 17,5 min de mediane, mais montent a 19,8 min -- - # une minute sous l'ancien plafond. Une marge d'une minute fait rougir un - # check REQUIS sur la variance du pool, jamais sur du fond. + # Plafond 20 -> 30 (#15853). Mesure du 2026-09-14 au niveau JOB + # (started_at -> completed_at), la grandeur sur laquelle timeout-minutes + # agit : sur les 30 runs conclus depuis le merge de xdist (#15833, + # 2026-09-13T23:08:18Z), 15 portent un job -- 8 succes (le plus long + # 18,4 min), 5 echecs, 2 annulations dont le temoin 34788823010 coupe a + # 20,3 min -- et 15 sont des supplantations de file (jobs: [], jamais + # demarres, hors de toute discussion de plafond). Aucun job qui reussit + # ne depasse 18,4 min et pourtant un job a atteint 20,3 min et s'est + # fait couper : la queue traverse l'ancien plafond de 20 alors que le + # corps reste 1,6 min en dessous -- la variance du pool decide, pas le + # fond des tests. + # (Les chiffres run-level qui figuraient ici en v1 -- 26 runs, mediane + # 17,5 min, max 19,8 min, 16 annulations -- couvraient la file d'attente + # et, pour un rerun, les deux tentatives : mauvaise grandeur, retiree ; + # retraction ecrite en tete du body de #16087.) # 30 reste sous les deux plafonds qui l'englobent : l'agregateur pr_gate.py # (--timeout-min 45) et le job pr-gate.yml (timeout-minutes: 52). - # NB -- ce relevement ne traite QU'UNE des 16 annulations mesurees sur la - # periode. Les 15 autres sont des supplantations de file (rafale de merges - # sur main, meme groupe de concurrence, job jamais demarre : le tableau - # "jobs" de ces runs y est vide). Cause distincte, mesuree sur #15853. timeout-minutes: 30 steps: From e56636d048c8218e502eff488ab3f118e511c5c2 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 15 Sep 2026 09:32:35 +0200 Subject: [PATCH 4/5] fix(ci): make timeout evidence reproducible Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/scripts-tests.yml | 48 +++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index b92f1392c8..9ac70c3f72 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -125,23 +125,37 @@ jobs: # fork n'atteint le runner. Retour arriere = revert de la PR. runs-on: [self-hosted, coursia-ephemeral, coursia-linux] if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository - # Plafond 20 -> 30 (#15853). Mesure du 2026-09-14 au niveau JOB - # (started_at -> completed_at), la grandeur sur laquelle timeout-minutes - # agit : sur les 30 runs conclus depuis le merge de xdist (#15833, - # 2026-09-13T23:08:18Z), 15 portent un job -- 8 succes (le plus long - # 18,4 min), 5 echecs, 2 annulations dont le temoin 34788823010 coupe a - # 20,3 min -- et 15 sont des supplantations de file (jobs: [], jamais - # demarres, hors de toute discussion de plafond). Aucun job qui reussit - # ne depasse 18,4 min et pourtant un job a atteint 20,3 min et s'est - # fait couper : la queue traverse l'ancien plafond de 20 alors que le - # corps reste 1,6 min en dessous -- la variance du pool decide, pas le - # fond des tests. - # (Les chiffres run-level qui figuraient ici en v1 -- 26 runs, mediane - # 17,5 min, max 19,8 min, 16 annulations -- couvraient la file d'attente - # et, pour un rerun, les deux tentatives : mauvaise grandeur, retiree ; - # retraction ecrite en tete du body de #16087.) - # 30 reste sous les deux plafonds qui l'englobent : l'agregateur pr_gate.py - # (--timeout-min 45) et le job pr-gate.yml (timeout-minutes: 52). + # Plafond 20 -> 30 (#15853). Grandeur mesuree : le mur du JOB + # (started_at -> completed_at du job nomme exactement "Scripts Tests + # (CPU)"), celle sur laquelle timeout-minutes agit -- jamais la duree + # du run (file d'attente comprise, et pour un rerun les deux + # tentatives : c'etait la faute de grandeur de la v1). + # + # Requete a rejouer telle quelle avant de citer ou de retirer ce + # tableau (photographie datee, pas une verite) : runs du workflow + # 296034456, branch=main, status=completed, run_started_at > + # 2026-09-13T23:08:18Z (merge de xdist #15833) ; dans chaque run, job + # de nom EXACT "Scripts Tests (CPU)". + # + # Mesure du 2026-09-15T07:00Z, rejouee a 07:22Z sans derive : + # 70 runs conclus + # - 25 sans job : jobs: [], jamais demarres (supplantation de + # file) -- hors de toute discussion de plafond ; + # - 45 porteurs d'un job, max par conclusion : + # success 30 max 17,4 min + # failure 11 max 14,3 min + # cancelled 4 20,32-20,43 min + # Les 4 cancelled sont des kills au mur de 20 min alors en vigueur sur + # main (runs 34788823010, 34839042549, 34924561729, 34934339136) : + # dans cette fenetre aucun succes ne depasse 17,4 min, et la queue a + # quatre reprises franchi le mur de 20. Fenetre mesuree sous l'ANCIEN + # plafond : elle fonde le relevement, elle ne valide PAS un 30 + # post-merge -- aucun run de main n'a encore execute sous 30. + # (Retraction de la v1 run-level -- 26 runs, mediane 17,5 min, max + # 19,8 min, 16 annulations -- ecrite en tete du body de #16087.) + # 30 reste sous les deux plafonds qui l'englobent : l'agregateur + # pr_gate.py (--timeout-min 45) et le job pr-gate.yml + # (timeout-minutes: 52). timeout-minutes: 30 steps: From afe9749d9db8e955df03ee42404a0fa54888824e Mon Sep 17 00:00:00 2001 From: jsboige Date: Wed, 16 Sep 2026 17:54:03 +0200 Subject: [PATCH 5/5] fix(ci): correct timeout rationale for #16087 Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/scripts-tests.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index 9ac70c3f72..9c338048ec 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -145,12 +145,12 @@ jobs: # success 30 max 17,4 min # failure 11 max 14,3 min # cancelled 4 20,32-20,43 min - # Les 4 cancelled sont des kills au mur de 20 min alors en vigueur sur - # main (runs 34788823010, 34839042549, 34924561729, 34934339136) : - # dans cette fenetre aucun succes ne depasse 17,4 min, et la queue a - # quatre reprises franchi le mur de 20. Fenetre mesuree sous l'ANCIEN - # plafond : elle fonde le relevement, elle ne valide PAS un 30 - # post-merge -- aucun run de main n'a encore execute sous 30. + # Les 4 cancelled ont bien ete termines au mur de 20 min, mais les + # logs montrent des workers xdist morts puis 14-15 min de silence : ce + # sont des hangs que relever le plafond ne repare pas (suivi #16288), + # pas quatre cas de queue lente. Le relevement repose sur la marge + # preventive : le succes max a 17,4 min ne laisse que 2,6 min sous 20; + # 30 laisse ~12,6 min tout en restant sous les bornes 45/52 ci-dessous. # (Retraction de la v1 run-level -- 26 runs, mediane 17,5 min, max # 19,8 min, 16 annulations -- ecrite en tete du body de #16087.) # 30 reste sous les deux plafonds qui l'englobent : l'agregateur