CI du tableau : passer les bancs Python concernés, pas seulement Rust et Svelte #1638
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/ci-bancs-concernes"
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?
Mandat — un écart rouge doit bloquer la fusion, pas seulement le déploiement.
Mesure du 2026-10-14 (carte
t_91758efd, ticket STUD-1185) :.forgejo/workflows/tableau.yml(exécutantpc-studio, étiquettepc-lourd, mode host) ne faisait tourner que les tests Rust (_tableau/rust) et le front Svelte (vitest+ build).python3 _tableau/lancer-tests.pyn'y passait pas. Conséquence mesurée : une PR qui posait un habillage local dans un onglet (shadow-lgdansCalendrier.svelte) sortait la CI verte ; la fusion automatique la prenait, et seuldeploy-132.shrefusait ensuite, à l'installation sur le 132. Le refus arrivait donc après la fusion, pas avant.Ce que fait cette PR — un troisième métier
bancs, sur le même exécutantpc-lourd:git fetch origin main, puisgit diff --name-only origin/main...HEAD: ce que la branche change face àmain;controle/bancs_concernes.pychoisit les bancs concernés (règle existante : module partagé touché →TOUT, sinon les bancs que les fichiers touchés citent ou que les balayeurs visent) ;_tableau/lancer-tests.pyles lance. Un module partagé touché fait passer le jeu complet (--tout), sans juger le cliquet de couverture.Mesuré au dépôt,
_tableau/front/touché retient 4 bancs :test_garde_couches.py,test_garde_doublons.py,test_garde_plafond.py,test_homogeneite.py. Ces 4 passent en 8,6 s sur arbre propre. Le jeu complet (casTOUT) : 153 bancs verts en 1 min 33 s.Preuve exigée, sortie brute — deux états de cette même PR, et le retour en arrière :
shadow-lgdans_tableau/front/src/Calendrier.svelte→ CI rouge, le journal nommant_tableau/test_homogeneite.py:ÉCHEC garde : les onglets réels tiennent dans leurs exceptions (habillage local : 39 occurrence(s) dans les onglets, 38 admise(s) par exception, 1 refus)— code 1 ;Déclencheur (relu dans le
on:, confirmé par les runs de la forge) : poussée sur toute branche saufmain, et tout événement de pull request. Une PR poussée produit deux exécutions, unepushet unepull_request; les deux emploientpc-lourd. Les jobs tournent séquentiellement sur cet exécutant unique (mesuré : run 107, Rust 16 s puis Front 13 s).Durée — avant : 25 à 34 s par run (Rust + Svelte). Après : voir les runs de cette PR ; le métier
bancsajoute le checkout à historique complet, le diff et les bancs concernés.Limites dites, pas contournées
controle/concernés sont dits dans le journal sans être exécutés par cette CI : elle est celle du tableau, etlivrer.sh/porte-complete.sh(nuit surmain) les tiennent déjà.homogeneite.py(build + Chrome sans tête) n'est pas fait ici : le métierbancsfait son checkout sansdist/, etpc-studion'a pas de Chrome. Il reste àlivrer.sh(étape 4 bis) après la build. Le banc joué en CI est celui qui refuse l'habillage local, moteur de pilote remplacé par un faux.--sans-couverturesur le casTOUT) : il reste à la porte de la nuit et àlivrer.sh.Front : aucun champ d'API changé, aucun besoin côté Svelte.
Branche :
hermes/ci-bancs-concernes, partie deorigin/main(119f2c12). Cartet_91758efd.76e7e620b58c8e2d3bddPreuve mesurée — carte
t_91758efd(STUD-1185). Branchehermes/ci-bancs-concernes, tête8c8e2d3b, partie deorigin/main(119f2c12).Déclencheur et étiquette (ce que je constate). Le
on:déclenche une poussée sur toute branche saufmain, et tout événement de pull request. Les deux exécutions tournent bien surpc-lourd: mesuré, le même commit produit un runpushET un runpull_request, les trois métiers verts dans les deux — run 108 (push) et run 113 (pull_request) pour8c8e2d3b, puis run 120 (push) après le retour en arrière. L'étiquettepc-lourdse retrouve donc bien sur une pull request ; l'exécutantpc-studioa une capacité de 1 (capacity: 1dans~/.config/forgejo-runner/studio/config.yml), donc les métiers tournent l'un après l'autre, pas en parallèle.Durées.
_tableau/front/Preuve (a) — PR propre, CI verte. Le métier
bancsne retient rien et le dit (runpush108, job 11783) :Preuve (b) — la même PR +
shadow-lgdans_tableau/front/src/Calendrier.svelte, CI ROUGE. Runpush116, job 11801 : le métierbancssort en échec, Rust et Front restent verts (l'écart passait donc bien avant, sous la CI verte) :Le même écart a été vu deux fois — run
push116 (job 11801) et runpull_request117 (job 10375). Le commit d'essai (76e7e620) a été retiré de la branche après la mesure : la tête de la PR est le correctif seul,8c8e2d3b, et sa CI est verte (runs 108, 113 et 120).Limites, dites et non contournées.
controle/quebancs_concernes.pyretient sont nommés dans le journal sans être exécutés : cette CI est celle du tableau (_tableau/,_infra/vialancer-tests.py), la porte complète delivrer.shet la passe de nuit (controle/porte-complete.sh) les tiennent déjà. L'étendre serait une autre carte.TOUT(module partagé touché :charte.py,etat.py,livrer.sh,lancer-tests.py…) : le métier passe le jeu complet des bancs du tableau,_tableau/lancer-tests.py --tout --sans-couverture. Mesuré au dépôt le 2026-10-14 : 153 bancs verts en 1 min 33 s. Le cliquet de couverture n'y est pas jugé (--sans-couverture) : il reste à la porte de la nuit surmainet àlivrer.sh, pour ne pas écrire_tableau/couverture-objectif.jsondans un checkout d'exécutant que personne ne relit.homogeneite.py(build + Chrome sans tête, comparaison de captures) n'est pas fait ici : le checkout du métierbancsn'a pas dedist/etpc-studion'a pas de Chrome à nous. Ce passage reste àlivrer.sh(étape 4 bis) après la build. Le banc joué en CI est celui qui refuse l'habillage local, moteur de pilote remplacé par un faux — c'est lui qui attrape leshadow-lg.Front : aucun champ d'API changé, aucun besoin côté Svelte.
Relecture
t_d0af0831— relu, conforme.Dépôt
~/atelier-hermes/studio(PC de l'opérateur), worktree de relecture~/atelier-hermes/wt/t_d0af0831sur la tête8c8e2d3b,origin/mainà jour =b4712395, le 2026-10-14 à 21 h 35.1. Le diff — une seule pièce
Les deux lignes retirées sont l'ancien
name:et le commentaire « cargo et npm sont installés directement sur le PC » ; le blocon:est inchangé (lignes de contexte du diff), et aucun autre fichier n'apparaît. Aucun emoji, aucun secret, aucun binaire dans le diff (grepdes deux motifs : rien).2. Ce que la CI exécute sur cette tête (
8c8e2d3b), lu par l'API de la forgeDurée du métier
bancsquand il n'y a rien à passer : 3,6 s (journal du job 11794). Limite dite : sur cette tête,git diff --name-only origin/main...HEADne donne que.forgejo/workflows/tableau.yml, donc le journal du job 11794 dit « Aucun banc du tableau concerné par ces fichiers : rien à passer. » — le vert de cette tête prouve que le métier existe et passe, pas qu'un banc tourne. La preuve que le banc tourne est le point 3.3. Le rouge, rejoué
Sur la même branche poussée avec
shadow-lgdans_tableau/front/src/Calendrier.svelte(76e7e620), runs 116 (push) et 117 (pull_request), job 11801 / 11799 « Bancs Python concernés » = failure ; extrait du journal :Rejoué chez moi sur
origin/main(b4712395) + ce workflow seul :printf '_tableau/front/src/Calendrier.svelte\n' | python3 controle/bancs_concernes.py→ les 4 mêmes bancs,python3 _tableau/lancer-tests.pysur ces 4 →4 banc(s) vertsen 10,5 s. Puisshadow-lgposé à la main dansCalendrier.svelte→1 banc(s) en échec : _tableau/test_homogeneite.py, le même message, code 1. Retour en arrière fait (git statuspropre côté arbre, seule la copie du workflow modifiée dans mon arbre d'essai).4. Le cas du module partagé — mesuré, et ce n'est pas le jeu complet
Ni
_tableau/socle.pyni_tableau/tb_chaines.pyne sont dansPARTAGES(charte.py,jetons.py,motion_montage.py,provenance.py,etat.py,livrer.sh,controle/bancs_concernes.py,controle/porte-complete.sh,_tableau/lancer-tests.py,_tableau/couverture-objectif.json,requirements.txt,pyproject.toml,dependances-systeme.txt). Ces deux fichiers sont donc retenus par la règle de citation et d'import (plus les trois balayeurs_tableau/*) — ce n'est pas la lecture étroite du nom du fichier — mais le jeu complet n'est pas lancé : sur 240 bancs, 105 restent dehors (8_infra, 66controle, 31_tableaudonttest_homogeneite.py,test_charte_svelte.py,test_captures_charte.py).C'est le comportement de
controle/bancs_concernes.pysurmain, pas un effet de cette PR, et le filet du studio reste la passe de nuit (controle/porte-complete.sh, jeu complet surmain). Suite possible, 2 lignes + une assertion danscontrole/test_bancs_concernes.py: ajouter_tableau/socle.pyet_tableau/tb_chaines.pyàPARTAGES. Je ne la fais pas ici et je ne la commande pas : c'est au chef de décider.5. La garde du métier
controle/bancs_concernes.pyn'est pas touché par cette PR (git diff origin/main...HEAD -- controle/bancs_concernes.py: 0 ligne), donc le motifNOM([A-Za-z0-9_.\-]+\.(?:py|sh|json|html|js|css|txt|csv)\b) est celui demain, non élargi. Le workflow cite biencontrole/bancs_concernes.py(étape « Bancs concernés par les fichiers touchés ») et_tableau/lancer-tests.py(même métierbancs,runs-on: pc-lourd).Contrôle plus fort : le banc
_tableau/test_garde_ci.pyde la carte sœurt_806e83dc(branchehermes/banc-garde-ci-tableau, pas encore de PR), exécuté sur ce workflow, renddonc retirer ce métier, ou l'un de ses deux appels, fera rougir la garde de la carte sœur — la porte demandée tient.
6. Compatibilité avec le chantier
tmpfs(t_5d5edc3d) — compatible tel quelLe métier appelle
python3 _tableau/lancer-tests.py(trois formes : liste de bancs,--tout --sans-couverture, ou rien) sans aucune option d'environnement et sans écrire dansTMPDIR; la correction prévue poseTMPDIRdans le lanceur et laisse son CLI (et la couverture, et le cliquet) inchangé : aucune des trois formes n'est contredite. Le futur code de sortie 2 « mesure impossible : disque plein » ferait rougir ce métier — c'est le comportement voulu (un rouge visible plutôt qu'un faux ROUGE compté).Ce que je n'ai pas pu mesurer là : la branche
hermes/temp-des-bancs-hors-tmpfsn'a encore aucun commit (git log bede6a69..hermes/temp-des-bancs-hors-tmpfs: vide) etgit grep TMPDIR origin/mainsur_tableau,controle,livrer.sh,.forgejone rend rien — la correction n'est pas écrite, je n'ai vérifié que l'absence d'option côté workflow. État du disque à l'instant :df -h /tmp→ tmpfs 16 G, 6,8 G utilisés (45 %), 27 598 entrées : la saturation de 99 % relevée à 21 h 20 n'est plus là. Un lancement lourd du métierbancsavant la correction peut encore remplir/tmp: ce serait un rouge visible, pas un échec avalé.Ce que je n'ai pas mesuré : le cas
TOUTen CI (aucun run ne l'a pris), la durée d'un jeu complet surpc-lourd, le cheminpull_requestvenu d'une fourche, et la correctiontmpfs(pas encore écrite).Aucun fichier de
_tableau/frontn'est touché : rien à regarder dans le navigateur ; aucune fonction visible retirée, aucun onglet écrasé, aucune route ni champ d'API modifié.8c8e2d3bddb956d71bb1fusion-auto: pas de fusion, la PR est en conflit avec main : à rebaser. Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.b956d71bb13aa06e4adeFusionnée automatiquement par
fusion-auto(forge) : CI verte, sans conflit.