Repository navigation
fix(ci): guard stale-sweep gh-api assignments against silent bash -e death (run 35188299290) - #16526
Conversation
…death
Run 35188299290 (2026-09-17T06:04Z) failed its main step with exit 1
after 4m26s and ZERO runtime output: a transient actions/runs API
failure made an unguarded command-substitution assignment fail, stderr
was swallowed by 2>/dev/null, and `bash -e` killed the step mid-loop.
The sweep silently no-oped after two green passes.
Two assignments were unguarded (BODY/LINE/RUN-816 already carry guards):
- WFMAP (collection loop): `|| WFMAP=''` so the existing empty-map
fallback `[ -z ] -> '{}'` actually gets to run under -e.
- RUN (candidate re-run loop): `|| { echo ...; continue; }` -- skip the
candidate honestly instead of dying, or of falling through to the
misleading "NO workflow run" branch.
Both guards defer the affected PR to the next hourly sweep; nothing is
lost (the sweep is schedule-mutualized by design, #11860).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Trivial-diff advisory (#15740, non bloquant). |
Path-collision (organ #13359/#13615)Cette PR #16526 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
[Hermes] — revue du fix CI +13/-2 (2 gardes sur assignments gh api non protégés sous bash -e), head 5d3a9ac4.
Vérifications faites au head :
- Complétude symétrique : les 8 call-sites
gh apidu fichier au head sont tous couverts (L307 listing|| exit 0, L324 BODY|| continue, L335 WFMAP = garde du PR, L356 wfnames|| echo '{}', L774 PATCH dans unif, L857 RUN = garde du PR, L944/L951 déjà gardés|| {). Le fix ferme bien les deux seuls trous restants — pas un fix de gros titre. - Mécanisme reproduit (A/B) :
bash -c 'set -e; F=$(false); echo x'→ exit 1 sans aucune sortie (la mort silencieuse décrite) ; avec|| F=''→ survit. Le run 35188299290 (re-queré : conclusion=failure, créé 06:04:52Z) est cohérent avec le diagnostic du body. - bash -n re-exécuté sur les 2 run-blocks embarqués contenant
gh api, extraits du YAML au head : exit 0 les deux — la validation annoncée se reproduit. - Sémantique du garde RUN :
continuediffère le candidat au sweep suivant avec un message honnête, au lieu de tomber dans la brancheRUN_IDvide qui afficherait « NO workflow run » — mensonger sur échec transitoire. Correct.
Sécurité : aucun credential dans le diff. Note mineure : le 2>/dev/null avale toujours le stderr exact de l'appel API (le message du garde reste générique « transient ») — acceptable pour un sweep horaire, ne bloque pas.
[Hermes hermes-pr-review, cycle :10 17/09, host c92df397a786]
Grain: LIGHT/guard — lane myia-po-2027:CoursIA — prev: DEEP/lean #16075
Résumé
Le sweep
pr-gate-stale-sweepa échoué silencieusement au run 35188299290 (2026-09-17T06:04Z) : exit 1 après 4 min 26 s sans AUCUNE sortie runtime. Ce PR garde les deux assignments$(gh api … 2>/dev/null)qui n'étaient pas protégés, pour qu'un échec API transitoire (5xx / secondary rate limit) diffère le candidat au sweep suivant au lieu de tuer tout le step sousbash -e.Diagnostic (preuve)
##[endgroup]de l'echo du script), erreur 06:09:23.632Z (##[error] Process completed with exit code 1) — entre les deux, zéro ligne : le script est mort sans rien imprimer.RUN=$(gh api "…/actions/runs?head_sha=…" … 2>/dev/null)(L730) — assignment non gardé. Sousbash -e, si l'appel API échoue, l'assignement échoue et tue le script ; le2>/dev/nullavale le diagnostic. Les runs verts précédents (35175619759, 35174811486) ont simplement eu la chance de ne pas rencontrer d'échec transitoire sur ce seul appel.RUN_IDvide juste en dessous porte le commentaire « Say so rather than fail silently » — l'intention anti-silence existait, ce chemin la contourne.Le fix (2 gardes, diff +13/-2)
WFMAP(boucle de collecte, L315)|| WFMAP=''[ -z ] → '{}'s'exécute enfin sous-e(comportement antérieur : mort du step avant d'atteindre le fallback)RUN(boucle de re-run, L730)|| { echo …; continue; }RUN_IDvide aurait affiché le message mensonger « NO workflow run »Les autres assignments du fichier sont déjà gardés (
BODY … \|\| continueL307,LINE … \|\| trueL638,RUN/JOBSL816/L823 avec\|\| {). Rien n'est perdu : le sweep est schedule-mutualisé (#11860), le candidat différé est repris au passage suivant.Validation
bash -nsur les 2 steps embarqués contenant des appelsgh api: OK (extraction YAML → fichiers temporaires → bash -n).See #15375 (caps par tier), #11860 (schedule mutualization) — contexte du sweep.
🤖 Generated with Claude Code