Files
decision/actes/2026-10-31-m4-vote-modules-objections.md
T

13 KiB
Raw Blame History

Acte — Mise en ligne M4 (le vote, l'inertie à cinq crans, les modules d'ordre et de titre, les objections, les coquilles validées)

Classe : déploie Projet : libreDecision Date : 2026-10-31 État : EXÉCUTÉ le 01/11/2026 (armé par Yvv : « déploie. », le 01/11 vers 22 h 50) — figé le 2026-10-31 à 10 h 47 sur 4d4adcc 74f96be, 9c8f4cc, cd7e683, 924a40d, 033b331, 4d4adcc

Intention

Mettre en ligne en une fois le reste de la revue d'Yvv du 30/10, L9 à L13 :

  • L9 : le vote déplié et groupé ; le vote par la chaîne, corrigé (B2) mais livré éteint ;
  • L10 : l'inertie à cinq crans ;
  • L11 : l'ordre des articles en fin de section (cran 2) et le titre du document en module (cran 4) ;
  • L12 : les objections « redit » et « contredit » ;
  • L13 : les coquilles validées par leur auteur, la boîte « Messages », le délai de 3 jours.

Cet acte remplace les dossiers M2 (actes/2026-10-31-m2-vote.md, figé sur 74f96be) et M3a (actes/2026-10-30-m3-inertie-cinq-crans.md, figé sur 71819f9). 4d4adcc contient l'un et l'autre, et ce que M2 et M3a écrivent en base est repris ici. Si M2 ou M3a est armé avant celui-ci, cet acte reste valable : seules les migrations manquantes s'appliquent (prémisse 1).

Le vote par la chaîne reste éteint : LD_VOTE_ACCOUNT n'est pas posé. Yvv doit encore trancher :

  • le secret du vote face aux totaux en direct (Q8) ;
  • le commentaire scellé (Q5) ;
  • l'extension (Q6) ;
  • le compte de vote (Q7).

Dans Monnaie libre, l'écran dit pourquoi on ne vote pas encore. Dans le groupe d'essai, tout marche côté serveur.

Ce qui part

Version : 4d4adcc, qui contient la version en production 8727315. Lots et relectures :

Lot Commits Relecture
C (cinq crans) a576b68, 71819f9 « ok » ×2
B (vote) 74f96be « ok »
B2 (corrections du vote) 7ffa4fd « à reprendre », repris en 9c8f4cc
F (objections, coquilles, messages) cd7e683 « ok », avec 9c8f4cc et 924a40d
D (modules) et sa fusion 033b331 « ok », avec 4d4adcc
Corrections M1–M4 de la relecture de F 4d4adcc « ok », avec 033b331

Ce qui change hors du code (vérifié le 31/10 à 10 h 10) :

  • docker/app-compose.yml reçoit trois lignes de commentaire (où poser LD_VOTE_ACCOUNT), et rien d'autre ;
  • seeds/acte-engagement-certification.json passe aux crans et décrit les modules. Il n'est lu que pour une base neuve : un document qui existe en base n'est jamais réinstancié ;
  • aucun fichier .env, .db, clé ou secret.

Nouvelles dépendances (celles de M2) : polkadot-api, chargé seulement au moment de signer ; uqr ; la crate blake2.

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

  • Migrations 0005 à 0008, additives :
    • 0005 : les crans, avec les anciens mots gardés ;
    • 0006 : les tables du vote, vides ;
    • 0007 : units.kind et le journal module_amendments ;
    • 0008 : les objections, les coquilles et les messages, et index ; en production, aucun signalement à convertir (0 le 31/10 à 06 h 58).
  • Ajouts gardés, journalisés, une seule fois :
    • E1 et E2 au cran 4, dans les deux groupes (4 lignes) ;
    • un module titre (cran 4) et un module d'ordre par section (cran 2, 8 sections) par document, soit 18 modules, chacun avec sa version en vigueur, l'état présent.
  • La mesure de participation dans settings.
  • La republication de Monnaie libre : trois publications en file (crans E1 et E2, modules) ; rien pour le groupe d'essai.
  • Aucun article, aucun vote, aucune proposition existante n'est touché.

Répétition faite le 31/10 de 10 h 02 à 10 h 06, avec le serveur de 4d4adcc (target/debug), sur une copie fraîche de la base de production (la santé disait 87273156), sans publication configurée. Avant et après la montée :

Avant Après
Migrations 1–4 1–8
Unités 66 articles standard 66 articles (62 au cran 3, 4 au cran 4), 16 ordres au cran 2, 2 titres au cran 4
Propositions d'article 6 en vigueur, 66 ouvertes 6 en vigueur, 64 textes ouverts et 2 propositions d'inertie ouvertes (les mêmes 72)
Modules — 18, en vigueur
Révisions 74 92
Traductions 140 144
Votes, adoptions, signalements 0, 0, 0 0, 0, 0
Identités 1 1

