Les temp des bancs hors du tmpfs : le lanceur pose TMPDIR, élague, et refuse de compter un disque plein (t_5d5edc3d) #1653
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/temp-des-bancs-hors-tmpfs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Cause mesurée le 2026-10-14 : le tmpfs
/tmpdu PC (16 Go) était plein à 99 %, dont 12,44 Go aucompte
atelier— les dossiers temporaires des bancs, créés partempfile.mkdtemp(prefix=…)dans plus de soixante fichiers sans aucun nettoyage (206
accueil-taches-*, 169fichier-blocs-*de 20 Mo, 191actions-nav-*, 164navigateur-sante-*, plus les profilsChromium jetables). Effets mesurés : job « Rust » de la CI en
No space left on device, 44 bancsrouges en
database or disk is full, cliquet refusant une baisse de couverture fausse.Ce que la branche livre
outils/nettoyer-temp.py— l'outil transverse. Entrées de PREMIER NIVEAU seulement,propriétaire courant, plus vieilles que
--age(2 h par défaut), et jamais ce qu'unprocessus vivant tient (cwd et fichiers ouverts lus dans
/proc/<pid>/cwdet/proc/<pid>/fd; dans le doute il garde). Jamais depkill/pgrep -f, jamais de suivi delien, jamais hors du dossier visé. Sort 0, et l'échec d'une entrée n'arrête pas les autres.
Son banc :
controle/test_nettoyer_temp.py._tableau/lancer-tests.py— le lanceur poseTMPDIRsur un dossier de passage hors du tmpfs(couvre d'un coup les 135 fichiers à
mkdtempet les profils Chromium), l'efface enfinallymême en cas d'échec, appelle
outils/nettoyer-temp.pyau démarrage pour les restes d'unlancement interrompu, et sort 2 « mesure impossible : disque plein » sous le seuil de
500 Mo (
TABLEAU_ESPACE_MIN_MO) au lieu de compter des ROUGE dues au disque. Son banc :controle/test_garde_disque_bancs.py. La couverture et le cliquet ne changent pas.couverture-objectif.json) n'a bougé que son horodatage : cœur 99,4 %,ensemble 99,0 %, inchangés.
Écart à la carte, mesuré, à valider
La carte demandait le passage sous la racine du dépôt (
_travail/tmp-bancs/<horodatage>-<pid>).Premier passage complet avec ce chemin : 10 ROUGE, dont 8 en
FATAL:chrome/browser/process_singleton_posix.cc:313] Socket path too long— le chemin sous ledépôt fait 111 caractères avant le profil Chromium, et Chromium crée
$TMPDIR/org.chromium.Chromium.XXXXXX/SingletonSocket(43 caractères) dans un socket unixlimité à 108. Le passage est donc dans le HOME :
~/.atelier-hermes/tmp-bancs/<pid>-<suffixe>(98 caractères tout compris). Il reste hors du tmpfs (
/home= le NVMe du PC,st_devdifférent de
/tmp), hors du dépôt donc hors git, et effacé enfinally.Les 2 autres ROUGE de ce premier passage venaient d'un changement de signature de
lancer()(
test_lanceur_partiel.py,test_lanceur_seuil.pyla simulent) :TMPDIRest maintenant posédans l'environnement du processus, la signature d'origine est conservée, les deux bancs repassent.
Preuves
Rouge avant le correctif (les deux bancs, écrits d'abord) :
Vert après :
Garde du disque plein rejouée sans remplir de disque :
Premier
python3 _tableau/lancer-tests.py --tout(passage sous le dépôt) :Second passage complet (passage dans le HOME, état livré) :
Ce que je n'ai pas mesuré / ce qui reste
AGENTS.mdn'est pas modifié : la règle datée du 2026-10-14 (le travail d'une carte ne vajamais dans
/tmpdu PC ; les passages viennent du lanceur ; ne pas relancer trois fois un banctué par le disque plein) est écrite et prête, mais l'écriture de
AGENTS.mdest refusée par lagarde de fichiers du poste en mode sans utilisateur (
BLOCKED: write to protected agent-instruction file). Elle demande une approbation humaine ; le texte est dans lecommentaire de la carte t_5d5edc3d.
/tmpce soir ne partent pas au premier lancement (c'est voulu — un banc vivant est plus jeuneque 2 h). Pour les ramasser :
python3 outils/nettoyer-temp.py --dossier /tmp --age 2./proc: leurs entrées sontgardées par la règle du propriétaire courant, et ce cas n'est pas mesuré.
Reprise t_afc8a344 : les trois écarts de la relecture sont levés, un commit de plus sur la même branche (tête
1594d387, aucun historique réécrit). CI pc-lourd 4/4 verte sur cette tête. Aucun fichier de l'API ni du front touché.1.
controle/test_nettoyer_temp.pytourne sur un arbre neuf (bloquant) — levéCause : le banc créait son passage dans
RACINE/_travail/tmp-bancs, un dossier que rien ne crée. Remède : il prend leBANCS_TRAVAILdu lanceur et le crée lui-même (os.makedirs(..., exist_ok=True)), comme le fait le banc frèrecontrole/test_garde_disque_bancs.py:48-53.Avant le correctif, sur le même arbre neuf :
FileNotFoundError: .../_travail/tmp-bancs/banc-nettoyer-temp-gdyy6shk, code 1 (relevé ci-dessous).2.
git statuspropre après un lancement complet — levéCause mesurée :
cliqueterdatait chaque mesure de l'heure du passage, doncappliquer_cliquetréécrivait_tableau/couverture-objectif.jsonalors qu'aucun chiffre n'avait bougé (t 21:54:22 → 22:06:24). Remède : la date enregistrée ne bouge plus quand la mesure est identique, etappliquer_cliquetn'écrit rien quand le cliquet en vigueur ne change pas. Le fichier du dépôt n'est pas modifié par ce commit.Test ajouté, rouge sur l'ancien code :
_tableau/test_lanceur_cliquet.py(deux assertions : une mesure identique n'écrit rien et ne redate pas ; une mesure qui bouge s'enregistre et se date du jour). Preuve rouge, en remettant l'anciencliqueterdans une copie du module :3. Les deux textes qui contredisaient le code — levés
_tableau/lancer-tests.py(en-tête, aux deux endroits) dit maintenantTMPDIRsur~/.atelier-hermes/tmp-bancs/<pid>-<suffixe>, dans le HOME et pas sous la racine du dépôt, en renvoyant au commentaire deBANCS_TRAVAILqui porte la raison (socket unix de Chromium, 108 caractères).controle/test_garde_disque_bancs.py:18dit maintenant que leBANCS_TRAVAILdu lanceur est hors du tmpfs parce qu'il est dans le HOME — plus de contradiction avec son point 4, qui est bien celui qui refuse un passage sous la racine.Ce que je n'ai pas mesuré
AGENTS.md(point 4 de la relecture) : hors de mon accès, portée par t_b02c3c7d (chef).controle/de la PR #1638 : elle n'est pas dansmain, je l'ai rejouée à la main (banc neuf sur arbre neuf, code 0) et pas par le script de la porte.~/.atelier-hermes/tmp-bancsreste<pid>-<suffixe>(mkdtemp), pas l'<horodatage>-<pid>du texte d'origine : c'est celui de la ligne 97, mesuré3411713-ocbhwu4bci-dessus.Relecture t_5ad38512 — arbre dédié
~/atelier-hermes/wt/t_5ad38512(brancherelecture-1653), tête1594d387; rien écrit sur la branche, rien fusionné, rien déployé.Périmètre.
git diff --stat origin/main...HEAD(origin/main =ae760c38) : 6 fichiers, tous dans le périmètre annoncé, +745/-8 —_tableau/lancer-tests.py(+177/-7),_tableau/couverture-objectif.json,_tableau/test_lanceur_cliquet.py(+26),controle/test_garde_disque_bancs.py,controle/test_nettoyer_temp.py,outils/nettoyer-temp.py. Aucun fichier du service Rust, du front, ni de la production (01-textes/…07-publication/). Aucun secret, aucun binaire base64, aucun emoji d'interface (aucun.svelte/JS touché), aucun échec avalé : les refus de l'élagueur et de la garde du disque sont imprimés et chiffrés.mergeable=true(baseae760c38), CI pc-lourd 4/4 verte sur1594d387.1. Le cliquet ne baisse pas.
Seule la date de mesure change : les objectifs (
coeur 100,ensemble 100) et la mesure enregistrée (coeur 99.4,ensemble 99.0) sont identiques.2. Les trois bancs, code 0.
3. Le banc tourne sur un arbre neuf (c'était l'écart de la relecture précédente). Arbre sans
.gitni_travail/:git archive 1594d387 | tar -x -C <dossier vide>, puisPrécision : la carte de relecture annonce
python3 _tableau/test_nettoyer_temp.py; ce chemin n'existe pas sur la branche (le banc estcontrole/test_nettoyer_temp.py, comme la ligne suivante de la carte le dit déjà). Erreur de la carte, pas de la PR.4.
lancer-tests.py --toutsur la branche, et le dépôt reste propre.Le passage est bien hors du tmpfs :
stat -c '%d %n' /tmp /home/atelier/.atelier-hermes/tmp-bancs→/tmp=58(tmpfs), le dossier de passage =55(/dev/nvme0n1p2, btrfs). Aucun dossier de passage laissé derrière après le passage. La mesure identique ne réécrit plus le cliquet : c'est ce que montre legit statusvide.5. La garde du disque plein refuse de mesurer, sans qu'on remplisse un disque.
Non mesuré, et dit comme tel. La CI pc-lourd ne joue que le Rust et le Svelte : les 159 verts et les trois bancs ci-dessus sont locaux, rien ne les rejoue en CI. Les principes « entrée d'un autre propriétaire gardée » et « suppression refusée » ne sont pas rejoués hors root — le banc le signale lui-même en note.
Relu, conforme — étiquette
reluposée.Fusionnée automatiquement par
fusion-auto(forge) : CI verte (Rust et Front Svelte), PR relue (étiquetterelu), sans conflit.