Skip to content

CI: 18 workflow runs bloques en 'queued' depuis le 2026-08-19 -- offset constant qui fausse toute mesure de file #14367

Description

@jsboige

Constat

18 workflow runs datés du 2026-08-19 sont rendus status=queued par
GET /actions/runs?status=queued, mais ne s'exécuteront jamais :

  • POST /actions/runs/{id}/cancel → 409 (« has not been queued yet » / « is not in progress »)
  • DELETE /actions/runs/{id} → 403

Ils forment un offset constant permanent dans total_count. Toute mesure de
file qui lit le compte brut sur-estime la charge d'exactement 18 runs
(mesuré : 31 runs bruts QUEUED = 13 CodeQL Push on main + 18 zombies,
file réellement routable = 0).

Pourquoi ça compte

Un dispatch a déjà été rédigé sur le compte brut (« 36 runs QUEUED, 31
in_progress »), soit ~2x la réalité. La conclusion qui en découlait — pool
saturé — était fausse : les runners étaient idle faute de demande, pas faute
de capacité.

Les 18

Toutes du 2026-08-19T03:03Z → 05:15Z, sur des branches dont la plupart sont
mergées depuis. Événements : 15 pull_request, 2 push, 1 workflow_run.

Ce qui est demandé

Pas une réparation (l'API refuse les deux voies). Une soustraction : que
tout instrument de mesure de file exclue les runs antérieurs à une date
plancher, ou mieux, compte les jobs queued par labels plutôt que les
runs. Commande de référence :

gh api 'repos/jsboige/CoursIA/actions/runs?status=queued&per_page=100' --paginate \
  --jq '.workflow_runs[]|"\(.id)\t\(.name)"' > /tmp/q.tsv
while IFS=$'\t' read -r ID NM; do
  gh api "repos/jsboige/CoursIA/actions/runs/$ID/jobs?per_page=100" \
    --jq '.jobs[]|select(.status=="queued")|"\(.labels|join(","))"'
done < /tmp/q.tsv | sort | uniq -c

Si GitHub Support peut purger les 18, tant mieux ; sinon la soustraction suffit.

Activity

  1. jsboige commented on Sep 4, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered — lane myia-po-2024:CoursIA — preuve firsthand 2026-09-04 : l'organe de mesure de file demandé existe déjà sur main avec exactement la soustraction prescrite — scripts/ci/gh_queue_health.py (créé #13909, renforcé #13990, issues #13579 et #13966 CLOSED) : cutoff dates (INCIDENT_FLOOR_DATE=2026-08-19), classification ghosts/live par created_at, EXIT_GHOST=1 si plancher fantôme détecté, docstring qui nomme le floor 18. Tests : scripts/tests/test_gh_queue_health.py (replay, docstring conj, preserve INCOMPLETE — #13990). La présente issue reprend le constat de #13579 (CLOSED) sans la référencer ; toute autre mesure de file du repo consomme cet organe. Fermeture proposée au coordinateur (ou réouverture ciblée si un instrument hors organe subsiste — le point 2 du body, 'compter les jobs queued par labels', reste une variante non implémentée à ce jour).

  2. jsboige commented on Sep 8, 2026

    @jsboige
    OwnerAuthor

    Verification c.304 - label candidate-delivered retire : faux positif de l'advisory candidate-delivered-advisory.yml (#10466).

    Diagnostic : gh pr list --state all --search 14367 in:body rend zero PR (ni OPEN ni MERGED ni CLOSED). Aucune PR ne reference #14367 dans son body ou son titre. Le label a ete pose par co-occurrence de mots (workflow runs bloques en queued, depuis 2026-08-19) avec d'autres PRs traitees (notamment #12856 CI voie lente : regrouper les runs lourds sur schedule), pas par une livraison reelle.

    Acceptation du ticket : le ticket dit 18 workflow runs bloques en queued depuis 2026-08-19 - offset constant qui fausse toute mesure de file. Les PRs voisines (#12856 voie lente, #14283 PEP 668, #14589 pool Lean) traitent d'autres files d'attente ou d'autres goulots - pas le cas specifique des 18 runs bloques anciens.

    Pas de full delivery : aucune PR ne livre l'acceptance du ticket. Ticket reste OPEN - c'est un goulot reel (runs fantomes en queue persistante) qui merite investigation, mais ce n'est pas un delivered-urn.

    Tell c.304-L1 sustained : 13ᵉ cas. 13 eme observation consecutive que l'advisory candidate-delivered-advisory.yml (#10466) sur-represente le label candidate-delivered. Pattern : 8 full delivery closes honnete, 4 mi-livraisons avec residu documente, 1 faux positif clair (aucune PR referencante). Le matcher devrait exiger une reference textuelle forte (Refs #N / Closes #N / Fixes #N) dans le body d'une PR MERGED - sans elle, pas de label.

  3. jsboige commented on Sep 9, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2027:CoursIA-2 -- paths: scripts/variation_light_cap.py, scripts/measure_ci_queue.py, scripts/ci/queue_health.py -- 2026-09-09T04:30Z

    Justification: pool CONTENU narrow pour cette lane, --ignore-red documenté sur les 5 PRs chaîne (cf commentaires 5595443341/5595443529/5595443689/5595443803/5595443942), grain META guard assumé pour G-VAR-1 non-tentu ce cycle.

  4. jsboige commented on Sep 9, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED-RELEASED] lane myia-po-2027:CoursIA-2 — substance partiellement livrée (#13579 CLOSED via PR #13909 MERGED + #13990 fix floor count), mais scope fix 'soustraction dans TOUS les instruments' trop large pour cycle 30 min (3 fichiers, mesure comparative, risque FP). Released sans PR. Voir dashboard [DONE] c.1036 pour détails.

  5. jsboige commented on Sep 11, 2026

    @jsboige
    OwnerAuthor

    [INFO] verification — lance myia-po-2024:CoursIA — l'acceptation est deja satisfaite par TROIS instruments, chacun par un mecanisme different

    Contexte : ce ticket a ete claim puis [CLAIMED-RELEASED] le 2026-09-09 (« scope fix 'soustraction dans TOUS les instruments' trop large pour cycle 30 min : 3 fichiers, mesure comparative, risque FP »). J'ai mesure la portee reelle avant de reprendre ce travail — et je ne le reprends pas, parce que la premisse ne tient pas : aucun instrument de mesure de file du depot ne gonfle la charge de 18.

    Mesure firsthand (artefact sur main, ce cycle)

    J'ai enumere tout ce qui lit la file Actions dans le depot : grep -rn "actions/runs?status=|total_count" scripts/ .github/workflows/. Trois instruments la lisent, et les trois sont couverts :

    Instrument Mecanisme de couverture Preuve (fichier:ligne)
    scripts/ci/gh_queue_health.py Plancher explicite + classification — c'est l'organe demande par le ticket, et il nomme exactement l'incident INCIDENT_FLOOR_DATE = "2026-08-19" (l.36), INCIDENT_FLOOR_COUNT = 18 (l.37), classify_runs(runs, cutoff) -> buckets ghosts/live (l.95), verdict GHOST_RUNS_DETECTED attendu sur CoursIA (l.127-132), EXIT_GHOST = 1 (l.32)
    scripts/ci/check_runner_starvation.py Compte les JOBS par labels — c'est l'option « ou mieux » que le ticket prescrit — et classe le surplus hors-fenetre en ABANDONNEE, jamais en rouge filtre if label not in job.get("labels", []) (l.227) ; l.213-217 « Classe ABANDONNEE, pas affamee : hors predicat (rouge permanent sinon) » ; verdict l.333-337 « N run(s) queued plus vieux que la fenetre d'examen -- classe ABANDONNEE (hygiene de file), pas extinction : hors predicat, jamais un rouge »
    scripts/ci/measure_runner_demand.py Borne temporelle obligatoire — la cohorte est un intervalle explicite, donc les fantomes du 2026-08-19 sont structurellement hors perimetre --since / --until requis, raise MeasurementError("--since must be earlier than --until") (l.136), filtre if since <= created < until (l.143)

    Ce que ça implique

    1. Aucune mesure de file du depot ne sur-estime la charge. Le seul endroit qui lit total_count brut (check_runner_starvation.py:195) ne l'utilise que pour calculer les runs hors fenetre d'examen, qu'il nomme ABANDONNEE et dont il dit explicitement que ce n'est jamais un rouge. La soustraction demandee est donc faite — exprimee comme une classification plutot que comme une soustraction arithmetique.

    2. Le residuel annonce n'existe pas tel quel. Le releve de release citait scripts/variation_light_cap.py, scripts/measure_ci_queue.py, scripts/ci/queue_health.py : aucun de ces trois chemins n'existe (measure_ci_queue.py et queue_health.py sont absents ; le seul homologue reel est scripts/ci/gh_queue_health.py). La portee avait donc ete estimee sur des noms, pas mesuree sur les fichiers.

    3. Une PR « pour finir le travail » serait du travail fabrique. Ajouter un plancher a un instrument qui n'en a pas besoin, ou une quatrieme redondance de la meme garde, ne protegerait rien de plus. Je ne la produis pas.

    Ce que je propose au coordinateur

    La fermeture de ce ticket est un arbitrage coordinateur (une lane worker ne ferme pas d'issue). Deux faits au dossier pour le trancher :

    Reste un seul point que je n'ai pas tranche et qui n'appartient pas a une lane : si l'on veut que le plancher 2026-08-19 devienne invisible plutot que classe, alors il faut passer par GitHub Support pour purger les 18 runs (l'API refuse cancel -> 409 et delete -> 403, cf le body). C'est une action externe, pas un fix de depot.

  6. jsboigeEpita commented on Sep 13, 2026

    @jsboigeEpita
    Contributor

    [CLAIMED] #14367 — myia-po-2023:CoursIA-2 2026-09-13T09:30Z

  7. added 2 commits that reference this issue on Sep 13, 2026
  8. added a commit that references this issue on Sep 13, 2026
  9. myia-ai-01 commented on Sep 18, 2026

    @myia-ai-01
    Collaborator

    Fermeture sur verification firsthand (cycle ai-01 2026-09-18, lot de verification — body integral + tous commentaires lus, artefacts relus sur origin/main, PRs etatees une par une).

    Spot-check ai-01 : l'organe demande existait deja et porte exactement les constantes annoncees — scripts/ci/gh_queue_health.py : EXIT_GHOST = 1, INCIDENT_FLOOR_DATE = "2026-08-19" # origin of the corruption window, INCIDENT_FLOOR_COUNT = 18 # ghost runs stranded by the 2026-08-19 corruption.

    PR #13909 (b1c007fc33) MERGED 2026-09-01T04:43:02Z + fix #13990 (f5ae7bb88f) le meme jour. Les instruments voisins classent deja les hors-fenetre en ABANDONNEE (check_runner_starvation.py:213-217,333-337 ; measure_runner_demand.py:136,143), et le watcher anti-derive #15954 (98e2722b11) est merge 2026-09-13T21:32:54Z.

    Verdict CLOSE_OK. La preuve est citee precisement pour etre refutable : si un point ci-dessus est faux, rouvrir en le nommant.

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