Repository navigation
Fix(ci,#17397): deporter 11 gardes PR sans besoin local vers ubuntu-latest (lot 2, empile sur #22821) - #22822
Conversation
myia-ai-01
left a comment
There was a problem hiding this comment.
[APPROVE myia-ai-01] Mergeable a la tete exacte 1ae55ce
PR empilee sur #22821 (base = fix/offload-batch-a) : le diff presente ici est le delta du lot 2, et les deux lots editent le meme fichier de policy sur des entrees differentes. Ordre de merge impose : #22821 d'abord, puis #22822, sur une base re-ciblee vers main.
Diff lu : 11 workflows, 12 jobs (twin-parity.yml en a deux), une ligne de runs-on chacun, plus le bloc de commentaire qui documente la mesure du 27/10 00:45Z et le retour arriere ; et la sortie des 11 entrees 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).
Perimetre verifie fichier par fichier : chaque job declare ses dependances (setup-python + pip install quand le script importe yaml, setup-node + npm ci pour la compilation TypeScript), aucun sudo, aucun service local, aucun socket docker, aucun chemin de l'image self-hosted, aucun secrets.* autre que GITHUB_TOKEN. La garde anti-fork est presente et inchangee dans les 11 fichiers.
Effet de bord declare dans le body : sur ubuntu-latest, npm est present, donc la jambe KaTeX de notebook-math-render.yml s'ACTIVE au lieu d'etre sautee sur le parc local (verdict plus complet, donc potentiellement plus rouge que le partiel d'aujourd'hui -- c'est le comportement voulu par construction, #14849).
Verification locale a la tete exacte : yaml.safe_load sur les 165 workflows OK ; scripts/ci/check_self_hosted_runner_policy.py rc=0 ; pytest scripts/tests/test_check_self_hosted_runner_policy.py scripts/tests/test_always_on_guards_live_body.py 71 passed ; scripts/ci/audit_self_hosted_needs.py classe les 11 sans besoin local ; scripts/ci/always_on_body_organs.sh sur le body de la PR : les 5 organes verts ; scripts/check_unaddressed_nits.py 22822 rc=0.
Base != main (advisory, #10918)Cette PR ne livre pas sur Couverture CI perdue sur cette base (mesure, #16194)14 workflow(s) se declencheraient si cette PR visait
Un check absent n'est pas un check vert. |
Path-collision (organ #13359/#13615)Cette PR #22822 (
|
…st (lot 2) Lot 2 de l'extension Q35 etape 2, empile sur le lot 1 (#22821). Les 11 workflows sont certifies sans aucun besoin local par scripts/ci/audit_self_hosted_needs.py. 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). La garde anti-fork est conservee dans les 11 fichiers, et les 11 sortent de SELF_HOSTED_WORKFLOW_ALLOWLIST dans le meme commit (precedent : repeated-prose-advisory.yml, #17443). Effet de bord declare : sur ubuntu-latest, npm est present, donc la jambe KaTeX de notebook-math-render.yml s'ACTIVE au lieu d'etre sautee (verdict plus complet, plus rouge). Verification : yaml.safe_load sur les 165 workflows OK ; check_self_hosted_runner_policy.py rc=0 ; 71 tests passes. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
1ae55ce to
7dd25be
Compare
myia-ai-01
left a comment
There was a problem hiding this comment.
[APPROVE myia-ai-01] Approbation couvrant la tete exacte 7dd25be
Re-empilement apres le merge squash de #22821 (lot 1, f30081943b3) : le commit unique du lot 2 est rejoue sur origin/main (git rebase --onto origin/main 76e07515d76), pousse en --force-with-lease sur la branche de ma lane, et la base de la PR passe de fix/offload-batch-a a main.
Contenu inchange, mesure : git patch-id --stable du diff d'origine (76e07515d76..1ae55ce9c28) et du diff rejoue (origin/main..7dd25bea669) sont identiques (914f9339bb9e). Le diff de la PR ne porte plus que le lot 2 : 12 fichiers, +97/-28 — 11 gardes sans besoin local deportes vers ubuntu-latest et leurs entrees dans check_self_hosted_runner_policy.py.
Controle a la tete rejouee : python scripts/ci/check_self_hosted_runner_policy.py -> workflows=165 jobs=210 self_hosted=101, OK -- all self-hosted jobs satisfy isolation policy.
Ma lecture du lot 2 a la tete precedente (1ae55ce9c28) tient donc a l'octet pres ; la fusion attend le verdict des jambes de cette tete, qui touche .github/workflows/** et reste hors de l'organe merge_ready.
PR gate absent du rollup (advisory, #10928)
Cause mesuree : base_ref_changed=2026-10-27T03:22:46Z, dernier run PR gate=aucun |
…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>
…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>
Grain: LIGHT/ci — lane myia-ai-01:CoursIA — prev: LIGHT/ci #22821
Objet
Lot 2 de l'extension du deplacement vers l'offre GitHub hebergee, apres le pilote #22820 (trois jambes du gate) et le lot 1 (#22821, treize gardes). Ce lot deplace 11 gardes PR supplementaires qui n'ont besoin de RIEN qui n'existe seulement sur le parc local.
Meme selection, meme source :
scripts/ci/audit_self_hosted_needs.py(#17397, « Q35 etape 2 ») certifie 58 workflows declenches parpull_requestcomme n'ayant besoin de RIEN de local (contre 36 qui en ont un reel : notebook 30, lean 9, dotnet 3, docker 1, secret 1). Le pilote et les lots 1 et 2 en couvrent 27 ; les 3 qui restent exclus sont argumentes plus bas.Pourquoi : le parc local est sature PAR SES CHECKOUTS
Mesure firsthand du 27/10 00:45Z : 614 runs en file, 6 runs termines en 20 min, 11 des 12 slots occupes dans
actions/checkout, 28 jobs sur 40 de plus de 60 min.actions/checkoutreclone 220k objets en effacantobjects/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 duPR gateattend des jambes qui ne finissent jamais → timeout → gate rouge → aucun merge.Ce que dit la mesure, jambe par jambe (60 PRs ouvertes, conclusions detaillees) : les jambes deja hebergees sont majoritairement
success; ce sont les jambes auto-hebergees qui restentqueued—cell-source-parses6 queued / 3 success,Exec-sequence ratchet7 queued,latex-control-chars6 queued,Kernel drift guard6 queued,Papermill ratchet4 queued,math-render5 queued,Organ-duplication advisory10 queued. Le goulot est bien le parc local, pas le code des PRs.Les 11 fichiers, et la preuve qu'ils n'ont besoin de rien de local
notebook-exec-sequence-ratchet.ymlratchetsetup-python3.12 +pip install pytest;check_exec_sequence.py:75-79,check_exec_ratchet.py:29-39= stdlibnotebook-kernel-drift-guard.ymlkernel-driftsetup-python3.12 +pip install pytest; script stdlib ;gh apiavecGH_TOKENcablenotebook-link-render-check.ymlcheck-link-rendersetup-python3.11 ;check_notebook_link_render.py:31-38= stdlib ; label viaactions/github-script@v7(token implicite) ;/tmp/_pr_readme.mdportablenotebook-math-render.ymlmath-rendersetup-python3.12 +npm install katex --no-save(npm est present sur ubuntu-latest)organ-duplication-advisory.ymlorgan-duplication-advisorysetup-python3.11 +pip install pyyaml;detect_organ_duplication.py:50faitimport yamlorphaned-delivery-scan.ymlsweepsetup-python3.13 ;check_orphan_merged_pr.py:64-70= stdlib ;git fetch '+refs/heads/*'sur clone neufowui-playwright-check.ymlcompile-collectsetup-node20 + cache npm +npm ci;tsc --noEmitetplaywright test --listsans navigateur ni instancescan-md-hierarchy-drift.ymldriftsetup-python3.11 ;scan_md_hierarchy.py:50= stdlib ;gh pr commentavecGH_TOKENsolution-leak-guard.ymlsolution-leak-deltasetup-python3.11 ;audit_solution_leaks.py:15-33,solution_leak_delta.py:47-49= stdlib ;${{ runner.temp }}portabletranslation-drift.ymltranslation-driftsetup-python3.11 ;check_translation_sync.py:63-76+check_perimeter.py:78-85= stdlibtwin-parity.ymltwin-parityettwin-parity-sha-mismatchsetup-python3.11 +pip install pyyaml;check_twin_parity.py:159faitimport yamlAucun n utilise
sudo,systemctl, le socket docker, un chemin de l'image self-hosted (/opt/hostedtoolcache,coursia-mirror,GIT_ALTERNATE_OBJECT_DIRECTORIES), ni unsecrets.*autre queGITHUB_TOKEN. La garde anti-fork est CONSERVEE dans les 11 fichiers : aucun code de fork ne change de surface, et le comportement des PRs de fork reste identique (skipped, compte OK parpr_gate.py).Effet de bord declare
notebook-math-render.yml: sur le parc local,npmest absent duPATH(mesure Hermes, run 35820361645, exit 127 sur 2 runners distincts), donc la jambe KaTeX se SAUTE avec un « verdict partiel ». Surubuntu-latest,npmest present → la jambe KaTeX s'ACTIVE. C'est le comportement voulu par construction (#14849 : une jambe sautee n'est ni verte ni rouge ; le detecteur annonce lui-meme la limite de son verdict), et le verdict devient plus complet — donc potentiellement plus rouge que le verdict partiel d'aujourd'hui. Je le declare plutot que de le decouvrir.Ce que je ne deplace toujours pas
Les trois exclus du lot 1 restent exclus, pour les memes raisons argumentees dans #22821 :
hooks-parity.yml(mesure l'etat du runner, pas du depot),ict-tests-profile.yml(sonde de calibration des durees du pool local),slides-composition-pr-relay.yml(litos.environ['GH_TOKEN']sans le cabler — fix distinct a faire dans sa propre PR).pr-gate.ymlgarde son routagecoursia-waiter: l'agregateur est techniquement portable, mais ce routage est un arbitrage mesure du 16/10, pas un goulot.Verification locale (a la tete exacte)
yaml.safe_loadsur les 165 workflows → OK ;python scripts/ci/check_self_hosted_runner_policy.py→OK -- all self-hosted jobs satisfy isolation policy, rc=0 ;pytest scripts/tests/test_check_self_hosted_runner_policy.py scripts/tests/test_always_on_guards_live_body.py→ 71 passed ;scripts/ci/audit_self_hosted_needs.py --json→ les 11 workflows sont classes sans besoin local.Perimetre
12 fichiers : une ligne de
runs-onpar job (12 jobs sur 11 workflows —twin-parity.ymlen a deux), le bloc de commentaire qui documente la mesure et le retour arriere, et la sortie des 11 entrees deSELF_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).Aucun declencheur, aucun
paths:, aucun timeout, aucune dependance, aucune garde n'est modifie.Retour arriere
git revertdu commit : les 11 workflows repartent sur[self-hosted, coursia-ephemeral, coursia-linux]et les 11 entrees d'allowlist reviennent.Co-Authored-By: Claude Haiku 5.5 noreply@anthropic.com