Ce que montrent les journaux :

  • 4 lignes « inertia amendment applied » et 2 lignes « modules added » ;
  • dans la file : 3 publications, toutes pour le document de Monnaie libre ;
  • integrity_check ok, foreign_key_check vide.

Un second démarrage ne rejoue rien : mêmes comptes, journaux 4 / 2, file à 6.

Avant — prémisses vivantes

  1. La production sert 8727315 : curl -s https://decision.librodrome.org/api/health → "build":"87273156". Si elle sert 71819f9 (M3a) ou 74f96be (M2), l'acte reste valable.
  2. git fetch prod && git fetch origin && git rev-parse --short prod/main && git rev-parse --short origin/main → la même version que la santé, deux fois.
  3. Dans ~/harness/etat/relectures.json, ces relectures sont inscrites « ok » : a576b68, 71819f9, 74f96be, 9c8f4cc, cd7e683, 924a40d, 033b331, 4d4adcc. Aucune autre relecture de ce code n'est en cours.
  4. git diff 8727315 4d4adcc -- docker/ .woodpecker/ .env data/ ne montre que les trois lignes de commentaire sur LD_VOTE_ACCOUNT. Sur sonic, grep -c LD_VOTE_ACCOUNT /opt/libredecision-app/secrets.env → 0, ou fichier absent.
  5. La boucle est verte sur 4d4adcc : faite le 31/10 vers 10 h (230 tests Rust, svelte-check sans avertissement, 55 vitest, e2e 35 / 35). L'image de production se construit : docker build -f docker/app.Dockerfile --target production ., sortie 0 le 31/10 à 10 h 09 (tests rejoués dans l'image : Rust verts, 55 vitest).
  6. Sur une copie fraîche de la base de production, juste avant la poussée :
    • SELECT group_concat(version) FROM _sqlx_migrations → 1,2,3,4 (ou plus si M2 / M3a est en ligne) ;
    • SELECT COUNT(*) FROM votes → 0 ;
    • SELECT COUNT(*) FROM signals → 0. Cette prémisse compte : deux signalements debout d'une même personne sur une même paire feraient échouer la migration 0008 (index signals_one_standing, relecture de 033b331+4d4adcc). Le serveur ne démarrerait pas, et Woodpecker relancerait 8727315 sans aucun module, sans dégât.

Commandes exactes

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

Effet attendu

Les visiteurs voient :

  • l'inertie en crans et les réglages de la formule ;
  • « Le vote » qui se déplie sous l'article, « Voter en lot », « Voter cette section », et le panier ;
  • l'ordre des articles en fin de section, et le titre du document qui se vote ;
  • « Faire une objection » (redit, contredit), la boîte « Messages », les coquilles proposées ;
  • dans Monnaie libre, la raison pour laquelle on ne vote pas encore.

E1 et E2 passent au cran 4. Le dépôt des textes reçoit un document.json qui porte les crans et les modules.

Irréversibilité : partielle. Le code se remet en arrière. Ce qui reste :

  • les crans en base, avec les mots d'origine à côté ;
  • les 18 modules ;
  • les tables nouvelles, vides ou presque ;
  • les commits publiés dans le dépôt des textes.

Vérifications après

  • curl -s https://decision.librodrome.org/api/health → "build":"4d4adcc…", les huit premiers caractères de l'empreinte.
  • ssh sonic 'docker logs lpk-libredecision-app 2>&1 | grep -E "inertia amendment|modules added|participation measured|published|ERROR"' → quatre « inertia amendment applied », deux « modules added », les mesures, des publications, aucune erreur.
  • Redémarrage à froid (cd /opt/libredecision-app && docker compose restart), puis les mêmes journaux : aucun ajout rejoué.
  • À l'écran (Yvv) :
    • Monnaie libre → Acte d'engagement : en fin de section, l'ordre des articles ; « Le vote » sous la Raison d'être dit que le vote par la chaîne n'est pas encore ouvert ;
    • la boîte « Messages » s'ouvre depuis le menu ;
    • dans le groupe d'essai : voter « Pour » sous un article ; le panier groupe une section ; « Faire une objection » dans « Détails » d'une proposition.

