forked from yvv/decision
Fusion de chantier/acte-certification (lots H et S) dans le lot V : le tampon et ses états, avec le quorum et les Propositions seed
- conflits résolus des deux côtés : kept_params garde le quorum (S) et la part simulée, la version déplacée, le cran d'avant (V) ; proposals.rs garde seedMinimal / seedProposal (S) et tallyPending / tallySimulated / myVoteState (V) ; - simulation::reexamine juge sur le quorum gardé par l'adoption (params.quorum, à défaut celui de l'article) ; - l'acte répété n'examine plus une adoption qui tient (params.reexamined) ; - tests V repris sans texte en vigueur au départ (I1, E1 : la Proposition seed) et sur un quorum 2 (small_web) ; le test overview d'une personne invitée dans Monnaie libre suit la simulation (elle vote, chaîne fermée). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,13 @@
|
||||
> **Complétée par [0007](0007-inertie-cinq-crans.md)** (2026-10-30) : l'inertie a cinq crans,
|
||||
> calés sur la participation habituelle du groupe, et un changement d'inertie se vote au cran
|
||||
> de l'article — il n'est plus voté au cran au-dessus.
|
||||
> **Complétée par [0011](0011-propositions-seed.md)** (2026-11-02) : aucun article n'est en
|
||||
> vigueur au départ ; les textes de départ des articles sont des Propositions seed, seuls les
|
||||
> modules restent des *seeds a minima*.
|
||||
> **Le plancher C est remplacé par [0013](0013-quorum.md)** (2026-11-03) : un quorum Q par
|
||||
> cran (12 · 12 · 50 · 50 · 50 dans Monnaie libre, 1 dans le groupe d'essai), que l'auteur
|
||||
> d'un article peut changer avant le premier vote ; sous le quorum, les votants qui manquent
|
||||
> comptent comme « non ». `vote_floor` reste, comme quorum de référence de p0.
|
||||
|
||||
**Contexte.** Chaque article est sous vote permanent ; « dès qu'une proposition atteint le score,
|
||||
elle remonte en vigueur ». La formule inertielle Ğ1 donne un seuil faible quand peu de gens
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
> 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).
|
||||
> **Le C de la formule est remplacé par [0013](0013-quorum.md)** (2026-11-03) : R = B^W +
|
||||
> ratio(T')·T', T' = max(T, Q), un quorum Q par cran. M, G_k, s_k, p̃ et ses bornes restent ;
|
||||
> « au-delà de C » se lit désormais « parmi les T' votants » ; les nombres ci-dessous sont ceux
|
||||
> d'avant (ceux d'après : ADR 0013).
|
||||
|
||||
**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
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
# 0011 — Les Propositions seed : rien en vigueur au départ, trois textes mis en avant
|
||||
|
||||
> Remplace, dans [0002](0002-vote-permanent.md), « les textes de départ sont des *seeds a
|
||||
> minima* » pour les articles : seuls les modules (le titre, l'ordre de chaque section, ADR 0009)
|
||||
> restent en vigueur sans vote. Décision d'Yvv du 2026-11-02.
|
||||
|
||||
**Contexte.** Depuis le 2026-10-21, la Raison d'être (I1) et les deux engagements fondamentaux,
|
||||
Unicité du compte (E1) et Réciprocité (E2), étaient en vigueur au départ, sans vote (*seeds a
|
||||
minima*, marge −C). Yvv, 2026-11-02 : « pour le démarrage, conserve un statut particulier pour
|
||||
les 3 premiers modules. Mais ils ne sont pas en vigueur. Appelle les "Proposition seed" (intégré
|
||||
par un ou deux clients pour amorcer le mouvement de vote). » Puis : « on pouvait l'amorcer avec
|
||||
une inertie basse, pour que le nombre de votes initiaux soit assez petits pour commencer
|
||||
l'expérience en mode prod. Et je mettrai, une fois les textes passés, une inertie forte pour
|
||||
éviter que l'inertie passe avant les textes. » Au formulaire du même jour : le cran 2
|
||||
(« basse ») ; la publication « Suspendre jusqu'au 1er texte ».
|
||||
|
||||
## Décision
|
||||
|
||||
- **Une Proposition seed** est une proposition ouverte du seed, mise en avant pour lancer le
|
||||
vote : I1, E1 et E2 de l'Acte d'engagement Certification, dans chaque groupe. Elle **n'est pas
|
||||
en vigueur** : elle y entre comme toute proposition, par son seuil, la place étant vide. Sa
|
||||
marque est écrite à part (`proposals.seed_featured`) ; l'API dit `seedProposal` tant que la
|
||||
version est ouverte et n'est jamais entrée en vigueur (`docs::ProposalRow::seed_proposal`).
|
||||
Entrée en vigueur, c'est un texte adopté comme un autre. L'interface la marque
|
||||
« Proposition seed » (fr), « Seed proposal » (en), « Propuesta seed » (es).
|
||||
- **Au départ, aucun article n'est en vigueur.** Le titre du document et l'ordre de chaque
|
||||
section restent des *seeds a minima* (en vigueur sans vote, ADR 0009). Le lecteur le dit
|
||||
(« Aucun article n'est en vigueur… ») ; les trois textes se lisent dans « Propositions en
|
||||
cours » et dans l'aperçu « si tout passe ».
|
||||
- **Le cran 2 pour les trois**, une seule constante : `seed::SEED_PROPOSAL_LEVEL`. Le seed ne
|
||||
leur donne pas de cran (le chargement du seed le refuse), l'amendement écrit celui-là.
|
||||
**L'intention d'Yvv** : remonter l'inertie une fois les textes passés. Une proposition de
|
||||
changement d'inertie se vote au cran de l'article (ADR 0007) : faite avant l'entrée des textes,
|
||||
elle pourrait passer avant eux et leur demander davantage ; faite après, elle protège des
|
||||
textes déjà adoptés. Le serveur n'automatise rien : c'est un vote, après les textes.
|
||||
- **La publication attend le premier texte.** Tant qu'aucun article d'un document n'est en
|
||||
vigueur, sa file d'envoi attend (`publish::waits_for_a_text`) : ce n'est pas un échec (aucune
|
||||
tentative comptée, aucune erreur), l'API dit `publication.state = "suspended"`. Le premier
|
||||
texte qui entre ajoute une ligne à la file, et tout part avec lui. `LD_PUBLISH_WITHOUT_ARTICLES=1`
|
||||
publie quand même (un document sans article). Le groupe d'essai ne publie jamais.
|
||||
|
||||
## Une base existante
|
||||
|
||||
Un document seedé n'est jamais réinstancié. Dans une base existante (la production : I1, E1 et
|
||||
E2 en vigueur, *seeds a minima*, dans Monnaie libre et dans le groupe d'essai), trois
|
||||
**amendements de Proposition seed** (`crates/ld-server/src/seed_proposal_amend.rs`,
|
||||
`2026-11-02-i1-proposition-seed`, `-e1-`, `-e2-`) décident une fois par document et par article,
|
||||
consignés dans `seed_proposal_amendments` et dans les journaux.
|
||||
|
||||
**Le statut**, seulement si personne n'a touché le texte en vigueur : origine `seed`, jamais
|
||||
entré par un vote ni confirmé ; aucun vote du serveur, aucune ligne de bulletin de la chaîne,
|
||||
quel que soit son sort ; aucune coquille (appliquée, en attente ou refusée), aucune traduction
|
||||
écrite par un membre, aucune objection qui le nomme ; son historique est celui du seed (le texte
|
||||
initial, et pour I1 l'amendement de la Raison d'être du 30/10, révision 2) ; son texte est celui
|
||||
de la Proposition seed d'aujourd'hui (empreinte). Appliqué : la même version, avec son texte, ses
|
||||
traductions et son historique, devient ouverte et marquée ; l'article n'a plus de texte en
|
||||
vigueur ; l'historique dit le changement (`seed_proposal`, sans diff). Refusé : le texte reste en
|
||||
vigueur, *seed a minima*.
|
||||
|
||||
**Le cran**, avec le statut seulement, et seulement si personne n'y a touché : aucune proposition
|
||||
de changement d'inertie d'un membre ouverte, appliquée ou votée, aucun vote qui l'a changé, et un
|
||||
cran que le seed lui a donné avant (I1 : 3 ; E1 et E2 : 3, puis 4 depuis le 30/10). Appliqué :
|
||||
l'article le dit (`inertia_changes`, « réglage de départ du texte »). Refusé : il garde son cran,
|
||||
le statut change quand même.
|
||||
|
||||
**En production**, l'orch notait le 30/10 deux propositions d'inertie ouvertes à zéro vote dans
|
||||
Monnaie libre, I1 → 5 et E1 → 5. Si elles sont encore ouvertes au démarrage, I1 et E1 y
|
||||
deviennent des Propositions seed **à leur cran d'avant** (3 et 4 ; refus `inertia_proposal`), E2
|
||||
au cran 2. Pour que les trois démarrent au cran 2, leurs auteurs les retirent avant la mise en
|
||||
ligne (une proposition retirée sans vote ne compte plus). À trancher par Yvv avant M6.
|
||||
|
||||
Là où le document publie (Monnaie libre), chaque amendement appliqué ajoute une ligne à la file
|
||||
(« Proposition seed : I1 sort de la vigueur »…), qui attend le premier texte. Les deux
|
||||
amendements d'inertie du 30/10 (E1 et E2 de 3 à 4, ADR 0007) sont dépassés : décidés en
|
||||
production, ils ne décident plus rien ailleurs (`superseded_by`).
|
||||
|
||||
## Les données
|
||||
|
||||
Migration `0009` (additive) : `proposals.seed_featured` ; la table `seed_proposal_amendments`
|
||||
(statut et cran : appliqué, refusé et pourquoi, ou déjà là). Le seed : `"seedProposal": true` et
|
||||
`"status": "open"` sur la version de I1, E1 et E2, sans `inertia`.
|
||||
|
||||
## Coût
|
||||
|
||||
- Personne ne lit de texte en vigueur avant le premier vote qui passe ; le dépôt des textes
|
||||
garde la dernière publication jusque-là.
|
||||
- Les comptes bougent : 0 article en vigueur, 35 propositions en cours (les 32 d'avant et les
|
||||
trois Propositions seed) ; « Décisions » compte toujours 41 modules à voter.
|
||||
- Les textes F1.2 et N1.1 du seed disent encore Unicité du compte et Réciprocité au cran 4 au
|
||||
départ : orch les réécrira au prochain tour de textes, avec la relecture d'Yvv.
|
||||
@@ -0,0 +1,135 @@
|
||||
# 0013 — Le quorum : les votants qui manquent comptent comme « non »
|
||||
|
||||
> Remplace, dans [0002](0002-vote-permanent.md) et [0007](0007-inertie-cinq-crans.md), le
|
||||
> plancher C de voix pour placé devant la formule. Décisions d'Yvv du 2026-11-02 et du
|
||||
> 2026-11-03. La migration est la `0011` : la `0010` reste au lot V.
|
||||
|
||||
**Contexte.** Depuis le 2026-10-21, `R = C + B^W + (M + (1 − M)(1 − (T/W)^G)) · max(0, T − C)` :
|
||||
C voix pour d'abord (50 dans Monnaie libre, 1 dans le groupe d'essai), puis la part de l'inertie
|
||||
sur les votes au-delà. Yvv, 2026-11-02 : « C suit le cran, mais c'est une proposition par
|
||||
défaut, variable modifiable par l'auteur initial du texte » ; « ce n'est pas un nombre de vote
|
||||
pour a priori, c'est plutôt un quorum, à partir de ce nombre, alors il faut la bonne proportion
|
||||
attendue par l'indice. Si c'est 60 % et c = 10, alors il faut 6 voix pour et ça passe. » Au
|
||||
formulaire : « La courbe d'aujourd'hui, après le quorum » ; les quorums par défaut
|
||||
« 12 · 12 · 50 · 50 · 50 », le groupe d'essai à 1 partout ; « L'auteur, avant le 1er vote ».
|
||||
Le 2026-11-03, à « Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? » :
|
||||
« Ils comptent comme non ».
|
||||
|
||||
## Décision
|
||||
|
||||
**La formule, jugée sur un quorum Q** (`crates/ld-engine/src/threshold.rs`) :
|
||||
|
||||
```
|
||||
T' = max(T, Q)
|
||||
R = B^W + (M + (1 − M)·(1 − (T'/W)^G)) · T'
|
||||
```
|
||||
|
||||
Une version passe si au moins une voix est exprimée et si « pour » ≥ ⌈R⌉. Sous le quorum, les
|
||||
votants qui manquent comptent comme « non » : la part de l'inertie est demandée à Q votants.
|
||||
La règle tient dans **une seule fonction nommée**, `threshold::judged_voters`, qui porte la
|
||||
phrase d'Yvv. M, G et les cinq crans ne changent pas (ADR 0007) : la courbe est celle
|
||||
d'aujourd'hui, après le quorum. L'exemple d'Yvv (60 %, Q = 10) donne 6 « pour » ; 6 « pour »
|
||||
contre 5 « contre » ne passent pas, 7 contre 4 passent.
|
||||
|
||||
**Monotone.** Un « pour » de plus ne nuit jamais, un « contre » de plus n'aide jamais : à
|
||||
« pour » fixé, un « contre » de plus laisse T' à Q ou l'augmente, et ratio(T')·T' ne décroît pas
|
||||
avec T' (sa dérivée reste entre 0,06 et 1 pour les cinq crans, p̃ dans ses bornes). Les tests
|
||||
le vérifient sur une grille (`an_against_never_helps`, l'équivalence de `passes` avec
|
||||
`yes_needed` et `no_needed`).
|
||||
|
||||
**Ce que l'écran peut dire** (`Evaluation`) : `quorum` ; `yesNeeded`, le total de « pour » qui
|
||||
passe avec les « contre » d'aujourd'hui ; `noNeeded`, le total de « contre » qui tient les
|
||||
« pour » d'aujourd'hui en échec (0 : le quorum les tient déjà) ; `missing = yesNeeded − pour` ;
|
||||
`wellRated`, la part de l'inertie tenue sur les T votants venus, le quorum mis de côté
|
||||
(l'aperçu « si les bien cotées passent »).
|
||||
|
||||
**Un quorum par cran**, le défaut d'un article à ce cran (`documents.quorums`) : Monnaie libre
|
||||
**12 · 12 · 50 · 50 · 50**, le groupe d'essai **1 partout**. Une proposition d'inertie se juge
|
||||
sur le quorum de son article (elle hérite de son cran, ADR 0007) ; un module, sur celui de son
|
||||
cran.
|
||||
|
||||
**Le quorum d'un article** (`units.quorum`, NULL : celui du cran) est fixé par l'auteur de sa
|
||||
première version — pour un texte du seed, sans auteur, par un administrateur —, et seulement
|
||||
**avant le premier vote** : `trustin_access::sets_quorum`, la route `PUT /units/{id}/quorum`
|
||||
(`{ "quorum": n | null }`, en-tête CSRF), dans `crates/ld-server/src/quorum.rs`. Bornes : de 2
|
||||
à W (une voix seule ne fait jamais passer un texte), de 1 à W dans le groupe d'essai
|
||||
(`ld_engine::inertia::quorum_bounds`, `trustin_access::TEST_GROUP`). Chaque changement est
|
||||
consigné (`quorum_changes` : qui, de quoi, à quoi, quand). Refus : 403 à qui n'est pas
|
||||
l'auteur, 400 `quorum` hors des bornes, 409 `voted` dès qu'un vote existe.
|
||||
|
||||
**« Un vote existe »** : une seule fonction, `quorum::voted_units` (et `quorum::a_vote_exists`
|
||||
pour une unité), que le lot V étendra là et nulle part ailleurs. Sur l'une des versions de
|
||||
l'article (textes, retrait, changement d'inertie ; toute révision) : un vote du serveur
|
||||
(`votes`) ; une ligne de bulletin de la chaîne en attente ou confirmé (un bulletin refusé ou
|
||||
expiré n'est pas un vote) ; une adoption (une version entrée en vigueur par le vote en garde la
|
||||
trace, même ses votes retirés). **Limite connue** : un vote du serveur retiré avant toute
|
||||
adoption ne laisse pas de ligne (`votes` ne garde que le dernier choix) ; après lui, l'auteur
|
||||
peut de nouveau fixer le quorum.
|
||||
|
||||
**La participation de référence** reste p0 = 2Q₀/W, Q₀ le quorum de référence du document
|
||||
(`documents.vote_floor` : 50 dans Monnaie libre, 1 dans le groupe d'essai), **jamais le quorum
|
||||
d'un article** : un auteur qui baisserait le sien déplacerait l'échelle de tout le groupe.
|
||||
|
||||
## Une base existante
|
||||
|
||||
Un document seedé n'est jamais réinstancié. Tant que `documents.quorums` est NULL, chaque cran
|
||||
lit `vote_floor` (le C d'avant : 50 et 1). L'**amendement de quorums**
|
||||
`2026-11-03-quorums-par-cran` (`crates/ld-server/src/quorum_amend.rs`) décide une fois par
|
||||
document, seulement si le seed d'aujourd'hui donne ces quorums à l'instance : NULL → écrit
|
||||
(`applied`) ; les mêmes → `present` ; d'autres → refusé (`quorums_set`), gardés tels quels.
|
||||
Chaque décision est consignée (`quorum_amendments` : ce qui était là, ce que dit le seed,
|
||||
l'issue, la raison) et dans les journaux ; là où le document publie (Monnaie libre), une ligne
|
||||
s'ajoute à la file (« quorums par cran : 12 · 12 · 50 · 50 · 50 (ADR 0013) »), qui attend le
|
||||
premier texte (ADR 0011). Rien d'autre n'est touché : ni le quorum propre d'un article, ni un
|
||||
vote, ni un texte.
|
||||
|
||||
## Les nombres
|
||||
|
||||
Monnaie libre, W = 5 745 (repli des tests), participation de référence (100 votants) :
|
||||
|
||||
| | cran 1 | cran 2 | cran 3 | cran 4 | cran 5 |
|
||||
|---|---|---|---|---|---|
|
||||
| quorum | 12 | 12 | 50 | 50 | 50 |
|
||||
| « pour » à 0 vote (C d'avant : 50) | 8 | 9 | 39 | 43 | 46 |
|
||||
| « pour » à 100 votants (C d'avant : 80 · 84 · 88 · 92 · 95) | 60 | 67 | 75 | 83 | 90 |
|
||||
|
||||
Au cran 2, quorum 12 : 9 « pour » passent avec 3 « contre » au plus ; 9 contre 4 demandent 11
|
||||
(`yesNeeded`), il en manque 2 ; 8 « pour » ne passent pas même sans « contre » (`noNeeded` 0).
|
||||
|
||||
W = 7 224 (tests `ld-engine/src/inertia.rs`), « pour » exigés :
|
||||
|
||||
| Médiane | T | cran 1 | cran 2 | cran 3 | cran 4 | cran 5 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 120 votants | 120 | 72 | 81 | 90 | 100 | 108 |
|
||||
| 120 votants | 500 | 284 | 310 | 347 | 386 | 424 |
|
||||
| 120 votants | 2 000 | 1 068 | 1 123 | 1 252 | 1 389 | 1 537 |
|
||||
| 360 votants | 120 | 76 | 86 | 96 | 106 | 113 |
|
||||
| 360 votants | 360 | 216 | 242 | 270 | 299 | 324 |
|
||||
| 360 votants | 500 | 296 | 328 | 367 | 407 | 443 |
|
||||
| 360 votants | 2 000 | 1 092 | 1 164 | 1 301 | 1 446 | 1 598 |
|
||||
|
||||
Le cas de référence de la formule (vote forgeron v2.0.0 : W 7 224, 120 votants, M 50 %, G 0,2,
|
||||
Q 0 → 94 voix) reste le test de la formule elle-même.
|
||||
|
||||
## Les données
|
||||
|
||||
Migration `0011` (additive) : `documents.quorums` (JSON des cinq quorums), `units.quorum`, les
|
||||
tables `quorum_changes` et `quorum_amendments`. Le seed : `"quorums"` sur chaque instance.
|
||||
`vote_floor` reste, lu pour p0. Les adoptions nouvelles gardent `quorum` dans leurs `params`
|
||||
(celles d'avant gardent `constant`, lu tel quel). L'API : `doc.quorums`, `levels[].quorum`,
|
||||
l'unité `quorum` (le sien ou `null`), `quorumDefault`, `canSetQuorum` ; le `document.json`
|
||||
publié : `quorums`.
|
||||
|
||||
## Coût
|
||||
|
||||
- Les seuils de Monnaie libre baissent à faible participation : 9 « pour » au lieu de 50 pour
|
||||
I1, E1 et E2 au cran 2 ; 39 au lieu de 50 au cran 3. À la participation habituelle, la part
|
||||
s_k s'applique à tous les votants, plus seulement au-delà de C.
|
||||
- **Dans le groupe d'essai, une voix seule passe**, à tout cran et quel que soit le nombre de
|
||||
membres (avant : deux voix sous 16 membres). Les tests qui demandent deux voix y posent le
|
||||
quorum 2 de l'article, comme son auteur le ferait.
|
||||
- En production, si les propositions d'inertie I1 → 5 et E1 → 5 restent ouvertes (ADR 0011),
|
||||
I1 et E1 restent aux crans 3 et 4 : leur quorum est 50, pas 12.
|
||||
- Le texte F1.1 du seed (« Seuil = C + B^W + … ») et N1.1 (« le groupe demande d'abord C voix
|
||||
pour ») décrivent encore C : orch les réécrira au prochain tour de textes, avec la relecture
|
||||
d'Yvv (ce lot ne touche pas aux textes du seed).
|
||||
@@ -15,4 +15,6 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan
|
||||
| [0008](0008-vote-par-transaction.md) | Le vote par transaction sur la chaîne Ğ1 : bulletin scellé, confirmation par l'indexeur, le dernier fait foi | 2026-10-30 |
|
||||
| [0009](0009-modules-ordre-et-titre.md) | Les modules : l'ordre des articles de chaque section (inertie 2), le titre du document (inertie 4) | 2026-10-31 |
|
||||
| [0010](0010-objections-et-coquilles-validees.md) | Objections « redit » / « contredit », coquilles validées, messagerie (remplace 0004, complète 0003) | 2026-10-31 |
|
||||
| [0011](0011-propositions-seed.md) | Les Propositions seed : rien en vigueur au départ, trois textes mis en avant au cran 2, la publication attend le premier texte (complète 0002) | 2026-11-02 |
|
||||
| [0012](0012-tampon-des-votes.md) | Le tampon des votes : l'intention visible tout de suite, la preuve de la chaîne, la réconciliation a posteriori ; la simulation tant que la chaîne est fermée (complète 0008, révise 0010) | 2026-11-02 |
|
||||
| [0013](0013-quorum.md) | Le quorum par cran (12 · 12 · 50 · 50 · 50), fixé par l'auteur avant le premier vote ; sous le quorum, les votants qui manquent comptent comme « non » (remplace le C de 0002 et 0007) | 2026-11-03 |
|
||||
|
||||
Reference in New Issue
Block a user