Tableau : pastille du haut retirée, fenêtre de Signaler à Mika au-dessus de tout, sujets typés (STUD-1156) #1604

Merged
foXaCe merged 11 commits from hermes/cadre-suite into main 2026-10-16 21:56:49 +02:00
Owner

Delivery Hermes des quatre commits STUD-1156 présents sur branche/claude-opus-pc-cadre-suite : 510e9aa (pastille retirée), 8f5bcac (portal Mika), 62c382e (sujets typés), 9a1f69a (barre latérale sans saut).

Note : la carte t_a334c01c mentionnait trois commits (a53877e6, 799681c8, 1ae28ba3) ; ces hashes sont devenus stale (re-hashés / complétés par le dépôt forgé). La branche est livrée sans rebase ni modification des commits existants.

Vérification statique (diff binaire) : tableau-bord.py ne sort plus <p id="maj">... ; PastilleReleve.svelte + sujet="collecte" ; SUJETS ∈ (processus, tache, collecte, creneau, semaine, top, video, analytique, conso, erreur-page), verifieur_sujet ; _mesure_collecte ; pour nom=collecte-youtube, sujet=collecte le test serveur_processus renvoie raison None ⇒ 201/409, pas « n'est plus dans le relevé ».

Il reste à valider côté PC (exécuteur pc-studio) : passage des bancs concordés, et lecture /opt/studio/www/index.html (absence de id="maj"), ouverture du portal, appel réel POST /api/processus/signaler — build/deploy non
possibles depuis le LXC 106 (pas de clef id_pve ni accès LXC 130), carte bloquée pour cet aspect.

Delivery Hermes des quatre commits STUD-1156 présents sur `branche/claude-opus-pc-cadre-suite` : 510e9aa (pastille retirée), 8f5bcac (portal Mika), 62c382e (sujets typés), 9a1f69a (barre latérale sans saut). Note : la carte t_a334c01c mentionnait trois commits (`a53877e6`, `799681c8`, `1ae28ba3`) ; ces hashes sont devenus stale (re-hashés / complétés par le dépôt forgé). La branche est livrée sans rebase ni modification des commits existants. Vérification statique (diff binaire) : tableau-bord.py ne sort plus `<p id="maj">...` ; PastilleReleve.svelte + sujet="collecte" ; SUJETS ∈ (processus, tache, collecte, creneau, semaine, top, video, analytique, conso, erreur-page), verifieur_sujet ; `_mesure_collecte` ; pour nom=collecte-youtube, sujet=collecte le test `serveur_processus` renvoie raison None ⇒ 201/409, pas « n'est plus dans le relevé ». Il reste à valider côté PC (exécuteur pc-studio) : passage des bancs concordés, et lecture `/opt/studio/www/index.html` (absence de `id="maj"`), ouverture du portal, appel réel `POST /api/processus/signaler` — build/deploy non possibles depuis le LXC 106 (pas de clef id_pve ni accès LXC 130), carte bloquée pour cet aspect.
Cause : elle faisait doublon avec « Chiffres YouTube : il y a 11 h » au pied
de la barre latérale ; deux textes pour la même information (opérateur, 14/10).

Remède : retirée de l'en-tête de tableau-bord.py, avec direAge() et
#maj-age dans tableau.js et sa règle .tete>.panneau dans tableau.css.
<time id="collecte"> reste, caché : le cadre et veiller() en lisent l'heure,
la cadence et le prochain passage. test_tableau_bord_page.py vérifie
l'absence de la pastille et la présence de l'horodatage.
Cause : la fenêtre « Ce que je veux » de BoutonMika était un bloc dans le
flux ; ouverte au pied de la barre latérale, elle était coupée par le
défilement de la barre (opérateur, 14/10). Les autres fenêtres de la base
(infobulles, menus, feuilles, palette) passaient déjà par un portail.

