You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ci(runners): slot ai-01-wsl-10 en echec rc=128 depuis le reboot du 19/10 -- 50 cycles, journal du slot muet depuis le 16/10 #21446
Le slot éphémère myia-ai-01-wsl-10 ne tient plus de runner depuis le redémarrage de la machine du 19/10 (~02:28Z). Les 13 autres slots (wsl-1..9, wsl-11..14) tournent normalement : cycles rc=0 avec travail, conteneurs de 30 s à 5 min.
Journal coursia-runner : [slot 10] cycle court (rc=128, 1s..40s, consecutifs=1) à 04:28:27 heure locale, puis sans interruption jusqu'à consecutifs=50 (15:54Z). Le backoff est désormais au plafond de 900 s : le slot tente sa chance 4 fois par heure.
Le journal du slot ne reçoit plus rien : /var/lib/coursia-runner/myia-ai-01-wsl-10.log a pour mtime 2026-10-16 23:16:58Z (24,8 Mo). La dernière entrée est la bannière d'enregistrement suivie de Connected to GitHub. Or supervise.sh (l. 1622-1638) redirige docker run ... >>"$STATE_DIR/$name.log". Un rc=128 qui n'écrit rien dans ce fichier est donc la chose à expliquer.
Aucun conteneur wsl-10 (docker ps -a --filter name=wsl-10 vide). Le volume coursia-runner-work-10 existe.
Même anomalie de mtime, à vérifier, sur myia-ai-01-wsl-9.log (2026-10-19 04:27Z) alors qu'un docker run --name myia-ai-01-wsl-9 tournait depuis 94 s.
Cause (reproduite sur le slot 10 seul, service non redémarré)
Le rc=128 venait d'un dépôt git corrompu dans le volume coursia-runner-work-10, pas du superviseur :
le clone avait été purgé le 16/10 23:17 par le bloc « sparse ARME » de l'entrypoint, puis reconstitué à moitié par un actions/checkout interrompu — .git/HEAD0 octet, .git/FETCH_HEAD0 octet, .git/shallow.lock0 octet (lock résiduel), 0 ref lisible, arbre de travail absent ;
Écart de mesure à connaître : le superviseur épingle DOCKER_HOST=unix:///var/run/docker-ce.sock. Interroger docker sans ce DOCKER_HOST répond pour un autre daemon (celui de Docker Desktop) : il annonçait 54 conteneurs, 127 volumes et aucuncoursia-runner-work-10. Sur le daemon épinglé : 14 volumes, 12 conteneurs, seuls les slots 1 et 10 sans conteneur.
Réparation bornée au slot (volume préservé, pas recréé)
Volume sauvegardé avant tout geste (slot10-work-vol.tgz, 4 236 443 o, sha256 ae0da8849b9b95d937aeb5a52781a266c7b04e7ed580edf8079c7e3754a04d72). Le remède appliqué est celui de la garde de santé elle-même — purge du clone, pas recréation de volume ; le cache de dépôt et les 13 autres slots restent intacts, et le service n'a pas été redémarré.
Recovery mesuré, au cycle suivant (16:26:55Z) :
√ Runner successfully added
2026-10-19 16:26:55Z: Listening for Jobs
2026-10-19 16:26:58Z: Running job: Twin parity audit (#8057)
Le journal du slot a repris (24 867 196 o → 24 868 312 o) et myia-ai-01-wsl-10 est de nouveau en service.
Correctif générique — l'échec muet devient visible (PR #21447)
cycle_backoff mesure ce que le cycle a réellement écrit et, quand le cycle n'a rien écrit, nomme le cas au lieu de renvoyer vers un log incapable de parler :
-- ECHEC MUET : ce cycle n a rien ecrit dans <log du slot> (le conteneur n a produit aucune sortie) -- la cause est cote entrypoint du runner, pas cote job
Le rappel « -- voir » reste en place pour les échecs qui écrivent (contrôle négatif verrouillé). Tests 66 et 67 ajoutés : 139 PASS / 0 FAIL sur la branche, contre 137 PASS / 0 FAIL sur main (worktree vierge, référence).
Point de fond : le correctif de #16643/#16938 n'a jamais atteint l'image
L'écart mesuré n'est pas entre le pin et l'image, mais entre le dépôt et le pin :
Fichier
Pin installé (23/09)
Dépôt
entrypoint.sh
1c2680af… (appel nu)
dfa754cf… (garde if !)
work_cache_health.sh
bb0fd18e… (0 wch_read)
e5db6bc9… (wch_read)
assert_image_fresh compare l'image au pin : un correctif présent dans le dépôt mais jamais épinglé lui est invisible, et le service démarre sans bruit. Tant que pin + docker build + redémarrage de coursia-runner.service n'ont pas eu lieu, tout slot qui tombe sur un dépôt corrompu se reproduit à l'identique ; le correctif livré ici ne fait que le dire dans le journal.
PR : #21447 (le body porte le diagnostic complet et les commandes de déploiement).
Activity
jsboige commentedon Oct 19, 2026
[CLAIMED] lane myia-ai-01:CoursIA-2 -- diagnostic et reparation du slot wsl-10 (rc=128), pose par le coordinateur au dispatch
jsboige commentedon Oct 19, 2026
Diagnostic terminé, slot réparé, correctif livré.
Cause (reproduite sur le slot 10 seul, service non redémarré)
Le
rc=128venait d'un dépôt git corrompu dans le volumecoursia-runner-work-10, pas du superviseur :actions/checkoutinterrompu —.git/HEAD0 octet,.git/FETCH_HEAD0 octet,.git/shallow.lock0 octet (lock résiduel), 0 ref lisible, arbre de travail absent ;coursia-linux-runner:2.337.0(construite le 12/09) embarque unwork_cache_health.shantérieur à Slotsmyia-ai-01-wsl-*: jobs tues par OOM dans la VM WSL pendant les drains de file (4 echecs mesures, vert jumeau sur un autre runner) #16643 (aucunwch_read) et unentrypoint.shdont l'appel dewch_check_workdirest nu (pas le gardeif !de fix(ci): le garde de sante du cache _work tue le conteneur sur le seul etat qu'il existe pour reparer (rc=128 propage sous set -euo pipefail, slot wsl-8 mort depuis 2 j) #16938). La mesuregit for-each-refsur ce dépôt sansHEADrenvoie un fatal rc=128 ; l'appel nu, sousset -euo pipefail, tue l'entrypoint avantconfig.sh; les mesures suppriment leur stderr (2>/dev/null) → zéro octet dans le log du slot,rc=128, et rien de plus ;actions/checkoutne rejoue jamais → le slot ne peut pas se rattraper seul (51 cycles identiques).Reproduction isolée :
docker run --rm --name diag-wsl10-repro … coursia-linux-runner:2.337.0→ rc=128, sortie 0 octet.Écart de mesure à connaître : le superviseur épingle
DOCKER_HOST=unix:///var/run/docker-ce.sock. Interrogerdockersans ceDOCKER_HOSTrépond pour un autre daemon (celui de Docker Desktop) : il annonçait 54 conteneurs, 127 volumes et aucuncoursia-runner-work-10. Sur le daemon épinglé : 14 volumes, 12 conteneurs, seuls les slots 1 et 10 sans conteneur.Réparation bornée au slot (volume préservé, pas recréé)
Volume sauvegardé avant tout geste (
slot10-work-vol.tgz, 4 236 443 o, sha256ae0da8849b9b95d937aeb5a52781a266c7b04e7ed580edf8079c7e3754a04d72). Le remède appliqué est celui de la garde de santé elle-même — purge du clone, pas recréation de volume ; le cache de dépôt et les 13 autres slots restent intacts, et le service n'a pas été redémarré.Recovery mesuré, au cycle suivant (16:26:55Z) :
Le journal du slot a repris (24 867 196 o → 24 868 312 o) et
myia-ai-01-wsl-10est de nouveau en service.Correctif générique — l'échec muet devient visible (PR #21447)
cycle_backoffmesure ce que le cycle a réellement écrit et, quand le cycle n'a rien écrit, nomme le cas au lieu de renvoyer vers un log incapable de parler :Le rappel « -- voir » reste en place pour les échecs qui écrivent (contrôle négatif verrouillé). Tests 66 et 67 ajoutés : 139 PASS / 0 FAIL sur la branche, contre 137 PASS / 0 FAIL sur
main(worktree vierge, référence).Point de fond : le correctif de #16643/#16938 n'a jamais atteint l'image
L'écart mesuré n'est pas entre le pin et l'image, mais entre le dépôt et le pin :
entrypoint.sh1c2680af…(appel nu)dfa754cf…(gardeif !)work_cache_health.shbb0fd18e…(0wch_read)e5db6bc9…(wch_read)assert_image_freshcompare l'image au pin : un correctif présent dans le dépôt mais jamais épinglé lui est invisible, et le service démarre sans bruit. Tant quepin+docker build+ redémarrage decoursia-runner.servicen'ont pas eu lieu, tout slot qui tombe sur un dépôt corrompu se reproduit à l'identique ; le correctif livré ici ne fait que le dire dans le journal.PR : #21447 (le body porte le diagnostic complet et les commandes de déploiement).
Fix(ci,#21446): le superviseur nomme l'echec MUET (log de slot muet) (#…
Fix(ci,#21474): commentaire de verdict perime, numerotation des tests…