From 4bdaf0e9950c6c32cceab00af4a2234c1a2034b4 Mon Sep 17 00:00:00 2001 From: Yvv Date: Sat, 31 Oct 2026 05:58:17 +0100 Subject: [PATCH] =?UTF-8?q?v3=20:=20ADR=200009,=20les=20modules=20d'ordre?= =?UTF-8?q?=20et=20de=20titre=20;=20chantier,=20contr=C3=B4les=20C25?= =?UTF-8?q?=E2=80=93C27,=20ADR=200007,=20structure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ADR 0009 : un module est une unité du document (units.kind), ses versions des propositions ; l'ordre d'une section se complète à la fin quand des articles entrent ou sortent pendant son vote (ni caduc, ni à reconfirmer) ; un nouvel article se place à la fin de sa section ; à l'entrée d'un titre, ses traductions passent « à revoir » ; l'ajout gardé des documents existants. ADR 0007 : l'échantillon de la participation nomme ses statuts (open, in_force, applied) ; ce que les réglages disent d'une participation ramenée. CHANTIER : ce que voit la personne, la règle des modules, les crans 2 et 4. CONTROLES : C3, C17, C20 mis à jour, C25 à C27, le passage du lot D (29 / 29). Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 22 ++-- docs/adr/0007-inertie-cinq-crans.md | 21 +++- docs/adr/0009-modules-ordre-et-titre.md | 117 ++++++++++++++++++ docs/adr/README.md | 1 + docs/chantiers/acte-certification/CHANTIER.md | 52 ++++++-- .../chantiers/acte-certification/CONTROLES.md | 14 ++- 6 files changed, 202 insertions(+), 25 deletions(-) create mode 100644 docs/adr/0009-modules-ordre-et-titre.md diff --git a/CLAUDE.md b/CLAUDE.md index 1f188c4..fe24ae3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -36,7 +36,8 @@ 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), order (l'ordre + # d'une section : qui en est, complété à la fin, places), pending (modules à voter) trustin-access/ # règles d'accès de trustinWallet : sees / opens / manages_access, vote_way (serveur ou # chaîne), groupes par défaut ld-server/ @@ -47,23 +48,28 @@ crates/ # 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é) + # · modules.rs / order.rs / doc_title.rs (les modules, ADR 0009 : l'ordre d'une + # section, le titre du document) · module_amend.rs (ajout gardé) · web.rs (sert web/build) + tests/ # api.rs (scénarios bout en bout) · ballots.rs (vote par la chaîne, indexeur simulé) · + # modules.rs (ordre, titre, ajout gardé) seeds/ # acte-engagement-certification.json (trilingue, 33 articles, I1/E1/E2 en vigueur ; - # inertie 3, E1/E2 à 4) + # inertie 3, E1/E2 à 4 ; modules : le titre à 4, l'ordre de chaque section à 2) # upcoming/.json : les « À venir » des outils d'un groupe (fr, en, es), lus au démarrage web/src/ lib/i18n/ # fr.ts SOURCE (types Key) · en.ts · es.ts — parité testée lib/components/ # Sidebar, DocPanel, VoteFold (le vote déplié sous l'article), BallotPanel (panier), - # ChainSign (signature, Ğecko), VersionDetails, ProposeView, UnitBlock, DeepList, Seal… + # ChainSign (signature, Ğecko), VersionDetails, ProposeView, UnitBlock, DeepList, + # OrderModule / OrderEditor (l'ordre d'une section, la liste où l'on clique), + # TitleBar / TitlePropose (le titre du document), 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, modules + lib/order.ts # PUR : placer, monter / descendre, ce qui a bougé 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 +web/e2e/ # Playwright C1–C27 + 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 +91,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 diff --git a/docs/adr/0007-inertie-cinq-crans.md b/docs/adr/0007-inertie-cinq-crans.md index 1b5b3dd..f702fb7 100644 --- a/docs/adr/0007-inertie-cinq-crans.md +++ b/docs/adr/0007-inertie-cinq-crans.md @@ -30,16 +30,21 @@ s_k = M_k + (1 − M_k)·(1 − p̃^G_k) ⇔ G_k = ln(1 − (s_k − M_k)/(1 | Cran | Nom | M_k | s_k | |---|---|---|---| | 1 | très basse | 50 % | 60 % | -| 2 | basse | 50 % | 67 % | +| 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 doc, lot D) | 60 % | 83 % | +| 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, brouillons et - propositions retirées exceptés) qui portent au moins un vote sur leur révision actuelle, le dernier exprimé depuis - moins de 365 jours ; +- 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 @@ -63,6 +68,12 @@ s_k = M_k + (1 − M_k)·(1 − p̃^G_k) ⇔ G_k = ln(1 − (s_k − M_k)/(1 - 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. +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 diff --git a/docs/adr/0009-modules-ordre-et-titre.md b/docs/adr/0009-modules-ordre-et-titre.md new file mode 100644 index 0000000..058bd9b --- /dev/null +++ b/docs/adr/0009-modules-ordre-et-titre.md @@ -0,0 +1,117 @@ +# 0009 — Les modules : l'ordre des articles de chaque section, le titre du document + +> Complète [0002](0002-vote-permanent.md) (vote permanent), [0007](0007-inertie-cinq-crans.md) +> (inertie à cinq crans) et [0008](0008-vote-par-transaction.md) (vote par la chaîne). Décisions +> d'Yvv à la revue du 2026-10-30 (L11) ; la règle des articles qui entrent ou sortent pendant le +> vote d'un ordre est le choix du lot D, isolé dans `ld-engine` pour être changé seul. + +**Contexte.** Un texte de référence vit article par article : chacun entre en vigueur à son +seuil. Deux choses n'avaient pas de vote : la place des articles dans leur section (fixée par le +seed, puis « après tel article » au choix de qui proposait) et le titre du document (écrit une +fois, au seed). Yvv, 2026-10-30 : « En fin de section, il y a un "module" qui permet de changer +l'ordre des "articles". Lui-même à (2), avec une simple liste clipable. » ; « Le titre du doc à +(4). » ; « Non, titre et texte ensemble » — le titre d'un article reste voté avec son texte : +seul le titre du document est un module à part. + +## Décision + +### Un module est une unité du document, ses versions sont des propositions + +`units.kind` (`article` par défaut, `title`, `order` ; migration `0007_modules.sql`, additive). +Un module a, comme un article, une inertie, une version en vigueur, des propositions ouvertes, +des votes, des changements d'inertie. Tout ce qui sert au vote d'un article lui sert sans +chemin à part : le vote déplié, le panier, le bulletin sur la chaîne Ğ1 (`ballots.rs` valide +les lignes contre les propositions du document : un module y est), le balayage, l'adoption +(`ld_engine::compose`), la marge du texte en place (0002), le cran (0007), « Décisions » +(`ld_engine::pending`). + +- **Le titre du document** — code `titre`, inertie **4**. Une version = un titre dans la langue + source (corps vide). Elle se propose en tête du lecteur (« Proposer un autre titre », + `POST /api/units/{id}/title`) ; une coquille s'y corrige sans vote (0003) ; elle se traduit. +- **L'ordre d'une section** — code `ordre.
`, inertie **2**, un par section. Une version = + la liste des articles de la section, un identifiant par ligne. Elle se propose en fin de + section (« Proposer un autre ordre », `POST /api/units/{id}/order`) avec une liste où l'on + clique : un article, puis sa nouvelle place, ou ses flèches, ou le clavier (Entrée choisit, + haut et bas déplacent). Un ordre ne se corrige pas et ne se traduit pas (`409 order_fixed`) : + on en propose un autre. +- L'écriture générique (`POST /api/docs/{id}/proposals`) refuse un module (`400 module`) : chacun + se propose à sa place. + +### Qui est dans l'ordre d'une section + +Les articles de la section qui ont un texte en vigueur ou une version ouverte (texte ou +retrait) ; ni les brouillons, ni les retirés. Dans l'ordre des positions. La même règle en Rust +(`DocState::members`) et en SQL (`order::sections_now`). Une section d'**un seul article n'a +rien à décider** : son ordre n'est jamais « à voter », ni montré, ni compté (`Module.moot`). + +### Quand des articles entrent ou sortent pendant le vote d'un ordre : complété à la fin + +Une proposition d'ordre garde **les votes reçus**. Ce qui est voté est l'ordre relatif des +articles qu'elle nomme ; on le lit toujours contre les articles présents +(`ld_engine::order::fit`) : + +- les articles encore dans la section gardent l'ordre proposé ; +- un article **arrivé depuis** se place **à la fin**, dans l'ordre de la section (« 1 article + entré depuis, placé à la fin ») ; +- un article **sorti** (retiré, rejeté) disparaît de l'ordre, sans autre effet ; +- une proposition qui, ainsi complétée, **redit l'ordre en vigueur** ne peut pas entrer (« c'est + l'ordre en vigueur ») : elle reste ouverte, sans effet, jusqu'à ce qu'un autre ordre entre. + +Écartées : **caduque** (un vote permanent dans une section vivante ne passerait jamais : chaque +nouvel article remettrait les compteurs à zéro) et **à reconfirmer** (même effet, plus lent, et +demande aux votants un geste qu'ils ne savent pas devoir faire). Compléter à la fin respecte ce +qui a été voté — l'ordre entre les articles connus — et la règle de placement par défaut. + +### Les articles nouveaux se placent à la fin de leur section + +Une proposition de nouvel article nomme sa **section** ; elle s'y place à la fin +(`ld_engine::order::place_at_end`). Un ancien client qui nomme un article (`afterUnitId`) obtient +la fin de la section de cet article. « Après tel article » n'existe plus : la place se vote, par +l'ordre de la section. + +### Quand un ordre entre en vigueur + +Il redistribue **les positions déjà tenues par la section** à ses articles, dans le nouvel ordre +(`ld_engine::order::positions`) : rien ne bouge hors de la section, aucun texte ne change, aucun +vote d'article n'est touché. L'ordre d'avant redevient une proposition ouverte, avec ses votes, +et peut revenir. + +### Quand un titre entre en vigueur + +`documents.title` prend le nouveau titre dans la langue source. Les traductions restent +éditoriales (le français voté fait foi) : la nouvelle version reprend celles du titre qu'elle +remplace, attachées au texte de ce titre-là, donc **« traduction à revoir »** jusqu'à ce qu'une +personne traduise le nouveau. Le titre du document dans les autres langues suit ses traductions, +fraîches ou à revoir (`doc_title::sync`, rejoué aussi à chaque mise en file de publication : une +coquille ou une traduction du titre en vigueur s'y reporte). + +### Publication + +`fr.md` ne change pas de forme : les articles dans leur ordre en vigueur, sous le titre en +vigueur. `en.md` / `es.md` portent une ligne de commentaire quand la traduction du titre est à +revoir. `document.json` gagne `modules` : le titre (inertie, statut, date d'entrée, votes, +traductions et leur fraîcheur) et chaque ordre (section, inertie, statut, date, votes, articles +par leur code). + +### Les documents qui existent déjà + +Le seed déclare les crans (`"modules": {"title": {"inertia": 4}, "order": {"inertia": 2}}`) ; une +base neuve crée les modules en même temps que les articles. Un document existant les reçoit par +un **ajout gardé** (`crates/ld-server/src/module_amend.rs`, dans la ligne de `seed_amend.rs` et +`inertia_amend.rs`) : une seule fois par document (journal `module_amendments`, migration +`0007`), depuis l'état présent — le titre en vigueur est le titre actuel du document, avec ses +traductions ; l'ordre en vigueur d'une section est l'ordre actuel de ses articles —, sans +toucher un article ni un vote. Les versions créées sont des « seed a minima » (en vigueur sans +vote, marge −C) : elles restent sous vote comme tout texte. Un document qui a déjà des modules, +ou sans titre, est noté et laissé. + +## Ce que ça coûte + +- Le seed de l'acte d'engagement passe de 33 à **41 modules à voter** : 33 articles, le titre, et + l'ordre de 7 sections (l'ordonnancement n'a qu'un article). C17 et les comptes de + « Décisions » le disent. +- Les aperçus (« si les bien cotées passent », « si tout passe ») montrent les articles seuls : + un ordre ou un titre proposé n'y change pas encore la place des articles ni le titre. +- Un ordre ouvert sur une section revenue à un seul article reste en base, sans être montré ni + compté. +- Les codes des nouveaux articles restent `N` (sans lien avec la section), comme avant. diff --git a/docs/adr/README.md b/docs/adr/README.md index b52ba84..3dbd9fc 100644 --- a/docs/adr/README.md +++ b/docs/adr/README.md @@ -13,3 +13,4 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan | [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 | +| [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 | diff --git a/docs/chantiers/acte-certification/CHANTIER.md b/docs/chantiers/acte-certification/CHANTIER.md index 8fe23b2..96001d0 100644 --- a/docs/chantiers/acte-certification/CHANTIER.md +++ b/docs/chantiers/acte-certification/CHANTIER.md @@ -33,7 +33,15 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. **Raison d'être** (texte d'Yvv du 2026-10-30, qui remplace le Préambule : « Derrière une clé il n'y a qu'un seul être humain vivant ; derrière un être humain, il n'y a qu'une seule clé certifiante. ») et les deux engagements fondamentaux (Unicité du compte, Réciprocité), marqués - *seed a minima · 0 vote*. Au survol (ou toujours visibles sur mobile), trois gestes discrets : + *seed a minima* avec leur nombre réel de votes (*seed a minima · 0 vote*, puis *· 1 vote*…). + **Le titre du document est un module** (inertie 4) : sous le titre, son état (en vigueur sans + vote, ou adopté le…), « traduction à revoir » quand le titre lu est la traduction d'un titre + remplacé, et les mêmes gestes : **Le vote** · **Propositions** · **Proposer un autre titre**. + **Chaque section se termine par l'ordre de ses articles**, un module à l'inertie 2 : ses + articles numérotés en deux lignes au plus, la liste entière dans son vote, et + **Proposer un autre ordre** — une liste où l'on clique un article puis sa nouvelle place (ou + ses flèches, ou au clavier : Entrée le choisit, haut et bas le déplacent), puis « Proposer cet + ordre ». Une section d'un seul article n'a pas d'ordre à décider. Au survol (ou toujours visibles sur mobile), trois gestes discrets : **Le vote** · **Les propositions** · **Proposer**. **Le vote se déplie sous l'article**, façon accordéon (un seul à la fois, l'état dans l'URL : `?vote=`) : le niveau d'eau, les totaux pour et contre (jamais qui), le seuil et les voix qui manquent, ton vote et où il en est @@ -50,14 +58,16 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre. nombre et la meilleure en tête (niveau d'eau, pour / contre) ; la ligne se déplie sur ses versions, chacune avec son étiquette, son niveau et ses marques, et chacune déplie son vote. Les filtres gardent un article dès qu'une de ses versions passe. Chaque section offre - **« Voter cette section »**. + **« Voter cette section »**. Un ordre proposé s'y lit à la fin de sa section (ses articles + dans l'ordre proposé, les déplacés marqués dans son vote), un titre proposé en tête. 6. **Le vote groupé** (Yvv, 2026-10-30 : « Je peux voter tout d'un coup, ou une section entière, ou un article avec son titre, ou séparément ») : « Voter en lot » ouvre un **panier** — pour, contre ou retirer, article par article ; « tout pour » / « tout contre » pour une section ou tout le document, jamais pour un article dont plusieurs versions sont en concurrence (il est montré, on y choisit sa version) ; puis un seul geste : une écriture dans un groupe géré, une transaction sur la chaîne Ğ1 dans Monnaie libre. Le panier tient sur un téléphone et reste - le temps de l'onglet. + le temps de l'onglet. Les modules y sont : le titre du document en premier, l'ordre de chaque + section à la fin de celle-ci (« tout pour » une section remplit aussi son ordre). 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. @@ -82,9 +92,9 @@ G_k = ln(1 − (s_k − M_k)/(1 − M_k)) / ln(p̃). | Cran | Nom | M_k | s_k | Au départ | |---|---|---|---|---| | 1 | très basse | 50 % | 60 % | | -| 2 | basse | 50 % | 67 % | | -| 3 | moyenne | 55 % | 75 % | partout | -| 4 | haute | 60 % | 83 % | Unicité du compte, Réciprocité (et le titre du doc, à venir) | +| 2 | basse | 50 % | 67 % | l'ordre des articles de chaque section | +| 3 | moyenne | 55 % | 75 % | partout ailleurs | +| 4 | haute | 60 % | 83 % | Unicité du compte, Réciprocité, le titre du document | | 5 | très haute | 66 % | 90 % | | **La participation habituelle p̃** = la médiane des votants des propositions du groupe votées @@ -119,6 +129,31 @@ L'article dit le passé de son inertie : passée de tel cran à tel autre, par u réglage de départ du texte (E1 et E2 relevés de 3 à 4 dans une base existante, seulement si aucun vote n'a changé leur inertie : `crates/ld-server/src/inertia_amend.rs`). +### Les modules : l'ordre des articles, le titre du document (ADR 0009) + +Revue du 2026-10-30 : « En fin de section, il y a un "module" qui permet de changer l'ordre des +"articles". Lui-même à (2), avec une simple liste clipable. » ; « Le titre du doc à (4). » ; le +titre d'un article reste voté avec son texte. + +- Un module se vote **comme un article** : déplié, dans le panier, par la chaîne Ğ1 dans + Monnaie libre, avec la marge du texte en place (seed a minima : −C) et son cran. Son inertie + se vote aussi. Il compte dans « Décisions » : le seed passe de 33 à **41 modules à voter** + (33 articles, le titre, l'ordre de 7 sections ; l'ordonnancement n'a qu'un article). +- **L'ordre d'une section** est la liste de ses articles qui ont un texte en vigueur ou une + version ouverte. Un ordre proposé garde ses votes quand la section change : les articles + arrivés depuis se placent **à la fin**, les articles sortis disparaissent ; s'il redit alors + l'ordre en vigueur, il ne peut pas entrer. Ni caduc, ni à reconfirmer : un vote permanent dans + une section vivante ne passerait sinon jamais. À l'entrée, les articles de la section prennent + ses places dans le nouvel ordre ; rien d'autre ne bouge. Moteur : `crates/ld-engine/src/order.rs`. +- **Un nouvel article** se propose dans une section et se place à sa fin ; sa place se vote + ensuite, par l'ordre de la section. +- **Le titre du document** : à l'entrée d'un autre titre, le document change de titre en + français ; ses traductions restent éditoriales et passent « à revoir » jusqu'à ce qu'on les + reprenne. Une coquille du titre se corrige sans vote. +- Dans une base existante, chaque document reçoit ses modules **une fois**, depuis son état + présent (titre actuel, ordre actuel de chaque section), sans toucher un article ni un vote + (`crates/ld-server/src/module_amend.rs`, journal `module_amendments`, migration `0007`). + ### Corriger n'est pas voter **Une coquille touche les lettres et les espaces, rien d'autre.** Accents, majuscules, le style @@ -199,7 +234,8 @@ traductions marquées éditoriales) et `document.json`, commit et pousse sur `git.open.us.org/yvv/decision-depot-textes-reference`, chemin `monnaie-libre/acte-engagement-certification/`. Échec → nouvel essai avec délai croissant. La clé de publication est générée par le serveur ; sa partie publique s'affiche dans trustinWallet, à ajouter comme clé de déploiement (écriture) -du dépôt. Le groupe d'essai ne publie jamais. +du dépôt. Le groupe d'essai ne publie jamais. `document.json` dit aussi les modules : le titre +(son état, ses votes, ses traductions et leur fraîcheur) et l'ordre de chaque section. ### Un texte de départ remplacé @@ -274,6 +310,8 @@ 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. +- Les aperçus (« si les bien cotées passent », « si tout passe ») montrent les articles seuls : + un ordre ou un titre proposé n'y change pas encore la place des articles ni le titre (ADR 0009). ## Questions ouvertes (à Yvv) diff --git a/docs/chantiers/acte-certification/CONTROLES.md b/docs/chantiers/acte-certification/CONTROLES.md index e4da467..f352c7e 100644 --- a/docs/chantiers/acte-certification/CONTROLES.md +++ b/docs/chantiers/acte-certification/CONTROLES.md @@ -4,9 +4,9 @@ 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, C25, C26) 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 +votes par la chaîne Ğ1 (C11, C17, C23, C25) 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) ; pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. @@ -14,7 +14,7 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. |---|---|---|---| | C1 | L'accueil, sans session | ouvrir `/` sans être connectée | « Rendre possible la décision collective », puis le leitmotiv en trois lignes : « contexte et cadrage », « processus et modalités », « boîte à outils » ; « Se connecter avec sa clé Ğ1 » et sa note ; pas de piliers ni de groupes ; le menu à gauche avec les quatre outils, trois éteints | | C2 | L'accueil, avec session | se connecter : on arrive sur `/` | le titre, le leitmotiv, puis directement le choix du groupe : Monnaie libre en grand, Axiom, Librodrome, Groupe local Vallée Drôme Crestois ; **pas** l'Atelier du canal ; `/groupes` et « Mes groupes » (menu) ramènent ici | -| 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) | +| 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 » — le nombre réel de ses votes, qui change quand on vote —, sous le titre du document et à la fin de chaque section ses modules (C25, C26) ; 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. » | @@ -29,14 +29,17 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv. | C14 | La page d'un groupe | Monnaie libre | le nom ; le pavé des quatre piliers (Docs de référence « ouvert », les trois autres « à venir ») ; « En cours » : l'Acte d'engagement Certification, qui ouvre son lecteur | | C15 | Le menu | survoler les outils ; ouvrir Docs, puis Mandats ; revenir à l'accueil | « 1 » à côté de « Docs de référence » ; aucun outil surligné sur la page du groupe, seul celui où l'on est ensuite ; au survol, seul Docs réagit ; Mandats s'ouvre quand même (ses « À venir ») ; hors d'un groupe, les outils mènent au dernier groupe ouvert (ou à l'accueil s'il n'y en a pas) | | C16 | En cours, à venir | Monnaie libre → Docs, Mandats, Protocoles ; les anciennes adresses `/decisions`, `/mandats`, `/protocoles` | Docs : « En cours » (Acte d'engagement Certification) et « À venir » (Acte d'engagement forgerons) ; Mandats : Administration forum Duniter, Administration forum Monnaie libre ; Protocoles : Runtime upgrade — décision on-chain ; les « À venir » sont éteints, sans lien ; ils suivent la langue ; les anciennes adresses mènent aux outils du groupe courant | -| C17 | Décisions | Monnaie libre → Décisions ; voter (par la chaîne : bulletin, transaction, confirmation) sur une version d'un article, recharger | une ligne par doc : « Acte d'engagement Certification · 33 modules à voter · dont 33 sans ton vote », puis « dont 32 » ; la ligne ouvre le lecteur | +| C17 | Décisions | Monnaie libre → Décisions ; voter (par la chaîne : bulletin, transaction, confirmation) sur une version d'un article, recharger | une ligne par doc : « Acte d'engagement Certification · 41 modules à voter · dont 41 sans ton vote » (33 articles, le titre, l'ordre de 7 sections), puis « dont 40 » ; la ligne ouvre le lecteur | | C18 | La Raison d'être | Monnaie libre → Acte d'engagement Certification, puis EN, puis ES | en tête du texte en vigueur, « Raison d'être » : la première phrase en italique, puis deux paragraphes ; « Purpose », « Razón de ser » | | C19 | Les versions d'un article | Monnaie libre → « Propositions en cours » → « Connaissance suffisante » (au clavier : Tab jusqu'à la ligne, Entrée) | une seule ligne, « 2 versions » ; dépliée : « variante 1.0.0 » et « variante 0.4.0-draft », chacune avec son niveau et ce qui la distingue ; un clic sur une version déplie son vote sous elle ; un nouveau clic sur la ligne la replie | -| C20 | Réglages de la formule et cinq crans | Monnaie libre → Acte d'engagement : « Réglages de la formule » (en-tête) ; puis Unicité du compte → « Le vote » → « Réglages de la formule » ; dans le groupe d'essai, Réciprocité → « Le vote » → « Proposer un changement d'inertie » → 5 → « Soumettre au vote » | W 5 745 (toile de confiance Ğ1), C 50, B 0,1 ; « 100 votants sur 5 745 (1,74 %), deux fois C : la participation de référence… (0 pour l'instant) » ; le tableau des cinq crans : très basse, basse, moyenne, haute, très haute ; M 50, 50, 55, 60, 66 % ; part exigée 60, 67, 75, 83, 90 % ; voix pour à 100 votants 80, 84, 88, 92, 95 ; depuis le vote déplié : « Inertie · 4 / 5 · haute », la ligne du cran 4 marquée « cet article », 50 voix à 0 votant ; le sélecteur montre les cinq crans, 4 « actuelle » et grisé ; le vote de la proposition se déplie : « inertie vers 5 / 5 · très haute », votée à « inertie 4 / 5 · haute » | +| C20 | Réglages de la formule et cinq crans | Monnaie libre → Acte d'engagement : « Réglages de la formule » (en-tête) ; puis Unicité du compte → « Le vote » → « Réglages de la formule » ; dans le groupe d'essai, Réciprocité → « Le vote » → « Proposer un changement d'inertie » → 5 → « Soumettre au vote » | W 5 745 (toile de confiance Ğ1), C 50, B 0,1 ; « 100 votants sur 5 745 (1,74 %), deux fois C : la participation de référence… (0 pour l'instant) » ; le tableau des cinq crans : très basse, basse, moyenne, haute, très haute ; M 50, 50, 55, 60, 66 % ; part exigée 60, 67, 75, 83, 90 % ; voix pour à 100 votants 80, 84, 88, 92, 95, « Voix pour : à 100 votants, comme d'habitude. » ; depuis le vote déplié : « Inertie · 4 / 5 · haute », la ligne du cran 4 marquée « cet article », 50 voix, « Voix pour : à 0 votant, la participation de cette version. » ; le sélecteur montre les cinq crans, 4 « actuelle », atteignable au clavier mais jamais choisi ; un seul arrêt de tabulation ; les flèches passent d'un cran à l'autre et le choisissent, en boucle ; le vote de la proposition se déplie : « inertie vers 5 / 5 · très haute », votée à « inertie 4 / 5 · haute » | | 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à | +| C25 | L'ordre des articles | groupe d'essai : en fin de « Conclusion », « Proposer un autre ordre » ; cliquer « Monnaie G1 » puis la place 1 ; au clavier, flèche bas puis haut ; « Proposer cet ordre » ; « Pour » ; une deuxième personne vote « Pour » ; puis, dans Monnaie libre, sur un téléphone, avec un portefeuille : « Voter en lot », « Pour » sur « Ordre des articles · Engagements fondamentaux », « Signer et envoyer (1) » | chaque section finit par « Ordre des articles ·
» (7, aucun pour l'Ordonnancement, un seul article), ses articles numérotés, « 2 articles · inertie 2 / 5 · basse », « seed a minima · 0 vote » (1 vote après un « Pour », 0 après le retrait) ; la liste où l'on clique : l'article choisi marqué, puis à sa place, annoncé (« « Monnaie G1 » en place 1 sur 2. »), « Proposer cet ordre » éteint tant que c'est l'ordre en vigueur ; le vote de l'ordre proposé se déplie dans la liste des propositions, l'ordre proposé en clair ; il est dans le panier, à la fin de sa section ; à la deuxième voix : « Le nouvel ordre de « Conclusion » est entré en vigueur. », la section se lit dans le nouvel ordre ; par la chaîne : « Ton vote compte : il est inscrit sur la chaîne Ğ1. », « seed a minima · 1 vote » ; sur un téléphone, rien ne déborde, chaque ligne fait au moins 44 px | +| C26 | Le titre du document | groupe d'essai : sous le titre, « Proposer un autre titre » ; « Acte d'engagement de la certification » ; « Pour » ; une deuxième personne vote « Pour » ; lire en anglais | sous le titre : « Titre du document · inertie 4 / 5 · haute · seed a minima · 0 vote » et les trois gestes ; le titre proposé se vote dans la liste des propositions (« Titre du document ») ; à la deuxième voix : « Le titre « … » est entré en vigueur. », le document change de titre, son vote reste déplié sous le titre (2 pour) ; en anglais, l'ancien titre traduit, marqué « translation needs review » | +| C27 | La participation ramenée dans ses bornes | un groupe de 4 dont la médiane est 2,5 votants, ramenée à 50 % (l'automate fait répondre ces chiffres au serveur) : « Réglages de la formule » | « 3 votants sur 4 (62,5 %) : la médiane des 12 propositions votées depuis un an. » — la part de la mesure elle-même, jamais 3 sur 4 arrondi d'abord ; puis « Ramenée entre 5 % et 50 % de l'électorat : le groupe demande ses voix pour comme si 2 personnes votaient (50 %). » ; « Part exigée : les « pour » demandés au-delà de C, à 2 votants comme d'habitude. » | ## Au-delà de la liste @@ -66,3 +69,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 D (l'ordre des articles, le titre du document, la participation ramenée) | C1–C27, M1 | 29 / 29 verts |