forked from yvv/decision
v3 : ADR 0008, le vote par transaction sur la chaîne Ğ1 ; chantier, contrôles C21–C24, structure
- ADR 0008 : bulletin scellé (ld1: + blake2b-256, sel de 128 bits), la transaction utility.batchAll (virement + remarque), la confirmation sur l'indexeur, le dernier fait foi dans l'ordre de la chaîne, groupes gérés, ce que voit la chaîne, ce que sait le serveur, réglages LD_VOTE_*, coût et limites. Noté dans 0006. - CHANTIER : le vote déplié, le panier, « une personne, une voix » par la chaîne ; le droit de vote se vérifie au moment de la confirmation sur la chaîne. - CONTROLES : C4, C5, C6, C11, C17, C19, C20, M1 mis à jour ; C21–C24 ; passage du lot B, 25 / 25 verts. - CLAUDE.md : ballots.rs, indexer.rs, ballot/address du moteur, wallet/, panier, chaîne simulée des e2e. Compose : où poser LD_VOTE_ACCOUNT (en commentaire). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,7 +22,7 @@ développer.
|
|||||||
- **Interface** : SvelteKit 2 / Svelte 5 (runes), adapter-static SPA, vite 7, vitest,
|
- **Interface** : SvelteKit 2 / Svelte 5 (runes), adapter-static SPA, vite 7, vitest,
|
||||||
Playwright ; npm. Polices Literata (textes) + Nunito (interface), fontsource.
|
Playwright ; npm. Polices Literata (textes) + Nunito (interface), fontsource.
|
||||||
- **Ports** : dev interface **3002** (strict, proxy `/api` → 8002) · serveur **8002** ·
|
- **Ports** : dev interface **3002** (strict, proxy `/api` → 8002) · serveur **8002** ·
|
||||||
serveur jetable des e2e **8092**.
|
serveur jetable des e2e **8092** (sa chaîne Ğ1 simulée prend un port local éphémère).
|
||||||
- **Déploiement** : une image (`docker/app.Dockerfile`), Woodpecker `ci.open.us.org` dépôt
|
- **Déploiement** : une image (`docker/app.Dockerfile`), Woodpecker `ci.open.us.org` dépôt
|
||||||
LPK/decision → sonic (fabio). `.woodpecker/app.yml` = le produit sur
|
LPK/decision → sonic (fabio). `.woodpecker/app.yml` = le produit sur
|
||||||
**decision.librodrome.org** ; `.woodpecker/maquette.yml` = la maquette sur
|
**decision.librodrome.org** ; `.woodpecker/maquette.yml` = la maquette sur
|
||||||
@@ -35,27 +35,36 @@ développer.
|
|||||||
crates/
|
crates/
|
||||||
ld-engine/ # PUR (zéro I/O) : threshold (formule inertielle), inertia (cinq crans, médiane,
|
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é,
|
# référence, échelle), edit (coquille vs fond, diff), assist (découpage, similarité,
|
||||||
# longueur), compose (adoption, aperçus)
|
# longueur), compose (adoption, aperçus), ballot (bulletin scellé ld1:, le dernier
|
||||||
trustin-access/ # règles d'accès de trustinWallet : sees / opens / manages_access, groupes par défaut
|
# fait foi, jugement d'une transaction), address (SS58, préfixe g1)
|
||||||
|
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/
|
ld-server/
|
||||||
migrations/ # schéma SQLite — additif seulement
|
migrations/ # schéma SQLite — additif seulement
|
||||||
src/ # lib.rs (routes, csrf, run) · config.rs (LD_*) · auth.rs (connect OAuth2, invitations,
|
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,
|
# 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
|
# traduire) · adoption.rs (balayage, verrou) · participation.rs (p̃, une fois par
|
||||||
# jour) · publish.rs (file → git) · wot.rs (W sur la chaîne) · seed.rs ·
|
# jour) · publish.rs (file → git) · wot.rs (W sur la chaîne) · seed.rs ·
|
||||||
# seed_amend.rs / inertia_amend.rs (amendements gardés) · web.rs (sert web/build)
|
# seed_amend.rs / inertia_amend.rs (amendements gardés) · ballots.rs (vote groupé,
|
||||||
tests/api.rs # scénarios bout en bout
|
# 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é)
|
||||||
seeds/ # acte-engagement-certification.json (trilingue, 33 articles, I1/E1/E2 en vigueur ;
|
seeds/ # acte-engagement-certification.json (trilingue, 33 articles, I1/E1/E2 en vigueur ;
|
||||||
# inertie 3, E1/E2 à 4)
|
# inertie 3, E1/E2 à 4)
|
||||||
# upcoming/<groupe>.json : les « À venir » des outils d'un groupe (fr, en, es), lus au démarrage
|
# upcoming/<groupe>.json : les « À venir » des outils d'un groupe (fr, en, es), lus au démarrage
|
||||||
web/src/
|
web/src/
|
||||||
lib/i18n/ # fr.ts SOURCE (types Key) · en.ts · es.ts — parité testée
|
lib/i18n/ # fr.ts SOURCE (types Key) · en.ts · es.ts — parité testée
|
||||||
lib/components/ # Sidebar, DocPanel, VoteView, ProposeView, UnitBlock, DeepList, Seal, Logo, Pillars…
|
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
|
||||||
routes/ # / (accueil + choix du groupe) · connexion · invitation · equipe · g/[group] (piliers, en cours) ·
|
routes/ # / (accueil + choix du groupe) · connexion · invitation · equipe · g/[group] (piliers, en cours) ·
|
||||||
# g/[group]/docs · g/[group]/docs/[doc] (lecteur,
|
# g/[group]/docs · g/[group]/docs/[doc] (lecteur,
|
||||||
# panneau dans l'URL ?onglet=&article=) · g/[group]/decisions · g/[group]/mandats ·
|
# 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
|
# g/[group]/protocoles (à venir) · acces (trustinWallet) ; /groupes, /decisions… redirigent
|
||||||
web/e2e/ # Playwright C1–C20 + M1 ; serve.sh = serveur jetable /tmp/ld-e2e sur :8092
|
web/e2e/ # Playwright C1–C24 + 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)
|
docker/ # app.Dockerfile · app-compose.yml (sonic)
|
||||||
.woodpecker/ # app.yml · maquette.yml
|
.woodpecker/ # app.yml · maquette.yml
|
||||||
docs/ # chantiers/ · adr/ · dev/BLUEPRINT-V2.md (doctrine de la maquette) · recherche/
|
docs/ # chantiers/ · adr/ · dev/BLUEPRINT-V2.md (doctrine de la maquette) · recherche/
|
||||||
@@ -76,7 +85,7 @@ maquette/ # v2 intacte (frontend Nuxt, backend FastAPI, docker, docs-v
|
|||||||
```bash
|
```bash
|
||||||
export PATH=$HOME/.cargo/bin:$PATH
|
export PATH=$HOME/.cargo/bin:$PATH
|
||||||
cargo fmt --all --check && cargo clippy --workspace --all-targets -- -D warnings && cargo test --workspace
|
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 : 21 contrôles
|
cd web && npm run check && npm test && npm run build && npm run e2e # e2e : 25 contrôles
|
||||||
|
|
||||||
LD_DEV_LOGIN=1 cargo run -p ld-server # :8002, sert web/build
|
LD_DEV_LOGIN=1 cargo run -p ld-server # :8002, sert web/build
|
||||||
cd web && npm run dev # :3002 à chaud
|
cd web && npm run dev # :3002 à chaud
|
||||||
@@ -93,7 +102,9 @@ docker build -f docker/app.Dockerfile --target production . # rejoue toute la
|
|||||||
- **Invariants** : une seule voix ne fait jamais passer un texte (C = 50 pour Monnaie libre) ;
|
- **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
|
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) ;
|
contradiction bloque ; l'inertie de l'inertie hérite du cran de l'article (cinq crans, ADR 0007) ;
|
||||||
le groupe d'essai ne publie jamais.
|
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).
|
||||||
- **Écritures** : en-tête `x-requested-with: libredecision` obligatoire (CSRF) ; cookie
|
- **Écritures** : en-tête `x-requested-with: libredecision` obligatoire (CSRF) ; cookie
|
||||||
`ld_session`. Les tests d'API passent par `Client` (`tests/api.rs`).
|
`ld_session`. Les tests d'API passent par `Client` (`tests/api.rs`).
|
||||||
- **Pièges vus** : `pkill -f target/debug/ld-server` tue son propre shell → `pkill -x ld-server` ;
|
- **Pièges vus** : `pkill -f target/debug/ld-server` tue son propre shell → `pkill -x ld-server` ;
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ services:
|
|||||||
LD_BOOTSTRAP_ADMIN: "1"
|
LD_BOOTSTRAP_ADMIN: "1"
|
||||||
LD_PUBLISH_REMOTE: ${LD_PUBLISH_REMOTE:-gitea@git.open.us.org:yvv/decision-depot-textes-reference.git}
|
LD_PUBLISH_REMOTE: ${LD_PUBLISH_REMOTE:-gitea@git.open.us.org:yvv/decision-depot-textes-reference.git}
|
||||||
LD_PUBLISH_BRANCH: main
|
LD_PUBLISH_BRANCH: main
|
||||||
|
# The vote through the Ğ1 chain (ADR 0008): LD_VOTE_ACCOUNT, the Ğ1 address of the vote
|
||||||
|
# account, once Yvv has created it (LD_VOTE_AMOUNT in cents, 10 by default). Without it,
|
||||||
|
# the vote through the chain is off and the interface says so; managed groups vote as before.
|
||||||
RUST_LOG: info,sqlx=warn,tower_http=warn
|
RUST_LOG: info,sqlx=warn,tower_http=warn
|
||||||
volumes:
|
volumes:
|
||||||
- data:/data
|
- data:/data
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ Duniter peut se loger et tout faire — sauf la gestion des accès », qui revie
|
|||||||
- **Une personne, une voix** : là où l'électorat est la toile de confiance (Monnaie libre),
|
- **Une personne, une voix** : là où l'électorat est la toile de confiance (Monnaie libre),
|
||||||
seuls ses membres votent ; une identité d'invitation y lit et propose. Un nouveau lien ne
|
seuls ses membres votent ; une identité d'invitation y lit et propose. Un nouveau lien ne
|
||||||
vise jamais une identité Ğ1 (un administrateur ouvrirait une session à sa place).
|
vise jamais une identité Ğ1 (un administrateur ouvrirait une session à sa place).
|
||||||
|
*Depuis le 2026-10-30 ([0008](0008-vote-par-transaction.md)) : dans Monnaie libre, chaque vote
|
||||||
|
est une transaction de la chaîne Ğ1 ; la voix est celle de l'identité du compte qui signe,
|
||||||
|
quelle que soit la session.*
|
||||||
- Premier administrateur : un lien d'invitation écrit au premier démarrage dans le volume de
|
- Premier administrateur : un lien d'invitation écrit au premier démarrage dans le volume de
|
||||||
données (0600), jamais dans les journaux.
|
données (0600), jamais dans les journaux.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,187 @@
|
|||||||
|
# 0008 — Le vote par transaction sur la chaîne Ğ1
|
||||||
|
|
||||||
|
> Complète [0002](0002-vote-permanent.md) (vote permanent) et [0006](0006-acces-connect-trustinwallet.md)
|
||||||
|
> (accès). Décision d'Yvv du 2026-10-30 (revue, L9) ; le format du bulletin, la voie du
|
||||||
|
> portefeuille et les réglages sont les choix par défaut d'orch (Q5, Q6, Q7), isolés pour être
|
||||||
|
> changés sans toucher au reste.
|
||||||
|
|
||||||
|
**Contexte.** Jusqu'ici, un vote était une ligne écrite par le serveur pour la session connectée.
|
||||||
|
Dans Monnaie libre, l'électorat W est la toile de confiance, mais la connexion Ğ1
|
||||||
|
(connect.monnaie-libre.fr) n'est pas active et toutes les identités viennent d'invitations : en
|
||||||
|
pratique, personne ne pouvait voter. Yvv, 2026-10-30 : « une personne une voix, mais la voix peut
|
||||||
|
s'exprimer plusieurs fois […] c'est le dernier qui fait foi. Pour garantir l'intégrité d'un vote,
|
||||||
|
je crois qu'il n'y a que la blockchain, donc une transaction par vote » ; « 0,1 Ğ1 » ; « qu'un
|
||||||
|
geste dans le vote » ; « Ğ1Companion ou Ğecko, à terme trustinWallet » ; « Je peux voter tout
|
||||||
|
d'un coup, ou une section entière, ou un article avec son titre, ou séparément. »
|
||||||
|
|
||||||
|
## Décision
|
||||||
|
|
||||||
|
### Qui vote où
|
||||||
|
|
||||||
|
- **Où l'électorat est la toile** (politique `g1-members` : Monnaie libre), chaque vote est **une
|
||||||
|
transaction de la chaîne Ğ1**, signée par le portefeuille de la personne. Le serveur n'y écrit
|
||||||
|
plus de vote direct (`409 chain_only`). La voix est celle de **l'identité Ğ1 du compte qui
|
||||||
|
signe**, quelle que soit la session qui a préparé le vote (invitation, plus tard connexion Ğ1).
|
||||||
|
- **Dans un groupe géré** (essai, Axiom…), le vote reste écrit par le serveur, sans chaîne ni
|
||||||
|
portefeuille, comme avant (`409 server_vote` si on y demande un bulletin). Le geste groupé y
|
||||||
|
marche aussi : une seule écriture.
|
||||||
|
- La règle est dans trustinWallet : `trustin_access::vote_way` (`chain` / `server`),
|
||||||
|
`votes_in`, `asks_ballot`, `chain_vote_counts`.
|
||||||
|
|
||||||
|
### Le bulletin scellé (Q5) — `crates/ld-engine/src/ballot.rs`
|
||||||
|
|
||||||
|
Le serveur scelle un **bulletin en attente** : le document, le compte qui signera (quand la page
|
||||||
|
le connaît), les lignes (version, révision votée, choix), un sel de 128 bits tiré au hasard. Sa
|
||||||
|
forme canonique, en ASCII, les lignes triées par version :
|
||||||
|
|
||||||
|
```
|
||||||
|
ld1
|
||||||
|
doc <id du document>
|
||||||
|
author <adresse Ğ1 du compte qui signe, ou ->
|
||||||
|
line <id de la version> <révision> <for|against|none>
|
||||||
|
…
|
||||||
|
salt <32 chiffres hexadécimaux>
|
||||||
|
```
|
||||||
|
|
||||||
|
`H = blake2b-256(forme canonique)` ; la **remarque** de la transaction est `ld1:` suivi des 64
|
||||||
|
chiffres hexadécimaux de H, 68 octets ASCII. Exemple (vecteur des tests, calculé à part) :
|
||||||
|
|
||||||
|
```
|
||||||
|
ld1
|
||||||
|
doc d0c
|
||||||
|
author -
|
||||||
|
line p1 3 for
|
||||||
|
line p2 1 against
|
||||||
|
salt 00112233445566778899aabbccddeeff
|
||||||
|
```
|
||||||
|
|
||||||
|
→ remarque `ld1:20448d496744292981c8586856afb58a86e37da2470f764b4e6ed84eade71340`, que
|
||||||
|
l'indexeur retrouve par `blake2b-256(remarque)` =
|
||||||
|
`0xe765221a75716dde863a7b53df3a97acf6db38a2118edd525d54c8a2979b7bc3`.
|
||||||
|
|
||||||
|
Le sel empêche de deviner le choix (trois choix par ligne se devineraient tous). L'adresse liée
|
||||||
|
empêche qu'un autre compte, qui recopierait la remarque, prenne le vote (voir les limites).
|
||||||
|
|
||||||
|
### La transaction (Q6) — `web/src/lib/wallet/`
|
||||||
|
|
||||||
|
```
|
||||||
|
utility.batchAll([
|
||||||
|
balances.transferKeepAlive(LD_VOTE_ACCOUNT, LD_VOTE_AMOUNT),
|
||||||
|
system.remarkWithEvent("ld1:" + H),
|
||||||
|
])
|
||||||
|
```
|
||||||
|
|
||||||
|
Un seul geste, atomique : le virement et la remarque passent ensemble ou pas du tout. La page la
|
||||||
|
fait signer par l'extension de portefeuille du navigateur (interface standard `injectedWeb3` /
|
||||||
|
`signPayload` : duniter-connect aujourd'hui, Ğ1Companion ou trustinWallet le jour où elles
|
||||||
|
l'offrent), avec **polkadot-api chargé au seul moment de signer**, et l'envoie à un nœud Ğ1
|
||||||
|
(`LD_VOTE_NODES`). Sans portefeuille dans le navigateur : **Ğecko**, par un lien et un QR code
|
||||||
|
`g1://<compte>?amount=0.1&comment=ld1:<H>` (un virement commenté, ce que Ğecko sait faire) ;
|
||||||
|
ce bulletin-là n'est lié à aucun compte, et la page attend.
|
||||||
|
|
||||||
|
### La confirmation — `crates/ld-server/src/ballots.rs`, `indexer.rs`
|
||||||
|
|
||||||
|
Le serveur lit l'indexeur (duniter-squid, `LD_INDEXERS`) :
|
||||||
|
|
||||||
|
```graphql
|
||||||
|
query Ballot($hash: String!) {
|
||||||
|
txComments(condition: {hash: $hash}, orderBy: BLOCK_NUMBER_ASC, first: 20) {
|
||||||
|
nodes { id blockNumber remark
|
||||||
|
author { id identity { index name isMember } }
|
||||||
|
transfersByCommentId { nodes { fromId toId amount } } } }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`hash` = `0x` + blake2b-256 des octets de la remarque. Il garde la première occurrence, dans
|
||||||
|
l'ordre de la chaîne, qui ne vient pas d'un autre compte que celui lié, puis exige :
|
||||||
|
|
||||||
|
1. la remarque exacte ;
|
||||||
|
2. dans la même transaction, un virement **du signataire vers le compte des votes**, d'au moins
|
||||||
|
le montant ;
|
||||||
|
3. une identité Ğ1 au signataire (`no_identity` sinon) ;
|
||||||
|
4. que cette identité soit **membre maintenant** (`not_member` sinon) — par la règle de
|
||||||
|
trustinWallet.
|
||||||
|
|
||||||
|
Le vote compte alors pour `idty:<index>` (créée si besoin : sorte g1, membre), ligne par ligne,
|
||||||
|
avec le bloc et le rang de l'évènement ; le balayage d'adoption tourne aussitôt. La session qui a
|
||||||
|
demandé le bulletin voit ces votes comme « ton vote » — et seulement ceux de ses bulletins : une
|
||||||
|
autre session ne voit jamais ce qu'a voté la même identité ailleurs.
|
||||||
|
|
||||||
|
Le serveur relit l'indexeur pour chaque bulletin en attente toutes les 10 secondes (tâche de
|
||||||
|
fond) et quand la page demande (au plus une lecture toutes les 3 secondes par bulletin). Un
|
||||||
|
bulletin non vu en **24 heures** est lâché. Cas d'erreur, chacun testé : indexeur muet (le
|
||||||
|
bulletin reste en attente), signataire non membre ou sans identité (refusé, et dit), mauvais
|
||||||
|
montant ou mauvais destinataire (refusé), déjà confirmé (rien ne change), révision changée entre
|
||||||
|
temps (le vote porte sur la révision votée : « à reconfirmer »).
|
||||||
|
|
||||||
|
### Le dernier fait foi
|
||||||
|
|
||||||
|
Par version et par identité, **dans l'ordre de la chaîne** : le bloc, puis le rang de
|
||||||
|
l'évènement (lu dans l'identifiant de l'évènement). Un bulletin confirmé tard ne remplace jamais
|
||||||
|
un bulletin plus récent sur la chaîne. « Retirer mon vote » est un bulletin dont la ligne vaut
|
||||||
|
`none`. Les transactions d'un même compte gardent l'ordre de ses envois (le nonce) ; le désordre
|
||||||
|
ne vient que de l'ordre de lecture de l'indexeur, et la règle l'absorbe.
|
||||||
|
|
||||||
|
Un bulletin que le portefeuille n'a pas signé (refus, fonds insuffisants, compte absent) est lâché
|
||||||
|
aussitôt par la page (`DELETE /api/ballots/{id}` : `expired`, raison `dropped`), pour ne pas
|
||||||
|
rester « en attente » une journée. Jamais un bulletin confirmé.
|
||||||
|
|
||||||
|
### Le vote groupé
|
||||||
|
|
||||||
|
Un panier : article par article ; « tout pour » / « tout contre » pour une section ou tout le
|
||||||
|
document — jamais pour un article dont plusieurs versions sont en concurrence : l'interface le
|
||||||
|
montre, on choisit sa version. Puis **un geste** : une écriture (groupe géré), ou **une
|
||||||
|
transaction** (chaîne) pour toutes les lignes, au même prix qu'une seule (0,1 Ğ1 par transaction,
|
||||||
|
pas par ligne ; 200 lignes au plus, 20 bulletins en attente par session).
|
||||||
|
|
||||||
|
### Ce que voit la chaîne
|
||||||
|
|
||||||
|
Qu'un compte (et son identité) a envoyé 0,1 Ğ1 au compte des votes avec une remarque `ld1:…`, à
|
||||||
|
tel bloc : **qui a voté et quand, jamais quoi** — ni le document, ni le nombre de lignes, ni les
|
||||||
|
choix. Le solde du compte des votes est public : il dit combien de votes ont été envoyés.
|
||||||
|
|
||||||
|
### Ce que sait le serveur
|
||||||
|
|
||||||
|
Les bulletins, leurs lignes, leurs sels, la session qui les a demandés et l'identité qui les a
|
||||||
|
signés : il sait qui a voté quoi, comme pour un vote direct, et ne montre que les totaux. Il ne
|
||||||
|
peut pas inventer un vote d'une identité (il faudrait sa signature sur la chaîne) ; il pourrait en
|
||||||
|
taire un. Chaque vote compté se vérifie contre la chaîne en recalculant H depuis les lignes et le
|
||||||
|
sel — ce que personne d'autre ne peut faire tant que les sels restent au serveur.
|
||||||
|
|
||||||
|
### Les réglages (Q7) — `crates/ld-server/src/config.rs`
|
||||||
|
|
||||||
|
- `LD_VOTE_ACCOUNT` : le compte des votes, une adresse Ğ1 (toute forme SS58, ramenée au préfixe
|
||||||
|
g1). **Sans lui, le vote par la chaîne est fermé** et l'interface le dit avec des mots simples ;
|
||||||
|
les groupes gérés votent comme avant. Une adresse illisible est journalisée et laisse le vote
|
||||||
|
fermé. Aucune adresse n'est écrite en dur.
|
||||||
|
- `LD_VOTE_AMOUNT` : en centimes de Ğ1, 10 par défaut (0,1 Ğ1), au moins 1.
|
||||||
|
- `LD_VOTE_NODES` : les nœuds où la page envoie la transaction (par défaut
|
||||||
|
`wss://rpc.duniter.org`, `wss://g1.axiom-team.fr/ws`).
|
||||||
|
- `LD_VOTE_TEST_NODE` : tests seulement, et seulement avec la connexion de développement : la page
|
||||||
|
envoie ce que le faux portefeuille a signé à un faux nœud, sans polkadot-api.
|
||||||
|
|
||||||
|
## Les données
|
||||||
|
|
||||||
|
Migration `0006`, additive : `ballots` (le bulletin, son sel, H, `0x`+blake2b-256 de la remarque,
|
||||||
|
le compte et le montant du moment, l'état `pending | confirmed | refused | expired`, la raison,
|
||||||
|
l'identité qui a voté, le signataire, le bloc, le rang, l'évènement, ce qui est entré en vigueur,
|
||||||
|
les dates) et `ballot_lines` (version, révision, choix). `votes` gagne `source` (`server` par
|
||||||
|
défaut : tous les votes d'avant restent tels quels), `block`, `event_index`, `ballot_id`.
|
||||||
|
|
||||||
|
## Coût
|
||||||
|
|
||||||
|
- Voter coûte 0,1 Ğ1 par geste, plus les frais de la chaîne (non mesurés ici) ; le portefeuille
|
||||||
|
doit garder au moins 1 Ğ1 (dépôt existentiel, `transferKeepAlive`). Le compte des votes
|
||||||
|
accumule ces Ğ1 : à qui il appartient, et ce qu'on en fait, reste à décider par Yvv.
|
||||||
|
- Le serveur **fait confiance à l'indexeur** pour la remarque, le virement, l'identité et
|
||||||
|
l'appartenance à la toile : un indexeur menteur ferait compter ou refuser un vote. Plusieurs
|
||||||
|
indexeurs se configurent ; lire les évènements sur un nœud serait l'étape suivante.
|
||||||
|
- Le droit de vote se vérifie **au moment de la confirmation sur la chaîne** : un membre sorti
|
||||||
|
de la toile ensuite garde ses voix.
|
||||||
|
- Par Ğecko, le bulletin n'est lié à aucun compte : un autre compte qui recopierait la remarque
|
||||||
|
et la ferait inclure avant (en payant 0,1 Ğ1) prendrait ce bulletin — ses lignes compteraient
|
||||||
|
pour lui. Par l'extension, le bulletin est lié au compte et la copie est ignorée.
|
||||||
|
- Un paiement Ğecko fait après 24 heures ne compte pas (il est perdu pour le vote).
|
||||||
|
- polkadot-api : environ 180 Ko (66 Ko compressés) chargés au moment de signer seulement ;
|
||||||
|
`node_modules` grossit d'environ 77 Mo (son outillage).
|
||||||
|
- La chaîne montre la participation de chacun (qui a voté, quand, combien de fois).
|
||||||
@@ -12,3 +12,4 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan
|
|||||||
| [0005](0005-publication-git.md) | Publication par file d'envoi vers un dépôt git | 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 |
|
| [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 |
|
| [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 |
|
||||||
|
|||||||
@@ -34,19 +34,32 @@ les applications clientes (Cesium, Ğecko…) peuvent suivre.
|
|||||||
il n'y a qu'un seul être humain vivant ; derrière un être humain, il n'y a qu'une seule 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
|
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 · 0 vote*. Au survol (ou toujours visibles sur mobile), trois gestes discrets :
|
||||||
**Le vote** (en cours, inertie, formule, annexes) · **Les propositions** · **Proposer**. Ils
|
**Le vote** · **Les propositions** · **Proposer**. **Le vote se déplie sous l'article**, façon
|
||||||
ouvrent un panneau latéral (une feuille sur mobile) dont l'état vit dans l'URL. Depuis
|
accordéon (un seul à la fois, l'état dans l'URL : `?vote=`) : le niveau d'eau, les totaux
|
||||||
l'en-tête du document et depuis chaque vote, **« Réglages de la formule »** : W, C, B, la
|
pour et contre (jamais qui), le seuil et les voix qui manquent, ton vote et où il en est
|
||||||
participation habituelle du groupe et les cinq crans (onglet « Réglages » du panneau).
|
(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
|
||||||
|
**« 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
|
5. **En dessous**, les propositions en cours — les 30 autres articles du texte source, à zéro
|
||||||
vote, inertie 3 / 5 — rangées par section (introduction, fondamental, technique,
|
vote, inertie 3 / 5 — rangées par section (introduction, fondamental, technique,
|
||||||
conclusion, annexes, formule, inertie, ordonnancement), **une ligne par article** : un
|
conclusion, annexes, formule, inertie, ordonnancement), **une ligne par article** : un
|
||||||
article qui a plusieurs versions (variantes du seed, propositions rivales) montre leur
|
article qui a plusieurs versions (variantes du seed, propositions rivales) montre leur
|
||||||
nombre et la meilleure en tête (niveau d'eau, pour / contre) ; la ligne se déplie sur ses
|
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 ouvre son vote.
|
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.
|
Les filtres gardent un article dès qu'une de ses versions passe. Chaque section offre
|
||||||
6. **Deux aperçus** : « si les bien cotées passent » et « si tout passe ».
|
**« Voter cette section »**.
|
||||||
7. **Trois langues** : fr · en · es, pour l'interface comme pour le texte. Le français fait foi ;
|
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.
|
||||||
|
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.
|
une traduction devenue ancienne (le français a changé depuis) est signalée.
|
||||||
|
|
||||||
## Les règles
|
## Les règles
|
||||||
@@ -207,9 +220,18 @@ corriger, signaler) **sauf la gestion des accès**, réservée aux administrateu
|
|||||||
Le nom trustinWallet remplace trustWallet (déjà pris). Règles : `crates/trustin-access`.
|
Le nom trustinWallet remplace trustWallet (déjà pris). Règles : `crates/trustin-access`.
|
||||||
|
|
||||||
**Une personne, une voix.** Dans Monnaie libre, dont l'électorat W est la toile de confiance,
|
**Une personne, une voix.** Dans Monnaie libre, dont l'électorat W est la toile de confiance,
|
||||||
**seuls les membres de la toile votent** (connexion Ğ1). Une identité d'invitation y lit,
|
**seuls les membres de la toile votent, par la chaîne Ğ1** (ADR 0008, Yvv 2026-10-30 : « une
|
||||||
propose, corrige et signale, mais ne vote pas : sinon la même personne, invitée puis connectée
|
personne une voix, mais la voix peut s'exprimer plusieurs fois […] c'est le dernier qui fait
|
||||||
avec sa clé, voterait deux fois. Dans les groupes gérés (essai, Axiom…), tout membre vote.
|
foi […] une transaction par vote »). Un vote — un article, une section ou tout le document —
|
||||||
|
est **une transaction** signée par le portefeuille de la personne (duniter-connect, ou Ğecko par
|
||||||
|
un lien et un QR code) : 0,1 Ğ1 vers le compte des votes et, dans la même transaction, le sceau
|
||||||
|
du bulletin (`ld1:` + 64 chiffres hexadécimaux). La voix est celle de **l'identité Ğ1 du compte
|
||||||
|
qui signe**, membre au moment où le serveur confirme la transaction sur l'indexeur ; quelle que
|
||||||
|
soit la session (invitation ou connexion Ğ1), la même identité n'a qu'une voix par version, et
|
||||||
|
**le dernier vote fait foi**, dans l'ordre de la chaîne. La chaîne montre qui a voté et quand,
|
||||||
|
jamais quoi ; chacun ne voit que les totaux. Sans compte des votes configuré
|
||||||
|
(`LD_VOTE_ACCOUNT`), le vote par la chaîne est fermé et l'interface le dit. Dans les groupes
|
||||||
|
gérés (essai, Axiom…), tout membre vote directement, sans portefeuille.
|
||||||
|
|
||||||
## Le groupe d'essai
|
## Le groupe d'essai
|
||||||
|
|
||||||
@@ -233,8 +255,13 @@ Les raisons longues sont dans `docs/adr/`.
|
|||||||
|
|
||||||
## Limites connues (assumées pour ce premier chantier)
|
## Limites connues (assumées pour ce premier chantier)
|
||||||
|
|
||||||
- Le droit de vote se vérifie **au moment du vote** : un membre sorti de la toile, ou dont
|
- Le droit de vote se vérifie **au moment de la confirmation sur la chaîne** : un membre sorti
|
||||||
l'accès est révoqué, garde les voix déjà exprimées.
|
de la toile, ou dont l'accès est révoqué, garde les voix déjà confirmées.
|
||||||
|
- Le serveur fait confiance à l'indexeur pour lire la transaction (remarque, virement, identité,
|
||||||
|
appartenance à la toile) ; plusieurs indexeurs se configurent (ADR 0008).
|
||||||
|
- Par Ğecko, le bulletin n'est lié à aucun compte : une copie de son sceau incluse avant lui par
|
||||||
|
un autre compte le prendrait. Par l'extension, il est lié au compte qui signe.
|
||||||
|
- Un bulletin non vu sur la chaîne en 24 heures est lâché : un paiement plus tardif ne compte pas.
|
||||||
- Dans un groupe géré (essai, Axiom…), une même personne admise sous une identité d'invitation
|
- Dans un groupe géré (essai, Axiom…), une même personne admise sous une identité d'invitation
|
||||||
**et** sous sa clé Ğ1 aurait deux voix : c'est à l'administration de n'en admettre qu'une.
|
**et** sous sa clé Ğ1 aurait deux voix : c'est à l'administration de n'en admettre qu'une.
|
||||||
- Un administrateur peut créer un nouveau lien pour une identité d'invitation existante
|
- Un administrateur peut créer un nouveau lien pour une identité d'invitation existante
|
||||||
|
|||||||
@@ -4,32 +4,39 @@ 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
|
`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.
|
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) se font dans le **groupe d'essai**
|
Où tester : les contrôles qui écrivent (C5, C6, C7, C21, C22) se font dans le **groupe
|
||||||
(caché, plancher C = 1, jamais publié) — jamais sur le texte de la communauté.
|
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) ;
|
||||||
|
pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv.
|
||||||
|
|
||||||
| # | Contrôle | Geste humain | Attendu |
|
| # | Contrôle | Geste humain | Attendu |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| 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 |
|
| 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 |
|
| 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 » ; en dessous, « Propositions en cours » (30 lignes, une par article) |
|
||||||
| C4 | Gestes contextuels | survoler la Raison d'être → « Le vote » | un panneau : 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 panneau ; Échap le ferme |
|
| 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, voter « Pour » sur « Les deux garanties réciproques » | au second vote, « … est entré en vigueur » ; le texte en vigueur compte quatre articles |
|
| 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 » → « 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 : 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. » |
|
||||||
| 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 |
|
| 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 |
|
| 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 |
|
| C9 | Les aperçus | « Si tout passe », puis « Si les bien cotées passent » | 33 articles avec la mention d'aperçu, puis 3 |
|
||||||
| C10 | trustinWallet | ouvrir `/acces` sans être administratrice | « La gestion des accès est réservée aux administrateurs de trustinWallet. » (côté admin : créer un lien d'invitation) |
|
| C10 | trustinWallet | ouvrir `/acces` sans être administratrice | « La gestion des accès est réservée aux administrateurs de trustinWallet. » (côté admin : créer un lien d'invitation) |
|
||||||
| C11 | Une personne, une voix | avec un lien d'invitation, ouvrir le vote d'un article de Monnaie libre | « Ici, seuls les membres de la toile de confiance Ğ1 votent… » à la place des boutons ; dans le groupe d'essai, les boutons sont là |
|
| C11 | Une personne, une voix | avec un lien d'invitation et un portefeuille dont le compte n'est pas membre de la toile (Bob, chaîne simulée), voter « Pour » sur un article de Monnaie libre | le vote dit que la voix est celle de l'identité Ğ1 du portefeuille qui signe ; après signature : « Ton vote n'a pas été compté : le portefeuille qui a signé n'est pas celui d'un membre de la toile de confiance Ğ1. », et sous l'article « Ton dernier vote n'a pas été compté… », 0 pour ; dans le groupe d'essai, la même personne vote directement, sans portefeuille |
|
||||||
| C12 | Lien d'équipe | administrateur : `/acces` → « Liens d'équipe », cocher le groupe d'essai, créer ; l'ouvrir dans deux navigateurs, sous deux noms | chacun arrive sur ses groupes sous son nom ; dans `/acces`, « 2 / 30 personnes » et deux identités « venue par » le lien ; un nom déjà pris est refusé, même autrement écrit (« luna » pour « Luna ») ; sur un navigateur où quelqu'un est connecté, « Ce n'est pas moi » le déconnecte ; « Révoquer » ferme le lien |
|
| C12 | Lien d'équipe | administrateur : `/acces` → « Liens d'équipe », cocher le groupe d'essai, créer ; l'ouvrir dans deux navigateurs, sous deux noms | chacun arrive sur ses groupes sous son nom ; dans `/acces`, « 2 / 30 personnes » et deux identités « venue par » le lien ; un nom déjà pris est refusé, même autrement écrit (« luna » pour « Luna ») ; sur un navigateur où quelqu'un est connecté, « Ce n'est pas moi » le déconnecte ; « Révoquer » ferme le lien |
|
||||||
| M1 | Mobile | téléphone (ou fenêtre étroite) | le logo dans la barre du haut ; l'accueil montre les groupes ; menu en tiroir (le nombre à côté de « Docs de référence », les quatre pastilles d'ambiance), les trois gestes visibles sans survol, le panneau s'ouvre en feuille ; « Réglages de la formule » depuis le vote : l'onglet « Réglages » visible, le tableau des cinq crans tient dans la feuille |
|
| M1 | Mobile | téléphone (ou fenêtre étroite) | le logo dans la barre du haut ; l'accueil montre les groupes ; menu en tiroir (le nombre à côté de « Docs de référence », les quatre pastilles d'ambiance) ; **au clavier, les pastilles** : un seul arrêt de Tab, les flèches gauche / droite passent d'une ambiance à l'autre et la choisissent ; l'anneau de focus, en pointillé, se lit sur la page (contraste 3:1 au moins, dans les quatre ambiances) et ne se confond pas avec l'anneau plein de l'ambiance choisie ; les trois gestes visibles sans survol ; le vote se déplie sous l'article ; « Réglages de la formule » depuis le vote : le panneau en feuille, l'onglet « Réglages » visible, le tableau des cinq crans tient dans la feuille ; « Voter en lot » : le panier tient dans la feuille, son bouton « Signer et envoyer » reste en vue |
|
||||||
| C13 | Logo et ambiances | ouvrir `/` (appareil en clair, puis en sombre) ; choisir chaque pastille d'ambiance ; recharger | le logo « Clé de voûte » (signe, *libre*, **Decision**) droit, sans tampon ; le sceau 井 en bas à droite ; première visite : pierre (clair) ou nuit (sombre) ; les quatre pastilles (Pierre, Calcaire, Nuit, Ardoise) changent l'ambiance, qui reste après rechargement ; favicon, icône Apple et manifeste servis |
|
| C13 | Logo et ambiances | ouvrir `/` (appareil en clair, puis en sombre) ; choisir chaque pastille d'ambiance ; recharger | le logo « Clé de voûte » (signe, *libre*, **Decision**) droit, sans tampon ; le sceau 井 en bas à droite ; première visite : pierre (clair) ou nuit (sombre) ; les quatre pastilles (Pierre, Calcaire, Nuit, Ardoise) changent l'ambiance, qui reste après rechargement ; favicon, icône Apple et manifeste servis |
|
||||||
| 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 |
|
| 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) |
|
| 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 |
|
| 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 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 · 33 modules à voter · dont 33 sans ton vote », puis « dont 32 » ; 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 » |
|
| 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 ouvre son vote ; un nouveau clic sur la ligne la replie |
|
| 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 : « 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é ; la proposition s'ouvre : « 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 ; 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 » |
|
||||||
|
| 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://<compte>?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à |
|
||||||
|
|
||||||
## Au-delà de la liste
|
## Au-delà de la liste
|
||||||
|
|
||||||
@@ -58,3 +65,4 @@ page, la langue et la taille de l'écran. Les retours se traitent dans trustinWa
|
|||||||
| 2026-10-30 | automate | local, lot R (Raison d'être, versions d'un article) | C1–C14, M1 | 15 / 15 verts |
|
| 2026-10-30 | automate | local, lot R (Raison d'être, versions d'un article) | C1–C14, M1 | 15 / 15 verts |
|
||||||
| 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 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-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 |
|
||||||
|
|||||||
Reference in New Issue
Block a user