Front Svelte — Analytique : lire /api/analytique, plus de données embarquées (t_be254555) #1667

Merged
foXaCe merged 1 commit from hermes/front-analytique-api into main 2026-10-16 21:51:06 +02:00
Collaborator

Carte t_be254555 (chantier t_abdd8136 : tableau du 132, 100 % Svelte et 100 % Rust).

Ce que la carte change. Analytique.svelte recevait ses chiffres par l'attribut data-donnees du conteneur #analytique-app, écrits par Python (analytique_donnees.onglet_analytique) : la page portait le calcul, et l'onglet n'était donc ni 100 % Svelte ni 100 % Rust alors que la route GET /api/analytique est livrée (t_39612182, PR 1651).

  • main.js monte le composant sur /api/analytique (la page n'écrit plus rien dans le conteneur) ; la page d'essai /processus/?analytique passe par la même route.
  • lib/analytique.js gagne lire(api, fetch) : la raison de la route passe avant le statut, la session expirée se dit à part. Analytique.svelte lit la route au montage, dit la raison d'un échec à l'écran et montre le squelette de la charte pendant l'attente — jamais une phrase, jamais un « aucune chaîne » qui ferait passer une absence de relevé pour un studio vide.
  • le panneau p-analytique de tableau-bord.py ne pose plus que la place de montage (#analytique-app) et le squelette : sans cela le panneau garderait un contenu calculé par Python (data-donnees), mesuré contenu:Analytique (manque non déclaré, CI rouge).
  • /api/analytique entre dans le relais serveur_processus.py : le service Rust n'écoute que sur la boucle locale du 132, sans ce relais la page du 132 afficherait une panne. Même motif que /api/accueil (t_c833b356) et /api/top (t_87c3e84d).
  • le banc test_100_svelte_rust.py ne déclare plus page:Analytique en manque : la mesure du jour donne l'onglet 100 % (Svelte / socle / /api/analytique rust). analytique_donnees.py n'est pas touché : il reste en service jusqu'au lot 3.

Preuves mesurées.

  • Texte visible de l'onglet identique au caractère près avant/après, dans les 4 configurations (bureau 1440 et téléphone 390, sombre et clair) : même sha256 du texte (3 046 caractères en bureau, 2 953 en téléphone), et captures PNG identiques au bit près (md5sum) ; 5 fiches, 45 boutons, 8 tracés, 0 px de débordement, aucune erreur JS.
  • La comparaison oppose les deux builds sur le même conteneur #analytique-app et la même fixture : l'ancien lit le JSON que Python écrivait dans la page, le nouveau lit la route /api/analytique (corps identique au doré de analytique_donnees.donnees_analytique, parité mesurée par t_39612182).
  • Route injoignable (aperçu sans /api/analytique) : « Onglet Analytique injoignable (HTTP 404). Recharger la page. » — aucune donnée inventée.
  • npx vitest run : 26 fichiers / 197 cas verts (dont tests/analytique-api.test.js, 8 cas neufs). npx vite build : code 0, dist/index.html présent, 916 Ko, 13 fichiers JS > 5 Ko.
  • python3 _tableau/lancer-tests.py --tout --sans-couverture : 160 bancs verts, code 0. garde_fous.py : rien à redire.
  • Captures : /home/atelier/atelier-hermes/captures-t_be254555/ (avant/après conteneur, page d'essai, panne, 4 configurations).

Non mesuré. Le 132 lui-même (aucun accès depuis cette carte) : la route y arrive par le déploiement automatique après fusion, et le relais est éprouvé par test_serveur_processus.py sur un faux service. La couverture (bancs lancés avec --sans-couverture).

Écart au mandat, dit. La carte demandait « aucun Python touché » : quatre fichiers Python sont modifiés (tableau-bord.py, serveur_processus.py, et les deux bancs qui les suivent). Aucun ne touche au calcul des données — analytique_donnees.py et onglet_analytique.py sont intacts — mais sans eux l'onglet ne peut pas être mesuré 100 % (le panneau doit porter la place de montage) ni fonctionner sur le 132 (le relais doit porter la route). Même motif que la carte Top vidéos (t_87c3e84d).

Carte **t_be254555** (chantier t_abdd8136 : tableau du 132, 100 % Svelte et 100 % Rust). **Ce que la carte change.** `Analytique.svelte` recevait ses chiffres par l'attribut `data-donnees` du conteneur `#analytique-app`, écrits par Python (`analytique_donnees.onglet_analytique`) : la page portait le calcul, et l'onglet n'était donc ni 100 % Svelte ni 100 % Rust alors que la route `GET /api/analytique` est livrée (t_39612182, PR 1651). - `main.js` monte le composant sur `/api/analytique` (la page n'écrit plus rien dans le conteneur) ; la page d'essai `/processus/?analytique` passe par la même route. - `lib/analytique.js` gagne `lire(api, fetch)` : la raison de la route passe avant le statut, la session expirée se dit à part. `Analytique.svelte` lit la route au montage, dit la raison d'un échec à l'écran et montre le squelette de la charte pendant l'attente — jamais une phrase, jamais un « aucune chaîne » qui ferait passer une absence de relevé pour un studio vide. - le panneau `p-analytique` de `tableau-bord.py` ne pose plus que la place de montage (`#analytique-app`) et le squelette : sans cela le panneau garderait un contenu calculé par Python (`data-donnees`), mesuré `contenu:Analytique` (manque non déclaré, CI rouge). - `/api/analytique` entre dans le relais `serveur_processus.py` : le service Rust n'écoute que sur la boucle locale du 132, sans ce relais la page du 132 afficherait une panne. Même motif que `/api/accueil` (t_c833b356) et `/api/top` (t_87c3e84d). - le banc `test_100_svelte_rust.py` ne déclare plus `page:Analytique` en manque : la mesure du jour donne l'onglet **100 %** (Svelte / socle / `/api/analytique` rust). `analytique_donnees.py` **n'est pas touché** : il reste en service jusqu'au lot 3. **Preuves mesurées.** - Texte visible de l'onglet **identique au caractère près** avant/après, dans les 4 configurations (bureau 1440 et téléphone 390, sombre et clair) : même sha256 du texte (3 046 caractères en bureau, 2 953 en téléphone), et captures PNG **identiques au bit près** (`md5sum`) ; 5 fiches, 45 boutons, 8 tracés, 0 px de débordement, aucune erreur JS. - La comparaison oppose les deux builds sur le **même conteneur** `#analytique-app` et la même fixture : l'ancien lit le JSON que Python écrivait dans la page, le nouveau lit la route `/api/analytique` (corps identique au doré de `analytique_donnees.donnees_analytique`, parité mesurée par t_39612182). - Route injoignable (aperçu sans `/api/analytique`) : « Onglet Analytique injoignable (HTTP 404). Recharger la page. » — aucune donnée inventée. - `npx vitest run` : 26 fichiers / 197 cas verts (dont `tests/analytique-api.test.js`, 8 cas neufs). `npx vite build` : code 0, `dist/index.html` présent, 916 Ko, 13 fichiers JS > 5 Ko. - `python3 _tableau/lancer-tests.py --tout --sans-couverture` : **160 bancs verts**, code 0. `garde_fous.py` : rien à redire. - Captures : `/home/atelier/atelier-hermes/captures-t_be254555/` (avant/après conteneur, page d'essai, panne, 4 configurations). **Non mesuré.** Le 132 lui-même (aucun accès depuis cette carte) : la route y arrive par le déploiement automatique après fusion, et le relais est éprouvé par `test_serveur_processus.py` sur un faux service. La couverture (bancs lancés avec `--sans-couverture`). **Écart au mandat, dit.** La carte demandait « aucun Python touché » : quatre fichiers Python sont modifiés (`tableau-bord.py`, `serveur_processus.py`, et les deux bancs qui les suivent). Aucun ne touche au calcul des données — `analytique_donnees.py` et `onglet_analytique.py` sont intacts — mais sans eux l'onglet ne peut pas être mesuré 100 % (le panneau doit porter la place de montage) ni fonctionner sur le 132 (le relais doit porter la route). Même motif que la carte Top vidéos (t_87c3e84d).
Analytique : l'onglet lit /api/analytique, la page n'écrit plus les données (t_be254555)
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 14s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 21s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 15s
7b2a5004b3
Cause : `Analytique.svelte` recevait ses chiffres par l'attribut `data-donnees` du
conteneur `#analytique-app`, écrits par Python (`analytique_donnees.onglet_analytique`).
La page portait donc le calcul, et l'onglet n'était ni 100 % Svelte ni 100 % Rust
alors que la route `GET /api/analytique` est livrée (t_39612182).

Remède : `main.js` monte le composant sur la route (la page n'écrit plus rien dans le
conteneur), le panneau `p-analytique` de `tableau-bord.py` ne pose plus que la place de
montage et le squelette, `/api/analytique` entre dans le relais `serveur_processus.py`
(sans lui, la page du 132 ne l'atteindrait pas : le service n'écoute que sur la boucle
locale), et le banc 100 % Svelte/Rust ne déclare plus `page:Analytique` en manque.
`Analytique.svelte` lit la route au montage (`lib/analytique.js:lire`), dit la raison
d'un échec et montre le squelette de la charte pendant l'attente. Aucune fonction
visible ne disparaît : mêmes chiffres, même texte au caractère près. `analytique_donnees.py`
reste en service jusqu'au lot 3.
Author
Collaborator

Captures (worktree de la carte t_be254555, Chrome sans tête)

apres-conteneur-sombre-1440.png

avant-conteneur-sombre-1440.png

apres-conteneur-clair-390.png

essai-sombre-1440.png

panne-sombre-1440.png

Avant et après tournent sur le même conteneur #analytique-app et la même fixture (tests/api-analytique.json) : l'ancienne build lit le JSON écrit par Python dans la page, la nouvelle lit /api/analytique. Texte identique au caractère près (même sha256) et PNG identiques au bit près (md5sum) en bureau 1440 et téléphone 390, sombre et clair. La dernière capture est la route injoignable (aperçu sans /api/analytique).

## Captures (worktree de la carte t_be254555, Chrome sans tête) **apres-conteneur-sombre-1440.png** ![](http://192.168.1.70:3000/attachments/6dc1e118-9ac3-4e6d-bea0-cb3a69f842ad) **avant-conteneur-sombre-1440.png** ![](http://192.168.1.70:3000/attachments/f0af26ab-9016-4cc7-b79f-d77952990a86) **apres-conteneur-clair-390.png** ![](http://192.168.1.70:3000/attachments/6b12b683-7ee6-4660-a795-220749656ea7) **essai-sombre-1440.png** ![](http://192.168.1.70:3000/attachments/76f40a5a-57bb-4008-ad94-89924af6583e) **panne-sombre-1440.png** ![](http://192.168.1.70:3000/attachments/82b1f6e7-caf7-4e8b-a1ac-c6d9992a493b) Avant et après tournent sur le **même conteneur** `#analytique-app` et la **même fixture** (`tests/api-analytique.json`) : l'ancienne build lit le JSON écrit par Python dans la page, la nouvelle lit `/api/analytique`. Texte identique au caractère près (même sha256) et PNG identiques au bit près (`md5sum`) en bureau 1440 et téléphone 390, sombre et clair. La dernière capture est la route injoignable (aperçu sans `/api/analytique`).
Author
Collaborator

Relecture faite (carte t_be3ced67). Le fond est vérifié, mesuré sur les deux vraies pages rendues par tableau-bord.py --rendu et le même JSON des deux côtés :

  • texte visible de l'onglet identique au caractère près avant/après : 3 046 caractères en bureau 1440, 2 953 en téléphone 390, sombre et clair ; 45 boutons, 7 tracés, 0 px de débordement, même rectangle d'onglet ;
  • route injoignable (404) : « Onglet Analytique injoignable (HTTP 404). Recharger la page. » — aucune donnée inventée ;
  • npx vitest run 26 fichiers / 197 cas verts ; npx vite build code 0 (dist 916 Ko, 13 JS > 5 Ko) ; lancer-tests.py --tout 159 bancs verts ; CI pc-studio 4/4 verte sur 7b2a5004 ; fusion simulée sans conflit.

Pourquoi l'étiquette operateur et non relu : la PR touche quatre fichiers Python (tableau-bord.py : la place de montage dans le panneau ; serveur_processus.py : /api/analytique dans le relais du 132 ; test_serveur_processus.py, test_100_svelte_rust.py) alors que le mandat disait « aucun fichier Python modifié ». Le calcul des données reste intact (analytique_donnees.py, onglet_analytique.py non touchés). Sans les deux fichiers de production, l'onglet ne peut être ni mesuré 100 % par le banc du chantier, ni fonctionner sur le 132 : c'est à l'opérateur de trancher cet écart, donc seul l'opérateur fusionnera.

Note, mesurée : le repli en échec de l'onglet (window.analytiqueEchec, PR #1655) n'est pas encore dans main et ne porte aucune étiquette — cette PR ne le retire pas, elle ne le fournit pas non plus.

Bancs et captures : _tableau/test_100_svelte_rust.py → Analytique Svelte socle /api/analytique — 100 % ; preuves sur /home/atelier/atelier-hermes/relecture-t_be3ced67/.

**Relecture faite (carte t_be3ced67).** Le fond est vérifié, mesuré sur les deux vraies pages rendues par `tableau-bord.py --rendu` et le même JSON des deux côtés : - texte visible de l'onglet **identique au caractère près** avant/après : 3 046 caractères en bureau 1440, 2 953 en téléphone 390, sombre et clair ; 45 boutons, 7 tracés, 0 px de débordement, même rectangle d'onglet ; - route injoignable (404) : « Onglet Analytique injoignable (HTTP 404). Recharger la page. » — aucune donnée inventée ; - `npx vitest run` 26 fichiers / 197 cas verts ; `npx vite build` code 0 (dist 916 Ko, 13 JS > 5 Ko) ; `lancer-tests.py --tout` 159 bancs verts ; CI pc-studio 4/4 verte sur `7b2a5004` ; fusion simulée sans conflit. **Pourquoi l'étiquette `operateur` et non `relu`** : la PR touche **quatre fichiers Python** (`tableau-bord.py` : la place de montage dans le panneau ; `serveur_processus.py` : `/api/analytique` dans le relais du 132 ; `test_serveur_processus.py`, `test_100_svelte_rust.py`) alors que le mandat disait « aucun fichier Python modifié ». Le calcul des données reste intact (`analytique_donnees.py`, `onglet_analytique.py` non touchés). Sans les deux fichiers de production, l'onglet ne peut être ni mesuré 100 % par le banc du chantier, ni fonctionner sur le 132 : c'est à l'opérateur de trancher cet écart, donc seul l'opérateur fusionnera. Note, mesurée : le repli en échec de l'onglet (`window.analytiqueEchec`, PR #1655) n'est pas encore dans `main` et ne porte aucune étiquette — cette PR ne le retire pas, elle ne le fournit pas non plus. Bancs et captures : `_tableau/test_100_svelte_rust.py` → `Analytique Svelte socle /api/analytique — 100 %` ; preuves sur `/home/atelier/atelier-hermes/relecture-t_be3ced67/`.
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/front-analytique-api from 7b2a5004b3
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 14s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 21s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 15s
to 9c45fb40c0
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m30s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m21s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m39s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 4m29s
2026-10-15 13:39:58 +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é.
Fusion de main : Analytique lit /api/analytique derrière la frontière de rendu
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m51s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m34s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 14m2s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 15m7s
bab76be87a
- main.js : montage de l'Analytique derrière Frontiere, la route /api/analytique
  reste la seule source (plus de data-donnees) ; analytique-api.test.js suit.
- serveur_processus.py : le relais garde /api/analytique et reprend /reglages,
  /etat, /connexion, /api/sujets, /api/ensemble venus de main.
- test_100_svelte_rust.py : les manques page:Analytique et page:Sujets qui
  marchent sont levés (Analytique par t_be254555, Sujets par t_0871dc48).
- test_routes_front_relayees.py : /api/analytique sort de HORS_RELAIS, il est
  désormais relayé.
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/front-analytique-api from bab76be87a
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m51s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m34s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 14m2s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 15m7s
to 46a6176af1
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 40s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Failing after 1m27s
2026-10-16 21:50:59 +02:00
Compare
foXaCe merged commit e6f39ad05d into main 2026-10-16 21:51:06 +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!1667
No description provided.