Remède : la fenêtre est un Popover de Bits UI dans un portail, retourné ou
décalé pour rester entière à l'écran, le champ prend le focus à
l'ouverture ; son conteneur flottant reçoit d'emblée z-index 50 (Bits UI ne
le recopiait qu'après coup, la fenêtre passait sous la barre).
test_navigateur_fenetres.py l'ouvre en bas à gauche au bureau et dans la
feuille « Plus » au téléphone : rouge sur l'ancien composant (« dans la
barre »), vert sur le nouveau.
Cause : la route de signalement n'acceptait que les processus du relevé ;
la pastille de la collecte YouTube recevait « ce processus n'est plus dans
le relevé : recharger l'onglet » (opérateur, 14/10), comme les tâches
programmées, qui n'étaient pas cherchées dans le relevé.

Remède : un signalement porte un sujet (processus, tache, collecte, creneau,
semaine, erreur-page ; déduit du nom pour les fronts d'avant), vérifié à sa
source, avec ce que le serveur en mesure (mesure) à côté du contexte vu à
l'écran. Introuvable : 409 qui dit pourquoi en français, et BoutonMika
propose « Envoyer quand même » (force), noté dans le ticket. Le ticket de
Mika (retours_ordres) dit d'où vient le clic et le sujet. Bancs :
test_serveur_processus.py (chaque sujet, refus, envoi forcé),
test_signalement_mika.py (un ticket par sujet), test_navigateur_fenetres.py
(409 puis « Envoyer quand même » dans Chrome).
Cause : la page Python ne portait qu'un #cadre-app vide ; la barre n'existait
qu'une fois processus/app.js chargé et monté. À chaque rafraîchissement, la
colonne restait vide puis la barre apparaissait (opérateur, 14/10). Mesuré :
aucune barre à 50 ms, CLS 0,06 (bureau) à 0,14 (téléphone).

Remède : la page écrit dans #cadre-app une barre d'attente à la place et à la
taille exactes de celle du front (240 ou 72 px selon cadre-replie, posée par
le script de <head> ; variante flottante ; au téléphone, en-tête et barre du
bas de 57 px), que main.js remplace au montage. test_navigateur_cadre_cls.py
(Chrome, app.js retenu 600 ms) : barre à sa place à 50 ms et à 2 s, titre
immobile, CLS du cadre 0 au bureau, replié et au téléphone.
Merge branch 'main' into hermes/cadre-suite
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 14s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 14s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 14s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 13s
0b5ea4dcbc
Collaborator

fusion-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é.

`fusion-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é.
Merge remote-tracking branch 'origin/main' into hermes/cadre-suite
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 12s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 11s
394d71e34a
# Conflicts:
#	_tableau/front/src/app.css
Collaborator

Relue et validée par relecteur (carte t_11bdb2d7, verdict « Relu, conforme ») : étiquette relu posée par relu-sync. La fusion automatique attend la CI verte.

Relue et validée par `relecteur` (carte t_11bdb2d7, verdict « Relu, conforme ») : étiquette `relu` posée par `relu-sync`. La fusion automatique attend la CI verte.
Collaborator

fusion-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é.

`fusion-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é.
hermes-bot force-pushed hermes/cadre-suite from 394d71e34a
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 12s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 11s
to eb1f7d5c43
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m28s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m4s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m32s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 3m54s
2026-10-15 11:19:35 +02:00
Compare
Collaborator

fusion-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é.

`fusion-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é.
hermes-bot force-pushed hermes/cadre-suite from eb1f7d5c43
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m28s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m4s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m32s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 3m54s
to 59cd14670a
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m40s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m41s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m22s
2026-10-15 11:41:18 +02:00
Compare
Collaborator

fusion-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é.

`fusion-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é.
hermes-bot force-pushed hermes/cadre-suite from 59cd14670a
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m40s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m41s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m22s
to 6e3b9df4e8
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 2m10s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m42s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 9m36s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 9m36s
2026-10-15 13:28:55 +02:00
Compare
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Tableau : le banc couvre les sujets « video » et « conso » du signalement (STUD-1156)
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m53s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m42s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m53s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m53s
f6ea19049d
Cause : la porte de couverture du tableau refusait la branche — ensemble mesuré 99,1 % contre
99,2 % enregistré — alors que la même mesure sur `main` passait. Mesuré : `serveur_processus.py`
gagne 62 instructions avec ce chantier et trois d'entre elles n'étaient atteintes par aucun banc
(le sujet `conso` déduit du nom, et les deux refus « pas un nom de l'onglet Vidéos » / « pas un nom
de la Consommation »). Le cliquet se joue à une ligne près.

Remède : trois assertions dans le banc du signalement — un nom qui n'est pas un nom de Vidéos
déclaré `video`, un nom de la Consommation déduit, un nom qui n'est pas un nom de la Consommation
déclaré `conso` — chacun rend son refus en français. Couverture du fichier : 278/295 → 281/295,
soit le même reste que `main` (14 lignes). Banc complet, sans `front/dist` comme en CI : 189 verts,
aucune ligne de cliquet.
Collaborator

Rebasage fait : la PR n'est plus en conflit, la CI est verte.

Tête f6ea1904, base httpforge/main (5a116688 au moment du contrôle).

  • git merge-tree --write-tree --name-only httpforge/main HEAD → code 0, aucun conflit (arbre c31af556) :
    c31af5563c806e4643d9e2948d64c14f4cb0fcc7
    MERGE_TREE_EXIT=0
    
  • PR : mergeable=true, état open, label conflit levé (restent operateur).
  • Contextes de statut de la tête, les quatre success :
    Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) success
    Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) success
    Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) success
    Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) success
    

Le conflit n'était pas sur PastilleReleve.svelte (celui-ci a fusionné tout seul, une ligne : sujet="collecte") mais sur _tableau/serveur_processus.py, dans recevoir_signalement.

Résolution, sans perte de fonctionnalité :

  • la version typée de la branche est gardée (sujet déclaré ou déduit, vérifié à sa source, mesure du serveur, et 409 « envoyer quand même ») ; elle couvre la collecte YouTube que main a ajoutée entre-temps (collecte-youtube → sujet collecte) ;
  • main ajoutait NOM_ERREURS (les signalements erreurs-page des fronts d'avant, sans sujet) : sujet_du_nom les ramène au sujet erreur-page ; sans cette ligne, ils recevaient un 409 « ce processus n'est plus dans le relevé » ;
  • deux artefacts du rebasage, mesurés puis corrigés :
    • le banc du signalement attendait un 409 sur le créneau 18:00 alors que main a posé cette sortie dans le faux Calendrier ; le créneau refusé est désormais un autre créneau (19:00), et le banc de main (18:00 présent → 201) reste en place ;
    • la porte de couverture refusait la branche (ensemble 99,1 % < 99,2 % enregistré) : trois lignes neuves de serveur_processus.py n'étaient atteintes par aucun banc (sujet conso déduit du nom, refus « pas un nom de l'onglet Vidéos », refus « pas un nom de la Consommation »). Elles sont couvertes : serveur_processus.py passe de 278/295 à 281/295, même reste que main (14 lignes).

Vérifications locales, front/dist retiré comme dans le métier Rust de la CI :

  • python3 _tableau/lancer-tests.py --tout → 189 bancs verts, aucune ligne de cliquet, sortie 0 ;
  • npx vitest run → 42 fichiers, 350 tests, 0 échec ;
  • npx vite build → dist/index.html présent, 959 507 octets.

Signalé, non causé par le rebasage : _tableau/test_navigateur_cadre_cls.py échoue sur ce poste quand front/dist existe (CLS du téléphone, la barre du bas passe de 485 à 500 px — la barre de défilement). Sortie identique sur la tête d'avant rebasage (59cd1467) ; le banc n'est pas mesuré dans la CI (pas de dist/ dans le métier Rust).

Fusion non demandée : la carte est operateur.

