Les temp des bancs hors du tmpfs : le lanceur pose TMPDIR, élague, et refuse de compter un disque plein (t_5d5edc3d) #1653

Merged
hermes-fusion merged 2 commits from hermes/temp-des-bancs-hors-tmpfs into main 2026-10-15 01:20:04 +02:00
Collaborator

Cause mesurée le 2026-10-14 : le tmpfs /tmp du PC (16 Go) était plein à 99 %, dont 12,44 Go au
compte atelier — les dossiers temporaires des bancs, créés par tempfile.mkdtemp(prefix=…)
dans plus de soixante fichiers sans aucun nettoyage (206 accueil-taches-*, 169
fichier-blocs-* de 20 Mo, 191 actions-nav-*, 164 navigateur-sante-*, plus les profils
Chromium jetables). Effets mesurés : job « Rust » de la CI en No space left on device, 44 bancs
rouges en database or disk is full, cliquet refusant une baisse de couverture fausse.

Ce que la branche livre

  1. 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'un
    processus vivant tient (cwd et fichiers ouverts lus dans /proc/<pid>/cwd et
    /proc/<pid>/fd ; dans le doute il garde). Jamais de pkill/pgrep -f, jamais de suivi de
    lien, 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.
  2. _tableau/lancer-tests.py — le lanceur pose TMPDIR sur un dossier de passage hors du tmpfs
    (couvre d'un coup les 135 fichiers à mkdtemp et les profils Chromium), l'efface en finally
    même en cas d'échec, appelle outils/nettoyer-temp.py au démarrage pour les restes d'un
    lancement 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.
  3. Le cliquet (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 le
dé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 unix
limité à 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_dev
différent de /tmp), hors du dépôt donc hors git, et effacé en finally.

Les 2 autres ROUGE de ce premier passage venaient d'un changement de signature de lancer()
(test_lanceur_partiel.py, test_lanceur_seuil.py la simulent) : TMPDIR est 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) :

=== BANC 1 : controle/test_nettoyer_temp.py (avant correctif) ===
FileNotFoundError: [Errno 2] No such file or directory: '.../outils/nettoyer-temp.py'
code=1
=== BANC 2 : controle/test_garde_disque_bancs.py (avant correctif) ===
AttributeError: module 'lancer_tests' has no attribute 'espace_ok'
code=1

Vert après :

controle/test_nettoyer_temp.py : conforme — le vieux part, le récent reste, le tenu reste,
l'irrécupérable n'arrête rien, la cible d'un lien reste.   (code 0)
controle/test_garde_disque_bancs.py : conforme — refus sous le seuil avec « mesure impossible :
disque plein », refus dans le doute, dossier de passage hors du tmpfs.   (code 0)

Garde du disque plein rejouée sans remplir de disque :

$ TABLEAU_ESPACE_MIN_MO=999999999 python3 _tableau/lancer-tests.py --sans-couverture _tableau/test_accueil_parite.py
mesure impossible : disque plein — 926208 Mo libres sous /home/atelier/.atelier-hermes/tmp-bancs,
999999999 Mo exigés : compter des ROUGE dues au disque ferait accuser au cliquet une baisse
fausse (TABLEAU_ESPACE_MIN_MO ajuste le seuil)
code=2

Premier python3 _tableau/lancer-tests.py --tout (passage sous le dépôt) :

=== AVANT ===   tmpfs 16G 5,8G 9,6G 38% /tmp    entrées /tmp: 7686
=== APRÈS ===   tmpfs 16G 6,4G 9,0G 42% /tmp    entrées /tmp: 8982
APPARUS DANS /tmp (préfixes des bancs du tableau) : (vide)   — aucun accueil-taches-*,
                                fichier-blocs-*, actions-nav-*, navigateur-sante-* ni profil Chromium
146 ok, 10 ROUGE, 1 LENT   — les 10 ROUGE expliqués ci-dessus, corrigés ensuite
GIT : seule la branche modifiée

Second passage complet (passage dans le HOME, état livré) :

