Repository navigation
ci(#13378): tranche 2 -- router 5 gardes PR pure-Python vers la jambe Linux auto-hebergee (file 100+ sur ubuntu-latest, 7/8 slots libres) #14283
Description
Activity
[CLAIMED] lane myia-ai-01:CoursIA -- paths: .github/workflows/scripts-tests.yml, .github/workflows/notebook-validation.yml, .github/workflows/markdown-rendering-guard.yml, .github/workflows/bare-cross-dir-load-gate.yml, .github/workflows/translation-drift.yml
- added a commit that references this issue
on Sep 2, 2026 - added a commit that references this issue
on Sep 2, 2026 Checklist « tirage a fond » — etat mesure 2026-09-02T18:30Z
Demande user : « Tu ne peux pas te faire une checklist qui va jusqu'au tirage a fond de tous les runners ? »
Chaque ligne porte sa mesure, pas une intention.Offre — la capacite existe et elle est saine
# Item Etat Mesure A Image conteneur complete FAIT 4 outils manquants fermes : gh(#14302),lsb_release(#14334),python-is-python3, PEP 668PIP_BREAK_SYSTEM_PACKAGES=1+python3-yaml(#14339, mergee 16:20Z)B 16 slots ai-01 en ligne, image a jour FAIT docker pssur les 2 daemons : 16/16coursia-linux-runner:2.336.0; controle positif dans un conteneur vivant :PIP_BREAK=1,gh OK,lsb OK,pyyaml OKC 4 slots po-2024 en ligne FAIT API actions/runners18:15Z :myia-po-2024-linux-docker-1..4= online (ils etaient offline a 16:15Z)D Persistance WSL (la distro ne meurt plus) FAIT ai-01 / greenlight po-2024 Diagnostic po-2024 : un wsl.exeone-shot ne maintient pas la distro, WSL la reape a la sortie du client. Reproduit ici :/proc/uptime= 6836 s alors que la machine tourne depuis des jours, 0 holder. Corrige : holder detache +.vbsau demarrage. Controle positif : execution du.vbs-> holders 1 -> 2E Slot cap / recyclage des idle FAIT Recyclage des idle seulement, avec re-verification busy par slot juste avant le kill Total offre : 21 runners en ligne (16 ai-01 Linux + 4 po-2024 Linux + 1 po-2024 fast-guards).
Demande — c'est ici que tout se joue
Mesure 18:16Z, en croisant
actions/runners(occupation) etruns/<id>/jobs -> .labels(ce que les jobs demandent) :22 queued ubuntu-latest 20 in_progress ubuntu-latest 1 in_progress self-hosted+coursia-ephemeral+coursia-linux42 jobs sur 43 s'adressent a GitHub. 20 de nos 21 runners sont idle. La file n'attend pas de la capacite, elle attend d'etre adressee.
# Item Etat Mesure F Workflows adresses a nos runners 13 sur main -> 37 avec #14336 + 3c git grep -l coursia-linux .github/workflows: 13 surmain, 37 sur la branche. +1coursia-fast-guardsG Tranche 3a/3b — 19 workflows #14336, en attente de 2 jobs Lean 32 checks verts ; proof-integrity (conway_lean)en cours ;PR gatea relancer apresH Tranche 3c — 8 jobs dans 5 workflows commitee localement, poussee apres #14336 Routage par job cette fois : bash-syntax-advisoryx2,lean-social-choice/certified-no-sorry,notebook-execution-required/{detect-changes,validate-static},secret-scan/positive-controls,twin-parityx2.check_self_hosted_runner_policy.pyrc=0, 42 jobs self-hostedI ~37 workflows cron NON COMMENCE Prochain lot apres H, avec un plafond de slots pour ne pas affamer les gardes de PR J Pool coursia-fast-guardsSOUS-UTILISE 1 runner (po-2024) pour 1 workflow. ai-01 n'a aucun slot fast-guards Exclus par decision, pas par oubli
pr-gate.yml— agregateur qui poll les autres gardes : le router lui ferait tenir le slot qu'il attend (CI: livelock file d'attente — 'PR gate' expire (100 min) pendant que ses freres attendent un runner dans une file de ~920, et son re-run rallonge la file #11405).always-on-guards.yml— triggerpull_request_review, classeFORK_REACHABLE: du code de fork pourrait s'executer chez nous. Non routable en l'etat ; c'est le vrai blocage de ci(#14283): routage hybride self-hosted/ubuntu pour les deux always-on guards #14294, pas l'image.owui-playwright-check.yml— navigateurs Playwright hors image.ml-tests— retelecharge torch a chaque run, pas de cache persistant.secret-scan/gitleaks— a besoin du socket Docker.lean-social-choice/build,notebook-execution-required/golden-set-execute— merit(ent) un pool a cache chaud (cf CI: pools de runners specialises par labels (cache Mathlib chaud, quarto, navigateurs) plutot qu'une image unique qui grossit #14337).
Ce qui reste avant de pouvoir dire « a fond »
- Merger ci(#14283): tranche 3 -- router 19 gardes PR vers la jambe Linux auto-hebergee #14336 (2 jobs Lean) puis pousser 3c.
- Confirmer que les 4 slots po-2024 tournent sur l'image post-feat(ci-runner,#14294): installer gh CLI dans l'image runner (pin SHA-256) #14302/feat(ci-runner,#14283): lsb-release + zstd + wget dans l'image runner #14334/fix(ci-runner,#14283): PEP 668 -- rendre pip utilisable dans le conteneur Linux #14339 (question posee).
- Lot cron (item I).
- Trancher J : donner a ai-01 un slot
coursia-fast-guards, ou retirer ce jeu de labels. - CI: pools de runners specialises par labels (cache Mathlib chaud, quarto, navigateurs) plutot qu'une image unique qui grossit #14337 — pools specialises (cache Mathlib chaud, etc.), qui rendrait routables les exclus « lourds ».
- added a commit that references this issue
on Sep 2, 2026 - added 4 commits that reference this issue
on Sep 2, 2026 Checklist -- avancement mesure (2026-09-02T17:15Z)
# Item Etat Preuve 1 Image du container reconstruite post-PEP 668 (#14339) sur les deux machines FAIT ai-01 : rebuild verifie ; po-2024 : image 6aa023ff769ba 16:30:36Z, controle positif 4/4 (yaml 6.0.1/PIP_BREAK=1/lsb=Ubuntu/gh OK), 4/4 slots online a 16:35:14Z2 Tranche 3 -- 19 gardes PR routes MERGEE #14336 3 Tranche 3c -- 8 jobs routes par job + always-on-metadata-guardsMERGEE #14342, squash c90a0aee44 Tranche 4 -- 32 balayages cron EN VOL #14343, base re-ciblee sur mainapres le squash5 Persistance systemd + holder (po-2024) MERGEE #14341 6 Holder WSL sur ai-01 (la distro etait reapee sans lui) FAIT .vbsau dossier Demarrage, controle positif holders 1 -> 27 Lanceur ai-01 : 4 -> 8 slots au demarrage FAIT defaut du script + argument de la tache planifiee passes a 8(la tache passait4: un reboot n'aurait ramene que la moitie du pool)8 Volume _workpersistant par slotEN VOL #14288, base recalculee (elle etait gelee sur un PR gateannule)9 Pool d'attente coursia-waiterBLOQUEE cote lane #14303 : update-branchrefuse pour conflits -- seulemyia-po-2024:CoursIApeut la rebaser10 Recette de persistance copy-paste + Wants=au lieu deRequires=REPORTE, nomme #14347 (les 2 reserves d'Hermes sur #14341) 11 Enregistrement S4U au boot (avant ouverture de session) BLOQUEUR USER refuse sans clic UAC ; le .vbscouvre le logon, pas le pre-logonCe que les runners tirent reellement
Mesure a l'instant, croisant l'occupation (
actions/runners) et qui a execute chaque job
(runs/<id>/jobs -> .runner_name, le seul champ qui dit l'executant reel --.labelsne dit que
ce qui a ete demande) :- Occupation : 19 slots online, 19 BUSY -- saturation complete, file d'attente vide (0 job
queued). - Debit, sur toutes les executions creees depuis 16:00Z (295 runs, 639 jobs termines) :
113 jobs sur 639 (18 %) ont tourne chez nous, dont ai-01 98 et po-2024 15. Avant la tranche 3,
la meme mesure donnait 1 sur 43. - Fiabilite : 1 seul non-succes sur 113, et ce n'est pas une panne d'infra --
Twin parity audit (#8057)surmyia-ai-01-linux-docker-3a trouve un vrai DRIFT introduit par
une PR d'enrichissement (feature/11601-csp1-density). Le garde route rougit sur du contenu reel :
c'est le controle positif qui manquait, et il ecarte le mode de defaut ou une migration rend un
garde muet et « toujours vert ».
Piege de mesure a ne pas reproduire
gh api "actions/runs?status=completed&per_page=60"ne rend pas les 60 derniers runs termines :
il m'a rendu des runs du 3 aout, soit un mois avant tout routage -- d'ou un « 0 % » qui aurait
ete lu comme une regression. La fenetre doit etre bornee dans le temps (created=>...), jamais
par un compte de runs sous filtre de statut.Reste
#14343 au vert (assertion de perimetre corrigee : le diff porte 33 fichiers, pas 32 -- les 32
workflows plus le script de politique), puis #14288. #14303 attend sa lane. Le S4U attend le user.- Occupation : 19 slots online, 19 BUSY -- saturation complete, file d'attente vide (0 job
- added a commit that references this issue
on Sep 2, 2026 23 remaining items
- added a commit that references this issue
on Sep 22, 2026 - added 3 commits that reference this issue
on Sep 23, 2026 - added a commit that references this issue
on Sep 23, 2026 - added a commit that references this issue
on Sep 23, 2026 - added a commit that references this issue
on Oct 5, 2026 - added a commit that references this issue
on Oct 5, 2026
Suite de la tranche 1 (#13378, decision ai-01 2026-09-01) qui a route 12 jobs de garde vers la jambe Linux auto-hebergee. Cette issue porte la tranche 2 et rien d'autre : elle ne touche ni le superviseur N-slots ni
check_runner_starvation.py, qui restent la propriete de la lanemyia-po-2024:CoursIAsous #13378.Le constat qui la motive, mesure le 2026-09-02
Mandat user : « on veut consommer les runs du container Ubuntu, ce sont eux qui coutent, pas seulement les runs Windows », et « equilibrer la charge au mieux pour ne plus retomber dans une crise de CI ».
Trois mesures prises ce matin, dans cet ordre :
Chaque job en file demande
ubuntu-latest. Aucun ne demande la jambe auto-hebergee, qui est libre a 7/8. Ce n'est pas un manque de capacite, c'est un defaut de routage : la file s'allonge sur la ressource facturee pendant que la ressource gratuite dort.La cause est dans les fichiers :
Perimetre : le meme barreau que la tranche 1, applique a 5 fichiers de plus
La tranche 1 avait pose un critere d'eligibilite volontairement conservateur — garde Python pur, sans secret ni usage du
GITHUB_TOKEN, sans action tierce, sans docker. Cette tranche ne le deplace pas : elle l'applique aux fichiers restants qui le satisfont deja.scripts-tests.ymlnotebook-validation.ymlmarkdown-rendering-guard.ymlbare-cross-dir-load-gate.ymltranslation-drift.yml~112 runs par semaine quittent la facturation
ubuntu-latestpour une jambe qui est libre 7/8 du temps.Ce qui est exclu, et pourquoi — la liste des refus vaut la liste des retenus
secret-scan.ymldocker pull/docker run(gitleaks epingle). Nos runners sont des conteneurs : docker-in-docker n'est pas disponible.always-on-guards.ymlsecrets.GITHUB_TOKENet poste commentaires + check-runs. Hors du barreau tranche 1.always-on-metadata-guards.ymlsource-output-ratchet.ymlmarkdown-claims-output-advisory.ymlmarocchino/sticky-pull-request-comment.catalog-drift.ymlvalidation-matrix.yml,twin-parity.ymlactions/upload-artifact— premiere partie, sans doute compatible, mais non verifie sur cette classe de runner. Tranche 3.notebook-execution-required.ymlactions/github-script(token).lean-axiom.yml,lean-build.ymlworkflow_call) : elles heritent du contexte de leur appelant, donc potentiellement d'un fork. Exclusion de principe.La garde fork, inchangee
Chaque job migre recoit la garde same-repo textuellement identique a celle de la tranche 1 :
Elle couvre
pull_requestetpull_request_targetd'un seul predicat, et lenulllaisse passer les declencheurs hors-PR (push, schedule). Aucun code de fork n'atteint un runner auto-heberge — contrainte dure, les ~95 forks etudiants ne doivent jamais s'executer chez nous.pr_gate.pycompteskippedcomme OK, donc une PR de fork n'est pas penalisee par le saut.Acceptance
runs-on: [self-hosted, coursia-ephemeral, coursia-linux]et la garde same-repo.myia-*-linux-docker-*— preuve par le nom du runner dans le log, pas par la couleur du check.skipped, pasqueuednifailure.gh api ".../actions/runs?status=queued"mesure a nouveau la profondeur de file, et la partubuntu-latesta baisse.Le point 3 est celui qui compte : un routage qui marche sur nos PRs mais laisserait passer un fork serait un echec de securite, pas un succes de performance.
See #13378.