Retour

  • Le code, au plus court, sur sonic : docker tag libredecision-app:previous libredecision-app:latest, puis cd /opt/libredecision-app && docker compose up -d --force-recreate.

  • Revenir à 8727315 une fois les modules créés abîme l'affichage et la publication (relecture de 033b331+4d4adcc, prouvé sur une base faite par 8727315). open_db tolère les migrations inconnues, mais l'image ancienne lit toute la table units :

    • le titre et les ordres apparaissent comme 9 faux articles par document (un titre au corps vide, des listes d'identifiants), comptés « en vigueur » et « à voter » ;
    • à son démarrage, elle republie Monnaie libre avec eux (publish::resync) ;
    • elle lit les crans « 3 » et « 4 » comme standard, ce qui est sans effet tant qu'il n'y a aucun vote.

    Ce retour peut aussi venir seul : l'étape retablir de .woodpecker/app.yml relance libredecision-app:previous si la nouvelle version ne répond pas dans les 10 minutes.

    Conduite retenue par défaut (Yvv peut la corriger) :

    • on ne revient pas à la main vers 8727315 : on corrige en avant, par un nouveau déploiement ;
    • si retablir joue, on laisse 8727315 servir le temps de corriger. La publication fausse ne perd rien : elle part dans le dépôt des textes provisoire, et le déploiement suivant republie le bon texte par-dessus. Le contexte : 1 identité et 0 vote en production.
  • Les crans, les modules, les tables nouvelles : pas de retour automatique. Ils sont additifs, ou gardent l'ancien mot à côté.

  • Les commits publiés dans le dépôt des textes : on ne les retire pas sans réécrire l'historique de ce dépôt, ce qui serait un acte « supprime ». On publierait par-dessus.

Exécution

Acte exécuté le 01/11/2026, 22h52-23h40, par orch (session libreDecision), armé par Yvv dans cette session (« déploie. »).

Écart au dossier : seule git push prod 4d4adcc:main est partie. Les deux poussées vers origin (4d4adcc:main et chantier/acte-certification) relèvent de « pousse », absent du message d'armement ; elles attendent ce mot. Leçon : un dossier « déploie » ne liste que la poussée qui met en ligne. Une poussée vers origin est un acte « pousse » à part.

Prémisses revérifiées de 22 h 52 à 22 h 53 :

  1. santé 87273156 ;
  2. prod/main = origin/main = 8727315 ;
  3. les huit relectures inscrites « ok », aucune autre en cours ;
  4. trois lignes de commentaire seulement dans docker/, .woodpecker/, .env et data/ ; secrets.env absent sur sonic ;
  5. boucle et image du 31/10, inchangées depuis ;
  6. sur une copie fraîche : migrations 1,2,3,4, 0 vote, 0 signalement, 1 identité, 72 propositions. La copie a été retirée aussitôt.

Mise en ligne :

  • 22 h 53 : git push prod 4d4adcc:main → 8727315..4d4adcc 4d4adcc -> main ;
  • 23 h 06 : la santé répond {"build":"4d4adcc2","ok":true} ; elle répondait 87273156 jusqu'à 22 h 54.

Journaux du démarrage (22 h 06 UTC) :

  • 4 lignes « inertia amendment applied » (E1 et E2, essai et Monnaie libre) ;
  • 2 lignes « modules added » ;
  • les mesures de participation (médiane absente, échantillon 0) ;
  • une publication, published … commit="12134cd49eccadbf25a157bffa8b627e869099e9", qui regroupe les trois mises en file ;
  • aucune ligne ERROR ni WARN.

Image de retour : libredecision-app:previous = sha256:625646c7e73d…, construite le 30/10 à 15 h 44 (8727315).

Redémarrage à froid (docker compose restart, 23 h 35) :

  • le serveur écoute en 4d4adcc2, RestartCount 0 ;
  • aucun ajout rejoué ;
  • la publication de reprise dit commit="unchanged".

La sonde de santé du script, faite de l'intérieur du conteneur, a échoué : l'image n'a ni wget ni curl. Le script s'est donc arrêté avant de se retirer ; je l'ai retiré à la main. La santé a été vérifiée de l'extérieur : 4d4adcc2.

Invariants sur une copie fraîche, après le redémarrage, identiques à la répétition du 31/10 à la ligne près :

  • migrations 1,…,8 ;
  • 62 articles au cran 3, 4 au cran 4, 16 ordres au cran 2, 2 titres au cran 4 ;
  • 90 propositions, dont les mêmes 72 d'article ;
  • 92 révisions, 144 traductions, 0 vote, 1 identité ;
  • journaux 4 et 2 ;
  • integrity_check ok, foreign_key_check vide.

Retirés, parce qu'ils portaient des données réelles : la copie de la prémisse 6, la copie d'après, la répétition /tmp/ld-repetition-m4 et le journal de construction.

Reste à l'écran pour Yvv : les vérifications « À l'écran » ci-dessus.