157 banc(s) verts.   0 ROUGE, 0 LENT, code=0
APPARUS DANS /tmp (préfixes des bancs du tableau) : (vide)
PASSAGE RESTANT : (vide) — le dossier de passage est effacé
GIT : propre hors le commit de la branche

Ce que je n'ai pas mesuré / ce qui reste

  • AGENTS.md n'est pas modifié : la règle datée du 2026-10-14 (le travail d'une carte ne va
    jamais dans /tmp du PC ; les passages viennent du lanceur ; ne pas relancer trois fois un banc
    tué par le disque plein) est écrite et prête, mais l'écriture de AGENTS.md est refusée par la
    garde de fichiers du poste en mode sans utilisateur (BLOCKED: write to protected agent-instruction file). Elle demande une approbation humaine ; le texte est dans le
    commentaire de la carte t_5d5edc3d.
  • L'élagage au démarrage garde les dossiers de moins de 2 h : les 480 dossiers déjà présents dans
    /tmp ce soir ne partent pas au premier lancement (c'est voulu — un banc vivant est plus jeune
    que 2 h). Pour les ramasser : python3 outils/nettoyer-temp.py --dossier /tmp --age 2.
  • Les processus d'autres utilisateurs ne sont pas lisibles dans /proc : leurs entrées sont
    gardées par la règle du propriétaire courant, et ce cas n'est pas mesuré.
