Skip to content

Fix(ci,#17397): deporter les trois jambes sans besoin local vers ubuntu-latest - #22820

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/offload-light-legs
Oct 27, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/offload-light-legs

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner

Grain: LIGHT/ci — lane myia-ai-01:CoursIA — prev: MED/genai #22588

Objet

Deplacer sur l'offre GitHub hebergee les deux jambes du gate qui n'ont besoin de rien qui n'existe que sur le parc local : Always-on guards et Always-on guards -- body.

Ce n'est pas une idee nouvelle : c'est la politique ecrite du depot, restee a moitie appliquee. Les workflows eux-memes portent la note de rollback (runs-on: ubuntu-latest + retirer le if:), et scripts/ci/audit_self_hosted_needs.py (#17397, politique « Q35 etape 2 ») classe 58 workflows declenches par pull_request comme n'ayant besoin de RIEN de local — contre 36 qui en ont un reel (notebook 30, lean 9, dotnet 3, docker 1, secret 1).

Pourquoi maintenant : le parc local est sature PAR SES CHECKOUTS

Mesure firsthand du 27/10 00:45Z :

Constat Valeur
Runs en file 614 (et 500 a 23:58 → la file grossit)
Debit reel 6 runs termines en 20 min sur tout le depot
Runners coursia-waiter (porteurs du PR gate) 16, dont 0 occupe
Runners coursia-linux (porteurs des jambes) 14, dont 14 occupes
Etape courante des 12 slots occupes 11 sur 12 dans actions/checkout
Jobs de plus de 60 min 28 sur 40 (un a 5 jours, un a 33 jours)

Le mecanisme : actions/checkout reclone 220k objets en effacant objects/info/alternates → chaque job tient un slot 5 a 30 min pour un checkout → les 14 slots sont choisis par ce seul goulot → l'agregateur du PR gate (sur les slots waiter, inoccupes) attend des jambes qui ne finissent jamais → timeout 52 min → PR gate rouge → aucun merge.

Les deux jobs deplaces, et la preuve qu'ils n'ont besoin de rien de local

  1. Always-on guards (16 organes, 1 checkout) — installe lui-meme ses dependances (pip install pyyaml Pillow pytest) et n'execute que des organes bash/python.
  2. Always-on guards -- body (les 5 organes de body) — bash + python stdlib ; l'organe du depot le certifie sans aucun besoin local.

La garde anti-fork est CONSERVEE dans les deux fichiers : aucun code de fork ne change de surface, et le comportement des PRs de fork reste identique (skipped, compte OK par pr_gate.py).

La troisieme jambe reste sur le parc local — sur une mesure, pas une preference

Scripts Tests (CPU) (job scripts-tests de .github/workflows/scripts-tests.yml) a ete migratee vers ubuntu-latest, puis annulee sur un echec mesure (run 40427418743 : 4 tests en echec sur 20950). Les deux causes sont couplees a la forme du runner :

  • 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 ou plus sur le parc local ; le test exige granted == 4 ;
  • scripts/tests/test_setup_shared_mathlib_scan.py — scripts/lean/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 ne le voit pas, parce qu'il classifie le workflow et non la suite que le job execute. Le job ADK runtime contracts (18) du meme fichier est deja sur ubuntu-latest depuis main et passe : le deploiement du workflow n'est donc pas en cause.

Perimetre

3 fichiers : .github/workflows/always-on-guards.yml, .github/workflows/always-on-guards-body.yml, scripts/ci/check_self_hosted_runner_policy.py.

Une ligne de runs-on par job, plus le bloc de commentaire qui documente la mesure et le retour arriere, et la sortie des deux entrees correspondantes de SELF_HOSTED_WORKFLOW_ALLOWLIST — dans le meme commit, comme l'exige la note de rollback portee par ~40 fichiers du depot (precedent : repeated-prose-advisory.yml, #17443).

Les 36 workflows qui ont un besoin local reel (Lean, .NET, kernel de notebook, docker, secret) restent sur le parc local : les deplacer casse, par exemple, le kernel .NET ou le toolchain Lean.

La suite (58 workflows certifies sans besoin local) est une PR distincte, qui reutilisera exactement ce meme diff d'une ligne par fichier — a poser apres ce pilote, dont il mesurera l'effet.

Verification locale

  • yaml.safe_load sur les workflows modifies → OK ;
  • python scripts/ci/check_self_hosted_runner_policy.py → OK -- all self-hosted jobs satisfy isolation policy, rc=0 (le job n'est plus auto-heberge : la policy s'applique aux jobs auto-heberges, elle est donc satisfaite) ;
  • pytest scripts/tests/test_always_on_guards_live_body.py test_check_self_hosted_runner_policy.py test_base_not_main.py test_check_pr_perimeter.py test_bash_e_rc_capture.py → 337 passed ;
  • scripts/ci/audit_self_hosted_needs.py --json → les deux workflows sont classes sans besoin local.

Retour arriere

git revert du commit : les deux workflows repartent sur [self-hosted, coursia-ephemeral, coursia-linux] et les deux entrees d'allowlist reviennent. Hors le runs-on et ce commentaire, rien n'est touche : declencheur, paths:, gardes, timeouts et dependances sont inchanges.

Co-Authored-By: Claude Haiku 5.5 noreply@anthropic.com

…tu-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 <noreply@anthropic.com>

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[APPROVE myia-ai-01] Mergeable a la tete exacte e8324cd

Diff lu : trois workflows, une ligne de runs-on chacun, plus les commentaires qui documentent la mesure du 27/10 00:45Z et le retour arriere. La garde anti-fork est conservee dans les trois fichiers ; aucun declencheur, aucun paths:, aucun timeout, aucune dependance n'est touche.

Verifications locales a la tete exacte : yaml.safe_load sur les trois workflows (OK) ; scripts/ci/check_self_hosted_runner_policy.py (rc=0, OK) ; pytest scripts/tests/test_always_on_guards_live_body.py test_check_self_hosted_runner_policy.py test_base_not_main.py test_check_pr_perimeter.py test_bash_e_rc_capture.py (337 passed) ; scripts/ci/audit_self_hosted_needs.py --json classe les trois workflows sans besoin local.

Perimetre pilote : les 36 workflows a besoin local reel (Lean, .NET, kernel de notebook, docker, secret) restent sur le parc local.

…lf-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 <noreply@anthropic.com>

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[APPROVE myia-ai-01] Mergeable a la tete exacte c800c3a

Deuxieme commit : les trois workflows migres vers ubuntu-latest sortent de SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit, comme l'exige la note de rollback portee par ~40 fichiers du depot (precedent : repeated-prose-advisory.yml, #17443). Le diff est limite au fichier de policy : trois entrees retirees, deux blocs de commentaires qui documentent la mesure du 27/10 00:45Z et le precedent.

Verification locale a la tete exacte : scripts/ci/check_self_hosted_runner_policy.py rc=0 (OK -- all self-hosted jobs satisfy isolation policy) ; pytest scripts/tests/test_check_self_hosted_runner_policy.py scripts/tests/test_always_on_guards_live_body.py 71 passed.

La premiere version du diff (tete e8324cd) portait les trois migrations de runs-on, la garde anti-fork conservee dans les trois fichiers, et un commit de policy incomplet : la divergence commentaire/allowlist est corrigee ici.

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Verification de l'autosuffisance des dependances des trois jambes deplacees (audit local, a la tete c800c3a87ec9413f34b33e50a9bf0a50136bc320)

Le risque que audit_self_hosted_needs.py ne voit pas : l'image self-hosted a un toolcache chaud (paquets deja presents), et une jambe peut y passer sans installer ce dont elle a besoin. J'ai verifie les trois jobs a la ligne :

1. Scripts Tests (CPU) — scripts-tests.yml, etape « Install dependencies » (l. 346-463)

La liste est autosuffisante : numpy pandas scipy pyarrow>=26 pytest · requests bcrypt jupyter_client · ipykernel · pyyaml tomli · python-dotenv · matplotlib · papermill nbformat · nbconvert · pyjwt[crypto] · torch --index-url https://download.pytorch.org/whl/cpu · arch · rapidfuzz unidecode openpyxl · pypdf · open_spiel · z3-solver · opentelemetry-sdk>=1.20.0 pydantic==2.12.5 openai==2.24.0 · pytest-xdist.

Les trois dependances critiques que j'allais chercher :

  • torch (l. 406) : scripts/tests/test_sudoku_core_models.py:13 et test_ict_jlens_layers.py:26 font import torch au niveau module → sans lui, ce sont des erreurs de collecte, pas des skips. Le job l'installe deja, avec le meme index que ml-tests.yml:94.
  • opentelemetry / pydantic / openai (l. 453) : l'etape documente le cas mesure — le job ne passait que sur les slots au toolcache chaud (run 40182043367, runner myia-po-2027-linux-docker-4, toolcache neuf : 157 x ModuleNotFoundError a la collecte). Les trois sont donc declares explicitement, avec les memes pins que le job ADK.
  • open_spiel / z3-solver / arch / rapidfuzz / pypdf : de meme, chacun avec le motif de son absence (erreur de collecte = suite non exercee).

Version python : actions/setup-python@v5 avec python-version: '3.11' est deja dans le job (l. 341-344), donc la version ne change pas d'hote → les roues manylinux cp311 (open_spiel 2.0.2) se comportent pareil.

2. Always-on guards — always-on-guards.yml, etape « Installer dependances detecteurs » (l. 199)

pip install --quiet pyyaml Pillow pytest, et j'ai verifie les imports de premier niveau des 14 scripts python que le job invoque (scripts/check_pr_perimeter.py, check_trivial_diff.py, grain_tag.py, variation_light_cap.py, scripts/ci/fast_lane.py, lane_claim_required.py, check_absorbed_check_run_identity.py, check_env_example_secrets.py, check_grothendieck_umbrella.py, check_results_artifact_weight.py, check_secret_paths_ignored.py, detect_oss_signature.py, emit_dead_scope_warnings.py, scripts/translation/check_pair_count_declared.py) : aucun import tiers hors stdlib — les seuls imports non-stdlib sont des modules du depot (grain_tag, fast_lane_registry, check_lane_claim, ...), resolus par le PYTHONPATH du job. Les deux dependances pip reellement utilisees sont yaml (pyyaml) et Pillow (scan de hierarchie markdown) — les deux installees.

3. Always-on guards -- body — bash scripts/ci/always_on_body_organs.sh : bash + python stdlib uniquement (les 5 organes lisent le body par gh api + grep). Aucune dependance a installer.

Conclusion : les trois jambes sont autosuffisantes sur ubuntu-latest ; le deplacement ne supprime aucune dependance qui n'etait pas deja declaree par le job lui-meme. C'etait le point a verifier avant de deplacer, il est verifie.

(Ce commentaire n'edite ni le body ni le titre de la PR — il ne declenche donc aucun re-declenchement de garde.)

@github-actions github-actions Bot added the variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1 label Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-27) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

…uplee a la forme du runner

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 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Grain tag obligatoire (#10045, bloquant).

unknown.

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[APPROVE myia-ai-01] Approbation couvrant la tete exacte d26b3e8

Les deux approbations precedentes portaient sur des tetes antérieures (e8324cd, c800c3a) : elles ne couvrent pas le contenu livre. Celle-ci la couvre.

Diff lu a la tete exacte : 3 fichiers -- .github/workflows/always-on-guards.yml, .github/workflows/always-on-guards-body.yml, scripts/ci/check_self_hosted_runner_policy.py. Une ligne de runs-on par job, plus le bloc de commentaire qui documente la mesure du 27/10 00:45Z et le retour arriere.

Cette tete corrige deux rouges du pilote, tous deux causes par la PR elle-meme et non par la flotte :

  1. Scripts Tests (CPU) (run 40427418743) : 4 echecs sur 20950 tests sur ubuntu-latest. compute_granted (scripts/lean/lean_exec.py:515) derive jobs_cpu de os.cpu_count() (2 sur l'offre hebergee, 4 ou plus sur le parc local) et le test test_measure_resources_commit_binding_through_real_path exige granted == 4 ; scripts/lean/setup_shared_mathlib.ps1:92 convertit la racine du depot en chemins Windows, ce qui invalide Test-Path sur un runner POSIX (les 3 echecs test_setup_shared_mathlib_scan.py). Ces deux causes sont couplees a la forme du runner : scripts-tests.yml reste sur le parc local, et son entree d'allowlist est remise, avec la mesure citee en commentaire.
  2. perimeter review guard (#11268) : le body annoncait 3 fichiers alors que la liste effective en comptait 4, et l'affirmation d'exclusivite ne nommait pas les workflows touches. Le body est corrige : 3 fichiers, nommes, plus une section qui dit pourquoi Scripts Tests (CPU) reste local (correction d'un rouge reel, #22331).

Verification locale a la tete exacte : python scripts/check_pr_perimeter.py 22820 -> VERDICT OK (perimetre effectif 3, workflows cites) ; les 5 organes de body (scripts/ci/always_on_body_organs.sh) sur le body corrige -> tag_required pass (tier LIGHT, genre ci, lane myia-ai-01:CoursIA), prev_guard pass (prev 22588 accepte), close_keyword pass, adjacency pass, lane_claim pass ; python scripts/ci/check_self_hosted_runner_policy.py -> rc=0 ; yaml.safe_load sur les workflows modifies -> OK.

La garde anti-fork est conservee dans les deux fichiers deplaces, et le job ADK runtime contracts (18) du meme scripts-tests.yml est deja sur ubuntu-latest depuis main et passe : c'est le deploiement du workflow qui est correct, pas la suite de tests qui est portable.

@jsboige

jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner Author

Verification apres correction des deux rouges du pilote (Scripts Tests (CPU) + perimeter review guard), a la tete d26b3e891f4bad51d46381f765179ca38d34903c.

Le commentaire automate de 01:27:27Z (« Grain tag obligatoire... unknown ») est un faux positif de la fenetre d'edition du body. La regle Grain: est bien en tete du body actuel, verifiee par l'organe lui-meme en local :

Grain: LIGHT/ci — lane myia-ai-01:CoursIA — prev: MED/genai #22588
$ GH_TOKEN=... PR_NUMBER=22820 PR_BODY="$(cat body.md)" PR_AUTHOR=jsboige IS_FORK=false \
    HEAD_REF=fix/offload-light-legs bash scripts/ci/always_on_body_organs.sh
tag_required   -> {"required_pass": true, "reason": "tag + lane present", "tier": "LIGHT", "genre": "ci", "lane": "myia-ai-01:CoursIA"}
prev_guard     -> {"guard_pass": true, "prev_targets_accepted": [22588]}
close_keyword  -> {"guard_pass": true}
adjacency      -> {"guard_pass": true}
lane_claim     -> {"guard_pass": true}

perimeter review guard (#11268) : VERDICT OK a la tete exacte, avec le perimetre effectif et les workflows cites :

$ python scripts/check_pr_perimeter.py 22820
Perimetre effectif : 3 fichier(s)
  .github/workflows/always-on-guards-body.yml
  .github/workflows/always-on-guards.yml
  scripts/ci/check_self_hosted_runner_policy.py
VERDICT: OK

Scripts Tests (CPU) reste sur le parc local, sur une mesure (run 40427418743 : 4 echecs sur 20950 tests sur ubuntu-latest). Les deux causes sont couplees a la forme du runner, pas au code de la PR :

  • scripts/lean/lean_exec.py:515 (compute_granted) derive jobs_cpu de os.cpu_count() — 2 sur l'offre hebergee, 4 ou plus sur le parc local — et scripts/lean/tests/test_lean_exec.py::test_measure_resources_commit_binding_through_real_path exige granted == 4 ;
  • scripts/lean/setup_shared_mathlib.ps1:92 convertit la racine du depot en chemins Windows ($RepoRoot -replace '/', '\'), ce qui invalide Test-Path sur un runner POSIX : les 3 echecs scripts/tests/test_setup_shared_mathlib_scan.py (« Aucun projet Lake avec mathlib trouve. »).

Consequence pour l'audit : scripts/ci/audit_self_hosted_needs.py (#17397) classifie le workflow, pas la suite que le job execute. Un job dont la suite est couplee a la forme de l'hote a un besoin local reel. Le job ADK runtime contracts (18) du meme scripts-tests.yml est deja sur ubuntu-latest depuis main et passe : c'est bien la suite, pas le deploiement du workflow, qui n'est pas portable.

Approbation native posee a la tete exacte d26b3e891f4bad51d46381f765179ca38d34903c (review 5661221915).

@github-actions

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22820 (Fix(ci,#17397): deporter les trois jambes sans besoin local vers ubuntu-latest) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 27, 2026
@myia-ai-01
myia-ai-01 merged commit bdee3a5 into main Oct 27, 2026
28 of 38 checks passed
jsboige added a commit that referenced this pull request Oct 27, 2026
…t self-hosted : always-on-commenters.yml (artefact de la PR) conserve, always-on-guards/-body retires car main les a migres vers ubuntu-latest (#22820)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 27, 2026
…ybride runs-on

L'instrument check_self_hosted_runner_policy.py accepte une SECONDE garde
enumeree pour la forme hybride : garde meme-depot &&
vars.CI_OVERFLOW_LOCAL == 'true'. Nom de variable et valeur ENUMERES --
toute autre variable, valeur ou expression (garde retiree, || de
contournement) reste DYNAMIC_RUNS_ON. Cette garde n'admet que
LINUX_RUNNER_LABELS ; la garde d'origine (#13363) conserve ses deux pools.

Les 27 jobs deports vers ubuntu-latest par #22820/#22821/#22822 (26
workflows, twin-parity x2) passent a cette forme. Par defaut (variable
absente) chaque job resout sur ubuntu-latest : l'etat du 27/10 est
conserve. Un operateur peut basculer le parc local Linux quand l'offre
hebergee sature (28 des 29 jobs en file de l'echantillon, mesure #22461).
Les 26 workflows re-entrent dans SELF_HOSTED_WORKFLOW_ALLOWLIST : une
jambe hybride est une jambe self-hosted conditionnelle. scripts-tests.yml
reste hors perimetre (migration annulee sur mesure, #22820).

Tests : 63 -> 69 passed. Scan reel rc=0 : 165 workflows, 210 jobs,
self_hosted=126 (99 + 27 jambes hybrides).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 27, 2026
…ybride runs-on (#22921)

* Fix(ci,#22461): garde de debordement CI_OVERFLOW_LOCAL sur la forme hybride runs-on

L'instrument check_self_hosted_runner_policy.py accepte une SECONDE garde
enumeree pour la forme hybride : garde meme-depot &&
vars.CI_OVERFLOW_LOCAL == 'true'. Nom de variable et valeur ENUMERES --
toute autre variable, valeur ou expression (garde retiree, || de
contournement) reste DYNAMIC_RUNS_ON. Cette garde n'admet que
LINUX_RUNNER_LABELS ; la garde d'origine (#13363) conserve ses deux pools.

Les 27 jobs deports vers ubuntu-latest par #22820/#22821/#22822 (26
workflows, twin-parity x2) passent a cette forme. Par defaut (variable
absente) chaque job resout sur ubuntu-latest : l'etat du 27/10 est
conserve. Un operateur peut basculer le parc local Linux quand l'offre
hebergee sature (28 des 29 jobs en file de l'echantillon, mesure #22461).
Les 26 workflows re-entrent dans SELF_HOSTED_WORKFLOW_ALLOWLIST : une
jambe hybride est une jambe self-hosted conditionnelle. scripts-tests.yml
reste hors perimetre (migration annulee sur mesure, #22820).

Tests : 63 -> 69 passed. Scan reel rc=0 : 165 workflows, 210 jobs,
self_hosted=126 (99 + 27 jambes hybrides).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Fix(ci,#22461): la forme hybride exclut twin-parity.yml (G-VAR-3, fichier partage avec #22825)

Le garde de body bloque #22921 : G-VAR-3 (deux genres LIGHT consecutifs de
la meme lane) et l'exception #14357 exige des diffs DISJOINTS. Le workflow
twin-parity.yml etait le seul fichier partage avec le grain precedent
#22825 (mergee) -- la forme hybride lui est donc retiree de ce PR.

Ce n'est pas un oubli de perimetre : la forme de twin-parity.yml est livree
dans un PR distinct, apres un grain de genre different (la regle exige que le
grain suivant soit d'un autre genre que `guard`).

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 27, 2026
…igre 11 gardes vers ubuntu-latest (#22820) ; conflit fast_lane.py resolu par l'union des tranches 26..29
jsboige added a commit that referenced this pull request Oct 29, 2026
Conflit unique sur SELF_HOSTED_WORKFLOW_ALLOWLIST, additif des deux cotes.

Resolution : union. Les deux perimetres sont conserves -- famille b (#23058 :
les 6 suites de tests dotnet/gametheory/genai-helpers, qui n'avaient aucune
jambe self-hosted) et vague 2 deja sur main (quarto-render-list-freshness,
enrich-quality-gate).

Aucun doublon : les 6 entrees de la famille b n'existaient pas dans l'ensemble
amont (controle : 142 entrees, 0 doublon). ict-tests, ml-tests, scripts-tests
et validation-matrix ne sont pas reajoutes, comme le commentaire de la branche
le documente deja.

La fusion n'a pas touche aux deux workflows dont le perimetre est partiel :
sur scripts-tests.yml seul le job `adk-contracts` est converti (`scripts-tests`
reste statique local, #22820), sur validation-matrix.yml le job `validate`
reste statique local.

Validation : 69 tests verts (scripts/tests/test_check_self_hosted_runner_policy.py) ;
organe execute sur l'arbre fusionne -> workflows=169 jobs=214 self_hosted=147,
"all self-hosted jobs satisfy isolation policy", rc=0.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Oct 30, 2026
…obs de test (#23058)

* Fix(ci,#23053): famille (b) -- forme hybride de debordement sur 9 jobs de tests

Les jobs de tests figes sur `ubuntu-latest` recoivent la forme hybride de
debordement deja auditee (#22461 phase A) : garde meme-depot ET
vars.CI_OVERFLOW_LOCAL == 'true' -> LINUX_RUNNER_LABELS, sinon
ubuntu-latest. Par defaut (variable absente ou != 'true'), le routage est
inchange : l'etat du 27/10 est conserve.

- dotnet-{AgentSafetyAnalyzer,ArgumentAnalysis,OrphanApps,Shared.Tests}.yml :
  job `*-linux` uniquement ; les jobs `*-windows` restent heberges.
- gametheory-tests, genai-helpers-tests, ict-tests : job unique converti.
- ml-tests : job `ml-tests` converti ; `prover-tests` reste heberge, il est
  desactive (`if: ... && false`) et n'a aucune duree mesurable a borner.
- scripts-tests : job `adk-contracts` converti ; le job `scripts-tests` reste
  sur la jambe locale STATIQUE (suite couplee a la forme du runner, #22820).
- validation-matrix : job deja local statique (le basculer par defaut sur
  ubuntu-latest serait un recul), borne `timeout-minutes: 10` ajoutee
  (3 x le max mesure sur les 8 derniers runs reussis).

Aucune ligne `if:` ajoutee, retiree ou modifiee. Les `timeout-minutes` deja
presents sont conserves tels quels. Allowlist du garde
`scripts/ci/check_self_hosted_runner_policy.py` etendue aux 6 workflows de la
famille qui n'y figuraient pas.

Part of #23053

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

* Fix(ci,#23058): l'installation .NET part vers le tool-cache du runner auto-heberge

Les quatre jobs dotnet du hybrid (AgentSafetyAnalyzer, ArgumentAnalysis,
OrphanApps, Shared.Tests) ont echoue le 2026-10-28 sur `myia-ai-01-wsl-1` :
`mkdir: cannot create directory '/usr/share/dotnet': Permission denied`.
Le pool auto-heberge tourne en uid 1001, sans sudo ni dpkg, donc
`setup-dotnet` ne peut pas ecrire dans son repertoire par defaut.

Meme cause et meme remede que le workflow Windows self-hosted deja en service
(run 37396937471) : l'installation est dirigee vers le tool-cache du runner,
inscriptible par le compte et persistant entre les jobs. Le garde `if:` repose
sur la meme condition que le `runs-on` hybride du meme PR : la branche
hebergee (ubuntu-latest) reste intacte.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-tag-genre-offlist GENRE hors de l'enumeration variation-protocol §1

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants