From e8324cdff17e5dbf1a83e792e07dcaebf813548c Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 27 Oct 2026 01:32:04 +0100 Subject: [PATCH 1/3] Fix(ci,#17397): deporter les trois jambes sans besoin local vers ubuntu-latest Le parc local est sature PAR SES CHECKOUTS (mesure 27/10 00:45Z : 11 des 12 slots occupes dans actions/checkout, 614 runs en file, 6 runs termines en 20 min, les 16 slots coursia-waiter du PR gate inoccupes). Les trois jobs deplaces n'ont besoin de rien qui n'existe que sur le parc local : Always-on guards et Always-on guards -- body executent des organes bash/python et installent leurs deps ; Scripts Tests (CPU) installe toutes ses dependances par pip, y compris papermill/nbformat/ipykernel. C'est la politique ecrite du depot (Q35 etape 2, #17397) portee par scripts/ci/audit_self_hosted_needs.py, qui certifie 58 workflows PR declenchables sans besoin local. Perimetre pilote : les 36 workflows a besoin local reel (Lean, .NET, kernel de notebook, docker, secret) restent sur le parc. La garde anti-fork est conservee dans les trois fichiers. Co-Authored-By: Claude Haiku 5.5 --- .github/workflows/always-on-guards-body.yml | 13 ++++++++++++- .github/workflows/always-on-guards.yml | 19 ++++++++++++++++++- .github/workflows/scripts-tests.yml | 13 ++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/.github/workflows/always-on-guards-body.yml b/.github/workflows/always-on-guards-body.yml index 9e7ef86614d..f3728f16c01 100644 --- a/.github/workflows/always-on-guards-body.yml +++ b/.github/workflows/always-on-guards-body.yml @@ -70,7 +70,18 @@ jobs: name: "Always-on guards -- body" # Meme pool, meme garde anti-fork, meme routage que le job de contenu # (cf. always-on-guards.yml pour la mesure qui a fixe ce routage). - runs-on: [self-hosted, coursia-ephemeral, coursia-linux] + # + # 2026-10-27 (mesure ai-01) : retour sur `ubuntu-latest`, comme l'ecrit la + # note de rollback du job de contenu et comme le fait la politique + # « Q35 etape 2 » (#17397) portee par + # `scripts/ci/audit_self_hosted_needs.py` : cet organe certifie ce + # workflow comme n'ayant besoin de RIEN qui n'existe que sur le parc local + # (les cinq organes de body sont du bash + python stdlib). + # Motif du deplacement : le parc local est sature PAR SES CHECKOUTS + # (mesure 27/10 00:45Z : 11 des 12 slots occupes dans `actions/checkout`, + # 614 runs en file, 6 runs termines en 20 min). La garde anti-fork est + # CONSERVEE : aucun code de fork ne change de surface. + runs-on: ubuntu-latest if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository # Les cinq organes de body coutent quelques secondes : le plafond n'est # qu'un garde-fou contre un blocage de `gh`. diff --git a/.github/workflows/always-on-guards.yml b/.github/workflows/always-on-guards.yml index 0f7205ede21..a8808e253d4 100644 --- a/.github/workflows/always-on-guards.yml +++ b/.github/workflows/always-on-guards.yml @@ -124,7 +124,24 @@ jobs: # fait tourner `actions/setup-python@v5` sur CE pool -- run # 33691615314, runner myia-ai-01-linux-docker-6, success en 34 s. # Retour arriere = remettre `runs-on: ubuntu-latest` + retirer le `if:`. - runs-on: [self-hosted, coursia-ephemeral, coursia-linux] + # + # 2026-10-27 (mesure ai-01) : ce job revient sur `ubuntu-latest`, comme + # l'ecrit deja la note de rollback ci-dessus, et comme le fait la + # politique « Q35 etape 2 » du depot (#17397) que porte + # `scripts/ci/audit_self_hosted_needs.py` : cet organe classe + # 58 workflows declenches par `pull_request` comme n'ayant besoin de + # RIEN qui n'existe que sur le parc local. + # + # Pourquoi maintenant : le parc local est sature PAR SES CHECKOUTS. + # Mesure du 27/10 00:45Z : 11 des 12 slots occupes etaient dans une + # etape `actions/checkout` (~29 min pour recloner 220k objets), 614 + # runs en file, 6 runs termines en 20 min, et les 16 slots + # `coursia-waiter` (porteurs du PR gate) inoccupes. Ce job n'a aucun + # besoin local : il installe lui-meme ses dependances + # (`pip install pyyaml Pillow pytest`) et n'execute que des organes + # bash/python. La garde anti-fork est CONSERVEE : aucun code de fork + # ne change de surface. + runs-on: ubuntu-latest if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository timeout-minutes: 25 diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index 5ac89a70372..bc60739533a 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -258,7 +258,18 @@ jobs: # 2026-09-02) : garde Python pur, sans secret. La garde same-repo ci-dessous # saute les PRs de fork (pr_gate.py compte `skipped` comme OK) : aucun code de # fork n'atteint le runner. Retour arriere = revert de la PR. - runs-on: [self-hosted, coursia-ephemeral, coursia-linux] + # + # 2026-10-27 (mesure ai-01) : retour sur `ubuntu-latest`. Le job installe + # lui-meme TOUTES ses dependances (numpy, pandas, scipy, pyarrow>=26, + # pytest, requests, bcrypt, jupyter_client, pytest-xdist, ipykernel, + # papermill, nbformat, nbconvert...) -- le commentaire de l'etape + # "Install dependencies" note deja que la suite a ete corrigee pour + # tourner sous ubuntu (papermill/nbformat). Aucun besoin local. + # Motif : le parc local est sature PAR SES CHECKOUTS (mesure 27/10 + # 00:45Z : 11 des 12 slots occupes dans `actions/checkout`, 614 runs en + # file, 6 runs termines en 20 min, les 16 slots `coursia-waiter` du PR + # gate inoccupes). La garde same-repo est CONSERVEE. + runs-on: ubuntu-latest if: github.event.pull_request.head.repo.full_name == null || github.event.pull_request.head.repo.full_name == github.repository # Plafond 20 -> 30 (#15853). Grandeur mesuree : le mur du JOB # (started_at -> completed_at du job nomme exactement "Scripts Tests From c800c3a87ec9413f34b33e50a9bf0a50136bc320 Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 27 Oct 2026 01:35:40 +0100 Subject: [PATCH 2/3] Fix(ci,#17397): sortir les trois workflows deplaces de l'allowlist self-hosted Le depot exige qu'un workflow migre vers ubuntu-latest ET qu'il quitte SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit (precedent : repeated-prose-advisory.yml, #17443). Les trois entrees sont retirees : always-on-guards.yml, always-on-guards-body.yml, scripts-tests.yml. Verification : check_self_hosted_runner_policy.py rc=0 ; pytest test_check_self_hosted_runner_policy.py test_always_on_guards_live_body.py 71 passed. Co-Authored-By: Claude Haiku 5.5 --- scripts/ci/check_self_hosted_runner_policy.py | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/scripts/ci/check_self_hosted_runner_policy.py b/scripts/ci/check_self_hosted_runner_policy.py index 24956f8161e..c822768887b 100644 --- a/scripts/ci/check_self_hosted_runner_policy.py +++ b/scripts/ci/check_self_hosted_runner_policy.py @@ -86,12 +86,15 @@ # tranche 3d (#14283) : premier consommateur GitHub-hosted du depot une # fois secret-scan bascule -- 2650 runs same-repo du 2026-08-28 au # 2026-09-02, timeout 25 min, aucun filtre `paths:`. - "always-on-guards.yml", - # #22331 : le job de body est la moitie extraite de always-on-guards.yml - # (memes organes, meme pool, meme garde anti-fork, meme routage). Le laisser - # sur GitHub-hosted rendrait la famine de file pire qu'avant, puisque son - # declencheur `edited` est justement celui qui produit les re-declenchements. - "always-on-guards-body.yml", + # + # 2026-10-27 (PR #22820, lane myia-ai-01:CoursIA) : always-on-guards.yml et + # always-on-guards-body.yml MIGRENT vers ubuntu-latest par Q35 etape 2 + # (#17397) -- l'organe `scripts/ci/audit_self_hosted_needs.py` les certifie + # sans aucun besoin local, et le parc local etait sature PAR SES CHECKOUTS + # (mesure 00:45Z : 11 des 12 slots occupes dans `actions/checkout`). Sortis + # de SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit. Precedent : + # repeated-prose-advisory.yml (#17443). + "pr-gate-stale-sweep.yml", "pr-gate-stale-sweep.yml", "windows-self-hosted-tests.yml", "linux-self-hosted-tests.yml", @@ -337,7 +340,14 @@ # (#17397, PR dediee myia-ai-01:CoursIA-2 c.206, 5 workflows # agregateurs, 2026-10-06). Sorti de SELF_HOSTED_WORKFLOW_ALLOWLIST # dans le meme commit. Precedent : #17443 (po-2023, 4 agregateurs). - "scripts-tests.yml", + # scripts-tests.yml : migre ubuntu-latest par Q35 etape 2 (#17397, PR + # #22820, lane myia-ai-01:CoursIA, 2026-10-27) -- le job installe toutes + # ses dependances par pip (numpy, pandas, scipy, pyarrow>=26, pytest, + # requests, bcrypt, jupyter_client, pytest-xdist, ipykernel, papermill, + # nbformat, nbconvert), aucun besoin local ; le parc local etait sature par + # ses CHECKOUTS (mesure 27/10 00:45Z : 11 des 12 slots occupes dans + # `actions/checkout`, 614 runs en file). Sorti de + # SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit. "series-naming-gate.yml", # registre TRANCHE14 (issue #16762, owner myia-po-2023:CoursIA) : meme # profil que repeated-prose-advisory.yml (TRANCHE7) ci-dessus -- From d26b3e891f4bad51d46381f765179ca38d34903c Mon Sep 17 00:00:00 2001 From: jsboige Date: Tue, 27 Oct 2026 02:25:59 +0100 Subject: [PATCH 3/3] Fix(ci,#17397): scripts-tests.yml reste sur le parc local -- suite couplee a la forme du runner MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La migration de `Scripts Tests (CPU)` vers ubuntu-latest a ete tentee puis ANNULEE sur une MESURE (run 40427418743 : 4 echecs sur 20950 tests), pas sur une preference. Les deux causes sont couplees a la forme de l'hote : - `scripts/lean/tests/test_lean_exec.py::test_measure_resources_commit_binding_through_real_path` -- `compute_granted` (scripts/lean/lean_exec.py:515) derive `jobs_cpu` de `os.cpu_count()` : 2 sur ubuntu-latest, >= 4 sur le parc local ; le test exige `granted == 4` ; - `scripts/tests/test_setup_shared_mathlib_scan.py` -- `setup_shared_mathlib.ps1:92` convertit la racine du depot en chemins Windows (`$RepoRoot -replace '/', '\'`), ce qui invalide `Test-Path` sur un runner POSIX -> « Aucun projet Lake avec mathlib trouve. ». Un job dont la suite de tests est couplee a la forme de l'hote a un besoin local REEL : `scripts/ci/audit_self_hosted_needs.py` (#17397) ne le voit pas, parce qu'il classifie le workflow et non la suite que le job execute. Co-Authored-By: Claude Haiku 5.5 --- .github/workflows/scripts-tests.yml | 13 +--------- scripts/ci/check_self_hosted_runner_policy.py | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/.github/workflows/scripts-tests.yml b/.github/workflows/scripts-tests.yml index bc60739533a..5ac89a70372 100644 --- a/.github/workflows/scripts-tests.yml +++ b/.github/workflows/scripts-tests.yml @@ -258,18 +258,7 @@ jobs: # 2026-09-02) : garde Python pur, sans secret. La garde same-repo ci-dessous # saute les PRs de fork (pr_gate.py compte `skipped` comme OK) : aucun code de # fork n'atteint le runner. Retour arriere = revert de la PR. - # - # 2026-10-27 (mesure ai-01) : retour sur `ubuntu-latest`. Le job installe - # lui-meme TOUTES ses dependances (numpy, pandas, scipy, pyarrow>=26, - # pytest, requests, bcrypt, jupyter_client, pytest-xdist, ipykernel, - # papermill, nbformat, nbconvert...) -- le commentaire de l'etape - # "Install dependencies" note deja que la suite a ete corrigee pour - # tourner sous ubuntu (papermill/nbformat). Aucun besoin local. - # Motif : le parc local est sature PAR SES CHECKOUTS (mesure 27/10 - # 00:45Z : 11 des 12 slots occupes dans `actions/checkout`, 614 runs en - # file, 6 runs termines en 20 min, les 16 slots `coursia-waiter` du PR - # gate inoccupes). La garde same-repo est CONSERVEE. - runs-on: ubuntu-latest + 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). Grandeur mesuree : le mur du JOB # (started_at -> completed_at du job nomme exactement "Scripts Tests diff --git a/scripts/ci/check_self_hosted_runner_policy.py b/scripts/ci/check_self_hosted_runner_policy.py index c822768887b..e99692b14df 100644 --- a/scripts/ci/check_self_hosted_runner_policy.py +++ b/scripts/ci/check_self_hosted_runner_policy.py @@ -95,7 +95,6 @@ # de SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit. Precedent : # repeated-prose-advisory.yml (#17443). "pr-gate-stale-sweep.yml", - "pr-gate-stale-sweep.yml", "windows-self-hosted-tests.yml", "linux-self-hosted-tests.yml", "banner-guard.yml", @@ -340,14 +339,23 @@ # (#17397, PR dediee myia-ai-01:CoursIA-2 c.206, 5 workflows # agregateurs, 2026-10-06). Sorti de SELF_HOSTED_WORKFLOW_ALLOWLIST # dans le meme commit. Precedent : #17443 (po-2023, 4 agregateurs). - # scripts-tests.yml : migre ubuntu-latest par Q35 etape 2 (#17397, PR - # #22820, lane myia-ai-01:CoursIA, 2026-10-27) -- le job installe toutes - # ses dependances par pip (numpy, pandas, scipy, pyarrow>=26, pytest, - # requests, bcrypt, jupyter_client, pytest-xdist, ipykernel, papermill, - # nbformat, nbconvert), aucun besoin local ; le parc local etait sature par - # ses CHECKOUTS (mesure 27/10 00:45Z : 11 des 12 slots occupes dans - # `actions/checkout`, 614 runs en file). Sorti de - # SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit. + # scripts-tests.yml : RESTE sur le parc local (PR #22820, lane + # myia-ai-01:CoursIA, 2026-10-27). La migration vers ubuntu-latest a ete + # tentee puis ANNULEE sur une MESURE, pas sur une preference : + # `Scripts Tests (CPU)` y echoue (run 40427418743 -- 4 echecs sur 20950 + # tests). Les deux causes sont couplees a la FORME du runner : + # (a) `scripts/lean/tests/test_lean_exec.py` -- `compute_granted` derive + # `jobs_cpu` de `os.cpu_count()` (2 sur ubuntu-latest, >= 4 sur le + # parc local) ; le test exige `granted == 4` ; + # (b) `scripts/tests/test_setup_shared_mathlib_scan.py` -- le script + # `scripts/lean/setup_shared_mathlib.ps1` convertit la racine du + # depot en chemins Windows (`$RepoRoot -replace '/', '\'`), ce qui + # invalide `Test-Path` sur un runner POSIX -> « Aucun projet Lake + # avec mathlib trouve. ». + # Un job dont la suite de tests est couplee a la forme de l'hote a un + # besoin local REEL : l'organe `audit_self_hosted_needs.py` ne le voit pas + # (il classifie le workflow, pas la suite qu'il execute). + "scripts-tests.yml", "series-naming-gate.yml", # registre TRANCHE14 (issue #16762, owner myia-po-2023:CoursIA) : meme # profil que repeated-prose-advisory.yml (TRANCHE7) ci-dessus --