Tableau : nouvelle route GET /api/releves, la fraîcheur de chaque relevé (t_6c90882a) #1728

Merged
hermes-fusion merged 1 commit from hermes/fraicheur-systemes-route into main 2026-10-15 13:55:03 +02:00
Collaborator

Première moitié de t_1e7680d1. Nouvelle route d'API : GET /api/releves — le front en dépend (carte t_63da7542, profil svelte), et c'est la seule source des badges de fraîcheur de la barre latérale : aucune liste de systèmes ni de rythme n'est écrite dans le front.

Ce que la route rend

{"maintenant": "2026-10-15T13:05:08+02:00",
 "releves": [{"id": "youtube", "nom": "YouTube", "source": "Chiffres et Analytics YouTube",
              "releve": "2026-10-15T12:52:00+02:00", "periodeH": 12,
              "prochaine": "2026-10-16T00:52:00+02:00", "etat": "ok", "cause": ""}]}
Champ Quoi
id, nom, source identifiant court, libellé court du badge, phrase de la source (infobulle)
releve date du dernier relevé réussi, ISO avec son décalage ; null si aucune
periodeH rythme en heures (12, 1, 0.25) ; null quand il n'y a pas de rythme
prochaine releve plus le rythme, ISO ; null sans date ou sans rythme
etat ok, en_retard, echec, inconnu
cause dernière ligne d'erreur, secrets masqués (key=***), 160 caractères au plus ; vide sauf echec (et, pour un inconnu, ce qui l'explique)

À savoir pour le front : periodeH vaut 0.25 pour la consommation du PC (15 min) — à formater (0,25 h, ou 15 min) — et null pour le budget, poussé à la fin d'une exécution qui paie : sans rythme il ne peut pas être en retard, seul son âge parle.

Règle

MARGE_RETARD_H (1 h) est la seule marge du retard : en_retard quand l'échéance (dernier relevé plus rythme) est dépassée de plus que cette marge. inconnu quand aucune date n'est lisible — un relevé sans date n'est jamais daté du jour où on le regarde.

Sources, toutes déjà là

derniere-collecte.json (chiffres et Analytics YouTube, la même que collecte de /etat), retours/attente.json (relevé horaire des retours, celui que lit /attente), conso-pc.json (PC, 15 min), budget-runware.json. Le collecteur des processus et la sauvegarde GitHub vivent sur l'hôte du LXC 130, éteint : ils sortent en inconnu, avec la raison en cause. Aucun nouveau relevé n'est inventé.

Preuve

  • python3 _tableau/garde_fous.py → garde-fous : rien à redire, code 0
  • python3 _tableau/lancer-tests.py --tout → 188 bancs verts, code 0 (cliquet de couverture tenu : releves.py à 100 %)
  • python3 _tableau/test_releves.py → OK : /api/releves rend chaque relevé — forme, ok, en retard, échec masqué et inconnu — sur 6 entrées
  • sortie réelle sur une copie de test des fichiers du 132 (etat : YouTube ok, Retours en_retard de 26 h, Conso Claude ok, Budget ok, Sauvegarde et Collecteur inconnu) : voir le commentaire de la carte
  • route éprouvée en HTTP sur la copie de test : 200, application/json, no-store, aucun secret dans le corps ; sans session elle renvoie à la connexion comme les autres routes

Fichiers

