Tableau : la fraîcheur de chaque système, au pied de la barre latérale (t_63da7542) #1731

Merged
hermes-fusion merged 1 commit from hermes/fraicheur-systemes-badge into main 2026-10-15 14:50:03 +02:00
Collaborator

Ce que la carte change

GET /api/releves (route de releves.py, carte t_6c90882a, fusionnée en #1728) donne la fraîcheur de chaque
système que le tableau relève. Le front ne lisait la date que d'un seul (/etat) : pour voir lequel était en
retard, il fallait ouvrir chaque onglet. Cette carte affiche la liste entière dans le cadre.

  • BadgeReleve (nouvelle base) : une ligne par système — « YouTube · il y a 2 min », discrète à l'heure
    (--text-secondary), rouge (--feedback-error-text) en retard ou en échec, « Signaler à Mika » sous le seul
    relevé YouTube ; forme="point" rend la pastille de la base seule, avec l'état et l'âge au lecteur d'écran.
  • BarreLaterale : un badge par entrée de la route au pied de la barre ; en rail, un point par système.
  • BarreBas : les mêmes badges dans la feuille « Plus » du téléphone (la barre latérale cède la place sous 760 px).
  • Cadre.svelte : lit la route au chargement et après chaque collecte, et passe la liste et l'instant du
    serveur
    aux deux barres — les âges suivent l'horloge du serveur, pas celle du poste.
  • Route muette ou absente : le pied retombe sur la fraîcheur des chiffres (PastilleReleve), comme avant.

Rien n'est écrit en dur : la liste des systèmes, leur rythme et la règle du retard vivent dans releves.py.
Le front ne fait que les afficher, dans l'ordre reçu.

Preuves

  • npx vitest run : 367 tests verts, 43 fichiers (badge-releve.test.js : texte, couleurs, retard, échec,
    jamais relevé, sans rythme, le signalement ; cadre.test.js : l'ordre reçu, le repli, la lecture de la route).
  • npx vite build : dist/index.html + dist/app.js (48 ms).
  • Gardes de la charte : test_charte_ui.py (257 classes au socle, aucune couleur en dur) et test_charte_svelte.py verts.
  • _tableau/test_navigateur_fraicheur.py (nouveau banc Chromium, la vraie page + la vraie build + un faux
    /api/releves) : à 1440 x 900 en clair et en sombre, à 900 x 900 en rail et à 390 x 844 sur téléphone, il mesure
    les couleurs calculées (rouge pour le seul système en retard, gris discret pour les autres), l'ordre des six
    systèmes, l'âge de chacun, le bouton de signalement sur le relevé YouTube en retard, le pied qui ne déborde pas,
    le point du rail (état et âge dans l'aria-label), la feuille « Plus » ouverte par un vrai clic, le repli quand la
    route répond 404, et zéro emoji.
  • _tableau/lancer-tests.py --tout : 189 bancs verts.
  • _tableau/front/homogeneite.py : 0 nouvel écart, 0 capture changée (44 relevés).

Captures (page d'essai, rendu-fige.py + faux /api/releves)

Bureau sombre : le pied de la barre latérale, six lignes, la seule en retard en rouge.
Bureau sombre, YouTube en retard : « Signaler à Mika » sous la ligne YouTube, et elle seule rouge.
Rail : six points, un seul rouge.
Téléphone : la feuille « Plus » ouverte, les mêmes six lignes.

Les cadres rouges dans les captures (« Semaine injoignable », etc.) sont la page qui dit elle-même que ses propres
routes de données ne répondent pas : le banc ne sert que /api/releves et la build. Le pied de la barre, lui, ne
se lit que sur les relevés de la route.

Vérifications faites à la main

  • Non-régression du repli, pixel à pixel : les 44 captures de homogeneite.py prises sur origin/main puis sur
    cette branche ne diffèrent d'aucun pixel au-delà de ±3/255 (et deux passages du même code diffèrent déjà de
    13 fichiers sur 44 par bruit d'antialiasing) : la route muette garde exactement le rendu d'avant.
  • La route réelle, sur cette machine : six systèmes (youtube à l'heure, les cinq autres « inconnu » faute de
    relevé lisible ici) — c'est ce que le pied affiche.
## Ce que la carte change `GET /api/releves` (route de `releves.py`, carte t_6c90882a, fusionnée en #1728) donne la fraîcheur de **chaque** système que le tableau relève. Le front ne lisait la date que d'un seul (`/etat`) : pour voir lequel était en retard, il fallait ouvrir chaque onglet. Cette carte affiche la liste entière dans le cadre. - **`BadgeReleve`** (nouvelle base) : une ligne par système — « YouTube · il y a 2 min », discrète à l'heure (`--text-secondary`), **rouge** (`--feedback-error-text`) en retard ou en échec, « Signaler à Mika » sous le seul relevé YouTube ; `forme="point"` rend la pastille de la base seule, avec l'état et l'âge au lecteur d'écran. - **`BarreLaterale`** : un badge par entrée de la route au pied de la barre ; **en rail**, un point par système. - **`BarreBas`** : les mêmes badges dans la feuille « Plus » du téléphone (la barre latérale cède la place sous 760 px). - **`Cadre.svelte`** : lit la route au chargement et après chaque collecte, et passe la liste **et l'instant du serveur** aux deux barres — les âges suivent l'horloge du serveur, pas celle du poste. - **Route muette ou absente** : le pied retombe sur la fraîcheur des chiffres (`PastilleReleve`), comme avant. Rien n'est écrit en dur : la liste des systèmes, leur rythme et la règle du retard vivent dans `releves.py`. Le front ne fait que les afficher, dans l'ordre reçu. ## Preuves - `npx vitest run` : **367 tests verts, 43 fichiers** (`badge-releve.test.js` : texte, couleurs, retard, échec, jamais relevé, sans rythme, le signalement ; `cadre.test.js` : l'ordre reçu, le repli, la lecture de la route). - `npx vite build` : `dist/index.html` + `dist/app.js` (48 ms). - Gardes de la charte : `test_charte_ui.py` (257 classes au socle, aucune couleur en dur) et `test_charte_svelte.py` verts. - **`_tableau/test_navigateur_fraicheur.py`** (nouveau banc Chromium, la vraie page + la vraie build + un faux `/api/releves`) : à 1440 x 900 en clair et en sombre, à 900 x 900 en rail et à 390 x 844 sur téléphone, il mesure les **couleurs calculées** (rouge pour le seul système en retard, gris discret pour les autres), l'ordre des six systèmes, l'âge de chacun, le bouton de signalement sur le relevé YouTube en retard, le pied qui ne déborde pas, le point du rail (état et âge dans l'`aria-label`), la feuille « Plus » ouverte par un vrai clic, le repli quand la route répond 404, et zéro emoji. - `_tableau/lancer-tests.py --tout` : **189 bancs verts**. - `_tableau/front/homogeneite.py` : **0 nouvel écart, 0 capture changée** (44 relevés). ## Captures (page d'essai, `rendu-fige.py` + faux `/api/releves`) Bureau sombre : le pied de la barre latérale, six lignes, la seule en retard en rouge. Bureau sombre, YouTube en retard : « Signaler à Mika » sous la ligne YouTube, et elle seule rouge. Rail : six points, un seul rouge. Téléphone : la feuille « Plus » ouverte, les mêmes six lignes. Les cadres rouges dans les captures (« Semaine injoignable », etc.) sont la page qui dit elle-même que ses propres routes de données ne répondent pas : le banc ne sert que `/api/releves` et la build. Le pied de la barre, lui, ne se lit que sur les relevés de la route. ## Vérifications faites à la main - Non-régression du repli, pixel à pixel : les 44 captures de `homogeneite.py` prises sur `origin/main` puis sur cette branche ne diffèrent **d'aucun pixel au-delà de ±3/255** (et deux passages du même code diffèrent déjà de 13 fichiers sur 44 par bruit d'antialiasing) : la route muette garde exactement le rendu d'avant. - La route réelle, sur cette machine : six systèmes (`youtube` à l'heure, les cinq autres « inconnu » faute de relevé lisible ici) — c'est ce que le pied affiche.
Tableau : la fraîcheur de chaque système, au pied de la barre latérale (t_63da7542)
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m44s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m39s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m50s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m47s
01e3a3e402
Cause : `GET /api/releves` (route de `releves.py`, carte t_6c90882a) donne la fraîcheur de
CHAQUE système que le tableau relève, mais le front ne lisait la date que d'un seul
(`/etat`) : pour voir lequel était en retard, l'opérateur devait ouvrir chaque onglet.

Remède :
- la base gagne `BadgeReleve` : une ligne par système de la route (« YouTube · il y a
  2 min »), discrète à l'heure (`--text-secondary`), rouge (`--feedback-error-text`) en
  retard ou en échec, « Signaler à Mika » sous le seul relevé YouTube ; `forme="point"`,
  la pastille de la base seule, avec l'état et l'âge au lecteur d'écran ;
- `BarreLaterale` pose un badge par entrée de la route au pied de la barre, un point par
  système en rail ; `BarreBas` les mêmes badges dans la feuille « Plus » du téléphone ;
- `Cadre.svelte` lit la route au chargement et après chaque collecte, et passe la liste
  et l'instant du serveur aux deux barres : les âges suivent l'horloge du serveur ;
- route muette ou absente : le pied retombe sur la fraîcheur des chiffres
  (`PastilleReleve`), exactement comme avant.

Rien n'est écrit en dur : la liste des systèmes, leur rythme et la règle du retard vivent
dans `releves.py` ; le front ne fait que les afficher.

Preuves : `front/tests` 367 tests verts sur 43 fichiers (dont `badge-releve.test.js` et le
câblage dans `cadre.test.js`) ; les gardes de la charte vertes (257 classes au socle,
aucune couleur en dur) ; `test_navigateur_fraicheur.py`, banc Chromium qui mesure les
couleurs calculées, le rail et la feuille du téléphone sur la vraie build ; `lancer-tests.py
--tout` : 189 bancs verts ; homogénéité : 0 nouvel écart, 0 capture changée.
hermes-fusion deleted branch hermes/fraicheur-systemes-badge 2026-10-15 14:50:03 +02:00
Collaborator

Fusionnée automatiquement par fusion-auto (forge) : CI verte, sans conflit.

Fusionnée automatiquement par `fusion-auto` (forge) : CI verte, 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!1731
No description provided.