Historique du tableau : le fichier du 132 passe dans la base du service d'état (STUD-1107) #1691

Merged
hermes-fusion merged 1 commit from hermes/migration-historique-sqlite into main 2026-10-16 04:00:05 +02:00
Collaborator

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 migrations atelier et reseaux déjà fusionnées.

Ce qui change

  • etat_partage.sql : table historique. id AUTOINCREMENT comme clé et pas t — 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. t refusé par motif ET par strftime (une heure qui n'existe pas, 2026-10-14T25:06, est refusée).
  • bascules.nom passe d'une liste fermée à un motif GLOB : SQLite ne modifie pas un CHECK et douze migrations sont en cours. etat_partage._reparer_bascules refait 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 pour tableau-bord.py (l'écrivain) et collecte.py (la purge de 40 jours) — les deux sont au bout de leur dérogation de plafond (STUD-1191), tableau-bord.py montait à 818 lignes pour 800.
  • Le fichier est écrit d'abord, toujours : c'est lui que la page du 132 lit. La base ensuite, quand la bascule est posée ; service muet alors que la bascule est connue : le point reste dans le fichier seul et c'est DIT sur la sortie d'erreur. Hors de /opt/studio, le service n'est appelé que si STUDIO_ETAT_URL le désigne (leçon du 2026-10-13).
  • Doc : OUTILS.md, _tableau/LXC-132.md.

Preuves

cargo test --release --locked (branche, _tableau/rust) : code 0, tous les binaires ok — 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 bancs ok, 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

  • La bascule en production n'est pas faite : etat_client.py basculer historique reste un geste à faire sur la machine du service, après relecture.
  • Le CLIQUET rouge est pré-existant : mesuré sur la base de la branche (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.
  • Aucun champ /api/... existant ne change : les routes /historique* sont nouvelles, sur le service d'état, et le front Svelte ne les consomme pas (svelte n'a rien à faire).
  • Environnement du PC : /tmp (tmpfs 16 Go) est à 99 % (171 Mo libres). Un cargo test a échoué une fois sur StorageFull (conso.rs:386) avant que je ne place TMPDIR sur /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.

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 migrations `atelier` et `reseaux` déjà fusionnées. ## Ce qui change - `etat_partage.sql` : table `historique`. `id` AUTOINCREMENT comme clé et pas `t` — 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. `t` refusé par motif ET par `strftime` (une heure qui n'existe pas, `2026-10-14T25:06`, est refusée). - `bascules.nom` passe d'une liste fermée à un motif GLOB : SQLite ne modifie pas un `CHECK` et douze migrations sont en cours. `etat_partage._reparer_bascules` refait 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** pour `tableau-bord.py` (l'écrivain) et `collecte.py` (la purge de 40 jours) — les deux sont au bout de leur dérogation de plafond (STUD-1191), `tableau-bord.py` montait à 818 lignes pour 800. - Le **fichier est écrit d'abord, toujours** : c'est lui que la page du 132 lit. La base ensuite, quand la bascule est posée ; service muet alors que la bascule est **connue** : le point reste dans le fichier seul et c'est DIT sur la sortie d'erreur. Hors de `/opt/studio`, le service n'est appelé que si `STUDIO_ETAT_URL` le désigne (leçon du 2026-10-13). - Doc : `OUTILS.md`, `_tableau/LXC-132.md`. ## Preuves `cargo test --release --locked` (branche, `_tableau/rust`) : **code 0**, tous les binaires `ok` — 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 bancs `ok`, 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 - La bascule en production **n'est pas faite** : `etat_client.py basculer historique` reste un geste à faire sur la machine du service, après relecture. - Le CLIQUET rouge est **pré-existant** : mesuré sur la base de la branche (`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. - Aucun champ `/api/...` existant ne change : les routes `/historique*` sont **nouvelles**, sur le service d'état, et le front Svelte ne les consomme pas (`svelte` n'a rien à faire). - Environnement du PC : `/tmp` (tmpfs 16 Go) est à **99 %** (171 Mo libres). Un `cargo test` a échoué une fois sur `StorageFull` (`conso.rs:386`) avant que je ne place `TMPDIR` sur `/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`.
Historique du tableau : le fichier du 132 passe dans la base du service d'état (STUD-1107)
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 31s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 10s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 28s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 11s
651e70e022
Le fichier `/opt/studio/historique.jsonl` du 132 (294 points mesurés le 2026-10-15) n'était lu que par la
page du tableau : ni partageable, ni requêtable, et sa conservation de 40 jours reposait sur un seul
script. Il devient une table de la base du service d'état, comme `sorties` et `file_montage` avant lui.

