Files
decision/actes/2026-10-30-m1-mise-en-ligne.md
T

9.8 KiB

Acte — Mise en ligne M1 (revue du 30/10 : entrée, DA, menu, listes, Raison d'être, versions)

Classe : déploie Projet : libreDecision Date : 2026-10-30 État : EXÉCUTÉ — armé le 30/10/2026 à 15 h 29 par Yvv (« pousse déploie »), sur 8727315, relecture « 8727315 : ok » inscrite

Intention

Mettre en ligne sur decision.librodrome.org les points L1 à L8 de la revue d'Yvv du 30/10 (tableau du chantier) :

  • accueil qui ouvre directement sur le choix du groupe, avec le leitmotiv en trois lignes ;
  • logo « Clé de voûte » et quatre ambiances ;
  • page de groupe avec les quatre piliers et « En cours » ;
  • menu avec le nombre de docs, les « À venir » des outils et Décisions, une ligne par doc ;
  • « Raison d'être » à la place du Préambule ;
  • une seule ligne par article dans la liste, même avec plusieurs versions.

Maintenant, parce que ces points ne dépendent d'aucune question ouverte, et qu'il vaut mieux livrer petit (le vote, M2, viendra ensuite).

Ce qui part

Version : 8727315 (branche chantier/acte-certification), qui contient la version en production dc2de09. Commits emportés (git log --oneline dc2de09..8727315) :

  • les fusions des lots R (68115fb) et A (8727315) ;
  • lot R : a5b92fa (Raison d'être, amendement de seed gardé), edc8811 (versions groupées), 1503e57 (ordre stable des variantes), c223c5c (contrôles) ;
  • lot A : c640413 (Décisions et « À venir » côté serveur), 81b604e (entrée, logo, ambiances, menu, pages d'outil), 1e04336 (nom accessible du menu) ;
  • documents : HANDOFF, tableau, note docs/recherche/vote-g1-chaine.md.

Aucune configuration ni aucun secret ne change : docker/app-compose.yml et .woodpecker/ sont identiques à ceux de dc2de09 (prémisse 4).

Ce que l'acte écrit dans la base de production (donnée runtime)

  • La migration 0004 ajoute la table seed_amendments. Elle est additive : rien n'est supprimé ni réécrit.

  • L'amendement « 2026-10-30-i1-raison-d-etre » remplace le Préambule par la Raison d'être, dans Monnaie libre et dans le groupe d'essai, seulement si l'article est intact :

    • texte de départ, en vigueur sans vote, jamais confirmé ;
    • révision 1, 0 vote, aucune correction ;
    • aucune traduction écrite par un membre, aucun signalement ;
    • texte identique au Préambule du seed.

    Sinon, il ne touche à rien et journalise la raison. Il consigne chaque décision dans seed_amendments et ajoute à l'historique de l'article la ligne « texte de départ remplacé » avec son diff. Il met une republication en file, pour Monnaie libre seulement.

  • État de la production lu le 2026-10-30 à 13 h 43, sur une copie de la base :

    • le Préambule est intact dans les deux groupes : 0 vote, révision 1, traductions du seed, aucun signalement ;
    • il y a une identité (invitation) et aucun vote en tout ;
    • deux propositions d'inertie ouvertes, d'Yvv le 29/10, n'en sont pas touchées.
  • Répétition faite sur cette copie avec le serveur de 8727315 : démarrage sans erreur, puis « seed amendment applied » pour l'essai et pour Monnaie libre. Le titre est devenu « Raison d'être », en révision 2. La file d'envoi contient « texte de départ remplacé : I1 » pour Monnaie libre seulement.

Avant — prémisses vivantes

  1. La production sert dc2de09 : curl -s https://decision.librodrome.org/api/health → "build":"dc2de09…".

  2. prod/main et origin/main sont à dc2de09 : git fetch prod && git fetch origin && git rev-parse --short prod/main && git rev-parse --short origin/main → dc2de09 deux fois (vérifié le 2026-10-30 à 14 h, avec la santé "build":"dc2de094").

  3. La relecture de 8727315 est inscrite « ok » dans ~/harness/etat/relectures.json ; et à la question « une autre relecture de ce code est-elle en cours ? », la réponse est non.

  4. Rien ne change la configuration : git diff --stat dc2de09 8727315 -- docker/app-compose.yml .woodpecker/ .env* data/ → vide.

  5. La boucle est verte sur 8727315 : fait le 2026-10-30 (91 tests Rust, svelte-check 0 avertissement, 16 vitest, e2e 20 / 20), et l'image de production se construit (docker build --target production, sortie 0, seeds/upcoming/ présent dans l'image).

  6. Le Préambule est toujours intact en production, sans proposition de texte rivale. Sur une copie fraîche de la base (docker exec lpk-libredecision-app cat /data/libredecision.db* vers /tmp/ld-prod-copie/, lecture seule), la requête suivante :

    SELECT d.group_slug, p.kind, p.status, p.origin,
           (SELECT COUNT(*) FROM votes v WHERE v.proposal_id=p.id),
           (SELECT group_concat(kind) FROM revisions r WHERE r.proposal_id=p.id)
    FROM proposals p JOIN units u ON u.id=p.unit_id JOIN documents d ON d.id=u.doc_id
    WHERE u.code='I1';
    

    doit rendre, comme le 30/10 à 13 h 43 :

    • monnaie-libre|text|in_force|seed|0|initial ;
    • monnaie-libre|inertia|open|member|0|initial, la proposition d'Yvv du 29/10 ;
    • essai|text|in_force|seed|0|initial.

    Toute autre ligne text ou remove arrête l'acte : la relecture a montré que l'amendement ne regarde pas les propositions rivales.

Commandes exactes

cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod 8727315:main
git push origin 8727315:main
git push origin chantier/acte-certification

Le pipeline Woodpecker (dépôt LPK/decision, ci.open.us.org) construit l'image (qui rejoue la boucle), garde la version en service sous libredecision-app:previous, déploie, et revient seul à la version précédente si le contrôle d'après déploiement échoue.

Effet attendu

Les visiteurs de decision.librodrome.org voient la nouvelle entrée, le logo, les ambiances, le menu, les pages d'outil, Décisions, la Raison d'être et les versions groupées. Le dépôt des textes reçoit un commit : la Raison d'être en fr, en et es, dans monnaie-libre/acte-engagement-certification/.

Irréversibilité : partielle. Le code se remet en arrière. Le remplacement du Préambule reste en base, et le commit du dépôt des textes reste publié.

Vérifications après

  • curl -s https://decision.librodrome.org/api/health → "build":"8727315…".
  • curl -s https://decision.librodrome.org/ | grep -c 'favicon' ≥ 1, et la page répond 200.
  • ssh sonic 'docker logs lpk-libredecision-app 2>&1 | grep "seed amendment"' → deux lignes « applied » (essai, monnaie-libre).
  • Dans /acces → Publication : « Dernière publication » datée du jour, sans envoi en attente.
  • À l'écran (Yvv) : l'accueil ouvre sur les groupes ; Monnaie libre montre les quatre piliers et l'Acte d'engagement ; la Raison d'être ouvre le texte ; « Connaissance suffisante » tient une ligne avec « 2 versions ».

Retour

  • Le code : pousser l'ancienne tête rejoue le pipeline avec la version précédente.

    git push --force-with-lease=main:8727315 prod dc2de09:main
    

    C'est une réécriture de branche : elle demande le mot « déploie » pour ce retour précis. Plus rapide, sur sonic : docker tag libredecision-app:previous libredecision-app:latest, puis cd /opt/libredecision-app && docker compose up -d --force-recreate. L'ancienne version démarre sur la base migrée (la table ajoutée ne la gêne pas). Elle affiche la clé brute « history.amendment » dans l'historique de I1. Elle mesure les coquilles de I1 contre le Préambule, ce qui a deux effets :

    • une vraie coquille sur la Raison d'être est refusée ;
    • n'importe quel membre peut ramener le Préambule par une « coquille », qui serait alors publiée. La relecture l'a prouvé.

    Un retour de code se fait donc au plus court, puis on revient sur une version corrigée. Tant qu'il dure, on surveille l'historique de I1.

  • La Raison d'être en base : pas de retour automatique. Revenir au Préambule demanderait un amendement inverse, écrit et relu comme celui-ci.

  • Le commit publié dans le dépôt des textes : IMPOSSIBLE à retirer sans réécrire l'historique de ce dépôt (geste « supprime »). On publierait par-dessus.

Exécution

Acte exécuté le 30/10/2026, 15h29-15h52, par orch (session libreDecision), sur le mot d'Yvv « pousse déploie ».

  • Prémisses revérifiées à 15 h 29 :
    • santé {"build":"dc2de094","ok":true} ;
    • prod/main et origin/main à dc2de09 ;
    • aucun écart de configuration ;
    • relecture inscrite ;
    • copie fraîche de la base : I1 rend exactement les trois lignes attendues.
  • Commandes : git push prod 8727315:main (dc2de09..8727315), git push origin 8727315:main (dc2de09..8727315), git push origin chantier/acte-certification (68111c3..1593e50), à 15 h 35.
  • Pipeline :
    • le site est injoignable un instant à 15 h 44 min 52 s ;
    • l'ancienne version répond encore à 15 h 45 min 09 s ;
    • {"build":"87273156","ok":true} à 15 h 45 min 45 s.
  • Vérifications :
    • santé 87273156 ;
    • / répond 200 et la page cite la favicon (4 occurrences) ;
    • journaux du conteneur, à 14:45:32Z :
      • seed amendment applied … group=essai unit="I1" ;
      • seed amendment applied … group=monnaie-libre unit="I1" ;
    • publication à 14:45:36Z : published doc=0a4c0663… commit="35864eb3dccebf8c7e38accb69107fa3823f8ab4", la Raison d'être est publiée dans le dépôt des textes ;
    • maquette.decision.librodrome.org répond 200 ;
    • vérification à l'écran par Yvv (accueil, Monnaie libre, Raison d'être, versions groupées).
  • Image de retour : libredecision-app:previous (la version dc2de09), gardée par le pipeline.
  • Redémarrage à froid : celui du pipeline, qui recrée le conteneur (up --force-recreate). Aucun autre, il n'était pas au dossier.
  • Copies de la base de production (/tmp/ld-prod-copie, /tmp/ld-prod-recette) retirées du poste à 15 h 52.