Skip to content

fix(ci): guard stale-sweep gh-api assignments against silent bash -e death (run 35188299290) - #16526

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/stale-sweep-silent-api-death
Sep 18, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/stale-sweep-silent-api-death

Conversation

@jsboige

@jsboige jsboige commented Sep 17, 2026

Copy link
Copy Markdown
Owner

Grain: LIGHT/guard — lane myia-po-2027:CoursIA — prev: DEEP/lean #16075

Résumé

Le sweep pr-gate-stale-sweep a é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 sous bash -e.

Diagnostic (preuve)

  • Run 35188299290, job 105095026255, step « Find stale verdicts and re-run their gate » : dernière ligne de log 06:04:57.028Z (##[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.
  • Cause mécanique : RUN=$(gh api "…/actions/runs?head_sha=…" … 2>/dev/null) (L730) — assignment non gardé. Sous bash -e, si l'appel API échoue, l'assignement échoue et tue le script ; le 2>/dev/null avale 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.
  • Ironie documentée : la branche RUN_ID vide 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)

Assignment Garde ajouté Effet
WFMAP (boucle de collecte, L315) || WFMAP='' le fallback existant [ -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; } le candidat est différé au sweep horaire suivant honnêtement — tomber sur RUN_ID vide aurait affiché le message mensonger « NO workflow run »

Les autres assignments du fichier sont déjà gardés (BODY … \|\| continue L307, LINE … \|\| true L638, RUN/JOBS L816/L823 avec \|\| {). Rien n'est perdu : le sweep est schedule-mutualisé (#11860), le candidat différé est repris au passage suivant.

Validation

  • bash -n sur les 2 steps embarqués contenant des appels gh api : OK (extraction YAML → fichiers temporaires → bash -n).
  • Parse YAML du workflow : OK (1 job).
  • Pas de changement de comportement sur le chemin nominal (les gardes ne s'activent que sur échec d'appel API).

See #15375 (caps par tier), #11860 (schedule mutualization) — contexte du sweep.

🤖 Generated with Claude Code

…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>
@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Sep 17, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 15 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

@github-actions

github-actions Bot commented Sep 17, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16526 (fix(ci): guard stale-sweep gh-api assignments against silent bash -e death (run 35188299290)) 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) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou 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

[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 :

  1. Complétude symétrique : les 8 call-sites gh api du fichier au head sont tous couverts (L307 listing || exit 0, L324 BODY || continue, L335 WFMAP = garde du PR, L356 wfnames || echo '{}', L774 PATCH dans un if, 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.
  2. 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.
  3. 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.
  4. Sémantique du garde RUN : continue diffère le candidat au sweep suivant avec un message honnête, au lieu de tomber dans la branche RUN_ID vide 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]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants