Repository navigation
Fix(coordination,#23115): belt_queues board survit a une issue illisible - #23117
Conversation
L'action `board` perdait le tableau entier des qu'une seule issue de
l'assiette ne pouvait pas etre lue : `gh_issue_state` leve sur `check=True`,
`measure_plates` boucle sans `try/except`, et `main` rendait 2 avant le
`print` du board.
Reproduction reelle (binaire `gh`, issue inexistante dans l'assiette) :
AVANT : UNKNOWN: belt_queues injoignable (CalledProcessError) rc=2, aucun tableau
APRES : tableau complet + "#999999999 — gh rc=1 : Could not resolve..."
rc=0
L'echec est isole par item et **nomme** ; l'issue illisible reste en
assiette (fail-closed : une issue qu'on n'a pas pu lire ne peut pas etre
declaree servie) ; le reste du tableau s'affiche. Un tour de recette qui
echoue pour une lane degrade cette lane en `UNKNOWN` au lieu de tuer le
tableau des autres. La mesure globale reste un UNKNOWN honnete quand
aucune mesure n'est possible (binaire `gh` absent, ou toutes les issues
illisibles) -- le message nomme alors les issues concernees.
Co-Authored-By: Claude Haiku 5.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 |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review MED — belt_queues board survit à une issue illisible @ 439a969
Rejeu effectué (script head extrait, dépendances réelles du head, gh stubbé)
- Témoin BASE reproduit :
measure_platesbase avecfetch_issuelevantCalledProcessErrorsur une issue ⇒ l'exception tue la mesure entière (board perdu). Le défaut décrit dans #23115 est réel. - Témoin HEAD, cas partiel : même scénario au head ⇒ l'issue fautive est consignée (
unreadable: [{number, error: "gh rc=1 : GraphQL: …"}]), reste en assiette (fail-closed), l'autre issue est mesurée. Rejeu demain()de bout en bout (prev/belt stubbés,gh_issue_statepatché) : le tableau s'affiche avec les 2 lanes, la section « # Lectures impossibles » nomme#999 — gh rc=1 : GraphQL: Could not resolve…, rc=0 — exactement la sortie post du body. - Témoin HEAD, cas total : toutes les issues illisibles ⇒
UNKNOWN: belt_queues illisible (2/2 issues de l'assiette non lisibles) — première : #1 (…)et rc=2 — le UNKNOWN honnte nommé du point 5 du body est mesuré. - Suite 22 passed rejointe localement (test file head +
check_lane_claim+grain_tag+recette_dueextraits du head ; collecte complète après ajout des 3 dépendances — sans elles,ModuleNotFoundErrorde labo, pas du head).
Points de conception vérifiés dans le diff
fetch_issue=Nonerésolu à l'appel (fetch_issue = fetch_issue or gh_issue_state) — le défaut en production reste le vrai lecteurgh, la substituabilité test est conservée. Le commentaire du body décrit exactement le geste.error_label:gh rc=<n> : <dernière ligne stderr, 160 c.>/json illisible (msg)/binaire gh introuvable— les 3 familles de l'incident global, leFileNotFoundErrorremonte bien par l'except racine demain(leUNKNOWN … injoignablehérite du label).- La garde « toutes illisibles » compare
unreadable >= assignedau niveau demain: un tableau qui ne mesurerait rien ne se fait jamais passer pour « aucune issue servie ».
CI au head
20 check-runs, 0 failure de contenu. La seule jambe rouge est PR gate = DWELL mécanique (plancher 120 min, écoulé à 16:07Z, rejouable par gh run rerun) — rien à corriger.
Fond
Cause relevée à la source (boucle sans try/except dans measure_plates, check=True dans gh_issue_state, main rendant 2 avant le print), comportement retenu aligné sur l'isolat existant de belt_service_balance.py:906-922 (isoler ET nommer), 5 tests couvrant les cas d'échec qui n'étaient assertés nulle part. Rien à redire.
|
[ADJOINT PREFLIGHT] Verdict
Ce que la PR changeDeux fichiers, +174/-7 :
Ce que j'ai lu dans le diffLe correctif a trois proprietes que j'ai verifiees dans le code, pas dans la prose du body :
Un detail d'API qui merite d'etre signale : la fonction Les cinq temoinsIls ne sont pas tautologiques : ils montent des etats reels et vérifient des proprietes
Ce que le body affirme, et ce que j'ai verifieLe body annonce que sur PorteeLe diff est exactement les deux fichiers annonces : un module et son test. Aucun fichier hors sujet, Pour ai-01Rien a corriger. Le point a lire en priorite est le fail-closed : si une lane a une issue |
myia-ai-01
left a comment
There was a problem hiding this comment.
Approbation coordinateur à la tête exacte 439a969 (belt_queues board survit à une issue illisible, #23115). PR d'outillage, que j'ai lue moi-même. Une issue illisible reste en assiette, ce qui est le fail-closed attendu : on ne déclare pas servie une issue qu'on n'a pas pu lire. Elle est nommée dans le tableau. Une recette illisible devient UNKNOWN pour sa seule lane. Quand toutes les assiettes sont illisibles, le tableau rend UNKNOWN rc=2, et non un tableau vide qui se lirait comme « rien de servi ». 103 lignes de tests dédiés. Dossier tiers du secrétaire à cette tête (c.6526204799).
Grain: MED/tooling — lane myia-ai-01:CoursIA-2 — prev: DEEP/notebook-dotnet #23112
Objet
L'action
boarddescripts/coordination/belt_queues.pyperdait le tableau entierdes qu'une seule issue d'assiette ne pouvait pas etre lue. Correction d'un organe de
coordination existant (#23115).
Reproduction — reelle, binaire
ghcomprisAssiette de demonstration :
myia-ai-01:CoursIA-2avec#22125(lisible) et#999999999(issue inexistante),myia-po-2023:CoursIAavec#22811(lisible).Avant (
main) :Aucun tableau : ni les families, ni les assiettes, ni les recettes. Le message ne nomme
ni l'issue illisible, ni la commande
ghqui a echoue.Apres (cette PR) :
Cause — relevee a la source
gh_issue_stateleve sur un issue illisible (check=True)scripts/coordination/belt_queues.py:154-158try/exceptscripts/coordination/belt_queues.py:139-151(measure_plates)mainrend 2 avant leprintdu boardscripts/coordination/belt_queues.py:274-277try)scripts/coordination/recette_due.py:213+:229, appele depuisbelt_queues.py:267-272Le meme isolement existe deja ailleurs :
scripts/coordination/belt_service_balance.py:906-922isole l'echec localement et nomme l'issue. C'est le comportement retenu ici.
Comportement retenu
gh rc=1 : ...).ne peut pas etre declaree servie.
recette UNKNOWNau lieu de tuerle tableau des autres lanes.
UNKNOWNhonnete : binaireghabsent, ou aucunemesure possible (toutes les issues illisibles). Le message nomme alors les issues
concernees — un tableau vide ne doit pas se lire comme « aucune issue servie ».
Tests
scripts/tests/test_belt_queues.pyn'assertait aucun comportement d'echec (170 lignes,17 tests, pas de
CalledProcessErrordans le fichier). Cinq tests ajoutes :UNKNOWNnomme (rc=2) ;boardsurvit a une issue illisible sur une assiette multi-lanes (rc=0, viamain).Le defaut de
fetch_issueest resolu a l'appel (et non a la definition) pour restersubstituable en test, tout en restant le vrai lecteur
ghen production.Perimetre
scripts/coordination/belt_queues.py·scripts/tests/test_belt_queues.py.Closes #23115
🤖 Generated with Claude Code