Skip to content

ci(readme-ipynb-links): plafond timeout-minutes 5 trop court sous contention -- le PR gate transforme une annulation de jambe en rouge bloquant #19982

Description

@jsboige

Constat

La jambe CI Audit README -> .ipynb links (workflow .github/workflows/readme-ipynb-links-guard.yml, job declare timeout-minutes: 5 a la ligne 57) est annulee par son propre plafond des que le parc de runners est sature, et cette annulation est ensuite reportee par le PR gate comme un echec bloquant :

##[error][pr-gate] FAIL -- checks that hit their declared timeout-minutes:
Audit README -> .ipynb links (cancelled, 6m19s, declared timeout-minutes: 5)
-- rerunning the gate re-reads the same frozen check-run: rerun the CHILD run
that owns the job (gh run rerun <id>), never the gate (#15905)

Le message est explicite : ce n'est pas un finding, c'est une jambe qui a depasse son propre plafond. Le gate le nomme faute de pouvoir distinguer une annulation-par-plafond d'un echec reel.

Mesure (PR #19601, tete 0f1ccc46bc)

Fait Mesure
Jambe d'origine job 113514130318, started 2026-10-08T20:01:39Z, cancelled 20:07:58Z -> 6 m 19 s contre un plafond declare de 5 min
Gate qui la reporte run 37836317448 / job 113514118557, started 20:03:06Z, completed 20:08:32Z — il lit la check-run figee (annulee) et rend failure
Rejeu de la jambe enfant (geste prescrit par le gate) job 113518292412, 20:11:08Z -> 20:12:44Z, success, 7 pas peuples
Consequence le gate, lui, reste rouge jusqu'a un nouveau run : sa lecture predate le rejeu de la jambe

La meme jambe avait deja ete annulee par plafond sur la meme PR a 16:46Z. Elle est par ailleurs verte des dizaines de fois par heure sur la flotte aux heures creuses : la duree depend de la contention, pas du contenu de la PR.

Pourquoi c'est structurel

Le workflow rend un site/document entier (quarto render) et scanne le corpus README -> .ipynb (plus de 8000 liens). Hors contention il tient largement sous 5 min ; sous contention (files de plusieurs dizaines de runs, cf. le parc charge de la journee) il les depasse, est annule, et le PR gate transforme l'annulation en rouge bloquant pour la PR. Toute PR touchant un README herite donc d'un rouge fantome qui :

  1. n'accuse pas le livrable,
  2. ne se leve pas par gh run rerun du gate (le message le dit : la check-run est figee),
  3. exige un rejeu de la jambe enfant, geste que peu de lanes connaissent.

Correctif propose

Elever le plafond de cette jambe a une valeur qui couvre la contention mesuree (par ex. timeout-minutes: 12 — la duree normale est de l'ordre de la minute, le plafond n'est qu'un garde-fou anti-blocage), sans toucher aux autres jambes. Alternative ou complement : faire distinguer par le PR gate une cancelled-sur-plafond d'un failure reel (une cancelled de plafond ne devrait pas etre un rouge bloquant, ou devrait etre re-roulee automatiquement une fois).

Acceptance

  • une PR touchant un README ne peut plus obtenir un PR gate rouge dont le seul motif est checks that hit their declared timeout-minutes: Audit README -> .ipynb links ;
  • verification : sur une fenetre de forte contention, la jambe se termine (success ou echec reel nomme) au lieu d'etre annulee par plafond.

Sans parent : fragilite d'infrastructure mesuree en cycle, non rattachee a une EPIC ouverte. Le correctif est une PR ci(...) d'une ligne, retenue par le plafond WIP de la lane qui l'a mesuree.

🤖 Generated with Claude Code

Activity

  1. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2026:CoursIA-2 -- paths: .github/workflows/readme-ipynb-links-guard.yml -- 2026-10-08T21:05Z

    Correctif scopé : élever le plafond de la jambe à 12 min.

    Mesure corrigée (2026-10-08, au niveau du job — le plafond borne le job, pas le run ; ma première mesure citait une durée de run et l'attribuait au job, d'où une marge annoncée fausse) : 40 jobs de 16:47Z à 20:29Z, 67 s à 282 s, médiane ~97 s ; 1 job annulé à 304 s par le plafond (run 37801429740) ; 2 autres annulations (46 s et 81 s) = supersessions de concurrence, sans rapport.

    Le chiffre disqualifiant n'est pas l'annulé à 304 s, c'est le réussi à 282 s : à 18 s du plafond. Les 300 s tombent au milieu de la distribution légitime, pas hors d'elle.

    Le volet « faire distinguer par le PR gate une cancellation-sur-plafond d'un échec réel » n'est PAS pris : le comportement actuel est doctrinal (#15905, docstring de scripts/pr_gate.py : « a timeout can be code that is too slow, and the gate cannot tell from a check-run », fail-closed assumé). Le changer serait un renversement de doctrine, pas un correctif de fragilité.

    PR #19985.

  2. added a commit that references this issue on Oct 8, 2026
  3. added a commit that references this issue on Oct 9, 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