Cause mesurée le 2026-10-14 : le tmpfs `/tmp` du PC (16 Go) était plein à 99 %, dont 12,44 Go au compte `atelier` — les dossiers temporaires des bancs, créés par `tempfile.mkdtemp(prefix=…)` dans plus de soixante fichiers sans aucun nettoyage (206 `accueil-taches-*`, 169 `fichier-blocs-*` de 20 Mo, 191 `actions-nav-*`, 164 `navigateur-sante-*`, plus les profils Chromium jetables). Effets mesurés : job « Rust » de la CI en `No space left on device`, 44 bancs rouges en `database or disk is full`, cliquet refusant une baisse de couverture fausse. ## Ce que la branche livre 1. `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'un processus vivant tient (cwd et fichiers ouverts lus dans `/proc/<pid>/cwd` et `/proc/<pid>/fd` ; dans le doute il garde). Jamais de `pkill`/`pgrep -f`, jamais de suivi de lien, 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`. 2. `_tableau/lancer-tests.py` — le lanceur pose `TMPDIR` sur un dossier de passage hors du tmpfs (couvre d'un coup les 135 fichiers à `mkdtemp` et les profils Chromium), l'efface en `finally` même en cas d'échec, appelle `outils/nettoyer-temp.py` au démarrage pour les restes d'un lancement 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. 3. Le cliquet (`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 le dé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 unix limité à 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_dev` différent de `/tmp`), hors du dépôt donc hors git, et effacé en `finally`. Les 2 autres ROUGE de ce premier passage venaient d'un changement de signature de `lancer()` (`test_lanceur_partiel.py`, `test_lanceur_seuil.py` la simulent) : `TMPDIR` est 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) : ``` === BANC 1 : controle/test_nettoyer_temp.py (avant correctif) === FileNotFoundError: [Errno 2] No such file or directory: '.../outils/nettoyer-temp.py' code=1 === BANC 2 : controle/test_garde_disque_bancs.py (avant correctif) === AttributeError: module 'lancer_tests' has no attribute 'espace_ok' code=1 ``` Vert après : ``` controle/test_nettoyer_temp.py : conforme — le vieux part, le récent reste, le tenu reste, l'irrécupérable n'arrête rien, la cible d'un lien reste. (code 0) controle/test_garde_disque_bancs.py : conforme — refus sous le seuil avec « mesure impossible : disque plein », refus dans le doute, dossier de passage hors du tmpfs. (code 0) ``` Garde du disque plein rejouée sans remplir de disque : ``` $ TABLEAU_ESPACE_MIN_MO=999999999 python3 _tableau/lancer-tests.py --sans-couverture _tableau/test_accueil_parite.py mesure impossible : disque plein — 926208 Mo libres sous /home/atelier/.atelier-hermes/tmp-bancs, 999999999 Mo exigés : compter des ROUGE dues au disque ferait accuser au cliquet une baisse fausse (TABLEAU_ESPACE_MIN_MO ajuste le seuil) code=2 ``` Premier `python3 _tableau/lancer-tests.py --tout` (passage sous le dépôt) : ``` === AVANT === tmpfs 16G 5,8G 9,6G 38% /tmp entrées /tmp: 7686 === APRÈS === tmpfs 16G 6,4G 9,0G 42% /tmp entrées /tmp: 8982 APPARUS DANS /tmp (préfixes des bancs du tableau) : (vide) — aucun accueil-taches-*, fichier-blocs-*, actions-nav-*, navigateur-sante-* ni profil Chromium 146 ok, 10 ROUGE, 1 LENT — les 10 ROUGE expliqués ci-dessus, corrigés ensuite GIT : seule la branche modifiée ``` Second passage complet (passage dans le HOME, état livré) : ``` 157 banc(s) verts. 0 ROUGE, 0 LENT, code=0 APPARUS DANS /tmp (préfixes des bancs du tableau) : (vide) PASSAGE RESTANT : (vide) — le dossier de passage est effacé GIT : propre hors le commit de la branche ``` ## Ce que je n'ai pas mesuré / ce qui reste - **`AGENTS.md` n'est pas modifié** : la règle datée du 2026-10-14 (le travail d'une carte ne va jamais dans `/tmp` du PC ; les passages viennent du lanceur ; ne pas relancer trois fois un banc tué par le disque plein) est écrite et prête, mais l'écriture de `AGENTS.md` est refusée par la garde de fichiers du poste en mode sans utilisateur (`BLOCKED: write to protected agent-instruction file`). Elle demande une approbation humaine ; le texte est dans le commentaire de la carte t_5d5edc3d. - L'élagage au démarrage garde les dossiers de moins de 2 h : les 480 dossiers déjà présents dans `/tmp` ce soir ne partent pas au premier lancement (c'est voulu — un banc vivant est plus jeune que 2 h). Pour les ramasser : `python3 outils/nettoyer-temp.py --dossier /tmp --age 2`. - Les processus d'autres utilisateurs ne sont pas lisibles dans `/proc` : leurs entrées sont gardées par la règle du propriétaire courant, et ce cas n'est pas mesuré.
Les dossiers de passage des bancs sortent du tmpfs /tmp (t_5d5edc3d)
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 32s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 13s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 18s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 20s
8d617edf9a
Cause mesurée le 2026-10-14 : /tmp (tmpfs 16 Go) était plein à 99 %, dont 12,44 Go au
compte atelier — les dossiers temporaires des bancs, créés par tempfile.mkdtemp(prefix=…)
dans plus de soixante fichiers sans aucun nettoyage (206 accueil-taches-*, 169
fichier-blocs-* de 20 Mo, 191 actions-nav-*, 164 navigateur-sante-*, plus les profils
Chromium jetables). Effets mesurés : job « Rust » de la CI en No space left on device,
44 bancs rouges en database or disk is full, cliquet refusant une baisse de couverture
fausse, PR restée ci-rouge pour cette raison.

Remède :
- outils/nettoyer-temp.py : élague les entrées de premier niveau d'un dossier de passage.
  Ne part que ce qui est vieux, de l'utilisateur courant, et non tenu par un processus
  vivant (cwd et fichiers ouverts lus dans /proc/<pid>/cwd et /proc/<pid>/fd — jamais
  pkill, jamais pgrep -f). Jamais de suivi de lien, jamais hors du dossier visé, dans le
  doute il garde, sort 0, l'échec d'une entrée n'arrête pas les autres.
  Banc : controle/test_nettoyer_temp.py, rouge avant le correctif.
