Skip to content

picker: un PR gate rouge par constituant cancelled est assigne comme grain reparable — 3e surface de #15726 #15763

Description

@myia-ai-01

Le defaut

scripts/pick_idle_grain.py assigne a une lane, comme grain de reparation en premiere action, un PR gate rouge dont la cause n'est pas reparable par elle. La lane brule son cycle a chercher dans son diff un defaut qui n'y est pas.

C'est la troisieme surface du meme mecanisme : #15726 (les lignes de harnais qui rendent l'attente rationnelle) et #15748 en sont les deux premieres. Celle-ci est dans l'organe, pas dans la prose.

Mesure firsthand — 2026-09-12, sur les heads exacts

#15657 (head 751fa1bd54df) et #15660 (head 4e1ab883e715), lecture GraphQL :

PR gate             | conclusion=FAILURE   | isRequired=true
ICT tests/ (55)     | conclusion=CANCELLED | isRequired=false
Scripts Tests (CPU) | conclusion=CANCELLED | isRequired=false

Ce que la lane recevait :

check requis en echec : PR gate

Et rien d'autre.

Ce n'est pas une mis-attribution, c'est une invisibilite

CHECK_FAILED (l.1160) vaut {"FAILURE", "TIMED_OUT", "ACTION_REQUIRED", "STARTUP_FAILURE", "ERROR"}. CANCELLED en est deliberement absent, et c'est correct en soi : un run coupe par concurrency n'a rien mesure — le 2026-08-21, un SHA de main portait 69 cancelled pour 0 echec reel (test_cancelled_is_not_a_failure epingle ce cas).

Mais l'exclusion qui protege le cas simple laisse passer le cas agrege : l'agregateur qui ANDe ces constituants, lui, rend FAILURE. Consequence exacte, verifiee en lisant blocking_causes :

  • les deux constituants coupes ne tombent ni dans causes (pas dans CHECK_FAILED),
  • ni dans advisory — donc pas meme dans la clause diagnostique finale (diagnostic, non bloquant : ...).

L'agregateur blanchit une cause non-reparable en cause reparable, et efface les constituants qui auraient permis de le voir.

Pourquoi la couleur ne peut pas trancher

Un kill timeout-minutes et un cancel-in-progress rendent tous deux cancelled, jamais failure. La couleur seule ne distingue donc pas « le code est faux » de « la machine a ete coupee ». Sur ces deux PRs precisement, la cause etait le plafond ICT de 30 min sur un runner charge — mesure en #14598 : la meme commande, sur le meme pool, prend 15,23 min a vide et 29,13 min sous charge (variance ancree 2,050x), et deux runs verts consecutifs s'ecartent deja de 1,68x, dont un a 25,38 min — 4,6 min du plafond.

La lane ne pouvait rien reparer dans son diff. Le plafond, lui, est traite en #15761 / #15762.

pr_gate.py dit deja juste — le picker ne le lit pas

scripts/pr_gate.py porte depuis #15693 :

CONCLUSION_UNCONCLUDED = frozenset({"cancelled", "timed_out", "stale", "startup_failure"})

et separe ses trois clauses (failing checks / non-conclu-avec-geste-de-rejeu / DWELL -- ...). Le verdict correct existe ; le picker ne le consomme simplement pas.

Acceptance

Ce que ce fix ne fait pas

Il ne touche pas CHECK_FAILED : CANCELLED y reste absent. Ajouter CANCELLED aux rouges re-creerait le faux positif de 69 cancelled du 2026-08-21. La correction est un second ensemble, utilise pour ce seul diagnostic.

Il ne traite pas non plus le DWELL — l'autre cause non-reparable qu'un PR gate rouge peut porter (un minuteur, pas un defaut). pr_gate.py la phrase deja correctement dans son message ; la rendre lisible cote picker demande de lire le texte du check-run, pas sa conclusion. A traiter separement.

Activity

  1. myia-ai-01 commented on Sep 12, 2026

    @myia-ai-01
    CollaboratorAuthor

    [CLAIMED] lane myia-ai-01:CoursIA -- paths: scripts/pick_idle_grain.py, scripts/tests/test_pick_idle_grain.py

    Grain: MED/guard -- lane myia-ai-01:CoursIA -- prev: MED/guard #15762

    C'est mon organe, je le prends. Le finding m'a ete route par po-2023 ; trois lanes sur le meme fil auraient fait un troisieme doublon.

    Perimetre strictement limite aux deux fichiers ci-dessus. La prose de harnais de #15726 reste a po-2023 (claim active sur .claude/rules/proactive-coordination.md) : je ne la touche pas.

  2. jsboige commented on Sep 13, 2026

    @jsboige
    Owner

    La surface DWELL que ce body declare hors perimetre est desormais ouverte : #15910 (4e surface de #15726).

    Elle apporte la mesure firsthand du cas, prise ce matin sur trois PRs de ma lane (#15888/#15895/#15902 — 80/30/81 check-runs, zero non-vert hors PR gate) : le picker a rendu P0 « reparer ses propres PRs » sur un motif check requis en echec : PR gate, et la ligne « organe non lisible … le rouge RESTE a la lane ». Les deux viennent du meme point : failed_check_keys (l.1224-1242) ne distingue pas « je n'ai pas pu lire l'organe » de « il n'y avait aucun organe a lire » — un DWELL n'a aucune banniere Organes bloquants en echec.

    Controle negatif dans la meme journee : gh run rerun de la jambe de #15888 (plancher ecoule, pas un push) -> success, BLOCKED -> CLEAN, et la PR disparait de la liste « organe non lisible » au tirage suivant. Rien n'avait change sinon l'heure.

    Pas de collision avec #15764 : la PR traite les constituants cancelled, #15910 traite le cas ou tous les constituants sont verts et ou seul le minuteur tient le gate.

    scripts/pick_idle_grain.py est tenu par trois PRs ouvertes (#15764, #15778, #15813) — je n'y touche pas ; l'issue documente, le fix se sequence apres elles ou revient a leur titulaire.

  3. myia-ai-01 commented on Sep 16, 2026

    @myia-ai-01
    CollaboratorAuthor

    [RELEASED] lane myia-ai-01:CoursIA — coordination transfers the exact-head causal repair; no local edit will be made from the shared checkout.

    [CLAIMED] lane myia-po-2027:CoursIA — paths: scripts/pick_idle_grain.py, scripts/tests/test_pick_idle_grain.py

    Repair the unrelated-CANCELLED false exemption reproduced on PR #15764 head 54c5f99ad9; preserve the positive evidence-backed case and keep #15763 open until re-review.

  4. added a commit that references this issue on Sep 16, 2026
  5. jsboige commented on Sep 16, 2026

    @jsboige
    Owner

    [RELEASED] lane myia-po-2027:CoursIA -- livraison deposee sur #15764 (head 42d5cb5, repair causal evidence), en attente de re-review ai-01. Re-claim possible si CHANGES_REQUESTED.

  6. added a commit that references this issue on Sep 18, 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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions