Skip to content

Fix(ci,#17397): deporter 11 gardes PR sans besoin local vers ubuntu-latest (lot 2, empile sur #22821) - #22822

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/offload-batch-b
Oct 27, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/offload-batch-b

Conversation

@jsboige

@jsboige jsboige commented Oct 27, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/ci — lane myia-ai-01:CoursIA — prev: LIGHT/ci #22821

PR empilee sur #22821 (base = fix/offload-batch-a). Le diff ci-dessous est le delta du lot 2 ; il se merge apres le lot 1, dans cet ordre. Le lot 1 doit etre merge en premier : les deux lots editent le meme fichier de policy (scripts/ci/check_self_hosted_runner_policy.py), sur des entrees differentes.

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 par pull_request comme 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/checkout reclone 220k objets en effacant objects/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 attend 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 restent queued — cell-source-parses 6 queued / 3 success, Exec-sequence ratchet 7 queued, latex-control-chars 6 queued, Kernel drift guard 6 queued, Papermill ratchet 4 queued, math-render 5 queued, Organ-duplication advisory 10 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

fichier job(s) preuve de l'autosuffisance
notebook-exec-sequence-ratchet.yml ratchet setup-python 3.12 + pip install pytest ; check_exec_sequence.py:75-79, check_exec_ratchet.py:29-39 = stdlib
notebook-kernel-drift-guard.yml kernel-drift setup-python 3.12 + pip install pytest ; script stdlib ; gh api avec GH_TOKEN cable
notebook-link-render-check.yml check-link-render setup-python 3.11 ; check_notebook_link_render.py:31-38 = stdlib ; label via actions/github-script@v7 (token implicite) ; /tmp/_pr_readme.md portable
notebook-math-render.yml math-render setup-python 3.12 + npm install katex --no-save (npm est present sur ubuntu-latest)
organ-duplication-advisory.yml organ-duplication-advisory setup-python 3.11 + pip install pyyaml ; detect_organ_duplication.py:50 fait import yaml
orphaned-delivery-scan.yml sweep setup-python 3.13 ; check_orphan_merged_pr.py:64-70 = stdlib ; git fetch '+refs/heads/*' sur clone neuf
owui-playwright-check.yml compile-collect setup-node 20 + cache npm + npm ci ; tsc --noEmit et playwright test --list sans navigateur ni instance
scan-md-hierarchy-drift.yml drift setup-python 3.11 ; scan_md_hierarchy.py:50 = stdlib ; gh pr comment avec GH_TOKEN
solution-leak-guard.yml solution-leak-delta setup-python 3.11 ; audit_solution_leaks.py:15-33, solution_leak_delta.py:47-49 = stdlib ; ${{ runner.temp }} portable
translation-drift.yml translation-drift setup-python 3.11 ; check_translation_sync.py:63-76 + check_perimeter.py:78-85 = stdlib
twin-parity.yml twin-parity et twin-parity-sha-mismatch setup-python 3.11 + pip install pyyaml ; check_twin_parity.py:159 fait import yaml

Aucun n utilise sudo, systemctl, le socket docker, un chemin de l'image self-hosted (/opt/hostedtoolcache, coursia-mirror, GIT_ALTERNATE_OBJECT_DIRECTORIES), ni un secrets.* autre que GITHUB_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 par pr_gate.py).

Effet de bord declare

notebook-math-render.yml : sur le parc local, npm est absent du PATH (mesure Hermes, run 35820361645, exit 127 sur 2 runners distincts), donc la jambe KaTeX se SAUTE avec un « verdict partiel ». Sur ubuntu-latest, npm est 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 (lit os.environ['GH_TOKEN'] sans le cabler — fix distinct a faire dans sa propre PR). pr-gate.yml garde son routage coursia-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_load sur 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-on par job (12 jobs sur 11 workflows — twin-parity.yml en a deux), le bloc de commentaire qui documente la mesure 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).

Aucun declencheur, aucun paths:, aucun timeout, aucune dependance, aucune garde n'est modifie.

Retour arriere

git revert du 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

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

@github-actions

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de fix/offload-batch-a. 1 PR ouverte(s) de fix/offload-batch-a vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

14 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-guards-body.yml
  • always-on-guards.yml
  • label-paths-guard.yml
  • notebook-exec-sequence-ratchet.yml
  • notebook-kernel-drift-guard.yml
  • notebook-math-render.yml
  • notebook-plan-loss-gate.yml
  • organ-duplication-advisory.yml
  • owui-playwright-check.yml
  • perimeter-review-guard.yml
  • pr-gate.yml
  • scripts-tests.yml
  • ... et 2 autre(s)

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22822 (Fix(ci,#17397): deporter 11 gardes PR sans besoin local vers ubuntu-latest (lot 2, empile sur #22821)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 27, 2026
…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>
@jsboige
jsboige force-pushed the fix/offload-batch-b branch from 1ae55ce to 7dd25be Compare October 27, 2026 03:22
@jsboige
jsboige changed the base branch from fix/offload-batch-a to main October 27, 2026 03:22

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[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.

@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR : sa base a change apres son dernier run pull_request (issue #14477 cause 4). Le retarget emet l'action edited, que pr-gate.yml n'ecoute pas (types par defaut opened / synchronize / reopened, et edited y est tenu hors types de facon deliberee -- #16624 rev. ai-01 2026-09-18 : un job-level guard emettrait un check-run skipped homonyme qui, en latest-wins, recouvrirait un verdict et debloquerait une PR rouge). Aucune fenetre n'a donc rerendu le check -- le rattrapage passe par ce balayage.

Cause mesuree : base_ref_changed=2026-10-27T03:22:46Z, dernier run PR gate=aucun

@myia-ai-01
myia-ai-01 merged commit 11487ce into main Oct 27, 2026
2 checks passed
jsboige added a commit that referenced this pull request Oct 27, 2026
…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>
myia-ai-01 pushed a commit that referenced this pull request Oct 27, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants