Front Svelte — Top vidéos : lire /api/top, plus de données embarquées (t_87c3e84d) #1662

Merged
foXaCe merged 8 commits from hermes/front-top-api into main 2026-10-16 21:05:49 +02:00
Collaborator

But

Top.svelte recevait ses données par l'attribut data-donnees du conteneur #top-app, rempli par Python
(top_donnees.onglet_top) à chaque rendu de la page. L'onglet n'était donc ni 100 % Svelte ni 100 % Rust :
les chiffres se calculaient encore dans la page, et une panne de la route n'aurait rien changé.

Ce que fait la branche (5 commits)

  1. L'onglet lit /api/top — Top.svelte prend la route en prop (api) et la lit par lib/top.js:lire,
    main.js ne lit plus data-donnees et monte le composant avec api: '/api/top'. /processus/?top monte le
    même composant sur la même route (le repli annoncé par le commentaire n'existait pas : top manquait aussi dans
    la liste des onglets montés sur #processus-app). Même forme de données, aucun recalcul côté front :
    lib/top.js ne fait que filtrer, classer et compter ce que la route rend.
  2. Un échec se dit — lire() rend la raison de la route quand elle en donne une, HTTP <statut> sinon, et
    « session expirée » à part (le renvoi vers /connexion ne porte pas de JSON). Pendant l'attente, le squelette
    de la charte, sans un mot ; plus de phrase d'erreur quand il n'y a simplement pas encore de données.
  3. La page Python ne calcule plus le Top — le panneau p-top de tableau-bord.py ne pose que la place de
    montage et le squelette (top_donnees.SQUELETTE, une seule copie) ; top_donnees.py n'est pas touché et son
    onglet_top reste éprouvé par test_top_donnees.py. L'ancien onglet Python reste sous #o-ancien-top.
    tableau-bord.py reste à son plafond de 800 lignes (aucune ligne ajoutée).
  4. Le banc « 100 % Svelte et 100 % Rust » — l'entrée page:Top vidéos de test_100_svelte_rust.py est
    retirée : la mesure est devenue conforme, et le banc mesure maintenant Top vidéos Svelte socle /api/top 100 %.
  5. Le relais — /api/top entre dans la liste relayée de serveur_processus.py (comme /api/accueil avant lui,
    t_c833b356) : le service Rust n'écoute que sur la boucle locale du 132, sans cette ligne le front de la page du
    132 ne l'atteindrait pas et l'onglet resterait sur sa panne. Un relais ne calcule rien.
  6. La page d'essai — front/apercu.py sert /api/top (argument top, comme accueil et analytique), avec le
    JSON doré de la parité Rust comme fixture : l'onglet se regarde et se mesure sans le 132.

Preuves

  • npx vitest run (front) : 26 fichiers / 197 cas verts, dont le banc neuf tests/top-api.test.js
    (8 cas : la route est la seule source, et chaque échec de lecture a sa raison).
  • python3 _tableau/lancer-tests.py --tout --sans-couverture : 159 bancs verts, code 0.
  • npm run build : dist/ 904 097 octets, dist/index.html présent, 13 fichiers JS > 5 Ko.
  • test_100_svelte_rust.py : Top vidéos Svelte socle /api/top 100 % (le manque déclaré au nom de la carte est levé).

La même page, les mêmes lignes — mesuré, pas affirmé

Le même JSON (le doré de la parité, rust/service/tests/fixtures/top/complet.top.json) servi des deux façons :
la page d'AVANT (conteneur #top-app avec data-donnees, build d'avant) et la page d'APRÈS (conteneur nu, build
d'après, /api/top sur 404 côté avant). Texte visible du conteneur, Chromium piloté en CDP :

configuration avant après
bureau 1440, sombre e04189f1a33c, 3058 car. e04189f1a33c, 3058 car. identique
bureau 1440, clair e04189f1a33c e04189f1a33c identique
téléphone 390, sombre 266b06c8168a, 2949 car. 266b06c8168a, 2949 car. identique
téléphone 390, clair 266b06c8168a 266b06c8168a identique

