Files
decision/docs/adr/0010-objections-et-coquilles-validees.md
T
YvvandClaude Opus 5.5 e7dda2ff47 ADR 0012 : le tampon des votes — l'intention tout de suite, la preuve de la chaîne, la réconciliation ; la simulation tant que la chaîne est fermée (lot V)
Demande d'Yvv du 02/11 : « je vois ce que j'ai fait sans attendre », contrôle a
posteriori (bien unique, bien le dernier qui vaut), et le vote simulé partout
dans Monnaie libre tant que LD_VOTE_ACCOUNT n'est pas posé. Révise une phrase de
0010 : un « pour » prouvé pendant une objection est écarté.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 05:31:46 +01:00

139 lines
10 KiB
Markdown

# 0010 — Objections « redit » / « contredit », coquilles validées, messagerie
> Remplace [0004](0004-contradictions-signalees.md) (contradictions signalées) et complète
> [0003](0003-corriger-n-est-pas-voter.md) (corriger n'est pas voter), dont la règle de la coquille
> ne change pas. Décisions d'Yvv du 2026-10-30 (revue) ; la messagerie dans l'application et la
> coquille d'un texte du seed validée par un administrateur sont les choix par défaut d'orch.
> Lot F, 2026-10-31. **Révisée le 2026-11-01** (décision d'Yvv, lot G) : sur une version
> retenue, on peut encore retirer son vote ou voter « contre », jamais ajouter un « pour ».
> **Révisée par [0012](0012-tampon-des-votes.md)** (2026-11-02, lot V) : un « pour » dont la
> preuve arrive sur la chaîne pendant qu'une objection retient la version est écarté ; il ne
> compte plus « tel qu'il est signé ».
**Contexte.** Le signalement de contradiction (0004) bloquait l'entrée en vigueur sans dire à
qui revenait le geste suivant, et une coquille corrigée par n'importe qui changeait le texte
d'un autre sans lui demander. Yvv, 2026-10-30 :
- « Faudrait un "redit" en option avec "contredit" → faut rendre plus explicite que l'objection
doit être levée par l'auteur de la dernière arrivée pour être une proposition votable. Pour ce
qui constitue une répétition → modifier l'article cible ; pour une contradiction → reformuler.
→ ping messagerie TrustinWallet → Lever l'objection ou Réitérer l'objection ; si pas de
réponse sous 3j, alors "levée". »
- « Corriger coquille → ping auteur pour valid → idem 3j ça passe auto, mais auteur a toujours
la main tant que c'est pas le texte en vote. Sinon seule une coquille validée corrige le texte
en vote. » (« le texte en vote » : le texte en vigueur.)
## Décision
### Les objections — `crates/ld-engine/src/objection.rs`
- Une objection dit qu'une version **redit** une autre (elle la répète) ou la **contredit**,
motif à l'appui (10 à 600 signes). Elle porte sur deux versions de texte de deux articles
différents, ouvertes ou en vigueur — jamais deux textes en vigueur (`both_in_force`).
- Elle retient **la dernière arrivée** des deux (date de soumission, à défaut de création, puis
l'ordre d'écriture) ; **jamais un texte en vigueur** : si la dernière arrivée est en vigueur,
c'est l'autre qui est retenue. La version retenue est fixée quand l'objection est faite.
- Tant que l'objection tient, la version retenue **ne prend plus de « pour »** et **n'entre pas
en vigueur**, quelles que soient ses voix. Yvv, 2026-11-01, à la question « pendant qu'une
objection retient une version, que permet-on ? » : **« Retirer ou "contre" »**. Chacun peut
**retirer son vote** ou **passer à « contre »** ; personne ne peut **ajouter un « pour »** (vote
direct, vote groupé, bulletin de la chaîne : `409 objection`, et une ligne refusée refuse tout le
vote). La version ne peut que perdre des voix tant qu'elle est retenue ; à la levée, elle
n'entre qu'avec les voix encore là. Les votes déjà faits restent ; un bulletin scellé avant
l'objection et confirmé après compte tel qu'il est signé pour « contre » et le retrait ; son
« pour » est écarté (0012). Règle :
`ld_engine::objection::may_cast`, appliquée par `DocState::admits`.
- Une personne n'a qu'une objection debout sur une même paire (`objection_exists`).
- **L'auteur de la version retenue répond** : pour une redite, il **modifie l'article visé**
(une proposition liée à l'objection, sur l'article de l'autre version, partie de son texte) ;
pour une contradiction, il **reformule** (une révision de fond de sa version, ou une
proposition liée sur son propre article). Une révision de fond de l'une ou l'autre des deux
versions vaut réponse ; une coquille, non. Une version du seed n'a pas d'auteur : tout membre
du groupe peut y répondre par une proposition liée.
- Une réponse donne la main à **la personne qui objecte** : un message lui demande de **lever**
ou de **réitérer** dans les **3 jours** ; sans geste de sa part, l'objection est **levée** à
l'échéance. Un seul tour à la fois : une autre réponse pendant son tour ne change ni le
message ni l'échéance. Réitérer rend la main à l'auteur (tour suivant, sans échéance pour lui).
- Lever : la personne qui a fait l'objection, à tout moment, ou un administrateur de
trustinWallet. Réitérer : elle seule. Retirer une des deux versions met fin à l'objection.
Une levée relance l'adoption : la version libérée entre en vigueur si les voix encore là
suffisent.
- Règles d'accès : `trustin_access::lifts_objection`, `reiterates_objection`.
| Qui | Quoi | Effet | Échéance |
|---|---|---|---|
| tout membre du groupe | faire une objection « redit » ou « contredit » | la dernière arrivée (jamais un texte en vigueur) ne prend plus de « pour » — « contre » et retrait seulement — et n'entre pas en vigueur ; message à son auteur | — |
| l'auteur de la version retenue (tout membre pour une version du seed) | modifier l'article visé (redit) ou reformuler (contredit) | la main passe à la personne qui objecte ; message « lever ou réitérer » | 3 jours pour elle |
| la personne qui objecte | lever | la version reprend des « pour », et entre en vigueur si les voix encore là suffisent | — |
| la personne qui objecte | réitérer | la main revient à l'auteur ; message « réponds à nouveau » | aucune pour l'auteur |
| personne | (3 jours sans geste après une réponse) | levée « 3 jours sans suite » | — |
| un administrateur | lever | levée « par un administrateur » | — |
| l'auteur | retirer sa version | l'objection prend fin | — |
### Les coquilles validées — `crates/ld-engine/src/correction.rs`
La règle de la coquille (0003, `edit.rs`) ne change pas ; ce qui change, c'est qui la laisse
entrer.
- Sur **son propre texte** (l'auteur de la version ; un administrateur pour un texte du seed),
la correction s'applique tout de suite, comme avant.
- Sur **celui d'un autre**, elle **attend** : un message à l'auteur de la version (aux
administrateurs qui ouvrent le groupe, pour un texte du seed) avec **valider / refuser** ; sans
réponse sous **3 jours**, elle s'applique d'elle-même.
- **Tant que le texte n'est pas en vigueur, l'auteur garde la main** : il peut revenir sur une
correction appliquée (révision « correction retirée ») ou appliquer finalement une correction
refusée, tant que le texte est celui sur lequel elle a été écrite.
- **En vigueur, seule une correction validée change le texte** : elle attend la validation (ou
l'échéance, qui vaut validation), et un refus est définitif.
- Deux corrections en attente sur un même texte : chacune est jugée contre le texte voté ; à
l'application, la correction doit tomber sur le texte qu'elle a lu — sinon (une autre
correction, une révision de fond ou un retrait est passé entre-temps) elle est **périmée**
et l'interface demande de recharger.
- Les traductions restent éditoriales : elles ne passent pas par une validation.
- L'historique dit qui a écrit la correction et qui l'a validée (ou qu'elle est passée à
l'échéance) ; la correction en attente se lit, avec son diff, dans « Détails ».
- Règle d'accès : `trustin_access::answers_typo`.
| Qui | Quoi | Effet | Échéance |
|---|---|---|---|
| l'auteur de la version (un administrateur pour un texte du seed) | corriger une coquille | appliquée tout de suite, les votes restent | — |
| tout autre membre | corriger une coquille | en attente ; message à l'auteur (aux administrateurs pour un texte du seed) | 3 jours, puis appliquée |
| l'auteur (ou un administrateur pour le seed) | valider / refuser | appliquée / laissée de côté | — |
| l'auteur, texte pas encore en vigueur | revenir au texte d'avant, ou appliquer finalement | la main reste à l'auteur | — |
| texte en vigueur | — | seule une correction validée (ou passée à l'échéance) le change ; un refus est définitif | — |
### La messagerie — `crates/ld-server/src/messages.rs`
Une boîte **« Messages »** dans l'application, au menu, avec le nombre de non-lus (une pastille
sur le bouton du menu en mobile) ; pas de courriel. Un message porte un objet (une objection, une
coquille), son texte — dit par l'interface, dans la langue de la personne —, les gestes que
l'objet lui demande **maintenant** (répondre, lever ou réitérer, valider ou refuser) et son
échéance ; un message traité n'offre plus de geste et dit ce qu'il est devenu. Chacun ne lit
que les siens (`trustin_access::reads_message`) ; agir sur l'objet lit ses messages. Un message
ne se montre que tant que la personne ouvre le groupe dont il parle.
### Les échéances — `crates/ld-server/src/deadlines.rs`
Trois jours (`ANSWER_DAYS`). Le balayage d'adoption (toutes les 5 minutes) passe les
échéances, et une fois au démarrage : une échéance passée pendant un arrêt est prise dès la
reprise. L'horloge du serveur est injectable (`AppState::clock`) : les tests l'avancent, sans
attendre ; la route `/api/dev/clock` n'existe qu'avec la connexion de développement.
### La migration 0008
Additive. Les signalements gardent leur table (`signals`) et y gagnent le genre, la version
retenue, le tour, l'échéance, la réponse et la cause de la levée ; chaque signalement existant
devient un **« contredit »** sans perte : levé, il le reste (par son auteur, un administrateur
ou une révision, selon `lifted_by`) ; debout, il retient la dernière arrivée selon la règle
ci-dessus (s'il visait deux textes aujourd'hui tous deux en vigueur, il ne retient rien et se
lève à la main). Aucun message n'est créé pour le passé. S'y ajoutent les tables `typos` (les
corrections des autres) et `messages`, et sur les révisions la correction d'origine et qui l'a
validée.
**Coût.** Une version retenue attend son auteur aussi longtemps qu'il ne répond pas : c'est la
dernière arrivée, c'est à elle de s'expliquer. Pendant ce temps, ceux qui la soutiennent ne
peuvent pas la renforcer : un nouveau « pour » attend la levée, alors qu'un « contre » ou un
retrait compte tout de suite. Une personne qui réitère sans fin garde une
version hors du vote : un administrateur peut lever. Une coquille d'un autre met jusqu'à trois
jours à paraître, et sur un texte du seed elle attend un administrateur.