Compare commits

...
7 Commits
Author SHA1 Message Date
YvvandClaude Opus 5.5 9bb6023e70 Acte M6 : exécuté et vérifié en production (pipeline 37, 94ddb175), comptes « Après » à la ligne près, aucune publication ; copies retirées
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 07:04:41 +01:00
YvvandClaude Opus 5.5 bc5a3737f1 Tableau : heure du lancement de T lue à l'horloge (06 h 46, pas 06 h 48)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:46:05 +01:00
YvvandClaude Opus 5.5 32fcf229ef Tableau : lot T lancé (06 h 48), après le PRÊT M6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:45:49 +01:00
YvvandClaude Opus 5.5 39d5cd2633 Acte M6 : relecture « 94ddb17 : ok » inscrite ; retour corrigé (couper la publication avant, répété), risque du retour automatique, lien d'équipe, acte « supprime » serveur arrêté ; tableau : liste d'attente de la relecture
Documentation seule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:45:08 +01:00
YvvandClaude Opus 5.5 5c9307bb9f Acte M6 : image de production construite (06 h 25, sortie 0)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:26:15 +01:00
YvvandClaude Opus 5.5 4115b1c8ac Acte M6 figé sur 94ddb17 (H, S, V) : répétition sur une copie de la production, écritures en base, effet attendu, vérifications, retour ; le brouillon retiré
Documentation seule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:23:22 +01:00
YvvandClaude Opus 5.5 bf9478039b Tableau : lot V fusionné (94ddb17)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 06:16:31 +01:00
3 changed files with 269 additions and 166 deletions
@@ -0,0 +1,249 @@
# 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 : EXÉCUTÉ (03/11, 06h45-07h04, par orch dev-63 sous mandat ; pipeline 37)** — 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 : « 94ddb17 : ok », inscrite le 03/11 à 06 h 42 (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.
**Cet acte se jouera serveur arrêté** (relecture : `give_back` écrit sans garde, à côté du serveur).
- **Un lien d'équipe multiplie les voix simulées** (relecture, vu : un lien vers Monnaie libre ouvert
9 fois sous 9 noms donne 9 « pour », et I1 entre sur le site). En production le 03/11 à 06 h 11 :
aucun lien d'équipe ; 2 invitations vers Monnaie libre, dont 1 pas encore ouverte (expire le 05/11).
**À dire à Yvv** : ne pas créer de lien d'équipe vers Monnaie libre pendant la simulation, ou le
borner à quelques ouvertures.
- Après un vote simulé, le message bref dit encore « Vote enregistré. » et le panier « N votes
enregistrés. » ; sous l'article, c'est bien « simulé ». Repris par U (M7).
- 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. **Faite** : « 94ddb17 : ok », sous-agent neuf, rendue et inscrite le
03/11 à 06 h 42 (transcript `~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-ab9f269c254b56f31.jsonl`).
Aucun bloquant. Elle a rejoué la mise en route sur une base faite par `3f10a0e` (écritures exactement
celles annoncées, second démarrage sans rejeu, publication suspendue), sondé la formule sur 25 millions
de cas (une voix seule ne passe jamais, un « contre » n'aide jamais, `yesNeeded` / `noNeeded` exacts),
la route du quorum (bornes, CSRF, auteur, 409 après un vote), les routes de développement (404 sans
`LD_DEV_LOGIN`), la simulation et l'acte « supprime » (à blanc : la base inchangée). Ses constats « à
reprendre » sont traités dans ce dossier (le retour, le lien d'équipe, l'acte « supprime ») ou
renvoyés à U (« Vote enregistré. »).
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 construite
le 03/11 à 06 h 25 (`docker build -f docker/app.Dockerfile --target production`, sortie 0, les tests
rejoués dedans : 56 vitest, tests Rust tous « ok ») ; image de contrôle retirée à 06 h 26.
## 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
- [x] Santé vue de l'extérieur → `"build":"94ddb175"`.
- [x] 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.
- [x] Redémarrage à froid (`docker compose restart` dans `/opt/libredecision-app`), santé vue de
l'extérieur, journaux : aucun amendement rejoué.
- [x] 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.
- [x] 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
**Avant tout retour vers `3f10a0e`, couper la publication.** `94ddb17` met 4 lignes en file au premier
démarrage (`seed_proposal_amend.rs:419`, `quorum_amend.rs:140`) ; `3f10a0e` ne connaît pas l'attente du
premier texte et publierait aussitôt un document **sans aucun article** (vu par la relecture : commit de
`fr.md`, `en.md`, `es.md` et `document.json` vides, 118 lignes retirées). Le compose prend
`${LD_PUBLISH_REMOTE:-…}` : une valeur vide reprend le défaut, il faut donc retirer la ligne.
```sh
ssh sonic
cd /opt/libredecision-app
cp docker-compose.yml docker-compose.yml.m6-avant-retour
sed -i '/LD_PUBLISH_REMOTE/d' docker-compose.yml
docker tag libredecision-app:previous libredecision-app:latest
docker compose up -d --force-recreate
```
- **Répété le 03/11 à 06 h 45** : le serveur de `3f10a0e`, sans `LD_PUBLISH_REMOTE`, sur la base issue de
la répétition M6 : démarrage sans erreur, aucune publication (dépôt nu local : 0 commit), la file reste
à 4 en attente. Le serveur tolère les migrations qu'il ne connaît pas (`set_ignore_missing(true)`,
`lib.rs:100`). La prochaine mise en ligne réécrit `docker-compose.yml` depuis le dépôt (`app.yml`).
- **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.
- **Risque connu, le retour automatique du pipeline** : si le nouveau conteneur échoue après avoir
démarré, `.woodpecker/app.yml` relance `previous` (`3f10a0e`) **avec** la publication, qui partirait
vide. La répétition et l'image ne montrent aucun échec de démarrage ; si le pipeline échoue quand même,
regarder aussitôt le dépôt des textes (`git ls-remote … main`) et, s'il a reçu le document vide, couper
la publication comme ci-dessus, puis republier le dernier état par-dessus (acte à part).
- **La publication** : en marche avant, rien ne part (suspendue).
## Exécution
Acte exécuté le 03/11/2026, 06h45-07h04, par orch (session dev-63, e66db8ca), sous mandat
« déploie » (inscrit du 03/11 au 08/11) ; consignes d'Yvv du 03/11 à 06h00 (« livre et déploie tout
ce que tu peux ») et à 06h07 (« tu peux livrer Decision »).
- Dossier relu en entier à 06h45 ; relecture « 94ddb17 : ok » vue inscrite ; aucune autre relecture
de ce code en cours (libredecision-d4, PRÊT M6).
- Prémisse 1, 06h45:51 : santé `{"build":"3f10a0e8","ok":true}`, `prod/main` = `3f10a0e`.
- Seconde copie, 06h46:32 (`/tmp/ld-m6-copie2`, 700/600), santé `3f10a0e8` : `integrity_check` ok,
`foreign_key_check` vide. Prémisses 2 et 3 : la colonne « Avant » à la ligne près ; 3 propositions
d'inertie, toutes `withdrawn` ; 0 vote, 0 bulletin, 0 signalement, 1 identité ; I1, E1, E2 en vigueur,
crans 3, 4, 4, dans les deux groupes ; file 0 en attente, 13 faites.
- Dépôt des textes avant : `main` = `9e0f45a9e8d4af356a0c42daa5f4fb9eb9e6dfb3`. Pipelines : 36
`success` en tête, rien en cours.
- Poussée `git push prod 94ddb175643c8d523a083bbfee3882f22b82f628:main` à 06h46:5x, passée du premier
coup (`3f10a0e..94ddb17`).
- Pipeline n° 37 : `running` à 06h47:06 ; `app` vert (healthcheck `success`, `retablir` sauté) ;
`maquette` verte ; `success` à 07h02:59. L'étape `sbom-publish` échoue dans les deux workflows, comme
au pipeline 36 : écart ancien, sans effet sur le déploiement.
- Après :
- santé `{"build":"94ddb175","ok":true}` ;
- journaux : six « seed proposal amendment … status="applied" level="applied" to_level=2 », deux
« quorums written » (essai `[1, 1, 1, 1, 1]`, Monnaie libre `[12, 12, 50, 50, 50]`),
« publication suspended … waiting=4 », aucune ligne ERROR ni WARN ;
- redémarrage à froid (`docker compose restart` dans `/opt/libredecision-app`) à 07h03:07 :
« listening … build=94ddb175 », « publication suspended … waiting=4 », aucun amendement rejoué ;
santé `94ddb175` ;
- copie fraîche, 07h03:31 (`/tmp/ld-m6-apres`) : la colonne « Après » de la répétition à la ligne
près. Migrations 1–11 ; inertie retirées 3, ordres en vigueur 16, textes ouverts 70, titres en
vigueur 2 ; unités en vigueur 9 et 9 ; I1, E1, E2 ouvertes au cran 2 dans les deux groupes ;
révisions 107 ; traductions 144 ; `inertia_changes` 10 ; 6 `seed_proposal_amendments` « applied » ;
2 `quorum_amendments` « applied » ; file 4 en attente, 13 faites ; 0, 0, 0, 1 ; `integrity_check`
ok, `foreign_key_check` vide ;
- dépôt des textes : `main` = `9e0f45a9e8d4af356a0c42daa5f4fb9eb9e6dfb3`, inchangé : aucun commit.
- `main` local avancé sur `94ddb17` (`git fetch . 94ddb17…:main`, depuis `fa8e8dc`).
- Les trois copies de la base (`/tmp/ld-m6-copie` de 06h11, `/tmp/ld-m6-copie2`, `/tmp/ld-m6-apres`)
retirées à 07h03:43. Les copies de répétition de l'intégrateur sont à retirer par lui.
- Reste à l'écran, pour Yvv à son retour : l'accueil sous la voûte ; l'Acte d'engagement (les
Propositions seed, aucun article en vigueur) ; un vote dans Monnaie libre affiche « simulé ».
- Image de retour : `libredecision-app:previous` (`3f10a0e`), avec la coupure de la publication
d'abord (§ Retour).
@@ -1,162 +0,0 @@
# 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.
+20 -4
View File
@@ -65,9 +65,9 @@ Lots en cours, en copies de travail (`.claude/worktrees/agent-<id>`) :
[--apply]`, jamais appelé automatiquement) ; la publication « pas avant des votes prouvés » [--apply]`, jamais appelé automatiquement) ; la publication « pas avant des votes prouvés »
(`publish::waits_for_proven_votes`, bascule `LD_PUBLISH_SIMULATED`, règle stricte) ; `voted_units` (`publish::waits_for_proven_votes`, bascule `LD_PUBLISH_SIMULATED`, règle stricte) ; `voted_units`
étendu ; ADR 0012 réécrite. Fini le 03/11 vers 06 h 05 (`98b4530`) : 286 tests Rust, 56 vitest, e2e étendu ; ADR 0012 réécrite. Fini le 03/11 vers 06 h 05 (`98b4530`) : 286 tests Rust, 56 vitest, e2e
36 / 36 (C34). **Relancé à 06 h 09** pour la marque « simulé » sous l'article (VoteFold, minimal), 36 / 36 (C34). Puis la marque « simulé » sous l'article (VoteFold, minimal, `d57326d`), puisque M6
puisque M6 part sans U. part sans U. **Fusionné le 03/11 à 06 h 18** (`94ddb17`).
- **T** (à ouvrir après V ; hors M6) : réécrire les articles du seed qui décrivent encore l'ancien plancher C - **T** (`lot-t-textes`, `lot/t-textes`, parti de `39d5cd2` ; hors M6 ; **lancé le 03/11 à 06 h 46**) : réécrire les articles du seed qui décrivent encore l'ancien plancher C
(F1.1, F1.2, N1.1 au moins) selon le quorum par cran (ADR 0013), en fr, en, es ; amendement (F1.1, F1.2, N1.1 au moins) selon le quorum par cran (ADR 0013), en fr, en, es ; amendement
gardé pour la production (sur le modèle de M5) ; Yvv relit les textes avant M6. Demandé par orch gardé pour la production (sur le modèle de M5) ; Yvv relit les textes avant M6. Demandé par orch
le 03/11, reçu avant 05 h 38 (bilan des consignes). le 03/11, reçu avant 05 h 38 (bilan des consignes).
@@ -148,7 +148,7 @@ chaîne (question stratégique, `docs/recherche/vote-g1-chaine.md`) ; l'affichag
| Q9 | Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? (Sinon, un « non » peut faire passer un texte en complétant le quorum.) | **tranché** (03/11, formulaire d'orch racine vers 03 h 45) : « Ils comptent comme non » ; au cran 2, quorum 12, 9 oui passent avec 3 non au plus | | Q9 | Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? (Sinon, un « non » peut faire passer un texte en complétant le quorum.) | **tranché** (03/11, formulaire d'orch racine vers 03 h 45) : « Ils comptent comme non » ; au cran 2, quorum 12, 9 oui passent avec 3 non au plus |
| Q10 | Licence : AGPL-3.0 seulement, ou « ou toute version ultérieure » ? | **tranché** (03/11, même formulaire) : « Ou version ultérieure » → `AGPL-3.0-or-later` dans les manifestes (`Cargo.toml`, `web/package.json` et son verrou) et le README ; `LICENSE` inchangé ; confié au lot S | | Q10 | Licence : AGPL-3.0 seulement, ou « ou toute version ultérieure » ? | **tranché** (03/11, même formulaire) : « Ou version ultérieure » → `AGPL-3.0-or-later` dans les manifestes (`Cargo.toml`, `web/package.json` et son verrou) et le README ; `LICENSE` inchangé ; confié au lot S |
| Q11 | Un texte entré en vigueur par des votes simulés (9 « pour » au cran 2 dans Monnaie libre) se publie-t-il dans le dépôt des textes ? | **tranché** (03/11, formulaire d'orch, reçu avant 05 h 35 ; le relais disait « vers 05 h 45 ») : « Pas avant des votes prouvés » → en vigueur sur le site, pas publié ; la publication attend un texte passé par les seuls votes prouvés (dans Monnaie libre, rien avant l'ouverture de la chaîne) ; codé par V, écrit au dossier M6 | | Q11 | Un texte entré en vigueur par des votes simulés (9 « pour » au cran 2 dans Monnaie libre) se publie-t-il dans le dépôt des textes ? | **tranché** (03/11, formulaire d'orch, reçu avant 05 h 35 ; le relais disait « vers 05 h 45 ») : « Pas avant des votes prouvés » → en vigueur sur le site, pas publié ; la publication attend un texte passé par les seuls votes prouvés (dans Monnaie libre, rien avant l'ouverture de la chaîne) ; codé par V, écrit au dossier M6 |
| Q12 | En production, Yvv a ouvert le 29/10 deux propositions d'inertie, I1 → 5 et E1 → 5 (0 vote). Ouvertes au démarrage de M6, elles retiennent I1 et E1 aux crans 3 et 4 pour de bon (amendement décidé une fois). Les retirer ? | **tranché** (03/11, formulaire d'orch, reçu à 05 h 51) : « Oui, retire-les » → avant le démarrage de M6, par le geste d'Yvv à l'écran (« Les miennes » › la ligne d'inertie › « Coquilles, traductions, objections, historique » › « Retirer ma proposition »), vérifié sur `3f10a0e` en local ; étape 0 du brouillon M6 (`M6-brouillon.md`) | | Q12 | En production, Yvv a ouvert le 29/10 deux propositions d'inertie, I1 → 5 et E1 → 5 (0 vote). Ouvertes au démarrage de M6, elles retiennent I1 et E1 aux crans 3 et 4 pour de bon (amendement décidé une fois). Les retirer ? | **tranché** (03/11, formulaire d'orch, reçu à 05 h 51) : « Oui, retire-les » → avant le démarrage de M6, par le geste d'Yvv à l'écran (« Les miennes » › la ligne d'inertie › « Coquilles, traductions, objections, historique » › « Retirer ma proposition »), vérifié sur `3f10a0e` en local ; fait par Yvv à l'écran (annoncé à 06 h 07), dossier `actes/2026-11-03-m6-propositions-seed-quorum-tampon.md` |
Défauts posés par orch, sans question (Yvv peut les corriger) : Défauts posés par orch, sans question (Yvv peut les corriger) :
- Décisions : « modules restant à voter » = les modules du doc pas encore adoptés par un vote - Décisions : « modules restant à voter » = les modules du doc pas encore adoptés par un vote
@@ -168,9 +168,25 @@ Défauts posés par orch, sans question (Yvv peut les corriger) :
- M2 + M3a (L9 et L10) : **caduc, emporté par M4** (`actes/2026-10-31-m2-vote.md`) : jamais exécuté, `74f96be` est en production depuis M4. - M2 + M3a (L9 et L10) : **caduc, emporté par M4** (`actes/2026-10-31-m2-vote.md`) : jamais exécuté, `74f96be` est en production depuis M4.
- M4 (L9 à L13) : **exécuté** le 01/11/2026, 22 h 52 – 23 h 40 (`actes/2026-10-31-m4-vote-modules-objections.md`) ; M2 et M3a n'ont plus d'objet. - M4 (L9 à L13) : **exécuté** le 01/11/2026, 22 h 52 – 23 h 40 (`actes/2026-10-31-m4-vote-modules-objections.md`) ; M2 et M3a n'ont plus d'objet.
- M5 (lot G, articles des règles, licence) : **exécuté** le 02/11/2026, 02 h 53 – 03 h 10 (`actes/2026-11-02-m5-retenue-textes-regles.md`). - M5 (lot G, articles des règles, licence) : **exécuté** le 02/11/2026, 02 h 53 – 03 h 10 (`actes/2026-11-02-m5-retenue-textes-regles.md`).
- M6 (H, S, V) : **figé** le 03/11 à 06 h 22 sur `94ddb17` (`actes/2026-11-03-m6-propositions-seed-quorum-tampon.md`) ; répétition faite sur une copie de la production de 06 h 11 ; relecture indépendante « 94ddb17 : ok » inscrite à 06 h 42 ; retour corrigé (couper `LD_PUBLISH_REMOTE` avant, répété) ; PRÊT envoyé à orch (dev-63), qui exécute sous mandat.
Restes mineurs de `71819f9` et du lot B : faits dans le lot D. Restes mineurs de `71819f9` et du lot B : faits dans le lot D.
Liste d'attente (relecture de `94ddb17`, M6) :
- **acte « supprime »** (ouverture de la chaîne) : le jouer serveur arrêté, ou ajouter des gardes
`WHERE in_force_id = …` à `give_back` (`simulation.rs:200`, `:258-298`) ; `give_back` remet la version
déplacée telle qu'elle est (révisée entre-temps, une révision non votée reviendrait) ; `confirm_seeds`
(`adoption.rs:49`) : un module confirmé par des votes simulés le reste ; p̃ mesurée votes simulés
compris jusqu'au lendemain de l'acte ;
- **lien d'équipe** : il multiplie les voix simulées (jusqu'à 500 ouvertures) ; l'ADR 0012 l. 290 dit
« deux voix » : à corriger ; à dire à Yvv ;
- **U** : « Vote enregistré. » (`VoteFold.svelte:123`) et « N votes enregistrés. » (`BallotPanel.svelte:95`)
après un vote simulé ; `fr.ts:263`, `:348` (et en, es) : « jusqu'à son effacement à l'ouverture de la
chaîne » → c'est l'acte « supprime » qui efface ;
- `document.json` comptera les votes simulés une fois la publication permise (l'ADR le dit) ;
`simulation::unproven` recharge l'état du document à chaque affichage tant que la file attend
(performance) ; `reached` / `missing` = 0 alors que la marge retient le rival (antérieur).
Liste d'attente (relecture de `033b331+4d4adcc`, après M4) : Liste d'attente (relecture de `033b331+4d4adcc`, après M4) :
- 0008 : lever les doublons debout avant de créer `signals_one_standing` (sans objet en production : 0 signalement) ; - 0008 : lever les doublons debout avant de créer `signals_one_standing` (sans objet en production : 0 signalement) ;
- un ordre ne départage pas deux articles à la même position (deux créations simultanées) ; - un ordre ne départage pas deux articles à la même position (deux créations simultanées) ;