Files
decision/docs/adr/0007-inertie-cinq-crans.md
T
YvvandClaude Opus 5.5 033b331228 Fusion de la tête du chantier (924a40d : lots B2 et F) dans le lot D
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>
2026-10-31 09:41:30 +01:00

152 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.