From fad726e7b442db4132824e9ecf7eff496f6d18e5 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 06:12:02 +0100 Subject: [PATCH] =?UTF-8?q?Brouillon=20M6=20:=20=C3=A9critures=20en=20base?= =?UTF-8?q?,=20effet=20attendu=20(vote=20simul=C3=A9=20ouvert),=20v=C3=A9r?= =?UTF-8?q?ifications,=20retour,=20copie=20de=20la=20base?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documentation seule. Co-Authored-By: Claude Opus 5.5 --- .../acte-certification/M6-brouillon.md | 114 ++++++++++++++---- 1 file changed, 92 insertions(+), 22 deletions(-) diff --git a/docs/chantiers/acte-certification/M6-brouillon.md b/docs/chantiers/acte-certification/M6-brouillon.md index 8bd0f1d..adff764 100644 --- a/docs/chantiers/acte-certification/M6-brouillon.md +++ b/docs/chantiers/acte-certification/M6-brouillon.md @@ -63,30 +63,100 @@ démarrage du serveur M6 sur cette copie → I1, E1, E2 au cran 2, et `seed_prop 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 (à compléter) +## Ce que l'acte écrit dans la base de production (donnée runtime) -- Migrations `0009` (Propositions seed), `0010` (tampon des votes, lot V), `0011` (quorums), additives. -- Amendement **Propositions seed** (`2026-11-02-i1/e1/e2-proposition-seed`), par document et par - article : la version passe de 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 accepté) ; une - ligne `seed_proposal_amendments` ; dans Monnaie libre une ligne `outbox`, qui attend (publication - suspendue). -- Amendement **quorums** (`2026-11-03-quorums-par-cran`) : `documents.quorums` là où il est NULL ; une - ligne `quorum_amendments` ; une ligne `outbox` dans Monnaie libre. -- Lot V : ce que `0010` et la première mise en route écrivent (à reprendre de son rapport). -- Lot T : l'amendement des textes du quorum (à reprendre de son rapport). +- **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. -## Prémisses à vérifier (à compléter) +## Effet attendu -- Sur une copie fraîche : les propositions qui ont déjà assez de voix pour leur nouveau seuil (9 au - cran 2, 39 au cran 3) entreraient au premier balayage. Attendu : 0 vote en production (M5 : 0 vote, - 1 identité). -- La santé et `prod/main` sur `3f10a0e`. -- La relecture indépendante du sha figé, inscrite « ok » dans `~/harness/etat/relectures.json`. -- `git diff 3f10a0e -- docker/ .woodpecker/ .env data/` : à lire. +- 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. -## Retour (à compléter) +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). -- Le code : `libredecision-app:previous` (`3f10a0e`). Le serveur tolère les migrations qu'il ne connaît - pas (`set_ignore_missing(true)`, `lib.rs:100`), mais les données auront changé : I1, E1, E2 ne sont - plus en vigueur, et `3f10a0e` les montrerait comme propositions ouvertes, sans la marque. +## 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":""`. +- [ ] 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/` 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 -- docker/ .woodpecker/ .env data/` : à lire. +6. Boucle verte sur `` et image de production construite.