From 06c99cb0db0a492b473a4d665416aa85b92f90d0 Mon Sep 17 00:00:00 2001 From: Yvv Date: Sat, 31 Oct 2026 05:19:02 +0100 Subject: [PATCH] =?UTF-8?q?v3=20:=20ADR=200010=20(objections,=20coquilles?= =?UTF-8?q?=20valid=C3=A9es,=20messagerie)=20;=20chantier,=20contr=C3=B4le?= =?UTF-8?q?s=20C28=E2=80=93C31,=20invariants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADR 0010 remplace 0004 et complète 0003 (renvois dans les deux). CHANTIER : « Corriger n'est pas voter » et « Deux articles qui se répètent ou se contredisent » réécrits avec le tableau des gestes (qui, quoi, effet, échéance), la boîte « Messages », deux limites connues. CONTROLES : C6 suit la règle, C24 son nouveau texte, C28–C31, le passage du lot F. CLAUDE.md : l'invariant de l'objection et de la coquille validée, les nouveaux modules, 29 contrôles. Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 33 +++-- docs/adr/0003-corriger-n-est-pas-voter.md | 6 +- docs/adr/0004-contradictions-signalees.md | 6 + .../0010-objections-et-coquilles-validees.md | 124 ++++++++++++++++++ docs/adr/README.md | 3 +- docs/chantiers/acte-certification/CHANTIER.md | 70 +++++++--- .../chantiers/acte-certification/CONTROLES.md | 11 +- 7 files changed, 222 insertions(+), 31 deletions(-) create mode 100644 docs/adr/0010-objections-et-coquilles-validees.md diff --git a/CLAUDE.md b/CLAUDE.md index 1f188c4..6aa1cc1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -36,19 +36,26 @@ crates/ ld-engine/ # PUR (zéro I/O) : threshold (formule inertielle), inertia (cinq crans, médiane, # référence, échelle), edit (coquille vs fond, diff), assist (découpage, similarité, # longueur), compose (adoption, aperçus), ballot (bulletin scellé ld1:, le dernier - # fait foi, jugement d'une transaction), address (SS58, préfixe g1) + # fait foi, jugement d'une transaction), address (SS58, préfixe g1), objection + # (redit / contredit : la dernière arrivée retenue, les tours, l'échéance), correction + # (la coquille d'un autre : attendre, valider, refuser, l'échéance) trustin-access/ # règles d'accès de trustinWallet : sees / opens / manages_access, vote_way (serveur ou - # chaîne), groupes par défaut + # chaîne), answers_typo, lifts_objection / reiterates_objection, reads_message, + # groupes par défaut ld-server/ migrations/ # schéma SQLite — additif seulement src/ # lib.rs (routes, csrf, run) · config.rs (LD_*) · auth.rs (connect OAuth2, invitations, - # dev, bootstrap) · team.rs (liens d'équipe) · docs.rs (lecture, aperçus) · proposals.rs (écrire, voter, signaler, - # traduire) · adoption.rs (balayage, verrou) · participation.rs (p̃, une fois par + # dev, bootstrap) · team.rs (liens d'équipe) · docs.rs (lecture, aperçus) · proposals.rs (écrire, voter, + # traduire) · objections.rs (faire, lever, réitérer, la version retenue) · typos.rs + # (les coquilles des autres) · messages.rs (la boîte « Messages ») · deadlines.rs + # (les échéances de 3 jours) · clock.rs (horloge injectable) · adoption.rs + # (balayage, verrou) · participation.rs (p̃, une fois par # jour) · publish.rs (file → git) · wot.rs (W sur la chaîne) · seed.rs · # seed_amend.rs / inertia_amend.rs (amendements gardés) · ballots.rs (vote groupé, # bulletins de la chaîne Ğ1, confirmation, « ton vote ») · indexer.rs (txComments) # · web.rs (sert web/build) - tests/ # api.rs (scénarios bout en bout) · ballots.rs (vote par la chaîne, indexeur simulé) + tests/ # api.rs (scénarios bout en bout) · ballots.rs (vote par la chaîne, indexeur simulé) · + # objections.rs · typos.rs (lot F, horloge avancée, migration 0008) seeds/ # acte-engagement-certification.json (trilingue, 33 articles, I1/E1/E2 en vigueur ; # inertie 3, E1/E2 à 4) # upcoming/.json : les « À venir » des outils d'un groupe (fr, en, es), lus au démarrage @@ -57,13 +64,15 @@ web/src/ lib/components/ # Sidebar, DocPanel, VoteFold (le vote déplié sous l'article), BallotPanel (panier), # ChainSign (signature, Ğecko), VersionDetails, ProposeView, UnitBlock, DeepList, Seal… lib/wallet/ # injected.ts (portefeuille injectedWeb3, polkadot-api chargé à la signature) · gecko.ts - lib/basket.ts # PUR : sections, tout pour / tout contre, versions en concurrence + lib/basket.ts # PUR : sections, tout pour / tout contre, versions en concurrence, versions retenues + lib/objections.ts # où l'auteur répond à une objection · lib/diff.ts : le diff resserré d'une coquille routes/ # / (accueil + choix du groupe) · connexion · invitation · equipe · g/[group] (piliers, en cours) · # g/[group]/docs · g/[group]/docs/[doc] (lecteur, # vote déplié ?vote=, panneau ?onglet=panier|propositions|proposer|details|reglages) # · g/[group]/decisions · g/[group]/mandats · - # g/[group]/protocoles (à venir) · acces (trustinWallet) ; /groupes, /decisions… redirigent -web/e2e/ # Playwright C1–C24 + M1 ; serve.sh = serveur jetable /tmp/ld-e2e sur :8092 et + # g/[group]/protocoles (à venir) · acces (trustinWallet) · messages (la boîte) ; + # /groupes, /decisions… redirigent +web/e2e/ # Playwright C1–C24, C28–C31 + M1 ; serve.sh = serveur jetable /tmp/ld-e2e sur :8092 et # chain-mock.mjs (nœud et indexeur Ğ1 simulés) ; faux portefeuille dans helpers.ts docker/ # app.Dockerfile · app-compose.yml (sonic) .woodpecker/ # app.yml · maquette.yml @@ -85,7 +94,7 @@ maquette/ # v2 intacte (frontend Nuxt, backend FastAPI, docker, docs-v ```bash export PATH=$HOME/.cargo/bin:$PATH cargo fmt --all --check && cargo clippy --workspace --all-targets -- -D warnings && cargo test --workspace -cd web && npm run check && npm test && npm run build && npm run e2e # e2e : 25 contrôles +cd web && npm run check && npm test && npm run build && npm run e2e # e2e : 29 contrôles LD_DEV_LOGIN=1 cargo run -p ld-server # :8002, sert web/build cd web && npm run dev # :3002 à chaud @@ -100,8 +109,10 @@ docker build -f docker/app.Dockerfile --target production . # rejoue toute la - **Moteur pur** : une règle de vote / édition / composition s'écrit et se teste dans `ld-engine` avant d'être câblée. Le serveur ne décide jamais l'accès seul : `trustin-access`. - **Invariants** : une seule voix ne fait jamais passer un texte (C = 50 pour Monnaie libre) ; - une coquille ne demande pas de vote, un changement de fond si ; un signalement de - contradiction bloque ; l'inertie de l'inertie hérite du cran de l'article (cinq crans, ADR 0007) ; + une coquille ne demande pas de vote, un changement de fond si ; la coquille d'un autre attend + son auteur (un administrateur pour le seed) ou 3 jours, et en vigueur seule une coquille validée + change le texte ; une objection rend la dernière arrivée non votable jusqu'à sa levée (jamais un + texte en vigueur ; ADR 0010) ; l'inertie de l'inertie hérite du cran de l'article (cinq crans, ADR 0007) ; le groupe d'essai ne publie jamais ; dans Monnaie libre, un vote est une transaction Ğ1 et le dernier fait foi dans l'ordre de la chaîne (ADR 0008) — **jamais de transaction réelle en test** (chaîne simulée ; un essai réel est un acte « paye » d'Yvv). diff --git a/docs/adr/0003-corriger-n-est-pas-voter.md b/docs/adr/0003-corriger-n-est-pas-voter.md index af8a00c..9067022 100644 --- a/docs/adr/0003-corriger-n-est-pas-voter.md +++ b/docs/adr/0003-corriger-n-est-pas-voter.md @@ -1,5 +1,9 @@ # 0003 — Corriger n'est pas voter +> Complétée par [0010](0010-objections-et-coquilles-validees.md) (2026-10-31) : la règle de la +> coquille ne change pas ; la coquille d'un autre attend son auteur (un administrateur pour un +> texte du seed), ou 3 jours, et en vigueur seule une coquille validée change le texte. + **Contexte.** « Ça ne peut pas devenir un système qui nécessite un vote pour corriger une coquille. » Mais une correction ne doit pas pouvoir changer le sens d'un texte voté — et tout membre peut corriger un texte en vigueur, qui est republié aussitôt. @@ -24,7 +28,7 @@ ou de fond), jamais contre la correction précédente : ligne et tabulation) sont refusés partout où l'on écrit ; un titre tient sur une ligne. Sinon c'est **du fond** : nouvelle révision d'une proposition ouverte (par son auteur), votes -antérieurs « à reconfirmer », signalements levés ; refusé sur un texte en vigueur ou de départ. +antérieurs « à reconfirmer », réponse aux objections qui l'attendent (0010) ; refusé sur un texte en vigueur ou de départ. L'écriture ne vaut que sur le texte jugé : un texte entré en vigueur ou changé entre-temps donne un conflit. Les brouillons s'éditent librement. diff --git a/docs/adr/0004-contradictions-signalees.md b/docs/adr/0004-contradictions-signalees.md index afba9fb..ae2e282 100644 --- a/docs/adr/0004-contradictions-signalees.md +++ b/docs/adr/0004-contradictions-signalees.md @@ -1,5 +1,11 @@ # 0004 — Contradictions : signalées par les personnes, bloquantes +> **Remplacée** par [0010](0010-objections-et-coquilles-validees.md) (2026-10-31) : le +> signalement devient l'objection « contredit », à côté de « redit » ; elle retient la dernière +> arrivée des deux versions, qui ne se vote plus jusqu'à sa levée ; l'auteur répond, la personne +> qui objecte lève ou réitère, et sans réponse de sa part sous 3 jours elle est levée. Les +> signalements existants sont devenus des « contredit » (migration 0008). + **Contexte.** « Il faut que 2 unités modulaires ne puissent pas passer en vigueur si elles se contredisent. » La contradiction est une question de sens : aucune règle ne la détecte sans se tromper, et l'IA est écartée pour l'instant. diff --git a/docs/adr/0010-objections-et-coquilles-validees.md b/docs/adr/0010-objections-et-coquilles-validees.md new file mode 100644 index 0000000..7acd3d4 --- /dev/null +++ b/docs/adr/0010-objections-et-coquilles-validees.md @@ -0,0 +1,124 @@ +# 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. + +**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 se vote plus** (vote direct, vote groupé, + bulletin de la chaîne : `409 objection`) et **n'entre pas en vigueur**. Les votes déjà faits + restent ; un bulletin scellé avant l'objection et confirmé après compte, sans la faire entrer. +- 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 ses voix 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 se vote plus ; 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 se vote de nouveau, et entre en vigueur si ses voix 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. 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. diff --git a/docs/adr/README.md b/docs/adr/README.md index b52ba84..0dcf4a9 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -8,8 +8,9 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan | [0001](0001-rust-svelte.md) | Rust + Svelte, une image, SQLite | 2026-10-21 | | [0002](0002-vote-permanent.md) | Vote permanent : marge du texte en place et plancher C | 2026-10-21 | | [0003](0003-corriger-n-est-pas-voter.md) | Corriger n'est pas voter | 2026-10-21 | -| [0004](0004-contradictions-signalees.md) | Contradictions : signalées par les personnes, bloquantes | 2026-10-21 | +| [0004](0004-contradictions-signalees.md) | Contradictions : signalées par les personnes, bloquantes (remplacée par 0010) | 2026-10-21 | | [0005](0005-publication-git.md) | Publication par file d'envoi vers un dépôt git | 2026-10-21 | | [0006](0006-acces-connect-trustinwallet.md) | Accès : connect.monnaie-libre.fr, invitations, trustinWallet | 2026-10-21 | | [0007](0007-inertie-cinq-crans.md) | Inertie à cinq crans, calée sur la participation du groupe (complète 0002) | 2026-10-30 | | [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 | +| [0010](0010-objections-et-coquilles-validees.md) | Objections « redit » / « contredit », coquilles validées, messagerie (remplace 0004, complète 0003) | 2026-10-31 | diff --git a/docs/chantiers/acte-certification/CHANTIER.md b/docs/chantiers/acte-certification/CHANTIER.md index 8fe23b2..8274bcf 100644 --- a/docs/chantiers/acte-certification/CHANTIER.md +++ b/docs/chantiers/acte-certification/CHANTIER.md @@ -9,7 +9,7 @@ La communauté Monnaie libre tient son Acte d'engagement Certification comme un **texte vivant** : lisible d'abord, modifiable par article, chaque modification passant par un vote dont le seuil suit la formule inertielle de la Ğ1 — sans qu'une coquille demande un vote, sans que deux -articles contradictoires soient en vigueur ensemble, et avec une publication automatique que +articles qui se répètent ou se contredisent soient en vigueur ensemble, et avec une publication automatique que les applications clientes (Cesium, Ğecko…) peuvent suivre. ## Ce que voit la personne @@ -40,7 +40,7 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. (enregistré, inscrit sur la chaîne Ğ1, en attente de la chaîne, à reconfirmer, non compté et pourquoi), puis l'inertie et la formule. Les autres gestes ouvrent un panneau latéral (une feuille sur mobile), lui aussi dans l'URL : **Panier**, **Propositions**, **Proposer**, - **Détails** d'une version (coquilles, traductions, signalements, historique) et + **Détails** d'une version (coquilles, traductions, objections, historique) et **« Réglages de la formule »** (W, C, B, la participation habituelle du groupe et les cinq crans), atteints depuis l'en-tête du document et depuis chaque vote. 5. **En dessous**, les propositions en cours — les 30 autres articles du texte source, à zéro @@ -61,6 +61,11 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. 7. **Deux aperçus** : « si les bien cotées passent » et « si tout passe ». 8. **Trois langues** : fr · en · es, pour l'interface comme pour le texte. Le français fait foi ; une traduction devenue ancienne (le français a changé depuis) est signalée. +9. **Messages** (lot F, ADR 0010) : au menu, une boîte avec le nombre de non-lus (une pastille + sur le bouton du menu en mobile) ; ce qui attend un geste de la personne — une objection à + laquelle répondre, à lever ou à réitérer, une correction de coquille à valider —, chaque + message avec son objet, son texte, ses gestes et son échéance. Une version retenue par une + objection le dit sous l'article, à chacun selon son rôle. ## Les règles @@ -128,11 +133,19 @@ mot (« certifcation » → « certification »). Tout le reste passe par une pr ponctuation, les chiffres, les signes, l'emphase, les formules, les adresses, et tout changement de sens. -| Geste | Qui | Effet sur les votes | -|---|---|---| -| Corriger une **coquille** | tout membre sur un texte de départ ou en vigueur ; l'auteur sur sa proposition | aucun — les votes restent, les traductions restent à jour | -| Modifier **le fond** d'une proposition | son auteur | nouvelle révision : les votes antérieurs sont « à reconfirmer », les signalements tombent | -| Modifier le fond d'un texte **en vigueur** ou d'un texte de départ | personne | refusé : on propose une nouvelle version | +| Geste | Qui | Effet | Échéance | +|---|---|---|---| +| Corriger une **coquille** sur son propre texte | l'auteur de la version ; un administrateur sur un texte du seed | appliquée tout de suite : les votes restent, les traductions restent à jour | — | +| Corriger une **coquille** sur le texte d'un autre | tout membre du groupe | **en attente** : un message à l'auteur (aux administrateurs pour un texte du seed), qui valide ou refuse ; la correction se lit, avec son diff, dans « Détails » | 3 jours sans réponse : appliquée | +| Revenir sur une correction (ou l'appliquer finalement) | l'auteur, tant que le texte **n'est pas en vigueur** | le texte d'avant revient (ou la correction passe) | — | +| Corriger un texte **en vigueur** | tout membre ; l'auteur (un administrateur pour le seed) valide | **seule une correction validée** change le texte ; un refus est définitif | 3 jours sans réponse : appliquée | +| Modifier **le fond** d'une proposition | son auteur | nouvelle révision : les votes antérieurs sont « à reconfirmer », les corrections en attente sont périmées ; elle répond aux objections qui attendent l'auteur | — | +| Modifier le fond d'un texte **en vigueur** ou d'un texte de départ | personne | refusé : on propose une nouvelle version | — | + +Deux corrections en attente sur un même texte : chacune est jugée contre le texte voté ; à +l'application, celle qui ne tombe plus sur le texte qu'elle a lu est **périmée** (« recharge, +puis recommence »). Les traductions restent éditoriales, sans validation. L'historique dit qui a +écrit chaque correction et qui l'a validée, ou qu'elle est passée à l'échéance (ADR 0010). Pourquoi si strict : six relectures indépendantes ont montré qu'une ponctuation laissée libre finit toujours par porter un sens — un signe moins devant un nombre en gras, deux conditions @@ -170,14 +183,37 @@ change la portée d'une exception. La règle est donc construite à l'envers d'u - une correction ne s'écrit que sur le texte qui a été jugé : si le texte est entré en vigueur ou a changé entre-temps, c'est un conflit (« recharge, puis recommence »). -Moteur : `crates/ld-engine/src/edit.rs` ; règle d'écriture : `crates/ld-server/src/proposals.rs`. +Moteur : `crates/ld-engine/src/edit.rs` (la coquille) et `crates/ld-engine/src/correction.rs` (qui +la laisse entrer) ; écriture : `crates/ld-server/src/proposals.rs` et `crates/ld-server/src/typos.rs`. -### Deux articles qui se contredisent +### Deux articles qui se répètent ou se contredisent -Tout membre peut **signaler une contradiction** entre deux propositions, motif à l'appui. Tant -que le signalement tient, celle des deux qui n'est pas en vigueur **ne peut pas entrer en -vigueur**. Il se lève par son auteur (ou un administrateur), ou tombe quand la proposition -signalée est révisée sur le fond. +Tout membre peut faire une **objection** à une version : elle **redit** un autre article (elle le +répète) ou elle le **contredit**, motif à l'appui. **Une objection rend la dernière arrivée des +deux versions non votable jusqu'à sa levée** — jamais un texte en vigueur : si la dernière +arrivée est en vigueur, c'est l'autre qui est retenue. Les votes déjà faits restent ; la version +retenue ne reçoit plus de vote (ni sous l'article, ni dans le panier, ni par la chaîne) et +n'entre pas en vigueur. Pour qu'elle se vote de nouveau, **son auteur répond** : pour une redite, +il **modifie l'article visé** ; pour une contradiction, il **reformule**. La personne qui a fait +l'objection reçoit alors un message : **lever** ou **réitérer** ; sans réponse de sa part sous +**3 jours**, l'objection est levée. + +| Qui | Quoi | Effet | Échéance | +|---|---|---|---| +| tout membre du groupe | faire une objection « redit » ou « contredit », motif à l'appui | la dernière arrivée des deux versions (jamais un texte en vigueur) ne se vote plus ; message à son auteur | — | +| l'auteur de la version retenue (tout membre pour une version du seed) | « Modifier l'article visé » (redit) : une proposition liée, sur l'autre article, partie de son texte ; « Reformuler » (contredit) : une révision de fond de sa version | la main passe à la personne qui objecte : message « lever ou réitérer » | 3 jours pour elle | +| la personne qui a fait l'objection | lever | la version se vote de nouveau, et entre en vigueur si ses voix suffisent | — | +| la personne qui a fait l'objection | 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 de trustinWallet | lever | levée « par un administrateur » | — | +| l'auteur | retirer sa version | l'objection prend fin | — | + +Une révision de fond de l'une ou l'autre des deux versions vaut réponse, une coquille non ; un +seul tour à la fois (une autre réponse pendant le tour de la personne qui objecte ne change ni le +message ni l'échéance) ; une personne n'a qu'une objection debout sur une même paire. Les +signalements de contradiction d'avant sont devenus des « contredit » (migration 0008). Moteur : +`crates/ld-engine/src/objection.rs` ; serveur : `crates/ld-server/src/objections.rs`, +`messages.rs`, `deadlines.rs` (les échéances, au balayage de 5 minutes et au démarrage) ; ADR 0010. ### Une décision par proposition @@ -206,7 +242,7 @@ du dépôt. Le groupe d'essai ne publie jamais. Un document seedé n'est jamais réinstancié : quand le seed change un texte de départ (le Préambule devenu Raison d'être), un **amendement de seed** le remplace dans une base existante, une seule fois, et seulement sur un article que personne n'a touché (*seed a minima* d'origine, -révision 1, aucun vote, aucune correction, aucune traduction modifiée, aucun signalement, texte +révision 1, aucun vote, aucune correction (ni en attente), aucune traduction modifiée, aucune objection, texte identique à l'empreinte attendue). Chaque décision est consignée (`seed_amendments`, et dans les journaux quand l'article garde son texte) ; appliqué, l'amendement se lit dans l'historique de l'article (« texte de départ remplacé », avec le diff) et le texte est republié @@ -215,7 +251,7 @@ l'article (« texte de départ remplacé », avec le diff) et le texte est repub ### Accès — trustinWallet Tout le monde connecté peut tout faire dans les groupes qu'il ouvre (lire, proposer, voter, -corriger, signaler) **sauf la gestion des accès**, réservée aux administrateurs de trustinWallet +corriger, faire une objection) **sauf la gestion des accès**, réservée aux administrateurs de trustinWallet (`/acces`) : membres des groupes, invitations, administrateurs, retours, clé de publication. Le nom trustinWallet remplace trustWallet (déjà pris). Règles : `crates/trustin-access`. @@ -274,6 +310,10 @@ Les raisons longues sont dans `docs/adr/`. dans l'historique de l'article. - Les traductions (en, es) sont éditoriales : tout membre les corrige sans vote, et elles sont republiées — le français fait foi. +- Une version retenue par une objection attend son auteur aussi longtemps qu'il ne répond pas ; + une personne qui réitère sans fin la garde hors du vote : un administrateur peut lever (ADR 0010). +- Les messages sont dans l'application, sans courriel : qui ne passe pas ne les voit pas, et la + correction ou l'objection qui l'attendait passe à l'échéance de 3 jours. ## Questions ouvertes (à Yvv) diff --git a/docs/chantiers/acte-certification/CONTROLES.md b/docs/chantiers/acte-certification/CONTROLES.md index e4da467..f349650 100644 --- a/docs/chantiers/acte-certification/CONTROLES.md +++ b/docs/chantiers/acte-certification/CONTROLES.md @@ -4,7 +4,7 @@ Chaque contrôle existe en deux versions : **automatique** (Playwright, `web/e2e `npm run e2e`) et **humaine** (Chiara, sur la production ou en local). Une remarque de Chiara sur un contrôle vaut échec du contrôle tant qu'elle n'est pas traitée. -Où tester : les contrôles qui écrivent (C5, C6, C7, C21, C22) se font dans le **groupe +Où tester : les contrôles qui écrivent (C5, C6, C7, C21, C22, C28–C31) se font dans le **groupe d'essai** (caché, plancher C = 1, jamais publié) — jamais sur le texte de la communauté. Les votes par la chaîne Ğ1 (C11, C17, C23) ne se jouent, pour l'automate, que sur une **chaîne simulée** (`web/e2e/chain-mock.mjs` : un faux nœud, un faux indexeur, un faux portefeuille) ; @@ -17,7 +17,7 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. | C3 | Le texte en vigueur | Monnaie libre → Docs de référence → Acte d'engagement Certification | trois articles seulement (Raison d'être, Unicité du compte, Réciprocité), chacun « seed a minima · 0 vote » ; en dessous, « Propositions en cours » (30 lignes, une par article) | | C4 | Gestes contextuels | survoler la Raison d'être → « Le vote » | le vote se **déplie sous l'article**, sans fenêtre : seuil 50 voix pour, il en manque 50 ; « La formule du seuil » se déplie : « M — majorité à pleine participation : 55 % — inertie 3 / 5 · moyenne », et le lien « Réglages de la formule » ; l'URL garde le vote déplié (`?vote=`) ; « Le vote » de nouveau le replie | | C5 | Entrée en vigueur | groupe d'essai : à deux, déplier le vote de « Les deux garanties réciproques », « Pour » | au second vote, « … est entré en vigueur » ; le texte en vigueur compte quatre articles, le vote reste déplié sous le nouveau texte (2 pour · 0 contre) | -| C6 | Coquille sans vote | groupe d'essai : Unicité du compte → « Le vote » → « Coquilles, traductions, signalements, historique » (onglet « Détails ») → « Corriger une coquille », remplacer les apostrophes droites par des apostrophes typographiques (« Je m’engage sur l’honneur ») | « Coquille corrigée, sans toucher aux votes. » ; un changement de sens est refusé : « Ce changement touche au sens : propose-le comme modification. » | +| C6 | Coquille sans vote | groupe d'essai, **en administratrice** (un texte du seed n'a pas d'auteur) : Unicité du compte → « Le vote » → « Coquilles, traductions, objections, historique » (onglet « Détails ») → « Corriger une coquille », remplacer les apostrophes droites par des apostrophes typographiques (« Je m’engage sur l’honneur ») | « Coquille corrigée, sans toucher aux votes. » ; un changement de sens est refusé : « Ce changement touche au sens : propose-le comme modification. » (sans être administratrice, la correction attend : C31) | | C7 | Une décision par proposition | groupe d'essai : « Proposer un nouvel article », deux paragraphes « Je m'engage à… » | l'assistant : « Ce texte semble porter 2 décisions » ; « Découper en 2 brouillons » ; « Tes brouillons » apparaît | | C8 | Trois langues | choisir EN puis ES pour le texte | « Certification Commitment Act », « Acta de compromiso de Certificación » ; l'interface suit | | C9 | Les aperçus | « Si tout passe », puis « Si les bien cotées passent » | 33 articles avec la mention d'aperçu, puis 3 | @@ -36,7 +36,11 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. | C21 | Le vote déplié | groupe d'essai : Unicité du compte → « Le vote », puis « Pour » ; une autre personne ouvre le même vote | sous l'article : le niveau d'eau, « 0 pour · 0 contre », « Seuil : … voix pour », « Il manque … », « Tu n'as pas voté sur cette version. » ; après « Pour » : « Ton vote : pour · enregistré », « 1 pour · 0 contre », le bouton enfoncé, « Ton vote ne se montre à personne : seuls les totaux sont visibles. » ; l'autre personne voit 1 pour, jamais qui ; « Le vote » replie ; « Retirer mon vote » remet 0 | | C22 | Le vote groupé | groupe d'essai : « Propositions en cours » → « Engagements techniques » → « Voter cette section » ; « Tout pour » ; dans « Connaissance suffisante », « Pour » sur la variante 1.0.0 ; recharger ; « Voter (n) » | le panier s'ouvre sur la section ; « Tout pour » remplit les articles à une version, pas « Connaissance suffisante » ni « Rencontre physique… » (« Plusieurs versions : choisis la tienne. », et le compte des articles laissés) ; le panier reste après rechargement (« Voter en lot · n ») ; un seul envoi : « n votes enregistrés. », le panier vide, la variante choisie à 1 pour | | C23 | Le vote par la chaîne Ğ1 | Monnaie libre, un portefeuille dans le navigateur : « Voter en lot », « Pour » sur Unicité du compte et Réciprocité, « Signer et envoyer (2) » ; puis sous Réciprocité, « Contre » (l'indexeur en retard) puis « Retirer mon vote » ; puis sans portefeuille : « Pour » → « Passer par Ğecko » | une seule signature pour les deux : 0,1 Ğ1 vers le compte des votes et une remarque `ld1:` + 64 chiffres, rien du vote en clair ; « Ton vote compte : il est inscrit sur la chaîne Ğ1. », « Compté pour l'identité Ğ1 « Alice ». » ; sous l'article « Ton vote : pour · inscrit sur la chaîne Ğ1 », 1 pour ; « En attente de la chaîne Ğ1 : contre. » ; le retrait, plus récent sur la chaîne, fait foi même quand le « contre » est confirmé après lui (0 pour · 0 contre) ; Ğecko : un QR code et le lien `g1://?amount=0.1&comment=ld1:…`, puis la confirmation dès que la chaîne la montre | -| C24 | Sans compte des votes | Monnaie libre sur un serveur sans `LD_VOTE_ACCOUNT`, puis le groupe d'essai | pas de « Voter en lot » ni « Voter cette section » ; sous l'article : « Le vote par la chaîne Ğ1 n'est pas encore ouvert : le compte qui reçoit les votes reste à créer. Tu peux lire, proposer et signaler une contradiction. », pas de bouton, les totaux et le seuil restent ; dans le groupe d'essai, le panier et les boutons sont là | +| C24 | Sans compte des votes | Monnaie libre sur un serveur sans `LD_VOTE_ACCOUNT`, puis le groupe d'essai | pas de « Voter en lot » ni « Voter cette section » ; sous l'article : « Le vote par la chaîne Ğ1 n'est pas encore ouvert : le compte qui reçoit les votes reste à créer. Tu peux lire, proposer et faire une objection. », pas de bouton, les totaux et le seuil restent ; dans le groupe d'essai, le panier et les boutons sont là | +| C28 | Objection « redit » | groupe d'essai, à trois (Aude, Oscar, Vera) : Aude propose un nouvel article qui répète « Unicité du compte » ; Oscar, dans « Détails » de cette proposition → « Faire une objection » → « Redit », « En vigueur — Unicité du compte », un motif → « Envoyer l'objection » ; Vera déplie son vote ; Aude ouvre « Messages » → « Modifier l'article visé », complète le texte et soumet ; Oscar ouvre « Messages » → « Lever l'objection » ; Vera recharge | « Objection enregistrée : la dernière arrivée des deux versions ne se vote plus jusqu'à sa levée. » ; chez Oscar, « « … » redit « Unicité du compte » », « cette version ne se vote plus », « Lever l'objection » ; chez Vera, « Une objection retient cette version : elle ne se vote plus jusqu'à sa levée. Les votes déjà faits restent. », « Elle redit « Unicité du compte ». », pas de « Pour », la ligne marquée « non votable : objection » ; chez Aude, « Messages, 1 non lu », le message « Oscar fait une objection : ta version « … » redit « Unicité du compte »… Pour répondre, modifie l'article visé. », puis le panneau « Proposer » sur Unicité du compte, partant de son texte, avec « Cette proposition répond à une objection… » ; chez Oscar, « Ton objection sur « … » a reçu une réponse. », une échéance, « Lever l'objection » et « Réitérer l'objection » ; levée : « Objection levée. », le message dit « objection levée » sans plus aucun geste ; Vera peut de nouveau voter | +| C29 | Objection « contredit », levée à l'échéance | groupe d'essai : Aude propose un article qui contredit « Réciprocité » ; Oscar fait une objection « Contredit » ; Aude déplie le vote de sa proposition → « Reformuler », change le fond, « Enregistrer la correction » ; Oscar ne fait rien ; trois jours passent (l'automate avance l'horloge du serveur : `POST /api/dev/clock`, connexion de développement seulement) | chez Aude : « Elle contredit « Réciprocité ». », « Pour qu'elle se vote à nouveau, reformule-la… », « Reformuler » ouvre « Détails » avec le formulaire de modification ; « Nouvelle version enregistrée : les votants devront reconfirmer. », puis « Une réponse est arrivée : Oscar lève ou réitère l'objection d'ici le … » ; trois jours après : l'objection dit « levée : 3 jours sans suite », la proposition se vote de nouveau, le message d'Oscar dit « objection levée : 3 jours sans suite », sans geste | +| C30 | La coquille d'un autre, validée par l'auteur | groupe d'essai : Aude propose « Clé unique et vivante » ; Vera, dans « Détails » → « Corriger une coquille », apostrophes typographiques → « Enregistrer la correction » ; Aude ouvre « Messages » → « Valider » | chez Vera : « Ta correction attend l'auteur du texte : elle s'applique quand il la valide, ou d'elle-même le … » ; le texte ne change pas ; « Coquilles proposées » montre le diff, « proposée par Vera », « en attente : s'applique d'elle-même le … » ; chez Aude : « Vera propose une correction de coquille dans ta version « Clé unique et vivante ». », le diff, une échéance, « Valider » / « Refuser » ; « Correction appliquée. », le message dit « correction appliquée » ; le texte porte la correction, l'historique « coquille corrigée · par Vera · validée par Aude » | +| C31 | Coquille sur un texte en vigueur | groupe d'essai : une administratrice (Ada) ouvre le groupe ; Vera, sur « Raison d'être » → « Le vote » → « Coquilles, traductions, objections, historique » → « Corriger une coquille », « C'est le seul » → « C’est le seul » ; Ada ouvre « Messages » → « Valider » | chez Vera : « Ta correction attend un administrateur, ce texte venant du seed… » ; le texte en vigueur ne change pas (« C'est le seul ») ; la correction en attente se lit dans « Détails » ; chez Ada : « Vera propose une correction de coquille dans « Raison d'être », un texte du seed : un administrateur la valide. » ; après « Valider », le texte en vigueur porte « C’est le seul » et l'historique « validée par Ada » | ## Au-delà de la liste @@ -66,3 +70,4 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa | 2026-10-30 | automate | local, lot A (entrée, logo, ambiances, menu, listes, Décisions) | C1–C17, M1 | 18 / 18 verts | | 2026-10-30 | automate | local, lot C (inertie à cinq crans, réglages de la formule) | C1–C20, M1 | 21 / 21 verts | | 2026-10-31 | automate | local, lot B (le vote déplié, le panier, le vote par la chaîne Ğ1 simulée) | C1–C24, M1 | 25 / 25 verts | +| 2026-10-31 | automate | local, lot F (objections « redit » / « contredit », coquilles validées, messages ; horloge du serveur avancée pour l'échéance) | C1–C24, C28–C31, M1 | 29 / 29 verts |