- _tableau/lancer-tests.py pose TMPDIR sur un dossier de passage hors du tmpfs et l'efface
  en finally même en cas d'échec ; élague au démarrage les passages laissés par un
  lancement interrompu ; sort 2 « mesure impossible : disque plein » sous le seuil au lieu
  de compter des ROUGE dues au disque, qui feraient accuser au cliquet une baisse fausse.
  Banc : controle/test_garde_disque_bancs.py, rouge avant le correctif.
- Le passage est dans ~/.atelier-hermes/tmp-bancs et non sous la racine du dépôt : le
  socket unix de Chromium (108 caractères) n'aurait pas tenu avec un chemin sous le dépôt.
  Mesuré : huit bancs navigateur morts en Socket path too long avec le passage sous le
  dépôt, tous verts après.
- couverture-objectif.json : horodatage de la mesure du passage vert (effet normal du
  lanceur, chiffres inchangés : cœur 99,4 %, ensemble 99,0 %).

Mesuré sur le PC de l'opérateur : 157 bancs verts, 0 rouge, 0 lent ; aucun nouveau dossier
accueil-taches-*, fichier-blocs-*, actions-nav-*, navigateur-sante-* ni profil Chromium
dans /tmp pendant le lancement ; passage effacé ; git status propre hors le présent commit.
Le banc test_nettoyer_temp tourne sur un arbre neuf, le cliquet ne salit plus git status (t_afc8a344)
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 20s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 15s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 19s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 15s
1594d387a8
Trois écarts de la relecture de la PR #1653, chacun avec sa mesure.

1. `controle/test_nettoyer_temp.py` créait son dossier de passage dans `_travail/tmp-bancs`, que
   rien ne crée. Sur un arbre neuf — `git archive`, ce que reçoit la CI — `mkdtemp` tombait en
   FileNotFoundError et le banc sortait 1 sans avoir rien mesuré. Remède : le banc prend le
   `BANCS_TRAVAIL` du lanceur (`~/.atelier-hermes/tmp-bancs`) et le crée lui-même, comme le fait
   déjà le banc de la garde du disque. Vérifié sur un arbre vierge : code 0.

2. `cliqueter` datait chaque mesure de l'heure du passage, donc un lancement complet réécrivait
   `_tableau/couverture-objectif.json` (t 21:54:22 → 22:06:24) et laissait `git status` sale sans
   qu'aucun chiffre n'ait bougé. Remède : la date ne bouge plus quand la mesure enregistrée est
   identique, et `appliquer_cliquet` n'écrit rien quand le cliquet en vigueur ne change pas.
   Deux assertions ajoutées à `_tableau/test_lanceur_cliquet.py`, rouges sur l'ancien code.

3. Deux textes annonçaient le dossier de passage sous la racine du dépôt alors que le code le
   pose dans le HOME : `_tableau/lancer-tests.py` (en-tête, à deux endroits) et
   `controle/test_garde_disque_bancs.py` (en-tête), dont le point 4 refuse justement ce cas.
Author
Collaborator

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.py tourne 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 le BANCS_TRAVAIL du lanceur et le crée lui-même (os.makedirs(..., exist_ok=True)), comme le fait le banc frère controle/test_garde_disque_bancs.py:48-53.

$ git archive 1594d387 | tar -x -C ~/atelier-hermes/preuves-t_afc8a344/arbre-vierge
$ cd ~/atelier-hermes/preuves-t_afc8a344/arbre-vierge    # arbre neuf, aucun mkdir
$ ls -d _travail/tmp-bancs
ls: cannot access '_travail/tmp-bancs': No such file or directory
$ python3 controle/test_nettoyer_temp.py
note  : entrée d'un autre propriétaire non rejouée (ni root, ni entrée fabriquable ici) — principe lu dans le code, non mesuré
nettoyer-temp.py : conforme — le vieux part, le récent reste, le tenu reste, l'irrécupérable n'arrête rien, la cible d'un lien reste.
code = 0

Avant le correctif, sur le même arbre neuf : FileNotFoundError: .../_travail/tmp-bancs/banc-nettoyer-temp-gdyy6shk, code 1 (relevé ci-dessous).