- `etat_partage.sql` : table `historique` — `id` AUTOINCREMENT et pas `t` comme clé, parce que 7 des 294
  points du 132 partagent la même minute et que l'ordre d'arrivée est une information —, un champ par clé
  de premier niveau (les clés de chaînes sont des données, elles ont déjà changé deux fois), valeur en JSON
  compact dans l'ordre du producteur pour que la copie réécrite depuis la base redevienne le fichier
  d'origine octet pour octet, `t` vérifié par motif ET par `strftime` (une heure qui n'existe pas est
  refusée). `bascules.nom` passe d'une liste fermée à un motif GLOB : SQLite ne modifie pas un CHECK, et
  douze migrations sont en cours.
- `etat_partage.py` : `historique_lire/detail/ajouter/remplacer/purger`, refus d'une ligne illisible,
  `_reparer_bascules` (une base restée sur l'ancienne liste fermée est refaite sans perte, idempotent).
- `_infra/etat-service.py` : les cinq routes `/historique*`. Aucun champ d'API existant ne change, et le
  front Svelte ne consomme pas ces routes.
- `etat_client.py` : client de l'historique, `basculer historique [--essai]` et `revenir historique`
  (ancien gardé en `.bak-sqlite-<date>`, refus d'une ligne illisible, copie réécrite depuis la base).
- `_tableau/historique_commun.py` (nouveau) : la forme d'un point, son écriture et la purge de la base —
  une seule fois pour `tableau-bord.py` (l'écrivain) et `collecte.py` (la purge de 40 jours). Les deux
  fichiers sont au bout de leur dérogation de plafond (STUD-1191) : le premier montait à 818 lignes pour
  800, la forme du point ne pouvait pas être recopiée.

Le FICHIER est écrit d'abord, toujours : c'est lui que la page du 132 lit, et un point écrit là ne peut
plus être perdu. La base ensuite, quand la bascule est posée ; service muet alors que la bascule est
CONNUE : le point reste dans le fichier seul et c'est DIT sur la sortie d'erreur (un historique qu'on croit
partagé alors qu'il n'est que dans un fichier est une panne silencieuse). Un banc ne parle jamais au
service de production : hors de `/opt/studio`, il n'est appelé que si `STUDIO_ETAT_URL` le désigne (leçon
du 2026-10-13, un banc a écrasé les dates du relevé six minutes après la bascule).

Tests : `controle/test_etat_partage.py` section 8 (essai sur les 294 points réels, bascule, copie
octet pour octet, volume de 5000 points), `_infra/test_etat_service.py` (les cinq routes), et
`_tableau/test_collecte.py` (fichier d'abord, service muet, purge des deux foyers). Doc : `OUTILS.md` et
`_tableau/LXC-132.md`.
hermes-bot force-pushed hermes/migration-historique-sqlite from 651e70e022
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 31s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 10s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 28s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 11s
to d7754122b9
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 12s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 29s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 13s
2026-10-15 00:48:24 +02:00
Compare
hermes-bot force-pushed hermes/migration-historique-sqlite from d7754122b9
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 12s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 29s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 13s
to f37cd2a799
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 13s
2026-10-15 00:53:11 +02:00
Compare
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é.
hermes-bot force-pushed hermes/migration-historique-sqlite from f37cd2a799
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 13s
to 6e7a394cc0
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 27s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 10s
2026-10-15 00:58:50 +02:00
Compare
Author
Collaborator

Relecture du 2026-10-15 (tête 6e7a394c, base main 86345ae7) — Relu, conforme, étiquette relu posé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 mon git diff origin/main...HEAD ont 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 des test result), 0 FAILED.

3. Les bancs du changement, tous code 0.

$ python3 controle/test_etat_partage.py
ok 8 : historique — essai IDENTIQUES, ligne illisible refusée sans rien écrire, champ inconnu refusé
       en le nommant, bascule (.bak-sqlite gardé, copie réécrite octet pour octet depuis la base),
       écriture pendant la bascule rendue par le retour arrière, re-bascule, purge refusée sur une
       limite vide ; volume : 5000 points (3.2 Mo) importés en 0.2 s, relus en 0.1 s
TOUT PASSE
$ python3 _infra/test_etat_service.py        → OK (les 5 routes de l'historique, les 400)
$ python3 _tableau/test_collecte.py          → OK
$ python3 _tableau/test_garde_plafond.py / test_garde_doublons.py / test_garde_couches.py  → ok

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, md5 a7aa0a29e9e4383d2e5aebdc5b6a43a7. Mesuré sur cette copie, pas sur des données de banc :

$ ETAT_HISTORIQUE=…/historique-132.jsonl python3 etat_client.py basculer historique --essai
comparaison … : 294 points (2026-09-23T14:23 → 2026-10-14T23:06), IDENTIQUES dans une base jetable   (code 0)

import dans une base jetable, puis relecture réécrite comme le fait ecrire_jsonl_historique :
  points décodés identiques : True
  octet pour octet avec le fichier du 132 : True   (154 121 = 154 121 octets)
  heures portant plusieurs points : 7 (« id » est bien la clé, « t » ne l'est pas)
  import 0,099 s / relecture 0,005 s · volume : 11 520 points importés en 0,14 s, relus en 0,04 s

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:82 attend « 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 de origin/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 sur origin/main propre (« le JSON doré n'est plus la sortie de Python »). Ces deux rouges sont hérités de main, 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:427 et :680 ouvrent HISTO) : 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_historique attrape un refus du service (400 sur un champ inconnu de la table) avec le même except qu'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 6e7a394c est encore en attente (les quatre checks sont « Waiting to run »), et le job Front Svelte y sera rouge pour le banc hérité de main (point 5). fusion-auto ne fusionnera donc pas tant que le banc front de main n'est pas réparé (PR #1688). Le contenu livré, lui, est conforme et complet.

Relecture du 2026-10-15 (tête `6e7a394c`, base `main` `86345ae7`) — **Relu, conforme**, étiquette `relu` posé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 mon `git diff origin/main...HEAD` ont 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 des `test result`), 0 `FAILED`. **3. Les bancs du changement, tous code 0.** $ python3 controle/test_etat_partage.py ok 8 : historique — essai IDENTIQUES, ligne illisible refusée sans rien écrire, champ inconnu refusé en le nommant, bascule (.bak-sqlite gardé, copie réécrite octet pour octet depuis la base), écriture pendant la bascule rendue par le retour arrière, re-bascule, purge refusée sur une limite vide ; volume : 5000 points (3.2 Mo) importés en 0.2 s, relus en 0.1 s TOUT PASSE $ python3 _infra/test_etat_service.py → OK (les 5 routes de l'historique, les 400) $ python3 _tableau/test_collecte.py → OK $ python3 _tableau/test_garde_plafond.py / test_garde_doublons.py / test_garde_couches.py → ok **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, md5 `a7aa0a29e9e4383d2e5aebdc5b6a43a7`. Mesuré sur cette copie, pas sur des données de banc : $ ETAT_HISTORIQUE=…/historique-132.jsonl python3 etat_client.py basculer historique --essai comparaison … : 294 points (2026-09-23T14:23 → 2026-10-14T23:06), IDENTIQUES dans une base jetable (code 0) import dans une base jetable, puis relecture réécrite comme le fait ecrire_jsonl_historique : points décodés identiques : True octet pour octet avec le fichier du 132 : True (154 121 = 154 121 octets) heures portant plusieurs points : 7 (« id » est bien la clé, « t » ne l'est pas) import 0,099 s / relecture 0,005 s · volume : 11 520 points importés en 0,14 s, relus en 0,04 s **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:82` attend `« 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 de `origin/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 sur `origin/main` propre (« le JSON doré n'est plus la sortie de Python »). Ces deux rouges sont hérités de `main`, 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:427` et `:680` ouvrent `HISTO`) : 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_historique` attrape un refus du service (400 sur un champ inconnu de la table) avec le même `except` qu'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 `6e7a394c` est encore en attente (les quatre checks sont « Waiting to run »), et le job Front Svelte y sera rouge pour le banc hérité de `main` (point 5). `fusion-auto` ne fusionnera donc pas tant que le banc front de `main` n'est pas réparé (PR #1688). Le contenu livré, lui, est conforme et complet.
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é.
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/migration-historique-sqlite from 6e7a394cc0
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 27s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Failing after 11s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 26s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 10s
to c0864a9c55
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 2m5s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m45s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 11m3s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 11m3s
2026-10-16 03:48:05 +02:00
Compare
Author
Collaborator

Rebasé sur main (a6f78cc7, 2026-10-16). 12 fichiers en conflit, aucun apport de cette branche perdu : chaque
conflit a gardé les DEUX côtés (les fonctions et les routes de la branche plus ce que main a 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 deux
    ajouts conservés (les historique* de la branche à côté de choix_vignettes/atelier/reseaux-file de
    main). Doc de LXC-132.md corrigée : plus aucun fichier d'état n'est hors de la base (la phrase parlait
    encore de historique.jsonl comme prochain fichier).
  • etat_client.py : basculer/revenir/NOMS portent historique en plus des noms ajoutés par main.
  • etat_partage.py : le helper de l'historique a été renommé _valeur_point (celui de main s'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 main réparé au passage : la liste des tables attendues par le banc (section 9b) ne
mentionnait ni choix_vignettes (table arrivée avec la migration de la file du 2026-10-14, PR #1689) ni
historique — le banc était rouge sur main pour cette raison, et l'aurait été ici aussi. Vérifié :

python3 controle/test_etat_partage.py   # TOUT PASSE, 19 lignes ok, EXIT=0
ok 11 : historique — essai IDENTIQUES, ligne illisible refusée sans rien écrire, champ inconnu refusé en
le nommant, bascule (.bak-sqlite gardé, copie réécrite octet pour octet depuis la base), écriture pendant
la bascule rendue par le retour arrière, re-bascule, purge refusée sur une limite vide ; volume : 5000
points (3.2 Mo) importés en 0.1 s, relus en 0.1 s
TOUT PASSE

Porte complète du tableau (python3 _tableau/lancer-tests.py --tout) : « BILAN — 210 verts, 1 rouge, 1
banc(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 dur
du 2026-10-15, donc il est rouge sur main aussi — vérifié dans un arbre détaché sur origin/main, même
écart. Rien à voir avec cette branche.

_infra/test_etat_service.py      → exit 0
_tableau/test_collecte.py        → OK : collecte.py exerce de bout en bout, sans une seule requete reseau
controle/bancs_concernes.py sur le diff → 108 bancs concernés, exit 0

Aucun champ de /api/... changé : le front Svelte n'a rien à reprendre.

Rebasé sur `main` (`a6f78cc7`, 2026-10-16). 12 fichiers en conflit, aucun apport de cette branche perdu : chaque conflit a gardé les DEUX côtés (les fonctions et les routes de la branche plus ce que `main` a 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 deux ajouts conservés (les `historique*` de la branche à côté de `choix_vignettes`/`atelier`/`reseaux-file` de `main`). Doc de `LXC-132.md` corrigée : plus aucun fichier d'état n'est hors de la base (la phrase parlait encore de `historique.jsonl` comme prochain fichier). - `etat_client.py` : `basculer`/`revenir`/`NOMS` portent `historique` en plus des noms ajoutés par `main`. - `etat_partage.py` : le helper de l'historique a été renommé `_valeur_point` (celui de `main` s'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 `main` réparé au passage : la liste des tables attendues par le banc (section 9b) ne mentionnait ni `choix_vignettes` (table arrivée avec la migration de la file du 2026-10-14, PR #1689) ni `historique` — le banc était rouge sur `main` pour cette raison, et l'aurait été ici aussi. Vérifié : python3 controle/test_etat_partage.py # TOUT PASSE, 19 lignes ok, EXIT=0 ok 11 : historique — essai IDENTIQUES, ligne illisible refusée sans rien écrire, champ inconnu refusé en le nommant, bascule (.bak-sqlite gardé, copie réécrite octet pour octet depuis la base), écriture pendant la bascule rendue par le retour arrière, re-bascule, purge refusée sur une limite vide ; volume : 5000 points (3.2 Mo) importés en 0.1 s, relus en 0.1 s TOUT PASSE Porte complète du tableau (`python3 _tableau/lancer-tests.py --tout`) : « BILAN — 210 verts, 1 rouge, 1 banc(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 dur du 2026-10-15, donc il est rouge sur `main` aussi — vérifié dans un arbre détaché sur `origin/main`, même écart. Rien à voir avec cette branche. _infra/test_etat_service.py → exit 0 _tableau/test_collecte.py → OK : collecte.py exerce de bout en bout, sans une seule requete reseau controle/bancs_concernes.py sur le diff → 108 bancs concernés, exit 0 Aucun champ de `/api/...` changé : le front Svelte n'a rien à reprendre.
Author
Collaborator

CI verte sur c0864a9c : Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) success en 11m03s et Front Svelte success en 2m05s (pull_request et push, les quatre statuts). Fusionnée dans main le 2026-10-16 à 04h00 (merge 9331aac3).

CI verte sur `c0864a9c` : `Tests du tableau (Rust + Svelte) / Rust (_tableau/rust)` `success` en 11m03s et `Front Svelte` `success` en 2m05s (pull_request et push, les quatre statuts). Fusionnée dans `main` le 2026-10-16 à 04h00 (merge `9331aac3`).
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!1691
No description provided.