Les deux côtés gardés partout. Aux coutures : - une objection (redit / contredit) porte sur deux articles, jamais sur un module ; un ordre ne se corrige pas, ni par son auteur ni par un autre ; une coquille du titre suit le chemin de F (l'auteur du titre, un administrateur pour le titre de départ, ou 3 jours), et documents.title suit à l'application ; - votable() couvre les modules ; leurs totaux passent par shown_tally, à l'écran et dans document.json ; - « Modules à voter » ne compte plus une version retenue par une objection (test vu rouge) ; la liste du groupe la compte toujours parmi les propositions en cours ; - le panier : une fonction pour les articles et les modules, avec les versions retenues de F ; un nouvel article se propose dans une section, à sa fin, et peut répondre à une objection ; - migrations 0007 (modules) puis 0008 (objections) ; - C25 et C26 supportent un groupe d'essai où une voix suffit (dès 16 membres). Boucle : fmt, clippy -D warnings, cargo test (227), svelte-check 0, vitest 55, build, e2e 35 / 35 (C1–C33 et M1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
152 lines
9.3 KiB
Markdown
152 lines
9.3 KiB
Markdown
# 0007 — Inertie à cinq crans, calée sur la participation du groupe
|
||
|
||
> Complète [0002](0002-vote-permanent.md) : la règle « l'inertie se vote au cran au-dessus »
|
||
> y est remplacée par l'héritage décrit ici. Décision d'Yvv du 2026-10-30 (revue, L10).
|
||
|
||
**Contexte.** Quatre niveaux (`low`, `standard`, `high`, `max`) fixaient M et G une fois pour
|
||
toutes. Yvv, 2026-10-30 : « L'indice d'inertie doit avoir 5 niveaux. Tu mets par défaut au
|
||
milieu (3) pour toutes les propositions, (4) pour les 2 engagements structurels » ; « par
|
||
défaut l'inertie de l'indice d'inertie lui-même hérite de l'inertie de l'article » ; « une
|
||
échelle cohérente qui s'adapte aux nombres de certifiés et à la participation médiane aux
|
||
votes du groupe ». Au formulaire, il a choisi l'échelle **calée sur la participation** :
|
||
chaque cran exige une part fixe de « pour » quand le groupe vote comme d'habitude, puis se
|
||
relâche vers la majorité M quand plus de monde vote.
|
||
|
||
## Décision
|
||
|
||
**La formule reste celle de la Ğ1**, adoptée si « pour » ≥ ⌈R⌉ :
|
||
|
||
```
|
||
R = C + B^W + (M + (1 − M)·(1 − (T/W)^G)) · max(0, T − C)
|
||
```
|
||
|
||
Seuls M et G dépendent du cran k. M_k est la majorité à pleine participation ; s_k la part de
|
||
« pour » exigée **au-delà de C** à la participation habituelle p̃ ; G_k s'en déduit :
|
||
|
||
```
|
||
s_k = M_k + (1 − M_k)·(1 − p̃^G_k) ⇔ G_k = ln(1 − (s_k − M_k)/(1 − M_k)) / ln(p̃)
|
||
```
|
||
|
||
| Cran | Nom | M_k | s_k |
|
||
|---|---|---|---|
|
||
| 1 | très basse | 50 % | 60 % |
|
||
| 2 | basse (l'ordre des articles de chaque section, ADR 0009) | 50 % | 67 % |
|
||
| 3 | moyenne (par défaut) | 55 % | 75 % |
|
||
| 4 | haute (E1, E2 ; le titre du document, ADR 0009) | 60 % | 83 % |
|
||
| 5 | très haute | 66 % | 90 % |
|
||
|
||
**La participation habituelle p̃** d'un groupe (`crates/ld-server/src/participation.rs`) :
|
||
|
||
- l'échantillon : les propositions du groupe (tous ses documents, toutes sortes, modules
|
||
compris) **ouvertes, en vigueur ou appliquées** — statuts `open`, `in_force`, `applied`,
|
||
nommés un par un dans la requête — qui portent au moins un vote sur leur révision actuelle,
|
||
le dernier exprimé depuis moins de 365 jours. Les brouillons et les propositions retirées
|
||
n'en sont pas ; un statut qui viendrait à exister n'y entre pas tant qu'il n'est pas nommé
|
||
(lot D, 2026-10-31 : la liste d'exclusion `NOT IN ('draft', 'withdrawn')` laissait entrer
|
||
tout statut nouveau sans qu'on l'ait décidé ; test
|
||
`the_usual_participation_counts_the_statuses_it_names_and_only_those`) ;
|
||
- T de chacune est compté **au moment de la mesure** : c'est le T que voit la formule, le vote
|
||
étant permanent ;
|
||
- T̃ = la médiane de ces T (moyenne des deux du milieu pour un nombre pair) ; p̃ = T̃ / W, avec le
|
||
W du moment : quand la toile grandit, l'échelle demande toujours s_k au même nombre habituel
|
||
de votants ;
|
||
- il faut **au moins 5** propositions votées ; avant, la **référence** p0 = 2C/W s'applique
|
||
(Monnaie libre : 100 votants sur 7 224, 1,38 %) — deux fois le plancher, une participation
|
||
que le groupe doit de toute façon atteindre pour que C laisse place à la majorité.
|
||
|
||
**Les bornes.** p̃ (mesurée ou de référence) est ramenée dans **[1 %, 50 %]**. Ainsi
|
||
0 < p̃ < 1, ln(p̃) est négatif et fini ; comme M_k < s_k < 1 pour chaque cran,
|
||
0 < 1 − (s_k − M_k)/(1 − M_k) < 1 et G_k est fini et positif (de 0,05 à 1,77). Alors :
|
||
|
||
- **le seuil croît avec le cran** : la part exigée vaut 1 − (1 − M_k)·(T/W)^G_k, croissante en
|
||
M_k et en G_k, et M_k, G_k croissent avec k (à pleine participation, les crans 1 et 2 se
|
||
rejoignent à M = 50 %) ;
|
||
- **la part exigée décroît vers M quand la participation monte**, et vaut M à T = W ;
|
||
- **à p̃, la part au-delà de C vaut s_k** ;
|
||
- **C reste un plancher** : à T ≤ C, R = C + B^W ; une seule voix ne fait jamais passer un
|
||
texte dans Monnaie libre ;
|
||
- le groupe d'essai (W = 2, C = 1) : la référence vaut 100 %, ramenée à 50 % ; G reste fini ;
|
||
il faut les deux voix, à tout cran. Cette garde tient à B^W : dès 16 membres, 0,1^W passe sous
|
||
la précision du calcul (1 + 10⁻¹⁶ = 1), et une voix seule suffit alors, C valant 1. Monnaie
|
||
libre n'est pas concernée (C = 50).
|
||
|
||
Les réglages de la formule disent les deux, dans cet ordre (lot D) : la mesure telle quelle — sa
|
||
part est celle de la valeur elle-même, une médiane de 2,5 votants sur 4 fait 62,5 %, jamais
|
||
« 3 sur 4 » arrondi d'abord (`web/src/lib/participation.ts`, `usualShown`) —, puis ce que le
|
||
groupe en fait quand elle est ramenée : « le groupe demande ses voix pour comme si 2 personnes
|
||
votaient (50 %) » (contrôle C27).
|
||
|
||
La borne basse limite aussi l'effet de propositions à une voix multipliées pour faire baisser
|
||
la médiane (une médiane basse adoucit les seuils au-dessus d'elle) : à 1 % près, l'effet est
|
||
borné, et il faudrait plus de propositions de ce genre que de vraies. Les propositions retirées
|
||
sortent de l'échantillon (relecture de `a576b68`, 2026-10-30) : sinon, créer cinq propositions, y
|
||
voter puis les retirer tirerait la médiane vers le bas sans laisser de trace visible, et leurs
|
||
votes ne pourraient plus être repris.
|
||
|
||
**Le recalcul : une fois par jour.** La mesure est gardée dans `settings`
|
||
(`participation:<groupe>` : médiane, taille de l'échantillon, date) ; elle est reprise au
|
||
démarrage puis par le balayage (toutes les 5 minutes) dès qu'elle a 24 heures. Un seuil qui
|
||
bougerait à chaque vote exprimé ailleurs dans le groupe ne se lirait pas ; une fois par jour,
|
||
il reste stable dans la journée et suit pourtant la vie du groupe. W, lui, change à son rythme
|
||
(la toile, toutes les 6 heures), et p̃ = T̃ / W le suit aussitôt.
|
||
|
||
**L'inertie de l'inertie hérite du cran de l'article.** Une proposition de changement
|
||
d'inertie se vote au cran actuel de l'article (`compose::voting_level`), comme son texte —
|
||
plus au cran au-dessus. Le cran se change en proposant l'un des cinq crans.
|
||
|
||
**Un entier reste un entier.** Le calcul flottant de ln et de la puissance peut porter un
|
||
milliardième de voix : un seuil qui tombe juste sur un entier (90 % de 70 = 63) ne doit pas
|
||
monter d'une voix pour autant. La part inertielle est ramenée à l'entier quand elle en est à
|
||
moins de 10⁻⁹ (`threshold::settle`) ; cas réel : 101 membres qui votent tous, M = 55 %, C = 1,
|
||
il faut 56 voix, et non 57.
|
||
|
||
## Les nombres
|
||
|
||
W = 7 224, C = 50 ; voix pour exigées (tests `ld-engine/src/inertia.rs`) :
|
||
|
||
| Médiane | T | cran 1 | cran 2 | cran 3 | cran 4 | cran 5 |
|
||
|---|---|---|---|---|---|---|
|
||
| 120 votants | 120 | 92 | 97 | 103 | 109 | 113 |
|
||
| 120 votants | 500 | 306 | 329 | 362 | 397 | 432 |
|
||
| 120 votants | 2 000 | 1 091 | 1 145 | 1 271 | 1 404 | 1 549 |
|
||
| 360 votants | 120 | 95 | 101 | 106 | 112 | 116 |
|
||
| 360 votants | 360 | 236 | 258 | 283 | 308 | 329 |
|
||
| 360 votants | 500 | 316 | 345 | 381 | 416 | 449 |
|
||
| 360 votants | 2 000 | 1 114 | 1 184 | 1 318 | 1 460 | 1 608 |
|
||
|
||
Le cas de référence de la formule (vote forgeron v2.0.0 : W 7 224, 120 votants, M 50 %,
|
||
G 0,2, C 0 → 94 voix) reste le test de la formule elle-même, lettres données ; ce ne sont plus
|
||
les lettres d'aucun cran.
|
||
|
||
## Les données
|
||
|
||
- Migration `0005` : les quatre mots deviennent des crans (low → 2, standard → 3, high → 4,
|
||
max → 5 ; le cran 1 est nouveau) dans `units.inertia` et `proposals.inertia_target`. Chaque
|
||
mot est d'abord gardé tel quel (`inertia_legacy`, `inertia_target_legacy`) ; les `params`
|
||
des `adoptions` passées ne sont pas touchés (ils portent les M et G de leur jugement). Le
|
||
serveur lit toujours les quatre mots. Les adoptions nouvelles gardent en plus le cran, s_k
|
||
et p̃ (sa source, l'échantillon, la médiane).
|
||
- Le seed : 3 partout, 4 pour E1 et E2.
|
||
- Dans une base existante, E1 et E2 passent de 3 à 4 par un **amendement d'inertie**
|
||
(`crates/ld-server/src/inertia_amend.rs`), dans la lignée des amendements de seed : décidé
|
||
une fois par document, seulement si **aucun vote n'a changé l'inertie de l'article** (pas
|
||
d'adoption d'inertie, cran encore celui du seed). Une proposition d'inertie ouverte ne
|
||
l'arrête pas : elle reste ouverte et se vote au nouveau cran. Chaque décision est gardée
|
||
(`inertia_amendments`), écrite dans les journaux, se lit sur l'article (`inertia_changes` :
|
||
« passée de 3 à 4 : réglage de départ du texte ») et le document est republié.
|
||
|
||
## Coût
|
||
|
||
- Les seuils de Monnaie libre changent. Avec W = 7 224, C = 50 et la référence (100 votants),
|
||
le cran 3 demande 103 voix à 120 votants (`standard` : 105), 360 à 500 (369), 1 265 à 2 000
|
||
(1 246), 3 996 quand tout le monde vote (3 637, M passant de 50 à 55 %) : un peu moins
|
||
jusqu'à un millier de votants, plus au-delà. Le cran 4 demande 108 à 120 votants (`high` :
|
||
115), 395 à 500 (439), autant à pleine participation (M 60 %). Rien n'est en vigueur par un
|
||
vote aujourd'hui ; les seuils déjà affichés bougent.
|
||
- Le seuil d'une proposition dépend désormais des autres votes du groupe, par la médiane : une
|
||
fois par jour, un texte peut passer ou ne plus passer sans nouveau vote sur lui (comme quand W
|
||
change). Chaque entrée en vigueur garde la médiane qui l'a jugée.
|
||
- Le document publié (`document.json`) porte l'inertie en nombre (1 à 5), et non plus en mot.
|
||
- Le texte N1.1 du seed (« Niveaux d'inertie », quatre niveaux) est une proposition de la
|
||
communauté : il n'est pas modifié et décrit désormais autre chose que la règle en place.
|