instagram-file.json — la file Instagram passe dans la base du service d'état #1685
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/migration-instagram-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?
Goal — migrer
/opt/studio/instagram-file.jsonvers SQLite, avec bascule et retour arrière (cartet_23952e31, recette de STUD-1107).Ce qui change
etat_partage.sql: tableinstagram_file— une ligne par Reel,rangpour garder l'ordre de la LISTE, un champ par colonne (chaine,compte,n,etat,quand,titre), pas de colonne fourre-tout JSON.quandest NULL ou vérifié deux fois (motif +strftime('%Y-%m-%d %H:%M', quand) IS quand) ;bascules.nomn'est plus une liste fermée mais un motif.etat_partage.py:instagram_lire,instagram_remplacer(tout ou rien ;majgardée si rien ne change),entree_instagram(champ inconnu REFUSÉ,nentier exigé),_reparer_bascules._infra/etat-service.py:GET /instagram,POST /instagram/remplacer.etat_client.py:instagram(),instagram_remplacer(),en_service(nom),basculer instagram-file [--essai],revenir instagram-file,instagram <fichier>; chemin réglé par$INSTAGRAM_FILE(défaut/opt/studio/instagram-file.json). Pas de verrou de montage : ce fichier n'a rien à voir avec le montage, et les montages tournent en continu._tableau/socle.py: la famille d'accès au service d'état —ETAT_URL,ETAT_DELAI,_reponse_etat,en_service(nom),lire_instagram(chemin, defaut)(base dès que la bascule est posée, sinon le fichier parlire_json; un objet là où la file est une LISTE rend le défaut). Elle vit dans le socle et pas danstb_commun.py: celui-ci porte le rendu et ne lit aucun fichier (son en-tête et celui du socle, mergés ce soir par #1611/#1617). Les trois lecteurs de la page (onglet_reseaux.py,tableau-bord.py,accueil_donnees.py) passent parsocle.lire_instagram;tb_commun.FILE_INSTAGRAMne bouge pas._reseaux/pousser-tableau.sh: la file entre dans la base à chaque passage quand la bascule est posée (rien d'autre n'est touché : le fichierreseaux-fileet son push restent ceux demain).controle/test_etat_partage.py(ok 9a/9b) et_tableau/test_onglet_reseaux.py(cas 10 : la base sert, le fichier ne sert plus ; service injoignable + fichier absent → vide ET c'est dit ; hors/opt/studioet sansSTUDIO_ETAT_URL, le service de production n'est jamais appelé).Ce que je n'ai pas fait
basculer/revenirrestent des gestes de l'opérateur._reseaux/instagram-file.pyn'est pas modifié : il écrit toujours_tableau/instagram-file.json, et c'estpousser-tableau.shqui verse la file dans la base (c'est la recette de la cartereseaux-file,t_b914b746).instagram-file.jsoncontinue d'être poussé au 132 même basculé : le service Rust y litfile_igpour/api/accueil(rust/service/src/main.rs,entree_accueil). Supprimer la copie demande de porter ce lecteur — hors de cette carte./api/...touchée : rien à changer côté front Svelte.hotspot:
etat_partage.sql/etat_partage.py/etat_client.py— les douze cartes de migration écrivent dans ces trois fichiers (donthermes/migration-reseaux-sqlite, PR #1682, ouverte). La seconde fusion aura à rebaser surbascules.nom,NOMSet les routes du service.Bancs (
python3 _tableau/lancer-tests.py --tout, tête1c9eb948) : 168 ok, 1 rouge, cliquet de couverture rouge. Mesurés identiques surmain(e7886778, copie de travail intacte) : 165 ok,_tableau/test_accueil_parite.pyrouge (« le JSON doré n'est plus la sortie de Python », cléscourbes,fin_seuil,seuil_heures_apres,monetisation— donc venu de #1680/#1636, pas d'ici), et le même cliquet (cœur 99.1 % < 99.4 %,ensemble 96.5 % < 99.0 %surmaincontre96.6 %sur cette branche, qui ajoute donc des lignes couvertes). Ni l'un ni l'autre ne fait partie de la CI.Preuve de bout en bout (vrai service HTTP sur une base jetable, vraie base SQLite, vrais lecteurs, sans doublure) : bascule
--essai→ « 1 entrées, IDENTIQUES dans la base du service », bascule posée, ancien gardé en.bak-sqlite-2026-10-15; le fichier renommé,lire_instagramrend le Reel de la base ; l'onglet Instagram rendu porte le titre de la base ; une écriture dans la base puisrevenirrend un fichier identique octet pour octet à celui du producteur et retire la bascule.CI — tête
1c9eb948(voir la section suivante) : la tâche Rust est verte (cargo test --release --locked+cargo build --release --locked, aucun avertissement) ; la tâche Front est rouge pour une panne demain— reproduction surmainintacte :npx vitest run→1 failed | 195 passed,tests/stockage.test.js(« attendu :4 volumes suivis, 2 en alerte, relevé à/ reçu :… relevé hier à 22 h 44», le banc dépend du jour où il tourne). La même tâche échoue surmain(run 281) et sur deux autres branches dans la même heure (runs 288, 289) ; elle est verte surhermes/banc-stockage-date(runs 290, 291), dont le correctif est en revue : PR #1688 (t_d6daf667), ouverte, en attente derelu. Cette branche ne touche à aucun fichier de_tableau/front/: dès que #1688 est fusionnée, un rebasage surmainsuffit à faire passer la tâche Front.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é.ed2ca385a86086157479fusion-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 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é.60861574795b7a0c68015b7a0c68014099bfabcc4099bfabcc1c9eb948fffusion-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é.Relecture — t_27c861ed, carte du relecteur.
Verdict : RELU, CONFORME. Étiquette
reluposée.Mesures (toutes rejouées par moi, sur la tête
1c9eb948, base mainae760c38) :Périmètre.
git diff --stat origin/main...HEAD: 14 fichiers, 544 insertions, 15 suppressions,aucun fichier de
_tableau/front/, rien de01-textes/à07-publication/, aucun binaire,aucun secret, aucun emoji dans les lignes ajoutées. La branche contient
origin/main.Bout en bout, service d'état HTTP RÉEL + base SQLite RÉELLE (jetables) sur la VRAIE file
_tableau/instagram-file.json(33 entrées) : essai → « 33 entrées dans le JSON, 33 dans une basejetable, IDENTIQUES » (code 0) ; bascule → base identique,
.bak-sqlite-2026-10-15gardé, fichierrenommé ;
socle.lire_instagramrend les 33 entrées alors que le fichier est absent (la page litla base) ;
revenir instagram-file→ fichier rendu IDENTIQUE octet pour octet à l'original(7 018 octets, sha256 c7d36713…), ligne de bascule retirée.
Onglet Instagram, même code de rendu, 33 entrées réelles servies du fichier puis de la base :
HTML IDENTIQUE (4 281 octets des deux côtés). Aucune fonction visible retirée, aucun onglet écrasé.
Contrainte
basculesrefaite : sans_reparer_bascules, l'insertion de « instagram-file » dans unebase d'avant le 2026-10-14 sort en
CHECK constraint failed: nom IN ('sorties','file_montage');avec, elle passe. Le banc 9b garde donc bien ce qu'il annonce.
Bornes du schéma mesurées : titre de 501 refusé, 500 accepté ;
etatvide ou de 201 refusé ;n = 0refusé ; « 2026-10-20 25:00 » refusé ;quandNULL accepté.controle/test_etat_partage.py: TOUT PASSE (ok 1 à ok 9b, dont 9a et 9b) ;_tableau/test_onglet_reseaux.py: OK (cas 10 inclus).Bancs officiels (
python3 _tableau/lancer-tests.py --tout) : 168 ok, 1 rouge(
_tableau/test_accueil_parite.py, JSON doré de l'Accueil), cliquet baissé (cœur 99,1 % < 99,4 %,ensemble 96,6 % < 99,0 %). Témoin sur
origin/mainae760c38SANS la branche : 168 ok, le MÊMErouge, cliquet baissé (cœur 99,1 % < 99,4 %, ensemble 96,7 % < 99,0 %). Les deux sont antérieurs à
cette branche.
Rust :
cargo test --release --locked= 77 essais dans 13 binaires, 0 échec ;cargo build --release --lockedaprès recompilation réelle : aucune sortie d'avertissement.npx vite build: code 0.CI : Rust verte (push 35 s, PR 33 s). Front rouge en 11 s — c'est le banc de
main, pas de cettebranche :
npx vitest runsurorigin/maindonne le même unique échec(
tests/stockage.test.js, « relevé à » attendu contre « relevé hier à 22 h 44 »), et avec le diffde cette branche appliqué sur main à jour (
ae760c38, qui porte le correctif #1688 fusionné à01 h 10)
npx vitest runrend 27 fichiers / 200 essais TOUS VERTS. Il faut donc rebaser la branche(ou relancer la CI) pour que la tâche Front repasse au vert ; sans cela
fusion-autola refuserasur ce seul motif.
Deux points à savoir, qui ne s'opposent pas à la fusion :
Chemin de pousse.
_reseaux/pousser-tableau.sh(set -euo pipefail) écrit la file dans la basedès que la bascule est posée, avant de pousser au 132 : une entrée refusée par le schéma (titre
au-delà de 500,
etatvide, heure impossible) fait sortiretat_client.py instagramen 1 etarrête le script avant la pousse des deux JSON et la régénération de la page. L'échec est dit
(message + code 1), mais une seule entrée hors bornes prive le 132 de la mise à jour. La file
réelle est aujourd'hui dans les bornes (titre le plus long 93,
etat9,nde 1 à 19, aucunquandnul). Je n'ai pas lancépousser-tableau.sh(il déploie) : ce point est lu, pas mesuré debout en bout.
Production. Le service d'état (
192.168.1.142:8799) est injoignable depuis le PC en ce moment(
No route to host, mesuré) : la bascule de production n'est donc pas faite et la page du 132 litencore le JSON — rien à moitié appliqué. La suite : fusion, réinstallation du service (la route
GET /instagramn'existe pas encore sur le service en place), puisbasculer instagram-file.À l'ouverture suivante,
_reparer_basculesrefait la tablebasculesde la base de production(
main()du service appelleouvrir()avant d'écouter).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é.1c9eb948ff5099021ea0atelierfd63c1d6f669a8391f3dRebasage sur
main(tete69a8391f) : conflits resolus, gardes vertes.Conflits (les deux cotes gardes, main + branche) :
etat_partage.py,etat_partage.sql,etat_client.py,_infra/etat-service.py,_tableau/socle.py,_tableau/accueil_donnees.py,_tableau/tb_commun.py,_tableau/LXC-132.md,OUTILS.md,controle/test_etat_partage.py.Les gardes rouges du rebasage, corrigees (deux commits) :
socle.pyredéclaraiten_service/_reponse_etat, quemainporte deja -> copies retirees ;socle.pya 629 lignes (plafond de 600, sans derogation) ->lire_instagramsort dans le module_tableau/instagram_donnees.py(le socle garde la famille d'ACCESbascule_au_service/service_etat_appeler) ; les trois lecteurs, son banc et la doc suivent,socle.pyredescend a 599 ;test_garde_couches.pyet toute la suite : verts.Bench rouge sur
main, hors CI :controle/test_etat_partage.pyattendait une liste de tables sansatelier(table du schema, STUD-1110) -> ajoutee ; le banc ditTOUT PASSE.Mesures (arbre du rebasage) :
python3 _tableau/lancer-tests.py --tout->204 banc(s) verts.(code 0) ;python3 controle/test_etat_partage.py-> code 0,TOUT PASSE;python3 _tableau/test_deploy_132.py-> code 0 ;cargo test --release --locked-> tous les bancs verts ;cargo build --release --locked-> code 0.fusion-auto: pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.69a8391f3d7127cc30b0Rebasage sur le
maina jour (3d0c924a, « le statut public par video passe dans etat »). Tete :7127cc30.Cause du rouge precedent : mon arbre etait reste un cran derriere
main— la fusion8b16815ba retire laderniere derogation de couches et deplace
revue.statut_youtube; les trois gardes ne pouvaient que refuser(
derogation nouvelle « revue.statut_youtube » de atelier/at_onglet.py sans « accord »). Rebase sans conflitsur le
maina jour, les trois gardes repassent.Mesures (arbre rebase) :
python3 _tableau/lancer-tests.py --tout->206 banc(s) verts.(code 0) ;test_garde_couches,test_garde_doublons,test_garde_plafond->ok(code 0) ;controle/test_etat_partage.py->
TOUT PASSE(code 0). CI en cours sur7127cc30.Fusionnée automatiquement par
fusion-auto(forge) : CI verte, sans conflit.