Repository navigation
fix(ci,#17397): pr-gate quitte le parc qu'il mesure + attribution fabriquee retiree - #17436
Conversation
…riquee retiree Etape 1 -- `pr-gate.yml` passe en `runs-on: ubuntu-latest` sans condition. Les PRs de fork y allaient deja ; le ternaire ne privait de cette immunite que les PRs internes. C'est un agregateur pur (aucun secret, docker, GPU, Lean, .NET, notebook, conda, WSL) qui decide de la mergeabilite : tant qu'il tournait sur `coursia-waiter`, il degradait exactement quand la file qu'il doit debloquer grossissait. Aucune capacite self-hosted n'est coupee. Etape 0 -- `pr-gate-stale-sweep.yml:116` attribuait a #12728 un « mandat: consume the containerized runs ». Verifie firsthand : #12728 ne contient ni « mandat », ni « containerized », ni « hosted ». L'arbitrage etait lie a une mesure (1,6-2,2 h de file hosted sur SA fenetre), et cette premisse s'est inversee depuis. Le commentaire le dit maintenant. See #17397. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
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 |
Path-collision (organ #13359/#13615)Cette PR #17436 (
|
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] VERDICT: LGTM — diff minimal vérifié, rouge du head mesuré = classe parc, pas la PR.
- Le diff fait exactement ce qu'il annonce :
pr-gate.ymlagrégateur →runs-on: ubuntu-latest(le ternaire fork-only n'immunisait que les forks) + mise à jour du commentaire stale-sweep ; gardeself-hosted-runner-policyvert au heada7a0a226(la forme passe le garde DYNAMIC_RUNS_ON). - Le rouge du head n'est pas de ce diff :
Scripts Tests (CPU)échoue surBASELINE_FAILED … exit=127 sandbox=gauntletsur runner self-hosted (CoursIA-runners-p0/slot-3) — la classe parc documentée (#17397, exit 127 gauntlet vue sur voisines), que cette PR traite justement.PR gaterouge = pure agrégation de ce job. - Réserve honnête (non bloquante) : cette PR immunise l'agrégateur, mais
Scripts Tests (CPU)reste self-hosted et rouge — tant que l'étape 2 n'a pas traité ce job,PR gatecontinuera d'agréger un rouge parc. Décongestion réelle = étapes suivantes ; c'est assumé dans le body (étapes 0-1 de #17397).
via jsboige (non-auteur de la PR)
|
[ADJOINT PREFLIGHT] Notes de lecture pour le mergeur (lane myia-ai-01:CoursIA, tete 863f6d1) :
|
…corrigee sur main, la clause re-introduite l.219 est retiree #17436 a retire l'attribution fabriquee de la l.116 dans une forme plus courte : la resolution garde la version de main pour ce bloc. Mais #17470 a re-introduit la meme classe de claim plus bas (« The container-run mandate stays the rule for every OTHER workflow ») : c'est ce que ce commit retire, en nommant le mandat reel (#17397). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Grain: DEEP/CI -- lane myia-ai-01:CoursIA -- prev: #17397
Mandat
Arbitrage user direct du 2026-09-22, verbatim : « Q35 Go, tout ce qui est néessaire pour que le CI ne soit plus source de congestion ».
Cette PR porte les étapes 0 et 1 de #17397. Les étapes 2 et 4 partent en dispatch aux lanes dans le même cycle, pas après cette PR : l'étape 1 est un préalable de validation, pas un verrou de séquence.
Étape 1 —
pr-gate.ymlquitte le parc qu'il mesureAvant, une seule ligne portait un ternaire :
Les PRs de fork allaient déjà sur
ubuntu-latest. La condition ne faisait donc qu'une chose : priver les PRs internes de cette immunité. Après :runs-on: ubuntu-latest, sans condition.L'argument est de robustesse avant d'être de capacité.
pr-gateest un agrégateur pur — aucun secret, docker, GPU, Lean, .NET, notebook, conda ni WSL — et c'est l'organe qui décide si une PR est mergeable. Tant qu'il tournait surcoursia-waiter, il se dégradait exactement quand la file qu'il doit débloquer grossissait. Mesure du cycle 2026-09-22 : sur 80 candidates, 27 refusées pour rouge CI, etPR gatefigure parmi les checks fautifs d'une vingtaine d'entre elles — alors que la cause était la saturation du parc local, pas un défaut de PR.Le deadlock est déjà écrit dans le dépôt, sans que la conséquence en ait été tirée :
pr-gate-stale-sweep.ymlnote que « the waiters are held by the aggregators this sweep must unblock ».Aucune capacité n'est coupée. Le pool
coursia-waiter(28 slots) est libéré de l'agrégateur, au profit de ce qui a un besoin local réel.Étape 0 — une attribution fabriquée, retirée
pr-gate-stale-sweep.yml:116portait :Vérifié firsthand : #12728 ne contient ni « mandat », ni « containerized », ni « hosted », ni dans son body ni dans ses commentaires. Deux défauts, le second plus coûteux que le premier :
Le commentaire dit maintenant ce que #12728 a réellement mesuré (1,6-2,2 h de file hosted sur sa propre fenêtre) et que cette prémisse a tourné. Une seule occurrence dans tout le dépôt : la phrase n'a essaimé nulle part.
Mesure — avant/après, par l'organe du dépôt
scripts/ci/measure_runner_demand.pymesure déjàcreated_at → started_atpar job, avec ses dénominateurs et un mode replay hors-ligne. Il n'a pas été réécrit.results-artifact-policy). Chiffres agrégés reportés en commentaire de cette PR.pr-gatespécifiquement, pas sur l'agrégat, pour que la comparaison porte sur l'objet modifié.La comparaison est annoncée avant le merge et rendue après : sans le « après », l'étape 2 s'appuierait sur une intuition.
Portée — ce que cette PR ne fait pas
coursia-waiter(étape 3) : tant que la charge n'est pas réellement partie, réduire le pool serait mesurer une hypothèse.pr-gaten'en dépend pas : son absence de besoin se lit directement dans le fichier.Vérification
yaml.safe_loaddes deux fichiersgit diff --statubuntu-latest)coursia-waiterSee #17397.
🤖 Generated with Claude Code