État partagé : le relevé de l'atelier passe dans la base SQLite (STUD-1110, t_56665067) #1683

Merged
hermes-fusion merged 2 commits from hermes/migration-atelier-sqlite into main 2026-10-15 19:15:05 +02:00
Collaborator

Carte : t_56665067 (kanban atelier) — migrer /opt/studio/atelier.json vers SQLite, via bascule et retour arrière (STUD-1110).

Ce que la branche porte

  • Table atelier dans etat_partage.sql (une ligne par clé de premier niveau du relevé : cle, valeur encodée en JSON, maj) et le nom atelier accepté dans bascules.
  • etat_partage.py : atelier_lire(), atelier_detail(), atelier_remplacer(etat) (tout le relevé en une transaction ; une clé inchangée n'est pas réécrite).
  • _infra/etat-service.py : GET /atelier, GET /atelier/detail, POST /atelier/remplacer.
  • etat_client.py : atelier(), atelier_detail(), atelier_remplacer(), et basculer atelier [--essai] [--attendre <s>] / revenir atelier, avec la recette des sorties : comparaison JSON / base avant bascule, refus tant qu'un montage tourne, ancien gardé en .bak-sqlite-<date>, retour arrière en une commande. Chemin du fichier forçable par $ETAT_ATELIER.
  • _tableau/socle.py : atelier_ecrire(etat, chemin) — une fois la bascule faite, la base fait foi à l'écriture, et atelier.json reste la COPIE que pousser-atelier.sh recopie sur le 132.
  • _tableau/atelier.py : écrit le relevé par socle.atelier_ecrire et dit où il fait foi.

Ce qui n'est PAS changé : la lecture de la page du 132 (elle lit encore /opt/studio/atelier.json) ; aucune route /api/... n'est touchée, donc rien à signaler au front. Les tables sorties et file_montage non plus.

Bancs : _tableau/test_atelier_bascule.py (nouveau : essai, refus pendant un montage, .bak-sqlite, la base, la copie, les trois cas d'écriture, retour arrière puis re-bascule) ; _infra/test_etat_service.py (les trois routes) ; controle/test_etat_partage.py (les sorties, inchangées) ; _tableau/lancer-tests.py --tout : 163 bancs verts, 0 rouge, 0 lent. Preuves (commandes et sorties) en commentaire de la carte.

**Carte** : t_56665067 (kanban atelier) — migrer `/opt/studio/atelier.json` vers SQLite, via bascule et retour arrière (STUD-1110). **Ce que la branche porte** - Table `atelier` dans `etat_partage.sql` (une ligne par clé de premier niveau du relevé : `cle`, `valeur` encodée en JSON, `maj`) et le nom `atelier` accepté dans `bascules`. - `etat_partage.py` : `atelier_lire()`, `atelier_detail()`, `atelier_remplacer(etat)` (tout le relevé en une transaction ; une clé inchangée n'est pas réécrite). - `_infra/etat-service.py` : `GET /atelier`, `GET /atelier/detail`, `POST /atelier/remplacer`. - `etat_client.py` : `atelier()`, `atelier_detail()`, `atelier_remplacer()`, et `basculer atelier [--essai] [--attendre <s>]` / `revenir atelier`, avec la recette des sorties : comparaison JSON / base avant bascule, refus tant qu'un montage tourne, ancien gardé en `.bak-sqlite-<date>`, retour arrière en une commande. Chemin du fichier forçable par `$ETAT_ATELIER`. - `_tableau/socle.py` : `atelier_ecrire(etat, chemin)` — une fois la bascule faite, la base fait foi à l'écriture, et `atelier.json` reste la COPIE que `pousser-atelier.sh` recopie sur le 132. - `_tableau/atelier.py` : écrit le relevé par `socle.atelier_ecrire` et dit où il fait foi. **Ce qui n'est PAS changé** : la lecture de la page du 132 (elle lit encore `/opt/studio/atelier.json`) ; aucune route `/api/...` n'est touchée, donc rien à signaler au front. Les tables `sorties` et `file_montage` non plus. **Bancs** : `_tableau/test_atelier_bascule.py` (nouveau : essai, refus pendant un montage, `.bak-sqlite`, la base, la copie, les trois cas d'écriture, retour arrière puis re-bascule) ; `_infra/test_etat_service.py` (les trois routes) ; `controle/test_etat_partage.py` (les sorties, inchangées) ; `_tableau/lancer-tests.py --tout` : 163 bancs verts, 0 rouge, 0 lent. Preuves (commandes et sorties) en commentaire de la carte.
État partagé : le relevé de l'atelier passe dans la base SQLite (STUD-1110)
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 33s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 14s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Has been cancelled
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Has been cancelled
2a5064e8b4
Cause : `_tableau/atelier.json` (tickets Multica et étages des chaînes, que la page du 132 affiche) n'avait
qu'un foyer — un fichier réécrit d'un bloc par `_tableau/atelier.py`, puis recopié sur le 132 par
`_tableau/pousser-atelier.sh`. La base partagée ne le connaissait pas : il restait le seul des fichiers d'état
de la recette de STUD-1107 à vivre hors d'elle.

Remède : une table `atelier` (une ligne par clé de premier niveau du relevé, la valeur encodée en JSON) et le
nom `atelier` dans `bascules` ; `atelier_lire` / `atelier_detail` / `atelier_remplacer` dans `etat_partage.py` ;
les routes `GET /atelier`, `GET /atelier/detail` et `POST /atelier/remplacer` dans `_infra/etat-service.py` ;
`basculer atelier [--essai] [--attendre <s>]` et `revenir atelier` dans `etat_client.py`, avec la recette des
sorties : comparaison JSON / base avant bascule, refus tant qu'un montage tourne, ancien gardé en
`.bak-sqlite-<date>`, retour arrière en une commande.

Ce qui est écrit, et ce qui est lu. Passé la bascule, `socle.atelier_ecrire` (appelée par `_tableau/atelier.py`)
écrit le relevé dans la base, en une transaction, ET réécrit `atelier.json` : le fichier reste la COPIE que
`pousser-atelier.sh` recopie sur le 132, où la page le lit encore. La lecture n'a pas changé — une page qui
interrogerait le service dépendrait d'un 130 muet à chaque rendu, et `test_tableau_rendu.py` exige `None` sans
fichier. Un service muet est dit (`fichier-muet`), jamais tu.

Bancs : `_tableau/test_atelier_bascule.py` (essai, refus pendant un montage, `.bak-sqlite`, la base, la copie,
les trois cas d'écriture, retour arrière puis re-bascule) ; `_infra/test_etat_service.py` couvre les trois
nouvelles routes ; `_tableau/test_atelier.py` ne parle à aucun réseau (`STUDIO_ETAT_URL=local`).
hermes-bot force-pushed hermes/migration-atelier-sqlite from 2a5064e8b4
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 33s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 14s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Has been cancelled
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Has been cancelled
to 219236fb0e
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 23s
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 21s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 11s
2026-10-14 23:58:45 +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é.
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-atelier-sqlite from 219236fb0e
Some checks failed
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 23s
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 21s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Failing after 11s
to ac4a4086b1
All checks were successful
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (push) Successful in 1m44s
Tests du tableau (Rust + Svelte) / Front Svelte (_tableau/front) (pull_request) Successful in 1m47s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (push) Successful in 9m20s
Tests du tableau (Rust + Svelte) / Rust (_tableau/rust) (pull_request) Successful in 8m37s
2026-10-15 18:46:24 +02:00
Compare
Author
Collaborator

Rebasage et mise a niveau (carte t_cae61d7e).

La branche etait a 221 commits de main. Conflits resolus en gardant les DEUX
cotes quand main a ajoute du code au meme endroit (etat_partage.sql,
etat_partage.py, etat_client.py, _tableau/socle.py, _infra/etat-service.py,
OUTILS.md, LXC-132.md) : la version de la branche seule perdait les tables
sujets* de main, celle de main seule perdait la table atelier. Deux
references perimees corrigees dans la doc ajoutee : le service d'etat ne tourne
plus sur l'hote du LXC 130 (il est sur le 132 depuis #1740), et le banc est
_tableau/test_atelier_bascule.py.

La couverture baissait par cette branche : mesure 99,128 % (14211/14336) contre
99,139 % (14166/14289) sur main. Deux lignes n'etaient exercees par aucun banc :
socle.atelier_bascule sans client d'etat (etat_client.py absent), et la note
« fichier-muet » qu'atelier.py ecrit sur la sortie d'erreur. Les deux cas sont
maintenant dans les bancs (sans client, l'ancien fichier fait foi ; service muet,
c'est dit).

Mesure locale, lanceur complet : python3 _tableau/lancer-tests.py --tout ->
202 bancs verts, aucun refus de cliquet de couverture. La CI le confirme ou le
dement.

Rebasage et mise a niveau (carte t_cae61d7e). La branche etait a 221 commits de main. Conflits resolus en gardant les DEUX cotes quand main a ajoute du code au meme endroit (`etat_partage.sql`, `etat_partage.py`, `etat_client.py`, `_tableau/socle.py`, `_infra/etat-service.py`, `OUTILS.md`, `LXC-132.md`) : la version de la branche seule perdait les tables `sujets*` de main, celle de main seule perdait la table `atelier`. Deux references perimees corrigees dans la doc ajoutee : le service d'etat ne tourne plus sur l'hote du LXC 130 (il est sur le 132 depuis #1740), et le banc est `_tableau/test_atelier_bascule.py`. La couverture baissait par cette branche : mesure 99,128 % (14211/14336) contre 99,139 % (14166/14289) sur main. Deux lignes n'etaient exercees par aucun banc : `socle.atelier_bascule` sans client d'etat (`etat_client.py` absent), et la note « fichier-muet » qu'`atelier.py` ecrit sur la sortie d'erreur. Les deux cas sont maintenant dans les bancs (sans client, l'ancien fichier fait foi ; service muet, c'est dit). Mesure locale, lanceur complet : `python3 _tableau/lancer-tests.py --tout` -> 202 bancs verts, aucun refus de cliquet de couverture. La CI le confirme ou le dement.
hermes-fusion deleted branch hermes/migration-atelier-sqlite 2026-10-15 19:15:05 +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!1683
No description provided.