Historique du tableau : le fichier du 132 passe dans la base du service d'état (STUD-1107) #1691
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/migration-historique-sqlite"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
La carte
t_4f72ca61:/opt/studio/historique.jsonl(le fichier de points du tableau de bord, sur le 132) passe dans la base du service d'état, sur le motif des migrationsatelieretreseauxdéjà fusionnées.Ce qui change
etat_partage.sql: tablehistorique.idAUTOINCREMENT comme clé et past— mesuré sur le fichier du 132 le 2026-10-15 : 294 points, dont 7 partagent la même minute ; l'ordre d'arrivée est une information. Un champ par clé de premier niveau, valeur en JSON compact dans l'ordre du producteur (la copie réécrite depuis la base redevient le fichier d'origine octet pour octet), NULL = champ absent,{}= champ présent.trefusé par motif ET parstrftime(une heure qui n'existe pas,2026-10-14T25:06, est refusée).bascules.nompasse d'une liste fermée à un motif GLOB : SQLite ne modifie pas unCHECKet douze migrations sont en cours.etat_partage._reparer_basculesrefait une base restée sur l'ancienne liste (idempotent).etat_partage.py:historique_lire/detail/ajouter/remplacer/purger._infra/etat-service.py: cinq routes/historique*.etat_client.py: client,basculer historique [--essai],revenir historique(ancien en.bak-sqlite-<date>)._tableau/historique_commun.py(nouveau) : la forme d'un point, son écriture et la purge de la base, une seule fois pourtableau-bord.py(l'écrivain) etcollecte.py(la purge de 40 jours) — les deux sont au bout de leur dérogation de plafond (STUD-1191),tableau-bord.pymontait à 818 lignes pour 800./opt/studio, le service n'est appelé que siSTUDIO_ETAT_URLle désigne (leçon du 2026-10-13).OUTILS.md,_tableau/LXC-132.md.Preuves
cargo test --release --locked(branche,_tableau/rust) : code 0, tous les binairesok— 4 + 0 + 18 + 8 + 13 + 0 + 0 + 4 + 4 + 2 + 5 + 4 + 3 + 1 + 3 + 0 + 0 = 69 tests passés, 0 échec (ligne type :test result: ok. 18 passed; 0 failed; 0 ignored).cargo build --release --locked: code 0,Finished \release` profile [optimized]`, 0 avertissement.Bancs Python :
python3 controle/test_etat_partage.py→TOUT PASSE(code 0), dont la section 8 : essai IDENTIQUES sur les 294 points réels, ligne illisible refusée, bascule avec.bak-sqlite, copie réécrite octet pour octet, écriture pendant la bascule rendue par le retour arrière, re-bascule, purge ; volume : 5000 points (3,0 Mo) importés en 0,2 s, relus en 0,1 s.python3 _infra/test_etat_service.py→ code 0 (les cinq routes, ordre d'arrivée, détail champ par champ).python3 _tableau/test_collecte.py→ code 0 (fichier d'abord, service muet dit sur la sortie d'erreur, purge des deux foyers) et_tableau/test_garde_{plafond,doublons,couches}.py→ code 0.python3 _tableau/lancer-tests.py --tout→ 167 bancsok, 0 rouge ; la ligne CLIQUET refuse (cœur 99,1 %, ensemble 96,6 % pour 99,4 / 99,0).Ce que je n'ai pas mesuré / à savoir
etat_client.py basculer historiquereste un geste à faire sur la machine du service, après relecture.52de10c3, sans mes changements) → mêmes chiffres exactement (cœur 99,1 %, ensemble 96,6 %, même refus). Ma modification ne coûte rien à la mesure ; l'écart avec la dernière mesure enregistrée (2026-10-14) vient d'ailleurs./api/...existant ne change : les routes/historique*sont nouvelles, sur le service d'état, et le front Svelte ne les consomme pas (svelten'a rien à faire)./tmp(tmpfs 16 Go) est à 99 % (171 Mo libres). Uncargo testa échoué une fois surStorageFull(conso.rs:386) avant que je ne placeTMPDIRsur/home; rejoué, code 0. Ce n'est pas le code, mais ça fera échouer n'importe quel banc qui écrit dans/tmp.Recette : STUD-1107. Carte :
t_4f72ca61.651e70e022d7754122b9d7754122b9f37cd2a799fusion-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é.f37cd2a7996e7a394cc0Relecture du 2026-10-15 (tête
6e7a394c, basemain86345ae7) — Relu, conforme, étiquettereluposée. Tout ce qui suit est mesuré par moi dans un worktree à moi (git worktree add … hermes/migration-historique-sqlite), rien repris du compte rendu.1. La branche.
git diff --stat origin/main...HEAD: 12 fichiers, +778/−19 —etat_partage.sql,etat_partage.py,etat_client.py,_infra/etat-service.py(+ son banc),_tableau/historique_commun.py(nouveau),_tableau/tableau-bord.py,_tableau/collecte.py(+ son banc),controle/test_etat_partage.py,OUTILS.md,_tableau/LXC-132.md. Aucun fichier du front, aucun fichier de production (01-…07-). Le diff de l'API Forgejo et mongit diff origin/main...HEADont le même md5 (534e1d74…) : c'est bien ce contenu que la PR porte.git diff --check: rien.2. Rust.
cargo test --release --locked: code 0, 77 tests passés, 0 échec (somme destest result), 0FAILED.3. Les bancs du changement, tous code 0.
4. Le vrai fichier du 132 (
ssh -i ~/.ssh/id_132 studio@192.168.1.86 'cat /opt/studio/historique.jsonl', lecture seule) : 294 points, 154 121 octets, md5a7aa0a29e9e4383d2e5aebdc5b6a43a7. Mesuré sur cette copie, pas sur des données de banc :5. Front. La diff ne touche aucun fichier de
_tableau/front/.npx vite build: code 0 (985 modules).npx vitest run: 1 échec / 198 réussis —tests/stockage.test.js:82attend« relevé à »et le rendu porte« relevé hier à 22 h 44 »: ce banc a ses données au 2026-10-14 et ne peut plus passer le 2026-10-15. Reproduit à l'identique sur un worktree propre deorigin/main(86345ae7), front intact : 1 échec / 198 réussis, même ligne. De même_tableau/test_accueil_parite.pyéchoue pareillement sur la PR et surorigin/mainpropre (« le JSON doré n'est plus la sortie de Python »). Ces deux rouges sont hérités demain, pas de cette PR ; la PR #1688 répare le premier.6. Ce qui reste en place. La page du 132 lit toujours le fichier (
_tableau/tableau-bord.py:427et:680ouvrentHISTO) : cette PR ne retire aucune fonction visible et ne touche aucun onglet. Aucun secret, aucun base64, aucun emoji dans les 778 lignes ajoutées (le seul caractère non typographique est la flèche « → » d'un message de console). Aucun échec avalé : un service muet après bascule écrit le point dans le fichier ET le dit sur la sortie d'erreur (fichier-muet).7. Réserve, non bloquante. Dans
_tableau/historique_commun.py,ecrire_historiqueattrape un refus du service (400 sur un champ inconnu de la table) avec le mêmeexceptqu'une injoignabilité et titre le message « service d'état injoignable » : la panne est dite, mais l'étiquette envoie au mauvais diagnostic.8. La CI de la PR n'est pas verte. La tête
6e7a394cest encore en attente (les quatre checks sont « Waiting to run »), et le job Front Svelte y sera rouge pour le banc hérité demain(point 5).fusion-autone fusionnera donc pas tant que le banc front demainn'est pas réparé (PR #1688). Le contenu livré, lui, est conforme et complet.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 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é.6e7a394cc0c0864a9c55Rebasé sur
main(a6f78cc7, 2026-10-16). 12 fichiers en conflit, aucun apport de cette branche perdu : chaqueconflit a gardé les DEUX côtés (les fonctions et les routes de la branche plus ce que
maina ajouté depuis),et trois raccords étaient nécessaires.
Résolutions de conflit, règle appliquée :
etat_partage.py,etat_client.py,_infra/etat-service.py,_tableau/collecte.py,_tableau/tableau-bord.py,_tableau/test_collecte.py,_tableau/LXC-132.md,OUTILS.md: les deuxajouts conservés (les
historique*de la branche à côté dechoix_vignettes/atelier/reseaux-filedemain). Doc deLXC-132.mdcorrigée : plus aucun fichier d'état n'est hors de la base (la phrase parlaitencore de
historique.jsonlcomme prochain fichier).etat_client.py:basculer/revenir/NOMSportenthistoriqueen plus des noms ajoutés parmain.etat_partage.py: le helper de l'historique a été renommé_valeur_point(celui demains'appelle_valeur_json) — sans ça deux définitions se masquaient.controle/test_etat_partage.py: les deux sections ajoutées gardées ; la section de l'historique passe de 8à 11 et la liste des tables attendues suit le schéma entier.
Un vrai défaut de
mainréparé au passage : la liste des tables attendues par le banc (section 9b) nementionnait ni
choix_vignettes(table arrivée avec la migration de la file du 2026-10-14, PR #1689) nihistorique— le banc était rouge surmainpour cette raison, et l'aurait été ici aussi. Vérifié :Porte complète du tableau (
python3 _tableau/lancer-tests.py --tout) : « BILAN — 210 verts, 1 rouge, 1banc(s) lent(s), non bloquant(s) : _tableau/test_deployer_fusion.py ». Le rouge est
_infra/test_etat_sauvegarde.py(Rétention--garder 3: trois copies gardées) : il attend une date en durdu 2026-10-15, donc il est rouge sur
mainaussi — vérifié dans un arbre détaché surorigin/main, mêmeécart. Rien à voir avec cette branche.
Aucun champ de
/api/...changé : le front Svelte n'a rien à reprendre.CI verte sur
c0864a9c:Tests du tableau (Rust + Svelte) / Rust (_tableau/rust)successen 11m03s etFront Sveltesuccessen 2m05s (pull_request et push, les quatre statuts). Fusionnée dansmainle 2026-10-16 à 04h00 (merge9331aac3).