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:
Yvv
2026-11-03 05:32:51 +01:00
co-authored by Claude Opus 5.5
66 changed files with 5134 additions and 701 deletions
+7
View File
@@ -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
+4
View File
@@ -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
+90
View File
@@ -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.
+135
View File
@@ -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).
+2
View File
@@ -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 |