Repository navigation
Fix(ci,#17397): deporter les trois jambes sans besoin local vers ubuntu-latest - #22820
Conversation
…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
left a comment
There was a problem hiding this comment.
[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
left a comment
There was a problem hiding this comment.
[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.
|
Verification de l'autosuffisance des dependances des trois jambes deplacees (audit local, a la tete Le risque que 1. La liste est autosuffisante : Les trois dependances critiques que j'allais chercher :
Version python : 2.
3. Conclusion : les trois jambes sont autosuffisantes sur (Ce commentaire n'edite ni le body ni le titre de la PR — il ne declenche donc aucun re-declenchement de garde.) |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
…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>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
myia-ai-01
left a comment
There was a problem hiding this comment.
[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 :
Scripts Tests (CPU)(run 40427418743) : 4 echecs sur 20950 tests sur ubuntu-latest.compute_granted(scripts/lean/lean_exec.py:515) derivejobs_cpudeos.cpu_count()(2 sur l'offre hebergee, 4 ou plus sur le parc local) et le testtest_measure_resources_commit_binding_through_real_pathexigegranted == 4;scripts/lean/setup_shared_mathlib.ps1:92convertit la racine du depot en chemins Windows, ce qui invalideTest-Pathsur un runner POSIX (les 3 echecstest_setup_shared_mathlib_scan.py). Ces deux causes sont couplees a la forme du runner :scripts-tests.ymlreste sur le parc local, et son entree d'allowlist est remise, avec la mesure citee en commentaire.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 pourquoiScripts 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.
|
Verification apres correction des deux rouges du pilote ( Le commentaire automate de 01:27:27Z (« Grain tag obligatoire...
Consequence pour l'audit : Approbation native posee a la tete exacte |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #22820 (
|
…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>
…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>
…igre 11 gardes vers ubuntu-latest (#22820) ; conflit fast_lane.py resolu par l'union des tranches 26..29
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>
…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>
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 guardsetAlways-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 leif:), etscripts/ci/audit_self_hosted_needs.py(#17397, politique « Q35 etape 2 ») classe 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).Pourquoi maintenant : le parc local est sature PAR SES CHECKOUTS
Mesure firsthand du 27/10 00:45Z :
coursia-waiter(porteurs du PR gate)coursia-linux(porteurs des jambes)actions/checkoutLe mecanisme :
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 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
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.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 parpr_gate.py).La troisieme jambe reste sur le parc local — sur une mesure, pas une preference
Scripts Tests (CPU)(jobscripts-testsde.github/workflows/scripts-tests.yml) a ete migratee versubuntu-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) derivejobs_cpudeos.cpu_count(): 2 sur ubuntu-latest, 4 ou plus sur le parc local ; le test exigegranted == 4;scripts/tests/test_setup_shared_mathlib_scan.py—scripts/lean/setup_shared_mathlib.ps1:92convertit la racine du depot en chemins Windows ($RepoRoot -replace '/', '\'), ce qui invalideTest-Pathsur 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.pyne le voit pas, parce qu'il classifie le workflow et non la suite que le job execute. Le jobADK runtime contracts (18)du meme fichier est deja surubuntu-latestdepuismainet 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-onpar job, plus le bloc de commentaire qui documente la mesure et le retour arriere, et la sortie des deux entrees correspondantes 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).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_loadsur 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 revertdu commit : les deux workflows repartent sur[self-hosted, coursia-ephemeral, coursia-linux]et les deux entrees d'allowlist reviennent. Hors leruns-onet ce commentaire, rien n'est touche : declencheur,paths:, gardes, timeouts et dependances sont inchanges.Co-Authored-By: Claude Haiku 5.5 noreply@anthropic.com