Les captures PNG sont identiques au bit près avant/après (2e382d84…, 3df7563c…, 53ef13d2…, 76c5a257…).
La page d'essai (apercu.py, /processus/?top) rend le même texte que la page du tableau, dans les quatre
configurations. Partout : 15 lignes, 73 liens, 1 tableau, 0 px de débordement horizontal.

Panne reproduite : la build d'AVANT sur un conteneur nu (sans data-donnees) n'affiche que
« Les données de l'onglet n'ont pas pu être lues : recharger la page. » — l'ancien montage dépendait bien du calcul
Python ; l'après, sur le même conteneur nu, affiche les 15 lignes depuis /api/top.

Ce qui n'est pas mesuré

  • La page du 132 elle-même : aucune clé SSH depuis ce poste (~/.ssh/id_132 vide, ssh studio@192.168.1.86
    refuse la clé). Mesuré sur la build servie en local par front/apercu.py, plus la page Python reconstituée.
  • tableau-bord.py --rendu n'a pas été exécuté sur le 132 : la page locale est reconstituée (mêmes fichiers,
    mêmes gabarits).
  • La CI pc-studio de cette PR (état à la demande dans le fil).
## But `Top.svelte` recevait ses données par l'attribut `data-donnees` du conteneur `#top-app`, rempli par Python (`top_donnees.onglet_top`) à chaque rendu de la page. L'onglet n'était donc ni 100 % Svelte ni 100 % Rust : les chiffres se calculaient encore dans la page, et une panne de la route n'aurait rien changé. ## Ce que fait la branche (5 commits) 1. **L'onglet lit `/api/top`** — `Top.svelte` prend la route en prop (`api`) et la lit par `lib/top.js:lire`, `main.js` ne lit plus `data-donnees` et monte le composant avec `api: '/api/top'`. `/processus/?top` monte le même composant sur la même route (le repli annoncé par le commentaire n'existait pas : `top` manquait aussi dans la liste des onglets montés sur `#processus-app`). Même forme de données, **aucun recalcul** côté front : `lib/top.js` ne fait que filtrer, classer et compter ce que la route rend. 2. **Un échec se dit** — `lire()` rend la raison de la route quand elle en donne une, `HTTP <statut>` sinon, et « session expirée » à part (le renvoi vers `/connexion` ne porte pas de JSON). Pendant l'attente, le squelette de la charte, sans un mot ; plus de phrase d'erreur quand il n'y a simplement pas encore de données. 3. **La page Python ne calcule plus le Top** — le panneau `p-top` de `tableau-bord.py` ne pose que la place de montage et le squelette (`top_donnees.SQUELETTE`, une seule copie) ; `top_donnees.py` n'est pas touché et son `onglet_top` reste éprouvé par `test_top_donnees.py`. L'ancien onglet Python reste sous `#o-ancien-top`. `tableau-bord.py` reste à son plafond de 800 lignes (aucune ligne ajoutée). 4. **Le banc « 100 % Svelte et 100 % Rust »** — l'entrée `page:Top vidéos` de `test_100_svelte_rust.py` est retirée : la mesure est devenue conforme, et le banc mesure maintenant `Top vidéos Svelte socle /api/top 100 %`. 5. **Le relais** — `/api/top` entre dans la liste relayée de `serveur_processus.py` (comme `/api/accueil` avant lui, t_c833b356) : le service Rust n'écoute que sur la boucle locale du 132, sans cette ligne le front de la page du 132 ne l'atteindrait pas et l'onglet resterait sur sa panne. Un relais ne calcule rien. 6. **La page d'essai** — `front/apercu.py` sert `/api/top` (argument `top`, comme `accueil` et `analytique`), avec le JSON doré de la parité Rust comme fixture : l'onglet se regarde et se mesure sans le 132. ## Preuves - `npx vitest run` (front) : **26 fichiers / 197 cas verts**, dont le banc neuf `tests/top-api.test.js` (8 cas : la route est la seule source, et chaque échec de lecture a sa raison). - `python3 _tableau/lancer-tests.py --tout --sans-couverture` : **159 bancs verts**, code 0. - `npm run build` : `dist/` 904 097 octets, `dist/index.html` présent, 13 fichiers JS > 5 Ko. - `test_100_svelte_rust.py` : `Top vidéos Svelte socle /api/top 100 %` (le manque déclaré au nom de la carte est levé). ### La même page, les mêmes lignes — mesuré, pas affirmé Le même JSON (le doré de la parité, `rust/service/tests/fixtures/top/complet.top.json`) servi des deux façons : la page d'AVANT (conteneur `#top-app` avec `data-donnees`, build d'avant) et la page d'APRÈS (conteneur nu, build d'après, `/api/top` sur 404 côté avant). Texte visible du conteneur, Chromium piloté en CDP : | configuration | avant | après | | |---|---|---|---| | bureau 1440, sombre | `e04189f1a33c`, 3058 car. | `e04189f1a33c`, 3058 car. | identique | | bureau 1440, clair | `e04189f1a33c` | `e04189f1a33c` | identique | | téléphone 390, sombre | `266b06c8168a`, 2949 car. | `266b06c8168a`, 2949 car. | identique | | téléphone 390, clair | `266b06c8168a` | `266b06c8168a` | identique | Les captures PNG sont **identiques au bit près** avant/après (`2e382d84…`, `3df7563c…`, `53ef13d2…`, `76c5a257…`). La page d'essai (`apercu.py`, `/processus/?top`) rend le **même texte** que la page du tableau, dans les quatre configurations. Partout : 15 lignes, 73 liens, 1 tableau, 0 px de débordement horizontal. Panne reproduite : la build d'AVANT sur un conteneur nu (sans `data-donnees`) n'affiche que « Les données de l'onglet n'ont pas pu être lues : recharger la page. » — l'ancien montage dépendait bien du calcul Python ; l'après, sur le même conteneur nu, affiche les 15 lignes depuis `/api/top`. ## Ce qui n'est pas mesuré - La page du 132 elle-même : aucune clé SSH depuis ce poste (`~/.ssh/id_132` vide, `ssh studio@192.168.1.86` refuse la clé). Mesuré sur la build servie en local par `front/apercu.py`, plus la page Python reconstituée. - `tableau-bord.py --rendu` n'a pas été exécuté sur le 132 : la page locale est reconstituée (mêmes fichiers, mêmes gabarits). - La CI pc-studio de cette PR (état à la demande dans le fil).
Cause : `Top.svelte` recevait ses données par l'attribut `data-donnees` de `#top-app`, rempli par Python
(`top_donnees.onglet_top`) à chaque rendu de la page. L'onglet n'était donc ni 100 % Svelte ni 100 % Rust : les
chiffres se calculaient encore dans la page, et une panne de la route n'aurait rien changé.

