Compare commits
27
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27995b9eee | ||
|
|
8d6c35da56 | ||
|
|
d9a583c223 | ||
|
|
4f070e7b77 | ||
|
|
9d366c9afe | ||
|
|
7be6396186 | ||
|
|
ef36861953 | ||
|
|
cc8ba88d02 | ||
|
|
c976f33fa5 | ||
|
|
416364475f | ||
|
|
591ed37837 | ||
|
|
de1b7eb5d7 | ||
|
|
3b38280169 | ||
|
|
42c803e544 | ||
|
|
077c87c9db | ||
|
|
3383f28739 | ||
|
|
ca0c729481 | ||
|
|
aaacfaa332 | ||
|
|
77bc79d9ed | ||
|
|
d17a5f6d92 | ||
|
|
e7ab82f48f | ||
|
|
a8939b20c5 | ||
|
|
582d6babd0 | ||
|
|
581f7c3c9e | ||
|
|
1fe31f567b | ||
|
|
a4d4b15bc1 | ||
|
|
c05319dc4a |
+12
-3
@@ -1,6 +1,6 @@
|
||||
# HANDOFF — libreDecision
|
||||
|
||||
> Dernière mise à jour : 2026-11-03 à 12 h 31, intégrateur libredecision-d4 (orch : dev-63, session
|
||||
> Dernière mise à jour : 2026-11-03 à 20 h 46, intégrateur libredecision-d4 (orch : dev-63, session
|
||||
> racine /DEV, mandat « déploie » et « pousse » du 03/11 au 08/11). État vivant : le tableau
|
||||
> `docs/chantiers/acte-certification/tableau.md`.
|
||||
|
||||
@@ -37,8 +37,17 @@
|
||||
téléphone, les trois lectures entières, « Proposer cet ordre » dit pourquoi il est éteint, une
|
||||
information à un seul endroit dans le vote déplié, l'en-tête « 3 Propositions seed · 32 propositions en
|
||||
cours », la pastille d'un changement d'inertie de module.
|
||||
- **Aucun lot en cours** (03/11 à 12 h 30) : H, S, V, T, U, T2 et U2 sont en ligne ; rien ne se lance sans
|
||||
ordre d'orch. Listes d'attente (relectures de M6, M6c, M7, M7b) : au tableau, section Actes. Le plus
|
||||
- **M8 en ligne** depuis le 03/11 à 20 h 31 (`de1b7eb`, pipeline 42 ; `actes/2026-11-03-m8-chiffres-dates.md`) :
|
||||
lots T3, T3b et T3c, sur la réponse d'Yvv du 03/11 (« pas de chiffre datés dans un texte voté »). L'exemple chiffré de
|
||||
N1.1 sort ; F1.2 et N1.1 écrivent le terme défini (« à la participation habituelle », « le quorum de
|
||||
l'article ») et chaque phrase est vraie pour tout W et tout quorum ; F1.1 inchangé. Trois relectures :
|
||||
« 2ce2028 : à reprendre », « e7ab82f : à reprendre », « de1b7eb : ok ». En tête du dossier, pour Yvv,
|
||||
chaque phrase avant / après. Copies retirées (orch à 20 h 43, l'intégrateur à 20 h 45).
|
||||
- **Lot T4 en cours** (03/11, 20 h 45) sur la demande d'Yvv de 20 h 38 : I1, E1, E2 réécrits, « Responsabilité
|
||||
civique » ajouté, les sections formule, inertie et ordonnancement sortent du vote (rien effacé) ; puis **U3**
|
||||
(l'interface : titres, séparation, « Info ouverture doc de réf. », informations dans les panneaux,
|
||||
« Proposition d'amorce », texte pour qui n'est pas invité). Défauts et questions à Yvv : au tableau.
|
||||
- H, S, V, T, U, T2, U2, T3, T3b et T3c sont en ligne. Listes d'attente (relectures de M6, M6c, M7, M7b, M8) : au tableau, section Actes. Le plus
|
||||
visible : le vote d'un changement d'inertie de module ne dit pas le cran visé.
|
||||
- **Purge faite** le 03/11 à 12 h 30-12 h 31 (ordre d'orch PURGE-LD) : les sept copies de travail des lots
|
||||
fusionnés et leurs 13 branches (`-d`, rien poussé) ; les bases de test et captures des sous-agents sous
|
||||
|
||||
@@ -1,74 +1,138 @@
|
||||
# Acte — Mise en ligne M8 (aucun chiffre daté dans les textes votés, lot T3)
|
||||
# Acte — Mise en ligne M8 (aucun chiffre daté dans les textes votés, lots T3, T3b et T3c)
|
||||
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).
|
||||
**État : EXÉCUTÉ** le 03/11 de 20 h 26 à 20 h 44 (voir « Exécution ») ; figé sur `de1b7eb` (`de1b7eb5d7e982aee7c70a41c9f5799fb171493e`) le 03/11 à 20 h 23 — 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 : « de1b7eb : ok » (prémisse 3).
|
||||
|
||||
## Pour Yvv : ce que tu liras de changé
|
||||
|
||||
Deux textes votés de départ changent, dans les deux groupes : N1.1 « Niveaux d'inertie » et F1.2
|
||||
« Paramètres par défaut ». F1.1 « Formule du seuil WoT » n'est pas touché. Chaque phrase finale, avant (le
|
||||
texte en ligne aujourd'hui) et après, en français, qui fait foi.
|
||||
|
||||
**N1.1 « Niveaux d'inertie »**
|
||||
|
||||
1. Le quorum :
|
||||
- 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 de l'article, les votants qui manquent
|
||||
comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. »
|
||||
2. La part :
|
||||
- avant : « La part dépend du cran et du nombre de votants, comparé à la participation habituelle du
|
||||
groupe : au-delà du quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout
|
||||
le monde vote. »
|
||||
- après : « La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle
|
||||
du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand
|
||||
tout le monde vote. »
|
||||
3. La formule :
|
||||
- avant : « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum
|
||||
s'il en manque. »
|
||||
- après : « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum de
|
||||
l'article s'il en manque. »
|
||||
4. 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 de
|
||||
l'article, à la participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au
|
||||
départ. »
|
||||
5. Les cinq lignes des crans, la même retouche dans chacune :
|
||||
- avant : « … quorum 12 ; 60 % comme d'habitude, 50 % quand tout le monde vote. … » (de même 67, 75,
|
||||
83 et 90 %) ;
|
||||
- après : « … quorum 12 ; 60 % à la participation habituelle, 50 % quand tout le monde vote. … ». Le
|
||||
reste de chaque ligne ne change pas.
|
||||
6. La référence :
|
||||
- avant : « Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de
|
||||
référence du document : 100 votants dans Monnaie libre. »
|
||||
- après : « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence
|
||||
du document : 100 votants dans Monnaie libre. »
|
||||
7. Les bornes :
|
||||
- avant : « Elle reste entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
|
||||
- après : « Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
|
||||
8. G :
|
||||
- avant : « **G** se calcule pour que la part exigée, à la participation habituelle, soit exactement
|
||||
celle du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃
|
||||
la participation habituelle divisée par W. »
|
||||
- après : « **G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement
|
||||
celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette
|
||||
part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
|
||||
9. L'exemple, retiré (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. »
|
||||
|
||||
**F1.2 « Paramètres par défaut »**
|
||||
|
||||
10. Le cran 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. Tout nouvel article commence à ce
|
||||
cran. »
|
||||
- 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 » à sa participation habituelle. Tout nouvel
|
||||
article commence à ce cran. »
|
||||
|
||||
**Pourquoi.**
|
||||
- **L'exemple (9)** : ta décision du 03/11, aucun chiffre daté dans un texte voté. 7 224 membres et
|
||||
120 votants sont un état de la toile et une participation d'une date ; ce qui en était calculé sort avec
|
||||
eux.
|
||||
- **Le quorum (1)** : « pas un nombre minimal de votants » est faux pour un quorum bas fixé par l'auteur.
|
||||
Au quorum 2 (le plus bas dans Monnaie libre), il faut 2 « pour », à tout cran et sur toute toile : le
|
||||
quorum y est bien un minimum. La phrase nouvelle est vraie pour tout quorum : sous le quorum de
|
||||
l'article, le moteur demande exactement le seuil de ce quorum. « Autant de « pour » » plutôt que
|
||||
« autant de voix pour », qui se lisait d'abord « pour que » ; « de l'article », parce qu'un article peut
|
||||
avoir le quorum que son auteur a fixé, pas celui du cran.
|
||||
- **« À la participation habituelle » (4, 5, 8, 10)** : les textes disaient la part du cran « comme
|
||||
d'habitude », ce qui se lit comme le nombre de votants que le groupe a vraiment d'habitude. Le moteur,
|
||||
lui, prend la participation habituelle telle que N1.1 la définit : la médiane, **ramenée entre 1 % et
|
||||
50 % de l'électorat**. Dès que la médiane sort de ces bornes, ou reste sous le quorum de l'article, la
|
||||
part n'est plus celle du cran. Deux exemples, calculés par le moteur :
|
||||
- 7 224 membres, médiane de 40 votants (sous 1 %, ramenée à 72,24), cran 2, quorum 12 : à 40 votants,
|
||||
il faut 28 « pour » (68,7 %), pas 27 (67 %) ;
|
||||
- 3 000 membres, médiane de 40 (dans les bornes), cran 3, quorum 50 : la part se calcule sur le quorum,
|
||||
il faut 38 « pour » de ces 40 votants (95 %), pas 75 %.
|
||||
Le terme défini, « à la participation habituelle », et « au-delà du quorum de l'article » rendent ces
|
||||
phrases vraies dans tous les cas.
|
||||
- **La part exigée, le quorum de l'article (2, 3)** : le terme défini, au lieu de « la part » et « le
|
||||
quorum » nus. La part exigée baisse au-delà du quorum ; le nombre de « pour », arrondi à l'entier, peut
|
||||
remonter d'une voix (9 sur 12, puis 10 sur 13).
|
||||
- **La référence (6)** : la médiane ne compte que l'année écoulée. Avec moins de 5 propositions dans
|
||||
l'année, la référence de 100 votants revient, même si le groupe en a voté plus avant ; « tant que le
|
||||
groupe n'a pas voté sur 5 propositions » était faux.
|
||||
- **Les bornes (7)** : « est ramenée » dit ce que fait le moteur (une médiane hors des bornes est remplacée
|
||||
par la borne) ; « reste » se lisait comme un constat.
|
||||
|
||||
Trois tours de relecture indépendante y ont mené : T3 (le retrait et les phrases 1, 4, 10), puis T3b (G, et
|
||||
« autant de « pour » ») après « 2ce2028 : à reprendre », puis T3c (le terme défini partout, 2, 3, 5, 6, 7)
|
||||
après « e7ab82f : à reprendre ». Orch a donné son accord sur chaque tour : à 17 h 46, après 18 h 13 et
|
||||
après 19 h 18, avec ces mots : « c'est une correction de vérité, qui reste dans ce qu'il a validé ». Le
|
||||
détail et les textes entiers en fr, en, es : `docs/chantiers/acte-certification/textes-quorum-seed.md`
|
||||
(section « Lot T3 »). Chaque phrase de F1.2 et de N1.1, avec le test qui la vérifie :
|
||||
`docs/chantiers/acte-certification/t3c-liste-fermee.md`.
|
||||
|
||||
## 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.
|
||||
Mettre en ligne les lots T3, T3b et T3c. 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.
|
||||
**Les preuves** (`crates/ld-server/tests/seed_quorum_texts.rs`, `crates/ld-server/tests/quorum.rs`) : la
|
||||
liste fermée (`t3c-liste-fermee.md`) nomme, pour chaque phrase qui affirme un nombre, une part ou un sens de
|
||||
variation, le test qui la vérifie contre le moteur sur une grille commune de 85 100 cas. Cette grille
|
||||
couvre W de 100 à 10 000 000, des médianes sous 1 % et au-dessus de 50 % de W ramenées par le moteur,
|
||||
chaque quorum d'auteur de 2 à W jusqu'à W = 1 000, et les cinq crans. Huit tests sont vus rouges sur le
|
||||
texte de `e7ab82f`, et quatre mutations du code sont vues rouges. Aucun chiffre daté : le test des nombres
|
||||
n'admet que des paramètres.
|
||||
|
||||
## Ce qui part
|
||||
|
||||
Version `2ce2028`, qui contient la version en ligne `6f6197c`. Code touché : `crates/ld-server/src/seed_amend.rs`
|
||||
Version `de1b7eb` (lots T3, T3b et T3c), 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
|
||||
inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des tests (`tests/seed_quorum_texts.rs`, `tests/quorum.rs`) 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).
|
||||
@@ -80,7 +144,7 @@ inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des test
|
||||
(`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
|
||||
(F1.2 `96caf353…`, N1.1 `7fbedcb8…`) ; textes d'après : F1.2 `0c3b800b…`, N1.1 `8107c5fc…` ; 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` ;
|
||||
@@ -97,11 +161,13 @@ inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des test
|
||||
|
||||
## 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.
|
||||
**Faite le 03/11 de 20 h 03 min 37 à 20 h 04 min 20, réseau coupé** (`unshare -rn`, boucle locale seule :
|
||||
`m8/repetition-isolee.sh`), avec le serveur de `de1b7eb` (binaire de la boucle, construit à 20 h 03, copié en
|
||||
`m8/ld-server-de1b7eb` ; il porte l'empreinte `8107c5fc…`), sur une copie (18 h 47 min 52, empreintes
|
||||
inchangées depuis) 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 (journal `m8/repetition-m8c.log`, scratchpad de
|
||||
l'intégrateur). Deux démarrages. Orch comparera les comptes de la production à ceux de cette copie avant de
|
||||
pousser.
|
||||
|
||||
| | Avant | Après |
|
||||
|---|---|---|
|
||||
@@ -118,18 +184,23 @@ une copie (17 h 47 min 05) de la copie de production prise par orch de 17 h 46 m
|
||||
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 »).
|
||||
compteurs (`sqlite_sequence` : révisions 123, file 25). Rien d'autre (`settings` inchangé : W n'a pas pu être
|
||||
relu, réseau coupé). `integrity_check` ok, `foreign_key_check` vide. Les textes écrits sont ceux du seed de
|
||||
`de1b7eb`, 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 ; un seul WARN, attendu réseau coupé : « web of trust size: no node nor
|
||||
indexer answered, keeping the last value ». **Un second démarrage ne rejoue rien** (comptes identiques,
|
||||
aucun « applied »).
|
||||
|
||||
Deux répétitions précédentes, sur `2ce2028` (17 h 54, réseau non coupé : W relu sur `rpc.duniter.org`,
|
||||
`settings.wot_size` 5 709 → 5 711) et sur `e7ab82f` (18 h 54, réseau coupé), avaient donné les mêmes comptes ;
|
||||
seuls les textes écrits diffèrent.
|
||||
|
||||
## 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é.
|
||||
- Dans les deux groupes, N1.1 et F1.2 montrent les phrases de « Pour Yvv » (1 à 10), en fr, en et es :
|
||||
N1.1 n'a plus d'exemple chiffré, dit le quorum de l'article et la part du cran « au-delà du quorum de
|
||||
l'article, à la participation habituelle » ; F1.2 de même. 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
|
||||
@@ -141,28 +212,72 @@ dans l'historique de chaque proposition).
|
||||
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.
|
||||
reste valable pour l'autre. **Lu par l'intégrateur le 03/11 à 17 h 47, puis à 18 h 54**, sur ses copies 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, et comparer `counts.sh` à la colonne « Avant » de la
|
||||
répétition.
|
||||
3. La relecture indépendante de `de1b7eb`, inscrite « ok » dans `~/harness/etat/relectures.json`.
|
||||
- Première relecture, **`2ce2028` : à reprendre** (sous-agent neuf, sans le contexte de l'intégrateur,
|
||||
lancé à 17 h 55, inscrit à 18 h 12 ; transcript
|
||||
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a3341da520d4c5530.jsonl`) :
|
||||
la phrase de G de N1.1 fausse sous le quorum ; mineurs : « autant de voix pour que si » ambigu, le test
|
||||
de « 100 votants » qui ne pouvait pas échouer, la répétition qui avait lu W sur la chaîne. Tout repris
|
||||
par le lot T3b (`e7ab82f`).
|
||||
- Deuxième relecture, **`e7ab82f` : à reprendre** (sous-agent neuf, sans le contexte de l'intégrateur,
|
||||
lancé à 18 h 56, inscrit à 19 h 16 ; transcript
|
||||
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a92ddff6f85c88f90.jsonl`) :
|
||||
« quand le groupe vote comme d'habitude » se lit comme la médiane réelle, alors que le moteur cale G sur
|
||||
la participation habituelle bornée (W 7 224, médiane 40, cran 2 : 28 « pour » sur 40, pas 27) ; la
|
||||
grille des tests sautait ces cas. Repris par le lot T3c (lancé à 19 h 18, fusionné à 19 h 57 :
|
||||
`de1b7eb`), avec la liste fermée des phrases demandée par orch (`t3c-liste-fermee.md`).
|
||||
- **Relecture de `de1b7eb` : ok.** Sous-agent neuf, sans le contexte de l'intégrateur, lancé le 03/11 à
|
||||
20 h 05 sur la liste fermée (consigne `m8/relis-m8c.md` du scratchpad de l'intégrateur), rendu vers
|
||||
20 h 22, inscrit à 20 h 23 (transcript
|
||||
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a95bc78d7d3d1e898.jsonl`,
|
||||
dernière ligne « de1b7eb : ok »). Aucun bloquant, aucun « à reprendre ». Ce qu'elle a exécuté :
|
||||
- diff mot à mot des neuf textes entre `6f6197c` (identique à la base de production) et `de1b7eb` :
|
||||
F1.1 inchangé, F1.2 et N1.1 comme annoncé, il ne reste que des paramètres ; en et es fidèles ;
|
||||
- la liste fermée, complète (24 entrées de F1.2, 15 de N1.1), relue une à une contre le moteur ; le
|
||||
terme défini partout ;
|
||||
- une sonde à elle sur `ld-engine`, 0 faux : sous le quorum (absents « non », autant de « pour » que si
|
||||
ce quorum avait voté, jamais une voix seule) sur 808 436 970 cas ; la part qui baisse au-delà du
|
||||
quorum et vaut M à W, 142 988 400 cas ; ⌈s × P⌉ « pour » à la participation habituelle P,
|
||||
947 070 cas ; B^W qui ne compte pas, 175 465 570 cas ;
|
||||
- fmt, clippy, 316 tests ; empreintes recalculées ; la mutation « participation non bornée » rejouée
|
||||
(6 tests rouges) ;
|
||||
- l'amendement sur des copies de `base-b`, réseau coupé : appliqué une fois par groupe, rien d'autre que
|
||||
le report de la file ; second démarrage sans rejeu ; retour sur `6f6197c` : 200 partout, nouveaux
|
||||
textes servis, JSON identique à celui de `de1b7eb` ; gardes `votes`, `ballots`, `corrected`,
|
||||
`translation_edited`, `signalled`, `text_differs`, le texte intact à chaque refus.
|
||||
Mineurs, **liste d'attente** (aucun ne rend une phrase fausse ; un changement après la mise en ligne
|
||||
demande un nouvel amendement gardé, possible tant qu'aucun vote n'existe sur l'article) :
|
||||
- F1.2, « au-delà du quorum » sans « de l'article » (vrai au défaut ; à aligner sur N1.1) ;
|
||||
- un quorum fixé à W : deux phrases sans objet (F1.1, G ; N1.1, « dépend du nombre de votants ») ;
|
||||
- en, « It is kept between » : « is brought back within » serait plus fidèle ;
|
||||
- une proposition rivale d'un membre ne bloque pas la garde (conception depuis le lot T ; aucune en
|
||||
production).
|
||||
Non vérifié par elle : npm, e2e, image (aucun changement sous `web/` ; faits par l'intégrateur,
|
||||
prémisse 5), la production elle-même (prémisses 1, 2, 6).
|
||||
4. `git diff 6f6197c de1b7eb -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/ web/ crates/ld-engine/`
|
||||
→ vide (vu par l'intégrateur le 03/11 à 20 h 04).
|
||||
5. Boucle verte sur `de1b7eb`, le 03/11 de 19 h 57 à 20 h 03 (journal `m8/loop-c.log`), du premier coup :
|
||||
fmt, clippy `-D warnings`, 316 tests Rust, svelte-check 0 / 0 (648 fichiers), 78 vitest, build, e2e
|
||||
42 / 42 (19 h 59 à 20 h 03). Image de production construite le 03/11 de 20 h 05 à 20 h 10 (copie
|
||||
principale sur `591ed37`, même code que `de1b7eb` : le dossier seul en plus), sortie 0 : étage serveur
|
||||
rejoué (fmt, clippy, 316 tests Rust « ok », 0 échec, build release) ; étage web repris du cache (`web/`
|
||||
identique depuis `6f6197c`) ; image de contrôle retirée à 20 h 10 (journal `m8/docker-m8c.log`).
|
||||
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
|
||||
git push prod de1b7eb5d7e982aee7c70a41c9f5799fb171493e:main
|
||||
```
|
||||
|
||||
## Vérifications après
|
||||
|
||||
- [ ] Santé vue de l'extérieur → `"build":"2ce2028e"`.
|
||||
- [ ] Santé vue de l'extérieur → `"build":"de1b7eb5"`.
|
||||
- [ ] 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é.
|
||||
@@ -175,6 +290,52 @@ git push prod 2ce2028eb200932834c47af6927b9b4d3e44b65e:main
|
||||
- **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).
|
||||
nouveaux textes tels quels (ce sont des données ; vérifié par la relecture de `de1b7eb` : 200 partout,
|
||||
JSON identique à celui de `de1b7eb`).
|
||||
- **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, 20h26-20h44, par orch (session dev-63, e66db8ca), sous mandat « déploie »
|
||||
(03/11 → 08/11, `~/harness/etat/mandats.json`).
|
||||
|
||||
- **Prémisses** (20 h 26 min 26 s) : santé `{"build":"6f6197cc","ok":true}` ; `prod/main` → `6f6197c`,
|
||||
ancêtre de `de1b7eb` ; diff `6f6197c..de1b7eb` sur `docker/ .woodpecker/ .env data/
|
||||
crates/ld-server/migrations/ web/ crates/ld-engine/` : 0 fichier ; « de1b7eb : ok » inscrit (20 h 23) ;
|
||||
aucune autre relecture de ce code en cours (intégrateur) ; aucun témoin `deploying` sur sonic ; dépôt des
|
||||
textes `main` → `9e0f45a9e8d4af356a0c42daa5f4fb9eb9e6dfb3` ; CI : 41 `success` `6f6197cc` en tête.
|
||||
- **Copie d'avant** (20 h 26 min 35 s, `/tmp/ld-m8-avant`) : sortie de `m8/counts.sh` **identique à la ligne
|
||||
près** à celle de la copie de 17 h 46, base de la répétition (migrations 1 à 11, integrity ok, fk vide,
|
||||
identities 1, votes 0, revisions 119, translations 144, file `pending=10 done=13`, `seed_amendments` 22) ;
|
||||
`m8/premisse.sh` : les 6 lignes attendues (F1.1 révision 3, F1.2 et N1.1 révision 4, `open`, `seed`,
|
||||
votes, bulletins, coquilles et objections à 0), 0 vote et 0 bulletin en tout, migration 11.
|
||||
- **Poussée** (20 h 27) : la commande du dossier, telle quelle → `6f6197c..de1b7eb de1b7eb5… -> main`.
|
||||
- **Pipeline 42** : créé à 20 h 27 min 06 s ; image `latest` 78ca8a1d10e4 construite à 20 h 31 min 25 s ;
|
||||
santé `"build":"de1b7eb5"` dès 20 h 31 min 57 s ; `success` à 20 h 42 min 11 s.
|
||||
- **Journal du premier démarrage** (19:31:53Z) : quatre « seed amendment applied »
|
||||
(`2026-11-03-f1-2-chiffres` essai et monnaie-libre, `2026-11-03-n1-1-chiffres` essai et monnaie-libre),
|
||||
« libreDecision listening … build=de1b7eb5 », « publication suspended … waiting=12 » ; aucune ligne ERROR
|
||||
ni WARN.
|
||||
- **Redémarrage à froid** (20 h 42 min 50 s) : « libreDecision listening … build=de1b7eb5 », puis
|
||||
« publication suspended … waiting=12 » ; aucun amendement rejoué, aucune ligne ERROR ni WARN. Santé ensuite
|
||||
`{"build":"de1b7eb5","ok":true}`.
|
||||
- **Copie d'après** (20 h 43 min 08 s, `/tmp/ld-m8-apres`) : `counts.sh` diffère de la copie d'avant
|
||||
exactement comme la répétition : revisions 119 → 123, file `pending=10` → `pending=12` (`done=13`),
|
||||
`seed_amendments` 22 → 26 ; tout le reste identique à la ligne près (integrity ok, fk vide, translations 144,
|
||||
votes 0, identities 1). `premisse.sh` : F1.2 et N1.1 en révision 5, F1.1 en révision 3, dans les deux
|
||||
groupes, toujours 0 vote, bulletin, coquille et objection. Les traductions en et es de F1.2 sont épinglées
|
||||
à l'empreinte `0c3b800b…`, celles de N1.1 à `8107c5fc…` (les `to` des amendements) ; les quatre
|
||||
décisions `2026-11-03-f1-2-chiffres` et `-n1-1-chiffres` inscrites ; aucun « 7 224 » dans les textes fr,
|
||||
en et es des quatre propositions ; « participation habituelle » présent, « comme d'habitude » absent.
|
||||
- **Dépôt des textes** : `main` → `9e0f45a9e8d4af356a0c42daa5f4fb9eb9e6dfb3`, inchangé.
|
||||
- **Retour** : `previous` = 2637acd8a06e (construite le 03/11 à 12 h 12 min 04 s, `6f6197c`) ; le conteneur
|
||||
tourne sur `latest` 78ca8a1d10e4.
|
||||
- **Copies retirées** à 20 h 43 min 58 s : `/tmp/ld-m8-copie` (17 h 46, base des répétitions),
|
||||
`/tmp/ld-m8-avant`, `/tmp/ld-m8-apres`. Les copies de l'intégrateur (`m8/base-b`, `m8/lecture`, `m8/rep`,
|
||||
`m8/dump`) sont à retirer par lui, sur ce message.
|
||||
- **Branche locale** : `main` avancée `6f6197c..de1b7eb` à 20 h 43 min 58 s.
|
||||
- Écart au déroulé : aucun.
|
||||
- Copies de l'intégrateur retirées le 03/11 à 20 h 45 (scratchpad de libredecision-d4) : `m8/base-b` et
|
||||
`m8/lecture` (copies de la copie de 17 h 46), `m8/rep` (la base de la répétition, avec son dépôt nu local)
|
||||
et `m8/dump` (les deux `.dump` et leur diff). Plus aucune base dans ce scratchpad.
|
||||
|
||||
@@ -225,15 +225,22 @@ pub const AMENDMENTS: &[Amendment] = &[
|
||||
// texte voté »), every sentence true for every W and every quorum: N1.1 loses its example
|
||||
// (7 224 members, 120 voters) and says that under the quorum it takes as many « pour » as if
|
||||
// the quorum had voted; N1.1 and F1.2 ask the share of a level « comme d'habitude » beyond the
|
||||
// quorum. Each replaces the text lot T2 wrote, at its revision 4. F1.1 is not touched.
|
||||
// quorum. Each replaces the text lot T2 wrote, at its revision 4. F1.1 is not touched. After
|
||||
// the review of 2ce2028 (lot T3b, before it went online, so the same amendment): N1.1 says G
|
||||
// gives the share of the level beyond the quorum, and « autant de « pour » » in French. After
|
||||
// the review of e7ab82f (lot T3c, still before it went online, still the same amendments): the
|
||||
// defined term « à la participation habituelle » where « comme d'habitude » read first as the
|
||||
// real median, false once it leaves its bounds (F1.2, N1.1); in N1.1, « le quorum de
|
||||
// l'article » where a bare « quorum » could be the level's, « la part exigée », « Tant qu'elle
|
||||
// repose sur moins de 5 propositions » (the year counts), « Elle est ramenée entre 1 % et 50 % ».
|
||||
Amendment {
|
||||
id: "2026-11-03-f1-2-chiffres",
|
||||
doc: "acte-engagement-certification",
|
||||
unit: "F1.2",
|
||||
version: Version::Open("1.0.0"),
|
||||
from: "96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14",
|
||||
to: "ddce5aa5fcd13dfc3e374c37509a1bb8cfafddefb6e6add5a06b130b43216d62",
|
||||
reason: "proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum",
|
||||
to: "0c3b800b0c72b1edd4b884c03c6c5479c17609dcf82a95b593d408821e28bb4e",
|
||||
reason: "proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum, à la participation habituelle",
|
||||
follows: Some("2026-11-03-f1-2-phrases"),
|
||||
superseded_by: None,
|
||||
},
|
||||
@@ -243,8 +250,8 @@ pub const AMENDMENTS: &[Amendment] = &[
|
||||
unit: "N1.1",
|
||||
version: Version::Open("1.0.0"),
|
||||
from: "7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8",
|
||||
to: "4289e3579ee747f6023162339ed60601b810d33462617b42a9f8b5b3735c3238",
|
||||
reason: "proposition de départ réécrite : N1.1, sans chiffre daté ; sous le quorum, autant de voix pour que si le quorum avait voté",
|
||||
to: "8107c5fc746121f18c8a440e86e23310c5a59ae8e92f5a07f6b098419980263c",
|
||||
reason: "proposition de départ réécrite : N1.1, sans chiffre daté ; sous le quorum de l'article, autant de « pour » que si ce quorum avait voté ; au-delà, la part du cran à la participation habituelle",
|
||||
follows: Some("2026-11-03-n1-1-phrases"),
|
||||
superseded_by: None,
|
||||
},
|
||||
|
||||
@@ -94,6 +94,11 @@ fn numbers(levels: &Value, key: &str) -> Vec<u64> {
|
||||
levels.as_array().expect("levels").iter().map(|l| l[key].as_u64().expect("number")).collect()
|
||||
}
|
||||
|
||||
/// G of each level, as served.
|
||||
fn gradients(doc: &Value) -> Vec<Value> {
|
||||
doc["levels"].as_array().expect("levels").iter().map(|l| l["gradient"].clone()).collect()
|
||||
}
|
||||
|
||||
/// (quorum, quorumDefault, canSetQuorum) of a unit.
|
||||
fn quorum_of(u: &Value) -> (Option<u64>, Option<u64>, Option<bool>) {
|
||||
(u["quorum"].as_u64(), u["quorumDefault"].as_u64(), u["canSetQuorum"].as_bool())
|
||||
@@ -174,6 +179,8 @@ async fn the_author_of_an_article_sets_its_quorum_before_the_first_vote() {
|
||||
.await;
|
||||
let (u, text) =
|
||||
(created["unitId"].as_str().expect("unit").to_owned(), created["id"].as_str().expect("id").to_owned());
|
||||
// « Tout nouvel article commence à ce cran » (F1.2, « Par défaut »): the default level, 3.
|
||||
assert_eq!(unit_by_id(&chiara.doc("essai").await, &u)["inertia"], 3);
|
||||
// Its author may, another member may not; the test group: its level's quorum, 1.
|
||||
assert_eq!(quorum_of(unit_by_id(&chiara.doc("essai").await, &u)), (None, Some(1), Some(true)));
|
||||
assert_eq!(quorum_of(unit_by_id(&luna.doc("essai").await, &u)), (None, Some(1), Some(false)));
|
||||
@@ -270,6 +277,7 @@ async fn in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pen
|
||||
chiara.login("Chiara", false).await;
|
||||
let doc = admin.doc("monnaie-libre").await;
|
||||
let doc_id = doc["doc"]["id"].as_str().expect("id").to_owned();
|
||||
let usual = (doc["doc"]["participation"].clone(), gradients(&doc));
|
||||
let i1 = unit(&doc, "I1");
|
||||
let (u, p) = (i1["id"].as_str().expect("u").to_owned(), i1["proposals"][0]["id"].as_str().expect("p").to_owned());
|
||||
// A text of the seed has no author: an administrator answers for it.
|
||||
@@ -287,6 +295,10 @@ async fn in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pen
|
||||
}
|
||||
let doc = admin.doc("monnaie-libre").await;
|
||||
assert_eq!(unit(&doc, "I1")["proposals"][0]["evaluation"]["quorum"], 20);
|
||||
// « Elle ne dépend pas du quorum d'un article » (N1.1, lot T3c): the participation habituelle,
|
||||
// and G of each level, stay as they were (the reference rests on the document's, 2 × 50 / W).
|
||||
assert_eq!((doc["doc"]["participation"].clone(), gradients(&doc)), usual);
|
||||
assert!((doc["doc"]["participation"]["ratio"].as_f64().expect("p̃") - 100.0 / W as f64).abs() < 1e-12);
|
||||
// A refused ballot, an expired one, are no vote.
|
||||
ballot(&state, &doc_id, &p, "refused", 1).await;
|
||||
ballot(&state, &doc_id, &p, "expired", 2).await;
|
||||
|
||||
@@ -21,6 +21,24 @@
|
||||
//! only (N1.1, F1.2). A third guarded amendment, which follows lot T2's, writes them on a base
|
||||
//! made as production is after M6c; the texts of T2 are kept in
|
||||
//! `tests/fixtures/seed-quorum-t2.json`. F1.1 needs none: it is not touched.
|
||||
//!
|
||||
//! After the review of lot T3 (2ce2028, lot T3b, before it went online: the same amendment, its
|
||||
//! fingerprint `to` changed): N1.1 says G gives the share of the level beyond the quorum, when the
|
||||
//! group votes as usual — « à la participation habituelle » was false under the quorum; « autant de
|
||||
//! « pour » » in French; and « 100 votants » is checked as the parameter it is, not as a turnout
|
||||
//! that would hold on every W.
|
||||
//!
|
||||
//! After the review of e7ab82f (lot T3c, before it went online: the same amendments, their
|
||||
//! fingerprints `to` changed again): « comme d'habitude » reads first as the real median, and is
|
||||
//! false where the median leaves its bounds (W 7 224, a median of 40, level 2, quorum 12: 28 « pour »
|
||||
//! of 40, not 27). F1.2 and N1.1 write the defined term, « à la participation habituelle »: the
|
||||
//! median brought back within 1 % and 50 % of W, the one G is computed on. « Sous le quorum de
|
||||
//! l'article » where a bare « quorum » could be the level's; « la part exigée » where « la part »
|
||||
//! could be the rounded share; « Tant qu'elle repose sur moins de 5 propositions » (the year counts).
|
||||
//! Every sentence of F1.2 and N1.1 that says a number, a share or a direction is checked against the
|
||||
//! engine on one grid (`grid`): W from 100, medians under 1 % and above 50 % of W, every quorum an
|
||||
//! author may set, the five levels — the closed list given to the reviewer is
|
||||
//! `docs/chantiers/acte-certification/t3c-liste-fermee.md`.
|
||||
|
||||
use ld_engine::inertia::{InertiaLevel, Participation, Scale, gradient, quorum_bounds};
|
||||
use ld_engine::threshold::{FormulaParams, Tally, judged_voters, passes, required_ratio, wot_threshold, yes_needed};
|
||||
@@ -122,14 +140,18 @@ fn seed_dir(tag: &str, seed: &Value) -> PathBuf {
|
||||
|
||||
/// Every figure the texts may hold: parameters of the seed and constants of the engine and
|
||||
/// the server. Since lot T3 (Yvv, 03/11: « pas de chiffre datés dans un texte voté »), none
|
||||
/// depends on the web of trust W or on a turnout: no participation goes in, and the same
|
||||
/// figures come out on every W of Monnaie libre (`figures`).
|
||||
/// is computed from the web of trust W or from a turnout: no participation goes in. The one
|
||||
/// the engine computes from W, the lowest quorum an author may set, comes out the same on
|
||||
/// every W of Monnaie libre (`figures`); the others no W enters.
|
||||
#[derive(Debug, PartialEq)]
|
||||
struct Figures {
|
||||
/// Q_k of Monnaie libre (the seed).
|
||||
quorums: [u32; 5],
|
||||
/// Twice the reference quorum of the document, in voters (the engine's p0 · W, before
|
||||
/// the bounds).
|
||||
/// « deux fois le quorum de référence du document : 100 votants » — a parameter, 2 ×
|
||||
/// voteFloor, written before the bounds; not a turnout that holds on every W. The engine's
|
||||
/// p0 = 2 × voteFloor / W is that many voters only on a web of 200 to 10 000 members;
|
||||
/// beyond, the bounds N1.1 says after it, in the same paragraph, bring it back
|
||||
/// (`the_reference_turnout_is_a_parameter_the_bounds_bring_back`).
|
||||
reference: u32,
|
||||
/// The lowest quorum an author may set in Monnaie libre.
|
||||
lowest_quorum: u32,
|
||||
@@ -155,8 +177,8 @@ fn figures_at(seed: &Value, w: u32) -> Figures {
|
||||
let ml =
|
||||
seed["instances"].as_array().expect("instances").iter().find(|i| i["group"] == "monnaie-libre").expect("ml");
|
||||
let quorums: [u32; 5] = serde_json::from_value(ml["quorums"].clone()).expect("quorums");
|
||||
let vote_floor = ml["voteFloor"].as_f64().expect("voteFloor");
|
||||
let reference = Participation::reference_ratio(w, vote_floor) * f64::from(w);
|
||||
// Twice the reference quorum: a parameter, the same whatever W (no W enters it).
|
||||
let reference = 2.0 * ml["voteFloor"].as_f64().expect("voteFloor");
|
||||
assert!((reference - reference.round()).abs() < 1e-6, "a whole number of voters: {reference}");
|
||||
let levels: Vec<u8> = seed["units"]
|
||||
.as_array()
|
||||
@@ -185,7 +207,9 @@ fn figures_at(seed: &Value, w: u32) -> Figures {
|
||||
}
|
||||
}
|
||||
|
||||
/// The figures of the texts: the same on every W Monnaie libre may have — none is dated.
|
||||
/// The figures of the texts, on every W Monnaie libre may have: none is dated. Only the lowest
|
||||
/// quorum is computed from W here; the reference turnout is a parameter, and where it is a
|
||||
/// turnout is `the_reference_turnout_is_a_parameter_the_bounds_bring_back`.
|
||||
fn figures(seed: &Value) -> Figures {
|
||||
let mut all = ELECTORATES.iter().map(|w| (*w, figures_at(seed, *w)));
|
||||
let (_, first) = all.next().expect("an electorate");
|
||||
@@ -290,7 +314,7 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
|
||||
),
|
||||
format!("**B = {}**", dec(lang, f.base)),
|
||||
format!(
|
||||
"Le cran par défaut est le {} ({}) : M = {}, un quorum de {qd} dans Monnaie libre, et, au-delà du quorum, le groupe demande {} de « pour » quand il vote comme d'habitude",
|
||||
"Le cran par défaut est le {} ({}) : M = {}, un quorum de {qd} dans Monnaie libre, et, au-delà du quorum, le groupe demande {} de « pour » à sa participation habituelle",
|
||||
f.default_level,
|
||||
name(f.default_level),
|
||||
pct(lang, d.majority_pct()),
|
||||
@@ -318,7 +342,7 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
|
||||
format!("In Monnaie libre, never less than {}: a single vote never passes a text", f.lowest_quorum),
|
||||
format!("**B = {}**", dec(lang, f.base)),
|
||||
format!(
|
||||
"The default level is {} ({}): M = {}, a quorum of {qd} in Monnaie libre, and, beyond the quorum, the group asks for {} of votes in favour when it votes as usual",
|
||||
"The default level is {} ({}): M = {}, a quorum of {qd} in Monnaie libre, and, beyond the quorum, the group asks for {} of votes in favour at its usual turnout",
|
||||
f.default_level,
|
||||
name(f.default_level),
|
||||
pct(lang, d.majority_pct()),
|
||||
@@ -346,7 +370,7 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
|
||||
format!("En Monnaie libre, nunca menos de {}: un solo voto nunca hace pasar un texto", f.lowest_quorum),
|
||||
format!("**B = {}**", dec(lang, f.base)),
|
||||
format!(
|
||||
"El nivel por defecto es el {} ({}): M = {}, un quórum de {qd} en Monnaie libre, y, más allá del quórum, el grupo pide un {} de votos a favor cuando vota como de costumbre",
|
||||
"El nivel por defecto es el {} ({}): M = {}, un quórum de {qd} en Monnaie libre, y, más allá del quórum, el grupo pide un {} de votos a favor con su participación habitual",
|
||||
f.default_level,
|
||||
name(f.default_level),
|
||||
pct(lang, d.majority_pct()),
|
||||
@@ -378,17 +402,17 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
|
||||
);
|
||||
match lang {
|
||||
"fr" => format!(
|
||||
"- **Cran {} · {n}** : quorum {} ; {s} comme d'habitude, {mk} quand tout le monde vote. {what}",
|
||||
"- **Cran {} · {n}** : quorum {} ; {s} à la participation habituelle, {mk} quand tout le monde vote. {what}",
|
||||
k.get(),
|
||||
q[i]
|
||||
),
|
||||
"en" => format!(
|
||||
"- **Level {} · {n}**: quorum {}; {s} as usual, {mk} when everyone votes. {what}",
|
||||
"- **Level {} · {n}**: quorum {}; {s} at the usual turnout, {mk} when everyone votes. {what}",
|
||||
k.get(),
|
||||
q[i]
|
||||
),
|
||||
_ => format!(
|
||||
"- **Nivel {} · {n}**: quórum {}; {s} como de costumbre, {mk} cuando vota todo el mundo. {what}",
|
||||
"- **Nivel {} · {n}**: quórum {}; {s} con la participación habitual, {mk} cuando vota todo el mundo. {what}",
|
||||
k.get(),
|
||||
q[i]
|
||||
),
|
||||
@@ -397,21 +421,28 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
|
||||
.collect();
|
||||
let (b0, b1) = (pct(lang, f.bounds.0), pct(lang, f.bounds.1));
|
||||
let (ms, r) = (f.min_sample, f.reference);
|
||||
// s of each level, as the sentence of G names them: the shares of the list, level 1 to 5.
|
||||
let (top, lower) = InertiaLevel::ALL.split_last().expect("five levels");
|
||||
let head = lower.iter().map(|k| dec(lang, k.share_pct())).collect::<Vec<_>>().join(", ");
|
||||
let last = pct(lang, top.share_pct());
|
||||
out.extend(match lang {
|
||||
"fr" => [
|
||||
"propositions du groupe votées depuis un an".to_owned(),
|
||||
format!("Tant que le groupe n'a pas voté sur {ms} propositions, elle vaut deux fois le quorum de référence du document : {r} votants dans Monnaie libre"),
|
||||
format!("Elle reste entre {b0} et {b1} de l'électorat, et se mesure une fois par jour"),
|
||||
format!("Tant qu'elle repose sur moins de {ms} propositions, elle vaut deux fois le quorum de référence du document : {r} votants dans Monnaie libre"),
|
||||
format!("Elle est ramenée entre {b0} et {b1} de l'électorat, et se mesure une fois par jour"),
|
||||
format!("où s est cette part du cran ({head} ou {last})"),
|
||||
],
|
||||
"en" => [
|
||||
"the group's proposals voted on over the past year".to_owned(),
|
||||
format!("Until the group has voted on {ms} proposals, it is twice the document's reference quorum: {r} voters in Monnaie libre"),
|
||||
format!("It stays between {b0} and {b1} of the electorate, and is measured once a day"),
|
||||
format!("While it rests on fewer than {ms} proposals, it is twice the document's reference quorum: {r} voters in Monnaie libre"),
|
||||
format!("It is kept between {b0} and {b1} of the electorate, and is measured once a day"),
|
||||
format!("where s is that share of the level ({head} or {last})"),
|
||||
],
|
||||
_ => [
|
||||
"propuestas del grupo votadas en el último año".to_owned(),
|
||||
format!("Hasta que el grupo haya votado {ms} propuestas, vale dos veces el quórum de referencia del documento: {r} votantes en Monnaie libre"),
|
||||
format!("Se mantiene entre el {b0} y el {b1} del electorado, y se mide una vez al día"),
|
||||
format!("Mientras se base en menos de {ms} propuestas, vale dos veces el quórum de referencia del documento: {r} votantes en Monnaie libre"),
|
||||
format!("Se acota entre el {b0} y el {b1} del electorado, y se mide una vez al día"),
|
||||
format!("donde s es esa proporción del nivel ({head} o {last})"),
|
||||
],
|
||||
});
|
||||
out
|
||||
@@ -600,62 +631,129 @@ fn the_three_phrases_of_the_review_of_m6b_are_written_true() {
|
||||
// Lot T3: no dated figure, every sentence true for every W and every quorum
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// (article, language, the words of T2, the words of today): the only change of lot T3. F1.1
|
||||
/// has none: it holds no dated figure and every sentence of it is true (`b_to_the_power_w_…`).
|
||||
const PHRASES_T3: [(&str, &str, &str, &str); 12] = [
|
||||
/// (article, language, the words of T2, the words of today): the only change of the amendments of
|
||||
/// lot T3, with its reviews — 2ce2028 (lot T3b: the sentence of G; « autant de « pour » » in French)
|
||||
/// and e7ab82f (lot T3c: the defined term « participation habituelle » where T3 wrote « comme
|
||||
/// d'habitude »; « le quorum de l'article » where a bare « quorum » could be the level's; « la part
|
||||
/// exigée »; « repose sur moins de 5 propositions »; « ramenée entre 1 % et 50 % »). The five lines
|
||||
/// of the levels change by `LEVEL_LINES_T3`. F1.1 has none: it holds no dated figure and every
|
||||
/// sentence of it is true (`b_to_the_power_w_…`).
|
||||
const PHRASES_T3: [(&str, &str, &str, &str); 27] = [
|
||||
(
|
||||
"F1.2",
|
||||
"fr",
|
||||
"un quorum de 50 dans Monnaie libre, et le groupe demande 75 % de « pour » quand il vote comme d'habitude.",
|
||||
"un quorum de 50 dans Monnaie libre, et, au-delà du quorum, le groupe demande 75 % de « pour » quand il vote comme d'habitude.",
|
||||
"un quorum de 50 dans Monnaie libre, et, au-delà du quorum, le groupe demande 75 % de « pour » à sa participation habituelle.",
|
||||
),
|
||||
(
|
||||
"F1.2",
|
||||
"en",
|
||||
"a quorum of 50 in Monnaie libre, and the group asks for 75% of votes in favour when it votes as usual.",
|
||||
"a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour when it votes as usual.",
|
||||
"a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour at its usual turnout.",
|
||||
),
|
||||
(
|
||||
"F1.2",
|
||||
"es",
|
||||
"un quórum de 50 en Monnaie libre, y el grupo pide un 75 % de votos a favor cuando vota como de costumbre.",
|
||||
"un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor cuando vota como de costumbre.",
|
||||
"un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor con su participación habitual.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"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 ».",
|
||||
"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é.",
|
||||
"Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"Each level also has its quorum, which is not a minimum number of voters: below the quorum, the voters who are missing count as votes against.",
|
||||
"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.",
|
||||
"Each level also has its quorum: below the article's quorum, the voters who are missing count as votes against, and it takes as many votes in favour as if that quorum had voted.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"Cada nivel tiene además su quórum, que no es un número mínimo de votantes: por debajo del quórum, los votantes que faltan cuentan como «no».",
|
||||
"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.",
|
||||
"Cada nivel tiene además su quórum: por debajo del quórum del artículo, los votantes que faltan cuentan como «no», y hacen falta tantos votos a favor como si hubiera votado ese quórum.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"La part dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà du quorum, plus il y a de votants,",
|
||||
"La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà de ce quorum, plus il y a de votants,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"The share depends on the level and on the number of voters, compared with the group's usual turnout: beyond the quorum, the more voters,",
|
||||
"The share asked depends on the level and on the number of voters, compared with the group's usual turnout: beyond that quorum, the more voters,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"La proporción depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá del quórum, cuantos más votantes,",
|
||||
"La proporción exigida depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá de ese quórum, cuantos más votantes,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"où T' est le nombre de votants, ou le quorum s'il en manque.",
|
||||
"où T' est le nombre de votants, ou le quorum de l'article s'il en manque.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"where T' is the number of voters, or the quorum if some are missing.",
|
||||
"where T' is the number of voters, or the article's quorum if some are missing.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"donde T' es el número de votantes, o el quórum si faltan.",
|
||||
"donde T' es el número de votantes, o el quórum del artículo si faltan.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"**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,",
|
||||
"**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,",
|
||||
"**Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de l'article, à la participation habituelle, puis quand tout le monde vote,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"**The five levels**: the quorum in Monnaie libre, the share asked when the group votes as usual, then when everyone votes,",
|
||||
"**The five levels**: the quorum in Monnaie libre, the share asked beyond the quorum, when the group votes as usual, then when everyone votes,",
|
||||
"**The five levels**: the quorum in Monnaie libre, the share asked beyond the article's quorum, at the usual turnout, then when everyone votes,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida cuando el grupo vota como de costumbre, luego cuando vota todo el mundo,",
|
||||
"**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum, cuando el grupo vota como de costumbre, luego cuando vota todo el mundo,",
|
||||
"**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum del artículo, con la participación habitual, luego cuando vota todo el mundo,",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"Tant que le groupe n'a pas voté sur 5 propositions, elle vaut",
|
||||
"Tant qu'elle repose sur moins de 5 propositions, elle vaut",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"Until the group has voted on 5 proposals, it is",
|
||||
"While it rests on fewer than 5 proposals, it is",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"Hasta que el grupo haya votado 5 propuestas, vale",
|
||||
"Mientras se base en menos de 5 propuestas, vale",
|
||||
),
|
||||
("N1.1", "fr", "Elle reste entre 1 % et 50 % de l'électorat", "Elle est ramenée entre 1 % et 50 % de l'électorat"),
|
||||
("N1.1", "en", "It stays between 1% and 50% of the electorate", "It is kept between 1% and 50% of the electorate"),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"Se mantiene entre el 1 % y el 50 % del electorado",
|
||||
"Se acota entre el 1 % y el 50 % del electorado",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
@@ -675,6 +773,33 @@ const PHRASES_T3: [(&str, &str, &str, &str); 12] = [
|
||||
"\n\nEjemplo: con 7224 miembros y una participación habitual de 120 votantes, cuando votan 120 personas, hacen falta 72, 81, 90, 100 o 108 votos a favor, del nivel 1 al nivel 5; en el nivel 3, el 75 % de los 120 votantes, es decir 90. Por debajo del quórum, los que faltan cuentan como «no»: en el nivel 2 (quórum 12), 9 votos a favor pasan con 3 en contra como mucho; en el nivel 3 (quórum 50), hacen falta 39 votos a favor, con 11 en contra como mucho.",
|
||||
"",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"fr",
|
||||
"**G** se calcule pour que la part exigée, à la participation habituelle, soit exactement celle du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃ la participation habituelle divisée par W.",
|
||||
"**G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"en",
|
||||
"**G** is computed so that the share asked, at the usual turnout, is exactly that of the level: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is the share asked as usual and p̃ the usual turnout divided by W.",
|
||||
"**G** is computed so that the share asked, beyond the article's quorum, is exactly that of the level at the usual turnout: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is that share of the level (60, 67, 75, 83 or 90%) and p̃ the usual turnout divided by W.",
|
||||
),
|
||||
(
|
||||
"N1.1",
|
||||
"es",
|
||||
"**G** se calcula para que la proporción exigida, con la participación habitual, sea exactamente la del nivel: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es la proporción exigida como de costumbre y p̃ la participación habitual dividida por W.",
|
||||
"**G** se calcula para que la proporción exigida, más allá del quórum del artículo, sea exactamente la del nivel con la participación habitual: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es esa proporción del nivel (60, 67, 75, 83 o 90 %) y p̃ la participación habitual dividida por W.",
|
||||
),
|
||||
];
|
||||
|
||||
/// The five lines of the levels of N1.1 (lot T3c): « 60 % comme d'habitude » becomes « 60 % à la
|
||||
/// participation habituelle », and so on, in each line and nothing else (language, words of T2,
|
||||
/// words of today).
|
||||
const LEVEL_LINES_T3: [(&str, &str, &str); 3] = [
|
||||
("fr", " comme d'habitude, ", " à la participation habituelle, "),
|
||||
("en", " as usual, ", " at the usual turnout, "),
|
||||
("es", " como de costumbre, ", " con la participación habitual, "),
|
||||
];
|
||||
|
||||
/// The texts of T2 with the phrases of lot T3 written in: what the seed gives today.
|
||||
@@ -686,6 +811,11 @@ fn t3_from_t2(code: &str, lang: &str, t2: &str) -> String {
|
||||
b = b.replacen(old, new, 1);
|
||||
}
|
||||
}
|
||||
if code == "N1.1" {
|
||||
let (_, old, new) = LEVEL_LINES_T3.iter().find(|(l, ..)| *l == lang).expect("a language");
|
||||
assert_eq!(b.matches(old).count(), 5, "N1.1 {lang}: the five lines of the levels");
|
||||
b = b.replace(old, new);
|
||||
}
|
||||
b
|
||||
}
|
||||
|
||||
@@ -704,32 +834,192 @@ fn the_texts_of_lot_t3_change_these_phrases_only() {
|
||||
assert!(!body.contains(old), "{code} {lang}: still the words of T2\n{body}");
|
||||
assert!(body.contains(new), "{code} {lang}: missing « {new} »\n{body}");
|
||||
}
|
||||
for (lang, old, new) in LEVEL_LINES_T3 {
|
||||
let (_, body) = text(&today, "N1.1", lang);
|
||||
assert!(!body.contains(old), "N1.1 {lang}: « {old} » is left\n{body}");
|
||||
assert_eq!(body.matches(new).count(), 6, "N1.1 {lang}: the five lines, and the list's introduction\n{body}");
|
||||
}
|
||||
// The example of N1.1 is gone whole, and nothing takes its place.
|
||||
for (lang, word) in [("fr", "Exemple"), ("en", "Example"), ("es", "Ejemplo")] {
|
||||
assert!(!text(&today, "N1.1", lang).1.contains(word), "N1.1 {lang}: an example is left");
|
||||
}
|
||||
}
|
||||
|
||||
/// The participations of the grid, as shares of W: the bounds, the reference of the document
|
||||
/// (`2 × voteFloor / W`, brought back within the bounds) and one between.
|
||||
fn participations(w: u32, vote_floor: f64) -> [f64; 4] {
|
||||
[Participation::LOWEST, Participation::of(w, vote_floor, None, 0).ratio, 0.1, Participation::HIGHEST]
|
||||
// ---------------------------------------------------------------------------
|
||||
// Lot T3c: one grid for every sentence that says a number, a share or a direction
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/// The medians of the grid on a web of `w` members (lot T3c), as measured, before the bounds:
|
||||
/// under 1 % of W, at it, within, at 50 % and above. The participation habituelle is the median
|
||||
/// brought back within its bounds, so a median out of them is not it.
|
||||
fn medians(w: u32) -> Vec<u32> {
|
||||
let one = w / 100;
|
||||
let mut m: Vec<u32> = [1, 2, one.saturating_sub(1), one, one + 1, 12, 40, 50, 100, 120, 1000, w / 2, w / 2 + 1, w]
|
||||
.into_iter()
|
||||
.filter(|m| (1..=w).contains(m))
|
||||
.collect();
|
||||
m.sort_unstable();
|
||||
m.dedup();
|
||||
m
|
||||
}
|
||||
|
||||
/// N1.1, the phrase of lot T3: « sous le quorum, les votants qui manquent comptent comme « non »,
|
||||
/// et il faut autant de voix pour que si le quorum avait voté ». True for every quorum an author
|
||||
/// may set (2 to W in Monnaie libre, 1 to W in the test group), every level, every W, every
|
||||
/// participation within the bounds: the « pour » that pass with nobody against, fewer voters
|
||||
/// than the quorum, are the threshold of the quorum; and under it, a tally passes exactly when
|
||||
/// its « pour » reach that threshold. The phrase of T2, « qui n'est pas un nombre minimal de
|
||||
/// votants », is false: at a quorum of 2, two « pour » are asked, at every level, on every W.
|
||||
/// A usual turnout of the grid: the median measured (`None`: fewer than 5 proposals, the reference
|
||||
/// of the document stands in) and the participation habituelle the engine takes from it
|
||||
/// (`Participation::of`: the median, or the reference, brought back within 1 % and 50 % of W).
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
struct Usual {
|
||||
median: Option<u32>,
|
||||
part: Participation,
|
||||
}
|
||||
|
||||
impl Usual {
|
||||
/// The participation habituelle, in voters: p̃ × W — not a whole number when it is a bound
|
||||
/// (1 % of 7 224 is 72,24 voters). To a millionth of a voter: the division by W and the product
|
||||
/// by W give 57,999 999 999 999 99 for a median of 58 on 5 707.
|
||||
fn voters(&self, w: u32) -> f64 {
|
||||
(self.part.voters(w) * 1e6).round() / 1e6
|
||||
}
|
||||
}
|
||||
|
||||
/// The usual turnouts of the grid on a web of `w`: the reference, then each median of `medians`.
|
||||
fn usuals(w: u32, vote_floor: f64) -> Vec<Usual> {
|
||||
std::iter::once(None)
|
||||
.chain(medians(w).into_iter().map(Some))
|
||||
.map(|median| {
|
||||
let sample = if median.is_some() { 9 } else { 0 };
|
||||
Usual { median, part: Participation::of(w, vote_floor, median.map(f64::from), sample) }
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// The participations of the grid, as shares of W, each once: those of `usuals`. Both bounds are
|
||||
/// among them on every W of Monnaie libre, where a median under 1 % or above 50 % of W is brought
|
||||
/// back to one.
|
||||
fn participations(w: u32, vote_floor: f64) -> Vec<f64> {
|
||||
let mut p: Vec<f64> = usuals(w, vote_floor).iter().map(|u| u.part.ratio).collect();
|
||||
p.sort_by(f64::total_cmp);
|
||||
p.dedup();
|
||||
p
|
||||
}
|
||||
|
||||
/// The quorums an author may set on a web of `w` (ADR 0013), from the lowest bound to W: every one
|
||||
/// up to W 1 000; beyond, `quorum_sample`.
|
||||
fn author_quorums(w: u32, lowest: u32, around: &[f64]) -> Vec<u32> {
|
||||
if w <= 1000 { (lowest..=w).collect() } else { quorum_sample(w, lowest, around) }
|
||||
}
|
||||
|
||||
/// Quorums from the lowest bound to W, where every one would be too many: the bounds and their
|
||||
/// neighbours, the quorums of the levels and theirs, 100, 1 000, W/2, and around each number of
|
||||
/// voters of `around` (the participation habituelle, the median).
|
||||
fn quorum_sample(w: u32, lowest: u32, around: &[f64]) -> Vec<u32> {
|
||||
let mut q = vec![lowest, 2, 3, 11, 12, 13, 49, 50, 51, 100, 1000, w / 2, w - 1, w];
|
||||
for a in around {
|
||||
let (down, up) = (a.floor() as u32, a.ceil() as u32);
|
||||
q.extend([down, up, up + 1]);
|
||||
}
|
||||
q.retain(|q| (lowest..=w).contains(q));
|
||||
q.sort_unstable();
|
||||
q.dedup();
|
||||
q
|
||||
}
|
||||
|
||||
/// One case of the grid: a web, a usual turnout of its group, a level, the quorum of the article.
|
||||
struct Case {
|
||||
w: u32,
|
||||
usual: Usual,
|
||||
k: InertiaLevel,
|
||||
q: u32,
|
||||
}
|
||||
|
||||
impl Case {
|
||||
fn at(&self) -> String {
|
||||
format!("W {} median {:?} usual {} k {} Q {}", self.w, self.usual.median, self.voters(), self.k.get(), self.q)
|
||||
}
|
||||
|
||||
/// The participation habituelle, in voters.
|
||||
fn voters(&self) -> f64 {
|
||||
self.usual.voters(self.w)
|
||||
}
|
||||
|
||||
/// The letters of the formula (the quorums of the scale do not enter: the quorum is the case's).
|
||||
fn params(&self) -> FormulaParams {
|
||||
let scale = Scale { electorate: self.w, participation: self.usual.part.ratio, quorums: [12, 12, 50, 50, 50] };
|
||||
scale.params(self.k, self.q)
|
||||
}
|
||||
|
||||
/// s_k, the share of the level.
|
||||
fn s(&self) -> f64 {
|
||||
self.k.share_pct() / 100.0
|
||||
}
|
||||
|
||||
/// M_k.
|
||||
fn m(&self) -> f64 {
|
||||
self.k.majority_pct() / 100.0
|
||||
}
|
||||
}
|
||||
|
||||
/// The grid of the closed list (lot T3c, `docs/chantiers/acte-certification/t3c-liste-fermee.md`),
|
||||
/// on which every sentence of F1.2 and N1.1 that says a number, a share or a direction is checked
|
||||
/// against the engine: every W of the grid, from 100, the lowest the server takes as true
|
||||
/// (`wot::PLAUSIBLE`), to 10 000 000; every usual turnout of `usuals` — the reference, medians under
|
||||
/// 1 % of W, within the bounds, above 50 %, each brought back within its bounds as the engine does;
|
||||
/// the five levels; the quorums an author may set, from 2 to W (`author_quorums`).
|
||||
fn grid() -> Vec<Case> {
|
||||
let mut grid = Vec::new();
|
||||
for w in ELECTORATES {
|
||||
let (lowest, _) = quorum_bounds(w, false);
|
||||
for usual in usuals(w, 50.0) {
|
||||
let around: Vec<f64> = std::iter::once(usual.voters(w)).chain(usual.median.map(f64::from)).collect();
|
||||
for k in InertiaLevel::ALL {
|
||||
for q in author_quorums(w, lowest, &around) {
|
||||
grid.push(Case { w, usual, k, q });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
grid
|
||||
}
|
||||
|
||||
/// The share the engine asks of `voters` voters on a web of `w` — `voters` the participation
|
||||
/// habituelle, not a whole number when it is a bound (1 % of 7 224 is 72,24 voters). The engine
|
||||
/// reads T'/W only (`required_ratio`): on a web a hundred times larger, the same share is asked of a
|
||||
/// hundred times more voters, a whole number for every usual turnout of the grid. Checked against
|
||||
/// the engine on whole numbers (`the_share_of_a_level_is_asked_at_the_usual_turnout_…`).
|
||||
fn share_at(w: u32, voters: f64, params: &FormulaParams) -> f64 {
|
||||
let scaled = voters * 100.0;
|
||||
assert!((scaled - scaled.round()).abs() < 1e-6, "{voters} voters on {w}");
|
||||
required_ratio(w * 100, scaled.round() as u32, params)
|
||||
}
|
||||
|
||||
/// N1.1, « Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent
|
||||
/// comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté » (lot T3; « de
|
||||
/// voix pour que » read first as « pour que » until 2ce2028; a bare « sous le quorum », after « Chaque
|
||||
/// cran a aussi son quorum », read first as the level's until e7ab82f, an article holding the one its
|
||||
/// author set). F1.2, « Q, le quorum : sous ce nombre de votants, ceux qui manquent comptent comme
|
||||
/// « non » » and « Dans Monnaie libre, jamais moins de 2 : une seule voix ne fait jamais passer un
|
||||
/// texte ». True for every quorum an author may set (2 to W in Monnaie libre, 1 to W in the test
|
||||
/// group), every level, every W, every participation of the grid (both bounds, where medians under
|
||||
/// 1 % and above 50 % of W are brought back): the « pour » that pass with nobody against, fewer
|
||||
/// voters than the quorum, are the threshold of the quorum; under it, a tally passes exactly when its
|
||||
/// « pour » reach that threshold; in Monnaie libre, one « pour » never passes, whatever the
|
||||
/// « contre ». The phrase of T2, « qui n'est pas un nombre minimal de votants », is false: at a
|
||||
/// quorum of 2, two « pour » are asked, at every level, on every W.
|
||||
#[test]
|
||||
fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
|
||||
let today = today_seed();
|
||||
let said = [
|
||||
("fr", "et il faut autant de voix pour que si le quorum avait voté."),
|
||||
("en", "and it takes as many votes in favour as if the quorum had voted."),
|
||||
("es", "y hacen falta tantos votos a favor como si hubiera votado el quórum."),
|
||||
(
|
||||
"fr",
|
||||
"sous le quorum de l'article, les votants qui manquent comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté.",
|
||||
),
|
||||
(
|
||||
"en",
|
||||
"below the article's quorum, the voters who are missing count as votes against, and it takes as many votes in favour as if that quorum had voted.",
|
||||
),
|
||||
(
|
||||
"es",
|
||||
"por debajo del quórum del artículo, los votantes que faltan cuentan como «no», y hacen falta tantos votos a favor como si hubiera votado ese quórum.",
|
||||
),
|
||||
];
|
||||
for (lang, phrase) in said {
|
||||
assert!(text(&today, "N1.1", lang).1.contains(phrase), "N1.1 {lang}: « {phrase} »");
|
||||
@@ -750,7 +1040,11 @@ fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
|
||||
for &w in electorates {
|
||||
let (lowest, highest) = quorum_bounds(w, test_group);
|
||||
assert_eq!(highest, w.max(lowest));
|
||||
for p in participations(w, vote_floor) {
|
||||
let ps = participations(w, vote_floor);
|
||||
if !test_group {
|
||||
assert!(ps.contains(&Participation::LOWEST) && ps.contains(&Participation::HIGHEST), "W {w}: {ps:?}");
|
||||
}
|
||||
for p in ps {
|
||||
let scale = Scale { electorate: w, participation: p, quorums: [lowest; 5] };
|
||||
for k in InertiaLevel::ALL {
|
||||
for q in quorums(w, lowest) {
|
||||
@@ -771,6 +1065,13 @@ fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
|
||||
}
|
||||
}
|
||||
}
|
||||
// F1.2: in Monnaie libre, one « pour » never passes, whatever the « contre ».
|
||||
if !test_group {
|
||||
for n in [0, 1, q, w - 1] {
|
||||
let lone = Tally { for_votes: 1, against: n };
|
||||
assert!(!passes(lone, w, ¶ms).expect("valid"), "{at}: 1 pour, {n} contre");
|
||||
}
|
||||
}
|
||||
if at_quorum == q {
|
||||
minimum.push((test_group, w, k.get(), q));
|
||||
}
|
||||
@@ -791,44 +1092,136 @@ fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
|
||||
assert!(minimum.iter().any(|m| m.0 && m.3 == 1));
|
||||
}
|
||||
|
||||
/// N1.1 and F1.2, lot T3: the share of a level « comme d'habitude » is asked beyond the quorum
|
||||
/// only. When the usual turnout reaches the quorum, the group voting as usual is asked s_k; when
|
||||
/// it does not (a web of fewer than 5 000 members and a median under 50 at a quorum of 50, an
|
||||
/// author's quorum above the usual turnout), it is asked the threshold of the quorum, which is
|
||||
/// not s_k of those who came. Every W, every median within the bounds, every level, quorums.
|
||||
/// N1.1, « La part exigée dépend du cran et du nombre de votants, comparé à la participation
|
||||
/// habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la
|
||||
/// majorité M quand tout le monde vote » (lot T3c: « la part exigée », the one the formula below
|
||||
/// names; « ce quorum », the article's). On the grid: under the article's quorum, the share asked
|
||||
/// stays that of the quorum; from it, it falls with every voter more, strictly, down to M when
|
||||
/// everyone votes; and it depends on the participation habituelle (at it, s_k:
|
||||
/// `the_share_of_a_level_is_asked_at_the_usual_turnout_…`). « La part » alone could be read as the
|
||||
/// share of « pour » the voters must bring in whole votes: that one rises at times beyond the quorum
|
||||
/// — 9 « pour » of 12 voters, 75 %, then 10 of 13, 76,9 % (W 5 707, the reference turnout, level 2,
|
||||
/// quorum 12), while the share asked falls from 73,5 % to 73,2 %.
|
||||
#[test]
|
||||
fn the_share_of_a_level_as_usual_is_asked_beyond_the_quorum() {
|
||||
let mut under = 0;
|
||||
for w in ELECTORATES {
|
||||
let medians = [w / 100 + 1, 12, 40, 50, 100, 120, 1000, w / 2];
|
||||
for usual in medians {
|
||||
let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9);
|
||||
if part.bounded {
|
||||
continue;
|
||||
}
|
||||
let scale = Scale { electorate: w, participation: part.ratio, quorums: [12, 12, 50, 50, 50] };
|
||||
for k in InertiaLevel::ALL {
|
||||
let (s, m) = (k.share_pct() / 100.0, k.majority_pct() / 100.0);
|
||||
for q in [2, 12, 50, 100, 1000, usual, usual + 1, w].into_iter().filter(|q| (2..=w).contains(q)) {
|
||||
let params = scale.params(k, q);
|
||||
let at = format!("W {w} usual {usual} k {} Q {q}", k.get());
|
||||
let asked = required_ratio(w, judged_voters(usual, q), ¶ms);
|
||||
if usual >= q {
|
||||
assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s");
|
||||
} else {
|
||||
assert!(asked < s - 1e-9, "{at}: {asked}");
|
||||
under += 1;
|
||||
}
|
||||
// Everyone votes: M, at every quorum.
|
||||
assert!((required_ratio(w, judged_voters(w, q), ¶ms) - m).abs() < 1e-12, "{at}: M");
|
||||
}
|
||||
fn the_share_asked_falls_beyond_the_article_s_quorum_down_to_m() {
|
||||
let today = today_seed();
|
||||
for (lang, phrase) in [
|
||||
(
|
||||
"fr",
|
||||
"La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote.",
|
||||
),
|
||||
(
|
||||
"en",
|
||||
"The share asked depends on the level and on the number of voters, compared with the group's usual turnout: beyond that quorum, the more voters, the lower it gets, down to the majority M when everyone votes.",
|
||||
),
|
||||
(
|
||||
"es",
|
||||
"La proporción exigida depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá de ese quórum, cuantos más votantes, más baja, hasta la mayoría M cuando vota todo el mundo.",
|
||||
),
|
||||
] {
|
||||
assert!(text(&today, "N1.1", lang).1.contains(phrase), "N1.1 {lang}: « {phrase} »");
|
||||
}
|
||||
let (mut under, mut beyond) = (0u64, 0u64);
|
||||
for c in grid() {
|
||||
let p = c.params();
|
||||
let share = |t: u32| required_ratio(c.w, judged_voters(t, c.q), &p);
|
||||
let at = c.at();
|
||||
// Every number of voters on the smallest webs; beyond, around the quorum, the participation
|
||||
// habituelle and the median, W/2, W.
|
||||
let mut ts: Vec<u32> = if c.w <= 101 {
|
||||
(0..=c.w).collect()
|
||||
} else {
|
||||
let usual = c.voters();
|
||||
let mut ts = vec![0, 1, c.q - 1, c.q, c.q + 1, c.q + 2, 2 * c.q, usual.floor() as u32, usual.ceil() as u32];
|
||||
ts.extend(c.usual.median);
|
||||
ts.extend([c.w / 2, c.w - 1, c.w]);
|
||||
ts
|
||||
};
|
||||
ts.retain(|t| *t <= c.w);
|
||||
ts.sort_unstable();
|
||||
ts.dedup();
|
||||
for pair in ts.windows(2) {
|
||||
let (a, b) = (pair[0], pair[1]);
|
||||
if a >= c.q {
|
||||
assert!(share(b) < share(a), "{at}: from {a} to {b} voters, {} then {}", share(a), share(b));
|
||||
beyond += 1;
|
||||
} else if b <= c.q {
|
||||
assert_eq!(share(a), share(b), "{at}: under the quorum, {a} and {b} voters");
|
||||
under += 1;
|
||||
}
|
||||
}
|
||||
assert!((share(c.w) - c.m()).abs() < 1e-12, "{at}: M when everyone votes");
|
||||
}
|
||||
assert!(under > 0);
|
||||
assert!(under > 0 && beyond > 0, "under {under}, beyond {beyond}");
|
||||
// The share of « pour » in whole votes is not the share asked: it rises from 12 to 13 voters.
|
||||
let w = 5707;
|
||||
let scale = Scale { electorate: w, participation: Participation::of(w, 50.0, None, 0).ratio, quorums: [12; 5] };
|
||||
let p = scale.params(level(2), 12);
|
||||
let (at12, at13) = (wot_threshold(w, 12, &p).expect("valid"), wot_threshold(w, 13, &p).expect("valid"));
|
||||
assert_eq!((at12, at13), (9, 10));
|
||||
assert!(f64::from(at13) / 13.0 > f64::from(at12) / 12.0);
|
||||
assert!(required_ratio(w, 13, &p) < required_ratio(w, 12, &p));
|
||||
}
|
||||
|
||||
/// N1.1, « Les cinq crans : le quorum dans Monnaie libre, la part exigée au-delà du quorum de
|
||||
/// l'article, à la participation habituelle, puis quand tout le monde vote » and its five lines
|
||||
/// (« 60 % à la participation habituelle, 50 % quand tout le monde vote »…); F1.2, « au-delà du
|
||||
/// quorum, le groupe demande 75 % de « pour » à sa participation habituelle ». Lot T3 wrote « comme
|
||||
/// d'habitude », which reads first as the real median: false where the median leaves its bounds
|
||||
/// (`the_participation_habituelle_is_the_median_brought_back_within_its_bounds`); the defined term
|
||||
/// since the review of e7ab82f. On the grid: when the participation habituelle reaches the article's
|
||||
/// quorum, the share asked there is s_k exactly; when it does not (a quorum above it: the author's,
|
||||
/// or the level's on a small web), the voters are judged as the quorum, at a share lower than s_k,
|
||||
/// asked of more voters than came; when everyone votes, M_k, at every quorum.
|
||||
#[test]
|
||||
fn the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum() {
|
||||
let today = today_seed();
|
||||
for (lang, intro) in [
|
||||
(
|
||||
"fr",
|
||||
"la part exigée au-delà du quorum de l'article, à la participation habituelle, puis quand tout le monde vote",
|
||||
),
|
||||
("en", "the share asked beyond the article's quorum, at the usual turnout, then when everyone votes"),
|
||||
(
|
||||
"es",
|
||||
"la proporción exigida más allá del quórum del artículo, con la participación habitual, luego cuando vota todo el mundo",
|
||||
),
|
||||
] {
|
||||
assert!(text(&today, "N1.1", lang).1.contains(intro), "N1.1 {lang}: « {intro} »");
|
||||
}
|
||||
// The five lines and F1.2 carry their numbers: `every_number_of_the_quorum_texts_is_the_engine_s`.
|
||||
let (mut beyond, mut under, mut low, mut high) = (0u64, 0u64, 0u64, 0u64);
|
||||
for c in grid() {
|
||||
let (s, m, p) = (c.s(), c.m(), c.params());
|
||||
let at = c.at();
|
||||
let usual = c.voters();
|
||||
if (usual - usual.round()).abs() < 1e-9 {
|
||||
let whole = required_ratio(c.w, usual.round() as u32, &p);
|
||||
assert!(close(share_at(c.w, usual, &p), whole), "{at}: the share on a web a hundred times larger");
|
||||
}
|
||||
let asked = share_at(c.w, usual.max(f64::from(c.q)), &p);
|
||||
if usual >= f64::from(c.q) {
|
||||
assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s");
|
||||
beyond += 1;
|
||||
} else {
|
||||
assert_eq!(asked, required_ratio(c.w, c.q, &p), "{at}: judged as the quorum");
|
||||
assert!(asked < s - 1e-9, "{at}: {asked}");
|
||||
under += 1;
|
||||
}
|
||||
if c.usual.part.bounded && usual >= f64::from(c.q) {
|
||||
if c.usual.part.ratio == Participation::LOWEST {
|
||||
low += 1;
|
||||
} else {
|
||||
high += 1;
|
||||
}
|
||||
}
|
||||
// Everyone votes: M, at every quorum.
|
||||
assert!((required_ratio(c.w, judged_voters(c.w, c.q), &p) - m).abs() < 1e-12, "{at}: M");
|
||||
}
|
||||
assert!(beyond > 0 && under > 0 && low > 0 && high > 0, "beyond {beyond}, under {under}, low {low}, high {high}");
|
||||
// The case of F1.2, its default level and quorum: W 3 000, a usual turnout of 40 voters
|
||||
// (within the bounds: 1 % is 30). Voting as usual, the group is asked 38 « pour » of its 40
|
||||
// voters: 95 %, not 75 %.
|
||||
// (within the bounds: 1 % is 30). At its participation habituelle, the group is asked 38 « pour »
|
||||
// of its 40 voters: 95 %, not 75 % — under the quorum, which the sentence leaves out.
|
||||
let (w, usual) = (3000, 40);
|
||||
let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9);
|
||||
assert!(!part.bounded);
|
||||
@@ -842,12 +1235,226 @@ fn the_share_of_a_level_as_usual_is_asked_beyond_the_quorum() {
|
||||
assert_eq!(wot_threshold(w, usual, &p), Ok(38), "but 40 voters are judged as 50");
|
||||
}
|
||||
|
||||
/// N1.1, the sentence of G: « G se calcule pour que la part exigée, au-delà du quorum de l'article,
|
||||
/// soit exactement celle du cran à la participation habituelle : `G = …`, où s est cette part du
|
||||
/// cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W » — after the
|
||||
/// reviews of 2ce2028 (« au-delà du quorum »: under it, the voters are judged as the quorum) and of
|
||||
/// e7ab82f (the defined term where T3b wrote « quand le groupe vote comme d'habitude »; « du quorum
|
||||
/// de l'article »). s is the share of the level, the one of the list — never « la part exigée »,
|
||||
/// which the formula above names and which moves with T'. On the grid, with G as the text writes
|
||||
/// it and p̃ the participation habituelle over W, the median brought back within its bounds: G is
|
||||
/// the engine's, at every quorum; on the curve, the share at the participation habituelle is s; the
|
||||
/// share asked there is s beyond the article's quorum, and lower, judged as the quorum, under it.
|
||||
#[test]
|
||||
fn g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum() {
|
||||
let today = today_seed();
|
||||
// The sentence of G closes N1.1, in each language; nothing of the sentence of T2 is left.
|
||||
for lang in LANGS {
|
||||
let (_, body) = text(&today, "N1.1", lang);
|
||||
let (_, _, before, now) = PHRASES_T3
|
||||
.iter()
|
||||
.find(|(c, l, _, new)| (*c, *l) == ("N1.1", lang) && new.starts_with("**G**"))
|
||||
.expect("the sentence of G");
|
||||
assert!(body.ends_with(now), "N1.1 {lang}: the sentence of G\n{body}");
|
||||
let (said_before, _) = before.split_once(" = ").expect("the formula");
|
||||
assert!(!body.contains(said_before), "N1.1 {lang}: the sentence of T2 is left\n{body}");
|
||||
let (said_now, _) = now.split_once(" = ").expect("the formula");
|
||||
for words in [
|
||||
named(
|
||||
lang,
|
||||
"au-delà du quorum de l'article",
|
||||
"beyond the article's quorum",
|
||||
"más allá del quórum del artículo",
|
||||
),
|
||||
named(lang, "à la participation habituelle", "at the usual turnout", "con la participación habitual"),
|
||||
] {
|
||||
assert!(said_now.contains(words), "N1.1 {lang}: « {words} »");
|
||||
}
|
||||
}
|
||||
// By the engine, with G as the text writes it (s, the share of the level; M; p̃).
|
||||
let grad = code_spans(text(&today, "N1.1", "fr").1)[1];
|
||||
let (mut beyond, mut under) = (0u64, 0u64);
|
||||
for c in grid() {
|
||||
let (s, m) = (c.s(), c.m());
|
||||
let env: HashMap<String, f64> =
|
||||
HashMap::from([("s".into(), s), ("M".into(), m), ("p̃".into(), c.usual.part.ratio)]);
|
||||
let engine = c.params();
|
||||
let params = FormulaParams { gradient: eval(grad, "G", &env), ..engine };
|
||||
let at = c.at();
|
||||
assert!(close(params.gradient, engine.gradient), "{at}: G");
|
||||
let usual = c.voters();
|
||||
assert!((share_at(c.w, usual, ¶ms) - s).abs() < 1e-9, "{at}: s on the curve");
|
||||
let asked = share_at(c.w, usual.max(f64::from(c.q)), ¶ms);
|
||||
if usual >= f64::from(c.q) {
|
||||
assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s");
|
||||
beyond += 1;
|
||||
} else {
|
||||
assert!(asked < s - 1e-9, "{at}: {asked}");
|
||||
under += 1;
|
||||
}
|
||||
}
|
||||
assert!(beyond > 0 && under > 0, "beyond {beyond}, under {under}");
|
||||
// The case of the review of 2ce2028: W 3 000, a usual turnout of 40 voters, level 3, quorum 50.
|
||||
// On the curve, 75 % at 40 voters; the share asked is that of 50 voters, 74,23 %; 38 « pour »
|
||||
// of the 40 who came, 95 %.
|
||||
let (w, usual) = (3000, 40);
|
||||
let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9);
|
||||
let c = Case { w, usual: Usual { median: Some(usual), part }, k: level(3), q: 50 };
|
||||
let p = c.params();
|
||||
assert!((required_ratio(w, usual, &p) - 0.75).abs() < 1e-12);
|
||||
let asked = required_ratio(w, judged_voters(usual, c.q), &p);
|
||||
assert_eq!((asked * 10_000.0).round() / 100.0, 74.23);
|
||||
let needed = wot_threshold(w, usual, &p).expect("valid");
|
||||
assert_eq!((needed, f64::from(needed) / f64::from(usual)), (38, 0.95));
|
||||
}
|
||||
|
||||
/// N1.1, « La participation habituelle est la médiane du nombre de votants des propositions du
|
||||
/// groupe votées depuis un an. Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois
|
||||
/// le quorum de référence du document […]. Elle est ramenée entre 1 % et 50 % de l'électorat » —
|
||||
/// and why F1.2 and N1.1 write this defined term where lot T3 wrote « comme d'habitude » (review of
|
||||
/// e7ab82f). « Quand le groupe vote comme d'habitude » reads first as « when as many vote as the
|
||||
/// median »: the engine computes G on the median brought back within its bounds, and where the
|
||||
/// median is out of them, the share asked of as many voters as the median is not s_k — higher under
|
||||
/// 1 % of W, lower above 50 %. The case of the review: W 7 224, a median of 40 voters (0,55 %),
|
||||
/// level 2, quorum 12 — at 40 voters the share asked is 68,7 %, 28 « pour » of 40, not 27 (67 %);
|
||||
/// at the participation habituelle, 72,24 voters (1 % of W), 67 % exactly. « Tant que le groupe n'a
|
||||
/// pas voté sur 5 propositions » (T2) was false once the group had: the median rests on the
|
||||
/// proposals voted on within the year, and with fewer than 5 there the reference stands in again
|
||||
/// (`tests/inertia.rs`, `the_usual_participation_is_the_median_of_five_voted_proposals`); « Elle
|
||||
/// reste entre » read as a fact, not as the rule that brings the median back.
|
||||
#[test]
|
||||
fn the_participation_habituelle_is_the_median_brought_back_within_its_bounds() {
|
||||
let today = today_seed();
|
||||
// The texts write the defined term, never the paraphrase: in N1.1, the list, its five lines and
|
||||
// G (and, in French and Spanish, « comparé à la participation habituelle du groupe », already
|
||||
// there); in F1.2, « Par défaut ».
|
||||
for (lang, paraphrase, term, times, its, rests, bounds) in [
|
||||
(
|
||||
"fr",
|
||||
"comme d'habitude",
|
||||
"à la participation habituelle",
|
||||
8,
|
||||
"à sa participation habituelle",
|
||||
"Tant qu'elle repose sur moins de",
|
||||
"Elle est ramenée entre",
|
||||
),
|
||||
(
|
||||
"en",
|
||||
"as usual",
|
||||
"at the usual turnout",
|
||||
7,
|
||||
"at its usual turnout",
|
||||
"While it rests on fewer than",
|
||||
"It is kept between",
|
||||
),
|
||||
(
|
||||
"es",
|
||||
"como de costumbre",
|
||||
"con la participación habitual",
|
||||
8,
|
||||
"con su participación habitual",
|
||||
"Mientras se base en menos de",
|
||||
"Se acota entre",
|
||||
),
|
||||
] {
|
||||
let (n11, f12) = (text(&today, "N1.1", lang).1, text(&today, "F1.2", lang).1);
|
||||
for (code, body) in [("N1.1", n11), ("F1.2", f12)] {
|
||||
assert!(!body.contains(paraphrase), "{code} {lang}: « {paraphrase} »\n{body}");
|
||||
}
|
||||
assert_eq!(n11.matches(term).count(), times, "N1.1 {lang}: the list, its five lines, G\n{n11}");
|
||||
assert_eq!(f12.matches(its).count(), 1, "F1.2 {lang}: by default");
|
||||
assert!(n11.contains(rests) && n11.contains(bounds), "N1.1 {lang}: the definition");
|
||||
}
|
||||
// The engine: the median — or, on fewer than 5 proposals, the reference — brought back within
|
||||
// 1 % and 50 % of W.
|
||||
for w in ELECTORATES {
|
||||
for u in usuals(w, 50.0) {
|
||||
let raw = match u.median {
|
||||
Some(m) => f64::from(m) / f64::from(w),
|
||||
None => Participation::reference_ratio(w, 50.0),
|
||||
};
|
||||
let at = format!("W {w} {u:?}");
|
||||
assert_eq!(u.part.ratio, raw.clamp(Participation::LOWEST, Participation::HIGHEST), "{at}");
|
||||
assert_eq!(u.part.bounded, u.part.ratio != raw, "{at}");
|
||||
if let Some(m) = u.median {
|
||||
let few = Participation::of(w, 50.0, Some(f64::from(m)), Participation::MIN_SAMPLE - 1);
|
||||
assert_eq!(few.ratio, Participation::of(w, 50.0, None, 0).ratio, "{at}: the reference");
|
||||
}
|
||||
}
|
||||
}
|
||||
// The case of the review.
|
||||
let (w, median) = (7224, 40);
|
||||
let part = Participation::of(w, 50.0, Some(f64::from(median)), 9);
|
||||
assert_eq!((part.bounded, part.ratio), (true, Participation::LOWEST));
|
||||
let c = Case { w, usual: Usual { median: Some(median), part }, k: level(2), q: 12 };
|
||||
let p = c.params();
|
||||
assert_eq!((required_ratio(w, median, &p) * 1000.0).round() / 10.0, 68.7);
|
||||
assert_eq!(wot_threshold(w, median, &p), Ok(28));
|
||||
assert_eq!((c.s() * f64::from(median)).ceil(), 27.0, "67 % of 40, rounded up");
|
||||
assert!(!passes(Tally { for_votes: 27, against: 13 }, w, &p).expect("valid"));
|
||||
assert!(passes(Tally { for_votes: 28, against: 12 }, w, &p).expect("valid"));
|
||||
assert!((c.voters() - 72.24).abs() < 1e-9);
|
||||
assert!((share_at(w, c.voters(), &p) - c.s()).abs() < 1e-12, "67 % at the participation habituelle");
|
||||
// On the grid: every median out of its bounds that reaches the quorum — as many voters as the
|
||||
// median are not asked s_k.
|
||||
let (mut under_one, mut above_half) = (0u64, 0u64);
|
||||
for c in grid() {
|
||||
let Some(median) = c.usual.median.filter(|m| c.usual.part.bounded && *m >= c.q) else { continue };
|
||||
let at = c.at();
|
||||
let at_median = required_ratio(c.w, median, &c.params());
|
||||
if c.usual.part.ratio == Participation::LOWEST {
|
||||
assert!(at_median > c.s() + 1e-9, "{at}: {at_median}");
|
||||
under_one += 1;
|
||||
} else {
|
||||
assert!(at_median < c.s() - 1e-9, "{at}: {at_median}");
|
||||
above_half += 1;
|
||||
}
|
||||
}
|
||||
assert!(under_one > 0 && above_half > 0, "under 1 % {under_one}, above 50 % {above_half}");
|
||||
}
|
||||
|
||||
/// N1.1, « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de
|
||||
/// référence du document : 100 votants dans Monnaie libre. […] Elle est ramenée entre 1 % et 50 % de
|
||||
/// l'électorat » (review of 2ce2028). 100 is a parameter, 2 × voteFloor, which the number test
|
||||
/// checks as such (`figures`); it is not a turnout that holds on every W: the engine's p0 is 100
|
||||
/// voters on a web of 200 to 10 000 members only (1 % and 50 % of W); beyond, the bounds the
|
||||
/// paragraph says after it bring it back. The voted text is not changed for this.
|
||||
#[test]
|
||||
fn the_reference_turnout_is_a_parameter_the_bounds_bring_back() {
|
||||
let seed = today_seed();
|
||||
let f = figures(&seed);
|
||||
let vote_floor = f64::from(f.reference) / 2.0;
|
||||
for w in ELECTORATES.into_iter().chain([199, 200, 10_000, 10_001]) {
|
||||
let p0 = Participation::of(w, vote_floor, None, 0);
|
||||
let within = (200..=10_000).contains(&w);
|
||||
assert_eq!(p0.bounded, !within, "W {w}");
|
||||
if within {
|
||||
assert!((p0.voters(w) - f64::from(f.reference)).abs() < 1e-9, "W {w}: {} voters", p0.voters(w));
|
||||
} else {
|
||||
let bound = if w < 200 { Participation::HIGHEST } else { Participation::LOWEST };
|
||||
assert_eq!(p0.ratio, bound, "W {w}");
|
||||
}
|
||||
}
|
||||
// The text says the parameter first, then the bounds, in each language.
|
||||
for (lang, reference, bounds) in [
|
||||
("fr", format!("{} votants dans Monnaie libre.", f.reference), "Elle est ramenée entre"),
|
||||
("en", format!("{} voters in Monnaie libre.", f.reference), "It is kept between"),
|
||||
("es", format!("{} votantes en Monnaie libre.", f.reference), "Se acota entre"),
|
||||
] {
|
||||
let (_, body) = text(&seed, "N1.1", lang);
|
||||
let at = |s: &str| body.find(s).unwrap_or_else(|| panic!("N1.1 {lang}: « {s} »"));
|
||||
assert!(at(&reference) < at(bounds), "N1.1 {lang}: the bounds after the reference");
|
||||
}
|
||||
}
|
||||
|
||||
/// F1.1, « B : la base ; à la puissance W, elle est si petite qu'elle ne compte pas », and F1.2,
|
||||
/// « dans la toile de confiance, `B^W` est si petit qu'il ne compte pas »: true on every W of the
|
||||
/// web of trust (`wot::PLAUSIBLE`, 100 to 10 000 000) — the engine's threshold is the one
|
||||
/// without B, even where the share lands on a whole number (`threshold::settle`, `clamp_ceil`):
|
||||
/// M × W when everyone votes, s × the usual turnout. Where W is a handful of members (the test
|
||||
/// group, whose W is not the web of trust these texts speak of), B^W does count.
|
||||
/// group, whose W is not the web of trust these texts speak of), B^W does count. Lot T3c: on the
|
||||
/// participations of the grid (both bounds, where medians under 1 % and above 50 % of W are brought
|
||||
/// back) and quorums from 2 to W (`quorum_sample`).
|
||||
#[test]
|
||||
fn b_to_the_power_w_never_counts_in_the_web_of_trust() {
|
||||
assert_eq!((*PLAUSIBLE.start(), *PLAUSIBLE.end()), (ELECTORATES[0], ELECTORATES[ELECTORATES.len() - 1]));
|
||||
@@ -857,7 +1464,7 @@ fn b_to_the_power_w_never_counts_in_the_web_of_trust() {
|
||||
let usual = (p * f64::from(w)).round() as u32;
|
||||
let scale = Scale { electorate: w, participation: p, quorums: [12, 12, 50, 50, 50] };
|
||||
for k in InertiaLevel::ALL {
|
||||
for q in [2, 12, 50, 100, w].into_iter().filter(|q| *q <= w) {
|
||||
for q in quorum_sample(w, 2, &[p * f64::from(w)]) {
|
||||
let with_b = scale.params(k, q);
|
||||
assert_eq!(with_b.base, 0.1);
|
||||
let without = FormulaParams { base: 0.0, ..with_b };
|
||||
@@ -1029,14 +1636,22 @@ fn the_formulas_of_the_texts_are_those_the_engine_computes() {
|
||||
let [voters, threshold] = <[&str; 2]>::try_from(code_spans(f11)).expect("two formulas in F1.1");
|
||||
let [share, grad] = <[&str; 2]>::try_from(code_spans(n11)).expect("two formulas in N1.1");
|
||||
let mut checked = 0;
|
||||
for w in [2u32, 40, 5707, 7224] {
|
||||
for median in [None, Some(1.0), Some(9.0), Some(120.0), Some(360.0)] {
|
||||
let p = Participation::of(w, 50.0, median, 9).ratio;
|
||||
// Lot T3c: every W of the grid, and two of a handful of members; every participation of the
|
||||
// grid (both bounds among them, where medians under 1 % and above 50 % of W are brought
|
||||
// back: p̃ is the participation habituelle over W); quorums from 1 to W.
|
||||
for w in [2u32, 40].into_iter().chain(ELECTORATES) {
|
||||
for p in participations(w, 50.0) {
|
||||
let scale = Scale { electorate: w, participation: p, quorums: [12, 12, 50, 50, 50] };
|
||||
let usual = p * f64::from(w);
|
||||
let (down, up) = (usual.floor() as u32, usual.ceil() as u32);
|
||||
let mut quorums = vec![1u32, 2, 12, 50, up, w / 2, w];
|
||||
quorums.retain(|q| (1..=w).contains(q));
|
||||
quorums.sort_unstable();
|
||||
quorums.dedup();
|
||||
for k in InertiaLevel::ALL {
|
||||
for q in [1u32, 2, 12, 50].into_iter().filter(|q| *q <= w) {
|
||||
for &q in &quorums {
|
||||
let params = scale.params(k, q);
|
||||
for t in [0u32, 1, 9, 12, 13, 50, 51, 120, 500, w].into_iter().filter(|t| *t <= w) {
|
||||
for t in [0u32, 1, 9, 12, 13, 50, 51, 120, 500, down, up, w].into_iter().filter(|t| *t <= w) {
|
||||
let mut env: HashMap<String, f64> = HashMap::from([
|
||||
("T".into(), f64::from(t)),
|
||||
("Q".into(), f64::from(q)),
|
||||
|
||||
@@ -97,3 +97,5 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa
|
||||
| 2026-11-03 | automate | local, lot T2 sur `f27ee08` (les trois phrases de F1.1, F1.2 et N1.1 ; l'espace perdu du vote déplié ; C34 lit la ligne entière, C37 « ne change pas ») | C1–C37, M1 | 38 / 38 verts (40 tests), du premier coup |
|
||||
| 2026-11-03 | automate | local, lot U2 sur `bb4e7b7` (les mineurs de la relecture de M7 : cibles de 44 px et trois lectures entières sur téléphone, M2 ; « Proposer cet ordre » dit pourquoi, C35 ; une information à un seul endroit, C19, C36 ; l'en-tête et les changements d'inertie d'un module, C38 ; C25 et C26 lisent l'inertie dans « Inertie ») | C1–C38, M1, M2 | 40 / 40 verts (42 tests), du premier coup |
|
||||
| 2026-11-03 | automate | local, lot T3 sur `b2d653e` (N1.1 et F1.2 sans chiffre daté, chaque phrase vraie pour tout W et tout quorum ; aucun contrôle changé) | C1–C38, M1, M2 | 40 / 40 verts (42 tests) au second passage ; le premier, 40 / 42 : C33 et C38 tombés sur `net::ERR_NETWORK_CHANGED` (le réseau du poste a changé pendant le passage, vu dans leurs traces) |
|
||||
| 2026-11-03 | automate | local, lot T3b sur `582d6ba` (après la relecture de `2ce2028` : la phrase de G de N1.1, « autant de « pour » » ; aucun contrôle changé) | C1–C38, M1, M2 | 40 / 40 verts (42 tests) au second passage ; le premier, 40 / 42 : C8 et C32 tombés sur `net::ERR_NETWORK_CHANGED` (modules de l'interface non chargés, vu dans leurs traces) |
|
||||
| 2026-11-03 | automate | local, lot T3c sur `42c803e` (après la relecture de `e7ab82f` : « à la participation habituelle » à la place de « comme d'habitude » dans F1.2 et N1.1, « le quorum de l'article », « la part exigée », « repose sur moins de 5 propositions », « ramenée » ; aucun contrôle changé) | C1–C38, M1, M2 | 40 / 40 verts (42 tests), du premier coup (19 h 51 - 19 h 55, sous le verrou `/tmp/ld-e2e.lock`) |
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
# Lot T3c : la liste fermée des phrases de F1.2 et N1.1
|
||||
|
||||
> Préparé le 2026-11-03 (lot T3c, branche `lot/t3c-habituelle`), après la relecture indépendante de
|
||||
> `e7ab82f` et le complément d'orch du même soir : « que T3c soit le dernier tour ». Remise telle
|
||||
> quelle au relecteur. Elle donne **toutes** les phrases de F1.2 « Paramètres par défaut » et de N1.1
|
||||
> « Niveaux d'inertie », dans leur texte final (le français fait foi ; en et es disent la même chose,
|
||||
> mot pour mot dans `seeds/acte-engagement-certification.json`). Pour chacune : ce qu'elle affirme, et
|
||||
> le test qui la vérifie contre le moteur avec sa grille, ou « rien à vérifier » (une définition, une
|
||||
> règle sans nombre). Ce qui a changé depuis `e7ab82f`, avant et après, avec ses raisons :
|
||||
> `textes-quorum-seed.md`, « Après la relecture de e7ab82f ». F1.1 n'est pas touché (ordre de T3c).
|
||||
|
||||
## La grille
|
||||
|
||||
Les tests nommés sont dans `crates/ld-server/tests/seed_quorum_texts.rs`, sauf mention. **La grille
|
||||
T3c** (`grid()`, 85 100 cas) :
|
||||
|
||||
- **W** : 100, 101, 1 000, 3 000, 5 707, 7 224, 10 000, 1 000 000, 10 000 000 (`ELECTORATES` ; 100 et
|
||||
10 000 000 sont les bornes de `wot::PLAUSIBLE`, la toile que le serveur tient pour vraie).
|
||||
- **La participation habituelle** : la référence (moins de 5 propositions : 2 × 50 votants), puis les
|
||||
médianes 1, 2, W/100 − 1, W/100, W/100 + 1, 12, 40, 50, 100, 120, 1 000, W/2, W/2 + 1 et W (celles de
|
||||
1 à W). Chacune passe par `Participation::of`, comme en production : **une médiane sous 1 % de W ou
|
||||
au-dessus de 50 % de W est ramenée à la borne**, et c'est la valeur bornée qui est la participation
|
||||
habituelle (W 7 224, médiane 40 : 72,24 votants). Cette valeur n'est pas toujours un nombre entier de
|
||||
votants : la part qu'y demande le moteur se lit sur une toile cent fois plus grande (`share_at`, le
|
||||
moteur ne lit que T'/W ; vérifié contre le moteur sur les nombres entiers).
|
||||
- **Le quorum de l'article** : chaque quorum qu'un auteur peut fixer, de 2 à W, jusqu'à W = 1 000 ; au-delà,
|
||||
2, 3, 11, 12, 13, 49, 50, 51, 100, 1 000, W/2, W − 1, W, et autour de la participation habituelle et de
|
||||
la médiane (l'entier en dessous, au-dessus, et le suivant).
|
||||
- **Les cinq crans.**
|
||||
|
||||
Certains tests ont leur propre grille, dite à leur ligne. « Vu rouge » : le test échoue sur le texte de
|
||||
`e7ab82f` (8 tests, sortie gardée), ou sous une mutation du code, défaite aussitôt (quatre mutations,
|
||||
en bas).
|
||||
|
||||
## F1.2 « Paramètres par défaut »
|
||||
|
||||
1. « Les valeurs des lettres de la formule (voir « Formule du seuil WoT ») et la façon dont le vote se
|
||||
déroule. »
|
||||
- Affirme : ce que contient l'article. **Rien à vérifier.**
|
||||
2. Intertitre « **Un vote permanent, sans durée** ». **Rien à vérifier.**
|
||||
3. « Chaque version se vote à tout moment, sans échéance. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** sur la grille.
|
||||
4. « Chacun peut changer ou retirer son vote : le dernier fait foi. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** sur la grille. Tenue ailleurs, sans être reprise
|
||||
par T3c : `ld-engine` `ballot::the_last_one_stands_in_the_order_of_the_chain`,
|
||||
`tests/ballots.rs` `the_last_one_stands_in_the_order_of_the_chain`. *À savoir* : sur une version
|
||||
retenue par une objection, on ne peut que retirer son vote ou passer à « contre » (ADR 0010) ; la
|
||||
phrase ne le dit pas. Hors du champ de T3c (ni nombre, ni part, ni terme défini) : laissée, à
|
||||
trancher.
|
||||
5. « Une proposition entre en vigueur dès qu'elle atteint son seuil. »
|
||||
- Affirme : une règle sans nombre (le seuil est F1.1). **Rien à vérifier** sur la grille. *À savoir* :
|
||||
une version retenue par une objection n'entre pas en vigueur (ADR 0010), même au seuil ; même
|
||||
remarque que la phrase 4.
|
||||
6. « S'il y a déjà un texte en vigueur, il lui faut en plus une marge (voix pour moins voix exigées) plus
|
||||
large que celle de ce texte. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** sur la grille ; tenue par `ld-engine`
|
||||
`compose::a_rival_must_beat_the_version_in_force`.
|
||||
7. « Le texte remplacé redevient une proposition, avec ses votes : il peut revenir. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** ; tenue par `tests/api.rs`
|
||||
`a_rival_replaces_the_seed_and_the_seed_returns_among_proposals`.
|
||||
8. « Si plusieurs propositions y parviennent, celle qui a la marge la plus large entre en vigueur. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** ; tenue par `ld-engine`
|
||||
`compose::rivals_on_one_unit_yield_one_winner`.
|
||||
9. Intertitre « **Les lettres** ». **Rien à vérifier.**
|
||||
10. « **W** : le nombre de membres de la toile de confiance Ğ1, relu sur la chaîne toutes les 6 heures. »
|
||||
- Affirme : une définition, et le nombre 6.
|
||||
- Test : `every_number_of_the_quorum_texts_is_the_engine_s` (6 = `wot::REFRESH` ; tout chiffre que
|
||||
rien ne justifie fait échouer), le même sur chaque W de la grille.
|
||||
11. « **T** : les votes exprimés sur la version, pour et contre. » — une définition. **Rien à vérifier.**
|
||||
12. « **Q**, le quorum : sous ce nombre de votants, ceux qui manquent comptent comme « non ». »
|
||||
- Affirme : sous Q votants, la part se demande à Q votants, les absents comptés « non ».
|
||||
- Test : `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` — W de la grille, chaque
|
||||
quorum de 2 à W jusqu'à W = 10 000 (au-delà : 2, 3, 12, 50, 100, 1 000, W/2, W − 1, W), chaque
|
||||
participation de la grille (les deux bornes y sont), les cinq crans ; le groupe d'essai de 1 à
|
||||
40 membres, quorum 1 à W ; 833 105 cas. Vu rouge sous la mutation 2.
|
||||
13. « Chaque article prend celui de son cran : 12, 12, 50, 50 et 50 dans Monnaie libre, du cran 1 au
|
||||
cran 5. »
|
||||
- Affirme : les quorums par cran, et qu'un article sans quorum à lui prend celui de son cran.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (les cinq nombres, lus dans le seed) ;
|
||||
`tests/quorum.rs` `each_level_has_its_quorum_and_every_evaluation_says_it` (chaque évaluation
|
||||
sur le quorum de son cran).
|
||||
14. « L'auteur de la première version d'un article, un administrateur pour les textes de départ, peut en
|
||||
fixer un autre tant que l'article ne garde la trace d'aucun vote. »
|
||||
- Affirme : une règle sans nombre (qui, jusqu'à quand). **Rien à vérifier** sur la grille ; tenue par
|
||||
`tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote`,
|
||||
`in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pending`, et
|
||||
`tests/ballots.rs` `a_vote_exists_for_every_state_of_the_buffer` (lot T2).
|
||||
15. « Dans Monnaie libre, jamais moins de 2 : une seule voix ne fait jamais passer un texte. »
|
||||
- Affirme : le quorum le plus bas est 2 ; un seul « pour » ne passe jamais, quels que soient les
|
||||
« contre ».
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (2 = `quorum_bounds(W, false)`, le même
|
||||
sur chaque W) ; `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` (sa grille, plus
|
||||
haut : à chaque cas de Monnaie libre, 1 « pour » avec 0, 1, Q ou W − 1 « contre » ne passe pas ; au
|
||||
quorum 2, deux « pour » sur chaque W et à chaque cran) ; `tests/quorum.rs`
|
||||
`in_monnaie_libre_a_quorum_holds_two_voices_…` (un quorum de 1 refusé).
|
||||
16. « **B = 0,1** : dans la toile de confiance, `B^W` est si petit qu'il ne compte pas. »
|
||||
- Affirme : 0,1, et que B^W ne change aucun seuil dans la toile.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (0,1 = `FormulaParams::DEFAULT_BASE`) ;
|
||||
`b_to_the_power_w_never_counts_in_the_web_of_trust` — W de la grille et 102, 5 000, 5 708, chaque
|
||||
participation de la grille, quorums de 2 à W (échantillon), neuf nombres de votants par cas,
|
||||
41 505 cas : le seuil avec B est celui sans B. Vu rouge sous la mutation 2.
|
||||
17. « **M** et **G** : donnés par le cran d'inertie de l'article (voir « Niveaux d'inertie »). »
|
||||
- Affirme : M et G sont ceux du cran (G aussi de la participation habituelle, phrase suivante).
|
||||
- Test : `the_formulas_of_the_texts_are_those_the_engine_computes` — W 2, 40 et ceux de la grille,
|
||||
chaque participation de la grille, quorums 1, 2, 12, 50, ⌈p̃ × W⌉, W/2, W, douze nombres de
|
||||
votants, les cinq crans, 19 950 cas par langue : M du cran, G écrit comme N1.1 l'écrit égal à
|
||||
celui du moteur. Vu rouge sous les mutations 1 et 2.
|
||||
18. « G n'est pas fixé à la main : il se déduit de la participation habituelle du groupe. »
|
||||
- Affirme : G vient de la participation habituelle — la valeur bornée, pas la médiane brute.
|
||||
- Tests : `g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum` (la
|
||||
grille T3c : G écrit avec p̃ la participation habituelle divisée par W est celui du moteur, à
|
||||
chaque quorum) ; `the_formulas_…` (ci-dessus). Vus rouges sous la mutation 1.
|
||||
19. Intertitre « **Par défaut** ». **Rien à vérifier.**
|
||||
20. « 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 » à sa participation habituelle. »
|
||||
- Affirme : le cran 3, son nom, M = 55 %, le quorum 50, et, quand la participation habituelle
|
||||
atteint le quorum, une part exigée de 75 % à cette participation.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (3, moyenne, 55, 50, 75 : le cran par
|
||||
défaut du moteur, son M, son s, son quorum dans le seed) ;
|
||||
`the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` (la grille T3c,
|
||||
donc le cran 3 à chaque quorum, dont 50 : à la participation habituelle, s exactement quand elle
|
||||
atteint le quorum — 16 985 cas, dont 2 375 où la médiane était sous 1 % de W et 7 365 au-dessus de
|
||||
50 % ; jugée sur le quorum, plus bas que s, sinon — 68 115 cas). Vu rouge sur le texte de
|
||||
`e7ab82f` (« quand il vote comme d'habitude ») et sous la mutation 1.
|
||||
21. « Tout nouvel article commence à ce cran. »
|
||||
- Affirme : un article créé est au cran 3.
|
||||
- Test : `tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote` (ajouté
|
||||
par T3c : l'article « Nouveau » est au cran 3). Vu rouge sous la mutation 3.
|
||||
22. « Au départ, aucun article n'est en vigueur. »
|
||||
- Affirme : une règle sans nombre. **Rien à vérifier** sur la grille ; tenue par
|
||||
`tests/seed_proposals.rs` `a_new_base_is_born_with_three_seed_proposals_and_no_article_in_force`.
|
||||
23. « Raison d'être, Unicité du compte et Réciprocité sont des Propositions seed, mises en avant pour
|
||||
lancer le vote, au cran 2 (basse). »
|
||||
- Affirme : les trois titres, le cran 2 et son nom.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (les titres des versions `seedProposal`
|
||||
du seed, `seed::SEED_PROPOSAL_LEVEL`) ; `tests/seed_proposals.rs` (ci-dessus).
|
||||
24. « Le titre du document est au cran 4 (haute), l'ordre des articles de chaque section au cran 2, tous
|
||||
les autres articles au cran 3. »
|
||||
- Affirme : trois crans lus dans le seed.
|
||||
- Test : `every_number_of_the_quorum_texts_is_the_engine_s` (`modules.title.inertia`,
|
||||
`modules.order.inertia`, chaque `inertia` du seed, toutes égales).
|
||||
|
||||
## N1.1 « Niveaux d'inertie »
|
||||
|
||||
1. « À chaque cran, le groupe demande une part de « pour » parmi les votants (voir « Formule du seuil
|
||||
WoT »). »
|
||||
- Affirme : qu'il y a une part, définie plus bas (phrase 4). **Rien à vérifier** à elle seule.
|
||||
2. « Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent comptent
|
||||
comme « non », et il faut autant de « pour » que si ce quorum avait voté. »
|
||||
- Affirme : sous le quorum de l'article (celui de son cran, ou celui que son auteur a fixé), les
|
||||
« pour » qui passent sont le seuil du quorum, et un décompte passe dès que ses « pour » l'atteignent.
|
||||
- Test : `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` (sa grille : F1.2,
|
||||
phrase 12). Vu rouge sur le texte de `e7ab82f` (« sous le quorum », « si le quorum ») et sous la
|
||||
mutation 2.
|
||||
3. « La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle du
|
||||
groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand
|
||||
tout le monde vote. »
|
||||
- Affirme : la part exigée dépend de k, de T' et de la participation habituelle ; au-delà du quorum de
|
||||
l'article, elle baisse strictement à chaque votant de plus ; à W votants, M.
|
||||
- Tests : `the_share_asked_falls_beyond_the_article_s_quorum_down_to_m` (la grille T3c ; chaque
|
||||
nombre de votants de 0 à W sur W 100 et 101, ailleurs autour du quorum, de la participation
|
||||
habituelle et de la médiane, W/2, W − 1, W : 808 390 paires au-delà du quorum, strictement
|
||||
décroissantes, 767 455 en dessous, égales ; M à W ; et la part en voix entières, ⌈part × T⌉ / T,
|
||||
qui remonte de 9 sur 12 à 10 sur 13 à W 5 707) ; la dépendance à la participation habituelle :
|
||||
`the_share_of_a_level_is_asked_at_the_usual_turnout_…` (phrase 5). Vu rouge sur le texte de
|
||||
`e7ab82f` (« La part », « au-delà du quorum ») et sous la mutation 2.
|
||||
4. « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum de
|
||||
l'article s'il en manque. »
|
||||
- Affirme : la formule, et T' = max(T, Q) avec Q le quorum de l'article.
|
||||
- Test : `the_formulas_of_the_texts_are_those_the_engine_computes` (sa grille : F1.2, phrase 17 ;
|
||||
T' et la part, évalués tels qu'écrits, égaux au moteur). Vu rouge sous les mutations 1 et 2.
|
||||
5. « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de l'article, à la
|
||||
participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au départ. »
|
||||
- Affirme : ce que disent les colonnes des cinq lignes ; la deuxième vaut au-delà du quorum de
|
||||
l'article, à la participation habituelle.
|
||||
- Test : `the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` (la
|
||||
grille T3c, F1.2 phrase 20). Vu rouge sur le texte de `e7ab82f`.
|
||||
6. à 10. Les cinq lignes, par exemple « **Cran 1 · très basse** : quorum 12 ; 60 % à la participation
|
||||
habituelle, 50 % quand tout le monde vote. Aucun article au départ. » ; puis 2 · basse : 12 ; 67 %,
|
||||
50 % ; Raison d'être, Unicité du compte, Réciprocité, et l'ordre des articles de chaque section ;
|
||||
3 · moyenne : 50 ; 75 %, 55 % ; le cran par défaut : tous les autres articles, et chaque nouvel
|
||||
article ; 4 · haute : 50 ; 83 %, 60 % ; le titre du document ; 5 · très haute : 50 ; 90 %, 66 % ;
|
||||
aucun article au départ.
|
||||
- Affirment : le quorum du cran, s_k à la participation habituelle (au-delà du quorum de l'article),
|
||||
M_k quand tout le monde vote, ce qui est au cran au départ.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (chaque nombre, chaque nom de cran, ce
|
||||
qui est au départ, construits depuis le moteur et le seed) ;
|
||||
`the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` (s_k et M_k sur la
|
||||
grille T3c) ; `the_participation_habituelle_is_the_median_brought_back_within_its_bounds` (pourquoi
|
||||
le terme défini). Vus rouges sur le texte de `e7ab82f` (« comme d'habitude ») ; le second sous la
|
||||
mutation 1.
|
||||
11. « **La participation habituelle** est la médiane du nombre de votants des propositions du groupe
|
||||
votées depuis un an. »
|
||||
- Affirme : une définition (et « un an »).
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (`participation::WINDOW_DAYS` = 365) ;
|
||||
`tests/inertia.rs` `the_usual_participation_is_the_median_of_five_voted_proposals`,
|
||||
`the_usual_participation_counts_the_statuses_it_names_and_only_those`,
|
||||
`a_withdrawn_proposal_leaves_the_usual_participation`.
|
||||
12. « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence du
|
||||
document : 100 votants dans Monnaie libre. »
|
||||
- Affirme : moins de 5 propositions votées dans l'année, la référence 2 × 50 = 100 votants, avant les
|
||||
bornes (phrase 14).
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (5 = `Participation::MIN_SAMPLE`,
|
||||
100 = 2 × `voteFloor`) ; `the_participation_habituelle_is_the_median_brought_back_within_its_bounds`
|
||||
(sur chaque W et chaque médiane de la grille, 4 propositions donnent la référence) ;
|
||||
`tests/inertia.rs` `the_usual_participation_is_the_median_of_five_voted_proposals` (cinq
|
||||
propositions votées, dont une il y a plus d'un an : la référence revient) ;
|
||||
`the_reference_turnout_is_a_parameter_the_bounds_bring_back` (100 votants de W 200 à 10 000, la
|
||||
borne ailleurs). Vus rouges sur le texte de `e7ab82f` (« Tant que le groupe n'a pas voté sur 5
|
||||
propositions ») ; le dernier sous la mutation 1.
|
||||
13. « Elle ne dépend pas du quorum d'un article. »
|
||||
- Affirme : fixer le quorum d'un article ne change ni la participation habituelle ni G.
|
||||
- Tests : `tests/quorum.rs` `in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pending`
|
||||
(ajouté par T3c : I1 au quorum 20, la participation servie et G de chaque cran restent, p̃ =
|
||||
100 / W) ; `g_gives_…` (G le même à chaque quorum de la grille). Vu rouge sous la mutation 4.
|
||||
14. « Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
|
||||
- Affirme : la valeur bornée est la participation habituelle ; 1, 50 ; une fois par jour.
|
||||
- Tests : `every_number_of_the_quorum_texts_is_the_engine_s` (`Participation::LOWEST`, `HIGHEST`,
|
||||
`participation::EVERY_HOURS` = 24) ;
|
||||
`the_participation_habituelle_is_the_median_brought_back_within_its_bounds` (sur chaque W et
|
||||
chaque médiane : la valeur est la médiane, ou la référence, ramenée ; le cas de la relecture,
|
||||
W 7 224, médiane 40 : 72,24 votants ; sur la grille, 1 175 cas où la médiane, sous 1 %, atteint le
|
||||
quorum et où la part à la médiane dépasse s, 10 270 au-dessus de 50 % où elle est sous s) ;
|
||||
`ld-server` `participation::a_measure_is_taken_again_after_a_day`. Vus rouges sur le texte de
|
||||
`e7ab82f` (« Elle reste entre ») et sous la mutation 1.
|
||||
15. « **G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du
|
||||
cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette part du
|
||||
cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
|
||||
- Affirme : la formule de G ; à la participation habituelle, la courbe donne s ; la part exigée y est
|
||||
s quand elle atteint le quorum de l'article ; s est la part de la liste ; p̃ est la valeur bornée
|
||||
sur W.
|
||||
- Tests : `g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum` (la
|
||||
grille T3c : 16 985 cas au-delà, s exactement ; 68 115 en dessous, plus bas, jugés sur le quorum) ;
|
||||
`the_formulas_of_the_texts_are_those_the_engine_computes` ; `every_number_of_the_quorum_texts_is_the_engine_s`
|
||||
(60, 67, 75, 83, 90). Vu rouge sur le texte de `e7ab82f` (« quand le groupe vote comme
|
||||
d'habitude ») et sous les mutations 1 et 2.
|
||||
|
||||
## Les mutations, défaites aussitôt
|
||||
|
||||
| | Mutation | Rouges |
|
||||
|---|---|---|
|
||||
| 1 | `Participation::of` ne ramène plus la médiane dans ses bornes (`ratio = raw`) | 6 : `g_gives_…`, `the_participation_habituelle_…`, `the_formulas_…`, `the_reference_turnout_…`, `the_share_of_a_level_…`, `under_the_quorum_…` |
|
||||
| 2 | `judged_voters` sans quorum (`cast`) | 7 : `b_to_the_power_w_…`, `the_formulas_…`, `the_share_asked_falls_…`, `the_share_of_a_level_…`, `the_three_phrases_of_the_review_of_m6b_…`, `under_the_quorum_…`, `g_gives_…` |
|
||||
| 3 | un nouvel article au cran 2 (`proposals.rs`) | `tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote` |
|
||||
| 4 | la participation calée sur le quorum d'un article (`docs.rs`) | `tests/quorum.rs` `in_monnaie_libre_a_quorum_holds_two_voices_…` |
|
||||
|
||||
Sur le texte de `e7ab82f`, avant le changement : 8 tests rouges, `every_number_…`, `g_gives_…`,
|
||||
`the_participation_habituelle_…`, `the_reference_turnout_…`, `the_share_asked_falls_…`,
|
||||
`the_share_of_a_level_…`, `the_texts_of_lot_t3_change_these_phrases_only`, `under_the_quorum_…`.
|
||||
|
||||
## Hors de la liste, pour information
|
||||
|
||||
- **F1.1**, non touché : « G : le gradient : plus il est grand, plus la part demandée monte quand peu de
|
||||
gens votent » n'a pas d'effet sur un article dont l'auteur a fixé le quorum à W (la part y est M à
|
||||
tout G). Un cas limite, laissé : F1.1 n'a pas d'amendement.
|
||||
- **F1.2, phrases 4 et 5** : la version retenue par une objection (ADR 0010) n'y est pas dite. Règles
|
||||
sans nombre, hors du champ de T3c ; à trancher si on veut les écrire.
|
||||
- **L'interface** (`settings.reading`, `settings.share.note`, `settings.required.usual`) dit encore
|
||||
« comme d'habitude » ; non touchée (ordre de T3c).
|
||||
@@ -126,14 +126,32 @@ Copies retirées (orch, puis l'intégrateur à 11 h 07).
|
||||
**M7b en ligne** depuis le 03/11 à 12 h 23 (`6f6197c`, pipeline 41) : lot U2, les mineurs du lecteur.
|
||||
Production `6f6197cc` ; `main` et le chantier poussés vers origin par orch. Copies de production retirées
|
||||
(orch ; l'intégrateur à 12 h 28).
|
||||
**Les lots H, S, V, T, U, T2 et U2 sont en ligne.** **Lot T3 en cours** depuis le 03/11 à 17 h 02
|
||||
**Les lots H, S, V, T, U, T2, U2, T3, T3b et T3c sont en ligne.** **Lot T3 en cours** depuis le 03/11 à 17 h 02
|
||||
(ordre T3 d'orch, sur la réponse d'Yvv avant 16 h 56 : « 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. ») : l'exemple chiffré
|
||||
de N1.1 sort des textes votés, la phrase « pas un nombre minimal de votants » réécrite vraie, « comme
|
||||
d'habitude » au-delà du quorum (N1.1, F1.2), F1.1 laissé ; amendements gardés qui suivent T2.
|
||||
**Fusionné** le 03/11 à 17 h 44 (`0b4923f`, puis `2ce2028`) ; boucle d'intégration en cours ; copie
|
||||
fraîche de la production demandée à orch à 17 h 45 (`/tmp/ld-m8-copie`) ; puis répétition, relecture,
|
||||
acte M8 « déploie ». Listes d'attente : ci-dessous (Actes). Bases de test restées sous `/tmp`, toutes synthétiques,
|
||||
**Fusionné** le 03/11 à 17 h 44 (`0b4923f`, `2ce2028`). Relecture de `2ce2028` : à reprendre (18 h 12, la
|
||||
phrase de G de N1.1) → **lot T3b**, fusionné à 18 h 47 (`e7ab82f`) ; boucle verte (18 h 47 - 18 h 54), répétition
|
||||
réseau coupé (18 h 54), image (18 h 56 - 19 h 01). Relecture de `e7ab82f` : **à reprendre** (19 h 16 : « comme
|
||||
d'habitude » se lit comme la médiane réelle, le moteur prend la participation bornée) → **lot T3c**, fusionné à 19 h 57
|
||||
(`de1b7eb`) : le terme défini « à la participation habituelle » partout, « sous le quorum de l'article », la
|
||||
grille des tests étendue, la liste fermée des phrases (`t3c-liste-fermee.md`, demandée par orch) ; boucle verte
|
||||
(19 h 57 - 20 h 03), répétition réseau coupé (20 h 03). Image (20 h 05 - 20 h 10). **Relecture de `de1b7eb` : ok** (inscrite à
|
||||
20 h 23). **M8 en ligne** depuis le 03/11 à 20 h 31 (`de1b7eb`, pipeline 42 `success` à 20 h 42 ; acte exécuté par
|
||||
orch de 20 h 26 à 20 h 44, `actes/2026-11-03-m8-chiffres-dates.md`) : F1.2 et N1.1 en révision 5 dans les deux
|
||||
groupes, le reste identique ; copies retirées (orch à 20 h 43, l'intégrateur à 20 h 45). **Demande d'Yvv du 03/11 vers 20 h 38** (dans la session de l'intégrateur, relayée à orch) : I1, E1, E2
|
||||
réécrits ; un article nouveau « Responsabilité civique » entre E1 et E2 ; les sections formule, inertie et
|
||||
ordonnancement sortent du vote (« infos de fonctionnement ») et vont dans l'interface ; un petit chapitre
|
||||
« Info ouverture doc de réf. » (réglages de l'auteur : quorum, inertie) ; « Propositions d'amorce » ; les
|
||||
titres « Introduction » et « Engagements fondamentaux » retirés ; une séparation avant le texte. **Lot T4**
|
||||
(textes et structure) **en cours** depuis 20 h 45 (sous-agent, branche `lot/t4-amorce`) ; puis **lot U3**
|
||||
(interface). Défauts appliqués, questions à Yvv : « il y a une et une seule clé » ; I1 en trois paragraphes ;
|
||||
« Responsabilité civique » Proposition d'amorce au cran 2 ; « starter proposal » / « propuesta de arranque » ;
|
||||
retrait sans rien effacer (« déploie ») ; le chapitre hors vote, titré comme Yvv l'écrit. Ajout d'Yvv avant
|
||||
20 h 44, pour U3 : un texte pour qui n'est pas encore invité (« Pour rentrer dans un groupe de décisions, il
|
||||
faut pour l'instant demander un lien d'invitation @ chiara ou Yvv. Ce prototype n'est pas encore câblé sur la
|
||||
chaîne. ») ; défaut « à Chiara ou à Yvv », sur l'accueil sans session et la page « Se connecter ». Listes d'attente : ci-dessous (Actes). Bases de test restées sous `/tmp`, toutes synthétiques,
|
||||
aucune de la production : **purgées** sur ordre d'orch (PURGE-LD, 03/11 à 12 h 31), le 03/11 à 12 h 30-12 h 31 :
|
||||
les neuf dossiers des sous-agents (`ld-relis-m6`, `-m7`, `-m6c`, `-m7b`, `ld-u2-data`, `ld-u-data`,
|
||||
`ld-h-data`, `ld-u-shots`, `ld-u2-shots`), 688 restes des tests cargo et scripts e2e des lots ; les sept
|
||||
@@ -241,6 +259,17 @@ Restes mineurs de `71819f9` et du lot B : faits dans le lot D.
|
||||
|
||||
- M7b (lot U2, les mineurs du lecteur) : **exécuté** le 03/11/2026 par orch sous mandat, 12 h 07 – 12 h 26 (pipeline 41 `success` à 12 h 23) ; santé `6f6197cc` ; redémarrage à froid propre ; comptes identiques ; dépôt des textes à `9e0f45a` ; image de retour `previous` = `84f015a`. Copies retirées : orch, puis l'intégrateur à 12 h 28. Figé le 03/11 à 12 h 07 sur `6f6197c` (`actes/2026-11-03-m7b-lecteur-mineurs.md`) ; interface seule, aucune écriture en base ; répétition et recette sur une copie de la production de 11 h 40 ; relecture « 6f6197c : ok » inscrite à 12 h 06 ; PRÊT M7b envoyé à orch à 12 h 07.
|
||||
|
||||
- M8 (lots T3, T3b, T3c : aucun chiffre daté dans les textes votés) : **exécuté** le 03/11/2026 par orch sous mandat, 20 h 26 – 20 h 44 (pipeline 42 `success` à 20 h 42) ; santé `de1b7eb5` ; quatre amendements appliqués, redémarrage à froid sans rejeu ; dépôt des textes à `9e0f45a` ; image de retour `previous` = `6f6197c`. Copies retirées : orch à 20 h 43, l'intégrateur à 20 h 45. Figé le 03/11 à 20 h 23 sur `de1b7eb` (`actes/2026-11-03-m8-chiffres-dates.md`) ; F1.2 et N1.1 réécrits par les amendements gardés `2026-11-03-f1-2-chiffres` et `-n1-1-chiffres` (révision 4 → 5, deux groupes), F1.1 inchangé ; répétition réseau coupé sur une copie de la production de 17 h 46 (20 h 03) ; boucle verte, image à 20 h 10 ; relectures « 2ce2028 : à reprendre » (18 h 12), « e7ab82f : à reprendre » (19 h 16), « de1b7eb : ok » (20 h 23) ; ACTE M8 envoyé à orch à 20 h 25.
|
||||
|
||||
Liste d'attente (relectures de M8 ; aucun ne rend une phrase fausse ; après la mise en ligne, un changement de texte demande un nouvel amendement gardé, possible tant qu'aucun vote n'existe sur l'article) :
|
||||
- F1.2, « au-delà du quorum » sans « de l'article » (vrai au défaut ; à aligner sur N1.1) ;
|
||||
- F1.1, « le nombre de voix pour qu'il faut » se lit d'abord « pour qu' » ; « quorum de référence » défini nulle part ;
|
||||
- un quorum fixé à W : deux phrases sans objet (F1.1, G ; N1.1, « dépend du nombre de votants ») ;
|
||||
- en, « It is kept between » : « is brought back within » serait plus fidèle ;
|
||||
- F1.2 ne dit pas la version retenue par une objection (ADR 0010) ; F1.1, B^W compte dans le groupe d'essai (points 4 et 10) ;
|
||||
- une proposition rivale d'un membre ne bloque pas la garde des amendements (conception depuis le lot T ; aucune en production) ;
|
||||
- l'interface (`settings.*`) dit encore « comme d'habitude ».
|
||||
|
||||
Liste d'attente (relecture de `6f6197c`, M7b ; pas de lot sans mot d'orch) :
|
||||
- **le vote d'un changement d'inertie de module ne dit pas le cran visé** (seulement le cran où il se
|
||||
vote ; « vers N / 5 » dans l'étiquette pour lecteur d'écran seulement : `VoteFold.svelte:167`, `:177`) ;
|
||||
|
||||
@@ -17,6 +17,19 @@
|
||||
> jour : N1.1 perd son exemple chiffré, et trois phrases, deux de N1.1 et une de F1.2, sont écrites
|
||||
> vraies pour tout W et tout quorum (« Lot T3 », ci-dessous). Les blocs de texte de ce fichier sont
|
||||
> ceux du seed d'aujourd'hui. Rien du lot T3 n'est en ligne.
|
||||
>
|
||||
> **Repris le 2026-11-03 par le lot T3b** (branche `lot/t3b-g`), après la relecture indépendante de
|
||||
> `2ce2028`, avant la mise en ligne : la phrase de G (N1.1) écrite vraie sous le quorum, « autant de
|
||||
> « pour » » en français, le test des nombres honnête sur « 100 votants » (« Après la relecture de
|
||||
> 2ce2028 », ci-dessous). Le même amendement, avec sa nouvelle empreinte ; rien n'est en ligne.
|
||||
>
|
||||
> **Repris le 2026-11-03 par le lot T3c** (branche `lot/t3c-habituelle`), après la relecture
|
||||
> indépendante de `e7ab82f`, avant la mise en ligne : le terme défini « à la participation
|
||||
> habituelle » à la place de « comme d'habitude », qui se lisait comme la médiane réelle et devenait
|
||||
> faux quand elle sort de ses bornes ; puis un passage complet sur F1.2 et N1.1, phrase par phrase
|
||||
> (« Après la relecture de e7ab82f », ci-dessous). La liste fermée de leurs phrases, chacune avec le
|
||||
> test qui la vérifie et sa grille, est dans `t3c-liste-fermee.md`. Les mêmes amendements, avec leurs
|
||||
> nouvelles empreintes ; rien n'est en ligne.
|
||||
|
||||
## Lot T3 : aucun chiffre daté, chaque phrase vraie pour tout W
|
||||
|
||||
@@ -38,15 +51,267 @@ Restent les paramètres et les règles : les quorums 12 · 12 · 50 · 50 · 50,
|
||||
B = 0,1, les bornes 1 % et 50 %, « jamais moins de 2 », 6 heures, un an, une fois par jour,
|
||||
5 propositions, la référence « deux fois le quorum de référence : 100 votants » (2 × 50). F1.1 et
|
||||
F1.2 n'avaient aucun chiffre daté. Le test des nombres (`every_number_of_the_quorum_texts_is_the_engine_s`)
|
||||
n'admet plus que des paramètres : chacun vient du seed ou d'une constante du moteur, et ils sont les
|
||||
mêmes sur toute toile de 100 à 10 000 000 membres (`wot::PLAUSIBLE`, les tailles que le serveur tient
|
||||
pour vraies) ; aucune participation n'y entre. Vu rouge sur le texte de T2 : N1.1 portait
|
||||
n'admet plus que des paramètres : chacun vient du seed ou d'une constante du moteur ; aucune toile ni
|
||||
participation n'y entre (« 100 votants » est un paramètre, 2 × 50, pas une participation vraie sur
|
||||
toute toile : voir « Après la relecture de 2ce2028 »). Vu rouge sur le texte de T2 : N1.1 portait
|
||||
7 224 · 120 · 72 · 81 · 90 · 100 · 108 · 75 % · 90 · 9 · 3 · 39 · 11, que rien ne justifie.
|
||||
|
||||
Ensuite, **chaque phrase des trois textes relue** pour tout W et tout quorum dans les bornes
|
||||
(2 à W dans Monnaie libre, 1 à W dans le groupe d'essai), tout cran, toute participation entre 1 %
|
||||
et 50 %. Trois phrases étaient fausses quelque part, chacune prouvée par un test ; elles sont
|
||||
corrigées au plus court. Rien d'autre ne change ; les titres restent.
|
||||
corrigées au plus court. Rien d'autre ne change ; les titres restent. *(La relecture de `2ce2028`
|
||||
en a trouvé une quatrième, la phrase de G : reprise ci-dessous.)*
|
||||
|
||||
### Après la relecture de e7ab82f
|
||||
|
||||
La relecture indépendante de `e7ab82f` rend « à reprendre » pour un point, « comme d'habitude » ; orch
|
||||
demande ensuite un passage complet sur F1.2 et N1.1, phrase par phrase (« que T3c soit le dernier
|
||||
tour »). T3 n'étant pas en ligne, les amendements `2026-11-03-f1-2-chiffres` et
|
||||
`2026-11-03-n1-1-chiffres` sont repris eux-mêmes (leurs nouvelles empreintes : « La garde, en
|
||||
production »), sans en ajouter. F1.1 ne change pas. **La liste fermée** des phrases de F1.2 et N1.1,
|
||||
chacune avec ce qu'elle affirme et le test qui la vérifie sur sa grille, est dans
|
||||
`t3c-liste-fermee.md`, remise telle quelle au relecteur.
|
||||
|
||||
**Le terme défini.** N1.1 définit la participation habituelle : la médiane du nombre de votants des
|
||||
propositions votées depuis un an, ou deux fois le quorum de référence quand elle repose sur moins de
|
||||
5 propositions, **ramenée entre 1 % et 50 % de l'électorat** ; le moteur calcule G sur cette valeur
|
||||
bornée (`Participation::of`). « Quand le groupe vote comme d'habitude » se lit d'abord comme la médiane
|
||||
réelle, et sous cette lecture, trois phrases et les cinq lignes des crans deviennent fausses dès que la
|
||||
médiane sort de ses bornes. **L'exemple de la relecture** : une toile de 7 224 membres (celle de 2024),
|
||||
une médiane de 40 votants (0,55 % de W, ramenée à 1 % : 72,24 votants), cran 2, quorum 12. À 40
|
||||
votants, au-delà du quorum, la part exigée est de 68,7 % : il faut 28 « pour » sur 40, pas 27 (67 % de
|
||||
40, arrondi au-dessus) ; 27 « pour » et 13 « contre » ne passent pas. À la participation habituelle,
|
||||
72,24 votants, la part est de 67 % exactement. Le cas est réaliste dans Monnaie libre aujourd'hui. Le
|
||||
test de T3 sautait ces cas (`if part.bounded { continue; }`) : la grille de T3c les prend tous, la
|
||||
participation habituelle étant la valeur bornée (prouvé par
|
||||
`the_participation_habituelle_is_the_median_brought_back_within_its_bounds`, qui calcule aussi
|
||||
l'exemple).
|
||||
|
||||
Chaque phrase changée, avant (le texte de `e7ab82f`) et après :
|
||||
|
||||
- **F1.2, « Par défaut »**.
|
||||
- **Avant** : « …un quorum de 50 dans Monnaie libre, et, au-delà du quorum, le groupe demande 75 % de
|
||||
« pour » quand il vote comme d'habitude. »
|
||||
- **Après** : « …un quorum de 50 dans Monnaie libre, et, au-delà du quorum, le groupe demande 75 % de
|
||||
« pour » à sa participation habituelle. »
|
||||
- en : « …asks for 75% of votes in favour when it votes as usual. » → « …at its usual turnout. » ;
|
||||
es : « …un 75 % de votos a favor cuando vota como de costumbre. » → « …con su participación
|
||||
habitual. »
|
||||
- **Pourquoi** : le terme défini (l'exemple ci-dessus). « Au-delà du quorum » reste : sous « Par
|
||||
défaut », juste après « un quorum de 50 », il se lit comme ce quorum-là, celui d'un article au cran
|
||||
par défaut ; lu comme le quorum de l'article, il est vrai aussi.
|
||||
- **N1.1, la phrase du quorum** (point 3 de l'ordre, défaut appliqué mot pour mot).
|
||||
- **Avant** : « Chaque cran a aussi son quorum : sous le quorum, les votants qui manquent comptent
|
||||
comme « non », et il faut autant de « pour » que si le quorum avait voté. »
|
||||
- **Après** : « Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent
|
||||
comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. »
|
||||
- en : « below the quorum, […] as if the quorum had voted » → « below the article's quorum, […] as if
|
||||
that quorum had voted » ; es : « por debajo del quórum, […] como si hubiera votado el quórum » →
|
||||
« por debajo del quórum del artículo, […] como si hubiera votado ese quórum ».
|
||||
- **Pourquoi** : juste après « son quorum » (celui du cran), « sous le quorum » se lisait d'abord comme
|
||||
le quorum du cran, alors qu'un article peut avoir celui que son auteur a fixé. Le test de la phrase
|
||||
reste vrai pour tout quorum dans les bornes (`under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted`).
|
||||
- **N1.1, la phrase de la part** (premier paragraphe, la dernière).
|
||||
- **Avant** : « La part dépend du cran et du nombre de votants, comparé à la participation habituelle
|
||||
du groupe : au-delà du quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand
|
||||
tout le monde vote. »
|
||||
- **Après** : « La part exigée dépend du cran et du nombre de votants, comparé à la participation
|
||||
habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la
|
||||
majorité M quand tout le monde vote. »
|
||||
- en : « The share depends […] beyond the quorum » → « The share asked depends […] beyond that
|
||||
quorum » ; es : « La proporción depende […] más allá del quórum » → « La proporción exigida depende
|
||||
[…] más allá de ese quórum ».
|
||||
- **Pourquoi** : « la part » seule, après « une part de « pour » parmi les votants », peut se lire
|
||||
comme la part de « pour » à apporter en voix entières, qui remonte parfois au-delà du quorum (toile
|
||||
de 5 707 membres, participation de référence, cran 2, quorum 12 : 9 « pour » sur 12, 75 %, puis 10
|
||||
sur 13, 76,9 %), alors que la part exigée, celle de la formule qui suit, baisse (73,5 %, puis
|
||||
73,2 %). « Ce quorum » : la phrase d'avant en nomme deux, celui du cran et celui de l'article ; entre
|
||||
celui du cran et un quorum d'auteur plus haut, la part ne baisse pas. Prouvé par
|
||||
`the_share_asked_falls_beyond_the_article_s_quorum_down_to_m`.
|
||||
- **N1.1, la formule de la part** (T').
|
||||
- **Avant** : « …, où T' est le nombre de votants, ou le quorum s'il en manque. »
|
||||
- **Après** : « …, où T' est le nombre de votants, ou le quorum de l'article s'il en manque. »
|
||||
- en : « or the quorum if some are missing » → « or the article's quorum if some are missing » ; es :
|
||||
« o el quórum si faltan » → « o el quórum del artículo si faltan ».
|
||||
- **Pourquoi** : T' se calcule sur le quorum de l'article (F1.1 : « Q : le quorum de l'article ») ; la
|
||||
raison de la phrase du quorum.
|
||||
- **N1.1, l'introduction des crans**.
|
||||
- **Avant** : « **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. »
|
||||
- **Après** : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de
|
||||
l'article, à la participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au
|
||||
départ. »
|
||||
- en : « the share asked beyond the quorum, when the group votes as usual, » → « the share asked
|
||||
beyond the article's quorum, at the usual turnout, » ; es : « la proporción exigida más allá del
|
||||
quórum, cuando el grupo vota como de costumbre, » → « la proporción exigida más allá del quórum del
|
||||
artículo, con la participación habitual, ».
|
||||
- **Pourquoi** : le terme défini ; et « de l'article » : juste après « le quorum dans Monnaie libre »
|
||||
(celui du cran), « au-delà du quorum » se lisait comme ce quorum-là. Pour un article dont l'auteur a
|
||||
fixé un quorum au-dessus de la participation habituelle, elle-même au-dessus du quorum du cran, la
|
||||
part du cran n'est pas demandée à la participation habituelle : les votants y sont jugés comme le
|
||||
quorum de l'article, à une part plus basse que celle du cran, demandée à plus de votants qu'il n'en
|
||||
vient (sur la grille, 68 115 cas où la participation habituelle n'atteint pas le quorum de
|
||||
l'article).
|
||||
- **N1.1, les cinq lignes des crans**.
|
||||
- **Avant** : « 60 % comme d'habitude, 50 % quand tout le monde vote » (de même 67, 75, 83, 90 %).
|
||||
- **Après** : « 60 % à la participation habituelle, 50 % quand tout le monde vote ».
|
||||
- en : « 60% as usual » → « 60% at the usual turnout » ; es : « 60 % como de costumbre » → « 60 % con
|
||||
la participación habitual ».
|
||||
- **Pourquoi** : le terme défini.
|
||||
- **N1.1, la participation habituelle de référence**.
|
||||
- **Avant** : « Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de
|
||||
référence du document : 100 votants dans Monnaie libre. »
|
||||
- **Après** : « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de
|
||||
référence du document : 100 votants dans Monnaie libre. »
|
||||
- en : « Until the group has voted on 5 proposals, it is » → « While it rests on fewer than 5
|
||||
proposals, it is » ; es : « Hasta que el grupo haya votado 5 propuestas, vale » → « Mientras se
|
||||
base en menos de 5 propuestas, vale ».
|
||||
- **Pourquoi** : fausse une fois que le groupe a voté sur 5 propositions. La médiane ne compte que les
|
||||
propositions votées depuis un an (la phrase d'avant) ; avec moins de 5 dans l'année, la référence
|
||||
revient (`tests/inertia.rs`, `the_usual_participation_is_the_median_of_five_voted_proposals` : une
|
||||
des cinq votée il y a plus d'un an, la référence revient). « Elle repose sur » renvoie aux
|
||||
propositions de la phrase d'avant.
|
||||
- **N1.1, les bornes**.
|
||||
- **Avant** : « Elle reste entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
|
||||
- **Après** : « Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
|
||||
- en : « It stays between » → « It is kept between » ; es : « Se mantiene entre » → « Se acota
|
||||
entre ».
|
||||
- **Pourquoi** : c'est la définition sur laquelle tout le lot s'appuie : la participation habituelle
|
||||
est la valeur ramenée. « Reste » se lit comme un constat (la médiane resterait d'elle-même entre les
|
||||
bornes), et la première phrase, « est la médiane », serait fausse pour une médiane de 40 sur 7 224 ;
|
||||
« est ramenée » dit la règle. En espagnol, « se mantiene » a les deux lectures ; « se acota » (« est
|
||||
bornée ») n'en a qu'une.
|
||||
- **N1.1, la phrase de G**.
|
||||
- **Avant** : « **G** se calcule pour que la part exigée, au-delà du quorum, soit exactement celle du
|
||||
cran quand le groupe vote comme d'habitude : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette
|
||||
part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
|
||||
- **Après** : « **G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit
|
||||
exactement celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où
|
||||
s est cette part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
|
||||
- en : « beyond the quorum, is exactly that of the level when the group votes as usual: » → « beyond
|
||||
the article's quorum, is exactly that of the level at the usual turnout: » ; es : « más allá del
|
||||
quórum, sea exactamente la del nivel cuando el grupo vota como de costumbre: » → « más allá del quórum
|
||||
del artículo, sea exactamente la del nivel con la participación habitual: ».
|
||||
- **Pourquoi** : G se calcule sur la valeur bornée ; à la médiane réelle hors des bornes, la part n'est
|
||||
pas s (l'exemple) ; « de l'article », comme l'introduction des crans.
|
||||
|
||||
**Ce qui est relu et laissé**, phrase par phrase, avec son test : `t3c-liste-fermee.md` (24 entrées pour
|
||||
F1.2, intertitres compris, 15 pour N1.1). Trois points, hors du champ de T3c, sont dans « Points à trancher » (11, 12, 13) :
|
||||
l'interface dit encore « comme d'habitude » ; F1.2 ne dit pas la version retenue par une objection ;
|
||||
F1.1, G sans effet au quorum W.
|
||||
|
||||
**Les tests** (`crates/ld-server/tests/seed_quorum_texts.rs`, sauf mention), vus rouges sur le texte
|
||||
de `e7ab82f` (8 tests), puis verts :
|
||||
|
||||
- une grille commune, `grid()` (85 100 cas) : W de 100 (la borne basse de `wot::PLAUSIBLE`) à
|
||||
10 000 000 ; la référence et des médianes sous 1 % de W, dans les bornes et au-dessus de 50 %, chacune
|
||||
ramenée par `Participation::of`, la participation habituelle étant la valeur bornée ; chaque quorum
|
||||
d'auteur de 2 à W jusqu'à W = 1 000, un échantillon au-delà ; les cinq crans. Elle remplace
|
||||
`as_usual_grid`, qui sautait les médianes hors des bornes ;
|
||||
- renommés : `the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` →
|
||||
`the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` ;
|
||||
`g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usual` →
|
||||
`g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum` ;
|
||||
- nouveaux : `the_participation_habituelle_is_the_median_brought_back_within_its_bounds` (l'écart entre
|
||||
la valeur bornée et la médiane, l'exemple de la relecture, et pourquoi le terme défini) ;
|
||||
`the_share_asked_falls_beyond_the_article_s_quorum_down_to_m` ; dans `tests/quorum.rs`, la
|
||||
participation et G inchangés quand un administrateur fixe le quorum d'un article de Monnaie libre, et
|
||||
le cran 3 d'un nouvel article ;
|
||||
- étendus à la grille : `under_the_quorum_…` (plus « une seule voix ne fait jamais passer un texte »),
|
||||
`b_to_the_power_w_…`, `the_formulas_…` ; le test des nombres vérifie toujours tout ;
|
||||
- quatre mutations du code, défaites aussitôt, chacune vue rouge (`t3c-liste-fermee.md`).
|
||||
|
||||
### Après la relecture de 2ce2028
|
||||
|
||||
La relecture indépendante de `2ce2028` rend « à reprendre » pour une phrase, et relève deux mineurs.
|
||||
T3 n'étant pas en ligne, l'amendement `2026-11-03-n1-1-chiffres` est repris lui-même (sa nouvelle
|
||||
empreinte, dans « La garde, en production »), sans en ajouter un. F1.2 et F1.1 ne changent pas.
|
||||
|
||||
- **La phrase de G** (N1.1, dernier paragraphe, que T3 avait laissée).
|
||||
- **Avant** : « **G** se calcule pour que la part exigée, à la participation habituelle, soit
|
||||
exactement celle du cran : `G = …`, où s est la part exigée comme d'habitude et p̃ la
|
||||
participation habituelle divisée par W. »
|
||||
- **Après** : « **G** se calcule pour que la part exigée, au-delà du quorum, soit exactement celle
|
||||
du cran quand le groupe vote comme d'habitude : `G = …`, où s est cette part du cran (60, 67, 75,
|
||||
83 ou 90 %) et p̃ la participation habituelle divisée par W. » *(Repris après la relecture de
|
||||
e7ab82f, ci-dessus : « au-delà du quorum de l'article », « à la participation habituelle ».)*
|
||||
- **Pourquoi** : fausse quand la participation habituelle est sous le quorum, où la part exigée
|
||||
se calcule sur T' = Q. Sur une toile de 3 000 membres dont la médiane est de 40 votants (dans les
|
||||
bornes), au cran 3, quorum 50 : la courbe donne 75 % à 40 votants, mais la part exigée est
|
||||
74,23 % de 50, soit 38 « pour » des 40 votants, 95 %. G ne dépend pas du quorum : la courbe passe
|
||||
toujours par s à la participation habituelle, c'est le quorum qui la coupe en dessous. La phrase
|
||||
nouvelle ne dit s qu'au-delà du quorum, comme l'introduction de la liste des crans, et s y est la
|
||||
part du cran, celle de la liste, plus « la part exigée comme d'habitude » (qui, sous le quorum,
|
||||
n'est pas s). C'est le défaut proposé par l'intégrateur, mot pour mot. Les cinq nombres entre
|
||||
parenthèses sont gardés : sans eux, « cette part » se lirait aussi comme la « Part exigée » de la
|
||||
formule au-dessus, qui change avec T' ; ce sont des paramètres (s de chaque cran), que le test des
|
||||
nombres vérifie. Prouvé par
|
||||
`g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usual`, sur la grille de
|
||||
`the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` (la même fonction, `as_usual_grid` ;
|
||||
renommés par T3c : `g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum`,
|
||||
`the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum`, `grid`) :
|
||||
G tel que le texte l'écrit est celui du moteur ; la courbe passe par s à la participation
|
||||
habituelle, à tout quorum ; la part exigée du groupe qui vote comme d'habitude est s au-delà du
|
||||
quorum (970 cas), et plus basse que s, jugée sur le quorum, en dessous (700 cas), là où la phrase
|
||||
de T3 disait s. Vu rouge sur le texte de T3.
|
||||
- en, avant : « **G** is computed so that the share asked, at the usual turnout, is exactly that of
|
||||
the level: `G = …`, where s is the share asked as usual and p̃ the usual turnout divided by W. » ;
|
||||
après : « **G** is computed so that the share asked, beyond the quorum, is exactly that of the
|
||||
level when the group votes as usual: `G = …`, where s is that share of the level (60, 67, 75, 83 or
|
||||
90%) and p̃ the usual turnout divided by W. »
|
||||
- es, avant : « **G** se calcula para que la proporción exigida, con la participación habitual, sea
|
||||
exactamente la del nivel: `G = …`, donde s es la proporción exigida como de costumbre y p̃ la
|
||||
participación habitual dividida por W. » ; après : « **G** se calcula para que la proporción
|
||||
exigida, más allá del quórum, sea exactamente la del nivel cuando el grupo vota como de costumbre:
|
||||
`G = …`, donde s es esa proporción del nivel (60, 67, 75, 83 o 90 %) y p̃ la participación
|
||||
habitual dividida por W. »
|
||||
- **La phrase du quorum, en français** (N1.1, premier paragraphe).
|
||||
- **Avant** : « …, et il faut autant de voix pour que si le quorum avait voté. »
|
||||
- **Après** : « …, et il faut autant de « pour » que si le quorum avait voté. »
|
||||
- **Pourquoi** : « de voix pour que » se lit d'abord « pour que », la conjonction. Le sens ne change
|
||||
pas, et le même test le tient (`under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted`).
|
||||
en et es restent : « as many votes in favour as », « tantos votos a favor como » sont sans
|
||||
ambiguïté. La raison de l'amendement, qui part dans le commit du dépôt des textes, dit de même
|
||||
« autant de « pour » », et nomme G.
|
||||
- **Le test des nombres et « 100 votants »** : le texte voté ne change pas. Le test calculait la
|
||||
référence comme p0 × W avant les bornes, c'est-à-dire 2 × 50 quel que soit W : sa vérification
|
||||
« les mêmes chiffres sur toute toile » ne pouvait pas échouer pour 100. 100 y est maintenant ce
|
||||
qu'il est, un paramètre (deux fois le quorum de référence), sans prétendre qu'il vaut sur toute
|
||||
toile ; un test à part dit où il vaut (`the_reference_turnout_is_a_parameter_the_bounds_bring_back`) :
|
||||
la participation de référence est de 100 votants sur une toile de 200 à 10 000 membres, et là
|
||||
seulement ; en deçà, les bornes la ramènent à 50 % de W, au-delà à 1 %, comme N1.1 le dit dans le
|
||||
même paragraphe, après. Ce test tombe quand on lui fait dire « de 100 à 10 000 » (W 100).
|
||||
|
||||
**Chaque phrase relue, encore**, en fr, en et es, en cherchant « comme d'habitude », « à la
|
||||
participation habituelle » et « la part du cran » sans « au-delà du quorum » :
|
||||
|
||||
- **F1.1** : « Le seuil est le nombre de voix pour […] » (une définition) ; « Sous le quorum Q […]
|
||||
comme si Q personnes avaient voté » ; « Au-delà, il faut la part de « pour » que demande le cran
|
||||
[…] la plus haute au quorum […] jusqu'à la majorité M quand tout le monde vote » (la part du cran,
|
||||
sous « Au-delà ») ; les deux formules ; « Une version passe […] arrondi à l'entier au-dessus » ; T,
|
||||
Q et T', W, B, M ; G, « plus la part demandée monte quand peu de gens votent » (vrai à tout T' sous
|
||||
W, donc au quorum aussi) ; « Leurs valeurs sont dans […] ». Aucune n'est de la famille cherchée.
|
||||
- **F1.2** : l'introduction ; les trois points du vote permanent ; W, T, Q, B ; « G n'est pas fixé à
|
||||
la main : il se déduit de la participation habituelle du groupe » (dit d'où vient G, rien de la
|
||||
part) ; « au-delà du quorum, le groupe demande 75 % de « pour » quand il vote comme d'habitude »
|
||||
(« au-delà du quorum », T3) ; « Tout nouvel article commence à ce cran » ; « Au départ […] ». Juste.
|
||||
- **N1.1** : « le groupe demande une part de « pour » parmi les votants » (une part, pas celle du
|
||||
cran ; les votants qui manquent y comptent, comme la phrase suivante le dit) ; la phrase du quorum
|
||||
(ci-dessus) ; « La part dépend du cran et du nombre de votants, comparé à la participation
|
||||
habituelle […] : au-delà du quorum, plus il y a de votants, plus elle baisse » (la courbe dépend de
|
||||
p̃ à tout quorum ; le nombre de votants est T', que la formule définit juste après) ; la formule et
|
||||
T' ; l'introduction de la liste, « la part exigée au-delà du quorum, quand le groupe vote comme
|
||||
d'habitude, puis quand tout le monde vote » (T3) ; les cinq crans, « 60 % comme d'habitude » […]
|
||||
(les colonnes que l'introduction définit, au-delà du quorum ; non répété à chaque ligne) ; la
|
||||
participation habituelle, ses 5 propositions et ses 100 votants (un paramètre, ramené par les
|
||||
bornes que la phrase d'après donne) ; « Elle ne dépend pas du quorum d'un article » ; les bornes et
|
||||
la mesure ; **la phrase de G : la seule de la famille qui restait fausse**, reprise.
|
||||
- Hors des trois textes, vu en cherchant et laissé (hors de ce lot) : la phrase de F1.1 « le nombre
|
||||
de voix pour qu'il faut » a la même lecture « pour qu' » que celle du point 3, mais F1.1 n'a pas
|
||||
d'amendement de T3 et ce lot n'en ajoute pas ; dans l'interface, `settings.reading` dit encore « À
|
||||
chaque cran, le groupe demande sa part de « pour » quand il vote comme d'habitude ; au-delà du
|
||||
quorum, […] » (fr, en, es), la même imprécision que la phrase de G, pour sa première moitié.
|
||||
|
||||
### N1.1 — Niveaux d'inertie
|
||||
|
||||
@@ -54,7 +319,9 @@ corrigées au plus court. Rien d'autre ne change ; les titres restent.
|
||||
- **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é. »
|
||||
comme « non », et il faut autant de « pour » que si le quorum avait voté. » *(T3 écrivait
|
||||
« autant de voix pour que » ; repris après la relecture de 2ce2028, ci-dessus. Puis, après celle de
|
||||
e7ab82f : « sous le quorum de l'article », « que si ce quorum avait voté ».)*
|
||||
- **Pourquoi** : « pas un nombre minimal de votants » est faux pour un quorum d'auteur bas. Au
|
||||
quorum 2, la part du quorum dépasse 50 % : il faut 2 « pour », une seule voix ne passe jamais, et
|
||||
le quorum est alors un minimum de votants, à tout cran et sur toute toile (de même au quorum 1 du
|
||||
@@ -74,14 +341,15 @@ corrigées au plus court. Rien d'autre ne change ; les titres restent.
|
||||
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. »
|
||||
cran au départ. » *(Repris après la relecture de e7ab82f, ci-dessus : « au-delà du quorum de
|
||||
l'article, à la participation habituelle ».)*
|
||||
- **Pourquoi** : « 75 % comme d'habitude » n'est vrai que si la participation habituelle atteint
|
||||
le quorum. En dessous, le groupe qui vote comme d'habitude est jugé sur le quorum : sur une toile
|
||||
de 3 000 membres dont la médiane est de 40 votants (dans les bornes : 1 %, c'est 30), au cran 3,
|
||||
quorum 50, il faut 38 « pour » de ces 40 votants, 95 %, pas 75 %. Cela arrive dès que la toile
|
||||
passe sous 5 000 membres (1 % sous 50) avec une médiane sous 50, ou quand l'auteur d'un article
|
||||
fixe un quorum au-dessus de la participation habituelle. Prouvé par
|
||||
`the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` : la part du cran exactement quand la
|
||||
`the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` (renommé par T3c) : la part du cran exactement quand la
|
||||
participation habituelle atteint le quorum, une part plus basse, sur plus de votants, sinon ; M
|
||||
quand tout le monde vote, à tout quorum.
|
||||
- en : « the share asked beyond the quorum, when the group votes as usual, then when everyone
|
||||
@@ -95,6 +363,7 @@ corrigées au plus court. Rien d'autre ne change ; les titres restent.
|
||||
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. »
|
||||
*(Repris après la relecture de e7ab82f, ci-dessus : « à sa participation habituelle ».)*
|
||||
- **Pourquoi** : la raison de la liste des crans de N1.1 ; le cas de 3 000 membres est celui-ci
|
||||
(cran 3, quorum 50). en : « and, beyond the quorum, the group asks for 75% of votes in favour
|
||||
when it votes as usual » ; es : « y, más allá del quórum, el grupo pide un 75 % de votos a favor
|
||||
@@ -126,15 +395,22 @@ attente ou prouvée, quel qu'en soit le sort) ; aucune coquille, traduction de m
|
||||
|
||||
| Article | Empreinte d'avant : le texte de T2, en ligne | Empreinte d'après : le texte de T3 |
|
||||
|---|---|---|
|
||||
| F1.2 | `96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14` | `ddce5aa5fcd13dfc3e374c37509a1bb8cfafddefb6e6add5a06b130b43216d62` |
|
||||
| N1.1 | `7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8` | `4289e3579ee747f6023162339ed60601b810d33462617b42a9f8b5b3735c3238` |
|
||||
| F1.2 | `96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14` | `0c3b800b0c72b1edd4b884c03c6c5479c17609dcf82a95b593d408821e28bb4e` |
|
||||
| N1.1 | `7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8` | `8107c5fc746121f18c8a440e86e23310c5a59ae8e92f5a07f6b098419980263c` |
|
||||
|
||||
Les empreintes d'après sont celles des textes repris après la relecture de `e7ab82f` (lot T3c). Les
|
||||
précédentes n'ont jamais été en ligne et ne servent plus : F1.2,
|
||||
`ddce5aa5fcd13dfc3e374c37509a1bb8cfafddefb6e6add5a06b130b43216d62` (T3 et T3b) ; N1.1,
|
||||
`7f62fd42617c6e63b1783d5a4d472ed733aa074222240faf834e6b31f1c9c166` (T3b) et
|
||||
`4289e3579ee747f6023162339ed60601b810d33462617b42a9f8b5b3735c3238` (`2ce2028`).
|
||||
|
||||
Appliqué, dans une transaction, par document : le texte (fr) remplacé, **révision 4 → 5** pour F1.2
|
||||
et N1.1 ; une ligne « texte de départ remplacé » dans l'historique, sans auteur (la révision 4, le
|
||||
texte de T2, reste lisible, avec son diff) ; en et es remplacés ; la décision dans
|
||||
`seed_amendments`. **La file de publication de Monnaie libre** reçoit deux lignes de plus
|
||||
(« proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum » et « … :
|
||||
N1.1, sans chiffre daté ; sous le quorum, autant de voix pour que si le quorum avait voté ») ; elles
|
||||
(« proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum, à la
|
||||
participation habituelle » et « … : N1.1, sans chiffre daté ; sous le quorum de l'article, autant de
|
||||
« pour » que si ce quorum avait voté ; au-delà, la part du cran à la participation habituelle ») ; elles
|
||||
attendent, comme les autres, le premier texte en vigueur (ADR 0011) puis des votes prouvés (ADR
|
||||
0012) : rien n'est publié tant qu'aucun article n'est en vigueur. Le groupe d'essai ne publie
|
||||
jamais. Refusé, le texte de T2 reste, avec sa raison (`votes`, `ballots`, `corrected`,
|
||||
@@ -299,7 +575,7 @@ En production aujourd'hui : 0 vote, 0 bulletin, une seule identité (dit par orc
|
||||
WoT », « Paramètres par défaut », « Niveaux d'inertie »), jamais par le code ; apostrophes droites ;
|
||||
« » espacés en français, “ ” en anglais britannique (*favour*), «» serrés en espagnol ; formules en
|
||||
code, avec × et −, jamais d'astérisque.
|
||||
- **Longueur** (signes, après le lot T3 ; après le lot T2 : fr 1122 · 2035 · 2449, en 1093 · 1950 · 2315, es 1126 · 2020 · 2526 ; avant : fr 1081 · 2055 · 2372, en 1058 · 1977 · 2246, es 1083 · 2035 · 2454) : fr : F1.1 1122 · F1.2 2055 · N1.1 2075 ; en : F1.1 1093 · F1.2 1970 · N1.1 1937 ; es : F1.1 1126 · F1.2 2042 · N1.1 2125. Limite d'une proposition : 4 000 (`crates/ld-server/src/proposals.rs:32`) ;
|
||||
- **Longueur** (signes, après la relecture de `e7ab82f` ; après celle de `2ce2028` : fr F1.2 2055 · N1.1 2112, en 1970 · 1987, es 2042 · 2163 ; après le lot T3 : N1.1 fr 2075, en 1937, es 2125 ; après le lot T2 : fr 1122 · 2035 · 2449, en 1093 · 1950 · 2315, es 1126 · 2020 · 2526 ; avant : fr 1081 · 2055 · 2372, en 1058 · 1977 · 2246, es 1083 · 2035 · 2454) : fr : F1.1 1122 · F1.2 2054 · N1.1 2226 ; en : F1.1 1093 · F1.2 1968 · N1.1 2079 ; es : F1.1 1126 · F1.2 2042 · N1.1 2264. Limite d'une proposition : 4 000 (`crates/ld-server/src/proposals.rs:32`) ;
|
||||
au-delà de 700, l'assistant dit « texte long » (`crates/ld-engine/src/assist.rs:25`), comme pour les
|
||||
textes actuels de F1.2 et N1.1.
|
||||
- **Le ton** est celui de F1.2, N1 et O1 tels que M5 les a posés : le groupe, la personne, jamais le
|
||||
@@ -449,7 +725,7 @@ Les valeurs des lettres de la formule (voir « Formule du seuil WoT ») et la fa
|
||||
|
||||
**Par défaut**
|
||||
|
||||
- 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. Tout nouvel article commence à ce cran.
|
||||
- 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 » à sa participation habituelle. Tout nouvel article commence à ce cran.
|
||||
- Au départ, aucun article n'est en vigueur. Raison d'être, Unicité du compte et Réciprocité sont des Propositions seed, mises en avant pour lancer le vote, au cran 2 (basse). Le titre du document est au cran 4 (haute), l'ordre des articles de chaque section au cran 2, tous les autres articles au cran 3.
|
||||
```
|
||||
|
||||
@@ -476,7 +752,7 @@ The values of the letters of the formula (see “WoT threshold formula”) and h
|
||||
|
||||
**By default**
|
||||
|
||||
- The default level is 3 (medium): M = 55%, a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour when it votes as usual. Every new article starts at this level.
|
||||
- The default level is 3 (medium): M = 55%, a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour at its usual turnout. Every new article starts at this level.
|
||||
- At the start, no article is in force. Purpose, Uniqueness of the account and Reciprocity are seed proposals, put forward to start the vote, at level 2 (low). The title of the document is at level 4 (high), the order of the articles of each section at level 2, all other articles at level 3.
|
||||
```
|
||||
|
||||
@@ -503,7 +779,7 @@ Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y có
|
||||
|
||||
**Por defecto**
|
||||
|
||||
- El nivel por defecto es el 3 (media): M = 55 %, un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor cuando vota como de costumbre. Todo artículo nuevo empieza en este nivel.
|
||||
- El nivel por defecto es el 3 (media): M = 55 %, un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor con su participación habitual. Todo artículo nuevo empieza en este nivel.
|
||||
- Al inicio, ningún artículo está en vigor. Razón de ser, Unicidad de la cuenta y Reciprocidad son Propuestas seed, puestas en primer plano para lanzar la votación, en el nivel 2 (baja). El título del documento está en el nivel 4 (alta), el orden de los artículos de cada sección en el nivel 2, todos los demás artículos en el nivel 3.
|
||||
```
|
||||
|
||||
@@ -520,21 +796,21 @@ Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y có
|
||||
Titre : **Niveaux d'inertie**
|
||||
|
||||
```markdown
|
||||
À chaque cran, le groupe demande une part de « pour » parmi les votants (voir « Formule du seuil WoT »). 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é. La part dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà du quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote.
|
||||
À chaque cran, le groupe demande une part de « pour » parmi les votants (voir « Formule du seuil WoT »). Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote.
|
||||
|
||||
`Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum s'il en manque.
|
||||
`Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum de l'article s'il en manque.
|
||||
|
||||
**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.
|
||||
**Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de l'article, à la participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au départ.
|
||||
|
||||
- **Cran 1 · très basse** : quorum 12 ; 60 % comme d'habitude, 50 % quand tout le monde vote. Aucun article au départ.
|
||||
- **Cran 2 · basse** : quorum 12 ; 67 % comme d'habitude, 50 % quand tout le monde vote. Raison d'être, Unicité du compte, Réciprocité, et l'ordre des articles de chaque section.
|
||||
- **Cran 3 · moyenne** : quorum 50 ; 75 % comme d'habitude, 55 % quand tout le monde vote. Le cran par défaut : tous les autres articles, et chaque nouvel article.
|
||||
- **Cran 4 · haute** : quorum 50 ; 83 % comme d'habitude, 60 % quand tout le monde vote. Le titre du document.
|
||||
- **Cran 5 · très haute** : quorum 50 ; 90 % comme d'habitude, 66 % quand tout le monde vote. Aucun article au départ.
|
||||
- **Cran 1 · très basse** : quorum 12 ; 60 % à la participation habituelle, 50 % quand tout le monde vote. Aucun article au départ.
|
||||
- **Cran 2 · basse** : quorum 12 ; 67 % à la participation habituelle, 50 % quand tout le monde vote. Raison d'être, Unicité du compte, Réciprocité, et l'ordre des articles de chaque section.
|
||||
- **Cran 3 · moyenne** : quorum 50 ; 75 % à la participation habituelle, 55 % quand tout le monde vote. Le cran par défaut : tous les autres articles, et chaque nouvel article.
|
||||
- **Cran 4 · haute** : quorum 50 ; 83 % à la participation habituelle, 60 % quand tout le monde vote. Le titre du document.
|
||||
- **Cran 5 · très haute** : quorum 50 ; 90 % à la participation habituelle, 66 % quand tout le monde vote. Aucun article au départ.
|
||||
|
||||
**La participation habituelle** est la médiane du nombre de votants des propositions du groupe votées depuis un an. Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de référence du document : 100 votants dans Monnaie libre. Elle ne dépend pas du quorum d'un article. Elle reste entre 1 % et 50 % de l'électorat, et se mesure une fois par jour.
|
||||
**La participation habituelle** est la médiane du nombre de votants des propositions du groupe votées depuis un an. Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence du document : 100 votants dans Monnaie libre. Elle ne dépend pas du quorum d'un article. Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour.
|
||||
|
||||
**G** se calcule pour que la part exigée, à la participation habituelle, soit exactement celle du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃ la participation habituelle divisée par W.
|
||||
**G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W.
|
||||
```
|
||||
|
||||
### N1.1 · English
|
||||
@@ -542,21 +818,21 @@ Titre : **Niveaux d'inertie**
|
||||
Titre : **Inertia levels**
|
||||
|
||||
```markdown
|
||||
At each level, the group asks for a share of votes in favour among the voters (see “WoT threshold formula”). 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. The share depends on the level and on the number of voters, compared with the group's usual turnout: beyond the quorum, the more voters, the lower it gets, down to the majority M when everyone votes.
|
||||
At each level, the group asks for a share of votes in favour among the voters (see “WoT threshold formula”). Each level also has its quorum: below the article's quorum, the voters who are missing count as votes against, and it takes as many votes in favour as if that quorum had voted. The share asked depends on the level and on the number of voters, compared with the group's usual turnout: beyond that quorum, the more voters, the lower it gets, down to the majority M when everyone votes.
|
||||
|
||||
`Share asked = M + (1 − M) × (1 − (T'/W)^G)`, where T' is the number of voters, or the quorum if some are missing.
|
||||
`Share asked = M + (1 − M) × (1 − (T'/W)^G)`, where T' is the number of voters, or the article's quorum if some are missing.
|
||||
|
||||
**The five levels**: the quorum in Monnaie libre, the share asked beyond the quorum, when the group votes as usual, then when everyone votes, and what is at that level at the start.
|
||||
**The five levels**: the quorum in Monnaie libre, the share asked beyond the article's quorum, at the usual turnout, then when everyone votes, and what is at that level at the start.
|
||||
|
||||
- **Level 1 · very low**: quorum 12; 60% as usual, 50% when everyone votes. No article at the start.
|
||||
- **Level 2 · low**: quorum 12; 67% as usual, 50% when everyone votes. Purpose, Uniqueness of the account, Reciprocity, and the order of the articles of each section.
|
||||
- **Level 3 · medium**: quorum 50; 75% as usual, 55% when everyone votes. The default level: all other articles, and every new article.
|
||||
- **Level 4 · high**: quorum 50; 83% as usual, 60% when everyone votes. The title of the document.
|
||||
- **Level 5 · very high**: quorum 50; 90% as usual, 66% when everyone votes. No article at the start.
|
||||
- **Level 1 · very low**: quorum 12; 60% at the usual turnout, 50% when everyone votes. No article at the start.
|
||||
- **Level 2 · low**: quorum 12; 67% at the usual turnout, 50% when everyone votes. Purpose, Uniqueness of the account, Reciprocity, and the order of the articles of each section.
|
||||
- **Level 3 · medium**: quorum 50; 75% at the usual turnout, 55% when everyone votes. The default level: all other articles, and every new article.
|
||||
- **Level 4 · high**: quorum 50; 83% at the usual turnout, 60% when everyone votes. The title of the document.
|
||||
- **Level 5 · very high**: quorum 50; 90% at the usual turnout, 66% when everyone votes. No article at the start.
|
||||
|
||||
**The usual turnout** is the median number of voters on the group's proposals voted on over the past year. Until the group has voted on 5 proposals, it is twice the document's reference quorum: 100 voters in Monnaie libre. It does not depend on the quorum of an article. It stays between 1% and 50% of the electorate, and is measured once a day.
|
||||
**The usual turnout** is the median number of voters on the group's proposals voted on over the past year. While it rests on fewer than 5 proposals, it is twice the document's reference quorum: 100 voters in Monnaie libre. It does not depend on the quorum of an article. It is kept between 1% and 50% of the electorate, and is measured once a day.
|
||||
|
||||
**G** is computed so that the share asked, at the usual turnout, is exactly that of the level: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is the share asked as usual and p̃ the usual turnout divided by W.
|
||||
**G** is computed so that the share asked, beyond the article's quorum, is exactly that of the level at the usual turnout: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is that share of the level (60, 67, 75, 83 or 90%) and p̃ the usual turnout divided by W.
|
||||
```
|
||||
|
||||
### N1.1 · Español
|
||||
@@ -564,21 +840,21 @@ At each level, the group asks for a share of votes in favour among the voters (s
|
||||
Titre : **Niveles de inercia**
|
||||
|
||||
```markdown
|
||||
En cada nivel, el grupo pide una proporción de votos a favor entre los votantes (ver «Fórmula del umbral WoT»). 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. La proporción depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá del quórum, cuantos más votantes, más baja, hasta la mayoría M cuando vota todo el mundo.
|
||||
En cada nivel, el grupo pide una proporción de votos a favor entre los votantes (ver «Fórmula del umbral WoT»). Cada nivel tiene además su quórum: por debajo del quórum del artículo, los votantes que faltan cuentan como «no», y hacen falta tantos votos a favor como si hubiera votado ese quórum. La proporción exigida depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá de ese quórum, cuantos más votantes, más baja, hasta la mayoría M cuando vota todo el mundo.
|
||||
|
||||
`Proporción exigida = M + (1 − M) × (1 − (T'/W)^G)`, donde T' es el número de votantes, o el quórum si faltan.
|
||||
`Proporción exigida = M + (1 − M) × (1 − (T'/W)^G)`, donde T' es el número de votantes, o el quórum del artículo si faltan.
|
||||
|
||||
**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum, cuando el grupo vota como de costumbre, luego cuando vota todo el mundo, y lo que está en ese nivel al inicio.
|
||||
**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum del artículo, con la participación habitual, luego cuando vota todo el mundo, y lo que está en ese nivel al inicio.
|
||||
|
||||
- **Nivel 1 · muy baja**: quórum 12; 60 % como de costumbre, 50 % cuando vota todo el mundo. Ningún artículo al inicio.
|
||||
- **Nivel 2 · baja**: quórum 12; 67 % como de costumbre, 50 % cuando vota todo el mundo. Razón de ser, Unicidad de la cuenta, Reciprocidad, y el orden de los artículos de cada sección.
|
||||
- **Nivel 3 · media**: quórum 50; 75 % como de costumbre, 55 % cuando vota todo el mundo. El nivel por defecto: todos los demás artículos, y todo artículo nuevo.
|
||||
- **Nivel 4 · alta**: quórum 50; 83 % como de costumbre, 60 % cuando vota todo el mundo. El título del documento.
|
||||
- **Nivel 5 · muy alta**: quórum 50; 90 % como de costumbre, 66 % cuando vota todo el mundo. Ningún artículo al inicio.
|
||||
- **Nivel 1 · muy baja**: quórum 12; 60 % con la participación habitual, 50 % cuando vota todo el mundo. Ningún artículo al inicio.
|
||||
- **Nivel 2 · baja**: quórum 12; 67 % con la participación habitual, 50 % cuando vota todo el mundo. Razón de ser, Unicidad de la cuenta, Reciprocidad, y el orden de los artículos de cada sección.
|
||||
- **Nivel 3 · media**: quórum 50; 75 % con la participación habitual, 55 % cuando vota todo el mundo. El nivel por defecto: todos los demás artículos, y todo artículo nuevo.
|
||||
- **Nivel 4 · alta**: quórum 50; 83 % con la participación habitual, 60 % cuando vota todo el mundo. El título del documento.
|
||||
- **Nivel 5 · muy alta**: quórum 50; 90 % con la participación habitual, 66 % cuando vota todo el mundo. Ningún artículo al inicio.
|
||||
|
||||
**La participación habitual** es la mediana del número de votantes de las propuestas del grupo votadas en el último año. Hasta que el grupo haya votado 5 propuestas, vale dos veces el quórum de referencia del documento: 100 votantes en Monnaie libre. No depende del quórum de un artículo. Se mantiene entre el 1 % y el 50 % del electorado, y se mide una vez al día.
|
||||
**La participación habitual** es la mediana del número de votantes de las propuestas del grupo votadas en el último año. Mientras se base en menos de 5 propuestas, vale dos veces el quórum de referencia del documento: 100 votantes en Monnaie libre. No depende del quórum de un artículo. Se acota entre el 1 % y el 50 % del electorado, y se mide una vez al día.
|
||||
|
||||
**G** se calcula para que la proporción exigida, con la participación habitual, sea exactamente la del nivel: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es la proporción exigida como de costumbre y p̃ la participación habitual dividida por W.
|
||||
**G** se calcula para que la proporción exigida, más allá del quórum del artículo, sea exactamente la del nivel con la participación habitual: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es esa proporción del nivel (60, 67, 75, 83 o 90 %) y p̃ la participación habitual dividida por W.
|
||||
```
|
||||
|
||||
## Les autres articles, cherchés et laissés
|
||||
@@ -640,7 +916,17 @@ inertie, le cran de départ de Raison d'être, Unicité du compte et Réciprocit
|
||||
le décrivent aussi, F1.1 dirait « dans la toile de confiance », comme F1.2.
|
||||
11. **Lot T3, l'interface** (hors de ce lot) : `settings.reading` dit encore « le groupe demande sa
|
||||
part de « pour » quand il vote comme d'habitude », sans « au-delà du quorum » pour cette part ;
|
||||
même imprécision que la phrase de F1.2 et N1.1 reprise ici (fr, en, es).
|
||||
même imprécision que la phrase de F1.2 et N1.1 reprise ici (fr, en, es). *(Après T3c : l'interface
|
||||
dit aussi « comme d'habitude » dans `settings.share.note` et `settings.required.usual` ; les textes
|
||||
votés disent maintenant « à la participation habituelle ». Non touchée, ordre de T3c.)*
|
||||
12. **Lot T3c, F1.2, « Un vote permanent »** (pour information, hors du champ de T3c) : « Chacun peut
|
||||
changer ou retirer son vote » et « Une proposition entre en vigueur dès qu'elle atteint son seuil »
|
||||
ne disent pas la version retenue par une objection (ADR 0010 : on n'y ajoute jamais un « pour », et
|
||||
elle n'entre pas en vigueur tant que l'objection tient). Règles sans nombre, laissées : à écrire si
|
||||
tu le veux, par un autre lot.
|
||||
13. **Lot T3c, F1.1** (pour information) : « G : plus il est grand, plus la part demandée monte quand peu
|
||||
de gens votent » n'a pas d'effet sur un article dont l'auteur a fixé le quorum à W (la part y est M
|
||||
à tout G). Cas limite ; F1.1 n'a pas d'amendement, laissé.
|
||||
|
||||
## Les chiffres et leur source
|
||||
|
||||
@@ -669,12 +955,12 @@ Chaque nombre est vérifié par `every_number_of_the_quorum_texts_is_the_engine_
|
||||
| W relu toutes les 6 heures | F1.2 | `wot::REFRESH` (`crates/ld-server/src/wot.rs:13-14`) |
|
||||
| B = 0,1 | F1.2 | `FormulaParams::DEFAULT_BASE` |
|
||||
| Cran 3 par défaut : M = 55 %, quorum 50, 75 % | F1.2, N1.1 | `InertiaLevel::DEFAULT`, `majority_pct`, `share_pct` ; le quorum du cran |
|
||||
| M = 50, 50, 55, 60, 66 % ; s = 60, 67, 75, 83, 90 % | N1.1 | `InertiaLevel::majority_pct`, `share_pct` |
|
||||
| M = 50, 50, 55, 60, 66 % ; s = 60, 67, 75, 83, 90 % (la liste des crans ; s aussi dans la phrase de G) | N1.1 | `InertiaLevel::majority_pct`, `share_pct` |
|
||||
| Propositions seed au cran 2 | F1.2, N1.1 | `seed::SEED_PROPOSAL_LEVEL` ; les versions `seedProposal` du seed, leurs titres dans chaque langue |
|
||||
| Le titre au cran 4, l'ordre de chaque section au cran 2 | F1.2, N1.1 | le seed, `modules.title.inertia`, `modules.order.inertia` |
|
||||
| Tous les autres articles au cran 3 ; rien aux crans 1 et 5 | F1.2, N1.1 | le seed : chaque `inertia` (toutes égales, vérifié) |
|
||||
| 5 propositions ; 100 votants (deux fois le quorum de référence) | N1.1 | `Participation::MIN_SAMPLE` ; `Participation::reference_ratio(W, voteFloor) × W` avant les bornes, `voteFloor` = 50, le même sur toute toile |
|
||||
| Entre 1 % et 50 % | N1.1 | `Participation::LOWEST`, `HIGHEST` |
|
||||
| 5 propositions ; 100 votants (deux fois le quorum de référence) | N1.1 | `Participation::MIN_SAMPLE` ; 2 × `voteFloor` (50), un paramètre, écrit avant les bornes : la participation de référence ne vaut 100 votants que sur une toile de 200 à 10 000 membres, les bornes la ramènent ailleurs (`the_reference_turnout_is_a_parameter_the_bounds_bring_back`) ; moins de 5 propositions votées dans l'année, la référence (lot T3c : `the_participation_habituelle_is_the_median_brought_back_within_its_bounds`, `tests/inertia.rs` `the_usual_participation_is_the_median_of_five_voted_proposals`) |
|
||||
| Ramenée entre 1 % et 50 % | N1.1 | `Participation::LOWEST`, `HIGHEST` ; la valeur bornée est la participation habituelle (lot T3c : `the_participation_habituelle_is_the_median_brought_back_within_its_bounds`) |
|
||||
| Depuis un an ; une fois par jour | N1.1 | `participation::WINDOW_DAYS` = 365, `EVERY_HOURS` = 24 |
|
||||
|
||||
**Lot T3** : les quatre lignes de l'exemple de N1.1 sont ôtées de ce tableau (72, 81, 90, 100 et
|
||||
@@ -683,7 +969,9 @@ au plus ; au cran 3, 39 et 11) : l'exemple est sorti du texte (point 3), parce q
|
||||
dépendaient de la toile et d'une participation (7 224 membres, 120 votants). Ils restent des
|
||||
chiffres de contrôle du moteur (`inertia.rs`, `the_values_shown_to_yvv`,
|
||||
`the_control_figures_of_the_quorum`), pas des textes. Tous les nombres qui restent sont des
|
||||
paramètres : le test les retrouve identiques sur toute toile de 100 à 10 000 000 membres.
|
||||
paramètres, qu'aucune toile ni participation ne change ; seul le quorum le plus bas est calculé sur W
|
||||
par le test, le même sur toute toile de 100 à 10 000 000 membres. « 100 votants » est un paramètre,
|
||||
pas une participation vraie sur toute toile (lot T3b, après la relecture de `2ce2028`).
|
||||
|
||||
Les règles sans chiffre :
|
||||
|
||||
@@ -694,8 +982,13 @@ Les règles sans chiffre :
|
||||
| Une version passe quand ses « pour » atteignent le seuil arrondi au-dessus | F1.1 | `threshold::passes`, `clamp_ceil` |
|
||||
| La participation habituelle ne dépend pas du quorum d'un article | N1.1 | `inertia::Participation::reference_ratio` (le quorum de référence du document) ; ADR 0013 |
|
||||
| Au départ, aucun article en vigueur | F1.2 | ADR 0011 ; le seed (aucune version `in_force` hors modules) |
|
||||
| Sous le quorum, autant de voix pour que si le quorum avait voté (lot T3) | N1.1 | `threshold::judged_voters` ; `yes_needed(0)` égale `wot_threshold(W, Q)` ; `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` |
|
||||
| La part du cran comme d'habitude, au-delà du quorum (lot T3) | F1.2, N1.1 | `inertia::gradient` ; `the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` |
|
||||
| Sous le quorum de l'article, autant de « pour » que si ce quorum avait voté (lot T3, puis T3b et T3c) | N1.1 | `threshold::judged_voters` ; `yes_needed(0)` égale `wot_threshold(W, Q)` ; `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` |
|
||||
| Dans Monnaie libre, un seul « pour » ne passe jamais (lot T3c, sur la grille) | F1.2 | `threshold::passes` ; `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` |
|
||||
| Au-delà du quorum de l'article, la part exigée baisse à chaque votant de plus, jusqu'à M (lot T3c) | N1.1 | `threshold::required_ratio`, `judged_voters` ; `the_share_asked_falls_beyond_the_article_s_quorum_down_to_m` |
|
||||
| La part du cran à la participation habituelle, au-delà du quorum de l'article (lot T3, puis T3c) | F1.2, N1.1 | `inertia::gradient`, `Participation::of` ; `the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` |
|
||||
| G donne la part du cran au-delà du quorum de l'article, à la participation habituelle (lot T3b, puis T3c) | N1.1 | `inertia::gradient`, `threshold::judged_voters` ; `g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum` |
|
||||
| La participation habituelle ne dépend pas du quorum d'un article (lot T3c, servie) | N1.1 | `docs.rs` (`Participation::of` sur `vote_floor`) ; `tests/quorum.rs` `in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pending` |
|
||||
| Tout nouvel article commence au cran 3 (lot T3c) | F1.2 | `proposals.rs` (`InertiaLevel::DEFAULT`) ; `tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote` |
|
||||
| B^W ne compte pas dans la toile (W de 100 à 10 000 000) | F1.1, F1.2 | `wot::PLAUSIBLE` ; `b_to_the_power_w_never_counts_in_the_web_of_trust` |
|
||||
|
||||
## Les textes dans le seed
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"_source": "maquette/frontend/app/data/seeds/duniter-g1.bundle.json (doc engagement-certification, 33 clauses + 2 variantes). Aucun article en vigueur au départ. I1, E1, E2 : Propositions seed (« seedProposal »), ouvertes, mises en avant pour amorcer le vote, sans niveau d'inertie ici : elles démarrent au cran SEED_PROPOSAL_LEVEL (crates/ld-server/src/seed.rs : 2 « basse », choix d'Yvv du 2026-11-02, qui remontera leur inertie par un vote une fois les textes passés ; ADR 0011). Tant qu'aucun article n'est en vigueur, la publication attend le premier texte. Tout le reste : propositions ouvertes à 0 vote (Yvv, 2026-10-21), inertie 3 / 5. I1 « Raison d'être » remplace le Préambule (texte d'Yvv, revue du 2026-10-30). Modules : le titre du document à 4, l'ordre des articles de chaque section à 2, en vigueur sans vote (seed a minima ; revue du 2026-10-30, ADR 0009). F1.2, N1, N1.1, O1 réécrits selon les règles appliquées (Yvv, 2026-11-02). Quorums par cran (« quorums », ADR 0013, Yvv, 2026-11-02 et 03) : 12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 partout dans le groupe d'essai ; sous le quorum, les votants qui manquent comptent comme « non » ; voteFloor reste le quorum de référence de la participation p0 = 2 × voteFloor / W. Une base existante reçoit ces changements par des amendements gardés (seed_amend, seed_proposal_amend, quorum_amend), jamais en réinstanciant le document. F1.1, F1.2 et N1.1 réécrits pour le quorum par cran (ADR 0013 ; Yvv, 2026-11-02 et 03 ; lot T, textes relus dans docs/chantiers/acte-certification/textes-quorum-seed.md) : sous le quorum, les votants qui manquent comptent comme « non » ; au-delà, la part du cran. Trois phrases reprises après la relecture de M6b (lot T2) : la part du cran, la plus haute au quorum, baisse quand la participation monte (F1.1) ; l'auteur fixe le quorum tant que l'article ne garde la trace d'aucun vote (F1.2) ; le quorum n'est pas un nombre minimal de votants (N1.1). Lot T3 (Yvv, 03/11 : « pas de chiffre datés dans un texte voté ») : l'exemple chiffré de N1.1 retiré (aucun nombre des textes ne dépend de W ni d'une participation) ; N1.1, sous le quorum, il faut autant de voix pour que si le quorum avait voté (vrai pour tout quorum) ; N1.1 et F1.2, la part du cran comme d'habitude au-delà du quorum.",
|
||||
"_source": "maquette/frontend/app/data/seeds/duniter-g1.bundle.json (doc engagement-certification, 33 clauses + 2 variantes). Aucun article en vigueur au départ. I1, E1, E2 : Propositions seed (« seedProposal »), ouvertes, mises en avant pour amorcer le vote, sans niveau d'inertie ici : elles démarrent au cran SEED_PROPOSAL_LEVEL (crates/ld-server/src/seed.rs : 2 « basse », choix d'Yvv du 2026-11-02, qui remontera leur inertie par un vote une fois les textes passés ; ADR 0011). Tant qu'aucun article n'est en vigueur, la publication attend le premier texte. Tout le reste : propositions ouvertes à 0 vote (Yvv, 2026-10-21), inertie 3 / 5. I1 « Raison d'être » remplace le Préambule (texte d'Yvv, revue du 2026-10-30). Modules : le titre du document à 4, l'ordre des articles de chaque section à 2, en vigueur sans vote (seed a minima ; revue du 2026-10-30, ADR 0009). F1.2, N1, N1.1, O1 réécrits selon les règles appliquées (Yvv, 2026-11-02). Quorums par cran (« quorums », ADR 0013, Yvv, 2026-11-02 et 03) : 12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 partout dans le groupe d'essai ; sous le quorum, les votants qui manquent comptent comme « non » ; voteFloor reste le quorum de référence de la participation p0 = 2 × voteFloor / W. Une base existante reçoit ces changements par des amendements gardés (seed_amend, seed_proposal_amend, quorum_amend), jamais en réinstanciant le document. F1.1, F1.2 et N1.1 réécrits pour le quorum par cran (ADR 0013 ; Yvv, 2026-11-02 et 03 ; lot T, textes relus dans docs/chantiers/acte-certification/textes-quorum-seed.md) : sous le quorum, les votants qui manquent comptent comme « non » ; au-delà, la part du cran. Trois phrases reprises après la relecture de M6b (lot T2) : la part du cran, la plus haute au quorum, baisse quand la participation monte (F1.1) ; l'auteur fixe le quorum tant que l'article ne garde la trace d'aucun vote (F1.2) ; le quorum n'est pas un nombre minimal de votants (N1.1). Lot T3 (Yvv, 03/11 : « pas de chiffre datés dans un texte voté ») : l'exemple chiffré de N1.1 retiré (aucun nombre des textes ne dépend de W ni d'une participation) ; N1.1, sous le quorum, il faut autant de « pour » que si le quorum avait voté (vrai pour tout quorum) ; N1.1 et F1.2, la part du cran comme d'habitude au-delà du quorum. Après la relecture de 2ce2028 (lot T3b, même amendement) : N1.1, G se calcule pour que la part exigée, au-delà du quorum, soit celle du cran quand le groupe vote comme d'habitude (vrai pour tout W et tout quorum). Après la relecture de e7ab82f (lot T3c, mêmes amendements) : F1.2 et N1.1 écrivent le terme défini, « à la participation habituelle » (la médiane ramenée entre 1 % et 50 % de W, celle sur laquelle G se calcule), à la place de « comme d'habitude », faux quand la médiane sort de ses bornes ; N1.1, « sous le quorum de l'article », « la part exigée », « Tant qu'elle repose sur moins de 5 propositions », « Elle est ramenée entre 1 % et 50 % » (liste fermée des phrases : docs/chantiers/acte-certification/t3c-liste-fermee.md).",
|
||||
"slug": "acte-engagement-certification",
|
||||
"title": {
|
||||
"fr": "Acte d'engagement Certification",
|
||||
@@ -694,9 +694,9 @@
|
||||
"es": "Parámetros por defecto"
|
||||
},
|
||||
"body": {
|
||||
"fr": "Les valeurs des lettres de la formule (voir « Formule du seuil WoT ») et la façon dont le vote se déroule.\n\n**Un vote permanent, sans durée**\n\n- Chaque version se vote à tout moment, sans échéance. Chacun peut changer ou retirer son vote : le dernier fait foi.\n- Une proposition entre en vigueur dès qu'elle atteint son seuil. S'il y a déjà un texte en vigueur, il lui faut en plus une marge (voix pour moins voix exigées) plus large que celle de ce texte. Le texte remplacé redevient une proposition, avec ses votes : il peut revenir.\n- Si plusieurs propositions y parviennent, celle qui a la marge la plus large entre en vigueur.\n\n**Les lettres**\n\n- **W** : le nombre de membres de la toile de confiance Ğ1, relu sur la chaîne toutes les 6 heures.\n- **T** : les votes exprimés sur la version, pour et contre.\n- **Q**, le quorum : sous ce nombre de votants, ceux qui manquent comptent comme « non ». Chaque article prend celui de son cran : 12, 12, 50, 50 et 50 dans Monnaie libre, du cran 1 au cran 5. L'auteur de la première version d'un article, un administrateur pour les textes de départ, peut en fixer un autre tant que l'article ne garde la trace d'aucun vote. Dans Monnaie libre, jamais moins de 2 : une seule voix ne fait jamais passer un texte.\n- **B = 0,1** : dans la toile de confiance, `B^W` est si petit qu'il ne compte pas.\n- **M** et **G** : donnés par le cran d'inertie de l'article (voir « Niveaux d'inertie »). G n'est pas fixé à la main : il se déduit de la participation habituelle du groupe.\n\n**Par défaut**\n\n- 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. Tout nouvel article commence à ce cran.\n- Au départ, aucun article n'est en vigueur. Raison d'être, Unicité du compte et Réciprocité sont des Propositions seed, mises en avant pour lancer le vote, au cran 2 (basse). Le titre du document est au cran 4 (haute), l'ordre des articles de chaque section au cran 2, tous les autres articles au cran 3.",
|
||||
"en": "The values of the letters of the formula (see “WoT threshold formula”) and how the vote runs.\n\n**A permanent vote, with no duration**\n\n- Every version can be voted on at any time, with no deadline. Anyone can change or withdraw their vote: the last one is the one that counts.\n- A proposal comes into force as soon as it reaches its threshold. If a text is already in force, it also needs a wider margin (votes in favour minus votes required) than that text has. The replaced text becomes a proposal again, with its votes: it can come back.\n- If several proposals get there, the one with the widest margin comes into force.\n\n**The letters**\n\n- **W**: the number of members of the Ğ1 web of trust, read again from the chain every 6 hours.\n- **T**: the votes cast on the version, for and against.\n- **Q**, the quorum: below this number of voters, those who are missing count as votes against. Each article takes the one of its level: 12, 12, 50, 50 and 50 in Monnaie libre, from level 1 to level 5. The author of the first version of an article, an administrator for the starting texts, can set another one as long as the article keeps no trace of any vote. In Monnaie libre, never less than 2: a single vote never passes a text.\n- **B = 0.1**: in the web of trust, `B^W` is so small that it does not count.\n- **M** and **G**: given by the article's level of inertia (see “Inertia levels”). G is not set by hand: it follows from the group's usual turnout.\n\n**By default**\n\n- The default level is 3 (medium): M = 55%, a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour when it votes as usual. Every new article starts at this level.\n- At the start, no article is in force. Purpose, Uniqueness of the account and Reciprocity are seed proposals, put forward to start the vote, at level 2 (low). The title of the document is at level 4 (high), the order of the articles of each section at level 2, all other articles at level 3.",
|
||||
"es": "Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y cómo se desarrolla la votación.\n\n**Una votación permanente, sin duración**\n\n- Cada versión se vota en cualquier momento, sin plazo. Cada cual puede cambiar o retirar su voto: el último es el que cuenta.\n- Una propuesta entra en vigor en cuanto alcanza su umbral. Si ya hay un texto en vigor, necesita además un margen (votos a favor menos votos exigidos) más amplio que el de ese texto. El texto sustituido vuelve a ser una propuesta, con sus votos: puede volver.\n- Si varias propuestas lo consiguen, entra en vigor la que tiene el margen más amplio.\n\n**Las letras**\n\n- **W**: el número de miembros de la red de confianza Ğ1, leído de nuevo en la cadena cada 6 horas.\n- **T**: los votos emitidos sobre la versión, a favor y en contra.\n- **Q**, el quórum: por debajo de este número de votantes, los que faltan cuentan como «no». Cada artículo toma el de su nivel: 12, 12, 50, 50 y 50 en Monnaie libre, del nivel 1 al nivel 5. El autor de la primera versión de un artículo, un administrador para los textos de partida, puede fijar otro mientras el artículo no guarde rastro de ningún voto. En Monnaie libre, nunca menos de 2: un solo voto nunca hace pasar un texto.\n- **B = 0,1**: en la red de confianza, `B^W` es tan pequeño que no cuenta.\n- **M** y **G**: los da el nivel de inercia del artículo (ver «Niveles de inercia»). G no se fija a mano: se deduce de la participación habitual del grupo.\n\n**Por defecto**\n\n- El nivel por defecto es el 3 (media): M = 55 %, un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor cuando vota como de costumbre. Todo artículo nuevo empieza en este nivel.\n- Al inicio, ningún artículo está en vigor. Razón de ser, Unicidad de la cuenta y Reciprocidad son Propuestas seed, puestas en primer plano para lanzar la votación, en el nivel 2 (baja). El título del documento está en el nivel 4 (alta), el orden de los artículos de cada sección en el nivel 2, todos los demás artículos en el nivel 3."
|
||||
"fr": "Les valeurs des lettres de la formule (voir « Formule du seuil WoT ») et la façon dont le vote se déroule.\n\n**Un vote permanent, sans durée**\n\n- Chaque version se vote à tout moment, sans échéance. Chacun peut changer ou retirer son vote : le dernier fait foi.\n- Une proposition entre en vigueur dès qu'elle atteint son seuil. S'il y a déjà un texte en vigueur, il lui faut en plus une marge (voix pour moins voix exigées) plus large que celle de ce texte. Le texte remplacé redevient une proposition, avec ses votes : il peut revenir.\n- Si plusieurs propositions y parviennent, celle qui a la marge la plus large entre en vigueur.\n\n**Les lettres**\n\n- **W** : le nombre de membres de la toile de confiance Ğ1, relu sur la chaîne toutes les 6 heures.\n- **T** : les votes exprimés sur la version, pour et contre.\n- **Q**, le quorum : sous ce nombre de votants, ceux qui manquent comptent comme « non ». Chaque article prend celui de son cran : 12, 12, 50, 50 et 50 dans Monnaie libre, du cran 1 au cran 5. L'auteur de la première version d'un article, un administrateur pour les textes de départ, peut en fixer un autre tant que l'article ne garde la trace d'aucun vote. Dans Monnaie libre, jamais moins de 2 : une seule voix ne fait jamais passer un texte.\n- **B = 0,1** : dans la toile de confiance, `B^W` est si petit qu'il ne compte pas.\n- **M** et **G** : donnés par le cran d'inertie de l'article (voir « Niveaux d'inertie »). G n'est pas fixé à la main : il se déduit de la participation habituelle du groupe.\n\n**Par défaut**\n\n- 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 » à sa participation habituelle. Tout nouvel article commence à ce cran.\n- Au départ, aucun article n'est en vigueur. Raison d'être, Unicité du compte et Réciprocité sont des Propositions seed, mises en avant pour lancer le vote, au cran 2 (basse). Le titre du document est au cran 4 (haute), l'ordre des articles de chaque section au cran 2, tous les autres articles au cran 3.",
|
||||
"en": "The values of the letters of the formula (see “WoT threshold formula”) and how the vote runs.\n\n**A permanent vote, with no duration**\n\n- Every version can be voted on at any time, with no deadline. Anyone can change or withdraw their vote: the last one is the one that counts.\n- A proposal comes into force as soon as it reaches its threshold. If a text is already in force, it also needs a wider margin (votes in favour minus votes required) than that text has. The replaced text becomes a proposal again, with its votes: it can come back.\n- If several proposals get there, the one with the widest margin comes into force.\n\n**The letters**\n\n- **W**: the number of members of the Ğ1 web of trust, read again from the chain every 6 hours.\n- **T**: the votes cast on the version, for and against.\n- **Q**, the quorum: below this number of voters, those who are missing count as votes against. Each article takes the one of its level: 12, 12, 50, 50 and 50 in Monnaie libre, from level 1 to level 5. The author of the first version of an article, an administrator for the starting texts, can set another one as long as the article keeps no trace of any vote. In Monnaie libre, never less than 2: a single vote never passes a text.\n- **B = 0.1**: in the web of trust, `B^W` is so small that it does not count.\n- **M** and **G**: given by the article's level of inertia (see “Inertia levels”). G is not set by hand: it follows from the group's usual turnout.\n\n**By default**\n\n- The default level is 3 (medium): M = 55%, a quorum of 50 in Monnaie libre, and, beyond the quorum, the group asks for 75% of votes in favour at its usual turnout. Every new article starts at this level.\n- At the start, no article is in force. Purpose, Uniqueness of the account and Reciprocity are seed proposals, put forward to start the vote, at level 2 (low). The title of the document is at level 4 (high), the order of the articles of each section at level 2, all other articles at level 3.",
|
||||
"es": "Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y cómo se desarrolla la votación.\n\n**Una votación permanente, sin duración**\n\n- Cada versión se vota en cualquier momento, sin plazo. Cada cual puede cambiar o retirar su voto: el último es el que cuenta.\n- Una propuesta entra en vigor en cuanto alcanza su umbral. Si ya hay un texto en vigor, necesita además un margen (votos a favor menos votos exigidos) más amplio que el de ese texto. El texto sustituido vuelve a ser una propuesta, con sus votos: puede volver.\n- Si varias propuestas lo consiguen, entra en vigor la que tiene el margen más amplio.\n\n**Las letras**\n\n- **W**: el número de miembros de la red de confianza Ğ1, leído de nuevo en la cadena cada 6 horas.\n- **T**: los votos emitidos sobre la versión, a favor y en contra.\n- **Q**, el quórum: por debajo de este número de votantes, los que faltan cuentan como «no». Cada artículo toma el de su nivel: 12, 12, 50, 50 y 50 en Monnaie libre, del nivel 1 al nivel 5. El autor de la primera versión de un artículo, un administrador para los textos de partida, puede fijar otro mientras el artículo no guarde rastro de ningún voto. En Monnaie libre, nunca menos de 2: un solo voto nunca hace pasar un texto.\n- **B = 0,1**: en la red de confianza, `B^W` es tan pequeño que no cuenta.\n- **M** y **G**: los da el nivel de inercia del artículo (ver «Niveles de inercia»). G no se fija a mano: se deduce de la participación habitual del grupo.\n\n**Por defecto**\n\n- El nivel por defecto es el 3 (media): M = 55 %, un quórum de 50 en Monnaie libre, y, más allá del quórum, el grupo pide un 75 % de votos a favor con su participación habitual. Todo artículo nuevo empieza en este nivel.\n- Al inicio, ningún artículo está en vigor. Razón de ser, Unicidad de la cuenta y Reciprocidad son Propuestas seed, puestas en primer plano para lanzar la votación, en el nivel 2 (baja). El título del documento está en el nivel 4 (alta), el orden de los artículos de cada sección en el nivel 2, todos los demás artículos en el nivel 3."
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -760,9 +760,9 @@
|
||||
"es": "Niveles de inercia"
|
||||
},
|
||||
"body": {
|
||||
"fr": "À chaque cran, le groupe demande une part de « pour » parmi les votants (voir « Formule du seuil WoT »). 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é. La part dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà du quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote.\n\n`Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum s'il en manque.\n\n**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.\n\n- **Cran 1 · très basse** : quorum 12 ; 60 % comme d'habitude, 50 % quand tout le monde vote. Aucun article au départ.\n- **Cran 2 · basse** : quorum 12 ; 67 % comme d'habitude, 50 % quand tout le monde vote. Raison d'être, Unicité du compte, Réciprocité, et l'ordre des articles de chaque section.\n- **Cran 3 · moyenne** : quorum 50 ; 75 % comme d'habitude, 55 % quand tout le monde vote. Le cran par défaut : tous les autres articles, et chaque nouvel article.\n- **Cran 4 · haute** : quorum 50 ; 83 % comme d'habitude, 60 % quand tout le monde vote. Le titre du document.\n- **Cran 5 · très haute** : quorum 50 ; 90 % comme d'habitude, 66 % quand tout le monde vote. Aucun article au départ.\n\n**La participation habituelle** est la médiane du nombre de votants des propositions du groupe votées depuis un an. Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de référence du document : 100 votants dans Monnaie libre. Elle ne dépend pas du quorum d'un article. Elle reste entre 1 % et 50 % de l'électorat, et se mesure une fois par jour.\n\n**G** se calcule pour que la part exigée, à la participation habituelle, soit exactement celle du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃ la participation habituelle divisée par W.",
|
||||
"en": "At each level, the group asks for a share of votes in favour among the voters (see “WoT threshold formula”). 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. The share depends on the level and on the number of voters, compared with the group's usual turnout: beyond the quorum, the more voters, the lower it gets, down to the majority M when everyone votes.\n\n`Share asked = M + (1 − M) × (1 − (T'/W)^G)`, where T' is the number of voters, or the quorum if some are missing.\n\n**The five levels**: the quorum in Monnaie libre, the share asked beyond the quorum, when the group votes as usual, then when everyone votes, and what is at that level at the start.\n\n- **Level 1 · very low**: quorum 12; 60% as usual, 50% when everyone votes. No article at the start.\n- **Level 2 · low**: quorum 12; 67% as usual, 50% when everyone votes. Purpose, Uniqueness of the account, Reciprocity, and the order of the articles of each section.\n- **Level 3 · medium**: quorum 50; 75% as usual, 55% when everyone votes. The default level: all other articles, and every new article.\n- **Level 4 · high**: quorum 50; 83% as usual, 60% when everyone votes. The title of the document.\n- **Level 5 · very high**: quorum 50; 90% as usual, 66% when everyone votes. No article at the start.\n\n**The usual turnout** is the median number of voters on the group's proposals voted on over the past year. Until the group has voted on 5 proposals, it is twice the document's reference quorum: 100 voters in Monnaie libre. It does not depend on the quorum of an article. It stays between 1% and 50% of the electorate, and is measured once a day.\n\n**G** is computed so that the share asked, at the usual turnout, is exactly that of the level: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is the share asked as usual and p̃ the usual turnout divided by W.",
|
||||
"es": "En cada nivel, el grupo pide una proporción de votos a favor entre los votantes (ver «Fórmula del umbral WoT»). 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. La proporción depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá del quórum, cuantos más votantes, más baja, hasta la mayoría M cuando vota todo el mundo.\n\n`Proporción exigida = M + (1 − M) × (1 − (T'/W)^G)`, donde T' es el número de votantes, o el quórum si faltan.\n\n**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum, cuando el grupo vota como de costumbre, luego cuando vota todo el mundo, y lo que está en ese nivel al inicio.\n\n- **Nivel 1 · muy baja**: quórum 12; 60 % como de costumbre, 50 % cuando vota todo el mundo. Ningún artículo al inicio.\n- **Nivel 2 · baja**: quórum 12; 67 % como de costumbre, 50 % cuando vota todo el mundo. Razón de ser, Unicidad de la cuenta, Reciprocidad, y el orden de los artículos de cada sección.\n- **Nivel 3 · media**: quórum 50; 75 % como de costumbre, 55 % cuando vota todo el mundo. El nivel por defecto: todos los demás artículos, y todo artículo nuevo.\n- **Nivel 4 · alta**: quórum 50; 83 % como de costumbre, 60 % cuando vota todo el mundo. El título del documento.\n- **Nivel 5 · muy alta**: quórum 50; 90 % como de costumbre, 66 % cuando vota todo el mundo. Ningún artículo al inicio.\n\n**La participación habitual** es la mediana del número de votantes de las propuestas del grupo votadas en el último año. Hasta que el grupo haya votado 5 propuestas, vale dos veces el quórum de referencia del documento: 100 votantes en Monnaie libre. No depende del quórum de un artículo. Se mantiene entre el 1 % y el 50 % del electorado, y se mide una vez al día.\n\n**G** se calcula para que la proporción exigida, con la participación habitual, sea exactamente la del nivel: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es la proporción exigida como de costumbre y p̃ la participación habitual dividida por W."
|
||||
"fr": "À chaque cran, le groupe demande une part de « pour » parmi les votants (voir « Formule du seuil WoT »). Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote.\n\n`Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum de l'article s'il en manque.\n\n**Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de l'article, à la participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au départ.\n\n- **Cran 1 · très basse** : quorum 12 ; 60 % à la participation habituelle, 50 % quand tout le monde vote. Aucun article au départ.\n- **Cran 2 · basse** : quorum 12 ; 67 % à la participation habituelle, 50 % quand tout le monde vote. Raison d'être, Unicité du compte, Réciprocité, et l'ordre des articles de chaque section.\n- **Cran 3 · moyenne** : quorum 50 ; 75 % à la participation habituelle, 55 % quand tout le monde vote. Le cran par défaut : tous les autres articles, et chaque nouvel article.\n- **Cran 4 · haute** : quorum 50 ; 83 % à la participation habituelle, 60 % quand tout le monde vote. Le titre du document.\n- **Cran 5 · très haute** : quorum 50 ; 90 % à la participation habituelle, 66 % quand tout le monde vote. Aucun article au départ.\n\n**La participation habituelle** est la médiane du nombre de votants des propositions du groupe votées depuis un an. Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence du document : 100 votants dans Monnaie libre. Elle ne dépend pas du quorum d'un article. Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour.\n\n**G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W.",
|
||||
"en": "At each level, the group asks for a share of votes in favour among the voters (see “WoT threshold formula”). Each level also has its quorum: below the article's quorum, the voters who are missing count as votes against, and it takes as many votes in favour as if that quorum had voted. The share asked depends on the level and on the number of voters, compared with the group's usual turnout: beyond that quorum, the more voters, the lower it gets, down to the majority M when everyone votes.\n\n`Share asked = M + (1 − M) × (1 − (T'/W)^G)`, where T' is the number of voters, or the article's quorum if some are missing.\n\n**The five levels**: the quorum in Monnaie libre, the share asked beyond the article's quorum, at the usual turnout, then when everyone votes, and what is at that level at the start.\n\n- **Level 1 · very low**: quorum 12; 60% at the usual turnout, 50% when everyone votes. No article at the start.\n- **Level 2 · low**: quorum 12; 67% at the usual turnout, 50% when everyone votes. Purpose, Uniqueness of the account, Reciprocity, and the order of the articles of each section.\n- **Level 3 · medium**: quorum 50; 75% at the usual turnout, 55% when everyone votes. The default level: all other articles, and every new article.\n- **Level 4 · high**: quorum 50; 83% at the usual turnout, 60% when everyone votes. The title of the document.\n- **Level 5 · very high**: quorum 50; 90% at the usual turnout, 66% when everyone votes. No article at the start.\n\n**The usual turnout** is the median number of voters on the group's proposals voted on over the past year. While it rests on fewer than 5 proposals, it is twice the document's reference quorum: 100 voters in Monnaie libre. It does not depend on the quorum of an article. It is kept between 1% and 50% of the electorate, and is measured once a day.\n\n**G** is computed so that the share asked, beyond the article's quorum, is exactly that of the level at the usual turnout: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, where s is that share of the level (60, 67, 75, 83 or 90%) and p̃ the usual turnout divided by W.",
|
||||
"es": "En cada nivel, el grupo pide una proporción de votos a favor entre los votantes (ver «Fórmula del umbral WoT»). Cada nivel tiene además su quórum: por debajo del quórum del artículo, los votantes que faltan cuentan como «no», y hacen falta tantos votos a favor como si hubiera votado ese quórum. La proporción exigida depende del nivel y del número de votantes, comparado con la participación habitual del grupo: más allá de ese quórum, cuantos más votantes, más baja, hasta la mayoría M cuando vota todo el mundo.\n\n`Proporción exigida = M + (1 − M) × (1 − (T'/W)^G)`, donde T' es el número de votantes, o el quórum del artículo si faltan.\n\n**Los cinco niveles**: el quórum en Monnaie libre, la proporción exigida más allá del quórum del artículo, con la participación habitual, luego cuando vota todo el mundo, y lo que está en ese nivel al inicio.\n\n- **Nivel 1 · muy baja**: quórum 12; 60 % con la participación habitual, 50 % cuando vota todo el mundo. Ningún artículo al inicio.\n- **Nivel 2 · baja**: quórum 12; 67 % con la participación habitual, 50 % cuando vota todo el mundo. Razón de ser, Unicidad de la cuenta, Reciprocidad, y el orden de los artículos de cada sección.\n- **Nivel 3 · media**: quórum 50; 75 % con la participación habitual, 55 % cuando vota todo el mundo. El nivel por defecto: todos los demás artículos, y todo artículo nuevo.\n- **Nivel 4 · alta**: quórum 50; 83 % con la participación habitual, 60 % cuando vota todo el mundo. El título del documento.\n- **Nivel 5 · muy alta**: quórum 50; 90 % con la participación habitual, 66 % cuando vota todo el mundo. Ningún artículo al inicio.\n\n**La participación habitual** es la mediana del número de votantes de las propuestas del grupo votadas en el último año. Mientras se base en menos de 5 propuestas, vale dos veces el quórum de referencia del documento: 100 votantes en Monnaie libre. No depende del quórum de un artículo. Se acota entre el 1 % y el 50 % del electorado, y se mide una vez al día.\n\n**G** se calcula para que la proporción exigida, más allá del quórum del artículo, sea exactamente la del nivel con la participación habitual: `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, donde s es esa proporción del nivel (60, 67, 75, 83 o 90 %) y p̃ la participación habitual dividida por W."
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user