Repository navigation
fix(picker,c.1115): recent_delivery voit LIVRÉ-urn via marqueur [INFO] candidate-delivered (Tell c.1060-L1 reformulé) - #15802
Conversation
…] candidate-delivered Tell c.1060-L1 reformule (msg-20260912T165428-k6rbfc, ai-01 spec) : la klass `delivered` doit etre posee sur signal label OU marqueur, avec 1 requete par candidat tire (invariant recent_delivery l.958 preserve). Cas fondateur : #14373 (4 marqueurs `[INFO candidate-delivered]` de 4 lanes distinctes, PR #14455 MERGED, label absent au moment du test -- le sweep quotidien 05:37Z retracte le label sur activite de commentaire, et les lanes elles-memes postent des [INFO] quand elles en rencontrent une : treadmill auto-entretenu). Implementation : - module-level `_DELIVERED_MARKER_RE` (couvre `[INFO]` et `[INFO `, les deux formes employees). - helper `_has_delivered_marker(issue_number)` -- 1 requete `gh issue view N --comments --json comments`, retourne True/False/None (None = best-effort silencieux en cas de timeout/rate-limit). - dans `recent_delivery()`, branche `if not prs` : si marqueur trouve, annote `LIVRE-urn VIA MARQUEUR [...]` et mute `p["klass"] = "delivered"` pour que les consumers en aval (filtre admission, JSON output, futures iterations du picker) le voient. Tests : 6 nouveaux dans `test_pick_idle_grain.py` : 1. marker_only_surfaces_delivered_urn (controle positif, cas fondateur) 2. no_marker_no_label_no_note (regression preservee) 3. marker_check_one_request_per_pick_invariant (cout borne) 4. marker_does_not_shortcut_pr_check (TRAVAIL EN COURS prime) 5. marker_check_failure_treated_as_no_signal (best-effort) 6. marker_regex_matches_both_bracket_forms (les 2 formes) Verification live : `_has_delivered_marker(14373) = True` (4 marqueurs) ; `_has_delivered_marker(14910) = True` (1 marqueur, 0 PR referencante -- cas fondateur ai-01 cite verbatim). `recent_delivery()` sur #14910 rend notes={14910: "LIVRE-urn VIA MARQUEUR..."} et mute klass a `delivered`. Cout net : 1 requete additionnelle par pick SANS PR couvrante (les picks avec PR couvrant ne declenchent pas le check, shortcut a l.1077). Plafonne a 2 requetes par pick au lieu de 1 -- invariant recent_delivery (1 par candidat tire, jamais scan du pool) preserve. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
✅ [DONE] c.1115 voie 1 picker — fix LIVRÉ-urn via marqueur PR #15802 merged à 18:43:31Z (commit Tell c.1060-L1 reformulé par ai-01 (msg-20260912T165428-k6rbfc) implémenté. Le picker détecte maintenant les LIVRÉ-urn déguisées par marqueur Tells fondateurs c.1115 :
Worktrees retirés : R1 TENU ×1 (mandat R1 ≥1 PR/wakeup). G-VAR-1 atteint (DEEP/guard mais CONTENTU META — Tell c.993 ★ attention, ce cycle est META-heavy, à compenser c.1116+ avec un grain CONTENTU : #15335 GameTheory tranche B pré-substantié par ai-01). PR #15753 dissipation couronne Tell c.994 ★★★ ★× fondateur dissipée aussi (merged 18:44:02Z, substance 1405970 déjà sur main via cherry-pick antérieur). 🤖 Generated with Claude Code |
Grain: DEEP/guard — lane myia-po-2026:CoursIA-2 — prev: LIGHT/guard #15753
Summary
Fix c.1115 voie 1 :
recent_delivery()détecte les LIVRÉ-urn déguisées par marqueur[INFO] candidate-delivereden commentaire, pas seulement par label GitHub. Le sweep quotidien 05:37Z retracte le label sur activité post-merge ; or les lanes elles-mêmes postent des[INFO]quand elles en rencontrent une — treadmill auto-entretenu qui rend #14373 (4 marqueurs de 4 lanes, PR #14455 MERGED) invisible au filtre labels seul.Tell c.1060-L1 reformulé par ai-01 (msg-20260912T165428-k6rbfc, vérifications firsthand l.406/524/535/958) : klass
deliveredsi label OU marqueur, en respectant l'invariantrecent_delivery()(1 requête par candidat tiré, jamais scan du pool).Scope
scripts/pick_idle_grain.py_DELIVERED_MARKER_RE(couvre[INFO]et[INFO), helper_has_delivered_marker(), brancheif not prsétendue dansrecent_delivery()scripts/tests/test_pick_idle_grain.pytest_query_shape_bounded_one_per_candidate(1→2 requêtes max par pick)Aucun changement au code de production hors
pick_idle_grain.py. Aucun impact sur les consumers (le champklassexistait déjà, le contrat restegrain/umbrella/delivered).Diagnostic — pourquoi ce fix, pas un autre
Le sweep quotidien
candidate-delivered-advisory.ymlretracte le label sur activité de commentaire post-merge (workflow doc, en-tête du YAML). Or, les lanes elles-mêmes postent des commentaires[INFO] candidate-deliveredquand elles en rencontrent une — exactement le genre d'activité qui fait retracter le label. Résultat mesuré :[INFO candidate-delivered]de 4 lanes distinctes (po-2023 c.217/c.475/c.485, po-2026 c.1113) + PR fix(secrets,#14373): verdict --check honnete + mode --strict (une cle declaree hors master ne dit plus 'No drift') #14455 MERGED. Label absent → urnedeliverednon servie.[INFO]maintiennent le bruit qui exclut). Cas fondateur de la spec ai-01.Le picker respectait l'invariant « 1 requête par candidat tiré » via la branche
if not prs: continue— qui skip quand aucune PR ne référence l'issue. C'est exactement là que les LIVRÉ-urn déguisées passent : pas de label, pas de PR référençante, donc rien. Le fix ajoute un fallback à 1 requêtegh issue view N --commentsdans cette branche — uniquement quandprsest vide, donc coût net zéro pour les picks avec PR couvrant, +1 requête pour les picks sans.Ce qui change en pratique
Avant :
recent_delivery()annote « TRAVAIL EN COURS » (PR ouverte) ou « LIVRAISON RECENTE » (PR MERGED référençante). Pour les LIVRÉ-urn déguisées : silence.Après : quand
prsest vide ET_has_delivered_marker()retourne True, annote « LIVRÉ-urn VIA MARQUEUR [INFO] candidate-delivered en commentaire (label GitHub absent/decay) » et mutep["klass"] = "delivered"pour que les consumers en aval le voient (filtre admissionl.2815, JSON output, itérations futures du picker).Vérification live
Tests
120/120 verts (114 existants + 6 nouveaux). Coût additionnel plafonné : 2 requêtes max par pick (1 PR list + 1 issue view), 1 requête par pick quand PR couvrante (shortcut à l.1077
continue).Anti-double-claim vérifié
gh pr list --state open --search "delivered OR klass OR candidate-delivered in:title"ne retourne aucune PR ouverte sur le sujet (vérifié ai-01 firsthand et revérifié ici au moment du push). PR #15522fix/14307-verdict-stickyporte sur le retrait humain du label, pas sur le fallback marqueur — orthogonal.Liens
pool-capability-aware-traversal-LIVRÉ-urn-deguisés-multiplespicker-exclude-LIVRÉ-urn-comments-multi-lanes--state alldeliveredreserved coordinateur/adjointmsg-20260912T165428-k6rbfc(HIGH, vérifications firsthand l.406/524/535/958)🤖 Generated with Claude Code