2. git status propre après un lancement complet — levé

Cause mesurée : cliqueter datait chaque mesure de l'heure du passage, donc appliquer_cliquet réécrivait _tableau/couverture-objectif.json alors 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, et appliquer_cliquet n'écrit rien quand le cliquet en vigueur ne change pas. Le fichier du dépôt n'est pas modifié par ce commit.

$ cd ~/atelier-hermes/wt/t_afc8a344        # tête 1594d387, arbre propre
$ python3 _tableau/lancer-tests.py --tout
Passage des bancs : /home/atelier/.atelier-hermes/tmp-bancs/3411713-ocbhwu4b (918967 Mo libres)
...
159 banc(s) verts.
code = 0
$ git status --porcelain
(vide)

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'ancien cliqueter dans une copie du module :

ancien code  : code=0 refus=None releves=[] -> écritures=1, date conservée=False
RED confirmé : l'ancien code réécrivait le cliquet à chaque passage (git status sale).
code corrigé : code=0 refus=None releves=[] -> écritures=0, date conservée=True
VERT : le cliquet corrigé n'écrit rien quand la mesure n'a pas bougé.

3. Les deux textes qui contredisaient le code — levés

  • _tableau/lancer-tests.py (en-tête, aux deux endroits) dit maintenant TMPDIR sur ~/.atelier-hermes/tmp-bancs/<pid>-<suffixe>, dans le HOME et pas sous la racine du dépôt, en renvoyant au commentaire de BANCS_TRAVAIL qui porte la raison (socket unix de Chromium, 108 caractères).
  • controle/test_garde_disque_bancs.py:18 dit maintenant que le BANCS_TRAVAIL du 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é

  • La règle datée dans AGENTS.md (point 4 de la relecture) : hors de mon accès, portée par t_b02c3c7d (chef).
  • La porte de controle/ de la PR #1638 : elle n'est pas dans main, je l'ai rejouée à la main (banc neuf sur arbre neuf, code 0) et pas par le script de la porte.
  • Le nom du passage dans ~/.atelier-hermes/tmp-bancs reste <pid>-<suffixe> (mkdtemp), pas l'<horodatage>-<pid> du texte d'origine : c'est celui de la ligne 97, mesuré 3411713-ocbhwu4b ci-dessus.
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.py` tourne 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 le `BANCS_TRAVAIL` du lanceur et le crée lui-même (`os.makedirs(..., exist_ok=True)`), comme le fait le banc frère `controle/test_garde_disque_bancs.py:48-53`. $ git archive 1594d387 | tar -x -C ~/atelier-hermes/preuves-t_afc8a344/arbre-vierge $ cd ~/atelier-hermes/preuves-t_afc8a344/arbre-vierge # arbre neuf, aucun mkdir $ ls -d _travail/tmp-bancs ls: cannot access '_travail/tmp-bancs': No such file or directory $ python3 controle/test_nettoyer_temp.py note : entrée d'un autre propriétaire non rejouée (ni root, ni entrée fabriquable ici) — principe lu dans le code, non mesuré nettoyer-temp.py : conforme — le vieux part, le récent reste, le tenu reste, l'irrécupérable n'arrête rien, la cible d'un lien reste. code = 0 Avant le correctif, sur le même arbre neuf : `FileNotFoundError: .../_travail/tmp-bancs/banc-nettoyer-temp-gdyy6shk`, code 1 (relevé ci-dessous). **2. `git status` propre après un lancement complet — levé** Cause mesurée : `cliqueter` datait chaque mesure de l'heure du passage, donc `appliquer_cliquet` réécrivait `_tableau/couverture-objectif.json` alors 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, et `appliquer_cliquet` n'écrit rien quand le cliquet en vigueur ne change pas. Le fichier du dépôt n'est pas modifié par ce commit. $ cd ~/atelier-hermes/wt/t_afc8a344 # tête 1594d387, arbre propre $ python3 _tableau/lancer-tests.py --tout Passage des bancs : /home/atelier/.atelier-hermes/tmp-bancs/3411713-ocbhwu4b (918967 Mo libres) ... 159 banc(s) verts. code = 0 $ git status --porcelain (vide) 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'ancien `cliqueter` dans une copie du module : ancien code : code=0 refus=None releves=[] -> écritures=1, date conservée=False RED confirmé : l'ancien code réécrivait le cliquet à chaque passage (git status sale). code corrigé : code=0 refus=None releves=[] -> écritures=0, date conservée=True VERT : le cliquet corrigé n'écrit rien quand la mesure n'a pas bougé. **3. Les deux textes qui contredisaient le code — levés** - `_tableau/lancer-tests.py` (en-tête, aux deux endroits) dit maintenant `TMPDIR` sur `~/.atelier-hermes/tmp-bancs/<pid>-<suffixe>`, dans le HOME et pas sous la racine du dépôt, en renvoyant au commentaire de `BANCS_TRAVAIL` qui porte la raison (socket unix de Chromium, 108 caractères). - `controle/test_garde_disque_bancs.py:18` dit maintenant que le `BANCS_TRAVAIL` du 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é** - La règle datée dans `AGENTS.md` (point 4 de la relecture) : hors de mon accès, portée par t_b02c3c7d (chef). - La porte de `controle/` de la PR #1638 : elle n'est pas dans `main`, je l'ai rejouée à la main (banc neuf sur arbre neuf, code 0) et pas par le script de la porte. - Le nom du passage dans `~/.atelier-hermes/tmp-bancs` reste `<pid>-<suffixe>` (`mkdtemp`), pas l'`<horodatage>-<pid>` du texte d'origine : c'est celui de la ligne 97, mesuré `3411713-ocbhwu4b` ci-dessus.
Author
Collaborator

Relecture t_5ad38512 — arbre dédié ~/atelier-hermes/wt/t_5ad38512 (branche relecture-1653), tête 1594d387 ; 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 (base ae760c38), CI pc-lourd 4/4 verte sur 1594d387.

1. Le cliquet ne baisse pas.

$ git diff httpforge/main HEAD -- _tableau/couverture-objectif.json
-  "t": "2026-10-14T08:44:34+02:00"
+  "t": "2026-10-14T21:54:22+02:00"

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.

$ python3 controle/test_nettoyer_temp.py
nettoyer-temp.py : conforme — le vieux part, le récent reste, le tenu reste, l'irrécupérable n'arrête rien, la cible d'un lien reste.
CODE=0
$ python3 controle/test_garde_disque_bancs.py
garde du disque : conforme — refus sous le seuil avec « mesure impossible : disque plein », refus dans le doute, dossier de passage hors du tmpfs.
CODE=0
$ python3 _tableau/test_lanceur_cliquet.py
OK : le cliquet monte, refuse les baisses, et ne s'efface pas en relançant
CODE=0

3. Le banc tourne sur un arbre neuf (c'était l'écart de la relecture précédente). Arbre sans .git ni _travail/ : git archive 1594d387 | tar -x -C <dossier vide>, puis

$ python3 controle/test_nettoyer_temp.py
nettoyer-temp.py : conforme — …
CODE=0

Précision : la carte de relecture annonce python3 _tableau/test_nettoyer_temp.py ; ce chemin n'existe pas sur la branche (le banc est controle/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 --tout sur la branche, et le dépôt reste propre.

$ python3 _tableau/lancer-tests.py --tout
Élagage de /home/atelier/.atelier-hermes/tmp-bancs (dossiers de passage de plus de 2 h)…
Élagage de /tmp (dossiers de passage de plus de 2 h)…
      | /tmp : 7811 supprimé(s) (2.9 Go rendus), 20424 gardé(s) sur 28235 entrée(s).
Passage des bancs : /home/atelier/.atelier-hermes/tmp-bancs/1008762-zm8xlqy_ (914248 Mo libres)
…
159 banc(s) verts.
CODE=0

$ git status --porcelain
(vide — 0 ligne)
$ git diff -- _tableau/couverture-objectif.json
(vide)

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 le git status vide.

5. La garde du disque plein refuse de mesurer, sans qu'on remplisse un disque.

$ TABLEAU_ESPACE_MIN_MO=999999999 python3 _tableau/lancer-tests.py
mesure impossible : disque plein — 913845 Mo libres sous /home/atelier/.atelier-hermes/tmp-bancs, 999999999 Mo exigés : compter des ROUGE dues au disque ferait accuser au cliquet une baisse fausse (TABLEAU_ESPACE_MIN_MO ajuste le seuil)
CODE=2

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 relu posée.

Relecture t_5ad38512 — arbre dédié `~/atelier-hermes/wt/t_5ad38512` (branche `relecture-1653`), tête **1594d387** ; 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` (base `ae760c38`), CI pc-lourd 4/4 verte sur `1594d387`. **1. Le cliquet ne baisse pas.** $ git diff httpforge/main HEAD -- _tableau/couverture-objectif.json - "t": "2026-10-14T08:44:34+02:00" + "t": "2026-10-14T21:54:22+02:00" 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.** $ python3 controle/test_nettoyer_temp.py nettoyer-temp.py : conforme — le vieux part, le récent reste, le tenu reste, l'irrécupérable n'arrête rien, la cible d'un lien reste. CODE=0 $ python3 controle/test_garde_disque_bancs.py garde du disque : conforme — refus sous le seuil avec « mesure impossible : disque plein », refus dans le doute, dossier de passage hors du tmpfs. CODE=0 $ python3 _tableau/test_lanceur_cliquet.py OK : le cliquet monte, refuse les baisses, et ne s'efface pas en relançant CODE=0 **3. Le banc tourne sur un arbre neuf** (c'était l'écart de la relecture précédente). Arbre sans `.git` ni `_travail/` : `git archive 1594d387 | tar -x -C <dossier vide>`, puis $ python3 controle/test_nettoyer_temp.py nettoyer-temp.py : conforme — … CODE=0 Précision : la carte de relecture annonce `python3 _tableau/test_nettoyer_temp.py` ; ce chemin n'existe pas sur la branche (le banc est `controle/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 --tout` sur la branche, et le dépôt reste propre.** $ python3 _tableau/lancer-tests.py --tout Élagage de /home/atelier/.atelier-hermes/tmp-bancs (dossiers de passage de plus de 2 h)… Élagage de /tmp (dossiers de passage de plus de 2 h)… | /tmp : 7811 supprimé(s) (2.9 Go rendus), 20424 gardé(s) sur 28235 entrée(s). Passage des bancs : /home/atelier/.atelier-hermes/tmp-bancs/1008762-zm8xlqy_ (914248 Mo libres) … 159 banc(s) verts. CODE=0 $ git status --porcelain (vide — 0 ligne) $ git diff -- _tableau/couverture-objectif.json (vide) 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 le `git status` vide. **5. La garde du disque plein refuse de mesurer, sans qu'on remplisse un disque.** $ TABLEAU_ESPACE_MIN_MO=999999999 python3 _tableau/lancer-tests.py mesure impossible : disque plein — 913845 Mo libres sous /home/atelier/.atelier-hermes/tmp-bancs, 999999999 Mo exigés : compter des ROUGE dues au disque ferait accuser au cliquet une baisse fausse (TABLEAU_ESPACE_MIN_MO ajuste le seuil) CODE=2 **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 `relu` posée.
hermes-fusion deleted branch hermes/temp-des-bancs-hors-tmpfs 2026-10-15 01:20:04 +02:00
Collaborator

Fusionnée automatiquement par fusion-auto (forge) : CI verte (Rust et Front Svelte), PR relue (étiquette relu), sans conflit.

Fusionnée automatiquement par `fusion-auto` (forge) : CI verte (Rust et Front Svelte), PR relue (étiquette `relu`), sans conflit.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
foXaCe/studio!1653
No description provided.