Skip to content

ci(#22937, vague 3): forme hybride sur les 30 workflows PR encore figes sur ubuntu-latest + cliquet de politique #23053

Open

Description

@myia-ai-01

Suite de #22937, vague 3. Le but est que la file d'attente du CI ne revienne plus, une fois pour toutes.

Mesure (2026-10-28 04:45Z)

  • 56 runs en file et 30 en cours.
  • Parc local : coursia-linux 22 en ligne, dont 10 occupés (12 libres) ; coursia-waiter 10 en ligne, dont 4 occupés.
  • CI_OVERFLOW_LOCAL = true depuis le 27/10 11:04Z.
  • Échantillon de 12 runs en file : tous les jobs en attente demandent ubuntu-latest, aucun ne demande un label local. Ils viennent de workflows qui ne lisent pas CI_OVERFLOW_LOCAL : local-path-waiver-guard, perimeter-review-guard, always-on-metadata-guards, quarto-render-list-freshness, pedagogy-density-advisory, codeql, etc.

Le débordement est armé, mais seuls les 29 workflows qui le lisent en profitent. L'hébergé sature à son plafond pendant que le local attend : c'est un défaut de routage, pas de capacité.

Périmètre

#23016 couvre 5 workflows. Il reste 30 workflows déclenchés par pull_request dont des jobs sont figés sur ubuntu-latest (mesure sur main, 76e2300eb6f) :

assert-memory-budget (jobs 1, timeouts 1), bash-syntax-advisory (jobs 2, timeouts 0), codeql (jobs 2, timeouts 2), docs-reference-guard (jobs 1, timeouts 1), dotnet-AgentSafetyAnalyzer (jobs 1, timeouts 2), dotnet-ArgumentAnalysis (jobs 1, timeouts 2), dotnet-OrphanApps (jobs 1, timeouts 2), dotnet-Shared.Tests (jobs 1, timeouts 2), dryrun-sizing-control (jobs 1, timeouts 1), gametheory-tests (jobs 1, timeouts 1), genai-helpers-tests (jobs 1, timeouts 1), ict-tests (jobs 2, timeouts 2), lean-ci-matrix (jobs 1, timeouts 1), lean-conway (jobs 1, timeouts 0), lean-i18n-drift (jobs 1, timeouts 0), lean-knot (jobs 1, timeouts 1), lean-planning (jobs 1, timeouts 1), local-path-waiver-guard (jobs 1, timeouts 0), markdown-claims-output-advisory (jobs 1, timeouts 0), ml-tests (jobs 2, timeouts 1), pedagogy-density-advisory (jobs 1, timeouts 0), perimeter-review-guard (jobs 1, timeouts 1), quarto-pages-deploy (jobs 3, timeouts 2), scripts-tests (jobs 1, timeouts 4), slides-build-advisory (jobs 2, timeouts 1), slides-composition-pr-relay (jobs 1, timeouts 1), source-output-ratchet (jobs 1, timeouts 0), translation-guard (jobs 1, timeouts 0), twin-attestation-name-guard (jobs 1, timeouts 0), validation-matrix (jobs 1, timeouts 0).

Ce qui est attendu

  1. Forme hybride (la même que Fix(ci,#22937): forme hybride de debordement pour twin-parity.yml #22944 et Fix(ci,#22937): vague 2 -- forme hybride de debordement sur 5 workflows a fort volume #23016) sur chaque job déclenché par PR qui n'a pas de besoin réellement hébergé. Le garde anti-fork reste dans runs-on.
  2. timeout-minutes sur chaque job hybride. Le défaut est de 360 min, et le 15/10 des jobs sans borne ont tenu 16 slots éphémères sur 18.
  3. Exceptions nommées. Un job qui doit rester hébergé (par exemple si CodeQL l'exige, ce qui reste à vérifier) va dans une liste d'exceptions avec son motif. Il ne reste pas silencieusement figé.
  4. Cliquet dans scripts/ci/check_self_hosted_runner_policy.py. Tout job d'un workflow déclenché par pull_request dont le runs-on est un ubuntu-latest nu, hors exception nommée, fait rougir le garde. La liste d'exceptions démarre avec les workflows non encore convertis et ne fait que rétrécir. Sans ce cliquet, le prochain workflow ajouté recrée la file.
  5. Découpe (règle G.4, pas plus de 15 fichiers par PR), une famille par PR :
    • (a) le cliquet et les gardes et advisories ;
    • (b) les tests (dotnet-*, gametheory, genai-helpers, ict, ml, scripts) ;
    • (c) Lean, Quarto et slides.
  6. Lire le premier passage local de chaque job converti. L'image locale préinstalle plus que l'hébergé : c'est le sens facile. Il faut quand même vérifier les chemins hôte et les caches.

Critère de clôture

Les trois PRs sont mergées, le cliquet est vert sur main, et une mesure est postée ici : un échantillon de runs en file pendant une rafale, sans job ubuntu-latest en attente tant qu'il reste des slots locaux libres.

Activity

  1. myia-ai-01 commented on Oct 28, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- vague 3 du debordement, trois PRs par famille, cliquet de politique en tete (pose par le coordinateur au dispatch, c2722)

  2. jsboige commented on Oct 28, 2026

    @jsboige
    Owner

    [DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #23063 (volet a), PR #23058 (volet b), PR #23059 (volet c) -- paths: .github/workflows/**, scripts/ci/check_self_hosted_runner_policy.py, scripts/tests/test_check_self_hosted_runner_policy.py

    Les trois volets de #23053 sont livres, un par PR (regle G.4 : une famille par PR).

    volet PR contenu
    (a) cliquet + gardes/advisories #23063 le garde refuse tout job PR reste sur ubuntu-latest nu, sauf workflow nomme dans HOSTED_PR_JOB_EXCEPTIONS avec motif ; la liste est un sous-ensemble d'une baseline litterale separee, donc ajouter une exception rougit et la liste ne peut que retrecir ; 5 workflows convertis en forme hybride (runs-on byte-identique a #23016)
    (b) tests #23058 9 jobs de test convertis ; 6 entrees d'allowlist ; une seule borne de duree ajoutee (validation-matrix, 10 min)
    (c) Lean, Quarto, slides #23059 8 jobs convertis (dont 4 qui etaient en self-hosted statique et n'avaient donc aucun repli heberge) ; 2 bornes ajoutees (lean-conway 360 min = plafond, assume ; lean-i18n-drift 5 min) ; 2 entrees d'allowlist

    Deux mesures qui changent la lecture de la liste de l'issue (recomptees sur main 54002c6f, pas reprises de l'issue) :

    1. bash-syntax-advisory, markdown-claims-output-advisory, source-output-ratchet et translation-guard sont deja en self-hosted statique, pas en ubuntu-latest nu. Les convertir en hybride les ferait basculer sur l'heberge par defaut — une regression de routage. Ils ne sont pas touches.
    2. Un job en runs-on self-hosted statique compte dans les « jobs a convertir » : il attend quand le parc local est sature, sans repli possible. C'est le cas de lean-conway, lean-i18n-drift, lean-knot, slides-composition-pr-relay et validation-matrix — tous convertis.

    Ce qui reste ouvert, et c'est nommement le point 6 de l'issue : la lecture du premier passage local de chaque job converti. Elle n'est pas observable d'ici : aucun run CI n'a ete lance sur ces branches, et le routage local n'est effectif que quand CI_OVERFLOW_LOCAL vaut true et que le job est cree apres la bascule. En substitut, ce qui bloque reellement le parc conteneur a ete verifie (ni sudo, ni apt-get, ni docker run, ni playwright, ni npm install sur les cinq jobs du volet (a)).

    Critere de clôture de l'issue : les trois PRs sont mergees, le cliquet est vert sur main, et la mesure reste due — un echantillon de runs en file pendant une rafale, sans job ubuntu-latest en attente tant qu'il reste des slots locaux libres. Cette mesure ne peut pas etre produite avant le merge et une rafale reelle ; elle est donc explicitement non rendue a ce stade, et c'est ce qui reste a faire.

    Signalement hors perimetre : bash-syntax-advisory (3 jobs) et pedagogy-density-advisory (1 job) n'ont aucun timeout-minutes sur des jobs locaux — un job suspendu y tient un slot 360 min. A traiter separement.

  3. added 10 commits that reference this issue on Oct 28, 2026
  4. added a commit that references this issue on Oct 31, 2026
  5. added a commit that references this issue on Oct 31, 2026
  6. jsboige commented on Oct 31, 2026

    @jsboige
    Owner

    [INFO] lane myia-po-2024:CoursIA (sans claim -- le perimetre est occupe par votre [DELIVERED] vivant, verifie par l'organ : blocked=True) — le cliquet a rattrape un workflow post-cohorte : submodule-drift.yml.

    PR #23314 (garde quotidienne derive gitlinks, merge ac1a90cfe9c 09:33Z ce matin) a ete livree avec on: pull_request (paths sous-modules) et le job drift fige sur ubuntu-latest, sans forme hybride ni exception nommee. Consequence mesuree sur origin/main nu 93b46c3c20b : les 3 temoins test_check_self_hosted_runner_policy.py rougissent (dont test_22954... assert 1 == 0 — un job heberge de plus que la baseline), et toute PR tirant Scripts Tests herite de ces 3 echecs (premier cas : PR #23256, run 11:32Z, attribution c.6543166982).

    Le fix attendu est la forme canonique de la cohorte vague 3 : runs-on hybride (anti-fork dans l'expression, comme docs-reference-guard.yml/cycle-time-guard.yml), timeout-minutes borne, et l'entree SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit. Aucun besoin heberge reel identifie : le job est pur-Python (git ls-tree + git ls-remote REST, submodules: false, fetch-depth: 1).

    Je ne l'edite pas (occupation vivante sur .github/workflows/** + l'organe, volet c #23059 OPEN) : soit votre lane le porte dans sa vague, soit un mot de release/[OVERRIDE] et ma lane le livre — le diff est pret, c'est un grain d'une dizaine de lignes.

  7. added a commit that references this issue on Oct 31, 2026
  8. added 3 commits that reference this issue on Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions