Repository navigation
feat(coord,#13086): route grain-tag orphans to the coordinator daily - #13204
Conversation
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — routage des orphelines Grain: (tranche #13086).
Vérifié first-hand sur le head 0c1c9fd50 :
- Tests exécutés : checkout du fichier au head +
uv run --with pytest→ 53/53 passed (9 ciblés dont les 7 nouveaux :unattributed_blocked_prs_carries_the_route,red_backlog_unattributed_now_carries_the_route,build_orphans_comment_*,orphans_report_mode_dry_run_by_default,orphans_report_apply_upserts_the_comment,lane_still_required_outside_orphans_report). - Logique : refactor sain —
unattributed_blocked_prs()extrait le calcul historique dered_backlog(une seule détection partagée, pas de divergence détecteur/garde) et l'enrichit deauthor+branch: le commentaire marker-guardéGRAIN-ORPHANS-SWEEPnomme chaque orpheline pour dispatch nommé. Le gaspillage signalé (#13086 : signal sans destinataire ≠ routage) est correctement traité. - Workflow :
grain-orphans-sweep.ymladvisory (toujours exit 0), cron 07:23 UTC décalé du scan 06:17, dry-run par défaut sur dispatch manuel,--apply-commentexplicite. Le fichiershellcheck: le${{ inputs.apply }}dans un[ ]simple cité est safe (évalué avant exécution). - Edge cases couverts : fich vide écrit (« 0 » daté, jamais muet),
--lanereste requis hors mode rapport (test dédié), upsertPATCHvs création. - Security scan : 0 match — seul usage de token =
secrets.GITHUB_TOKENstandard +permissions: issues: writeminimal.
Pas de commentaire bloquant. (Contrainte token : COMMENT only — auteur jsboige.)
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
…e gelée du run, jamais rerun (#13348) * feat(guards,#13321): sweep stale-guard-red — date le rouge par la base GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321 * feat(guards,#13321): sweep stale-guard-red — date le rouge par la base GELÉE du run, remede update-branch jamais rerun Organe advisory pour la classe des PR bloquees par un rouge anterieur au fix de son garde (mesure 2026-08-28 : 19 PRs datees, bande #12512..#13204, plancher sample par ai-01 sur un tiers du pool). pr-gate-stale-sweep.yml ne couvre que les PR sans rouge hors PR gate ; cette classe n'avait aucun organe et restait BLOCKEE jusqu'a datation manuelle. - scripts/check_stale_guard_reds.py : datation par ancetre (base GEELEE du run : run.pull_requests[0].base.sha, immuable, vs commit fix localise par transition rouge->vert sur main), compare REST, controle positif (rouge posterieur au fix NON signale), exclusions nommees (garde rouge sur main, pas de transition, flake meme-tete -> voie rerun, PR gate hors scope), --apply label+commentaire dedupe, --dump/--from-json. - scripts/tests/test_check_stale_guard_reds.py : 20 tests purs, criterions 1-5 de l'issue couverts nommement. - .github/workflows/stale-guard-red-sweep.yml : cron quotidien 53 4 * * *, advisory, jamais update-branch ni rerun (rattrapage ordonne par les lanes proprietaires, famine CI #11860). See #13321
The blocking guard already posts an instructional comment at omission time (piste a, live since 2026-08-24) yet 26 untagged blocked PRs remain -- a signal without a recipient is not a routing. This adds the missing half: --orphans-report in the picker (detection shared with the red guard via unattributed_blocked_prs, enriched with author+branch), and a daily marker-guarded upsert on #13086 naming each orphan for dispatch. Skill coordinate point 5 now reads the swept comment. See #13086 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0c1c9fd to
cdeb1d1
Compare
|
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 |
Grain: MED/guard — lane myia-po-2026:CoursIA — prev: DEEP/ci-infra #13203
Summary
Piste (b) de #13086 — le chaînon manquant du routage des orphelines du tag
Grain:: le garde bloquant instruisait déjà le geste au moment de l'omission (piste (a), live depuis le 08-24, markervtr-required-block, vérifié posté sur #13006/#13082/#13007), mais le résidu persistait — un signal sans destinataire n'est pas un routage. Cette PR donne à la file un artefact durable nommé par auteur que le coordinateur lit à chaque cycle.Périmètre : 4 fichiers :
scripts/pick_idle_grain.py(mode--orphans-report+ extraction de la détection)scripts/tests/test_pick_idle_grain.py(+7 tests).github/workflows/grain-orphans-sweep.yml(cron quotidien, advisory).claude/skills/coordinate/SKILL.md(point 5 → commentaire balayé)Ce que fait chaque pièce
unattributed_blocked_prs()— extraction du calcul historique dered_backlog(les untagged ne peuvent jamais appartenir à une lane, donc l'ensemble est lane-indépendant). Le mode rapport et le garde partagent désormais la même détection : deux implémentations de la même question finiraient par diverger, et la divergence d'un détecteur se voit toujours du côté du sous-comptage. Le champunattributed_blockeddu--jsonest enrichi (auteur, branche), pas remplacé — le skill coordinate continue de le lire au même endroit.--orphans-report [--apply-comment N]— dry-run par défaut (impression seule) ; avec--apply-comment, upsert marker-guarded (GRAIN-ORPHANS-SWEEP) : un seul commentaire mis à jour sur place, jamais un flot quotidien. Le cas vide s'écrit (« File d'orphelines : 0 », daté) — un balayage muet est indiscernable d'un balayage mort.grain-orphans-sweep.yml— cron quotidien 07:23 UTC (off-:00, décalé vs le scan 06:17),workflow_dispatchdry-run par défaut. Advisory, jamais bloquant : exit 0 toujours, ne labelise aucune PR, ne ferme rien — pattern exact d'orphaned-delivery-scan.yml. Il route, le coordinateur décide.unattributed_blockeddu--jsonde sa propre lane » par « lire le commentaire marker-guardé sur [COORD] 23 PRs bloquees et orphelines : sans tag Grain, invisibles au garde de reparation de chaque lane #13086 (rafraîchi à la demande via--orphans-report) ».Pourquoi la piste (a) ne suffisait pas (mesures firsthand)
vtr-required-blockpostés sur feat(dl,#12959): 3.6b — versant PyTorch des modeles generatifs (VAE/GAN/DDPM), renumerote depuis 3.3 #13006 (04:54), feat(ict,#13039): ICT-13b décroisement dynamique × observable — la cellule manquante tranche #13082 (10:33), fix(genai-texte,#12963): mesure reelle du compromis BF16/INT8/INT4 dans 11_Quantization #13007 — le garde instruit bien au moment de l'omission.jsboige= flotte, 1myia-po-2023: feat(probas,#13033): calibration hors echantillon des twins de classification (Brier/AUC/fiabilite) #13067), âges 11–56 h, chacune avec branche et titre dans le commentaire. Le geste individuel instruit ne se traduit pas en reprise : personne ne revient sur une PR rouge d'hier sans qu'un organe la lui présente.Validation
pytest scripts/tests/test_pick_idle_grain.py: 53/53 passed (46 existants + 7 nouveaux : route portée auteur+branche, tri par âge, exclusion non-bloquées/taggées, enrichissement du champ historique, commentaire nommant chaque orpheline, cas vide écrit, dry-run sans écriture, upsert exactement 1× sur l'issue demandée,--lanetoujours requis hors mode rapport)test_check_lane_claim.py+test_variation_light_cap.py= 350/350 passed (les frères ne font que référencer le picker en commentaire / commande shell, aucun import defetch_open_prs)--lanereste obligatoire sur le chemin de tirage (validation manuelle testée)Note scope
Pas
Closes #13086: l'acceptance de l'issue (réduction mesurée du stock d'orphelines vers 0 et maintien) exige que le balayage tourne en production plusieurs jours et que les 26 orphelines existantes soient traitées (tag, réparation ou fermeture assumée) — décision coordinateur pour les 25 sousjsboige. Cette PR livre l'organe de routage ; le premier commentaire marker-guardé apparaîtra au cron de demain 07:23 UTC.See #13086, See #10045 (garde Grain tag), See #13097 (famine CI — contexte des rouges)
🤖 Generated with Claude Code