_tableau/releves.py (nouveau, la règle), serveur.py (une ligne d'import, la route, la doc), _tableau/test_releves.py (nouveau, le banc), _tableau/LXC-132.md (la documentation de la route)

hotspot: serveur.py — la PR #1625 (hermes/releve-delai-etape) le touche déjà ; mon ajout reste à distance de ses hunks (import en tête, route juste avant le 404).

Première moitié de t_1e7680d1. **Nouvelle route d'API : `GET /api/releves`** — le front en dépend (carte t_63da7542, profil `svelte`), et c'est la seule source des badges de fraîcheur de la barre latérale : aucune liste de systèmes ni de rythme n'est écrite dans le front. ## Ce que la route rend ```json {"maintenant": "2026-10-15T13:05:08+02:00", "releves": [{"id": "youtube", "nom": "YouTube", "source": "Chiffres et Analytics YouTube", "releve": "2026-10-15T12:52:00+02:00", "periodeH": 12, "prochaine": "2026-10-16T00:52:00+02:00", "etat": "ok", "cause": ""}]} ``` | Champ | Quoi | |---|---| | `id`, `nom`, `source` | identifiant court, libellé court du badge, phrase de la source (infobulle) | | `releve` | date du dernier relevé **réussi**, ISO avec son décalage ; `null` si aucune | | `periodeH` | rythme en heures (`12`, `1`, `0.25`) ; `null` quand il n'y a pas de rythme | | `prochaine` | `releve` plus le rythme, ISO ; `null` sans date ou sans rythme | | `etat` | `ok`, `en_retard`, `echec`, `inconnu` | | `cause` | dernière ligne d'erreur, secrets masqués (`key=***`), 160 caractères au plus ; vide sauf `echec` (et, pour un `inconnu`, ce qui l'explique) | À savoir pour le front : `periodeH` vaut **0.25** pour la consommation du PC (15 min) — à formater (0,25 h, ou 15 min) — et **`null`** pour le budget, poussé à la fin d'une exécution qui paie : sans rythme il ne peut pas être en retard, seul son âge parle. ## Règle `MARGE_RETARD_H` (1 h) est la **seule** marge du retard : `en_retard` quand l'échéance (dernier relevé plus rythme) est dépassée de plus que cette marge. `inconnu` quand aucune date n'est lisible — un relevé sans date n'est jamais daté du jour où on le regarde. ## Sources, toutes déjà là `derniere-collecte.json` (chiffres et Analytics YouTube, la même que `collecte` de `/etat`), `retours/attente.json` (relevé horaire des retours, celui que lit `/attente`), `conso-pc.json` (PC, 15 min), `budget-runware.json`. Le collecteur des processus et la sauvegarde GitHub vivent sur l'hôte du LXC 130, éteint : ils sortent en `inconnu`, avec la raison en `cause`. **Aucun nouveau relevé n'est inventé.** ## Preuve - `python3 _tableau/garde_fous.py` → `garde-fous : rien à redire`, code 0 - `python3 _tableau/lancer-tests.py --tout` → **188 bancs verts, code 0** (cliquet de couverture tenu : `releves.py` à 100 %) - `python3 _tableau/test_releves.py` → `OK : /api/releves rend chaque relevé — forme, ok, en retard, échec masqué et inconnu — sur 6 entrées` - sortie réelle sur une copie de test des fichiers du 132 (`etat` : YouTube `ok`, Retours `en_retard` de 26 h, Conso Claude `ok`, Budget `ok`, Sauvegarde et Collecteur `inconnu`) : voir le commentaire de la carte - route éprouvée en HTTP sur la copie de test : 200, `application/json`, `no-store`, aucun secret dans le corps ; sans session elle renvoie à la connexion comme les autres routes ## Fichiers `_tableau/releves.py` (nouveau, la règle), `serveur.py` (une ligne d'import, la route, la doc), `_tableau/test_releves.py` (nouveau, le banc), `_tableau/LXC-132.md` (la documentation de la route) hotspot: `serveur.py` — la PR #1625 (`hermes/releve-delai-etape`) le touche déjà ; mon ajout reste à distance de ses hunks (import en tête, route juste avant le 404).
Tableau : une route qui liste chaque relevé, avec sa fraîcheur (t_6c90882a)
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m54s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 4m37s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m52s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 4m55s
5538130574
L'opérateur veut un badge de fraîcheur par système dans la barre latérale, et le front ne doit avoir
aucune liste de systèmes ni de rythme codée en dur. Chaque système vivait dans son coin de page : la
collecte YouTube dans `/etat` (sa `collecte` et sa `cause`, la cadence des réglages), le relevé des
retours dans `retours/attente.json`, la consommation du PC dans `conso-pc.json`.

`GET /api/releves` les réunit : pour chaque relevé, son identifiant, son libellé court, la source, la
date du dernier relevé réussi, son rythme en heures (`periodeH`), l'heure du prochain relevé, son état
(`ok`, `en_retard`, `echec`, `inconnu`) et la cause d'un échec, secrets masqués et bornée à 160
caractères. Aucune source nouvelle : chaque entrée lit le fichier que le tableau écrivait déjà.

La règle vit dans `_tableau/releves.py` (nouveau). `MARGE_RETARD_H` (1 h) est la seule marge du retard ;
un relevé sans date lisible sort en `inconnu` et n'est jamais daté du jour où on le regarde ; un relevé
sans rythme (le budget, poussé à la fin d'une exécution qui paie) ne peut pas être en retard. Le
collecteur des processus et la sauvegarde GitHub vivent sur l'hôte du LXC 130, éteint : ils sortent en
`inconnu`, avec la raison en `cause`.

Banc : `_tableau/test_releves.py` (forme des entrées, ok, en retard de part et d'autre de la marge,
échec avec cause masquée, inconnu, et la route en HTTP). Mesuré sur une copie de test des fichiers du
132 : 28 ms à froid, 0 ms ensuite — `conso-pc.json` pèse 1,3 Mo et n'est relu que quand il change.
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é.
hermes-bot force-pushed hermes/fraicheur-systemes-route from 5538130574
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m54s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Failing after 4m37s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m52s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 4m55s
to 5d4b896931
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m41s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m42s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m46s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m27s
2026-10-15 13:33:17 +02:00
Compare
hermes-fusion deleted branch hermes/fraicheur-systemes-route 2026-10-15 13:55: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!1728
No description provided.