**Rebasage fait : la PR n'est plus en conflit, la CI est verte.** Tête `f6ea1904`, base `httpforge/main` (`5a116688` au moment du contrôle). - `git merge-tree --write-tree --name-only httpforge/main HEAD` → code 0, aucun conflit (arbre `c31af556`) : ``` c31af5563c806e4643d9e2948d64c14f4cb0fcc7 MERGE_TREE_EXIT=0 ``` - PR : `mergeable=true`, état `open`, label `conflit` levé (restent `operateur`). - Contextes de statut de la tête, les quatre `success` : ``` Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) success Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) success Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) success Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) success ``` Le conflit n'était pas sur `PastilleReleve.svelte` (celui-ci a fusionné tout seul, une ligne : `sujet="collecte"`) mais sur `_tableau/serveur_processus.py`, dans `recevoir_signalement`. Résolution, sans perte de fonctionnalité : - la version typée de la branche est gardée (sujet déclaré ou déduit, vérifié à sa source, `mesure` du serveur, et 409 « envoyer quand même ») ; elle couvre la collecte YouTube que main a ajoutée entre-temps (`collecte-youtube` → sujet `collecte`) ; - main ajoutait `NOM_ERREURS` (les signalements `erreurs-page` des fronts d'avant, sans `sujet`) : `sujet_du_nom` les ramène au sujet `erreur-page` ; sans cette ligne, ils recevaient un 409 « ce processus n'est plus dans le relevé » ; - deux artefacts du rebasage, mesurés puis corrigés : - le banc du signalement attendait un 409 sur le créneau 18:00 alors que main a posé cette sortie dans le faux Calendrier ; le créneau refusé est désormais un autre créneau (19:00), et le banc de main (18:00 présent → 201) reste en place ; - la porte de couverture refusait la branche (ensemble 99,1 % < 99,2 % enregistré) : trois lignes neuves de `serveur_processus.py` n'étaient atteintes par aucun banc (sujet `conso` déduit du nom, refus « pas un nom de l'onglet Vidéos », refus « pas un nom de la Consommation »). Elles sont couvertes : `serveur_processus.py` passe de 278/295 à 281/295, même reste que `main` (14 lignes). Vérifications locales, `front/dist` retiré comme dans le métier Rust de la CI : - `python3 _tableau/lancer-tests.py --tout` → **189 bancs verts**, aucune ligne de cliquet, sortie 0 ; - `npx vitest run` → 42 fichiers, 350 tests, 0 échec ; - `npx vite build` → `dist/index.html` présent, 959 507 octets. Signalé, non causé par le rebasage : `_tableau/test_navigateur_cadre_cls.py` échoue sur ce poste quand `front/dist` existe (CLS du téléphone, la barre du bas passe de 485 à 500 px — la barre de défilement). Sortie identique sur la tête d'avant rebasage (`59cd1467`) ; le banc n'est pas mesuré dans la CI (pas de `dist/` dans le métier Rust). Fusion non demandée : la carte est `operateur`.
Collaborator

fusion-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é.

