From 40ab6e41c5e5855d440e7d5bfee23c8c2b05f579 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 05:15:18 +0100 Subject: [PATCH] =?UTF-8?q?Lot=20S,=20phase=202=20:=20le=20quorum=20docume?= =?UTF-8?q?nt=C3=A9=20(ADR=200013,=20notes=20dans=200002=20et=200007,=20CH?= =?UTF-8?q?ANTIER,=20CONTROLES,=20CLAUDE.md)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADR 0013 : la formule sur T' = max(T, Q), « Ils comptent comme non » dans threshold::judged_voters, les quorums par cran 12 · 12 · 50 · 50 · 50 (1 dans le groupe d'essai), le quorum d'un article fixé par l'auteur avant le premier vote (« un vote existe » : quorum::voted_units, la limite du vote retiré), p0 = 2Q₀/W, l'amendement 2026-11-03-quorums-par-cran, les nombres, le coût (une voix passe dans le groupe d'essai ; F1.1 et N1.1 du seed décrivent encore C). Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 18 ++- docs/adr/0002-vote-permanent.md | 4 + docs/adr/0007-inertie-cinq-crans.md | 4 + docs/adr/0013-quorum.md | 135 ++++++++++++++++++ docs/adr/README.md | 1 + docs/chantiers/acte-certification/CHANTIER.md | 76 ++++++---- .../chantiers/acte-certification/CONTROLES.md | 11 +- 7 files changed, 212 insertions(+), 37 deletions(-) create mode 100644 docs/adr/0013-quorum.md diff --git a/CLAUDE.md b/CLAUDE.md index 612772f..cdc0a8d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -33,7 +33,8 @@ développer. ``` crates/ - ld-engine/ # PUR (zéro I/O) : threshold (formule inertielle), inertia (cinq crans, médiane, + ld-engine/ # PUR (zéro I/O) : threshold (formule inertielle sur un quorum, judged_voters, + # yes_needed / no_needed), inertia (cinq crans, leurs quorums, bornes, médiane, # référence, échelle), edit (coquille vs fond, diff), assist (découpage, similarité, # longueur), compose (adoption, aperçus), ballot (bulletin scellé ld1:, le dernier # fait foi, jugement d'une transaction), address (SS58, préfixe g1), objection @@ -42,7 +43,7 @@ crates/ # d'une section : qui en est, complété à la fin, places), pending (modules à voter) trustin-access/ # règles d'accès de trustinWallet : sees / opens / manages_access, vote_way (serveur ou # chaîne), answers_typo, lifts_objection / reiterates_objection, reads_message, - # groupes par défaut + # sets_quorum, groupes par défaut (TEST_GROUP) ld-server/ migrations/ # schéma SQLite — additif seulement src/ # lib.rs (routes, csrf, run) · config.rs (LD_*) · auth.rs (connect OAuth2, invitations, @@ -56,15 +57,19 @@ crates/ # le dernier fait des Propositions seed, ADR 0011) · ballots.rs (vote groupé, # bulletins de la chaîne Ğ1, confirmation, « ton vote ») · indexer.rs (txComments) # · modules.rs / order.rs / doc_title.rs (les modules, ADR 0009 : l'ordre d'une - # section, le titre du document) · module_amend.rs (ajout gardé) · web.rs (sert web/build) + # section, le titre du document) · module_amend.rs (ajout gardé) · quorum.rs (le quorum + # d'un article, PUT /units/{id}/quorum ; « un vote existe » : voted_units, ADR 0013) · + # quorum_amend.rs (les quorums par cran, amendement gardé) · web.rs (sert web/build) tests/ # api.rs (scénarios bout en bout) · ballots.rs (vote par la chaîne, indexeur simulé) · # objections.rs · typos.rs (lot F, horloge avancée, migration 0008) · modules.rs (ordre, # titre, ajout gardé) · seed_proposals.rs (Propositions seed, publication suspendue) · + # quorum.rs (quorums par cran, la route, « un vote existe », l'amendement) · # fixtures/seed-production-2026-11-02/ (le seed que la production fait tourner : # I1/E1/E2 en vigueur, pour rejouer les amendements sur une base comme elle) seeds/ # acte-engagement-certification.json (trilingue, 33 articles, aucun en vigueur ; # I1/E1/E2 Propositions seed au cran 2 (seed::SEED_PROPOSAL_LEVEL), inertie 3 ailleurs ; - # modules en vigueur sans vote : le titre à 4, l'ordre de chaque section à 2) + # modules en vigueur sans vote : le titre à 4, l'ordre de chaque section à 2 ; + # quorums par cran : 12 · 12 · 50 · 50 · 50 Monnaie libre, 1 partout essai) # upcoming/.json : les « À venir » des outils d'un groupe (fr, en, es), lus au démarrage web/src/ lib/i18n/ # fr.ts SOURCE (types Key) · en.ts · es.ts — parité testée @@ -120,7 +125,10 @@ docker build -f docker/app.Dockerfile --target production . # rejoue toute la `ld-engine` avant d'être câblée. Le serveur ne décide jamais l'accès seul : `trustin-access`. - **Invariants** : au départ, aucun article n'est en vigueur : I1, E1 et E2 sont des Propositions seed (ouvertes, mises en avant, au cran 2 ; seuls les modules sont des *seeds a minima*), et la - publication d'un document attend son premier texte en vigueur (ADR 0011) ; une seule voix ne fait jamais passer un texte (C = 50 pour Monnaie libre) ; + publication d'un document attend son premier texte en vigueur (ADR 0011) ; un quorum par cran + (12 · 12 · 50 · 50 · 50 dans Monnaie libre), que l'auteur d'un article change avant le premier + vote : sous le quorum, les votants qui manquent comptent comme « non », et une seule voix ne fait + jamais passer un texte (quorum ≥ 2), sauf dans le groupe d'essai (quorum 1 ; ADR 0013) ; une coquille ne demande pas de vote, un changement de fond si ; la coquille d'un autre attend son auteur (un administrateur pour le seed) ou 3 jours, et en vigueur seule une coquille validée change le texte ; une objection retient la dernière arrivée jusqu'à sa levée (jamais un texte en diff --git a/docs/adr/0002-vote-permanent.md b/docs/adr/0002-vote-permanent.md index 59c24c9..2e8be7f 100644 --- a/docs/adr/0002-vote-permanent.md +++ b/docs/adr/0002-vote-permanent.md @@ -6,6 +6,10 @@ > **Complétée par [0011](0011-propositions-seed.md)** (2026-11-02) : aucun article n'est en > vigueur au départ ; les textes de départ des articles sont des Propositions seed, seuls les > modules restent des *seeds a minima*. +> **Le plancher C est remplacé par [0013](0013-quorum.md)** (2026-11-03) : un quorum Q par +> cran (12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 dans le groupe d'essai), que l'auteur +> d'un article peut changer avant le premier vote ; sous le quorum, les votants qui manquent +> comptent comme « non ». `vote_floor` reste, comme quorum de référence de p0. **Contexte.** Chaque article est sous vote permanent ; « dès qu'une proposition atteint le score, elle remonte en vigueur ». La formule inertielle Ğ1 donne un seuil faible quand peu de gens diff --git a/docs/adr/0007-inertie-cinq-crans.md b/docs/adr/0007-inertie-cinq-crans.md index 54c829d..d899960 100644 --- a/docs/adr/0007-inertie-cinq-crans.md +++ b/docs/adr/0007-inertie-cinq-crans.md @@ -2,6 +2,10 @@ > Complète [0002](0002-vote-permanent.md) : la règle « l'inertie se vote au cran au-dessus » > y est remplacée par l'héritage décrit ici. Décision d'Yvv du 2026-10-30 (revue, L10). +> **Le C de la formule est remplacé par [0013](0013-quorum.md)** (2026-11-03) : R = B^W + +> ratio(T')·T', T' = max(T, Q), un quorum Q par cran. M, G_k, s_k, p̃ et ses bornes restent ; +> « au-delà de C » se lit désormais « parmi les T' votants » ; les nombres ci-dessous sont ceux +> d'avant (ceux d'après : ADR 0013). **Contexte.** Quatre niveaux (`low`, `standard`, `high`, `max`) fixaient M et G une fois pour toutes. Yvv, 2026-10-30 : « L'indice d'inertie doit avoir 5 niveaux. Tu mets par défaut au diff --git a/docs/adr/0013-quorum.md b/docs/adr/0013-quorum.md new file mode 100644 index 0000000..6649486 --- /dev/null +++ b/docs/adr/0013-quorum.md @@ -0,0 +1,135 @@ +# 0013 — Le quorum : les votants qui manquent comptent comme « non » + +> Remplace, dans [0002](0002-vote-permanent.md) et [0007](0007-inertie-cinq-crans.md), le +> plancher C de voix pour placé devant la formule. Décisions d'Yvv du 2026-11-02 et du +> 2026-11-03. La migration est la `0011` : la `0010` reste au lot V. + +**Contexte.** Depuis le 2026-10-21, `R = C + B^W + (M + (1 − M)(1 − (T/W)^G)) · max(0, T − C)` : +C voix pour d'abord (50 dans Monnaie libre, 1 dans le groupe d'essai), puis la part de l'inertie +sur les votes au-delà. Yvv, 2026-11-02 : « C suit le cran, mais c'est une proposition par +défaut, variable modifiable par l'auteur initial du texte » ; « ce n'est pas un nombre de vote +pour a priori, c'est plutôt un quorum, à partir de ce nombre, alors il faut la bonne proportion +attendue par l'indice. Si c'est 60 % et c = 10, alors il faut 6 voix pour et ça passe. » Au +formulaire : « La courbe d'aujourd'hui, après le quorum » ; les quorums par défaut +« 12 · 12 · 50 · 50 · 50 », le groupe d'essai à 1 partout ; « L'auteur, avant le 1er vote ». +Le 2026-11-03, à « Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? » : +« Ils comptent comme non ». + +## Décision + +**La formule, jugée sur un quorum Q** (`crates/ld-engine/src/threshold.rs`) : + +``` +T' = max(T, Q) +R = B^W + (M + (1 − M)·(1 − (T'/W)^G)) · T' +``` + +Une version passe si au moins une voix est exprimée et si « pour » ≥ ⌈R⌉. Sous le quorum, les +votants qui manquent comptent comme « non » : la part de l'inertie est demandée à Q votants. +La règle tient dans **une seule fonction nommée**, `threshold::judged_voters`, qui porte la +phrase d'Yvv. M, G et les cinq crans ne changent pas (ADR 0007) : la courbe est celle +d'aujourd'hui, après le quorum. L'exemple d'Yvv (60 %, Q = 10) donne 6 « pour » ; 6 « pour » +contre 5 « contre » ne passent pas, 7 contre 4 passent. + +**Monotone.** Un « pour » de plus ne nuit jamais, un « contre » de plus n'aide jamais : à +« pour » fixé, un « contre » de plus laisse T' à Q ou l'augmente, et ratio(T')·T' ne décroît pas +avec T' (sa dérivée reste entre 0,06 et 1 pour les cinq crans, p̃ dans ses bornes). Les tests +le vérifient sur une grille (`an_against_never_helps`, l'équivalence de `passes` avec +`yes_needed` et `no_needed`). + +**Ce que l'écran peut dire** (`Evaluation`) : `quorum` ; `yesNeeded`, le total de « pour » qui +passe avec les « contre » d'aujourd'hui ; `noNeeded`, le total de « contre » qui tient les +« pour » d'aujourd'hui en échec (0 : le quorum les tient déjà) ; `missing = yesNeeded − pour` ; +`wellRated`, la part de l'inertie tenue sur les T votants venus, le quorum mis de côté +(l'aperçu « si les bien cotées passent »). + +**Un quorum par cran**, le défaut d'un article à ce cran (`documents.quorums`) : Monnaie libre +**12 · 12 · 50 · 50 · 50**, le groupe d'essai **1 partout**. Une proposition d'inertie se juge +sur le quorum de son article (elle hérite de son cran, ADR 0007) ; un module, sur celui de son +cran. + +**Le quorum d'un article** (`units.quorum`, NULL : celui du cran) est fixé par l'auteur de sa +première version — pour un texte du seed, sans auteur, par un administrateur —, et seulement +**avant le premier vote** : `trustin_access::sets_quorum`, la route `PUT /units/{id}/quorum` +(`{ "quorum": n | null }`, en-tête CSRF), dans `crates/ld-server/src/quorum.rs`. Bornes : de 2 +à W (une voix seule ne fait jamais passer un texte), de 1 à W dans le groupe d'essai +(`ld_engine::inertia::quorum_bounds`, `trustin_access::TEST_GROUP`). Chaque changement est +consigné (`quorum_changes` : qui, de quoi, à quoi, quand). Refus : 403 à qui n'est pas +l'auteur, 400 `quorum` hors des bornes, 409 `voted` dès qu'un vote existe. + +**« Un vote existe »** : une seule fonction, `quorum::voted_units` (et `quorum::a_vote_exists` +pour une unité), que le lot V étendra là et nulle part ailleurs. Sur l'une des versions de +l'article (textes, retrait, changement d'inertie ; toute révision) : un vote du serveur +(`votes`) ; une ligne de bulletin de la chaîne en attente ou confirmé (un bulletin refusé ou +expiré n'est pas un vote) ; une adoption (une version entrée en vigueur par le vote en garde la +trace, même ses votes retirés). **Limite connue** : un vote du serveur retiré avant toute +adoption ne laisse pas de ligne (`votes` ne garde que le dernier choix) ; après lui, l'auteur +peut de nouveau fixer le quorum. + +**La participation de référence** reste p0 = 2Q₀/W, Q₀ le quorum de référence du document +(`documents.vote_floor` : 50 dans Monnaie libre, 1 dans le groupe d'essai), **jamais le quorum +d'un article** : un auteur qui baisserait le sien déplacerait l'échelle de tout le groupe. + +## Une base existante + +Un document seedé n'est jamais réinstancié. Tant que `documents.quorums` est NULL, chaque cran +lit `vote_floor` (le C d'avant : 50 et 1). L'**amendement de quorums** +`2026-11-03-quorums-par-cran` (`crates/ld-server/src/quorum_amend.rs`) décide une fois par +document, seulement si le seed d'aujourd'hui donne ces quorums à l'instance : NULL → écrit +(`applied`) ; les mêmes → `present` ; d'autres → refusé (`quorums_set`), gardés tels quels. +Chaque décision est consignée (`quorum_amendments` : ce qui était là, ce que dit le seed, +l'issue, la raison) et dans les journaux ; là où le document publie (Monnaie libre), une ligne +s'ajoute à la file (« quorums par cran : 12 · 12 · 50 · 50 · 50 (ADR 0013) »), qui attend le +premier texte (ADR 0011). Rien d'autre n'est touché : ni le quorum propre d'un article, ni un +vote, ni un texte. + +## Les nombres + +Monnaie libre, W = 5 745 (repli des tests), participation de référence (100 votants) : + +| | cran 1 | cran 2 | cran 3 | cran 4 | cran 5 | +|---|---|---|---|---|---| +| quorum | 12 | 12 | 50 | 50 | 50 | +| « pour » à 0 vote (C d'avant : 50) | 8 | 9 | 39 | 43 | 46 | +| « pour » à 100 votants (C d'avant : 80 · 84 · 88 · 92 · 95) | 60 | 67 | 75 | 83 | 90 | + +Au cran 2, quorum 12 : 9 « pour » passent avec 3 « contre » au plus ; 9 contre 4 demandent 11 +(`yesNeeded`), il en manque 2 ; 8 « pour » ne passent pas même sans « contre » (`noNeeded` 0). + +W = 7 224 (tests `ld-engine/src/inertia.rs`), « pour » exigés : + +| Médiane | T | cran 1 | cran 2 | cran 3 | cran 4 | cran 5 | +|---|---|---|---|---|---|---| +| 120 votants | 120 | 72 | 81 | 90 | 100 | 108 | +| 120 votants | 500 | 284 | 310 | 347 | 386 | 424 | +| 120 votants | 2 000 | 1 068 | 1 123 | 1 252 | 1 389 | 1 537 | +| 360 votants | 120 | 76 | 86 | 96 | 106 | 113 | +| 360 votants | 360 | 216 | 242 | 270 | 299 | 324 | +| 360 votants | 500 | 296 | 328 | 367 | 407 | 443 | +| 360 votants | 2 000 | 1 092 | 1 164 | 1 301 | 1 446 | 1 598 | + +Le cas de référence de la formule (vote forgeron v2.0.0 : W 7 224, 120 votants, M 50 %, G 0,2, +Q 0 → 94 voix) reste le test de la formule elle-même. + +## Les données + +Migration `0011` (additive) : `documents.quorums` (JSON des cinq quorums), `units.quorum`, les +tables `quorum_changes` et `quorum_amendments`. Le seed : `"quorums"` sur chaque instance. +`vote_floor` reste, lu pour p0. Les adoptions nouvelles gardent `quorum` dans leurs `params` +(celles d'avant gardent `constant`, lu tel quel). L'API : `doc.quorums`, `levels[].quorum`, +l'unité `quorum` (le sien ou `null`), `quorumDefault`, `canSetQuorum` ; le `document.json` +publié : `quorums`. + +## Coût + +- Les seuils de Monnaie libre baissent à faible participation : 9 « pour » au lieu de 50 pour + I1, E1 et E2 au cran 2 ; 39 au lieu de 50 au cran 3. À la participation habituelle, la part + s_k s'applique à tous les votants, plus seulement au-delà de C. +- **Dans le groupe d'essai, une voix seule passe**, à tout cran et quel que soit le nombre de + membres (avant : deux voix sous 16 membres). Les tests qui demandent deux voix y posent le + quorum 2 de l'article, comme son auteur le ferait. +- En production, si les propositions d'inertie I1 → 5 et E1 → 5 restent ouvertes (ADR 0011), + I1 et E1 restent aux crans 3 et 4 : leur quorum est 50, pas 12. +- Le texte F1.1 du seed (« Seuil = C + B^W + … ») et N1.1 (« le groupe demande d'abord C voix + pour ») décrivent encore C : orch les réécrira au prochain tour de textes, avec la relecture + d'Yvv (ce lot ne touche pas aux textes du seed). diff --git a/docs/adr/README.md b/docs/adr/README.md index 651e77c..ca3f59b 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -16,3 +16,4 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan | [0009](0009-modules-ordre-et-titre.md) | Les modules : l'ordre des articles de chaque section (inertie 2), le titre du document (inertie 4) | 2026-10-31 | | [0010](0010-objections-et-coquilles-validees.md) | Objections « redit » / « contredit », coquilles validées, messagerie (remplace 0004, complète 0003) | 2026-10-31 | | [0011](0011-propositions-seed.md) | Les Propositions seed : rien en vigueur au départ, trois textes mis en avant au cran 2, la publication attend le premier texte (complète 0002) | 2026-11-02 | +| [0013](0013-quorum.md) | Le quorum par cran (12 · 12 · 50 · 50 · 50), fixé par l'auteur avant le premier vote ; sous le quorum, les votants qui manquent comptent comme « non » (remplace le C de 0002 et 0007) | 2026-11-03 | diff --git a/docs/chantiers/acte-certification/CHANTIER.md b/docs/chantiers/acte-certification/CHANTIER.md index 3ddb115..23a4b18 100644 --- a/docs/chantiers/acte-certification/CHANTIER.md +++ b/docs/chantiers/acte-certification/CHANTIER.md @@ -53,8 +53,8 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. pourquoi), puis l'inertie et la formule. Les autres gestes ouvrent un panneau latéral (une feuille sur mobile), lui aussi dans l'URL : **Panier**, **Propositions**, **Proposer**, **Détails** d'une version (coquilles, traductions, objections, historique) et - **« Réglages de la formule »** (W, C, B, la participation habituelle du groupe et les cinq - crans), atteints depuis l'en-tête du document et depuis chaque vote. + **« Réglages de la formule »** (W, B, la participation habituelle du groupe et les cinq + crans avec leur quorum), atteints depuis l'en-tête du document et depuis chaque vote. 5. **En dessous**, les propositions en cours — les 33 articles du texte source, à zéro vote : les trois Propositions seed au cran 2, les 30 autres à l'inertie 3 / 5 — rangées par section (introduction, fondamental, technique, conclusion, annexes, formule, inertie, ordonnancement), **une ligne par article** : un @@ -86,46 +86,61 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. ### Le seuil — formule inertielle Ğ1 ``` -R = C + B^W + (M + (1 − M)·(1 − (T/W)^G)) · max(0, T − C) +T' = max(T, Q) +R = B^W + (M + (1 − M)·(1 − (T'/W)^G)) · T' ``` W = électorat (Monnaie libre : taille de la toile, lue sur la chaîne toutes les 6 h ; un groupe -géré : ses membres), T = votes exprimés, M = majorité, G = gradient, B = 0,1, **C = plancher de -votants « pour »** (Monnaie libre : **50** ; groupe d'essai : 1). Adoptée si « pour » ≥ ⌈R⌉. +géré : ses membres), T = votes exprimés, M = majorité, G = gradient, B = 0,1, **Q = quorum** +(ADR 0013, Yvv 2026-11-02 et 03) : sous Q votants, **ceux qui manquent comptent comme « non »** +(« Ils comptent comme non »). Adoptée si « pour » ≥ ⌈R⌉. Chaque cran a son quorum, le défaut +d'un article à ce cran : Monnaie libre **12 · 12 · 50 · 50 · 50**, groupe d'essai **1 partout** +(une voix seule y passe). **L'auteur de la première version d'un article** (un administrateur +pour un texte du seed) peut en fixer un autre, **avant le premier vote** (« L'auteur, avant le +1er vote ») : de 2 à W, de 1 à W dans le groupe d'essai ; chaque changement est consigné. Il +remplace le plancher C (« C suit le cran, mais c'est une proposition par défaut […] c'est +plutôt un quorum »). **Cinq crans d'inertie** (Yvv, 2026-10-30 ; ADR 0007). Seuls M et G dépendent du cran k : -M_k est la majorité à pleine participation, s_k la part de « pour » exigée **au-delà de C** quand -le groupe vote comme d'habitude (participation p̃), et G_k s'en déduit : +M_k est la majorité à pleine participation, s_k la part de « pour » exigée des votants quand le +groupe vote comme d'habitude (participation p̃), et G_k s'en déduit : G_k = ln(1 − (s_k − M_k)/(1 − M_k)) / ln(p̃). -| Cran | Nom | M_k | s_k | Au départ | -|---|---|---|---|---| -| 1 | très basse | 50 % | 60 % | | -| 2 | basse | 50 % | 67 % | les trois Propositions seed (Raison d'être, Unicité du compte, Réciprocité), l'ordre des articles de chaque section | -| 3 | moyenne | 55 % | 75 % | partout ailleurs | -| 4 | haute | 60 % | 83 % | le titre du document | -| 5 | très haute | 66 % | 90 % | | +| Cran | Nom | M_k | s_k | Quorum (Monnaie libre) | Au départ | +|---|---|---|---|---|---| +| 1 | très basse | 50 % | 60 % | 12 | | +| 2 | basse | 50 % | 67 % | 12 | les trois Propositions seed (Raison d'être, Unicité du compte, Réciprocité), l'ordre des articles de chaque section | +| 3 | moyenne | 55 % | 75 % | 50 | partout ailleurs | +| 4 | haute | 60 % | 83 % | 50 | le titre du document | +| 5 | très haute | 66 % | 90 % | 50 | | **La participation habituelle p̃** = la médiane des votants des propositions du groupe votées -depuis un an (au moins 5), sur W ; avant, la référence 2C/W (Monnaie libre : 100 votants) ; +depuis un an (au moins 5), sur W ; avant, la référence 2Q₀/W, Q₀ le quorum de référence du +document (`vote_floor` : 50 dans Monnaie libre, 100 votants ; jamais le quorum d'un article) ; toujours ramenée entre 1 % et 50 %. Mesurée une fois par jour. Le seuil croît avec le cran, la -part exigée se relâche vers M quand plus de monde vote, et rien ne passe sous C voix pour. +part exigée se relâche vers M quand plus de monde vote, et sous le quorum les votants qui +manquent comptent comme « non ». -Avec W = 7 224, C = 50 et une médiane de 120 votants, il faut, à 120 votants, 92, 97, 103, 109 -et 113 voix pour ; à 500, 306, 329, 362, 397 et 432 ; à 2 000, 1 091, 1 145, 1 271, 1 404 et -1 549. +Avec W = 5 745 et la référence (100 votants), il faut, sans aucun vote, 8, 9, 39, 43 et 46 voix +pour (crans 1 à 5) ; à 100 votants, 60, 67, 75, 83 et 90. Au cran 2 (quorum 12), 9 « pour » +passent avec 3 « contre » au plus. Avec W = 7 224 et une médiane de 120 votants, il faut, à 120 +votants, 72, 81, 90, 100 et 108 ; à 500, 284, 310, 347, 386 et 424 ; à 2 000, 1 068, 1 123, 1 252, +1 389 et 1 537 (ADR 0013). -Moteur : `crates/ld-engine/src/threshold.rs` (la formule ; son cas de référence, lettres -données : 7224 / 120 votants, M 50 %, G 0,2, C 0 → 94 voix) et `crates/ld-engine/src/inertia.rs` -(les crans, la médiane, la référence, les bornes) ; mesure : `crates/ld-server/src/participation.rs`. +Moteur : `crates/ld-engine/src/threshold.rs` (la formule, la règle du quorum dans +`judged_voters`, `yes_needed` / `no_needed` ; son cas de référence, lettres données : 7224 / 120 +votants, M 50 %, G 0,2, Q 0 → 94 voix) et `crates/ld-engine/src/inertia.rs` (les crans, leurs +quorums, la médiane, la référence, les bornes) ; mesure : `crates/ld-server/src/participation.rs` ; +le quorum d'un article : `crates/ld-server/src/quorum.rs` (la route, « un vote existe » dans +`voted_units`). ### Le vote permanent - Toute version d'un article (proposition ou texte en vigueur) se vote à tout moment. - Une proposition **remonte en vigueur** dès qu'elle atteint son seuil **et** tient une marge (pour − requis) plus large que la version en place. La version déplacée redevient une - proposition, avec ses votes. Un *seed a minima* a pour marge −C : la première proposition qui - atteint son seuil le remplace. + proposition, avec ses votes. Un *seed a minima* (sans vote) a une marge négative : la première + proposition qui atteint son seuil le remplace. - **Les Propositions seed** (ADR 0011) ne sont pas en vigueur : la place est vide, la première version de l'article qui atteint son seuil y entre. Yvv remontera leur inertie une fois les textes passés, par un vote : une inertie relevée avant eux leur demanderait davantage. @@ -150,7 +165,7 @@ Revue du 2026-10-30 : « En fin de section, il y a un "module" qui permet de cha titre d'un article reste voté avec son texte. - Un module se vote **comme un article** : déplié, dans le panier, par la chaîne Ğ1 dans - Monnaie libre, avec la marge du texte en place (seed a minima : −C) et son cran. Son inertie + Monnaie libre, avec la marge du texte en place (seed a minima : négative) et son cran. Son inertie se vote aussi. Il compte dans « Décisions » : le seed passe de 33 à **41 modules à voter** (33 articles, le titre, l'ordre de 7 sections ; l'ordonnancement n'a qu'un article). - **L'ordre d'une section** est la liste de ses articles qui ont un texte en vigueur ou une @@ -315,6 +330,12 @@ redevient ouverte et marquée, l'historique le dit ; son cran descend à 2 avec personne n'y a touché non plus (aucun changement d'inertie proposé, voté ou appliqué). Décisions consignées dans `seed_proposal_amendments` (`crates/ld-server/src/seed_proposal_amend.rs`). +De même, les **quorums par cran** du seed (ADR 0013) s'écrivent dans un document qui n'en a pas, +par un amendement gardé (`2026-11-03-quorums-par-cran`, `crates/ld-server/src/quorum_amend.rs`), +une seule fois par document : écrits là où il n'y en a pas, gardés s'ils sont autres (refus +`quorums_set`) ; décisions consignées dans `quorum_amendments`, une ligne à la file là où le +document publie. Jusque-là, chaque cran lit `vote_floor` (le C d'avant). + ### Accès — trustinWallet Tout le monde connecté peut tout faire dans les groupes qu'il ouvre (lire, proposer, voter, @@ -340,7 +361,7 @@ gérés (essai, Axiom…), tout membre vote directement, sans portefeuille. ## Le groupe d'essai -Caché, plancher C = 1, sans publication : on y éprouve tout (adoption, coquilles, découpage) +Caché, quorum 1 à chaque cran (une voix seule passe), sans publication : on y éprouve tout (adoption, coquilles, découpage) sans toucher au texte de la communauté. Chiara et Yvv en sont membres. ## Décisions prises (2026-10-21, avec Yvv) @@ -351,8 +372,9 @@ sans toucher au texte de la communauté. Chiara et Yvv en sont membres. | Domaine | le produit à la racine `decision.librodrome.org` ; la maquette sur `maquette.decision.librodrome.org` | | Connexion | client OAuth2 de connect.monnaie-libre.fr (demande à poka) ; liens d'invitation en attendant | | Dépôt des textes | `git.open.us.org/yvv/decision-depot-textes-reference` pour l'instant (2026-10-21) ; puis un dépôt pour l'ouverture, par transfert, et le dépôt officiel pour les textes en vigueur | -| Garde-fou du vote permanent | nombre minimal de votants « pour » (C) | +| Garde-fou du vote permanent | nombre minimal de votants « pour » (C) ; remplacé le 2026-11-03 par un quorum par cran, les votants qui manquent comptant comme « non » (ADR 0013) | | Textes de départ (2026-11-02) | aucun article en vigueur : trois Propositions seed (I1, E1, E2) au cran 2, la publication suspendue jusqu'au premier texte (ADR 0011) | +| Quorum (2026-11-02 et 03) | 12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 dans le groupe d'essai ; l'auteur d'un article le change avant le premier vote ; sous le quorum, les votants qui manquent comptent comme « non » (ADR 0013) | | Langues | fr, en, es ; le français est voté, les traductions sont éditoriales | | Chiara | testeuse et codeuse | | Assistant | à règles d'abord ; IA locale plus tard, sans dépendance d'abonnement | diff --git a/docs/chantiers/acte-certification/CONTROLES.md b/docs/chantiers/acte-certification/CONTROLES.md index ab67303..b9f662d 100644 --- a/docs/chantiers/acte-certification/CONTROLES.md +++ b/docs/chantiers/acte-certification/CONTROLES.md @@ -5,10 +5,10 @@ Chaque contrôle existe en deux versions : **automatique** (Playwright, `web/e2e sur un contrôle vaut échec du contrôle tant qu'elle n'est pas traitée. Où tester : les contrôles qui écrivent (C5, C6, C7, C21, C22, C25, C26, C28–C31) se font dans le **groupe -d'essai** (caché, plancher C = 1, jamais publié) — jamais sur le texte de la communauté. Au départ, rien +d'essai** (caché, quorum 1 à chaque cran — une voix seule y passe, ADR 0013 —, jamais publié) — jamais sur le texte de la communauté. Au départ, rien n'y est en vigueur (ADR 0011) : les contrôles qui lisent un texte en vigueur (C4 à C6, C20, C21, C24, -C28 à C31) y font d'abord entrer Raison d'être, Unicité du compte et Réciprocité par le vote (deux voix -au plus, puis leur retrait : le texte reste en vigueur, à zéro vote ; `seedsInForce`, `web/e2e/helpers.ts`). Les +C28 à C31) y font d'abord entrer Raison d'être, Unicité du compte et Réciprocité par le vote (une voix +suffit, deux au plus, puis leur retrait : le texte reste en vigueur, à zéro vote ; `seedsInForce`, `web/e2e/helpers.ts`). Les votes par la chaîne Ğ1 (C11, C17, C23, C25, C32, C33) ne se jouent, pour l'automate, que sur une **chaîne simulée** (`web/e2e/chain-mock.mjs` : un faux nœud, un faux indexeur, un faux portefeuille) ; pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. @@ -35,14 +35,14 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. | C17 | Décisions | Monnaie libre → Décisions ; voter (par la chaîne : bulletin, transaction, confirmation) sur une version d'un article, recharger | une ligne par doc : « Acte d'engagement Certification · 41 modules à voter · dont 41 sans ton vote » (33 articles, le titre, l'ordre de 7 sections), puis « dont 40 » ; la ligne ouvre le lecteur | | C18 | La Raison d'être | Monnaie libre → Acte d'engagement Certification → « Si tout passe », puis EN, puis ES | en tête du texte, « Raison d'être » : la première phrase en italique, puis deux paragraphes ; « Purpose », « Razón de ser » | | C19 | Les versions d'un article | Monnaie libre → « Propositions en cours » → « Connaissance suffisante » (au clavier : Tab jusqu'à la ligne, Entrée) | une seule ligne, « 2 versions » ; dépliée : « variante 1.0.0 » et « variante 0.4.0-draft », chacune avec son niveau et ce qui la distingue ; un clic sur une version déplie son vote sous elle ; un nouveau clic sur la ligne la replie | -| C20 | Réglages de la formule et cinq crans | Monnaie libre → Acte d'engagement : « Réglages de la formule » (en-tête) ; puis, dans « Propositions en cours », Unicité du compte → son vote → « Réglages de la formule » ; dans le groupe d'essai, Réciprocité (entrée en vigueur par le vote) → « Le vote » → « Proposer un changement d'inertie » → 5 → « Soumettre au vote » | W 5 745 (toile de confiance Ğ1), C 50, B 0,1 ; « 100 votants sur 5 745 (1,74 %), deux fois C : la participation de référence… (0 pour l'instant) » ; le tableau des cinq crans : très basse, basse, moyenne, haute, très haute ; M 50, 50, 55, 60, 66 % ; part exigée 60, 67, 75, 83, 90 % ; voix pour à 100 votants 80, 84, 88, 92, 95, « Voix pour : à 100 votants, comme d'habitude. » ; depuis le vote déplié : « Inertie · 2 / 5 · basse », la ligne du cran 2 marquée « cet article », 50 voix, « Voix pour : à 0 votant, la participation de cette version. » ; le sélecteur montre les cinq crans, 2 « actuelle », atteignable au clavier mais jamais choisi ; un seul arrêt de tabulation ; les flèches passent d'un cran à l'autre et le choisissent, en boucle ; le vote de la proposition se déplie : « inertie vers 5 / 5 · très haute », votée à « inertie 2 / 5 · basse » | +| C20 | Réglages de la formule et cinq crans | Monnaie libre → Acte d'engagement : « Réglages de la formule » (en-tête) ; puis, dans « Propositions en cours », Unicité du compte → son vote → « Réglages de la formule » ; dans le groupe d'essai, Réciprocité (entrée en vigueur par le vote) → « Le vote » → « Proposer un changement d'inertie » → 5 → « Soumettre au vote » | W 5 745 (toile de confiance Ğ1), B 0,1 ; « 100 votants sur 5 745 (1,74 %), deux fois 50, le quorum de référence : la participation de référence… (0 pour l'instant) » ; le tableau des cinq crans : très basse, basse, moyenne, haute, très haute ; M 50, 50, 55, 60, 66 % ; part exigée 60, 67, 75, 83, 90 % ; quorum 12, 12, 50, 50, 50 (ADR 0013) ; voix pour à 100 votants 60, 67, 75, 83, 90, « Voix pour : à 100 votants, comme d'habitude. », « Part exigée : la part de « pour » demandée, à 100 votants comme d'habitude. », « Quorum : en dessous, les votants qui manquent comptent comme « non ». … » ; depuis le vote déplié : « Inertie · 2 / 5 · basse », la ligne du cran 2 marquée « cet article », à 0 votant 8, 9, 39, 43, 46 voix, « Voix pour : à 0 votant, la participation de cette version. » ; le sélecteur montre les cinq crans, 2 « actuelle », atteignable au clavier mais jamais choisi ; un seul arrêt de tabulation ; les flèches passent d'un cran à l'autre et le choisissent, en boucle ; le vote de la proposition se déplie : « inertie vers 5 / 5 · très haute », votée à « inertie 2 / 5 · basse » | | C21 | Le vote déplié | groupe d'essai : Unicité du compte → « Le vote », puis « Pour » ; une autre personne ouvre le même vote | sous l'article : le niveau d'eau, « 0 pour · 0 contre », « Seuil : … voix pour », « Il manque … », « Tu n'as pas voté sur cette version. » ; après « Pour » : « Ton vote : pour · enregistré », « 1 pour · 0 contre », le bouton enfoncé, « Ton vote ne se montre à personne : seuls les totaux sont visibles. » ; l'autre personne voit 1 pour, jamais qui ; « Le vote » replie ; « Retirer mon vote » remet 0 | | C22 | Le vote groupé | groupe d'essai : « Propositions en cours » → « Engagements techniques » → « Voter cette section » ; « Tout pour » ; dans « Connaissance suffisante », « Pour » sur la variante 1.0.0 ; recharger ; « Voter (n) » | le panier s'ouvre sur la section ; « Tout pour » remplit les articles à une version, pas « Connaissance suffisante » ni « Rencontre physique… » (« Plusieurs versions : choisis la tienne. », et le compte des articles laissés) ; le panier reste après rechargement (« Voter en lot · n ») ; un seul envoi : « n votes enregistrés. », le panier vide, la variante choisie à 1 pour | | C23 | Le vote par la chaîne Ğ1 | Monnaie libre, un portefeuille dans le navigateur : « Voter en lot », « Pour » sur Unicité du compte et Réciprocité (Propositions seed), « Signer et envoyer (2) » ; puis, dans « Propositions en cours », sous Réciprocité, « Contre » (l'indexeur en retard) puis « Retirer mon vote » ; puis sans portefeuille : « Pour » → « Passer par Ğecko » | une seule signature pour les deux : 0,1 Ğ1 vers le compte des votes et une remarque `ld1:` + 64 chiffres, rien du vote en clair ; « Ton vote compte : il est inscrit sur la chaîne Ğ1. », « Compté pour l'identité Ğ1 « Alice ». » ; sous la proposition « Ton vote : pour · inscrit sur la chaîne Ğ1 », 1 pour ; « En attente de la chaîne Ğ1 : contre. » ; le retrait, plus récent sur la chaîne, fait foi même quand le « contre » est confirmé après lui (0 pour · 0 contre) ; Ğecko : un QR code et le lien `g1://?amount=0.1&comment=ld1:…`, puis la confirmation dès que la chaîne la montre | | C24 | Sans compte des votes | Monnaie libre sur un serveur sans `LD_VOTE_ACCOUNT`, puis le groupe d'essai | pas de « Voter en lot » ni « Voter cette section » ; sous la première proposition : « Le vote par la chaîne Ğ1 n'est pas encore ouvert : le compte qui reçoit les votes reste à créer. Tu peux lire, proposer et faire une objection. », pas de bouton, les totaux et le seuil restent ; le panier ouvert par son adresse (`?onglet=panier`) dit la même chose, son bouton éteint, et **jamais** « Tes votes comptent dès l'envoi » ; dans le groupe d'essai, le panier et les boutons sont là | | C25 | L'ordre des articles | groupe d'essai : en fin de « Conclusion », « Proposer un autre ordre » ; cliquer « Monnaie G1 » puis la place 1 ; au clavier, flèche bas puis haut ; « Proposer cet ordre » ; « Pour » ; une deuxième personne vote « Pour » si cette voix ne suffit pas (dès 16 membres, une voix suffit dans le groupe d'essai : ADR 0007) ; puis, dans Monnaie libre, sur un téléphone, avec un portefeuille : « Voter en lot », « Pour » sur « Ordre des articles · Engagements fondamentaux », « Signer et envoyer (1) » | chaque section finit par « Ordre des articles ·
» (7, aucun pour l'Ordonnancement, un seul article), ses articles numérotés, « 2 articles · inertie 2 / 5 · basse », « seed a minima · 0 vote » ; le vote d'un ordre en vigueur déplié montre la liste entière ; la liste où l'on clique : l'article choisi marqué, puis à sa place, annoncé (« « Monnaie G1 » en place 1 sur 2. »), « Proposer cet ordre » éteint tant que c'est l'ordre en vigueur ; le vote de l'ordre proposé se déplie dans la liste des propositions, l'ordre proposé en clair ; il est dans le panier, à la fin de sa section ; à la voix qui suffit : « Le nouvel ordre de « Conclusion » est entré en vigueur. », la section se lit dans le nouvel ordre ; par la chaîne : « Ton vote compte : il est inscrit sur la chaîne Ğ1. », « seed a minima · 1 vote » ; sur un téléphone, rien ne déborde, chaque ligne fait au moins 44 px | | C26 | Le titre du document | groupe d'essai : sous le titre, « Proposer un autre titre » ; « Acte d'engagement de la certification » ; « Pour » ; une deuxième personne vote « Pour » si cette voix ne suffit pas ; lire en anglais | sous le titre : « Titre du document · inertie 4 / 5 · haute · seed a minima · 0 vote » et les trois gestes ; le titre proposé se vote dans la liste des propositions (« Titre du document ») ; à la voix qui suffit : « Le titre « … » est entré en vigueur. », le document change de titre, son vote reste déplié sous le titre ; en anglais, l'ancien titre traduit, marqué « translation needs review » | -| C27 | La participation ramenée dans ses bornes | un groupe de 4 dont la médiane est 2,5 votants, ramenée à 50 % (l'automate fait répondre ces chiffres au serveur) : « Réglages de la formule » | « 3 votants sur 4 (62,5 %) : la médiane des 12 propositions votées depuis un an. » — la part de la mesure elle-même, jamais 3 sur 4 arrondi d'abord ; puis « Ramenée entre 5 % et 50 % de l'électorat : le groupe demande ses voix pour comme si 2 personnes votaient (50 %). » ; « Part exigée : les « pour » demandés au-delà de C, à 2 votants comme d'habitude. » | +| C27 | La participation ramenée dans ses bornes | un groupe de 4 dont la médiane est 2,5 votants, ramenée à 50 % (l'automate fait répondre ces chiffres au serveur) : « Réglages de la formule » | « 3 votants sur 4 (62,5 %) : la médiane des 12 propositions votées depuis un an. » — la part de la mesure elle-même, jamais 3 sur 4 arrondi d'abord ; puis « Ramenée entre 5 % et 50 % de l'électorat : le groupe demande ses voix pour comme si 2 personnes votaient (50 %). » ; « Part exigée : la part de « pour » demandée, à 2 votants comme d'habitude. » | | C28 | Objection « redit » ; sur la version retenue, « contre » et retrait, jamais « pour » | groupe d'essai, à trois (Aude, Oscar, Vera) : Aude propose un nouvel article qui répète « Unicité du compte » ; Oscar, dans « Détails » de cette proposition → « Faire une objection » → « Redit », « En vigueur — Unicité du compte », un motif → « Envoyer l'objection » ; Vera déplie son vote → « Contre », puis « Retirer mon vote » ; Vera ouvre « Voter en lot » → « Tout le document » : « Tout pour », puis « Tout contre », puis « Vider » ; Aude ouvre « Messages » → « Modifier l'article visé », complète le texte et soumet ; Oscar ouvre « Messages » → « Lever l'objection » ; Vera déplie de nouveau son vote | « Objection enregistrée : jusqu'à sa levée, personne ne peut plus voter pour la dernière arrivée des deux versions. » ; chez Oscar, « « … » redit « Unicité du compte » », « personne ne peut plus voter pour cette version », « Lever l'objection » ; chez Vera, « Une objection retient cette version : jusqu'à sa levée, personne ne peut plus voter pour. Tu peux voter contre ou retirer ton vote ; à la levée, elle n'entre en vigueur qu'avec les voix encore là. », « Elle redit « Unicité du compte ». », pas de « Pour », mais « Contre », la ligne marquée « retenue par une objection » ; après « Contre » : « Vote enregistré. », « Ton vote : contre », « 0 pour · 1 contre », et « Retirer mon vote » ; après le retrait : « Vote retiré. », « 0 pour · 0 contre », toujours pas de « Pour » ; dans le panier, la version retenue montre « Contre » sans « Pour », avec « une objection la retient : contre ou retrait, pas de « pour » » ; « Tout pour » la laisse de côté et le dit (« Tu as tout mis pour, sauf 1 version qu'une objection retient : sur elle, tu peux voter contre ou retirer ton vote. », le nombre suivant les versions retenues du document) ; « Tout contre » la prend (« Contre » enfoncé) ; chez Aude, « Messages, 1 non lu », le message « Oscar fait une objection : ta version « … » redit « Unicité du compte »… Pour répondre, modifie l'article visé. », puis le panneau « Proposer » sur Unicité du compte, partant de son texte, avec « Cette proposition répond à une objection… » ; chez Oscar, « Ton objection sur « … » a reçu une réponse. », une échéance, « Lever l'objection » et « Réitérer l'objection » ; levée : « Objection levée. », le message dit « objection levée » sans plus aucun geste ; Vera peut de nouveau voter, « Pour » compris | | C29 | Objection « contredit », levée à l'échéance | groupe d'essai : Aude propose un article qui contredit « Réciprocité » ; Oscar fait une objection « Contredit » ; Aude déplie le vote de sa proposition → « Reformuler », change le fond, « Enregistrer la correction » ; Oscar ne fait rien ; trois jours passent (l'automate avance l'horloge du serveur : `POST /api/dev/clock`, connexion de développement seulement) | chez Aude : « Elle contredit « Réciprocité ». », « Pour qu'elle se vote à nouveau, reformule-la… », « Reformuler » ouvre « Détails » avec le formulaire de modification ; « Nouvelle version enregistrée : les votants devront reconfirmer. », puis « Une réponse est arrivée : Oscar lève ou réitère l'objection d'ici le … » ; trois jours après : l'objection dit « levée : 3 jours sans suite », la proposition se vote de nouveau, le message d'Oscar dit « objection levée : 3 jours sans suite », sans geste | | C30 | La coquille d'un autre, validée par l'auteur | groupe d'essai : Aude propose « Clé unique et vivante » ; Vera, dans « Détails » → « Corriger une coquille », apostrophes typographiques → « Enregistrer la correction » ; Aude ouvre « Messages » → « Valider » | chez Vera : « Ta correction attend l'auteur du texte : elle s'applique quand il la valide, ou d'elle-même le … » ; le texte ne change pas ; « Coquilles proposées » montre le diff, « proposée par Vera », « en attente : s'applique d'elle-même le … » ; chez Aude : « Vera propose une correction de coquille dans ta version « Clé unique et vivante ». », le diff, une échéance, « Valider » / « Refuser » ; « Correction appliquée. », le message dit « correction appliquée » ; le texte porte la correction, l'historique « coquille corrigée · par Vera · validée par Aude » | @@ -86,3 +86,4 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa | 2026-10-31 | automate | local, `033b331` et la relecture de `cd7e683` (coquille sur un texte qui vient d'entrer, objection face à un texte retiré, objection en double, retrait qui relance l'adoption) | C1–C33, M1 | 34 / 34 verts (35 tests) | | 2026-11-02 | automate | local, lot G sur `5d1f865` (décision d'Yvv du 01/11 : sur une version retenue, « contre » et retrait, jamais « pour » ; C28 ajusté : « Contre » et le retrait sous l'article, le panier) | C1–C33, M1 | 34 / 34 verts (35 tests) | | 2026-11-02 | automate | local, lot G fusionné (`0919b46`) et les articles des règles réécrits (amendement de seed sur une proposition ouverte) | C1–C33, M1 | 34 / 34 verts (35 tests) | +| 2026-11-03 | automate | local, lot S (Propositions seed, ADR 0011 ; le quorum par cran, ADR 0013 : C3, C4, C5, C9, C18 à C20, C23, C24, C27, M1 repris) | C1–C33, M1 | 34 / 34 verts (35 tests) |