Files
decision/actes/2026-11-03-m6-propositions-seed-quorum-tampon.md
T

173 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Acte — Mise en ligne M6 (Propositions seed, quorum par cran, tampon des votes et vote simulé, accueil sous la voûte)
Classe : déploie
Projet : libreDecision Date : 2026-11-03
**État : FIGÉ** le 03/11/2026 à 06 h 22 sur `94ddb17` (`94ddb175643c8d523a083bbfee3882f22b82f628`) — préparé par
l'intégrateur libredecision-d4 ; exécuté par orch (dev-63) sous son mandat (« déploie » et « pousse », du
03/11 au 08/11). Relecture indépendante : en cours (voir la prémisse 4).
## Intention
Mettre en ligne la revue d'Yvv du 02/11 et ses décisions du 02/11 et du 03/11 (registre) :
- **H** : l'accueil sous la voûte, les trois points sous l'arche, le titre centré en deux lignes
(`a3c0a76`) ;
- **S** : les Propositions seed (I1, E1, E2 ouvertes, au cran 2, ADR 0011), la publication suspendue sans
texte en vigueur, le quorum par cran (ADR 0013, `PUT /units/{id}/quorum`), la licence
`AGPL-3.0-or-later` (`349c8ed`) ;
- **V** : le tampon des votes (ADR 0012), le vote simulé partout tant que la chaîne est fermée, marqué
« simulé », qui compte puis s'efface par l'acte « supprime » ; la publication « pas avant des votes
prouvés » (`94ddb17`).
Hors de M6 : T (les articles du seed qui décrivent encore l'ancien plancher C : F1.1, F1.2, N1.1), puis U
(le lecteur) en M7. Yvv, à 06 h 07 : « J'ai retiré les propositions. tu peux livrer Decision. »
## Décisions d'Yvv que l'acte applique
- Propositions seed au cran 2 ; aucun article en vigueur au départ (02/11).
- Quorum par cran 12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 à l'essai ; l'auteur le change avant le
premier vote (02/11) ; sous le quorum, les votants manquants comptent comme « non » (03/11).
- Un vote simulé compte, puis s'efface à l'ouverture de la chaîne par un acte « supprime » (02/11).
- Q11 (03/11, « Pas avant des votes prouvés ») : un texte entré en vigueur par des votes simulés est en
vigueur sur le site, mais ne se publie pas. Règle stricte, confirmée par orch le 03/11 à 06 h 11 : rien
ne part tant qu'une entrée simulée ne tient pas sur les seuls votes prouvés.
- Q12 (03/11, « Oui, retire-les ») : les propositions d'inertie I1 → 5 et E1 → 5 retirées avant le
démarrage du nouveau serveur. **Fait par Yvv à l'écran, annoncé à 06 h 07** ; vu sur la copie de
06 h 11 (prémisse 2).
## Ce qui part
Version `94ddb17`, qui contient la version en ligne `3f10a0e` : 51 commits, 84 fichiers. Hors du code
(vérifié le 03/11 à 06 h 22) : rien dans `docker/`, `.woodpecker/`, `.env` ou `data/`, aucun fichier
sensible. Le seed JSON change (bases neuves seulement : un document seedé n'est jamais réinstancié).
## Ce que l'acte écrit dans la base de production (donnée runtime)
- **Migrations additives** `0009` (Propositions seed : `proposals.seed_featured`, la table
`seed_proposal_amendments`), `0010` (tampon : `ballots.mode` défaut `'chain'`, `ballot_lines.outcome`,
l'index `ballots_doc` ; aucune ligne réécrite), `0011` (quorums : `documents.quorums`, `units.quorum`,
la table `quorum_amendments`).
- **Amendement Propositions seed** (`2026-11-02-i1/e1/e2-proposition-seed`), par document et par article,
seulement si personne n'y a touché : la version passe d'en vigueur à ouverte et marquée ;
`units.in_force_id` à NULL ; une ligne `revisions` de type `seed_proposal` ; le cran à 2 avec une ligne
`inertia_changes`, si personne n'a touché au cran ; une ligne `seed_proposal_amendments` ; dans Monnaie
libre, une ligne `outbox`, qui attend.
- **Amendement quorums** (`2026-11-03-quorums-par-cran`), une fois par document : `documents.quorums`
là où il est NULL ; une ligne `quorum_amendments` ; une ligne `outbox` dans Monnaie libre.
- **Le tampon** : la première mise en route n'en écrit rien.
- **La publication** : suspendue (aucun article en vigueur, puis « pas avant des votes prouvés »). Le
dépôt des textes garde son dernier état.
- **Aucun vote, aucune identité, aucune autre proposition n'est touché.**
**Répétition faite le 03/11 de 06 h 21 à 06 h 22**, avec le serveur de `94ddb17` (binaire de la boucle),
sur une copie de la copie de production de 06 h 11 min 12 (santé `3f10a0e8`), publication vers un dépôt nu
local (`m6/repetition.sh`, scratchpad de l'intégrateur ; journal `m6/repetition.log`).
| | Avant | Après |
|---|---|---|
| Migrations | 1–8 | 1–11 |
| Propositions | inertie retirées 3 · ordres en vigueur 16 · textes en vigueur 6 · textes ouverts 64 · titres en vigueur 2 | inertie retirées 3 · ordres en vigueur 16 · textes ouverts 70 · titres en vigueur 2 |
| Unités en vigueur | essai 12 · Monnaie libre 12 | essai 9 · Monnaie libre 9 |
| I1, E1, E2 (deux groupes) | en vigueur, crans 3, 4, 4 | ouvertes, Propositions seed, cran 2, 2, 2 |
| Révisions | 101 | 107 |
| Traductions | 144 | 144 |
| `inertia_changes` | 4 | 10 |
| `seed_proposal_amendments` | absente | 6 lignes, statut et cran « applied » |
| `quorum_amendments` / `documents.quorums` | absentes | 2 lignes « applied » ; Monnaie libre `[12,12,50,50,50]`, essai `[1,1,1,1,1]` |
| File de publication (Monnaie libre) | 0 en attente, 13 faites | 4 en attente, 13 faites |
| Commits poussés vers le dépôt des textes (local) | — | 0 (« publication suspended … waiting=4 ») |
| Votes, bulletins, signalements, identités | 0, 0, 0, 1 | 0, 0, 0, 1 |
`integrity_check` ok, `foreign_key_check` vide, avant et après. Journal : six « seed proposal amendment …
status=applied level=applied to_level=2 », deux « quorums written », « publication suspended », aucune
ligne ERROR ni WARN. **Un second démarrage ne rejoue rien** (mêmes comptes, la file reste à 4, 0 commit).
## Effet attendu
- Les deux groupes : I1, E1 et E2 sont des « Propositions seed », ouvertes, au cran 2 ; aucun article n'est
en vigueur ; les modules (titre du document au cran 4, ordre de chaque section au cran 2) restent en
vigueur.
- Le seuil se lit en quorum : au cran 2, 9 « pour » passent avec 3 « contre » au plus.
- **Le vote simulé s'ouvre dans Monnaie libre dès la mise en ligne** (pas de `LD_VOTE_ACCOUNT`) : toute
personne qui ouvre le groupe y vote, une personne invitée comprise ; le vote compte aussitôt, marqué
« simulé » sous l'article ; 9 « pour » simulés font entrer I1, E1 ou E2 **sur le site**, sans
publication. Effet de « simule le vote à tout endroit » et « il compte, puis s'efface » ; orch le porte à
son rapport (03/11, 06 h 11). À l'ouverture de la chaîne, l'acte « supprime » (`ld-server
discard-simulation`, à blanc, puis `--apply`) écartera ces votes et réexaminera ce qu'ils ont fait entrer.
- L'accueil sous la voûte.
Irréversibilité : **partielle**. Le code se remet en arrière ; les données changées restent.
## Avant — prémisses vivantes
1. La production sert `3f10a0e` : `curl -s https://decision.librodrome.org/api/health` →
`"build":"3f10a0e8"` ; `git fetch prod && git rev-parse --short prod/main` → `3f10a0e`.
2. Sur une copie fraîche de la base (commande ci-dessous) : aucune proposition d'inertie `open` ; 0 vote,
0 bulletin ; I1, E1, E2 en vigueur, aux crans 3, 4, 4, dans les deux groupes. **Lu sur la copie de
06 h 11 min 12** : 3 propositions d'inertie, toutes `withdrawn` (I1 → 5, E1 → 5, et une ancienne sur
l'ordre de l'introduction) ; 0 vote, 0 bulletin, 0 signalement, 1 identité ; I1, E1, E2 en vigueur,
crans 3, 4, 4, dans les deux groupes. À relire sur la seconde copie, juste avant la poussée. Si un de
ces articles a bougé, l'amendement le refuse avec sa raison au journal, et l'acte reste valable.
3. Sur la même copie : 0 vote, donc aucune proposition n'entre au premier balayage.
4. La relecture indépendante de `94ddb17`, inscrite « ok » dans `~/harness/etat/relectures.json` ; aucune
autre relecture de ce code en cours.
5. `git diff 3f10a0e 94ddb17 -- docker/ .woodpecker/ .env data/` → vide (vérifié à 06 h 22).
6. Boucle verte sur `94ddb17` le 03/11 de 06 h 16 à 06 h 21 : fmt, clippy `-D warnings`, 286 tests Rust,
svelte-check 0 erreur 0 avertissement, 56 vitest, build, e2e 36 / 36. Image de production : en
construction (`docker build -f docker/app.Dockerfile --target production`, lancée à 06 h 21).
## Copie de la base (prise par orch, lecture seule, aucune écriture côté production)
```sh
set -euo pipefail
d=/tmp/ld-m6-copie; mkdir -m 700 -p "$d"
for f in libredecision.db libredecision.db-wal libredecision.db-shm; do
ssh sonic "docker exec lpk-libredecision-app sh -c 'test -f /data/$f && cat /data/$f'" > "$d/$f" </dev/null || rm -f "$d/$f"
done
chmod 600 "$d"/*
date '+%H:%M:%S'; curl -s https://decision.librodrome.org/api/health; echo
sqlite3 -readonly "$d/libredecision.db" 'PRAGMA integrity_check; PRAGMA foreign_key_check;'
```
Pas un instantané atomique (la base, puis son journal WAL) : `integrity_check` le dirait, et l'on reprend
la copie. Lecture : `m6/counts.sh <db>` (scratchpad de l'intégrateur), en `sqlite3 -readonly`.
## Commande exacte
Selon la règle du canon du 02/11, un dossier « déploie » ne liste que la poussée qui met en ligne :
```sh
cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod 94ddb175643c8d523a083bbfee3882f22b82f628:main
```
(remote `prod` = `gitea@git.open.us.org:EHV/decision.git` ; Woodpecker `.woodpecker/app.yml`, puis
`maquette.yml`.)
## Vérifications après
- [ ] Santé vue de l'extérieur → `"build":"94ddb175"`.
- [ ] Journaux : `ssh sonic 'docker logs lpk-libredecision-app 2>&1 | grep -E "amendment|quorums written|publication|ERROR|WARN"'`
→ six « seed proposal amendment … status=applied level=applied », deux « quorums written »,
« publication suspended », aucune erreur.
- [ ] Redémarrage à froid (`docker compose restart` dans `/opt/libredecision-app`), santé vue de
l'extérieur, journaux : aucun amendement rejoué.
- [ ] Sur une copie fraîche : les comptes « Après » de la répétition, à la ligne près ; `integrity_check`
ok, `foreign_key_check` vide ; copie retirée ensuite.
- [ ] Le dépôt des textes n'a reçu aucun commit : `git ls-remote gitea@git.open.us.org:yvv/decision-depot-textes-reference.git main`
→ le même sha qu'avant la poussée (le relever avant).
- [ ] À l'écran (Yvv, à son retour) : l'accueil sous la voûte ; l'Acte d'engagement : les Propositions
seed, aucun article en vigueur ; voter dans Monnaie libre affiche « simulé ».
## Retour
- **Le code** : `docker tag libredecision-app:previous libredecision-app:latest`, puis
`cd /opt/libredecision-app && docker compose up -d --force-recreate`. `previous` sera `3f10a0e`. Le
serveur tolère les migrations qu'il ne connaît pas (`set_ignore_missing(true)`, `lib.rs:100`).
- **Les données** : pas de retour automatique. `3f10a0e` montrerait I1, E1, E2 comme propositions
ouvertes sans la marque, et aucun article en vigueur ; les votes simulés éventuels y compteraient comme
des votes du serveur. Un retour du code au-delà de quelques minutes demande un acte de données à part.
- **La publication** : rien n'est parti, rien à retirer.
## Exécution
(à remplir par orch)