`fusion-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é.
hermes-bot force-pushed hermes/cadre-suite from f6ea19049d
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m53s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m42s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m53s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m53s
to bd06e8a6c7
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m38s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m42s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 7m9s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 7m3s
2026-10-15 18:04:10 +02:00
Compare
Collaborator

Rebasage sur origin/main (47317053) : la PR n'est plus en conflit.

  • Branche hermes/cadre-suite, nouvelle tête bd06e8a6 (poussée en --force-with-lease sur l'ancienne tête f6ea1904), base 47317053.
  • git rebase origin/main a rejoué les 7 commits sans aucun conflit (16 fichiers, +631/-118) : git merge-base --is-ancestor origin/main HEAD → oui, historique linéaire sur main.
  • PR : mergeable=true, état open, base à jour ; la CI repart (4 travaux « Tests du tableau (Rust + Svelte) » en file).
  • Bancs navigateur du cadre, sur cette tête : test_navigateur_cadre_cls.py → OK (« barre à sa place dès 50 ms, rien ne bouge jusqu'à 2 s, CLS du cadre 0 », téléphone : barre 500 × 57 à 0,644) et test_navigateur_barre_bas.py → OK.

Pourquoi la branche portait un défaut de plus que main, corrigé ici (bd06e8a6, fichier _tableau/tableau.css) :

Au téléphone, le squelette d'attente de la page (630 px) est plus haut que l'écran laissé par les deux barres (572 px). La barre de défilement apparaissait pendant l'attente, puis le contenu monté, plus court, la faisait disparaître : 15 px qui décalaient tout le cadre au montage (barre du bas et barre latérale de 485 à 500 px, CLS 0,0016). Remède : html.cadre:has(main [id$="-app"] > .squelette){overflow:hidden} dans la fenêtre téléphone — tant que la page n'a pas remplacé son gabarit, elle ne défile pas ; le squelette d'un onglet déjà monté vit plus bas, dans son panneau, donc la page redevient défilable. Une réservation de gouttière (scrollbar-gutter:stable) stabilisait aussi le cadre mais rétrécissait la barre du bas (375 px au lieu de 390) : test_navigateur_barre_bas.py, déjà dans main, l'a refusée.

Preuves mesurées

  • npx vitest run (front) : 46 fichiers, 400 tests passés, code de retour 0.
  • npx vite build : code de retour 0, dist/index.html 1 881 o, app.js 158 735 o, base.js 354 221 o, dist/ 984 Ko.
  • python3 _tableau/lancer-tests.py --tout : 190 bancs verts, code de retour 1, 4 bancs rouges — dont 3 sont déjà rouges sur main (mesuré dans un worktree détaché sur origin/main : test_garde_couches.py, test_garde_doublons.py, test_garde_plafond.py, tous les trois sur collecte.py fait 840 lignes, sa dérogation s'arrête à 800) et 1 que cette branche cause :
  • _tableau/test_signalements_parite.py → gestes : le doré n'est plus la sortie de Python (clés : ['gestes', 'journal']). Vert sur main (code 0), rouge ici. Le détail : cette branche change la forme des réponses de recevoir_signalement (ajout de sujet, mesure, introuvable, peut_forcer, message « nom de sujet invalide ») tandis que main a fait passer le signalement au service Rust (commit 51cbadb1 : /api/processus/signaler, rust/service/src/signalements/) en gardant l'ancienne forme dans les dorés rust/service/tests/fixtures/signalements/*.attendu.json. La parité Python ↔ Rust ne tient donc plus : ex. processus invalide attendu 400 {"erreur": "processus invalide"} contre 400 {"erreur": "nom de sujet invalide"} ; signalement complet attendu sans sujet/mesure/introuvable contre ces trois champs côté Python. Ce n'est pas un conflit de rebasage (le rebasage est propre) : c'est le sujet typé de STUD-1156 qu'il faudrait porter au service Rust, ou retirer côté Python — hors du périmètre d'une carte de rebasage, et retirer une fonction visible demande l'accord de l'opérateur.

Captures (clair et sombre, bureau 1600 et téléphone 390) : accueil-sombre-1600.png, accueil-clair-1600.png, accueil-sombre-390.png, accueil-clair-390.png, et la paire de l'état d'attente au téléphone attente-telephone-avant-v500x701.png / attente-telephone-apres-v500x701.png (la première montre la barre de défilement à droite, la seconde non) — dossier /home/atelier/atelier-hermes/wt/preuves-t_5d66c727-captures/. Vérifié dessus : gabarit d'attente et barres du cadre à leur place, aucun débordement horizontal, pas d'emoji ; les largeurs et le CLS sont mesurés par les bancs, pas à l'œil.

**Rebasage sur `origin/main` (`47317053`) : la PR n'est plus en conflit.** - Branche `hermes/cadre-suite`, nouvelle tête **`bd06e8a6`** (poussée en `--force-with-lease` sur l'ancienne tête `f6ea1904`), base `47317053`. - `git rebase origin/main` a rejoué les 7 commits sans aucun conflit (16 fichiers, `+631/-118`) : `git merge-base --is-ancestor origin/main HEAD` → oui, historique linéaire sur main. - PR : `mergeable=true`, état `open`, base à jour ; la CI repart (4 travaux « Tests du tableau (Rust + Svelte) » en file). - Bancs navigateur du cadre, sur cette tête : `test_navigateur_cadre_cls.py` → OK (« barre à sa place dès 50 ms, rien ne bouge jusqu'à 2 s, CLS du cadre 0 », téléphone : barre 500 × 57 à 0,644) et `test_navigateur_barre_bas.py` → OK. **Pourquoi la branche portait un défaut de plus que main, corrigé ici** (`bd06e8a6`, fichier `_tableau/tableau.css`) : Au téléphone, le squelette d'attente de la page (630 px) est plus haut que l'écran laissé par les deux barres (572 px). La barre de défilement apparaissait pendant l'attente, puis le contenu monté, plus court, la faisait disparaître : 15 px qui décalaient tout le cadre au montage (barre du bas et barre latérale de 485 à 500 px, **CLS 0,0016**). Remède : `html.cadre:has(main [id$="-app"] > .squelette){overflow:hidden}` dans la fenêtre téléphone — tant que la page n'a pas remplacé son gabarit, elle ne défile pas ; le squelette d'un onglet déjà monté vit plus bas, dans son panneau, donc la page redevient défilable. Une réservation de gouttière (`scrollbar-gutter:stable`) stabilisait aussi le cadre mais rétrécissait la barre du bas (375 px au lieu de 390) : `test_navigateur_barre_bas.py`, déjà dans `main`, l'a refusée. **Preuves mesurées** - `npx vitest run` (front) : **46 fichiers, 400 tests passés, code de retour 0**. - `npx vite build` : **code de retour 0**, `dist/index.html` 1 881 o, `app.js` 158 735 o, `base.js` 354 221 o, `dist/` 984 Ko. - `python3 _tableau/lancer-tests.py --tout` : 190 bancs verts, **code de retour 1**, 4 bancs rouges — dont **3 sont déjà rouges sur `main`** (mesuré dans un worktree détaché sur `origin/main` : `test_garde_couches.py`, `test_garde_doublons.py`, `test_garde_plafond.py`, tous les trois sur `collecte.py fait 840 lignes, sa dérogation s'arrête à 800`) et **1 que cette branche cause** : - `_tableau/test_signalements_parite.py` → `gestes : le doré n'est plus la sortie de Python (clés : ['gestes', 'journal'])`. Vert sur `main` (code 0), rouge ici. Le détail : cette branche change la forme des réponses de `recevoir_signalement` (ajout de `sujet`, `mesure`, `introuvable`, `peut_forcer`, message « nom de sujet invalide ») tandis que `main` a fait passer le signalement au **service Rust** (commit `51cbadb1` : `/api/processus/signaler`, `rust/service/src/signalements/`) en gardant l'ancienne forme dans les dorés `rust/service/tests/fixtures/signalements/*.attendu.json`. La parité Python ↔ Rust ne tient donc plus : ex. `processus invalide` attendu `400 {"erreur": "processus invalide"}` contre `400 {"erreur": "nom de sujet invalide"}` ; `signalement complet` attendu sans `sujet`/`mesure`/`introuvable` contre ces trois champs côté Python. **Ce n'est pas un conflit de rebasage** (le rebasage est propre) : c'est le sujet typé de STUD-1156 qu'il faudrait porter au service Rust, ou retirer côté Python — hors du périmètre d'une carte de rebasage, et retirer une fonction visible demande l'accord de l'opérateur. **Captures** (clair et sombre, bureau 1600 et téléphone 390) : `accueil-sombre-1600.png`, `accueil-clair-1600.png`, `accueil-sombre-390.png`, `accueil-clair-390.png`, et la paire de l'état d'attente au téléphone `attente-telephone-avant-v500x701.png` / `attente-telephone-apres-v500x701.png` (la première montre la barre de défilement à droite, la seconde non) — dossier `/home/atelier/atelier-hermes/wt/preuves-t_5d66c727-captures/`. Vérifié dessus : gabarit d'attente et barres du cadre à leur place, aucun débordement horizontal, pas d'emoji ; les largeurs et le CLS sont mesurés par les bancs, pas à l'œil.
Collaborator

Captures de la tête bd06e8a6 (faites avec _tableau/captures-charte.py et le gabarit d'attente servi avec la vraie build) :

accueil-clair-1600.png — clair, bureau
clair bureau

accueil-sombre-1600.png — sombre, bureau
sombre bureau

accueil-clair-390.png — clair, téléphone
clair téléphone

accueil-sombre-390.png — sombre, téléphone
sombre téléphone

L'état d'attente au téléphone, avant le correctif (barre de défilement à droite, le gabarit s'arrête avant elle) :
attente avant

et après le correctif (bd06e8a6 : plus de barre de défilement, le cadre garde la largeur de l'écran) :
attente après

**Captures de la tête `bd06e8a6`** (faites avec `_tableau/captures-charte.py` et le gabarit d'attente servi avec la vraie build) : `accueil-clair-1600.png` — clair, bureau ![clair bureau](http://192.168.1.70:3000/attachments/08fa582b-a775-495a-a931-12d8f73cb7f5) `accueil-sombre-1600.png` — sombre, bureau ![sombre bureau](http://192.168.1.70:3000/attachments/dd91fa28-2da5-4af9-831d-891a7ff82254) `accueil-clair-390.png` — clair, téléphone ![clair téléphone](http://192.168.1.70:3000/attachments/9c0b66e4-7668-48f6-a8e3-87ce5a1c2691) `accueil-sombre-390.png` — sombre, téléphone ![sombre téléphone](http://192.168.1.70:3000/attachments/ef490211-94c0-41c9-a43f-b44bf4f27e2d) L'état d'attente au téléphone, avant le correctif (barre de défilement à droite, le gabarit s'arrête avant elle) : ![attente avant](http://192.168.1.70:3000/attachments/05ea6f25-7fa5-4a65-999e-0ed9d61a39c3) et après le correctif (`bd06e8a6` : plus de barre de défilement, le cadre garde la largeur de l'écran) : ![attente après](http://192.168.1.70:3000/attachments/fa43dccc-4f54-4941-9ef5-dd5e99a8327a)
Collaborator

État final de la CI sur bd06e8a6 (relevé à 18:13) :

  • Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) → success (push et pull_request) : npm ci, npx vitest run (46 fichiers, 400 tests), npx vite build.
  • Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) → failure (push et pull_request). La porte du dépôt refuse banc par banc ce que la branche casse et que main ne casse pas : _tableau/test_signalements_parite.py passe sur origin/main et échoue ici (le détail est dans le commentaire précédent). Ce n'est pas un conflit de rebasage : la branche change la forme des réponses Python des signalements (sujets typés, STUD-1156) sans le pendant Rust (rust/service/src/signalements/, dorés rust/service/tests/fixtures/signalements/*.attendu.json).

Autrement dit : plus de conflit, mais la fusion reste refusée tant que la parité Python ↔ Rust des signalements n'est pas rétablie.

**État final de la CI sur `bd06e8a6`** (relevé à 18:13) : - `Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front)` → **success** (push et pull_request) : `npm ci`, `npx vitest run` (46 fichiers, 400 tests), `npx vite build`. - `Tests du tableau (Rust + Svelte) / Rust (_tableau/rust)` → **failure** (push et pull_request). La porte du dépôt refuse banc par banc ce que la branche casse et que `main` ne casse pas : `_tableau/test_signalements_parite.py` passe sur `origin/main` et échoue ici (le détail est dans le commentaire précédent). Ce n'est pas un conflit de rebasage : la branche change la forme des réponses Python des signalements (sujets typés, STUD-1156) sans le pendant Rust (`rust/service/src/signalements/`, dorés `rust/service/tests/fixtures/signalements/*.attendu.json`). Autrement dit : plus de conflit, mais la fusion reste refusée tant que la parité Python ↔ Rust des signalements n'est pas rétablie.
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Collaborator

fusion-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é.

`fusion-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é.
hermes-bot force-pushed hermes/cadre-suite from bd06e8a6c7
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m38s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m42s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 7m9s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 7m3s
to 3a9acca93e
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m44s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m45s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 4m2s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Has been cancelled
2026-10-16 14:23:53 +02:00
Compare
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Retrigger CI
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m18s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m25s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 10m10s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 10m27s
60416ee0d2
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.

`fusion-auto` : pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Sors la mesure d'un nom de signalements/mod.rs pour repasser sous le plafond
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m37s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m38s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13m48s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 14m4s
0e45491756
Collaborator

fusion-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é.

`fusion-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é.
foXaCe force-pushed hermes/cadre-suite from 0e45491756
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m37s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m38s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13m48s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 14m4s
to 3b097ddcef
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 30s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 54s
2026-10-16 21:56:29 +02:00
Compare
foXaCe merged commit 883bb12b56 into main 2026-10-16 21:56:49 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 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!1604
No description provided.