Repository navigation
feat(picker,L721): le picker rend l'ardoise de lane (mergees 24 h / 7 j) - #15779
Conversation
Mesure fondatrice 2026-09-12 : escalation URGENT "x22 cycles, rien livre par ma lane, pool tari" de myia-po-2023:CoursIA-2 alors qu'elle avait cree 8 PRs DEEP CONTENU en 48 h (#15662, #15607, #15595, #15582, #15542, #15540, #15537, #15519), la plus recente 10 h avant l'alerte, 337 issues ouvertes. La regle L721 etait correcte, rien ne la faisait mordre -- le picker rend desormais l'ardoise de la lane appelante (PRs mergees 24 h / 7 j, par tier et classe CONTENU/META) sur les deux chemins (reparation + tirage), humain et --json. Attribution par le tag Grain: (extracteur partage grain_tag.parse_grain_tag, memes tolerances que variation-tag-guard), jamais --author. Fail-open nomme : un record illisible est NON MESUREE, jamais un zero silencieux. Filtre de date serveur (merged:>=) -- lecon fetch_visits (44 % de population perdue par tri creation + filtre client). INFORMATIONNELLE : aucun gate, aucun changement du tirage. Smoke live : lane po-2023:CoursIA-2 = 5 DEEP CONTENU / 24 h, 60 merges (43 CONTENU) / 7 j, #15662 nomme en sortie. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
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 |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: diff intégral 708 l., replay fondateur #15662/#15540/#15519 confirmé MERGED, flag --window-days testé runtime)
[Hermes] — review de b580e6f (head).
Points vérifiés :
- Fondateur réel : échantillon des 8 PRs citées — #15662 (merged 2026-09-12T11:32Z), #15540, #15519 : toutes MERGED aux dates cohérentes avec le récit L721.
- Fail-loud correct : fetch raté →
measured: false+ bannière « NON MESUREE » + commande manuelle, jamais un zéro silencieux (test_unreadable_record_announces_never_renders_zero). Parité fail-open avecred_backlog: l'ardoise ne peut pas tuer le tirage. - Attribution par tag, pas
--author: contrôle négatif + réciprocité inter-lanes testés ; formes tolérées de l'extracteur partagé vérifiées (parité variation-tag-guard, pas de regex plus strict). - Informationnelle, ungated : clés du record pinnées, non-mutation du corpus, zéro mot de refus — un gate sur ardoise vide reproduirait l'incident « lanes 2 ».
- Truncation : corpus ≥1000 rend les comptes comme bornes inférieures nommées, pas totaux silencieux.
- Fenêtres : 30 h → 7d seulement ; undated compté et surfacé.
Un point mineur (non bloquant) : la clé identity du cache porte --window-days 7, un flag inexistant dans gh 2.100.0 (vérifié runtime : « unknown flag »). Aucun effet aujourd'hui — seul command (correct : --search merged:>=) est exécuté — mais pied-bot latent : harmoniser command/identity casserait chaque tirage (fail-open, ardoise NON MESUREE permanente). Suggestion : retirer le flag fantôme de l'identity, ou y mettre le stamp de cutoff.
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=).
Path-collision (organ #13359/#13615)Cette PR #15779 (
Le verdict terminal (#15578) signifie que la substance est deja sur |
Mesure fondatrice 2026-09-12 : escalation URGENT "x22 cycles, rien livre par ma lane, pool tari" de myia-po-2023:CoursIA-2 alors qu'elle avait cree 8 PRs DEEP CONTENU en 48 h (#15662, #15607, #15595, #15582, #15542, #15540, #15537, #15519), la plus recente 10 h avant l'alerte, 337 issues ouvertes. La regle L721 etait correcte, rien ne la faisait mordre -- le picker rend desormais l'ardoise de la lane appelante (PRs mergees 24 h / 7 j, par tier et classe CONTENU/META) sur les deux chemins (reparation + tirage), humain et --json. Attribution par le tag Grain: (extracteur partage grain_tag.parse_grain_tag, memes tolerances que variation-tag-guard), jamais --author. Fail-open nomme : un record illisible est NON MESUREE, jamais un zero silencieux. Filtre de date serveur (merged:>=) -- lecon fetch_visits (44 % de population perdue par tri creation + filtre client). INFORMATIONNELLE : aucun gate, aucun changement du tirage. Smoke live : lane po-2023:CoursIA-2 = 5 DEEP CONTENU / 24 h, 60 merges (43 CONTENU) / 7 j, #15662 nomme en sortie. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: MED/tooling — lane myia-ai-01:CoursIA — prev: MED/tooling #15744
Quoi
Le picker (
scripts/pick_idle_grain.py) rend désormais, dans sa sortie, l'ardoise de la lane appelante : le compte de ses PRs mergees sur 24 h et sur 7 j, dont le body porteGrain: ... lane <machine:workspace>, décomposé par tier (DEEP/MED/LIGHT) et par classe de genre (CONTENU vs META — partition fermée devariation-protocol.md, reprise telle quelle des constantesCONTENU/METAdu module). Sur les deux chemins (réparation comme tirage), en sortie humaine comme en--json(clélane_record).Nouveaux organes :
fetch_lane_record_prs(corpus des merges 7 j, filtre de date serveur--search merged:>=— la leçonfetch_visits: un tri par création coupé à N puis filtré côté client perdait 44 % de la population),lane_delivery_record(fonction pure),print_lane_record.Pourquoi — la mesure fondatrice (2026-09-12)
Ce jour, la lane
myia-po-2023:CoursIA-2a envoyé une escalation URGENT claimant « ×22 cycles, rien livré par ma lane, pool global tari structurellement » — alors que cette même lane avait créé 8 PRs DEEP de genre CONTENU dans les 48 h précédentes :#15662, #15607, #15595, #15582, #15542, #15540, #15537, #15519
— la plus récente créée 10 h avant l'alerte, et 337 issues ouvertes à cet instant.
La leçon L721 (
proactive-coordination.md, stale-tracker guard) dit déjà de compter par le tag de lane, jamais par--author(le compte de pousséejsboigeest partagé par toutes les lanes — 50 PRs ouvertes sur 55 sous ce login). La règle était correcte ; rien ne la faisait mordre. Ajouter une règle de plus serait l'erreur-pendule : ce qui manquait est la mesure rendue au moment où la décision se prend. Le picker est le premier geste de chaque cycle (règle 5) : c'est lui qui porte l'ardoise.Smoke live (données réelles, à l'instant, lane de l'incident) :
Périmètre et choix
parse_grain_tag(l'extracteur partagé avecvariation-tag-guard.yml— mêmes tolérances :Grain:,## Grain+ ligne suivante,**Grain** :, casse), jamais--author. Une PR sans tag lisible n'est comptée nulle part.ARDOISE DE LA LANE NON MESUREE (<erreur>)+ commande de vérification manuelle. Un zéro d'absence de mesure fabriquerait exactement le faux « rien livré ».grain-requalified:<TIER>n'est pas honorée — c'est un mécanisme de l'organe G-VAR-2 qui gate, pas d'un compte informatif). Tier/genre hors énumération : conservés sous leur propre clé /hors_enumeration— un compte qui somme à moins que le total sans le dire est un sous-compte.truncated+ « bornes INFERIEURES » en sortie — conventionPOOL_FETCH_LIMIT._patch_backlog(helper de test existant) neutralise par défaut le nouveau fetch — même précédent queunaddressed_review_points(sinon chaque test partirait sur le réseau).Preuve
Non-régression (suites voisines du picker) :
Tests pinnés (contrôles positifs ET négatifs, par gravité) : replay exact de l'incident (8 PRs nommées) + témoin négatif zéro-CONTENU ; attribution par tag jamais par l'identité de poussée (réciproque incluse) ; PR sans tag jamais attribuée ; formes de tag lâches parsed comme le guard ; fenêtres 24 h/7 j distinctes ; tier/genre hors-liste nommés ; alias canonicalisés ; NON MESUREE annoncé (pas un zéro) ; échec fetch → erreur nommée ; filtre serveur
merged:>=pinné dans la requête ; pureté/absence de gate ; troncature déclarée ; intégrationmain()sur les trois chemins (réparation humain/JSON, tirage JSON).Fichiers :
scripts/pick_idle_grain.py(+268/−1),scripts/tests/test_pick_idle_grain.py(+4, helper),scripts/tests/test_pick_lane_record.py(nouveau, 369 lignes). Aucune édition sous.claude/rules/**.🤖 Generated with Claude Code