Skip to content

feat(picker,L721): le picker rend l'ardoise de lane (mergees 24 h / 7 j) - #15779

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/l721-picker-lane-record
Sep 12, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/l721-picker-lane-record

Conversation

@jsboige

@jsboige jsboige commented Sep 12, 2026

Copy link
Copy Markdown
Owner

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 porte Grain: ... lane <machine:workspace>, décomposé par tier (DEEP/MED/LIGHT) et par classe de genre (CONTENU vs META — partition fermée de variation-protocol.md, reprise telle quelle des constantes CONTENU/META du 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çon fetch_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-2 a 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ée jsboige est 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) :

Ardoise de la lane myia-po-2023:CoursIA-2 -- PRs MERGEES dont le body porte `lane myia-po-2023:CoursIA-2` (L721) :
  24 h : 5 merge(s) | DEEP 5 / MED 0 / LIGHT 0 | CONTENU 5 / META 0
   7 j : 60 merge(s) | DEEP 15 / MED 41 / LIGHT 4 | CONTENU 43 / META 17
  derniers merges : #15662 DEEP/notebook-python, #15607 DEEP/genai, #15595 DEEP/genai

Périmètre et choix

  • Attribution par le tag uniquement : parse_grain_tag (l'extracteur partagé avec variation-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.
  • Fail-open nommé, jamais un zéro silencieux : record illisible (gh down, 403, cache stale) → 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é ».
  • Informationnelle : aucun gate, aucun changement du tirage, aucune condition bloquante nouvelle. Un garde sur ardoise vide reproduirait l'incident des « lanes 2 ».
  • Tier déclaré (la requalification 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.
  • Troncature du corpus (limite 1000) : champ truncated + « bornes INFERIEURES » en sortie — convention POOL_FETCH_LIMIT.
  • _patch_backlog (helper de test existant) neutralise par défaut le nouveau fetch — même précédent que unaddressed_review_points (sinon chaque test partirait sur le réseau).

Preuve

$ python -m pytest scripts/tests/test_pick_lane_record.py -q
scripts\tests\test_pick_lane_record.py .................                 [100%]
============================= 17 passed in 0.08s ==============================

Non-régression (suites voisines du picker) :

$ python -m pytest scripts/tests/test_pick_idle_grain.py scripts/tests/test_pick_idle_grain_cache.py scripts/tests/test_substance_drought.py scripts/tests/test_pick_filters.py scripts/tests/test_pick_admissibility.py scripts/tests/test_pick_claim_filter.py scripts/tests/test_pick_delivered_gate.py scripts/tests/test_pick_nanoclaw_concerns.py scripts/tests/test_pick_child_encoding.py -q
============================= 201 passed in 0.88s =============================

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égration main() 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

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>
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-09-12) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 avec red_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*=).

@github-actions

github-actions Bot commented Sep 12, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #15779 (feat(picker,L721): le picker rend l'ardoise de lane (mergees 24 h / 7 j)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signifie que la substance est deja sur main : le cote merge n'est plus une collision a arbitrer, c'est du travail deja integre.

@myia-ai-01
myia-ai-01 merged commit 244c7c5 into main Sep 12, 2026
18 of 21 checks passed
jsboige added a commit that referenced this pull request Sep 12, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants