Files
decision/actes/2026-11-03-m6c-phrases-quorum.md
T

200 lines
14 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 M6c (trois phrases de F1.1, F1.2 et N1.1 écrites justes, lot T2)
Classe : déploie
Projet : libreDecision Date : 2026-11-03
**État : EXÉCUTÉ (03/11, 10h48-11h06, par orch dev-63 sous mandat ; pipeline 40)** — figé sur `84f015a` (`84f015ad58a2e87803dd1100d55f271f014339de`) le 03/11 à 10 h 48 — 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 : « 84f015a : ok » (prémisse 3).
## Intention
Mettre en ligne le lot T2 : les trois phrases que la relecture de M6b (« bb4bdf5 : ok », 03/11) a laissées
inexactes dans les textes du seed réécrits par le lot T, en ligne depuis le 03/11 à 08 h 02 ; et, dans
l'interface, la même imprécision (« presque l'unanimité ») et un espace perdu (« 0 contredont 1 simulé »).
Décision d'orch (dev-63, 03/11 à 08 h 07, puis 09 h 45) : T2 après U, un sous-agent à la fois.
- **F1.1** : « presque l'unanimité quand peu de gens votent » → « cette part est la plus haute au quorum
et baisse quand la participation monte, jusqu'à la majorité M quand tout le monde vote ».
- **F1.2** : « tant que personne n'a voté sur l'article ; ensuite, il ne change plus » → « tant que
l'article ne garde la trace d'aucun vote ». (Le défaut proposé, « compté », se trompait dans l'autre
sens : un vote retiré sur la chaîne n'est plus compté, mais garde la trace et fige le quorum. Le choix
reste à Yvv : `textes-quorum-seed.md`, point 8.)
- **N1.1** : « le groupe demande un quorum de votants, puis une part de « pour » » → « une part de « pour »
parmi les votants […]. Chaque cran a aussi son quorum, qui n'est pas un nombre minimal de votants ».
- Interface : `inertia.explain`, `formula.reading`, `quorum.error.voted` (fr, en, es) ; espaces perdus en
tête d'un bloc Svelte (`VoteFold`, `VersionDetails`, menu).
## Ce qui part
Version `84f015a`, qui contient la version en ligne `b2e597b`. Code touché : `crates/ld-server/src/seed_amend.rs`
(l'amendement), `seeds/acte-engagement-certification.json` (bases neuves), `web/` (chaînes fr, en, es ;
`VoteFold.svelte`, `VersionDetails.svelte`, `+layout.svelte`), des tests ; le reste est documentation.
`crates/ld-engine` : des tests seulement. Configuration (`docker/`, `.woodpecker/`, `.env`, `data/`) et
migrations : rien (prémisse 4).
## Ce que l'acte écrit dans la base de production (donnée runtime)
- **Aucune migration.**
- **Amendement de seed gardé** `2026-11-03-f1-1-phrases`, `-f1-2-phrases`, `-n1-1-phrases`, qui suit
(`follows`) ceux de M6b, décidé une fois par document, dans une transaction, seulement si personne n'a
touché l'article : 0 vote (simulé compris), 0 ligne de bulletin, aucune coquille, traduction de membre ni
objection, texte d'avant identique à l'empreinte posée par M6b ; F1.1 admis à la révision 2, F1.2 et
N1.1 à la révision 3, seulement si c'est l'amendement de M6b, et lui seul, qui l'a écrite.
- `proposals` : texte fr, révision + 1 (F1.1 → 3 ; F1.2 et N1.1 → 4) ;
- `revisions` : une ligne `amendment` ;
- `translations` : en et es remplacés ;
- `seed_amendments` : la décision ;
- `outbox` : une ligne par article dans Monnaie libre, qui attend (publication suspendue) ; rien pour
l'essai.
Refus possibles, le texte d'avant reste : `not_a_seed`, `no_open_version` (une version entrée en
vigueur, par exemple d'une voix dans l'essai), `voted_into_force`, `confirmed`, `votes`, `ballots`,
`corrected`, `translation_edited`, `signalled`, `revised`, `text_differs`, `changed`
(`seed_amend.rs:283`, `:589`).
- Les amendements de M6b sont marqués dépassés : ils ne décident plus rien.
- **Aucun vote, aucune autre proposition, aucun autre article n'est touché ; la publication reste
suspendue.**
## Répétition
**Faite le 03/11 de 10 h 23 à 10 h 24**, avec le serveur de `84f015a` (binaire de la boucle, copié en
`m6c/ld-server-84f015a`), sur une copie de la copie de production prise par orch à 10 h 23 min 10 (santé
`b2e597b6`), publication vers un dépôt nu local (`m6c/repetition.sh` ; journal `m6c/repetition-m6c.log`,
scratchpad de l'intégrateur). Deux démarrages.
| | Avant | Après |
|---|---|---|
| F1.1 (deux groupes) | ouverte, seed, révision 2, 0 vote, 0 bulletin | révision 3 |
| F1.2, N1.1 (deux groupes) | ouvertes, seed, révision 3, 0 vote, 0 bulletin | révision 4 |
| Révisions | 113 | 119 |
| Traductions | 144 | 144 (en, es des trois articles remplacés) |
| `seed_amendments` | 16 | 22 |
| File de publication (Monnaie libre) | 7 en attente, 13 faites | 10 en attente, 13 faites |
| Commits vers le dépôt des textes (local) | — | 0 (« publication suspended ») |
| Tout le reste (`m6c/counts.sh` : migrations 1–11, propositions, unités en vigueur, I1/E1/E2, `inertia_changes`, votes, bulletins, signalements, identités) | | identique |
**La base entière comparée** (`.dump`) : changent exactement les 6 propositions de F1.1, F1.2, N1.1
(identifiants de la prémisse 2), leurs 12 traductions en et es, 6 révisions et 6 décisions ajoutées, 3
lignes de file ajoutées et les 7 lignes en attente reportées (`next_at`), les deux compteurs
(`sqlite_sequence` : révisions 119, file 23). Rien d'autre. `integrity_check` ok, `foreign_key_check`
vide. Journal : six « seed amendment applied » (`2026-11-03-f1-1-phrases`, `-f1-2-phrases`,
`-n1-1-phrases` × essai, Monnaie libre), « publication suspended », aucune ligne ERROR ni WARN. **Un second
démarrage ne rejoue rien** (comptes identiques, aucun « applied »).
## Effet attendu
- Dans les deux groupes, F1.1, F1.2 et N1.1 montrent les phrases corrigées, en fr, en et es ; la note
d'inertie et la lecture de la formule de l'interface disent la même chose ; « 0 contre dont 1 simulé ».
- Rien d'autre ne change ; le dépôt des textes reste à `9e0f45a`.
Irréversibilité : **partielle**. Le code se remet en arrière ; les nouveaux textes restent (l'ancien est
dans l'historique de chaque proposition).
## Avant — prémisses vivantes
1. La production sert `b2e597b` : santé `"build":"b2e597b6"` ; `prod/main` → `b2e597b`.
2. Sur une copie fraîche, `m6c/premisse.sh <db>` (scratchpad de l'intégrateur, lecture seule) : 6 lignes,
toutes `open`, origine `seed`, révision 2 pour F1.1 et 3 pour F1.2 et N1.1, votes, bulletins,
coquilles et objections à 0 ; migration 11. Un article touché est refusé par l'amendement avec sa
raison, et l'acte reste valable pour les autres. **Lu par orch sur la copie de 10 h 23 min 10** (santé
`b2e597b6`), puis par l'intégrateur sur sa copie de cette copie : l'attendu exact ; 0 vote et 0 ligne
de bulletin en tout. À relire sur la copie fraîche juste avant la poussée.
3. La relecture indépendante de `84f015a`, inscrite « ok » dans `~/harness/etat/relectures.json`.
**Faite** : sous-agent neuf, sans le contexte de l'intégrateur, sur `b2e597b..84f015a`, lancée à
10 h 26, rendue à 10 h 46, inscrite à 10 h 47 (transcript
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a59503237fefa982a.jsonl`,
dernière ligne « 84f015a : ok »). Aucun bloquant, aucun « à reprendre ». Ce qu'elle a exécuté, sur des
copies de la copie de 10 h 23 (supprimées depuis), réseau coupé :
- les écritures, base entière comparée : exactement celles annoncées (colonnes `body`, `revision`,
`updated_at` des 6 propositions ; `body`, `source_hash`, `updated_at` des 12 traductions) ;
- second démarrage, retour vers `b2e597b` (qu'elle a construit) et réavance : rien de rejoué, les
nouveaux textes servis par `b2e597b` ;
- la garde avec de vrais votes par l'API de `b2e597b` et des états forgés : refus `votes`, `ballots`,
`corrected`, `translation_edited`, `signalled`, `no_open_version`, `voted_into_force`, `revised`,
`text_differs` ; appliqué après un vote direct retiré dans l'essai et après « supprime » (limites
écrites) ;
- F1.2, « tant que l'article ne garde la trace d'aucun vote », vrai face à `PUT /units/{id}/quorum`
dans tous les cas (409 sur un vote simulé tenu ou retiré ; 200 après « supprime » et après un vote
direct retiré dans l'essai) ;
- les chiffres recalculés (64,4 · 73,5 · 77,4 · 85,3 · 91,9 % ; 8/12, 9/12, 39/50, 43/50, 46/50 ;
l'exemple de N1.1) ; en et es fidèles au français ;
- 220 tests Rust ciblés, svelte-check 0 / 0, vitest 69 / 69, build, C34 et C37.
Mineurs, **liste d'attente** (pour Yvv le premier, U2 ou un prochain tour de textes les autres) :
- N1.1, « qui n'est pas un nombre minimal de votants » : vrai pour les quorums par cran ; faux pour
un quorum d'auteur bas (Q = 2 ou 3 à tout cran, 6 au cran 3…), où le moteur demande Q « pour » ;
- `settings.reading` (fr, en, es) sans « au-delà du quorum » ;
- vocabulaire anglais mêlé (“yes”/“no”, « against », favor/favour) ;
- deux raisons de refus absentes de ce dossier (`no_open_version`, `changed`) : **ajoutées** ;
- `spaces.test.ts` : un faux positif théorique dans `<pre>`, deux angles morts (absents du code) ;
- commentaire `crates/ld-engine/src/threshold.rs:9-11` (« near-unanimity ») ;
- N1 garde « quand peu de gens votent », que l'interface ne dit plus.
Non vérifié par elle : la production (prémisses 1 et 6), le binaire bit pour bit, l'image, la boucle
complète, un vote prouvé par la chaîne puis retiré.
4. `git diff b2e597b 84f015a -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/` → vide (vu par
l'intégrateur à 10 h 22 et par orch à 10 h 23).
5. Boucle verte sur `84f015a`, le 03/11 de 10 h 22 à 10 h 26 (journal `m6c/loop.log`), du premier coup :
fmt, clippy `-D warnings`, 301 tests Rust, svelte-check 0 / 0, 69 vitest, build, e2e 40 / 40 (10 h 23
à 10 h 26). Image de production construite le 03/11 de 10 h 26 à 10 h 29, sortie 0 : étage serveur
rejoué (fmt, clippy, 301 tests Rust « ok », 0 échec), étage web rejoué (svelte-check 0 / 0, 69 vitest,
build) ; image de contrôle retirée à 10 h 29 (journal `m6c/docker-m6c.log`).
6. Sur sonic, aucun témoin `/opt/libredecision-app/deploying`.
## Commande exacte
```sh
cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod 84f015ad58a2e87803dd1100d55f271f014339de:main
```
## Vérifications après
- [x] Santé vue de l'extérieur → `"build":"84f015ad"`.
- [x] Journaux : six « seed amendment applied » (`2026-11-03-f1-1-phrases`, `-f1-2-phrases`,
`-n1-1-phrases` × essai, Monnaie libre), « publication suspended », aucune ligne ERROR ni WARN.
- [x] Redémarrage à froid : aucun amendement rejoué.
- [x] Sur une copie fraîche : F1.1 en révision 3, F1.2 et N1.1 en révision 4, dans les deux groupes ; le
reste identique à la ligne près à la copie d'avant (comptes de `counts.sh`) ; `integrity_check` ok.
- [x] Le dépôt des textes reste à `9e0f45a`.
## Retour
- **Le code** : `docker tag libredecision-app:previous libredecision-app:latest`, puis
`cd /opt/libredecision-app && docker compose up -d --force-recreate`. `previous` sera `b2e597b`, qui
attend aussi le premier texte pour publier : pas de coupure de la publication à faire.
- **Les textes** : pas de retour automatique ; l'ancien texte reste dans l'historique de chaque
proposition, un nouvel amendement gardé pourrait le remettre.
## Exécution
Acte exécuté le 03/11/2026, 10h48-11h06, par orch (session dev-63, e66db8ca), sous mandat
« déploie » (inscrit du 03/11 au 08/11) ; décision d'orch de 08h07 (T2 après U).
- Dossier relu en entier à 10h48 ; relecture « 84f015a : ok » vue inscrite (10h47) ; aucune autre
relecture de ce code en cours (PRÊT M6c).
- Prémisses, 10h48:38 : santé `{"build":"b2e597b6","ok":true}` ; `prod/main` = `b2e597b` ;
`git diff b2e597b 84f015a -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/` vide ; sur
sonic, aucun témoin `deploying` ; pipeline 39 `success` en tête.
- Copie d'avant, 10h48:46 (`/tmp/ld-m6c-avant`, 700/600) : `integrity_check` ok, `foreign_key_check`
vide ; `premisse.sh` : l'attendu exact (6 lignes `open`, `seed`, révisions 2 / 3 / 3, compteurs à 0 ;
0 vote, 0 bulletin ; migration 11). Dépôt des textes : `9e0f45a`.
- Poussée `git push prod 84f015ad58a2e87803dd1100d55f271f014339de:main` à 10h49:0x, passée du premier
coup (`b2e597b..84f015a`).
- Pipeline n° 40 : `created` à 10h49:12 ; santé `84f015ad` à 10h54:19 ; `app` puis `maquette` verts ;
`success` à 11h05:26.
- Après :
- journaux : six « seed amendment applied » (`2026-11-03-f1-1-phrases`, `-f1-2-phrases`,
`-n1-1-phrases`, essai et Monnaie libre), « publication suspended … waiting=10 », aucune ligne ERROR
ni WARN ;
- redémarrage à froid à 11h05:42 : « listening … build=84f015ad », « publication suspended …
waiting=10 », aucun amendement rejoué ; santé `84f015ad` ;
- copie fraîche, 11h05:59 (`/tmp/ld-m6c-apres`) : F1.1 en révision 3, F1.2 et N1.1 en révision 4,
dans les deux groupes, toujours `open`, 0 vote ; `counts.sh` comparé à la copie d'avant : seuls
changent révisions 113 → 119, `seed_amendments` 16 → 22, file 7 → 10 en attente (13 faites), comme
la répétition ; `integrity_check` ok, `foreign_key_check` vide ;
- dépôt des textes : `9e0f45a`, inchangé.
- `main` local avancé sur `84f015a` (depuis `b2e597b`).
- Copies retirées à 11h06:08 : `/tmp/ld-m6c-copie` (10h23:10, fournie à l'intégrateur),
`/tmp/ld-m6c-avant`, `/tmp/ld-m6c-apres`. Celles de l'intégrateur sont à retirer par lui.
- Image de retour : `libredecision-app:previous` (`b2e597b`), rien à couper.
- Copies de l'intégrateur retirées le 03/11 à 11 h 07 (scratchpad de libredecision-d4) : `m6c/base` et
`m6c/rep` (copie de la copie de production de 10 h 23, avec son dépôt nu local) et les deux `.dump`.
Plus aucune base dans ce scratchpad.