forked from yvv/decision
Documentation seule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
163 lines
11 KiB
Markdown
163 lines
11 KiB
Markdown
# Brouillon — acte M6 (Propositions seed, quorum, tampon des votes, lecteur, accueil, textes du quorum)
|
|
|
|
> **Brouillon, pas figé.** Tenu par l'intégrateur libredecision-d4. Il passe sous `actes/` quand il est
|
|
> figé sur un sha, avec sa relecture indépendante inscrite. Orch (dev-63) l'exécute sous son mandat
|
|
> (« déploie » et « pousse », du 03/11 au 08/11).
|
|
|
|
## Intention
|
|
|
|
Mettre en ligne la revue d'Yvv du 02/11 et ses décisions du 02/11 et du 03/11 :
|
|
- **H** : l'accueil sous la voûte (fusionné, `a3c0a76`) ;
|
|
- **S** : les Propositions seed, la publication suspendue sans texte en vigueur, le quorum par cran, la
|
|
licence `AGPL-3.0-or-later` (fusionné, `349c8ed`) ;
|
|
- **V** : le tampon des votes, le vote simulé partout tant que la chaîne est fermée (à fusionner) ;
|
|
- **T** : les articles du seed qui décrivent le quorum (à faire) ;
|
|
- **U** : le lecteur, la ligne « N oui pour passer · N non bloquent », le réglage du quorum (à faire).
|
|
|
|
## Décisions d'Yvv que l'acte applique (registre)
|
|
|
|
- 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 ; la publication attend un texte passé par les seuls
|
|
votes prouvés. Dans Monnaie libre, rien n'est publié avant l'ouverture de la chaîne.
|
|
- **Q12** (03/11, « Oui, retire-les ») : retirer les deux propositions d'inertie d'Yvv du 29/10, I1 → 5 et
|
|
E1 → 5, **avant** que le nouveau serveur démarre (étape 0 ci-dessous).
|
|
|
|
## Étape 0 — avant la poussée : retirer I1 → 5 et E1 → 5 sur la production actuelle
|
|
|
|
**Pourquoi avant** : l'amendement des Propositions seed (`seed_proposal_amend.rs`) tourne au démarrage
|
|
et n'est décidé qu'une fois par document (l. 319-334, une ligne dans `seed_proposal_amendments`). Si
|
|
une proposition d'inertie d'un membre est encore ouverte, il refuse le cran (`inertia_proposal`) pour
|
|
de bon : I1 resterait au cran 3 et E1 au cran 4. Une proposition retirée sans vote ne compte plus (sa
|
|
requête ne retient que `status IN ('open','applied')` ou une proposition votée).
|
|
|
|
**La voie : le geste d'Yvv à l'écran**, sur la version en ligne `3f10a0e`. Vérifiée le 03/11 entre
|
|
05 h 50 et 05 h 56 sur un serveur local de `3f10a0e` (base neuve du seed, proposition I1 → 5 créée
|
|
comme en production ; captures dans le scratchpad de libredecision-d4, `shots/3-row.png`,
|
|
`6-withdraw-visible.png`, `7-after.png`). Pas d'écriture SQL en production.
|
|
|
|
1. Yvv, connecté, ouvre `/g/monnaie-libre/docs/acte-engagement-certification`.
|
|
2. Il descend au bloc « Propositions en cours » et clique le filtre « Les miennes » : il ne reste
|
|
que ses deux propositions d'inertie.
|
|
3. Sous l'intertitre « INTRODUCTION » (I1) : la ligne « inertie vers 5 / 5 · très haute »,
|
|
« 0 pour · 0 contre », pastille « ta proposition ». Il clique la ligne.
|
|
4. Le vote se déplie sous la ligne (l'adresse prend `?vote=<id>`). Il clique « Coquilles,
|
|
traductions, objections, historique ».
|
|
5. Le panneau de droite s'ouvre sur « Détails » : « inertie vers 5 / 5 · très haute · proposé par
|
|
Yvv ». Il clique « Retirer ma proposition ».
|
|
6. Message « Proposition retirée. » ; la ligne disparaît des propositions en cours (en base :
|
|
`status = 'withdrawn'`, `left_at` posé ; la route relance un balayage, sans effet à 0 vote).
|
|
7. Même chose pour E1, sous l'intertitre « ENGAGEMENTS FONDAMENTAUX » (déduit de la liste groupée
|
|
par section ; non vu en local).
|
|
|
|
**Vérification**, sur une copie fraîche de la base de production :
|
|
`SELECT unit_id, status FROM proposals WHERE kind = 'inertia'` → 2 `withdrawn`, 0 `open`.
|
|
|
|
**Répétition** : sur une copie fraîche, le retrait par la route avec le serveur `3f10a0e`, puis le
|
|
démarrage du serveur M6 sur cette copie → I1, E1, E2 au cran 2, et `seed_proposal_amendments` dit
|
|
`level_outcome = 'applied'` pour les trois.
|
|
|
|
Si le retrait n'est pas fait, l'acte reste valable : I1 et E1 démarrent aux crans 3 et 4, E2 au cran 2,
|
|
et le journal dit `inertia_proposal`.
|
|
|
|
## 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` vide, 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é (0 vote, 0 bulletin, aucune coquille, révision, traduction
|
|
de membre ni signalement, origine seed, texte identique) : 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 (aucune proposition d'inertie
|
|
ouverte, appliquée ou votée : d'où l'étape 0) ; 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`
|
|
= `[12,12,50,50,50]` (Monnaie libre), `[1,1,1,1,1]` (essai), là où il est NULL ; une ligne
|
|
`quorum_amendments` ; une ligne `outbox` dans Monnaie libre.
|
|
- **Le tampon** : la première mise en route n'écrit rien du tampon.
|
|
- **La publication** : suspendue. Aucun article n'est plus en vigueur dans Monnaie libre, puis (règle
|
|
« pas avant des votes prouvés », 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. Le dépôt des textes garde son dernier
|
|
état.
|
|
|
|
## 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 : 12 · 12 · 50 · 50 · 50 votants dans Monnaie libre ; 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é » ; 9 « pour » simulés font entrer I1, E1 ou E2 **sur le site**, sans publication. À
|
|
l'ouverture de la chaîne, l'acte « supprime » (`ld-server discard-simulation --apply`) écartera ces
|
|
votes et réexaminera ce qu'ils ont fait entrer. Effet de « simule le vote à tout endroit » et « il
|
|
compte, puis s'efface » ; orch le porte à son rapport, pas en question (03/11, 06 h 11).
|
|
- L'accueil sous la voûte.
|
|
|
|
Irréversibilité : **partielle**. Le code se remet en arrière ; les données changées restent (I1, E1, E2
|
|
sortis de la vigueur, crans à 2, quorums posés, votes simulés éventuels).
|
|
|
|
## 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 :
|
|
vers le remote `prod` (`gitea@git.open.us.org:EHV/decision.git`), branche `main`, le sha figé
|
|
(Woodpecker : `.woodpecker/app.yml`, puis `maquette.yml`). La ligne exacte est écrite au gel, dans le
|
|
dossier sous `actes/`.
|
|
|
|
## Vérifications après
|
|
|
|
- [ ] Santé vue de l'extérieur : `curl -s https://decision.librodrome.org/api/health` →
|
|
`"build":"<SHA8>"`.
|
|
- [ ] Journaux : `ssh sonic 'docker logs lpk-libredecision-app 2>&1 | grep -E "amendment|quorum|publication|ERROR|WARN"'`
|
|
→ les amendements « applied » (Propositions seed, quorums), « publication suspended », aucune
|
|
erreur.
|
|
- [ ] Redémarrage à froid (`docker compose restart` dans `/opt/libredecision-app`), santé, journaux :
|
|
aucun amendement rejoué.
|
|
- [ ] Sur une copie fraîche : les comptes 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` de
|
|
`yvv/decision-depot-textes-reference`, branche `main` : inchangée depuis avant l'acte).
|
|
- [ ] À 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.
|
|
|
|
## Copie de la base de production (prise par orch, lecture seule, aucune écriture côté production)
|
|
|
|
Dans `/tmp/ld-m6-copie` (700 / 600), par `docker exec lpk-libredecision-app cat /data/<f>` pour
|
|
`libredecision.db`, `-wal`, `-shm`, puis `PRAGMA integrity_check; PRAGMA foreign_key_check;` en
|
|
`sqlite3 -readonly`. Pas un instantané atomique : `integrity_check` le dirait, et l'on reprend la
|
|
copie. Première copie : 03/11 à 06 h 11 min 12, production `3f10a0e8`, « ok », aucune clé étrangère
|
|
cassée. Seconde copie juste avant la poussée.
|
|
|
|
Lecture des prémisses : `m6/counts.sh` (scratchpad de l'intégrateur), en lecture seule. Répétition :
|
|
`m6/repetition.sh`, sur une copie de la copie, publication vers un dépôt nu local ; `/tmp/ld-m6-copie`
|
|
n'est jamais écrit.
|
|
|
|
## Prémisses à vérifier (à compléter au gel)
|
|
|
|
1. La production sert `3f10a0e` : santé `"build":"3f10a0e8"` ; `prod/main` → `3f10a0e`.
|
|
2. Sur une copie fraîche : aucune proposition d'inertie `open` ; 0 vote ; I1, E1, E2 en vigueur, aux
|
|
crans 3, 4, 4, dans les deux groupes, intouchés (sinon l'amendement les refuse avec sa raison, et
|
|
l'acte reste valable).
|
|
3. Sur la même copie : aucune proposition qui aurait déjà ses voix au nouveau seuil (attendu : 0 vote).
|
|
4. La relecture indépendante du sha figé, inscrite « ok » dans `~/harness/etat/relectures.json` ;
|
|
aucune autre relecture de ce code en cours.
|
|
5. `git diff 3f10a0e <SHA> -- docker/ .woodpecker/ .env data/` : à lire.
|
|
6. Boucle verte sur `<SHA>` et image de production construite.
|