241 lines
13 KiB
Markdown
241 lines
13 KiB
Markdown
# 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
|
||
|
||
```sh
|
||
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.
|