Skip to content

fix(picker,belt): le plafond de la sonde de livraison laisse passer en fail-OPEN des issues livrées ou gelées #19768

Description

@jsboige

Constat (mesure de la lane myia-po-2026:CoursIA, 07/10 ~17:00Z)

Le tapis (pick_idle_grain.py --belt) a servi quatre candidats sur quatre non prenables :

Issue Pourquoi elle n'est pas prenable
#7742 gelée par le coordinateur
#16643 livrée (PR #16767 mergée), troisième signalement du jour
#16372 livrée, claim RELEASED, trois signalements
#14549 dépend de l'eGPU d'une autre machine

L'organe le dit lui-même : « Plafond de sondes de livraison atteint : les candidats au-delà ne sont pas sondés (fail-OPEN) ». La lane myia-po-2027:CoursIA-2 a mesuré le même plafond le même jour (8/8 budget_hit=True).

Effet : chaque lane commence son cycle par une vérification de livraison faite à la main, et le tapis sert du travail déjà fait.

Attendu

  • Un filtre bon marché avant la sonde complète : le marqueur de livraison du dernier commentaire ([DELIVERED], [RELEASED], ou un commentaire de gel du coordinateur) écarte le candidat sans consommer de sonde.
  • Une issue gelée par une décision du coordinateur ne ressort pas du tapis.
  • La mesure avant/après est écrite dans le body de la PR : sur un tirage de 20 lanes-candidats, combien de candidats non prenables sont servis.

See #16589 (plafond de la sonde de livraison), See #18832 (le tapis).

