Skip to content

CI: pr-gate-rerun lit une tentative 'queued' morte comme 'en vol' et saute -- PR READY bloquee sans rouge #17680

Description

@myia-ai-01

Constat (mesuré le 2026-09-24, 14:20Z)

Trois tentatives de rerun du workflow PR gate sont restées à l'état queued, avec une liste de jobs vide, pendant 19 h 30. Elles avaient été demandées le 2026-09-23 à 18:52Z :

run tentative branche PR
35895035044 2 feature/16754-analytics-from-scratch #17099
35895498445 2 feature/16638-deaccent-lean5 —
35897178513 2 refactor/16231-finetuning-kernel-suffix —

La file tournait pendant ce temps. Les tentatives demandées le même jour à 14:20Z ont démarré puis abouti en quelques minutes. Seules ces trois-là étaient mortes.

Conséquence : #17099 était READY (gate rc=0, B.0 rc=0) mais mergeStateStatus: BLOCKED sans aucun rouge, parce que le check requis PR gate manquait au rollup.

Pourquoi aucun organe ne le débloquait

pr-gate-rerun.yml (étape « Resolve route », l.140-145) traite tout status != completed comme « en vol : il verra le verdict frais », puis saute :

[pr-gate] target run 35895035044: status=queued conclusion=null
[pr-gate] run in flight (queued) -- it will see the fresh guard verdict, skip

Une tentative orpheline est donc indiscernable d'une tentative saine. Le balayage pr-gate-stale-sweep.yml et une relance manuelle par workflow_dispatch empruntent la même branche : l'impasse est complète.

Remède manuel (vérifié)

gh run cancel <id>, attendre completed/cancelled, puis gh run rerun <id>. Les trois tentatives sont passées au vert en moins de 10 minutes, et #17099 a été mergée à 14:32Z.

Remède d'organe proposé

Dans le route, une tentative queued dont le run_started_at date de plus de N heures (2 h, par exemple) ne doit plus être lue comme « en vol ». Il faut la traiter comme morte : cancel, attente de completed, puis rerun complet. Le seuil se prend au-dessus de la latence de file mesurée (scripts/ci/gh_queue_health.py).

Critère d'acceptation : un test du route qui injecte une tentative queued vieille de plus de N heures et attend action=rerun après cancel. Un second test, avec une tentative queued récente, attend action=skip.

Activity

  1. jsboige commented on Sep 24, 2026

    @jsboige
    Owner

    Livraison : PR #17689 — les 2 critères d'acceptation sont couverts verbatim par test_stale_queued_attempt_is_cancelled_then_rerun (queued 19h30 → cancel émis → statuts queued/cancelling/completed consommés → action=rerun) et test_recent_queued_attempt_skips_without_cancel (5 min → action=skip, zéro cancel).

    Deux points de design au-delà du scope minimal, motivés en body PR :

    1. La route est extraite dans scripts/ci/pr_gate_route.py (horloge injectée, 16 tests) — la branche morte exige une comparaison temporelle qu'un bash inline ne peut pas tester honnêtement.
    2. Le sweep dispatche le harnais quand son rerun est refusé (signature dead-queued) — sinon l'impasse restait complète côté organes autonomes, qui n'ont pas de checkout python dans leur boucle (CI: l'organe qui repare les PR gates perimes est annule 19 fois sur 30 — 2 min d'execution, 2 h de file #12728).

    Note : le second critère d'acceptation de l'issue (« Dry-run relancé sur ai-01 ») reste à exécuter sur votre machine (les deux worktrees cités y vivent) — le dry-run local du script donne skip sur toute PR sans run mort, mais la preuve sur VOS deux worktrees n'est pas reproductible depuis po-2026.

  2. added a commit that references this issue on Sep 29, 2026
  3. added a commit that references this issue on Sep 29, 2026
  4. added a commit that references this issue on Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions