Fusion du lot T3c (relecture de e7ab82f) : F1.2 et N1.1 écrivent le terme défini « à la participation habituelle » ; « sous le quorum de l'article […] que si ce quorum avait voté », « la part exigée », « tant qu'elle repose sur moins de 5 propositions », « ramenée entre 1 % et 50 % » ; grille des tests étendue aux médianes hors bornes et aux quorums d'auteur ; liste fermée des phrases (t3c-liste-fermee.md) ; les mêmes amendements, to 0c3b800b… et 8107c5fc…
ci/woodpecker/push/app Pipeline was successful
ci/woodpecker/push/maquette Pipeline was successful

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 19:57:08 +01:00
co-authored by Claude Opus 5.5
7 changed files with 1120 additions and 208 deletions
+10 -5
View File
@@ -227,15 +227,20 @@ pub const AMENDMENTS: &[Amendment] = &[
// the quorum had voted; N1.1 and F1.2 ask the share of a level « comme d'habitude » beyond the // 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. After // 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 // 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. // 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 { Amendment {
id: "2026-11-03-f1-2-chiffres", id: "2026-11-03-f1-2-chiffres",
doc: "acte-engagement-certification", doc: "acte-engagement-certification",
unit: "F1.2", unit: "F1.2",
version: Version::Open("1.0.0"), version: Version::Open("1.0.0"),
from: "96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14", from: "96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14",
to: "ddce5aa5fcd13dfc3e374c37509a1bb8cfafddefb6e6add5a06b130b43216d62", to: "0c3b800b0c72b1edd4b884c03c6c5479c17609dcf82a95b593d408821e28bb4e",
reason: "proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum", 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"), follows: Some("2026-11-03-f1-2-phrases"),
superseded_by: None, superseded_by: None,
}, },
@@ -245,8 +250,8 @@ pub const AMENDMENTS: &[Amendment] = &[
unit: "N1.1", unit: "N1.1",
version: Version::Open("1.0.0"), version: Version::Open("1.0.0"),
from: "7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8", from: "7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8",
to: "7f62fd42617c6e63b1783d5a4d472ed733aa074222240faf834e6b31f1c9c166", to: "8107c5fc746121f18c8a440e86e23310c5a59ae8e92f5a07f6b098419980263c",
reason: "proposition de départ réécrite : N1.1, sans chiffre daté ; sous le quorum, autant de « pour » que si le quorum avait voté ; G, la part du cran au-delà du quorum", 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"), follows: Some("2026-11-03-n1-1-phrases"),
superseded_by: None, superseded_by: None,
}, },
+12
View File
@@ -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() 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. /// (quorum, quorumDefault, canSetQuorum) of a unit.
fn quorum_of(u: &Value) -> (Option<u64>, Option<u64>, Option<bool>) { fn quorum_of(u: &Value) -> (Option<u64>, Option<u64>, Option<bool>) {
(u["quorum"].as_u64(), u["quorumDefault"].as_u64(), u["canSetQuorum"].as_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; .await;
let (u, text) = let (u, text) =
(created["unitId"].as_str().expect("unit").to_owned(), created["id"].as_str().expect("id").to_owned()); (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. // 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(&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))); 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; chiara.login("Chiara", false).await;
let doc = admin.doc("monnaie-libre").await; let doc = admin.doc("monnaie-libre").await;
let doc_id = doc["doc"]["id"].as_str().expect("id").to_owned(); 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 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()); 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. // 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; let doc = admin.doc("monnaie-libre").await;
assert_eq!(unit(&doc, "I1")["proposals"][0]["evaluation"]["quorum"], 20); 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. // A refused ballot, an expired one, are no vote.
ballot(&state, &doc_id, &p, "refused", 1).await; ballot(&state, &doc_id, &p, "refused", 1).await;
ballot(&state, &doc_id, &p, "expired", 2).await; ballot(&state, &doc_id, &p, "expired", 2).await;
+588 -143
View File
@@ -27,6 +27,18 @@
//! group votes as usual — « à la participation habituelle » was false under the quorum; « autant de //! 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 //! « pour » » in French; and « 100 votants » is checked as the parameter it is, not as a turnout
//! that would hold on every W. //! 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::inertia::{InertiaLevel, Participation, Scale, gradient, quorum_bounds};
use ld_engine::threshold::{FormulaParams, Tally, judged_voters, passes, required_ratio, wot_threshold, yes_needed}; use ld_engine::threshold::{FormulaParams, Tally, judged_voters, passes, required_ratio, wot_threshold, yes_needed};
@@ -302,7 +314,7 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
), ),
format!("**B = {}**", dec(lang, f.base)), format!("**B = {}**", dec(lang, f.base)),
format!( 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, f.default_level,
name(f.default_level), name(f.default_level),
pct(lang, d.majority_pct()), pct(lang, d.majority_pct()),
@@ -330,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!("In Monnaie libre, never less than {}: a single vote never passes a text", f.lowest_quorum),
format!("**B = {}**", dec(lang, f.base)), format!("**B = {}**", dec(lang, f.base)),
format!( 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, f.default_level,
name(f.default_level), name(f.default_level),
pct(lang, d.majority_pct()), pct(lang, d.majority_pct()),
@@ -358,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!("En Monnaie libre, nunca menos de {}: un solo voto nunca hace pasar un texto", f.lowest_quorum),
format!("**B = {}**", dec(lang, f.base)), format!("**B = {}**", dec(lang, f.base)),
format!( 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, f.default_level,
name(f.default_level), name(f.default_level),
pct(lang, d.majority_pct()), pct(lang, d.majority_pct()),
@@ -390,17 +402,17 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
); );
match lang { match lang {
"fr" => format!( "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(), k.get(),
q[i] q[i]
), ),
"en" => format!( "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(), k.get(),
q[i] q[i]
), ),
_ => format!( _ => 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(), k.get(),
q[i] q[i]
), ),
@@ -416,20 +428,20 @@ fn claims(code: &str, lang: &str, f: &Figures, seed: &Value) -> Vec<String> {
out.extend(match lang { out.extend(match lang {
"fr" => [ "fr" => [
"propositions du groupe votées depuis un an".to_owned(), "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!("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 reste entre {b0} et {b1} de l'électorat, et se mesure une fois par jour"), 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})"), format!("où s est cette part du cran ({head} ou {last})"),
], ],
"en" => [ "en" => [
"the group's proposals voted on over the past year".to_owned(), "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!("While it rests on fewer than {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!("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})"), format!("where s is that share of the level ({head} or {last})"),
], ],
_ => [ _ => [
"propuestas del grupo votadas en el último año".to_owned(), "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!("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 mantiene entre el {b0} y el {b1} del electorado, y se mide una vez al día"), 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})"), format!("donde s es esa proporción del nivel ({head} o {last})"),
], ],
}); });
@@ -619,63 +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 // 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, with its /// (article, language, the words of T2, the words of today): the only change of the amendments of
/// review (2ce2028: the sentence of G; « autant de « pour » » in French). F1.1 has none: it holds /// lot T3, with its reviews — 2ce2028 (lot T3b: the sentence of G; « autant de « pour » » in French)
/// no dated figure and every sentence of it is true (`b_to_the_power_w_…`). /// and e7ab82f (lot T3c: the defined term « participation habituelle » where T3 wrote « comme
const PHRASES_T3: [(&str, &str, &str, &str); 15] = [ /// 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", "F1.2",
"fr", "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 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", "F1.2",
"en", "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 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", "F1.2",
"es", "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 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", "N1.1",
"fr", "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, 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 « 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", "N1.1",
"en", "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, 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", "N1.1",
"es", "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, 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", "N1.1",
"fr", "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 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", "N1.1",
"en", "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 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", "N1.1",
"es", "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 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", "N1.1",
@@ -699,22 +777,31 @@ const PHRASES_T3: [(&str, &str, &str, &str); 15] = [
"N1.1", "N1.1",
"fr", "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, à 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, 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.", "**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", "N1.1",
"en", "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, 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 quorum, is exactly that of the level when the group votes as usual: `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.", "**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", "N1.1",
"es", "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, 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, sea exactamente la del nivel cuando el grupo vota como de costumbre: `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.", "**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. /// The texts of T2 with the phrases of lot T3 written in: what the seed gives today.
fn t3_from_t2(code: &str, lang: &str, t2: &str) -> String { fn t3_from_t2(code: &str, lang: &str, t2: &str) -> String {
let mut b = t2.to_owned(); let mut b = t2.to_owned();
@@ -724,6 +811,11 @@ fn t3_from_t2(code: &str, lang: &str, t2: &str) -> String {
b = b.replacen(old, new, 1); 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 b
} }
@@ -742,33 +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(old), "{code} {lang}: still the words of T2\n{body}");
assert!(body.contains(new), "{code} {lang}: missing « {new} »\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. // The example of N1.1 is gone whole, and nothing takes its place.
for (lang, word) in [("fr", "Exemple"), ("en", "Example"), ("es", "Ejemplo")] { 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"); 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. // Lot T3c: one grid for every sentence that says a number, a share or a direction
fn participations(w: u32, vote_floor: f64) -> [f64; 4] { // ---------------------------------------------------------------------------
[Participation::LOWEST, Participation::of(w, vote_floor, None, 0).ratio, 0.1, Participation::HIGHEST]
/// 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 », /// A usual turnout of the grid: the median measured (`None`: fewer than 5 proposals, the reference
/// et il faut autant de « pour » que si le quorum avait voté » (after the review of 2ce2028: « de /// of the document stands in) and the participation habituelle the engine takes from it
/// voix pour que » read first as « pour que », a conjunction). True for every quorum an author /// (`Participation::of`: the median, or the reference, brought back within 1 % and 50 % of W).
/// may set (2 to W in Monnaie libre, 1 to W in the test group), every level, every W, every #[derive(Clone, Copy, Debug)]
/// participation within the bounds: the « pour » that pass with nobody against, fewer voters struct Usual {
/// than the quorum, are the threshold of the quorum; and under it, a tally passes exactly when median: Option<u32>,
/// its « pour » reach that threshold. The phrase of T2, « qui n'est pas un nombre minimal de part: Participation,
/// votants », is false: at a quorum of 2, two « pour » are asked, at every level, on every W. }
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] #[test]
fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() { fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
let today = today_seed(); let today = today_seed();
let said = [ let said = [
("fr", "et il faut autant de « pour » que si le quorum avait voté."), (
("en", "and it takes as many votes in favour as if the quorum had voted."), "fr",
("es", "y hacen falta tantos votos a favor como si hubiera votado el quórum."), "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 { for (lang, phrase) in said {
assert!(text(&today, "N1.1", lang).1.contains(phrase), "N1.1 {lang}: « {phrase} »"); assert!(text(&today, "N1.1", lang).1.contains(phrase), "N1.1 {lang}: « {phrase} »");
@@ -789,7 +1040,11 @@ fn under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted() {
for &w in electorates { for &w in electorates {
let (lowest, highest) = quorum_bounds(w, test_group); let (lowest, highest) = quorum_bounds(w, test_group);
assert_eq!(highest, w.max(lowest)); 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] }; let scale = Scale { electorate: w, participation: p, quorums: [lowest; 5] };
for k in InertiaLevel::ALL { for k in InertiaLevel::ALL {
for q in quorums(w, lowest) { for q in quorums(w, lowest) {
@@ -810,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, &params).expect("valid"), "{at}: 1 pour, {n} contre");
}
}
if at_quorum == q { if at_quorum == q {
minimum.push((test_group, w, k.get(), q)); minimum.push((test_group, w, k.get(), q));
} }
@@ -830,75 +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)); assert!(minimum.iter().any(|m| m.0 && m.3 == 1));
} }
/// One case of the grid of « comme d'habitude »: a web, the usual turnout of its group (in voters, /// N1.1, « La part exigée dépend du cran et du nombre de votants, comparé à la participation
/// and as p̃), a level and a quorum. /// habituelle du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la
struct AsUsual { /// majorité M quand tout le monde vote » (lot T3c: « la part exigée », the one the formula below
w: u32, /// names; « ce quorum », the article's). On the grid: under the article's quorum, the share asked
usual: u32, /// stays that of the quorum; from it, it falls with every voter more, strictly, down to M when
p: f64, /// everyone votes; and it depends on the participation habituelle (at it, s_k:
k: InertiaLevel, /// `the_share_of_a_level_is_asked_at_the_usual_turnout_…`). « La part » alone could be read as the
q: u32, /// 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 %.
impl AsUsual { #[test]
fn at(&self) -> String { fn the_share_asked_falls_beyond_the_article_s_quorum_down_to_m() {
format!("W {} usual {} k {} Q {}", self.w, self.usual, self.k.get(), self.q) 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() {
/// The grid of « comme d'habitude » (lot T3 and its review): every W of the grid, usual turnouts let p = c.params();
/// within the bounds (a median out of them is brought back, and is then not the group's usual let share = |t: u32| required_ratio(c.w, judged_voters(t, c.q), &p);
/// turnout), every level, quorums from 2 to W, among them the usual turnout and one more. let at = c.at();
fn as_usual_grid() -> Vec<AsUsual> { // Every number of voters on the smallest webs; beyond, around the quorum, the participation
let mut grid = Vec::new(); // habituelle and the median, W/2, W.
for w in ELECTORATES { let mut ts: Vec<u32> = if c.w <= 101 {
for usual in [w / 100 + 1, 12, 40, 50, 100, 120, 1000, w / 2] { (0..=c.w).collect()
let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9); } else {
if part.bounded { let usual = c.voters();
continue; 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);
for k in InertiaLevel::ALL { ts.extend([c.w / 2, c.w - 1, c.w]);
for q in [2, 12, 50, 100, 1000, usual, usual + 1, w].into_iter().filter(|q| (2..=w).contains(q)) { ts
grid.push(AsUsual { w, usual, p: part.ratio, k, q }); };
} 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");
} }
grid 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));
} }
/// The letters of the formula for a case of the grid (the quorums of the scale do not enter: the /// N1.1, « Les cinq crans : le quorum dans Monnaie libre, la part exigée au-delà du quorum de
/// quorum is the case's). /// l'article, à la participation habituelle, puis quand tout le monde vote » and its five lines
fn as_usual_params(c: &AsUsual) -> FormulaParams { /// (« 60 % à la participation habituelle, 50 % quand tout le monde vote »…); F1.2, « au-delà du
Scale { electorate: c.w, participation: c.p, quorums: [12, 12, 50, 50, 50] }.params(c.k, c.q) /// 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
/// N1.1 and F1.2, lot T3: the share of a level « comme d'habitude » is asked beyond the quorum /// since the review of e7ab82f. On the grid: when the participation habituelle reaches the article's
/// only. When the usual turnout reaches the quorum, the group voting as usual is asked s_k; when /// quorum, the share asked there is s_k exactly; when it does not (a quorum above it: the author's,
/// it does not (a web of fewer than 5 000 members and a median under 50 at a quorum of 50, an /// or the level's on a small web), the voters are judged as the quorum, at a share lower than s_k,
/// author's quorum above the usual turnout), it is asked the threshold of the quorum, which is /// asked of more voters than came; when everyone votes, M_k, at every quorum.
/// not s_k of those who came. Every W, every median within the bounds, every level, quorums.
#[test] #[test]
fn the_share_of_a_level_as_usual_is_asked_beyond_the_quorum() { fn the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum() {
let mut under = 0; let today = today_seed();
for c in as_usual_grid() { for (lang, intro) in [
let (s, m) = (c.k.share_pct() / 100.0, c.k.majority_pct() / 100.0); (
let params = as_usual_params(&c); "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 at = c.at();
let asked = required_ratio(c.w, judged_voters(c.usual, c.q), &params); let usual = c.voters();
if c.usual >= c.q { 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"); assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s");
beyond += 1;
} else { } else {
assert_eq!(asked, required_ratio(c.w, c.q, &p), "{at}: judged as the quorum");
assert!(asked < s - 1e-9, "{at}: {asked}"); assert!(asked < s - 1e-9, "{at}: {asked}");
under += 1; 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. // Everyone votes: M, at every quorum.
assert!((required_ratio(c.w, judged_voters(c.w, c.q), &params) - m).abs() < 1e-12, "{at}: M"); assert!((required_ratio(c.w, judged_voters(c.w, c.q), &p) - m).abs() < 1e-12, "{at}: M");
} }
assert!(under > 0); 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 // 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 // (within the bounds: 1 % is 30). At its participation habituelle, the group is asked 38 « pour »
// voters: 95 %, not 75 %. // of its 40 voters: 95 %, not 75 % — under the quorum, which the sentence leaves out.
let (w, usual) = (3000, 40); let (w, usual) = (3000, 40);
let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9); let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9);
assert!(!part.bounded); assert!(!part.bounded);
@@ -912,19 +1235,20 @@ 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"); assert_eq!(wot_threshold(w, usual, &p), Ok(38), "but 40 voters are judged as 50");
} }
/// N1.1, the sentence of G, after the review of 2ce2028. Lot T3 left « G se calcule pour que la /// N1.1, the sentence of G: « G se calcule pour que la part exigée, au-delà du quorum de l'article,
/// part exigée, à la participation habituelle, soit exactement celle du cran […], où s est la part /// soit exactement celle du cran à la participation habituelle : `G = …`, où s est cette part du
/// exigée comme d'habitude »: false where the usual turnout is under the quorum, the group voting /// cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W » — after the
/// as usual being judged on the quorum (T' = Q), lower on the curve than s, and asked of more /// reviews of 2ce2028 (« au-delà du quorum »: under it, the voters are judged as the quorum) and of
/// voters than came. Written true for every W and every quorum: G is computed so that the share /// e7ab82f (the defined term where T3b wrote « quand le groupe vote comme d'habitude »; « du quorum
/// asked, beyond the quorum, is exactly that of the level when the group votes as usual; s is that /// de l'article »). s is the share of the level, the one of the list — never « la part exigée »,
/// share of the level, the one of the list (60, 67, 75, 83 or 90 %) — never « la part exigée », /// which the formula above names and which moves with T'. On the grid, with G as the text writes
/// which the formula above it names and which moves with T'. On the grid of « comme d'habitude », /// it and p̃ the participation habituelle over W, the median brought back within its bounds: G is
/// with G as the text writes it. /// 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] #[test]
fn g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usual() { fn g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum() {
let today = today_seed(); let today = today_seed();
// The sentence of G closes N1.1, in each language; nothing of the sentence of T3 is left. // The sentence of G closes N1.1, in each language; nothing of the sentence of T2 is left.
for lang in LANGS { for lang in LANGS {
let (_, body) = text(&today, "N1.1", lang); let (_, body) = text(&today, "N1.1", lang);
let (_, _, before, now) = PHRASES_T3 let (_, _, before, now) = PHRASES_T3
@@ -933,44 +1257,50 @@ fn g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usua
.expect("the sentence of G"); .expect("the sentence of G");
assert!(body.ends_with(now), "N1.1 {lang}: the sentence of G\n{body}"); assert!(body.ends_with(now), "N1.1 {lang}: the sentence of G\n{body}");
let (said_before, _) = before.split_once(" = ").expect("the formula"); let (said_before, _) = before.split_once(" = ").expect("the formula");
assert!(!body.contains(said_before), "N1.1 {lang}: the sentence of T3 is left\n{body}"); assert!(!body.contains(said_before), "N1.1 {lang}: the sentence of T2 is left\n{body}");
let beyond = named(lang, "au-delà du quorum", "beyond the quorum", "más allá del quórum");
let (said_now, _) = now.split_once(" = ").expect("the formula"); let (said_now, _) = now.split_once(" = ").expect("the formula");
assert!(said_now.contains(beyond), "N1.1 {lang}: « {beyond} »"); 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̃). On the curve, // By the engine, with G as the text writes it (s, the share of the level; M; p̃).
// the share at the usual turnout is s, whatever the quorum: that is what G is computed for.
// The share asked of the group voting as usual is s beyond the quorum; under it, the share of
// the quorum, lower — the sentence of T3 said s there.
let grad = code_spans(text(&today, "N1.1", "fr").1)[1]; let grad = code_spans(text(&today, "N1.1", "fr").1)[1];
let (mut beyond, mut under) = (0, 0); let (mut beyond, mut under) = (0u64, 0u64);
for c in as_usual_grid() { for c in grid() {
let (s, m) = (c.k.share_pct() / 100.0, c.k.majority_pct() / 100.0); let (s, m) = (c.s(), c.m());
let env: HashMap<String, f64> = HashMap::from([("s".into(), s), ("M".into(), m), ("p̃".into(), c.p)]); let env: HashMap<String, f64> =
let engine = as_usual_params(&c); 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 params = FormulaParams { gradient: eval(grad, "G", &env), ..engine };
let at = c.at(); let at = c.at();
assert!(close(params.gradient, engine.gradient), "{at}: G"); assert!(close(params.gradient, engine.gradient), "{at}: G");
assert!((required_ratio(c.w, c.usual, &params) - s).abs() < 1e-9, "{at}: s on the curve"); let usual = c.voters();
let judged = judged_voters(c.usual, c.q); assert!((share_at(c.w, usual, &params) - s).abs() < 1e-9, "{at}: s on the curve");
let asked = required_ratio(c.w, judged, &params); let asked = share_at(c.w, usual.max(f64::from(c.q)), &params);
if c.usual >= c.q { if usual >= f64::from(c.q) {
assert_eq!(judged, c.usual, "{at}");
assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s"); assert!((asked - s).abs() < 1e-9, "{at}: {asked}, not s");
beyond += 1; beyond += 1;
} else { } else {
assert_eq!(judged, c.q, "{at}");
assert!(asked < s - 1e-9, "{at}: {asked}"); assert!(asked < s - 1e-9, "{at}: {asked}");
under += 1; under += 1;
} }
} }
assert!(beyond > 0 && under > 0, "beyond {beyond}, under {under}"); assert!(beyond > 0 && under > 0, "beyond {beyond}, under {under}");
// The case of the review: W 3 000, a usual turnout of 40 voters, level 3, quorum 50. On the // The case of the review of 2ce2028: W 3 000, a usual turnout of 40 voters, level 3, quorum 50.
// curve, 75 % at 40 voters; the share asked is that of 50 voters, 74,23 %; 38 « pour » of the // On the curve, 75 % at 40 voters; the share asked is that of 50 voters, 74,23 %; 38 « pour »
// 40 who came, 95 %. // of the 40 who came, 95 %.
let (w, usual) = (3000, 40); let (w, usual) = (3000, 40);
let c = AsUsual { w, usual, p: Participation::of(w, 50.0, Some(f64::from(usual)), 9).ratio, k: level(3), q: 50 }; let part = Participation::of(w, 50.0, Some(f64::from(usual)), 9);
let p = as_usual_params(&c); 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); assert!((required_ratio(w, usual, &p) - 0.75).abs() < 1e-12);
let asked = required_ratio(w, judged_voters(usual, c.q), &p); let asked = required_ratio(w, judged_voters(usual, c.q), &p);
assert_eq!((asked * 10_000.0).round() / 100.0, 74.23); assert_eq!((asked * 10_000.0).round() / 100.0, 74.23);
@@ -978,8 +1308,113 @@ fn g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usua
assert_eq!((needed, f64::from(needed) / f64::from(usual)), (38, 0.95)); assert_eq!((needed, f64::from(needed) / f64::from(usual)), (38, 0.95));
} }
/// N1.1, « Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de /// N1.1, « La participation habituelle est la médiane du nombre de votants des propositions du
/// référence du document : 100 votants dans Monnaie libre. […] Elle reste entre 1 % et 50 % de /// 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 /// 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 /// 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 /// voters on a web of 200 to 10 000 members only (1 % and 50 % of W); beyond, the bounds the
@@ -1002,9 +1437,9 @@ fn the_reference_turnout_is_a_parameter_the_bounds_bring_back() {
} }
// The text says the parameter first, then the bounds, in each language. // The text says the parameter first, then the bounds, in each language.
for (lang, reference, bounds) in [ for (lang, reference, bounds) in [
("fr", format!("{} votants dans Monnaie libre.", f.reference), "Elle reste entre"), ("fr", format!("{} votants dans Monnaie libre.", f.reference), "Elle est ramenée entre"),
("en", format!("{} voters in Monnaie libre.", f.reference), "It stays between"), ("en", format!("{} voters in Monnaie libre.", f.reference), "It is kept between"),
("es", format!("{} votantes en Monnaie libre.", f.reference), "Se mantiene entre"), ("es", format!("{} votantes en Monnaie libre.", f.reference), "Se acota entre"),
] { ] {
let (_, body) = text(&seed, "N1.1", lang); let (_, body) = text(&seed, "N1.1", lang);
let at = |s: &str| body.find(s).unwrap_or_else(|| panic!("N1.1 {lang}: « {s} »")); let at = |s: &str| body.find(s).unwrap_or_else(|| panic!("N1.1 {lang}: « {s} »"));
@@ -1017,7 +1452,9 @@ fn the_reference_turnout_is_a_parameter_the_bounds_bring_back() {
/// web of trust (`wot::PLAUSIBLE`, 100 to 10 000 000) — the engine's threshold is the one /// 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`): /// 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 /// 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] #[test]
fn b_to_the_power_w_never_counts_in_the_web_of_trust() { 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])); assert_eq!((*PLAUSIBLE.start(), *PLAUSIBLE.end()), (ELECTORATES[0], ELECTORATES[ELECTORATES.len() - 1]));
@@ -1027,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 usual = (p * f64::from(w)).round() as u32;
let scale = Scale { electorate: w, participation: p, quorums: [12, 12, 50, 50, 50] }; let scale = Scale { electorate: w, participation: p, quorums: [12, 12, 50, 50, 50] };
for k in InertiaLevel::ALL { 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); let with_b = scale.params(k, q);
assert_eq!(with_b.base, 0.1); assert_eq!(with_b.base, 0.1);
let without = FormulaParams { base: 0.0, ..with_b }; let without = FormulaParams { base: 0.0, ..with_b };
@@ -1199,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 [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 [share, grad] = <[&str; 2]>::try_from(code_spans(n11)).expect("two formulas in N1.1");
let mut checked = 0; let mut checked = 0;
for w in [2u32, 40, 5707, 7224] { // Lot T3c: every W of the grid, and two of a handful of members; every participation of the
for median in [None, Some(1.0), Some(9.0), Some(120.0), Some(360.0)] { // grid (both bounds among them, where medians under 1 % and above 50 % of W are brought
let p = Participation::of(w, 50.0, median, 9).ratio; // 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 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 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); 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([ let mut env: HashMap<String, f64> = HashMap::from([
("T".into(), f64::from(t)), ("T".into(), f64::from(t)),
("Q".into(), f64::from(q)), ("Q".into(), f64::from(q)),
@@ -98,3 +98,4 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa
| 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 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 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 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).
@@ -22,6 +22,14 @@
> `2ce2028`, avant la mise en ligne : la phrase de G (N1.1) écrite vraie sous le quorum, « autant 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 > « 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. > 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 ## Lot T3 : aucun chiffre daté, chaque phrase vraie pour tout W
@@ -54,6 +62,166 @@ et 50 %. Trois phrases étaient fausses quelque part, chacune prouvée par un te
corrigées au plus court. Rien d'autre ne change ; les titres restent. *(La relecture de `2ce2028` 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.)* 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 ### Après la relecture de 2ce2028
La relecture indépendante de `2ce2028` rend « à reprendre » pour une phrase, et relève deux mineurs. La relecture indépendante de `2ce2028` rend « à reprendre » pour une phrase, et relève deux mineurs.
@@ -66,7 +234,8 @@ empreinte, dans « La garde, en production »), sans en ajouter un. F1.2 et F1.1
participation habituelle divisée par W. » participation habituelle divisée par W. »
- **Après** : « **G** se calcule pour que la part exigée, au-delà du quorum, soit exactement celle - **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, 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. » 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 - **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 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 bornes), au cran 3, quorum 50 : la courbe donne 75 % à 40 votants, mais la part exigée est
@@ -79,7 +248,9 @@ empreinte, dans « La garde, en production »), sans en ajouter un. F1.2 et F1.1
formule au-dessus, qui change avec T' ; ce sont des paramètres (s de chaque cran), que le test des 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 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 `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`) : `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 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 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 quorum (970 cas), et plus basse que s, jugée sur le quorum, en dessous (700 cas), là où la phrase
@@ -149,7 +320,8 @@ participation habituelle » et « la part du cran » sans « au-delà du quorum
le quorum, les votants qui manquent comptent comme « non ». » 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 - **Après** : « 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é. » *(T3 écrivait 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.)* « 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 - **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 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 le quorum est alors un minimum de votants, à tout cran et sur toute toile (de même au quorum 1 du
@@ -169,14 +341,15 @@ participation habituelle » et « la part du cran » sans « au-delà du quorum
vote comme d'habitude, puis quand tout le monde vote, et ce qui est à ce cran au départ. » 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 - **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 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 - **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 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, 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 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 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 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 participation habituelle atteint le quorum, une part plus basse, sur plus de votants, sinon ; M
quand tout le monde vote, à tout quorum. quand tout le monde vote, à tout quorum.
- en : « the share asked beyond the quorum, when the group votes as usual, then when everyone - en : « the share asked beyond the quorum, when the group votes as usual, then when everyone
@@ -190,6 +363,7 @@ participation habituelle » et « la part du cran » sans « au-delà du quorum
libre, et le groupe demande 75 % de « pour » quand il vote comme d'habitude. » 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 - **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. » 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 - **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 (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 when it votes as usual » ; es : « y, más allá del quórum, el grupo pide un 75 % de votos a favor
@@ -221,20 +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 | | Article | Empreinte d'avant : le texte de T2, en ligne | Empreinte d'après : le texte de T3 |
|---|---|---| |---|---|---|
| F1.2 | `96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14` | `ddce5aa5fcd13dfc3e374c37509a1bb8cfafddefb6e6add5a06b130b43216d62` | | F1.2 | `96caf353b33805f2894593d72c5b70fce2e751039cd7f4651d8842c986729a14` | `0c3b800b0c72b1edd4b884c03c6c5479c17609dcf82a95b593d408821e28bb4e` |
| N1.1 | `7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8` | `7f62fd42617c6e63b1783d5a4d472ed733aa074222240faf834e6b31f1c9c166` | | N1.1 | `7fbedcb8750c208f8790c4f87dc21d8bd1096a27a1a0044af6b9b8f2057f2aa8` | `8107c5fc746121f18c8a440e86e23310c5a59ae8e92f5a07f6b098419980263c` |
L'empreinte d'après de N1.1 est celle du texte repris après la relecture de `2ce2028` (lot T3b) ; celle Les empreintes d'après sont celles des textes repris après la relecture de `e7ab82f` (lot T3c). Les
de `2ce2028`, `4289e3579ee747f6023162339ed60601b810d33462617b42a9f8b5b3735c3238`, n'a jamais été en précédentes n'ont jamais été en ligne et ne servent plus : F1.2,
ligne et ne sert plus. F1.2 ne change pas. `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 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 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 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 `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 « … : (« proposition de départ réécrite : F1.2, la part du cran par défaut au-delà du quorum, à la
N1.1, sans chiffre daté ; sous le quorum, autant de « pour » que si le quorum avait voté ; G, la part participation habituelle » et « … : N1.1, sans chiffre daté ; sous le quorum de l'article, autant de
du cran au-delà du quorum ») ; elles « 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 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 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`, jamais. Refusé, le texte de T2 reste, avec sa raison (`votes`, `ballots`, `corrected`,
@@ -399,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 ; 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 « » espacés en français, “ ” en anglais britannique (*favour*), «» serrés en espagnol ; formules en
code, avec × et −, jamais d'astérisque. code, avec × et −, jamais d'astérisque.
- **Longueur** (signes, après la relecture de `2ce2028` ; 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 2055 · N1.1 2112 ; en : F1.1 1093 · F1.2 1970 · N1.1 1987 ; es : F1.1 1126 · F1.2 2042 · N1.1 2163. 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 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. 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 - **Le ton** est celui de F1.2, N1 et O1 tels que M5 les a posés : le groupe, la personne, jamais le
@@ -549,7 +725,7 @@ Les valeurs des lettres de la formule (voir « Formule du seuil WoT ») et la fa
**Par défaut** **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. - 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.
``` ```
@@ -576,7 +752,7 @@ The values of the letters of the formula (see “WoT threshold formula”) and h
**By default** **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. - 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.
``` ```
@@ -603,7 +779,7 @@ Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y có
**Por defecto** **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. - 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.
``` ```
@@ -620,21 +796,21 @@ Los valores de las letras de la fórmula (ver «Fórmula del umbral WoT») y có
Titre : **Niveaux d'inertie** Titre : **Niveaux d'inertie**
```markdown ```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 « 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 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 % 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 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 % comme d'habitude, 55 % quand tout le monde vote. Le cran par défaut : tous les autres articles, et chaque nouvel article. - **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 % comme d'habitude, 60 % quand tout le monde vote. Le titre du document. - **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 % comme d'habitude, 66 % quand tout le monde vote. Aucun article au départ. - **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, 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. **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 ### N1.1 · English
@@ -642,21 +818,21 @@ Titre : **Niveaux d'inertie**
Titre : **Inertia levels** Titre : **Inertia levels**
```markdown ```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 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% as usual, 50% when everyone votes. Purpose, Uniqueness of the account, Reciprocity, and the order of the articles of each section. - **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% as usual, 55% when everyone votes. The default level: all other articles, and every new article. - **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% as usual, 60% when everyone votes. The title of the document. - **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% as usual, 66% when everyone votes. No article at the start. - **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, beyond the quorum, is exactly that of the level when the group votes as usual: `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. **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 ### N1.1 · Español
@@ -664,21 +840,21 @@ At each level, the group asks for a share of votes in favour among the voters (s
Titre : **Niveles de inercia** Titre : **Niveles de inercia**
```markdown ```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 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 % 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 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 % 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 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 % como de costumbre, 60 % cuando vota todo el mundo. El título del documento. - **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 % como de costumbre, 66 % cuando vota todo el mundo. Ningún artículo al inicio. - **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, más allá del quórum, sea exactamente la del nivel cuando el grupo vota como de costumbre: `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. **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 ## Les autres articles, cherchés et laissés
@@ -740,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. 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 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 ; 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 ## Les chiffres et leur source
@@ -773,8 +959,8 @@ Chaque nombre est vérifié par `every_number_of_the_quorum_texts_is_the_engine_
| Propositions seed au cran 2 | F1.2, N1.1 | `seed::SEED_PROPOSAL_LEVEL` ; les versions `seedProposal` du seed, leurs titres dans chaque langue | | 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` | | 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é) | | 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` ; 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`) | | 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`) |
| Entre 1 % et 50 % | N1.1 | `Participation::LOWEST`, `HIGHEST` | | 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 | | 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 **Lot T3** : les quatre lignes de l'exemple de N1.1 sont ôtées de ce tableau (72, 81, 90, 100 et
@@ -796,9 +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` | | 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 | | 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) | | Au départ, aucun article en vigueur | F1.2 | ADR 0011 ; le seed (aucune version `in_force` hors modules) |
| Sous le quorum, autant de « pour » que si le quorum avait voté (lot T3, puis T3b) | 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` | | 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` |
| 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` | | 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` |
| G donne la part du cran au-delà du quorum, quand le groupe vote comme d'habitude (lot T3b) | N1.1 | `inertia::gradient`, `threshold::judged_voters` ; `g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usual` | | 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` | | 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 ## Les textes dans le seed
+7 -7
View File
@@ -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 « 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).", "_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", "slug": "acte-engagement-certification",
"title": { "title": {
"fr": "Acte d'engagement Certification", "fr": "Acte d'engagement Certification",
@@ -694,9 +694,9 @@
"es": "Parámetros por defecto" "es": "Parámetros por defecto"
}, },
"body": { "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.", "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 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.", "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 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." "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" "es": "Niveles de inercia"
}, },
"body": { "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 « 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, 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.", "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 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, beyond the quorum, is exactly that of the level when the group votes as usual: `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.", "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, 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, más allá del quórum, sea exactamente la del nivel cuando el grupo vota como de costumbre: `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." "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."
} }
} }
] ]