Repository navigation
ci(#22937, vague 3): forme hybride sur les 30 workflows PR encore figes sur ubuntu-latest + cliquet de politique #23053
Description
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-linux22 en ligne, dont 10 occupés (12 libres) ;coursia-waiter10 en ligne, dont 4 occupés. CI_OVERFLOW_LOCAL = truedepuis 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 pasCI_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
- 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. timeout-minutessur 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.- 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é.
- Cliquet dans
scripts/ci/check_self_hosted_runner_policy.py. Tout job d'un workflow déclenché parpull_requestdont leruns-onest unubuntu-latestnu, 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. - 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.
- 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
myia-ai-01 commentedon Oct 28, 2026
[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)
jsboige commentedon Oct 28, 2026
[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).
ubuntu-latestnu, sauf workflow nomme dansHOSTED_PR_JOB_EXCEPTIONSavec 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)validation-matrix, 10 min)lean-conway360 min = plafond, assume ;lean-i18n-drift5 min) ; 2 entrees d'allowlistDeux mesures qui changent la lecture de la liste de l'issue (recomptees sur
main54002c6f, pas reprises de l'issue) :bash-syntax-advisory,markdown-claims-output-advisory,source-output-ratchetettranslation-guardsont deja en self-hosted statique, pas enubuntu-latestnu. Les convertir en hybride les ferait basculer sur l'heberge par defaut — une regression de routage. Ils ne sont pas touches.runs-onself-hosted statique compte dans les « jobs a convertir » : il attend quand le parc local est sature, sans repli possible. C'est le cas delean-conway,lean-i18n-drift,lean-knot,slides-composition-pr-relayetvalidation-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_LOCALvauttrueet que le job est cree apres la bascule. En substitut, ce qui bloque reellement le parc conteneur a ete verifie (nisudo, niapt-get, nidocker run, niplaywright, ninpm installsur 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 jobubuntu-latesten 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) etpedagogy-density-advisory(1 job) n'ont aucuntimeout-minutessur des jobs locaux — un job suspendu y tient un slot 360 min. A traiter separement.Fix(ci,#23053): sparse-checkout en mode non-cone pour la jambe locale
Merge origin/main dans fix/23053-hosted-ratchet (conflit resolu)
Fix(ci,#23053): creation-provenance-advisory passe en forme hybride +…
Fix(ci,#23053): fusion de main -- allowlist en union, doublon local-p…
Fix(ci,#23053): famille (b) -- forme hybride de debordement sur les j…
Merge(main): rebaser feature/22358-scrutor-minimal-api sur main
Merge main into fix/23053-hosted-ratchet -- resolution des trois conf…
Fix(ci,#23053): retraite des 13 exceptions perimees par les conversio…
Merge(ci,#23053): main dans la famille (c) -- conflits resolus (#23059)
Fix(ci,#23053): cycle-time-guard converti en forme hybride de deborde…
Fix(ci,#23053): cliquet de politique -- aucun job PR ne reste sur ubu…
Fix(ci,#22209): renumeroter les tranches fast-lane et purger une dive…
jsboige commentedon Oct 31, 2026
[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
ac1a90cfe9c09:33Z ce matin) a ete livree avecon: pull_request(paths sous-modules) et le jobdriftfige surubuntu-latest, sans forme hybride ni exception nommee. Consequence mesuree surorigin/mainnu93b46c3c20b: les 3 temoinstest_check_self_hosted_runner_policy.pyrougissent (donttest_22954...assert 1 == 0— un job heberge de plus que la baseline), et toute PR tirantScripts Testsherite 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-onhybride (anti-fork dans l'expression, commedocs-reference-guard.yml/cycle-time-guard.yml),timeout-minutesborne, et l'entreeSELF_HOSTED_WORKFLOW_ALLOWLISTdans le meme commit. Aucun besoin heberge reel identifie : le job est pur-Python (git ls-tree+git ls-remoteREST,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.Fix(ci,#23359): le workflow Geometry adopte la forme hybride de debor…
Ci(tests,#23359): cabler SymbolicAI/Lean/Geometry/tests dans pytest.i…
Fix(ci,#22209): emetteur d'effets de bord de la voie rapide + job Alw…
Fix(ci,#23053): famille (c) -- forme hybride de debordement sur Lean,…