Files
decision/actes/2026-11-03-m8-chiffres-dates.md
T

181 lines
13 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 M8 (aucun chiffre daté dans les textes votés, lot T3)
Classe : déploie
Projet : libreDecision Date : 2026-11-03
**État : PRÉPARÉ, non figé** (en attente de la relecture indépendante) — sur `2ce2028`
(`2ce2028eb200932834c47af6927b9b4d3e44b65e`) ; 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).
## Intention
Mettre en ligne le lot T3. Yvv, le 03/11 avant 16 h 56, mot pour mot : « Je valide textes-quorum-seed (dont
le point 3, pas de chiffre datés dans un texte voté). Tu peux lancer la livraison de decision. » (registre
`~/harness/etat/reponses-yvv.md`, commit `9b701da`). Ordre T3 d'orch (dev-63, 03/11 vers 16 h 57) : retirer
des textes votés F1.1, F1.2, N1.1 (fr, en, es ; deux groupes) tout chiffre qui dépend de l'état de la toile ou
d'une participation à une date ; le texte reste vrai pour tout W ; la phrase de N1.1 « pas un nombre minimal
de votants », fausse pour un quorum d'auteur bas, écrite vraie. Points 1, 2, 4 et 8 de
`textes-quorum-seed.md` : le défaut reste.
**Ce qu'Yvv lira de changé** (le détail et les preuves : `docs/chantiers/acte-certification/textes-quorum-seed.md`,
section « Lot T3 ») :
1. **N1.1, l'exemple retiré** (le dernier paragraphe, dans les trois langues ; rien ne le remplace) :
« Exemple : avec 7 224 membres et une participation habituelle de 120 votants, quand 120 personnes votent,
il faut 72, 81, 90, 100 ou 108 voix pour, du cran 1 au cran 5 ; au cran 3, 75 % des 120 votants, soit 90.
Sous le quorum, les absents comptent comme « non » : au cran 2 (quorum 12), 9 voix pour passent avec
3 « contre » au plus ; au cran 3 (quorum 50), il faut 39 voix pour, avec 11 « contre » au plus. »
2. **N1.1, la phrase du quorum** (premier paragraphe) :
- avant : « Chaque cran a aussi son quorum, qui n'est pas un nombre minimal de votants : sous le quorum,
les votants qui manquent comptent comme « non ». »
- après : « Chaque cran a aussi son quorum : sous le quorum, les votants qui manquent comptent comme
« non », et il faut autant de voix pour que si le quorum avait voté. »
- en : « Each level also has its quorum: below the quorum, the voters who are missing count as votes
against, and it takes as many votes in favour as if the quorum had voted. » ; es : « Cada nivel tiene
además su quórum: por debajo del quórum, los votantes que faltan cuentan como «no», y hacen falta tantos
votos a favor como si hubiera votado el quórum. »
- pourquoi : au quorum 2 (le plus bas qu'un auteur puisse fixer dans Monnaie libre), il faut 2 « pour », à
tout cran et sur toute toile : le quorum y est bien un minimum de votants. La nouvelle phrase est vraie
pour tout quorum : sous le quorum, le moteur demande exactement le seuil du quorum
(`under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted`, plus de 500 000 cas : W de 100 à
10 000 000, chaque quorum de la borne basse à W, les cinq crans, quatre participations, le groupe
d'essai).
3. **Deux phrases de plus, écrites vraies pour tout W et tout quorum** (même principe ; accord d'orch,
03/11 à 17 h 46, « pour qu'Yvv les lise ») :
- **N1.1, l'introduction des cinq crans** :
- avant : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée quand le groupe vote comme
d'habitude, puis quand tout le monde vote, et ce qui est à ce cran au départ. »
- après : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum, quand le
groupe vote comme d'habitude, puis quand tout le monde vote, et ce qui est à ce cran au départ. »
- **F1.2, « Par défaut »** :
- avant : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et le
groupe demande 75 % de « pour » quand il vote comme d'habitude. »
- après : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et,
au-delà du quorum, le groupe demande 75 % de « pour » quand il vote comme d'habitude. »
- en : « the share asked beyond the quorum, when the group votes as usual » ; « and, beyond the quorum,
the group asks for 75% of votes in favour when it votes as usual » ; es : « la proporción exigida más
allá del quórum, cuando el grupo vota como de costumbre » ; « y, más allá del quórum, el grupo pide un
75 % de votos a favor cuando vota como de costumbre ».
- pourquoi : « 75 % comme d'habitude » est faux quand la participation habituelle reste sous le quorum :
le groupe est alors jugé sur le quorum. Exemple : une toile de 3 000 membres dont la participation
habituelle est de 40 votants (dans les bornes : 1 % de 3 000, c'est 30), au cran 3, quorum 50 : il faut
38 « pour » de ces 40 votants, soit 95 %, pas 75 %. Cela arrive dès que la toile passe sous 5 000
membres avec une participation habituelle sous 50, ou quand l'auteur d'un article fixe un quorum
au-dessus de la participation habituelle (`the_share_of_a_level_as_usual_is_asked_beyond_the_quorum`).
4. **F1.1 n'est pas touché** : ni chiffre daté, ni phrase fausse sur la toile (« B^W ne compte pas » est
prouvé de 100 à 10 000 000 membres, `b_to_the_power_w_never_counts_in_the_web_of_trust`). Rien d'autre ne
change ; les titres restent.
## Ce qui part
Version `2ce2028`, qui contient la version en ligne `6f6197c`. Code touché : `crates/ld-server/src/seed_amend.rs`
(les deux amendements), `crates/ld-server/src/wot.rs` (une constante rendue publique pour les tests, valeur
inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des tests et une fixture
(`tests/fixtures/seed-quorum-t2.json`, les textes de T2) ; le reste est documentation. `web/` et
`crates/ld-engine` : rien. 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-2-chiffres` et `2026-11-03-n1-1-chiffres`, qui suivent
(`follows`) ceux de T2 (`2026-11-03-f1-2-phrases`, `-n1-1-phrases`), 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 T2
(F1.2 `96caf353…`, N1.1 `7fbedcb8…`) ; F1.2 et N1.1 admis à la révision 4 seulement si ce sont les
amendements suivis (M5, M6b, M6c), et eux seuls, qui l'ont écrite.
- `proposals` : texte fr, révision + 1 (F1.2 et N1.1 → 5) ;
- `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`, `voted_into_force`,
`confirmed`, `votes`, `ballots`, `corrected`, `translation_edited`, `signalled`, `revised`,
`text_differs`, `changed`.
- Les amendements de T2 sur F1.2 et N1.1 sont marqués dépassés : ils ne décident plus rien.
- **F1.1 n'est pas touché. Aucun vote, aucune autre proposition, aucun autre article n'est touché ; la
publication reste suspendue.**
## Répétition
**Faite le 03/11 de 17 h 54 min 20 à 17 h 55**, avec le serveur de `2ce2028` (binaire construit à 17 h 54
dans la copie principale sur `953637f`, qui n'ajoute que le tableau ; copié en `m8/ld-server-2ce2028`), sur
une copie (17 h 47 min 05) de la copie de production prise par orch de 17 h 46 min 22 à 17 h 46 min 30
(production sur `6f6197cc`), publication vers un dépôt nu local (`m8/repetition.sh` ; journal
`m8/repetition-m8.log`, scratchpad de l'intégrateur). Deux démarrages.
| | Avant | Après |
|---|---|---|
| F1.1 (deux groupes) | ouverte, seed, révision 3, 0 vote, 0 bulletin | inchangée |
| F1.2, N1.1 (deux groupes) | ouvertes, seed, révision 4, 0 vote, 0 bulletin | révision 5 |
| Révisions | 119 | 123 |
| Traductions | 144 | 144 (en, es des deux articles remplacés) |
| `seed_amendments` | 22 | 26 |
| File de publication (Monnaie libre) | 10 en attente, 13 faites | 12 en attente, 13 faites |
| Commits vers le dépôt des textes (local) | — | 0 (« publication suspended … waiting=12 ») |
| Tout le reste (`m8/counts.sh` : migrations 1–11, propositions, unités en vigueur, I1/E1/E2, `inertia_changes`, votes, bulletins, signalements, identités, quorums) | | identique |
**La base entière comparée** (`.dump`, et colonne par colonne) : changent exactement les 4 propositions de
F1.2 et N1.1 (`body`, `revision`, `updated_at` : `ff53cbdc`, `13ee215f` dans Monnaie libre, `e7ae6bcb`,
`d75f7e90` dans l'essai), leurs 8 traductions en et es (`body`, `source_hash`, `updated_at`), 4 révisions et
4 décisions ajoutées, 2 lignes de file ajoutées et les 10 lignes en attente reportées (`next_at`), les deux
compteurs (`sqlite_sequence` : révisions 123, file 25). Et, comme à chaque démarrage du serveur (en
production aussi, puis toutes les 6 heures), W relu sur la chaîne : `settings.wot_size` 5 709 → 5 711
(lecture de `rpc.duniter.org`, aucune écriture hors de la machine). Rien d'autre. `integrity_check` ok,
`foreign_key_check` vide. Les textes écrits sont ceux du seed de `2ce2028`, en fr, en et es, dans les deux
groupes (comparés). Journal : quatre « seed amendment applied » (`2026-11-03-f1-2-chiffres`,
`-n1-1-chiffres` × essai, Monnaie libre), « publication suspended … waiting=12 », aucune ligne ERROR ni
WARN. **Un second démarrage ne rejoue rien** (comptes identiques, aucun « applied »).
## Effet attendu
- Dans les deux groupes, N1.1 n'a plus d'exemple chiffré et dit la phrase du quorum vraie ; N1.1 et F1.2
disent « au-delà du quorum » ; en fr, en et es. F1.1 inchangé.
- 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 `6f6197c` : santé `"build":"6f6197cc"` ; `prod/main` → `6f6197c`.
2. Sur une copie fraîche, `m8/premisse.sh <db>` (scratchpad de l'intégrateur, lecture seule) : 6 lignes,
toutes `open`, origine `seed`, révision 3 pour F1.1 et 4 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 l'autre. **Lu par l'intégrateur le 03/11 à 17 h 47** sur sa copie de la copie d'orch
de 17 h 46 : l'attendu exact ; 0 vote et 0 ligne de bulletin en tout ; une identité. À relire sur la copie
fraîche juste avant la poussée.
3. La relecture indépendante de `2ce2028`, inscrite « ok » dans `~/harness/etat/relectures.json`.
**En cours** : sous-agent neuf, sans le contexte de l'intégrateur, lancé le 03/11 à 17 h 55.
4. `git diff 6f6197c 2ce2028 -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/` → vide (vu par
l'intégrateur le 03/11 à 17 h 56).
5. Boucle verte sur `2ce2028`, le 03/11 de 17 h 45 à 17 h 54 (journal `m8/loop.log`), du premier coup :
fmt, clippy `-D warnings`, 312 tests Rust, svelte-check 0 / 0 (648 fichiers), 78 vitest, build, e2e
42 / 42 (17 h 48 à 17 h 54). Image de production : en cours.
6. Sur sonic, aucun témoin `/opt/libredecision-app/deploying`.
## Commande exacte
```sh
cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod 2ce2028eb200932834c47af6927b9b4d3e44b65e:main
```
## Vérifications après
- [ ] Santé vue de l'extérieur → `"build":"2ce2028e"`.
- [ ] Journaux : quatre « seed amendment applied » (`2026-11-03-f1-2-chiffres`, `-n1-1-chiffres` × essai,
Monnaie libre), « publication suspended … waiting=12 », aucune ligne ERROR ni WARN.
- [ ] Redémarrage à froid : aucun amendement rejoué.
- [ ] Sur une copie fraîche : F1.2 et N1.1 en révision 5, F1.1 en révision 3, dans les deux groupes ; le
reste identique à la ligne près à la copie d'avant (comptes de `counts.sh`) ; `integrity_check` ok.
- [ ] 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 `6f6197c`, qui
attend aussi le premier texte pour publier : pas de coupure de la publication à faire. `6f6197c` sert les
nouveaux textes tels quels (ce sont des données).
- **Les textes** : pas de retour automatique ; l'ancien texte reste dans l'historique de chaque
proposition, un nouvel amendement gardé pourrait le remettre.