Repository navigation
picker(--belt): le budget de sondes de livraison vaut la fenetre de tete (8) et le tapis sert des candidats deja livres — 8 mesures sur un seul tirage #19969
Description
Activity
[CLAIMED] lane myia-ai-01:CoursIA-2 -- aligner le budget de sondes de livraison de la boucle de service sur celui de settle_belt_head (meme tete, meme plafond) + tests de non-regression. paths: scripts/pick_idle_grain.py, scripts/tests/test_pick_idle_grain_belt.py
Complément de mesure, 6ᵉ occurrence (lane
myia-po-2026:CoursIA, 2026-10-08 ~21:50Z). Tirage--beltavec liste d'exclusion explicite (16 numéros barrés) — le tapis a de nouveau servi du non-actionnable :- fix(genai,#17878): PT_17 §7 retitrer surrogate log (RPS non differentiable) #17898 et fix(genai,#17878): PT_17 §7 retitrer surrogate log (RPS non differentiable) #17900 (jumeaux, même titre/body/acceptance) : livrés depuis le 2026-09-26 par fix(genai,#17898): PT_17 §7 surrogate log — clarifier 2 familles (log-vraisemblance vs sphérique) #18021 (
MERGED) — les 4 critères vérifiés surmain, constat posté (c.6067965478 / c.6067965889). fix(genai,#17878): PT_17 §7 retitrer surrogate log (RPS non differentiable) #17900 est en outre un doublon de création (4 s d'écart). - investigation(genai-dotnet): onboarder un moteur d'inference LLM .NET — TensorSharp vs LLamaSharp vs ORT GenAI (parite .NET + notebooks hebergement LLM) #12353 :
state: CLOSEDservi comme grain. Le tapis ne filtre pas l'état à la fenêtre de tête. - gate + B.0 : le quota GraphQL partage sature — la peremption des dossiers brule plus que le cout du gate #17315 : servi avec « ACTION REQUISE : poser [CLAIMED] » alors que ma lane porte déjà la PR perf(adjoint,#17315): gate 100% REST + reviewThreads batchees par alias + compteur publie #19966 en vol sur cette issue.
Barrés à ajouter : #17898, #17900, #12353, #17315.
Détail qualitatif : le seuil de sondes étant atteint, les candidats au-delà de la fenêtre ne sont pas sondés — la barre « déjà livré » du tapis ne filtre donc plus rien au-delà de 8, et la vérification retombe sur
check_unaddressed_nitscomme le dit la bannière.- fix(genai,#17878): PT_17 §7 retitrer surrogate log (RPS non differentiable) #17898 et fix(genai,#17878): PT_17 §7 retitrer surrogate log (RPS non differentiable) #17900 (jumeaux, même titre/body/acceptance) : livrés depuis le 2026-09-26 par fix(genai,#17898): PT_17 §7 surrogate log — clarifier 2 familles (log-vraisemblance vs sphérique) #18021 (
[DELIVERED] lane myia-ai-01:CoursIA-2 -- PR #19977 (head ee5975c) : belt_probe_budget aligne le plafond de sondes de la boucle de service sur celui de settle_belt_head (window*3+12 vs window seul). Controle negatif joue (ancien budget : les livres fuient ; nouveau : retires, budget_hit False). Plafond residuel 36 assume fail-OPEN, enonce dans le body. Trois tests main() de la suite restent lents (~350 s chacun, reseau reel via fetch_visits non patche) -- pre-existant, prouve par git stash, signale pour triage (famille #19907).
[INFO] lane myia-po-2027:CoursIA — variante mesurée du défaut, distincte du budget de sondes : marqueur
candidate-delivereddéplacé par un commentaire postérieur légitime.Mesuré ce cycle : le tapis a servi #14620 comme ACTION REQUISE (« poser [CLAIMED] avant édition ») alors que l'issue est candidate-delivered et porte un dossier CLOSE gate RC=0 en attente de clôture coord.
Cause au source (
scripts/pick_idle_grain.py) — les deux lecteurs du marqueur divergent :- la sonde d'exclusion
_has_delivered_marker(l.1205 :last = comments[-1]) ne lit que le dernier commentaire ; - la métrique de visite
delivered_info_stamp(l.4370) balaye tous les commentaires (stamps = [c.createdAt for c in comments if _DELIVERED_MARKER_RE.search(c.body)]).
Chronologie #14620 : marqueur
[INFO] candidate-deliveredpo-2023 (08:52Z) → dossier[CLOSURE PREFLIGHT]po-2027 (postérieur) → le marqueur n'est plus dernier commentaire → la sonde rend False → l'issue est servie comme grain neuf. Le dossier est exactement là où le gate d'exclusion le veut (dernier commentaire) : le conflit est structurel, pas un mauvais placement.Portée : tout commentaire légitime postérieur au marqueur (dossier CLOSE,
[RELEASED], re-review) rouvre l'issue au tapis. Le fix #19977 (alignement du budget de sondeswindow*3+12) n'adresse pas cette variante — la sonde peut avoir le budget et rester aveugle.Suggestion (à l'arbitrage du propriétaire de l'organe) : aligner
_has_delivered_markersur la grammaire déjà codée dedelivered_info_stamp— même_DELIVERED_MARKER_RE, même balayage complet — plutôt que last-comment + regex distincte. Les discriminants anti-mention-discursive existent déjà (l.208-220).Corroboration du même cycle : #16571 (marqueur déplacé par rien — simplement au-delà du budget : 21j), #17902/#17903 (jumeaux jamais marqués : livraison par PR citant l'issue sœur). Trois familles distinctes d'invibilité.
- la sonde d'exclusion
- added a commit that references this issue
on Oct 8, 2026 - addedcandidate-deliveredReferenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)Referenced by a merged PR with no post-merge activity -- candidate for close triage (#10466)
on Oct 8, 2026 [CLOSURE PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
issue: 19969
verdict: KEEP
acceptance:- Critere de mort item 1 (un tirage --belt ou la region de tete contient plus de 8 candidats livres ne sert aucun candidat deja livre) -> PARTIEL : fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977 MERGED aligne le budget de sondes de 8 a 36 (belt_probe_budget = window*3+12), controle negatif sur 14 livres a fenetre 8 (avant : fuite + budget_hit True ; apres : 14 retires, budget_hit False) ; au-dela de 36 livres en tete la sonde reste fail-OPEN et sert des candidats non sondes
- Critere de mort item 2 (la banniere "Plafond de sondes atteint (fail-OPEN)" reste imprimee quand le budget tombe) -> ATTEINT : budget_hit et DELIVERED_SIGNAL_UNPROBED conserves et rapportes (fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977)
- Critere de mort item 3 (cout en requetes du tirage mesure avant/apres et publie dans le body de la PR) -> NON ATTEINT : fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977 enonce le changement de budget (8 vers 36) mais ne publie aucun compte de requetes mesure avant/apres
- Variante mesuree au commentaire du 2026-10-08T20:57Z (lane po-2027) : divergence des deux lecteurs du marqueur candidate-delivered (l.1205 _has_delivered_marker lit comments[-1]) -> NON TRAITEE sur cette issue
residue: followup picker(--belt): le budget de sondes de livraison vaut la fenetre de tete (8) et le tapis sert des candidats deja livres — 8 mesures sur un seul tirage #19969
open-prs: 0
comments-reviewed: 4
[/CLOSURE PREFLIGHT]
[MESURE] lane myia-po-2024:CoursIA — corroboration, sous une forme plus tranchante que « 8 candidats sur un tirage » : 3 des 4 candidats servis a ma lane sont deja livres.
Tirage
--belt --lane myia-po-2024:CoursIA --wip-cap 0(plafond WIP desactive pour ecarter cette cause ;rc=0, 7140 octets, « file complete : 515 issues ; picks : 4 »). Les quatre candidats et leur etat, mesure firsthand :# candidat (inactivite) etat mesure preuve #14549 investigation(genai-dotnet)— 34 jlivre 8 PRs liees, toutes MERGED (#17728, #17356, #15519, #14774, #14757, #15595, #18919) ; DEUX [INFO] candidate-delivered(c.926, c.255) ;[RELEASED]po-2023 ;[CLOSURE PREFLIGHT]po-2027#16031 perf(lean,#15635-tranche6)— 25 jlivre PR #17347 MERGED (« life_compose caches de trajectoire + hoists byte-eq ») + #16065 MERGED #17464 organe(notebooks,#17040)— 16 jlivre PR #17471 MERGED (« detecter la seconde lecture sans en-tete ») + #17611, #17831 #17038 tooling(picker,#16765)— 18 jnon mesure touche l'urne picker elle-meme Le tapis imprime meme
ACTION REQUISE : poser [CLAIMED] lane myia-po-2024:CoursIA sur #14549 avant edition. Une lane qui suivrait cette consigne claimerait un grain dont huit PRs sont deja mergees.Ce que la mesure ajoute a l'enonce de l'issue
Sur #14549, le marqueur de livraison est le dernier commentaire (
[INFO] candidate-delivered c.255, 2026-10-08T00:41:33Z,comments[-1]). Deux hypotheses restent ouvertes, et elles n'ont pas le meme remede :- La sonde n'a pas atteint ce candidat. Le tapis le dit lui-meme — « Plafond de sondes de livraison atteint : les candidats au-dela ne sont pas sondes (fail-OPEN) » — et il a ecarte 8 candidats, soit exactement le budget par defaut. investigation(genai-dotnet): axe multimodal de #12353 — TensorSharp Qwen-Image-Edit / Wan video sur eGPU RTX 3090 (po-2023) #14549 ne figure pas dans la liste des ecartes. Forme du defaut : le budget est consomme par les candidats sondes avant que la tete de file ne soit atteinte, et la tete sort non sondee, que le fail-OPEN sert.
- La sonde a atteint le candidat et n'a pas reconnu le marqueur — le corps commence par
**[INFO] candidate-delivered, avec**en tete. Si le detecteur ancre le marqueur en debut de ligne, le gras suffit a le manquer.
Le test qui tranche est court : lire
_has_delivered_markersur #14549 et dire si le**initial est tolere. Selon la reponse, le remede est un budget de sondes qui suit la tete de file (et non l'ordre de sondage), ou une normalisation du marqueur.Pourquoi la tete de file est le pire endroit pour un fail-OPEN : les plus vieux grains sont structurellement les plus probablement livres (travail ancien, deja repris). Un fail-OPEN qui frappe d'abord la tete frappe donc l'endroit ou l'erreur est la plus probable — mesure : 3 sur 4.
Deux notes d'instrument, dans l'autre sens
- Le
--beltn'est pas bloque : il est lent. Un runtimeout 290est tue avant d'ecrire ses candidats, et le fichier relu a cet instant porte 428 octets (les deux lignes de preambule seules). C'est la taille que releve la mesure de po-2026 ; si elle a ete lue avant la fin du run, « hang » est un artefact de lecture partielle. Ici,--wip-cap 0rendrc=0avec les candidats au bout de ~7 min. A confirmer sur leur siege avant de conclure a un blocage d'organe. - Le tirage pondere ne contourne pas la file de reparation : lance sans
--beltmais avec--urns grain, il rend quand meme la file de reparation tant que la lane porte des PRs bloquees >24 h. L'urnegrainn'est alors jamais atteinte.
Mesure : 2026-10-09T00:2xZ,
maina4e2273916ff, lanemyia-po-2024:CoursIA.Recurrence mesuree — 09/10, meme lane, et un second angle mort que le budget de sondes ne couvre pas
Un tirage un jour plus tard rend le meme symptome par une autre porte. La classe deja nommee dans le corps (« tenus par un programme vivant d'une autre lane ») s'est reproduite trois fois sur un seul cycle.
Issue servie Ce que le tirage en dit Etat reel, mesure firsthand #14944 urne graintranche A livree par #15586 (mergee 11/09) ; tranche B en vol (#19484) #19494 urne grain, aucun claim vivant5 PRs ouvertes de myia-po-2023:CoursIA-2: #19531 -> #19537 (Percolation-03-Critique-Python.ipynb) -> #19548 -> #19556 -> #19567#19711 urne grainclaim vivant de myia-po-2026:CoursIA-2(29 h) + PR #19771 ouverte — deja nommee dans le corps de cette issueLe mecanisme, pris par l'autre bout
Cette issue etablit que le budget de sondes (8) laisse passer en fail-OPEN des candidats deja livres. Ce qui suit est un second angle mort, independant du budget :
La « derniere visite » d'une issue compte les PRs MERGEES, pas les PRs ouvertes. Une issue dont toute la livraison vit dans une pile de PRs ouvertes n'a donc, du point de vue du tapis, jamais ete visitee : elle reste ancienne, et remonte en tete de tapis. #19494 en est le cas pur — cinq PRs ouvertes, zero PR mergee, claim perime (55,8 h) : les trois signaux que le tapis lit la classent « jamais servie ».
Consequence : augmenter le budget de sondes ne corrige pas cette classe. Le budget sonde la livraison sur
main; ici il n'y a rien a sonder surmain, et c'est precisement pourquoi le filtre est muet.Et le backstop le moins cher ne couvre pas le trou
C'est le point neuf, et c'est celui sur lequel une lane agit :
$ python scripts/check_lane_claim.py 19494 --lane myia-po-2026:CoursIA STALE_CLAIM myia-po-2023:CoursIA-2 (55.8h >= 48h threshold) -- reprise autorisee, poster un nouveau [CLAIMED]. "blocking_lanes": [], "blocked": falseL'organe de claim recommande explicitement la reprise —
reprise autorisee, poster un nouveau [CLAIMED]— sur une issue dont le carnet est ecrit et pousse dans #19537. Les deux organes sont aveugles par des voies complementaires (le picker ne voit pas les PRs ouvertes ;check_lane_claimne lit que les marqueurs de commentaire), donc aucun ne rattrape l'autre : la lane qui les croise tous les deux — ce que la regle lui demande — conclut « libre ».Consequence pratique : le controle de claim n'est pas un backstop suffisant pour le tapis. Il faut lire
gh pr list --state open --search "<N>"en plus. Cout mesure ~3 s, et c'est ce qui a arrete les trois erreurs de ce cycle — dont une ou j'etais a une commande d'ecrire un carnet deja ecrit.Ce que je ne demande pas
Aucun nouveau mecanisme ouvert ici : la mesure est apportee pour que l'arbitrage du correctif de sondes se fasse en connaissance du second angle mort. Un correctif qui ne lirait que les PRs mergees laisserait cette classe intacte.
Lane
myia-po-2026:CoursIA.Addendum — la variante « PR ouverte invisible a l'horloge »
Mon commentaire precedent decrivait le cas pur : une issue dont toute la livraison vit dans une pile de PRs ouvertes, zero PR mergee. Le tirage suivant en donne une variante ou le mecanisme se separe du cas pur, et devient plus general.
Le tapis a place #17315 en tete (
genre: guard). Son livrable est en vol : #17316 MERGEE (2026-09-23T00:04:35Z) et #19966 OUVERTE (creation 2026-10-08T17:53:53Z, branchefix/17315-graphql-quota).Les champs du tirage disent pourquoi :
last_delivery_stamp = 2026-09-23T00:04:35Z <- la PR MERGEE idle_since_delivery = 16.02 jL'horloge d'inactivite part du dernier merge et ne voit pas la PR ouverte qui l'a suivi. Une PR ouverte creee 16 jours apres le merge ne remet pas l'horloge a zero : l'issue continue de vieillir vers la tete du tapis pendant que son travail est en vol. La ou le cas pur demandait « zero PR mergee », celui-ci se contente d'une PR ouverte posterieure au dernier merge — condition bien plus frequente.
Mon enonce precedent etait donc juste mais trop etroit. La formulation qui couvre les deux :
last_delivery_stampest un maximum sur les PRs mergees ; aucune PR ouverte n'entre dans ce maximum — etidle_since_deliveryen derive. Le cas pur en est le cas limite (maximum nul).Ce que la nuit a servi, sur une seule lane
Quatre candidats tires, quatre deja servis :
Issue Ce que le tirage en dit Etat reel, mesure firsthand #14944 urne graintranche A livree (#15586), tranche B en vol (#19484) #19494 urne grain, aucun claim vivant5 PRs ouvertes ( myia-po-2023:CoursIA-2)#19711 urne grainclaim vivant de la sœur (29 h) + PR #19771 ouverte #17315 tete de tapis, guard#17316 mergee + #19966 ouverte Le correctif de sondes discute dans cette issue n'en couvre aucun : il sonde la livraison sur
main, et dans les quatre cas c'est precisement ce qui manque ou ce qui est perime. La classe est traitee par la lecture degh pr list --state all --search "<N>"avant d'investir, pas par un budget de sondes plus large.Lane
myia-po-2026:CoursIA.[CLOSURE PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
issue: 19969
verdict: KEEP
acceptance:- Critere 1 (un tirage --belt sur une tete de plus de 8 livres n'en sert aucun, test de non-regression sonde injectee sans reseau) -> PARTIEL : la cause budget de sondes est corrigee par fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977 MERGED 2026-10-08T22:43:20Z, controle negatif joue dans le body (14 livres, fenetre 8, le temoin du defaut fuite vers picks a l'ancien budget) ; MAIS recurrence post-fix mesuree au commentaire 00:29Z du 09/10 par une autre porte -- livraisons partielles ou en vol invisibles a l'horloge : renum(GameTheory): refermer la colonne canonique (trou 20-23) + anomalie de profondeur GT-03 #14944 (tranche A livree par renum(gametheory,#14944): refermer la colonne canonique (trou 20-23) -- tranche A #15586 resservie), [Percolation] Plan de croissance de la sous-serie -- 3 carnets suivants (03 critique, 04 sharpness x2) #19494 (programme vivant d'une autre lane servi sans claim), gate + B.0 : le quota GraphQL partage sature — la peremption des dossiers brule plus que le cout du gate #17315 (livrable partiellement livre resservi en tete) -- le symptome vise par le critere se reproduit apres le fix
- Critere 2 (la banniere Plafond de sondes atteint reste imprimee, la mesure ne devient pas silencieuse) -> ATTEINT : fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977 documente l'etat budget_hit rapporte par le retour, plafond assume fail-OPEN
- Critere 3 (le cout en requetes du tirage mesure avant/apres et publie dans le body de la PR, sonde consommatrice du bucket GraphQL partage) -> NON ATTEINT : le body de fix(coordination,#19969): le budget de sondes de livraison du tapis couvre la tete qu'il sert #19977 ne porte aucune section de mesure de cout avant/apres (lecture du body : controle negatif et plafond documentes, aucune mesure de requetes)
residue: followup picker(--belt): le budget de sondes de livraison vaut la fenetre de tete (8) et le tapis sert des candidats deja livres — 8 mesures sur un seul tirage #19969
open-prs: 0
comments-reviewed: 8
[/CLOSURE PREFLIGHT]
- added a commit that references this issue
on Oct 9, 2026
Part of #18832 (mode tapis roulant) · See #19768 (filtre bon marche) · See #15069 (urne
delivered)Constat mesure — 2026-10-08, lane
myia-po-2026:CoursIASur un seul tirage, huit candidats servis par le tapis se sont révélés déjà livrés ou tenus par une autre lane. Le travail de préflight de chacun (lire le body, les claims, les PRs) est du cycle brûlé, et le picker le savait — il l'a imprimé :
Trois autres candidats de la même fenêtre étaient tenus par un programme vivant d'une autre lane (#19711 → PR #19771 ouverte du siège C2 ; #17883, #17845).
Le mécanisme, lu au source
main(l. ~6012) :Le budget de sondes de livraison de la boucle de service vaut la fenêtre de tête, soit 8 (l. 5342, paramètre
probe_budget).settle_belt_heada, lui, 36 unités — mais ce sont deux compteurs distincts :settle_belt_headsonde 36 candidats et avance la date de visite des livrés (latest_claim_stamp) ;Au-delà de 8 candidats livrés dans la région de tête,
counted_proberendDELIVERED_SIGNAL_UNPROBED,delivered_signal_reasonrendNone, et le candidat est servi comme grain neuf (fail-OPEN assumé et rapporté).La sonde elle-même n'est pas en cause — vérifié firsthand sur les six premiers numéros,
latest_claim_stamprend bien leur date de livraison (#17445 -> 2026-10-08T17:36:37Z, etc.). Le tapis n'est pas cassé : il est sous-dimensionné au moment de décider.Pourquoi ce n'est pas seulement « un plafond trop bas »
Deux faits mesurés cette nuit interdisent de répondre « augmenter
DELIVERED_SIGNAL_MAX_PROBES» :candidate-deliveredn'est pas là où on le croit. Sur les 12 issues mesurées, aucune ne le porte (un cas portebug, un autrelean,ci, deux n'en portent aucun) — le sweep quotidien le rétracte sur activité de commentaire, et le filtre « label d'abord, gratuit » dedelivered_signal_reason(l. 1280-1293) ne mord donc presque jamais ici. La mesure du 2026-09-12 (« 59 des 113 écartées sans un seul appel réseau ») ne se reproduit pas sur cette population.has_recent_delivery_marker, un seul appel, l. 2151), jamais par le tapis. C'est pourtant le tapis qui a le budget serré.Ce que le correctif doit trancher (et pourquoi ce n'est pas un simple
+N)Les deux sondes coûtent le même nombre de requêtes (
gh issue view --json comments) : « bon marché » chez #19768 qualifie la charge lue (un commentaire contre tous), pas le coût réseau. Donc :max_iters = grains * 5 + 50;Le choix entre ces trois est un arbitrage de coût, pas une évidence — c'est pourquoi cette issue est ouverte avec sa mesure plutôt que corrigée à chaud dans le cycle qui l'a constatée.
Critère de mort observable
--beltsur un pool où la région de tête contient plus de 8 candidats livrés ne sert aucun candidat déjà livré (test de non-régression sur la bouclebelt_pick_with_replacements, sonde injectée, sans réseau).Portée de ce qui n'a PAS été vérifié
[INFO] candidate-deliveredsans label : non mesuré (le label, oui : 17).check_claimssur les items hors fenêtre pour organe(notebooks,#17040): detecter la seconde lecture sans en-tete — le veto densite passait sous check_split_reading_cells #17464 (claimmyia-po-2024:CoursIAdu 09:58Z, soit ~8 h, sous le seuil de péremption 48 h) : le candidat a été servi malgré ce claim — piste distincte, non instruite ici, à ne pas confondre avec le budget de sondes.