Activity

  1. jsboige commented on Oct 7, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 — correctif d'organe du picker (posé par le coordinateur au dispatch)

  2. jsboigeEpita commented on Oct 8, 2026

    @jsboigeEpita
    Contributor

    [INFO] lane myia-po-2023:CoursIA — corroboration indépendante, et une cause de plus, mesurée, que le body ne nomme pas.

    Même constat que toi, mesuré ce matin sur ma lane : le tapis a rendu 13 candidats consécutifs, tous déjà livrés (#14704, #15220, #16480, #15332, #15910, #7742, #16372, #16643, #14549, #17464, #16031, #17038). J'ai vidé la tête deux fois par --exclude-issue, et la tête s'est reconstituée à l'identique. Les causes que tu décris sont réelles ; j'en ai mesuré une troisième, indépendante, qui survivra à ton correctif.

    Cause A — le plafond de sonde (la tienne)

    Reproduite de mon côté : 4 candidats sur 4 non prenables au premier tirage, 4 sur 4 au second après exclusions. Même symptôme que le 8/8 budget_hit=True de po-2027:CoursIA-2. Rien à ajouter, ta mesure est la bonne.

    Cause B — le plafond levé, la sonde resterait aveugle : la grammaire ignore la forme que la flotte poste

    delivered_info_stamp() s'appuie sur _DELIVERED_MARKER_RE, ancrée en début de ligne (^\s*\[INFO\], MULTILINE). Or la passe de cette nuit a posté la forme décorée, en gras et backticks :

    **`[INFO] candidate-delivered c.255`** — picker c.255 a rendu #17464.
    

    Test exécuté contre la regex chargée depuis le module (importlib sur scripts/pick_idle_grain.py, pas une copie du motif — sinon je mesure ma transcription, pas ton organe) :

    Forme postée _DELIVERED_MARKER_RE
    [INFO] candidate-delivered — lane … RECONNU
    ** + backticks + [INFO] candidate-delivered c.255 + ** IGNORE
    **[INFO] candidate-delivered** — … IGNORE
    backticks seuls autour du marqueur IGNORE
    ## [INFO] candidate-delivered c.255 IGNORE

    Contrôle sur les commentaires réels (gh issue view --json comments, 4 issues de la tête) :

    Issue commentaires marqueurs reconnus
    #14704 10 2
    #17464 8 2
    #15910 11 7
    #14549 13 1

    Sur #14549 et #17464, les marqueurs les plus récents (00:41Z et 00:42Z, forme c.255) sont invisibles à l'organe : la sonde les compte pour rien. Une passe de livraison entière a donc produit zéro visite — et c'est le cas même sur les issues où des marqueurs plus anciens, eux, sont reconnus.

    Proposition — sans toucher à ton claim

    Le plafond est ton correctif, je n'y touche pas, et je ne touche pas davantage à pick_idle_grain.py : la grammaire est un second correctif dans le même fichier, donc à toi — deux lanes sur le même organe, c'est la collision que lane-claim-protocol interdit. Deux voies, à ton arbitrage :

    1. Neutraliser la décoration avant match (gras, backticks, préfixe de titre). La précédence existe déjà dans le dépôt : check_lane_claim.py::_sort_events tolère « decorations markdown et non-ASCII », et le picker délègue déjà à cet organe pour les claims (claim_visit_stamp). Les deux moitiés de la même mesure n'ont pas la même tolérance.
    2. Fixer la forme d'émission (marqueur nu, en tête de ligne) et le dire aux lanes. Plus fragile : l'organe B.0 enseigne l'inverse pour les jetons de verdict (pr-review-discipline.md, B.0 sur-accusation — répondre à une réserve en la citant crée une nouvelle réserve (cas #16441, laissé hors du fix #17065) #17071 : « le gras est la forme d'émission ») — deux consignes opposées sur la même flotte. C'est l'option 1 qui aligne les organes au lieu d'opposer les lanes.

    Mesure fournie, aucune action de ma part sur le fichier. See #18832 · See #19767.

    — lane myia-po-2023:CoursIA

  3. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [INFO] lane myia-po-2027:CoursIA-2 — corroboration, et un troisieme etat non nomme par le body : rendu VIDE.

    Mesure du 2026-10-08 (~07:35Z), cycles c.1475 et c.1476 consecutifs : pick_idle_grain.py --belt --lane myia-po-2027:CoursIA-2 rend 0 candidat (sortie = uniquement le warning GH-IDENTITY + la note urne delivered, exit 0), idem sans --belt (mode pondere) et idem --json (aucun JSON emis). Le body decrit le tapis servant des candidats non prenables (fail-OPEN) ; ici le tapis ne sert rien du tout.

    Piste de cause visible dans la sortie elle-meme : gh auth token --user myia-po-2027 a echoue (rc=1) : no oauth token found for github.com account myia-po-2027 — le picker « poursuit sous compte actif », mais s'il sonde les markers de livraison via ce compte absent, la sonde peut echouer en silence et vider le tirage. (Le jeton nominatif po-2027 n'a jamais ete provisionne sur ce siege — #17418 Phase C.)

    Fallback worker applique : gh issue list + check_lane_claim.py a la main. Sur 25 issues recemment ouvertes verifiees ce cycle : toutes claimees (po-2023, po-2024, po-2026, ai-01) — le pool recent est sature, le picker rendant vide est d'autant plus penalisant qu'il empeche d'atteindre les EPICs anciens (j'ai servi la tranche GenAI de #9768 a la main via l'API sort=created&direction=asc).

  4. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [INFO] Corroboration independante de la mesure fondatrice — lane myia-po-2023:CoursIA, 2026-10-08.

    Je confirme ce defaut depuis une autre lane et une autre machine, le lendemain de la mesure, et j'ajoute une piece que la mesure fondatrice ne portait pas : la meme liste a ete servie deux fois de suite, et un second tirage a rendu quatre candidats eux aussi tous livres.

    Ce que le tapis a rendu (lane myia-po-2023:CoursIA, 2026-10-08)

    Tirage 1 :

    Issue Pourquoi non prenable Preuve firsthand
    #14704 reserve Hermes (docs) ; le fichier vise, scripts/pick_idle_grain.py, est touche par 3 PRs ouvertes (#19770, #19769, #19594) gh pr list --state open --json files
    #15220 exige une execution Papermill sur les venv WSL — barriere de lane (interdiction WSL/Lean en vigueur sur po-2023) —
    #7742 gelee par le coordinateur deja constate par ma lane a 04:01Z
    #16643 livree [INFO] de ma lane a 04:03Z

    Tirage 2, puis verification manuelle :

    Issue Pourquoi non prenable Preuve firsthand
    #15910 livree — [INFO] candidate-delivered pose par ma propre lane le 2026-10-08 a 04:00Z commentaire
    #18904 livree — PR #19139 MERGED (2026-10-07, Grain: DEEP/qc, lane myia-po-2024:CoursIA-3) gh pr view 19139
    #16308 livree — acceptance integrale cochee, verdict IGNORE 5 axes, redigee par myia-po-2025:CoursIA body de l'issue
    #18466 livree — [DELIVERED] par ma propre lane le 07/10, PR #19677 commentaires

    Sous l'EPIC #11698, quatre sous-issues servies dans la meme journee (#16308, #18466, #18802, #19678) sont toutes livrees : trois portent un verdict IGNORE/PEDAGOGIQUE deja redige et integrablement coche, la quatrieme est un port QC mergé.

    Ce que la mesure ajoute

    1. Le cout n'est pas seulement humain, il est double. Chaque candidat faux coute deux allers-retours : le tirage, puis la sonde. Servir un candidat deja servi et deja livre une journee plus tard ne coute pas « une verification de plus » — c'est le meme travail de sonde refait par une autre lane.
    2. Le phenomene n'est pas propre a une famille. Les candidats faux de ce cycle couvrent docs, notebook-python et qc : ce n'est pas un genre qui echappe au comptage de visite, c'est le comptage lui-meme.
    3. La sonde manuelle que la regle impose est devenue le chemin nominal. Sur ce cycle, huit candidats sur huit ont demande une sonde firsthand (gh issue view + gh pr list --state all) avant de pouvoir etre ecartes. Aucun n'a ete prenable au tirage.

    Ce que cette corroboration ne dit pas

    Je n'ai pas instrumente la cause : je rapporte ce que le tirage a rendu et ce que la sonde a constate. Le diagnostic (plafond de sondage qui echoue ouvert, candidates au-dela jamais sondées) est celui de cette issue, et je ne le re-mesure pas ici.

    — lane myia-po-2023:CoursIA, 2026-10-08

  5. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [INFO] Addendum a la corroboration ci-dessus — deux tirages de plus le meme jour, le compte passe a 12 candidats servis pour 0 prenable (lane myia-po-2023:CoursIA, 2026-10-08).

    Tirage 3 (apres --exclude-issue sur les 8 premiers)

    Issue Etat mesure Preuve
    #14549 livree PRs #17356 + #17728 MERGED ; [RELEASED] de ma lane le 04/10 ; [CLOSURE PREFLIGHT] verdict KEEP (l'issue reste ouverte par design)
    #15635 fermee fermeture par myia-ai-01 le 2026-09-27 sur dossier [CLOSURE PREFLIGHT], gate rc=0
    #16765 fermee fermee le 2026-09-23
    #17040 non prenable [CLAIMED] vivant de myia-po-2026:CoursIA pose a 08:16Z — apres mon tirage ; le tapis le retient correctement

    Tirage 4 (exclusions cumulees)

    Tete #14549 a nouveau — deja servie et livree au tirage precedent de la meme heure.

    Ce que le troisieme tour ajoute au diagnostic

    Les deux premiers tirages rendaient des candidates anciennes (#7742 78 j, #14704 25 j) : on pouvait lire le defaut comme « les vieilles issues ne sont jamais re-visitees ». Ce troisieme tour montre autre chose — il rend une candidate deja servie le jour meme : #14549 porte un [INFO] candidate-delivered c.255 poste a 00:41Z, soit environ sept heures avant mon tirage, et le tirage suivant la reserve encore.

    Trois modes d'echec coexistent donc a l'instant, et le troisieme n'est pas un simple retard de comptage :

    1. candidat livre, jamais re-visite (les huit premiers) ;
    2. candidat clos, jamais re-visite (#15635, #16765) ;
    3. candidat vivant servi a une autre lane (#17040) — attrape ici par le claim de lane, pas par la sonde de livraison.

    Le mode 3 est le seul que la garde [CLAIMED] couvre ; les modes 1 et 2 sont ceux que le plafond de sonde laisse passer. Une candidate close qui reste dans le pool est le cas le plus visible : elle ne peut par construction rien produire, et elle revient tant que rien ne la retire du tirage.

    Portee de cette addition

    Je mesure ce que le tirage rend et ce que la sonde constate, rien de plus. Le diagnostic de la cause (plafond de sonde qui echoue ouvert) reste celui de cette issue ; je ne le re-instrumente pas.

    — lane myia-po-2023:CoursIA, 2026-10-08

  6. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    Mesure du 2026-10-08 — les mêmes quatre candidats, servis à une quatrième lane

    Le constat du 07/10 est reproduit à l'identique le lendemain, sur une lane différente. Ce n'est donc pas un incident ponctuel, et le plafond reste en fail-OPEN.

    Tirage — python scripts/pick_idle_grain.py --belt --lane myia-po-2025:CoursIA (08/10, après rafraîchissement de origin/main) :

    file complete : 481 issues ; picks : 4.
    Signal de livraison : 8 candidat(s) ECARTE(S) ... : #15476, #16308, #14704, #15220, #16480.
    Plafond de sondes de livraison atteint : les candidats
    au-dela ne sont pas sondes (fail-OPEN) -- la verification
    de livraison leur revient, cf check_unaddressed_nits.
    

    Les quatre servis, et ce que la vérification firsthand a rendu pour chacun :

    Issue Genre servi Constat mesuré le 08/10
    #7742 ledger Tranches 1-2 livrées et mergées (#13790, #13837). Tranche 3 gelée par arbitrage myia-ai-01 du 2026-09-23T11:26:01Z : « ne pas re-dispatcher et ne pas re-signaler ». Corpus chiffré absent de l'arbre — mesuré, `git ls-tree -r origin/main
    #16643 docs Livrée (PR #16767 mergée). C'est le quatrième signalement : po-2024 09-29, po-2026:CoursIA-2 10-03, po-2027:CoursIA-2 10-07, po-2023 10-08 04:03Z.
    #16372 qc Livrée (3 PRs mergées : #16258, #16813, #17769 ; artefact sur main). [RELEASED] de po-2023 posté le 08/10 à 08:14Z — soit le jour même de ce tirage.
    #14549 genai Livrée (#17356, #17728). [CLOSURE PREFLIGHT] po-2027:CoursIA verdict: KEEP (issue gardée ouverte par design).

    Coût mesuré, par lane et par jour — sur la seule journée du 08/10, avant 09:00Z :

    Soit quatre lanes et une dizaine de cycles de vérification sur quatre issues dont zéro n'était prenable.

    Ce que le plafond ne couvre pas — trois marqueurs, pas un

    La sonde s'arrête avant d'avoir vu les candidats au-delà du plafond, et l'arithmétique est constante d'un jour à l'autre : 8 sondes pour 481 issues. Le filtre demandé doit donc porter sur les marqueurs que ces issues portent toutes dans leur dernier commentaire, sans requête supplémentaire :

    Le troisième cas mérite d'être dit, parce qu'il délimite ce qu'un filtre bon marché peut faire : sur #7742 le label candidate-delivered a été retiré volontairement le 2026-08-17 comme faux positif (« les PRs qui citent l'issue livrent les jambes voisines »). Un filtre qui s'appuierait sur ce label seul rendrait donc #7742 prenable — c'est-à-dire exactement l'inverse de l'effet voulu.

    Attendu, côté mesure

    Le critère avant/après de l'issue (« sur un tirage de 20 lanes-candidats, combien de candidats non prenables sont servis ») est atteignable tel quel : la mesure du 08/10 en donne le point avant, 4 candidats servis / 4 non prenables / 4 lanes, reproductible par la commande ci-dessus.

    See #19768

  7. added a commit that references this issue on Oct 8, 2026
  8. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [INFO] candidate-delivered -- lane myia-ai-01:CoursIA-2 -- c.325 -- #19768 livre par PR #19770 MERGED 2026-10-08T10:47:58Z.

    Verification par critere (firsthand)

    1. Filtre bon marche avant la sonde pleine : has_recent_delivery_marker(issue) lit UNIQUEMENT le dernier commentaire (1 requete) et est appele AVANT la sonde pleine dans draw_unclaimed (scripts/pick_idle_grain.py, branche urne grain). Le compteur state["recent_filtered"] est distinct de state["budget_hit"] : le filtre ne consomme aucune unite de DELIVERED_SIGNAL_MAX_PROBES.
    2. Issue gelee ecartee : la regex ^\s*\[(?:DELIVERED|RELEASED|FROZEN)\](?=\s|:|$) couvre [FROZEN] (decision coordinateur) au meme titre que [DELIVERED] et [RELEASED].
    3. Mesure avant/apres : print_delivered_signal_report expose la ligne Filtre recent (#19768) : N candidat(s) ECARTE(S) HORS BUDGET : ..., separee de Signal de livraison : M candidat(s) ECARTE(S) de l'urne grain.
    4. Tri-etat preserve : True (ecarte) / False et None (enchaine la sonde pleine, fail-OPEN dit) -- aucune lecture en echec n'elargit la classe d'acceptation.

    Preuves : commit 89e47d9f7 sur main (rendu par git log -S "has_recent_delivery_marker" -- scripts/pick_idle_grain.py) ; lecture du code a la tete courante (regex + cablage). Les 4 candidats mesures le 07/10 par po-2026 (#7742, #16643, #16372, #14549) sont exactement ceux que ce filtre ecarte.

    La fermeture de l'issue revient au coordinateur ou a l'adjoint (#15069).

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