forked from yvv/decision
Lot S, phase 2 : le quorum dans le serveur (ADR 0013), vu rouge puis vert
- migration 0011 (additive ; 0010 reste au lot V) : documents.quorums (par cran,
NULL = vote_floor à chaque cran, le C d'avant), units.quorum (NULL = celui du
cran), journaux quorum_changes et quorum_amendments ;
- quorum effectif = units.quorum ?? quorums[cran] ; les propositions d'inertie et
les modules en héritent ; p0 = 2 × vote_floor / W, jamais le quorum d'un article ;
- route PUT /units/{id}/quorum { "quorum": n | null } : trustin_access::sets_quorum
(l'auteur de la première version, un administrateur pour le seed), refusée dès
qu'un vote existe (quorum::voted_units : vote du serveur, bulletin de la chaîne
en attente ou confirmé, adoption) ; bornes 2..W, 1..W dans le groupe d'essai ;
- amendement gardé 2026-11-03-quorums-par-cran : écrit les quorums du seed là où
il n'y en a pas, une fois par document, consigné, file de publication là où il
publie ;
- JSON : evaluation.quorum / yesNeeded / noNeeded ; l'unité : quorum,
quorumDefault, canSetQuorum ; doc.quorums ; levels[].quorum ; document.json
publié : quorums ; adoptions.params : quorum (plus de constant) ;
- seed : quorums 12 · 12 · 50 · 50 · 50 (Monnaie libre), 1 partout (essai).
- tests : tests/quorum.rs (5) et les règles pures ; les scénarios du groupe
d'essai qui demandaient deux voix posent le quorum 2 de l'article, comme son
auteur le ferait ; les chiffres de Monnaie libre suivent (9 au cran 2, 39 au
cran 3, 43 au cran 4).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -665,11 +665,14 @@ async fn a_seed_proposal_enters_by_the_vote_in_the_test_group() {
|
||||
a.login("Yvv", false).await;
|
||||
let mut b = a.other();
|
||||
b.login("Chiara", false).await;
|
||||
// Two members: W = 2, C = 1 — one voice is not enough (B^W keeps R above 1).
|
||||
// Two members: W = 2, the quorum 1 at every level of the test group (ADR 0013) — one
|
||||
// voice passes; one against holds a voice for (the share M of two voters).
|
||||
let doc = a.doc("essai").await;
|
||||
let i1 = unit(&doc, "I1")["proposals"][0]["id"].as_str().expect("i1").to_owned();
|
||||
let v = b.vote(&i1, "against").await;
|
||||
assert!(v["entered"].as_array().expect("entered").is_empty());
|
||||
let v = a.vote(&i1, "for").await;
|
||||
assert!(v["entered"].as_array().expect("entered").is_empty(), "one of two is not enough");
|
||||
assert!(v["entered"].as_array().expect("entered").is_empty(), "one for, one against: not enough");
|
||||
let v = b.vote(&i1, "for").await;
|
||||
assert_eq!(v["entered"][0]["code"], "I1");
|
||||
let doc = a.doc("essai").await;
|
||||
@@ -687,8 +690,8 @@ async fn a_seed_proposal_enters_by_the_vote_in_the_test_group() {
|
||||
.expect("adoption");
|
||||
assert_eq!(adopted, ("text".to_owned(), 2, 2));
|
||||
|
||||
// From 16 members on, B^W no longer lifts R above C = 1: one voice passes a text in
|
||||
// the test group (ADR 0007), whatever the level: R = C + B^W at one vote cast.
|
||||
// Whatever the number of members, one voice against none passes in the test group: at
|
||||
// 16, as at 2 (the quorum 1; before 2026-11-03, C = 1 + B^W held it under 16).
|
||||
for i in 0..14 {
|
||||
let mut m = a.other();
|
||||
m.login(&format!("Membre {i}"), false).await;
|
||||
|
||||
Reference in New Issue
Block a user