Remède : le composant lit la route `/api/top` (celle que `top_donnees.donnees_top` rendait, portée en Rust par
t_c54aeea1) via `lib/top.js:lire`, `main.js` ne lit plus `data-donnees` et monte le composant avec `api: '/api/top'`,
et `/processus/?top` monte le même composant sur la même route (le repli promis par le commentaire n'existait pas).
Un échec devient une raison lisible (« HTTP 404 », la raison de la route, ou « session expirée ») au lieu d'un onglet
muet, et l'attente montre le squelette de la charte sans un mot. Aucun chiffre n'est recalculé côté front.

Bancs : `tests/top-api.test.js` (nouveau : la route est la seule source, chaque échec de lecture a sa raison),
`tests/top.test.js` (sans données de départ : squelette muet, plus de phrase).
Cause : le panneau `p-top` appelait `top_donnees.onglet_top(donnees, maintenant)` — la page calculait la liste
entière et l'écrivait dans l'attribut `data-donnees` du conteneur, à chaque rendu. Le banc « 100 % Svelte et
100 % Rust » le mesurait : `page:Top vidéos` restait dans ses manques, au nom de cette carte.

Remède : le panneau ne pose plus que la place de montage et le squelette (`SQUELETTE`, la même copie que
`top_donnees.py` garde en service jusqu'au lot 3) ; les chiffres viennent de `/api/top`. `top_donnees.py` n'est pas
touché — son `onglet_top` reste éprouvé par `test_top_donnees.py` — et l'ancien onglet Python reste sous
`#o-ancien-top` jusqu'à la validation. L'entrée `page:Top vidéos` de `test_100_svelte_rust.py` est retirée : la mesure
est devenue conforme, une entrée qui ne sert plus fait échouer le banc. `tableau-bord.py` reste à son plafond de
800 lignes (aucune ligne ajoutée). CHARTE-UI.md dit la nouvelle source de l'onglet.
Cause : le front de l'onglet lit `/api/top`, mais cette adresse n'existait pas dans l'aiguillage de
`serveur_processus.py` — le service n'écoute que sur la boucle locale du 132. Sans cette ligne, l'onglet du 132
aurait affiché « Onglet Top vidéos injoignable (HTTP 404) » là où il montrait ses chiffres.

Remède : `/api/top` entre dans la liste relayée, comme `/api/accueil` avant lui (t_c833b356) — un relais ne calcule
rien, il passe la requête au service, qui sert la route (t_c54aeea1). Le banc du relais éprouve la route de bout en
bout sur le faux service, et le commentaire de tête dit la raison de ce relais.
Cause : le banc neuf de l'onglet vérifiait la liste entière des conteneurs montés sur `#processus-app`
(`[cal, sem, top, acc, vid, at]`). Après rebasage, la carte Analytique a ajouté `ana` à cette liste : le banc
sortait en rouge pour une raison qui n'a rien à voir avec la bascule.

Remède : le banc vérifie que `top` compte dans la liste, sans la figer — chaque onglet qui s'ajoute a son propre
banc, et celui-ci ne garde que son objet.
Page d'essai : l'aperçu sert /api/top, l'onglet s'y regarde
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 15s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 13s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 15s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 12s
0a01b18752
Cause : `front/apercu.py` ne servait pas `/api/top` (comme il ne servait pas `/api/analytique` avant
STUD-1227). La page d'essai est faite pour regarder un onglet sans le 132 : sans cette route, `/processus/?top`
montrait « Onglet Top vidéos injoignable (HTTP 404) » — l'onglet ne pouvait pas s'y relire.

Remède : `/api/top` entre dans l'aperçu (argument `top`, comme `accueil` et `analytique`), et son banc sert le
JSON doré de la parité Rust (`rust/service/tests/fixtures/top/complet.top.json`, une seule copie de ce que la route
rend). Mesure : la page d'essai affiche les 15 lignes de l'onglet, texte identique à la page du tableau au
caractère près, dans les quatre configurations.
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-top-api from 0a01b18752
All checks were successful
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 15s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 13s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 15s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 12s
to a1508e5b29
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m54s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 4m46s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Has been cancelled
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Has been cancelled
2026-10-15 13:21:22 +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 dans le front Top vidéos (lit /api/top)
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 4m1s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 4m4s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13m24s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 15m48s
ce0f6c2c44
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 (onglet Projection) dans le front Top vidéos
Some checks failed
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 32s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 30s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13m18s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 12m56s
52d6df058e
Collaborator

fusion-auto : pas de fusion, la CI est rouge (Front Svelte). 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 (Front Svelte). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.
Front : retirer le bloc Projection en double (build cassé)
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 3m17s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 3m17s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 12m15s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 13m23s
9a57a3c7ae
foXaCe merged commit e61d1c4a7c into main 2026-10-16 21:05: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!1662
No description provided.