Repository navigation
fix(ci,#14976): pr_gate conclusion-first + STARVED nomme le couple status/conclusion - #15013
Conversation
…atus/conclusion Un check-run fige a status=in_progress avec une conclusion terminale (mesure #14967 : 90 min apres son propre completed_at) etait pollue jusqu'a STARVED par le test status-first. Conclusion est desormais autoritatif ; status ne decide que si conclusion est nul. Chaque constituant pending rend son couple observe (nom [status/conclusion]), et le message STARVED nomme le geste de reparation (rerun le run ENFANT, jamais le gate). Controle positif : tests nouveau rouges sur le code non-fixe, verts apres (113 tests pr_gate). Co-Authored-By: Claude-Code <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
Vérifié le diff + exécuté les tests à la SHA head (26b18a3). Les 8 tests #14976 (frozen check-run, pending label, STARVED message child-rerun) passent tous. Le test test_completed_without_conclusion_is_pending_not_pass reste vert. Le changement supprime bien le test status-first (status in STATUS_PENDING or not conclusion) au profit du test conclusion-first (not conclusion), conforme à la mesure #14967 (record figé in_progress/success 90 min après completed_at).
Les 3 échecs observés dans mon run local (test_derive_always_on_reads_real_workflows_and_excludes_self, test_advisory_jobs_roster_*) sont environnementaux : ils appellent derive_always_on_jobs() qui lit le vrai .github/workflows du repo, absent de mon checkout isolé — PAS causés par ce diff. Le roster retourne 0 jobs car aucun workflow réel n'est présent localement.
Le verdict passe de status-first à conclusion-first : c'est le bon correctif, le message STARVED nomme maintenant le geste de réparation (rerun du CHILD run). Solide, documenté, testé.
Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/tooling #15004
pr_gate : un check-run fige (conclusion terminale + status in_progress) pollue jusqu'a STARVED
Closes #14976
Le defaut
scripts/pr_gate.py:483(classify) :Le
orcourt-circuite sur son premier membre : unconclusionterminal nepeut pas racheter un
statusfige. Orconclusionest autoritatif (l'UIGitHub affiche ce job en vert). Mesure sur #14967 (2026-09-06) :
Detect notebook changesetait astatus=in_progressavecconclusion=success90 min apres le
completed_atde son propre job, confirme sur deux endpointsindependants. Le
PR gatea poll ce job vert jusqu'a l'expiration du budget(45 min) et a verdicte
STARVEDsur une PR dont rien n'etait rouge.Le fix
quel que soit
status.statusne decide que siconclusionest nul --et alors le check est pending de toute facon.
pending(_pending_label) : chaque constituanten attente rend
nom [status/conclusion]. Le messageSTARVEDnomme doncle couple reel : un
Detect notebook changes [in_progress/success]estimmediatement distinct d'un
Slow CI [in_progress/none](l'inverse etaitce qui a coute le diagnostic de 90 min).
conclusion terminale est wedge, pas lent -- relancer son run ENFANT
(
gh run rerun <id>), jamais le gate. Le piege est documente : relancerl'agregateur ne repare rien, il re-poll le meme enregistrement fige.
STATUS_PENDING(constante devenue morte) supprimee.Controle positif (acceptance 2)
Les tests nouvellement ajoutes sont ROUGES sur le code non-fixe (verifie
: 5 failed avant le correctif), verts apres (113 tests pr_gate passent).
Le cas fige
{status:"in_progress", conclusion:"success"}tombe dansok,{status:"in_progress", conclusion:"failure"}tombe dansbad.Acceptance (issue, point par point)
classifytraite une conclusion terminale comme terminale{status:in_progress, conclusion:success}->ok;failure->badSTARVEDnomme le couple status/conclusion observenom [status/conclusion]STARVED+ docstringsPerimetre
2 fichiers : scripts/pr_gate.py, scripts/tests/test_pr_gate.py