forked from yvv/decision
Lot U3 : U3-informations.md (l'inventaire : chaque information de F1, F1.1, F1.2, F1.3, N1, N1.1 et O1 de M8, son moment, son endroit, sa clé i18n, sa preuve ; ce qui n'est pas porté et pourquoi — F1.3 en entier, g1vote, « toutes les 6 heures », le cran d'un nouvel article au moment de l'écrire, la formule de G ; ce qui n'est pas prouvé) ; CONTROLES.md (C1, C3 suivent les mots ; C39 à C43) ; UX-lecteur.md (section du lot U3) ; CLAUDE.md (45 contrôles, OpeningInfo, lib/opening.ts)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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, C25, C26, C28–C31, C35, C37, C38, M2) se font dans le **groupe
|
||||
Où tester : les contrôles qui écrivent (C5, C6, C7, C21, C22, C25, C26, C28–C31, C35, C37, C38, C43, M2) se font dans le **groupe
|
||||
d'essai** (caché, quorum 1 à chaque cran — une voix seule y passe, ADR 0013 —, jamais publié) — jamais sur le texte de la communauté. Au départ, rien
|
||||
n'y est en vigueur (ADR 0011) : les contrôles qui lisent un texte en vigueur (C4 à C6, C20, C21, C24,
|
||||
C28 à C31) y font d'abord entrer Raison d'être, Unicité du compte et Réciprocité par le vote (une voix
|
||||
@@ -15,9 +15,9 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv.
|
||||
|
||||
| # | Contrôle | Geste humain | Attendu |
|
||||
|---|---|---|---|
|
||||
| C1 | L'accueil, sans session | ouvrir `/` sans être connectée | la clé de voûte en grand, jamais inclinée ; sous l'arche, centrés et dans cet ordre : « boîte à outils », « contexte et cadrage », « processus et modalités » ; puis le titre centré sur deux lignes, « Rendre possible » / « la décision collective » ; « 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 | la clé de voûte en grand, jamais inclinée ; sous l'arche, centrés et dans cet ordre : « boîte à outils », « contexte et cadrage », « processus et modalités » ; puis le titre centré sur deux lignes, « Rendre possible » / « la décision collective » ; tant que la connexion Ğ1 n'est pas active (comme en production), le mot d'Yvv pour qui n'est pas encore invité à la place de « Se connecter avec sa clé Ğ1 » (C41) ; 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 au départ : les Propositions seed | Monnaie libre → Docs de référence → Acte d'engagement Certification | aucun article en vigueur (ADR 0011) : « Aucun article n'est encore en vigueur. Commence par les Propositions seed : elles y entrent par le vote, comme toute proposition. » ; puis, **en tête du texte**, en entier, Raison d'être (sous « Introduction »), Unicité du compte, Responsabilité civique et Réciprocité (sous « Engagements fondamentaux »), chacune marquée « Proposition seed » (au survol : « Texte de départ mis en avant pour lancer le vote… »), sur un lavis d'eau, avec « 0 pour · 0 contre · 9 oui sur 12 » et « basse » (au lecteur d'écran : « inertie 2 / 5 · basse ») ; chaque section lue finit par une ligne d'ordre (C25) ; en dessous, « Propositions en cours » **repliées par section** (5 lignes : le nom, « 11 articles », un petit niveau d'eau par article ; formule, inertie et ordonnancement sont sortis du document, ADR 0014) ; « Tout déplier » : 23 lignes, une par article (les quatre Propositions seed ne s'y répètent pas) |
|
||||
| C3 | Le texte au départ : les Propositions d'amorce | Monnaie libre → Docs de référence → Acte d'engagement Certification | aucun article en vigueur (ADR 0011) : le chapitre « Info ouverture doc de réf. » le dit, avec les mots d'Yvv (« Aucun article n'est encore en vigueur. Les Propositions d'amorce y entrent par le vote… », C39) ; puis, **en tête du texte**, en entier, Raison d'être, Unicité du compte, Responsabilité civique et Réciprocité (sans les titres « Introduction » et « Engagements fondamentaux », lot U3), chacune marquée « Proposition d'amorce » (au survol : « Texte de départ mis en avant pour lancer le vote… »), sur un lavis d'eau, avec « 0 pour · 0 contre · 9 oui sur 12 » et « basse » (au lecteur d'écran : « inertie 2 / 5 · basse ») ; chaque section lue finit par une ligne d'ordre (C25) ; en dessous, « Propositions en cours » **repliées par section** (5 lignes : le nom, « 11 articles », un petit niveau d'eau par article ; formule, inertie et ordonnancement sont sortis du document, ADR 0014) ; « Tout déplier » : 23 lignes, une par article (les quatre Propositions d'amorce ne s'y répètent pas) |
|
||||
| C4 | Gestes contextuels | groupe d'essai, où la Raison d'être est entrée en vigueur par le vote : la survoler → « Le vote » | deux gestes sous l'article, « Le vote » et « Proposer une modification » (ses autres versions se lisent dans le vote) ; le vote se **déplie sous l'article**, sans fenêtre : « N oui sur Q votants pour passer » et les voix qui manquent ; « La formule du seuil » se déplie : « M — majorité à pleine participation : 50 % — inertie 2 / 5 · basse », 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 (Raison d'être, Unicité du compte et Réciprocité entrées en vigueur par le vote) : déplier le vote de « Les deux garanties réciproques », « Pour » ; une deuxième personne si cette voix ne suffit pas | à la voix qui suffit, « … est entré en vigueur » ; le texte en vigueur compte quatre articles, le vote reste déplié sous le nouveau texte (autant de « pour » que de voix, 0 contre) |
|
||||
| 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 » (le panneau « Détails », sans onglets) → « 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) |
|
||||
@@ -55,6 +55,11 @@ pour une personne, ils coûtent 0,1 Ğ1 réels : c'est un acte « paye » d'Yvv.
|
||||
| C36 | Combien de oui pour passer, combien de non pour bloquer (ADR 0013 ; Yvv, 02/11) | Monnaie libre : la Raison d'être (en tête) → « Le vote » ; « Tout déplier » ; puis, l'automate donnant à une proposition du groupe d'essai les totaux 9 pour · 4 contre (cran 2, quorum 12), puis 3 pour · 0 contre | avant tout vote, sous l'article : « 9 oui sur 12 votants pour passer », au survol « Quorum : 12 votants. En dessous, les votants qui manquent comptent comme « non ». » ; la ligne de la Proposition seed, juste au-dessus, ne redit plus les totaux ni les oui (lot U2) ; dans la liste, en bref : « 39 oui sur 50 » (cran 3) ; à 9 pour · 4 contre : « 11 oui pour passer · 4 non pour bloquer » sous l'article, « passe à 11 oui · bloquée à 4 non » dans la liste, « Il manque 2 voix pour. » ; à 3 pour · 0 contre : « 9 oui pour passer · le quorum la bloque », « passe à 9 oui » |
|
||||
| C37 | Le quorum d'un article, par son autrice, avant le premier vote (ADR 0013) | groupe d'essai : proposer un article, puis son vote → « Quorum » : 3 → « Fixer ce quorum » ; « Revenir au défaut (1) » ; 100000 → « Fixer ce quorum » ; une autre personne ouvre le même vote, puis vote « contre » ; l'autrice tente 2 | le réglage n'apparaît qu'à l'autrice (`canSetQuorum`) : « Quorum · 1 votant », « Par défaut, celui de son cran : 1 votant. », le champ « Quorum de l'article » ; « Quorum fixé : 3 votants. », la ligne dit « … oui sur 3 votants pour passer » ; « Quorum revenu au défaut : 1 votant. » ; hors bornes (400) : « Ce quorum sort des bornes : au moins 2 votants (1 dans le groupe d'essai), au plus … » ; l'autre personne ne voit pas le réglage ; après son vote (409) : « Quelqu'un a déjà voté sur cet article : son quorum ne change pas. » (lot T2), puis le réglage disparaît |
|
||||
| C38 | Ce que compte l'en-tête ; un changement d'inertie d'un ordre ou du titre (lot U2) | Monnaie libre : lire la ligne de faits sous le résumé ; « Tout déplier », compter les versions de la liste ; puis, dans le groupe d'essai, proposer un changement d'inertie de l'ordre de « Conclusion » et du titre (l'automate passe par `POST /api/units/{id}/inertia`, puis les retire) | « 0 article en vigueur · 4 Propositions seed · N propositions en cours », N le nombre de versions que montre la liste : les Propositions seed lues en tête sont dites à part, les ordres et titres proposés ne sont pas comptés (ils se votent à la ligne de leur module) ; sous le titre, la pastille « 1 changement d'inertie proposé », qui déplie son vote sous le titre ; à la fin de « Conclusion », la même pastille sur la ligne d'ordre, qui déplie son vote là ; aucun « inertie vers … » dans « Propositions en cours », et l'en-tête compte toujours ce que la liste montre |
|
||||
| C39 | L'ouverture du document : « Info ouverture doc de réf. », une séparation, puis le texte (lot U3 ; Yvv, 03/11) | Monnaie libre → Acte d'engagement Certification : lire le haut de la page, dans les quatre ambiances ; puis le groupe d'essai, où la Raison d'être, Unicité du compte et Réciprocité sont en vigueur | avant le texte, hors vote (aucun bouton), le chapitre « Info ouverture doc de réf. » : le paragraphe d'Yvv mot pour mot (« Aucun article n'est encore en vigueur. Les Propositions d'amorce y entrent par le vote, comme les propositions qui suivent… ») ; « Inertie à l'ouverture » : Propositions d'amorce 2 / 5 · basse, Titre du document 4 / 5 · haute, Ordre de chaque section 2 / 5 · basse, Autres articles 3 / 5 · moyenne ; « Quorum » : « 12 · 12 · 50 · 50 · 50 votants, du cran 1 au cran 5. », sous le quorum d'un article les votants qui manquent comptent « non », l'auteur de la première version peut en fixer un autre tant que l'article ne garde la trace d'aucun vote ; puis un filet doux de la couleur de l'ambiance (jamais une bordure), puis le premier article ; aucun titre « Introduction » ni « Engagements fondamentaux » dans le texte, la ligne « Ordre de la section » des engagements fondamentaux toujours là ; lu dans les données (l'automate change les quorums et le cran du titre que donne l'API : le chapitre suit) ; dans le groupe d'essai, la première phrase n'est plus dite (« Les Propositions d'amorce entrent en vigueur par le vote… »), elles restent au cran 2, « 1 votant à chaque cran. » |
|
||||
| C40 | « Proposition d'amorce » (lot U3) | Monnaie libre, rien en vigueur : les quatre articles en tête, la ligne de faits ; puis EN, puis ES | « Proposition d'amorce » sur les quatre, « 4 Propositions d'amorce » dans la ligne de faits, jamais « Proposition seed » ; « Starter proposal », « 4 starter proposals » ; « Propuesta de arranque », « 4 propuestas de arranque » |
|
||||
| C41 | Qui n'est pas encore invité (lot U3 ; Yvv, 03/11) | sans session : `/`, puis « Se connecter » ; puis en anglais et en espagnol | à l'accueil, à la place du bouton de connexion Ğ1 (pas encore active) : « Pour rentrer dans un groupe de décisions, il faut pour l'instant demander un lien d'invitation à Chiara ou à Yvv. Ce prototype n'est pas encore câblé sur la chaîne. », puis « Tu as reçu un lien d'invitation ? Ouvre-le simplement : il te connecte. » ; sur « Se connecter », le même mot une seule fois, et la ligne Ğ1 ne dit plus « En attendant, on entre avec un lien d'invitation » ; en, es : le même mot traduit |
|
||||
| C42 | Une poignée tirée sur plusieurs lignes (lot U3, défaut vu par T4) | groupe d'essai : « Réordonner » les engagements fondamentaux ; tirer la poignée du dernier article jusqu'en haut, lentement ; puis flèche bas ; « Annuler » | l'article arrive en place 1, sans revenir en arrière en route ; « « … » en place 1 sur 4. » est dit, le focus est sur lui ; la flèche le descend en place 2, dit aussi |
|
||||
| C43 | Les informations de fonctionnement là où elles servent (lot U3, ADR 0014) | Monnaie libre : le vote de la Raison d'être, « La formule du seuil », « Réglages de la formule » ; groupe d'essai : « Réordonner » les engagements fondamentaux, puis « N ordre(s) proposé(s) » et « Le vote » de l'ordre en vigueur → « Autres versions » | sous les boutons : « Le vote reste ouvert, sans échéance : tu peux changer ou retirer ton vote à tout moment, le dernier fait foi. » ; la formule : T′ (« votants retenus : 12, T ou Q s'il en manque »), G « déduit de la participation habituelle du groupe », « arrondi à l'entier au-dessus », « Sous le quorum Q de l'article… autant de « pour » que si Q personnes avaient voté » ; les réglages : « Part exigée : celle que le cran demande au-delà du quorum de l'article, à la participation habituelle. », « Elle ne dépend pas du quorum d'un article. », la phrase de G, jamais « d'habitude » ; en réordonnant : « S'il entre en vigueur, seuls les articles de cette section changent de place ; aucun texte ne change. » ; le vote d'un ordre proposé à côté de l'ordre en vigueur : la marge à dépasser, et le texte remplacé qui redevient une proposition ; « Autres versions » : « Si plusieurs versions atteignent leur seuil, celle qui a la marge la plus large entre en vigueur. » (l'inventaire : `U3-informations.md`) |
|
||||
|
||||
## Au-delà de la liste
|
||||
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
# Les informations de fonctionnement dans l'interface (lot U3)
|
||||
|
||||
> Préparé le 2026-11-03 (lot U3, branche `lot/u3-interface`), d'après la demande d'Yvv du 03/11
|
||||
> vers 20 h 38 : « ordonnancement, inertie, et formule de vote sont des infos de fonctionnement. Les
|
||||
> votes se font à leur place, et les infos doivent trouver leur place dans l'ux. Vérifie que toutes
|
||||
> les infos utiles sont au bon endroit au moment où on en a besoin, tu as la place dans les panneaux
|
||||
> qui s'ouvrent à droite. » Le lot T4 a sorti F1, F1.1, F1.2, F1.3, N1, N1.1 et O1 du document
|
||||
> (ADR 0014). Leurs textes de référence sont ceux de M8 (`de1b7eb`, `seeds/acte-engagement-certification.json`,
|
||||
> gardés dans `crates/ld-server/tests/fixtures/seed-m8/`) ; ce que chaque phrase de F1.2 et N1.1
|
||||
> affirme, et le test qui le prouve : `t3c-liste-fermee.md` (numéros repris ici).
|
||||
|
||||
## Comment lire
|
||||
|
||||
Une ligne par information : la phrase source (abrégée), le **moment** où elle sert, **l'endroit** où
|
||||
l'interface la dit, la **clé** i18n (`web/src/lib/i18n/fr.ts`, puis en, es), la **preuve**. « Déjà » :
|
||||
l'interface la disait avant U3, à cet endroit ; « nouveau » ou « changé » : ce lot. Critère des lots T3
|
||||
à T3c, gardé : chaque phrase dite reste vraie pour tout W et tout quorum ; les termes définis
|
||||
(« participation habituelle », « quorum de l'article », « part exigée ») ; aucun chiffre daté ; les
|
||||
nombres viennent de l'API.
|
||||
|
||||
Les endroits : **le chapitre** « Info ouverture doc de réf. » (avant le texte, hors vote,
|
||||
`OpeningInfo.svelte`) ; **le vote déplié** sous une version (`VoteFold`), avec « Inertie »
|
||||
(`InertiaPicker`), « Quorum » (`QuorumSetting`) et « La formule du seuil » (`Formula`) ; **le panneau
|
||||
de droite** « Réglages de la formule » (`?onglet=reglages`, `FormulaSettings`) ; **la ligne d'ordre**
|
||||
d'une section et « Réordonner » (`OrderLine`, `Reorder`) ; **la ligne du titre** (`TitleBar`) ;
|
||||
**le panneau « Proposer »** (`ProposeView`).
|
||||
|
||||
Les preuves : les tests nommés sont sous `crates/` (Rust) ; « grille » renvoie à
|
||||
`crates/ld-server/tests/seed_quorum_texts.rs` sur la grille de T3c. Chaque phrase de règle que l'écran
|
||||
dit est épinglée, lettre pour lettre, par `web/tests/unit/rules.test.ts`, qui nomme à chaque ligne le
|
||||
test qui la prouve ; les nombres lus dans l'API, par les contrôles e2e (C20, C39, C43).
|
||||
|
||||
## F1 « Formule de vote »
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| F1.a | « La formule qui régit l'adoption ou le rejet de chaque modification » | au vote | vote déplié, « La formule du seuil » (déjà) | `formula.title`, `formula.intro` | une définition |
|
||||
| F1.b | « Référence : g1vote (https://…) » | — | **non porté** (plus bas) | — | — |
|
||||
|
||||
## F1.1 « Formule du seuil WoT »
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| F1.1.1 | « Le seuil est le nombre de voix pour qu'il faut à une version pour entrer en vigueur. » | au vote | « La formule du seuil » (déjà), R | `formula.intro`, `formula.R` | une définition |
|
||||
| F1.1.2 | « Sous le quorum Q, les votants qui manquent comptent comme « non » : le seuil se calcule comme si Q personnes avaient voté. » | au vote | « La formule du seuil », **changé** : « Sous le quorum Q de l'article, … : il faut autant de « pour » que si Q personnes avaient voté. » ; l'infobulle de « 9 oui sur 12 » (déjà) | `formula.reading`, `vote.need.title` | grille `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted` |
|
||||
| F1.1.3 | « Au-delà, il faut la part de « pour » que demande le cran … la plus haute au quorum et baisse quand la participation monte, jusqu'à la majorité M » | au vote | « La formule du seuil » (déjà, suite de la même clé) | `formula.reading` | grille `the_share_asked_falls_beyond_the_article_s_quorum_down_to_m` |
|
||||
| F1.1.4 | `T' = max(T, Q)` et `Seuil = B^W + (M + (1 − M) × (1 − (T'/W)^G)) × T'` | au vote | « La formule du seuil », en MathML (déjà) | — | grille `the_formulas_of_the_texts_are_those_the_engine_computes` |
|
||||
| F1.1.5 | « Une version passe quand ses voix pour atteignent le seuil, arrondi à l'entier au-dessus. » | au vote | « La formule du seuil », **nouveau** : « Une version atteint son seuil quand ses voix pour atteignent R, arrondi à l'entier au-dessus. » | `formula.round` | `ld-engine` `threshold::a_whole_number_of_votes_never_gains_one_by_rounding` |
|
||||
| F1.1.6 | les lettres T, Q, T′, W, B, M, G | au vote | « La formule du seuil » : chaque lettre avec sa valeur lue dans l'API (déjà), **nouveau** T′ (« votants retenus : 12, T ou Q s'il en manque »), **changé** G (« déduit de la participation habituelle du groupe »), **nouveau** sous la liste, dans la toile seulement : « À la puissance W, B est si petit qu'il ne compte pas dans la toile de confiance. » | `formula.T`, `formula.Tprime`, `formula.Q`, `formula.W`, `formula.B`, `formula.B.wot`, `formula.M`, `formula.G` | `formula.Tprime` : `the_formulas_…` ; `formula.B.wot` : grille `b_to_the_power_w_never_counts_in_the_web_of_trust` (W de 100 à 10 000 000) ; G : grille `g_gives_…` |
|
||||
| F1.1.7 | « Leurs valeurs sont dans « Paramètres par défaut » et « Niveaux d'inertie ». » | au vote | le lien « Réglages de la formule » sous la formule (déjà) | `settings.title` | — |
|
||||
|
||||
## F1.2 « Paramètres par défaut » (numéros de `t3c-liste-fermee.md`)
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| 1, 2, 9, 19 | l'introduction et les intertitres | — | rien à porter | — | — |
|
||||
| 3, 4 | « Chaque version se vote à tout moment, sans échéance. Chacun peut changer ou retirer son vote : le dernier fait foi. » | au vote | vote déplié, sous les boutons, **nouveau** : « Le vote reste ouvert, sans échéance : tu peux changer ou retirer ton vote à tout moment, le dernier fait foi. » — pas sur une version retenue par une objection, où « Une objection retient cette version… » dit ce qui reste (déjà) | `vote.permanent` (`vote.held`) | `ld-engine` `ballot::the_last_one_stands_in_the_order_of_the_chain` ; `tests/ballots.rs` `the_last_one_stands_in_the_order_of_the_chain` |
|
||||
| 5 | « Une proposition entre en vigueur dès qu'elle atteint son seuil. » | en lisant les propositions | « Propositions en cours » : « Chacune remonte dès qu'elle atteint son seuil » (déjà) ; « Seuil atteint. » dans le vote (déjà) | `deep.note`, `tally.reached` | une règle sans nombre |
|
||||
| 6, 7 | « S'il y a déjà un texte en vigueur, il lui faut en plus une marge … plus large que celle de ce texte. Le texte remplacé redevient une proposition, avec ses votes : il peut revenir. » | au vote d'une version concurrente | vote déplié d'une version à côté d'un texte en vigueur (texte, titre, ordre), **nouveau** : « Un texte est déjà en vigueur : pour le remplacer, cette version doit en plus atteindre une marge (voix pour moins voix exigées) plus large que celle de ce texte. Le texte remplacé redevient une proposition, avec ses votes : il peut revenir. » | `vote.rival` | `ld-engine` `compose::a_rival_must_beat_the_version_in_force` ; `tests/api.rs` `a_rival_replaces_the_seed_and_the_seed_returns_among_proposals` ; `tests/modules.rs` `an_order_is_proposed_with_the_articles_of_its_section_then_voted_into_force` (l'ordre d'avant revient parmi les propositions) |
|
||||
| 8 | « Si plusieurs propositions y parviennent, celle qui a la marge la plus large entre en vigueur. » | au vote, en voyant les autres versions | vote déplié, dans « Autres versions », **nouveau** | `vote.others.rule` | `ld-engine` `compose::rivals_on_one_unit_yield_one_winner` |
|
||||
| 10 | « W : le nombre de membres de la toile de confiance Ğ1, relu sur la chaîne toutes les 6 heures. » | au vote, aux réglages | « W — électorat : 5 745 (membres de la toile de confiance Ğ1) », formule et réglages (déjà) ; « toutes les 6 heures » **non porté** (plus bas) | `formula.W`, `formula.W.wot` | — |
|
||||
| 11 | « T : les votes exprimés sur la version, pour et contre. » | au vote | « T — voix exprimées » (déjà) | `formula.T` | une définition |
|
||||
| 12 | « Q, le quorum : sous ce nombre de votants, ceux qui manquent comptent comme « non ». » | à l'ouverture ; au vote ; en fixant le quorum | le chapitre, **nouveau** : « Sous le quorum d'un article, les votants qui manquent comptent comme « non ». » ; l'infobulle du vote, « Quorum », les réglages (déjà) | `opening.quorum.rule`, `vote.need.title`, `quorum.explain`, `settings.quorum.note` | grille `under_the_quorum_…` |
|
||||
| 13 | « Chaque article prend celui de son cran : 12, 12, 50, 50 et 50 dans Monnaie libre, du cran 1 au cran 5. » | à l'ouverture ; aux réglages ; en fixant le quorum | le chapitre, **nouveau** : « 12 · 12 · 50 · 50 · 50 votants, du cran 1 au cran 5. » (lu dans `doc.quorums` ; « 1 votant à chaque cran. » dans le groupe d'essai) ; la colonne « Quorum » des réglages, « Par défaut, celui de son cran : 12 votants. » (déjà) | `opening.quorum.levels`, `opening.quorum.same.*`, `settings.col.quorum`, `quorum.default.*` | `tests/quorum.rs` `each_level_has_its_quorum_and_every_evaluation_says_it` ; lu dans l'API : C39 (l'API changée, le chapitre suit), C20 |
|
||||
| 14 | « L'auteur de la première version d'un article, un administrateur pour les textes de départ, peut en fixer un autre tant que l'article ne garde la trace d'aucun vote. » | à l'ouverture ; en fixant le quorum | le chapitre, **nouveau**, la phrase de F1.2 mot pour mot ; « Quorum » du vote déplié, **changé** : « Tu fixes le quorum de cet article tant qu'il ne garde la trace d'aucun vote. » (avant : « tant que personne n'a voté », faux après un vote retiré, point 8 du lot T2) | `opening.quorum.author`, `quorum.explain` | `tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote` ; `tests/ballots.rs` `a_vote_exists_for_every_state_of_the_buffer` |
|
||||
| 15 | « Dans Monnaie libre, jamais moins de 2 : une seule voix ne fait jamais passer un texte. » | en fixant le quorum | le refus du serveur, dit à la personne : « Ce quorum sort des bornes : au moins 2 votants (1 dans le groupe d'essai)… » (déjà) | `quorum.error.quorum` | `tests/quorum.rs` `in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pending` ; `ld-engine` `threshold::one_vote_never_passes_with_a_quorum_of_two_or_more` |
|
||||
| 16 | « B = 0,1 : dans la toile de confiance, B^W est si petit qu'il ne compte pas. » | au vote | « B — base : 0,1 » (déjà), **nouveau** `formula.B.wot` quand W est la toile (F1.1.6) | `formula.B`, `formula.B.wot` | grille `b_to_the_power_w_…` |
|
||||
| 17 | « M et G : donnés par le cran d'inertie de l'article » | au vote ; aux réglages | « M — majorité à pleine participation : 50 % — inertie 2 / 5 · basse » (déjà) ; colonnes M et G des réglages, la ligne de l'article marquée (déjà) | `formula.M`, `settings.col.*`, `settings.current` | grille `the_formulas_…` |
|
||||
| 18 | « G n'est pas fixé à la main : il se déduit de la participation habituelle du groupe. » | au vote ; aux réglages | « G — gradient : 0,103, déduit de la participation habituelle du groupe », **changé** ; aux réglages, **nouveau** : « G se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du cran à la participation habituelle. » | `formula.G`, `settings.gradient` | grille `g_gives_the_share_of_the_level_at_the_usual_turnout_beyond_the_article_s_quorum` |
|
||||
| 20 | « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et, au-delà du quorum, le groupe demande 75 % de « pour » à sa participation habituelle. » | aux réglages ; à l'ouverture | le tableau des réglages, ligne 3 (déjà) ; sous le tableau, **changé** : « Part exigée : celle que le cran demande au-delà du quorum de l'article, à la participation habituelle. » (avant : « à 100 votants comme d'habitude », faux quand la médiane sort de ses bornes, T3c) ; le chapitre : « Autres articles 3 / 5 · moyenne » | `settings.share.note`, `opening.inertia.others` | grille `the_share_of_a_level_is_asked_at_the_usual_turnout_beyond_the_article_s_quorum` ; C20 |
|
||||
| 21 | « Tout nouvel article commence à ce cran. » | en proposant un nouvel article | **non dit dans le formulaire** (plus bas) ; dit aussitôt après, dans le vote qui se déplie : « Inertie · 3 / 5 · moyenne » | — | `tests/quorum.rs` `the_author_of_an_article_sets_its_quorum_before_the_first_vote` (cran 3) |
|
||||
| 22 | « Au départ, aucun article n'est en vigueur. » | à l'ouverture | le chapitre, la phrase d'Yvv, tant que c'est vrai : « Aucun article n'est encore en vigueur. » | `opening.none` | C39 (dite à Monnaie libre, plus dite dans le groupe d'essai où trois articles sont en vigueur) |
|
||||
| 23 | « Raison d'être, Unicité du compte et Réciprocité sont des Propositions seed, mises en avant pour lancer le vote, au cran 2 (basse). » | à l'ouverture ; en lisant le texte | le chapitre : le paragraphe d'Yvv, et « Propositions d'amorce 2 / 5 · basse » (le cran d'ouverture : avant tout changement voté, lu dans l'API, `lib/opening.ts`) ; la marque « Proposition d'amorce » sur chacune, son infobulle (déjà, mot changé) | `opening.amorce`, `opening.inertia.amorce`, `doc.seedProposal`, `doc.seedProposal.long` | `tests/seed_proposals.rs` `the_view_keeps_which_versions_the_seed_put_forward_once_they_enter_into_force` ; `web/tests/unit/opening.test.ts` ; C39, C40 |
|
||||
| 24 | « Le titre du document est au cran 4 (haute), l'ordre des articles de chaque section au cran 2, tous les autres articles au cran 3. » | à l'ouverture | le chapitre : « Titre du document 4 / 5 · haute », « Ordre de chaque section 2 / 5 · basse », « Autres articles 3 / 5 · moyenne » ; les crans sur la ligne du titre et chaque ligne d'ordre (déjà) | `opening.inertia.title`, `opening.inertia.orders`, `opening.inertia.others` | `web/tests/unit/opening.test.ts` ; C39 (le cran du titre changé dans l'API, le chapitre suit) |
|
||||
|
||||
## N1 « Réglage de l'inertie »
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| N1.1 | « Chaque article porte son inertie : un cran de 1 à 5 » | partout | les crans dessinés sous chaque article, ligne d'ordre, titre ; « Inertie · 2 / 5 · basse » au vote (déjà) | `inertia.level`, `inertia.badge` | — |
|
||||
| N1.2 | « Plus le cran est haut, plus il faut de voix pour changer le texte quand peu de gens votent. » | au vote | « Inertie » du vote déplié (déjà) : « Plus l'inertie est haute, plus il faut de voix pour changer ce texte. » ; sa seconde phrase **changée** : « Sous le quorum de l'article, … ; au-delà, la part exigée baisse quand la participation monte. » | `inertia.explain` | seconde phrase : grille `under_the_quorum_…`, `the_share_asked_falls_…` ; la première **n'est pas prouvée** (plus bas) |
|
||||
| N1.3 | « Le titre du document et l'ordre des articles de chaque section ont aussi la leur, qui se change de la même façon. » | au vote d'un module | les crans de la ligne du titre et des lignes d'ordre, « Inertie » dans leur vote (déjà) | — | — |
|
||||
| N1.4 | « Tout membre du groupe peut proposer un autre cran. » | au vote | « Proposer un changement d'inertie » (déjà) | `inertia.change` | — |
|
||||
| N1.5 | « Cette proposition se vote au cran actuel de l'article … l'inertie de l'inertie hérite du cran de l'article. » | en changeant l'inertie | sous le choix du cran (déjà) : « Un changement d'inertie se vote lui-même à l'inertie de l'article : 2 / 5 · basse. » | `inertia.change.note` | ADR 0007 ; `ld-engine` `compose::voting_level` |
|
||||
|
||||
## N1.1 « Niveaux d'inertie » (numéros de `t3c-liste-fermee.md`)
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | « À chaque cran, le groupe demande une part de « pour » parmi les votants » | aux réglages | l'introduction des réglages (déjà) | `settings.intro` | — |
|
||||
| 2 | « Chaque cran a aussi son quorum : sous le quorum de l'article, … il faut autant de « pour » que si ce quorum avait voté. » | au vote ; aux réglages | « La formule du seuil » (**changé**, F1.1.2) ; aux réglages, **changé** : « Sous le quorum de l'article, les votants qui manquent comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. » | `formula.reading`, `settings.reading` | grille `under_the_quorum_…` |
|
||||
| 3 | « La part exigée dépend du cran et du nombre de votants … au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout le monde vote. » | aux réglages ; au vote | aux réglages, **changé** : « Au-delà du quorum de l'article, plus il y a de votants, plus la part exigée baisse, jusqu'à la majorité M quand tout le monde vote. » (avant : « quand il vote comme d'habitude » et « Sous le quorum du cran », T3c) ; la formule (déjà) | `settings.reading`, `formula.reading` | grille `the_share_asked_falls_…` |
|
||||
| 4 | « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)` » | au vote | dans R, en MathML (déjà) | — | grille `the_formulas_…` |
|
||||
| 5 à 10 | les cinq crans : quorum, part exigée au-delà du quorum de l'article à la participation habituelle, M quand tout le monde vote, ce qui est à ce cran au départ | aux réglages ; à l'ouverture | le tableau des réglages : M, G, part exigée, quorum, voix pour, lus dans l'API (déjà) ; sous le tableau `settings.share.note` (**changé**, F1.2.20) et « Voix pour : à 100 votants, la participation habituelle arrondie, ou au quorum s'il est plus haut. » (**changé**, avant « comme d'habitude ») ; ce qui est à chaque cran au départ : le chapitre | `settings.col.*`, `settings.share.note`, `settings.required.usual.*`, `settings.required.version.*`, `opening.inertia.*` | grille `the_share_of_a_level_…` ; `every_number_of_the_quorum_texts_is_the_engine_s` ; C20 |
|
||||
| 11 | « La participation habituelle est la médiane du nombre de votants des propositions du groupe votées depuis un an. » | aux réglages | « Participation habituelle » (déjà) | `settings.usual.median.*` | `tests/inertia.rs` `the_usual_participation_is_the_median_of_five_voted_proposals` |
|
||||
| 12 | « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence du document » | aux réglages | **changé** : « … la participation de référence, tant qu'elle repose sur moins de 5 propositions votées depuis un an (0 pour l'instant). » (avant : « tant que le groupe n'a pas voté sur 5 propositions », faux quand des votes ont plus d'un an, T3c) | `settings.usual.reference.*` | grille `the_participation_habituelle_is_the_median_brought_back_within_its_bounds` ; `tests/inertia.rs` (ci-dessus) |
|
||||
| 13 | « Elle ne dépend pas du quorum d'un article. » | aux réglages | « Participation habituelle », **nouveau** | `settings.usual.quorum` | `tests/quorum.rs` `in_monnaie_libre_a_quorum_holds_two_voices_and_a_ballot_counts_even_pending` |
|
||||
| 14 | « Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. » | aux réglages | « Ramenée entre 1 % et 50 % de l'électorat … » quand elle l'est (bornes lues dans l'API), « Mesurée une fois par jour… » (déjà) | `settings.usual.bounded.*`, `settings.usual.when`, `settings.usual.never` | grille `the_participation_habituelle_…` ; `participation::a_measure_is_taken_again_after_a_day` ; C27 |
|
||||
| 15 | « G se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement celle du cran à la participation habituelle : `G = ln(…)/ln(p̃)` » | aux réglages | **nouveau**, la phrase sans la formule ; la valeur de G de chaque cran dans le tableau (déjà) | `settings.gradient` | grille `g_gives_…` |
|
||||
|
||||
## O1 « Ordonnancement du document »
|
||||
|
||||
| # | Phrase source | Moment | Endroit | Clé | Preuve |
|
||||
|---|---|---|---|---|---|
|
||||
| O1.1 | « L'ordre des articles de chaque section est lui-même soumis au vote. » | en lisant | la ligne « Ordre de la section » au bout de chaque section, « Le vote » (déjà) | `order.line` | — |
|
||||
| O1.2 | « En fin de section, le module « Ordre des articles » se vote comme un article, au cran 2 (basse) au départ » | en réordonnant ; à l'ouverture | « Un ordre se vote à l'inertie 2 / 5 · basse, comme un article… » (déjà) ; le chapitre : « Ordre de chaque section 2 / 5 · basse » | `order.edit.note`, `opening.inertia.orders` | — |
|
||||
| O1.3 | « chaque proposition est la liste des articles de la section, dans un autre ordre » | au vote d'un ordre | la liste dans le vote d'un ordre, les déplacements marqués (déjà) | `module.order.proposal` | — |
|
||||
| O1.4 | « Quand un ordre entre en vigueur, seuls les articles de cette section changent de place ; aucun texte ne change. » | en réordonnant | sous la liste à réordonner, **nouveau** : « S'il entre en vigueur, seuls les articles de cette section changent de place ; aucun texte ne change. » | `order.edit.effect` | `tests/modules.rs` `an_order_is_proposed_with_the_articles_of_its_section_then_voted_into_force` |
|
||||
| O1.5 | « Un nouvel article se place à la fin de sa section ; sa place se vote ensuite par l'ordre de la section. » | en proposant ; en réordonnant | « Proposer » (nouvel article) et sous la liste à réordonner (déjà) | `propose.section.note`, `module.order.rule` | — |
|
||||
| O1.6 | « Un ordre proposé garde ses votes quand la section change … » | en réordonnant ; au vote d'un ordre | `module.order.rule` (déjà) ; « 1 article entré depuis, placé à la fin », « 1 article sorti depuis » au vote (déjà) | `module.order.rule`, `module.order.added.*`, `module.order.dropped.*` | `tests/modules.rs` `articles_that_enter_or_leave_a_section_complete_an_order_under_vote` |
|
||||
| O1.7 | « Une section d'un seul article n'a pas d'ordre à voter. » | en lisant | par l'absence : pas de ligne d'ordre (déjà) | — | `tests/modules.rs` `an_order_of_one_article_has_nothing_to_decide` |
|
||||
| O1.8 | « Le titre du document est lui aussi un module, voté au cran 4 (haute) au départ. » | en lisant ; à l'ouverture | la ligne du titre (« Titre du document », ses crans), « Le titre du document se vote à l'inertie 4 / 5 · haute… » (déjà) ; le chapitre | `module.title.name`, `title.propose.note`, `opening.inertia.title` | — |
|
||||
| O1.9 | « Le titre de chaque article, lui, se vote avec son texte. » | en proposant | le formulaire « Proposer » : le titre et le texte partent ensemble (déjà, par ses champs) | `propose.title`, `propose.body` | — |
|
||||
|
||||
## Ce qui n'est pas porté, et pourquoi
|
||||
|
||||
- **F1.3 « Processus de dépôt officiel » en entier** : il décrit un calcul de hash IPFS, un ancrage
|
||||
« on-chain via `system.remark` » et une mise à jour automatique des applications (Cesium, Gecko) ;
|
||||
rien de cela n'existe aujourd'hui. Ce qui est vrai — la publication des textes en vigueur sur un
|
||||
dépôt git, suspendue jusqu'au premier texte en vigueur (ADR 0011, 0012) — est déjà dit :
|
||||
« Publié sur le dépôt des textes », « Publication en attente » (`doc.published`,
|
||||
`doc.publish.pending`), et dans `/acces` → « Publication des textes ».
|
||||
- **F1 « Référence : g1vote »** : la formule d'aujourd'hui n'est plus celle de g1vote (le quorum
|
||||
`T′ = max(T, Q)` a remplacé le plancher C, ADR 0013) ; la dire « référence » serait inexact.
|
||||
Un « d'après g1vote » serait vrai : à trancher par Yvv.
|
||||
- **F1.2.10 « relu sur la chaîne toutes les 6 heures »** : l'API ne donne pas cette période
|
||||
(`wot::REFRESH`) ; l'écrire en dur serait un chiffre de plus à tenir à jour. La source de W
|
||||
(« membres de la toile de confiance Ğ1 ») est dite.
|
||||
- **F1.2.21 « Tout nouvel article commence à ce cran »**, au moment d'écrire un nouvel article :
|
||||
l'API ne donne pas le cran d'un nouvel article (`InertiaLevel::DEFAULT`) ; l'ordre de U3 ne
|
||||
permet de toucher `crates/` que pour le chapitre. Le cran est dit dès que l'article est proposé
|
||||
(son vote se déplie, « Inertie · 3 / 5 · moyenne »). Un champ de l'API le permettrait : à trancher.
|
||||
- **F1.1.6, la phrase de G** « plus il est grand, plus la part demandée monte quand peu de gens
|
||||
votent » : sans effet quand le quorum de l'article est W (relevé par T3c) ; le sens de G est dit par
|
||||
`formula.G` et `settings.gradient`.
|
||||
- **N1.1.15, la formule de G** (`G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`) : la phrase est portée, pas
|
||||
la formule — un chapitre d'information, pas un manuel. À ajouter en MathML si Yvv la veut.
|
||||
- **N1.5, l'exemple** « Ainsi, un article au cran 4 ne descend qu'avec les voix que demande le
|
||||
cran 4 » : la règle est dite avec le cran de l'article (`inertia.change.note`).
|
||||
|
||||
## Ce qui reste à trancher ou n'est pas prouvé
|
||||
|
||||
- **`inertia.explain`, première phrase** (déjà en ligne, gardée) : « Plus l'inertie est haute, plus
|
||||
il faut de voix pour changer ce texte. » C'est une tendance, pas une règle prouvée pour tout W et
|
||||
tout quorum : quand tout le monde vote, les crans 1 et 2 demandent la même part (M = 50 % aux
|
||||
deux) ; un quorum d'article fixé à W donne M à tous les crans. Aucun test ne la vérifie.
|
||||
- **`formula.B.wot`** n'est dit que si W est celui de la toile (`electorateSource` = `wot`) ; il est
|
||||
prouvé pour W de 100 à 10 000 000 (`wot::PLAUSIBLE`). Un `LD_WOT_FALLBACK` sous 100 le rendrait
|
||||
faux (la production ne le règle pas).
|
||||
- **« Le vote reste ouvert … à tout moment »** (`vote.permanent`) : vrai hors objection ; sur une
|
||||
version retenue, la phrase ne s'affiche pas et `vote.held` dit ce qui reste (contre, ou retrait).
|
||||
|
||||
## Ce que l'API donne en plus (le seul changement sous `crates/`)
|
||||
|
||||
`seedFeatured` sur chaque version (`docs.rs`, `proposal_json`) : la colonne `proposals.seed_featured`,
|
||||
qui reste vraie quand la Proposition d'amorce entre en vigueur, alors que `seedProposal` devient faux.
|
||||
Sans elle, le chapitre ne saurait plus, une fois Raison d'être en vigueur, à quel cran les Propositions
|
||||
d'amorce ont ouvert, et la compterait parmi les « autres articles ». Testé :
|
||||
`tests/seed_proposals.rs` `the_view_keeps_which_versions_the_seed_put_forward_once_they_enter_into_force`
|
||||
(vu rouge avant le champ).
|
||||
|
||||
## Le chapitre « Info ouverture doc de réf. »
|
||||
|
||||
Ce qu'il lit (`web/src/lib/opening.ts`, testé par `web/tests/unit/opening.test.ts`) :
|
||||
|
||||
- **le cran d'ouverture** d'un module : celui d'avant le premier changement **voté**
|
||||
(`inertiaChanges`, cause `vote`) ; un changement par amendement du seed (« réglage de départ du
|
||||
texte ») est un réglage de l'auteur, il compte dans l'ouverture ;
|
||||
- **les Propositions d'amorce** : les articles dont une version porte `seedFeatured` ; **les autres
|
||||
articles** : ceux du seed (une version d'origine `seed`), pas ceux qu'un membre a proposés depuis ;
|
||||
- **le titre** et **l'ordre de chaque section** : les modules ; plusieurs crans dans une même
|
||||
catégorie seraient tous dits ;
|
||||
- **les quorums** : `doc.quorums`, du cran 1 au cran 5, dits une fois s'ils sont tous égaux.
|
||||
|
||||
Le paragraphe d'Yvv ne s'affiche que si le document a des Propositions d'amorce. **Sa première phrase,
|
||||
« Aucun article n'est encore en vigueur. », ne s'affiche plus dès qu'un article est en vigueur** ; la
|
||||
suite commençait par « Les Propositions d'amorce **y** entrent par le vote », où « y » n'a plus rien à
|
||||
reprendre : elle dit alors « Les Propositions d'amorce **entrent en vigueur** par le vote, … » (clé
|
||||
`opening.amorce.after`), le reste mot pour mot. À confirmer par Yvv.
|
||||
@@ -193,3 +193,29 @@ Les mineurs de la relecture, tranchés ainsi (captures `/tmp/ld-u2-shots/`, avan
|
||||
l'ordre en vigueur : déplace au moins un article. », lu aussi comme description du bouton.
|
||||
- **Sur téléphone** : les trois lectures passent à la ligne plutôt que de cacher « Si tout
|
||||
passe » ; tous les gestes du vote déplié, « Tout déplier » compris, font au moins 44 px.
|
||||
|
||||
## Les informations de fonctionnement (lot U3, 03/11)
|
||||
|
||||
Yvv, 03/11 : formule, inertie et ordonnancement ne se votent plus (ADR 0014), « les infos doivent
|
||||
trouver leur place dans l'ux ». Tranché ainsi (inventaire : `U3-informations.md` ; captures :
|
||||
`/tmp/ld-u3-shots/`) :
|
||||
|
||||
- **Avant le texte, hors vote, « Info ouverture doc de réf. »** (le titre d'Yvv) : son paragraphe,
|
||||
« Aucun article n'est encore en vigueur. Les Propositions d'amorce y entrent par le vote… » (la
|
||||
première phrase tant que c'est vrai) ; « Inertie à l'ouverture » (Propositions d'amorce, titre du
|
||||
document, ordre de chaque section, autres articles, avec leurs crans) et « Quorum » (celui de chaque
|
||||
cran, la règle de l'auteur), lus dans l'API. La voix de l'interface (Nunito) sur un lavis doux, pas
|
||||
l'eau d'un vote. Puis **une séparation** : un filet de la couleur de la clé de voûte de l'ambiance,
|
||||
qui s'efface à ses bouts, jamais une bordure ; puis le premier article.
|
||||
- **Sans les titres « Introduction » et « Engagements fondamentaux »** dans le texte : leurs articles
|
||||
portent déjà le titre. Ailleurs (la ligne d'ordre, le panier, « Propositions en cours »), la section
|
||||
garde son nom.
|
||||
- **Chaque règle au moment où elle sert** : le vote permanent sous les boutons du vote ; la marge à
|
||||
dépasser dans le vote d'une version à côté d'un texte en vigueur ; qui l'emporte entre plusieurs
|
||||
versions dans « Autres versions » ; T′, l'arrondi, G et B dans « La formule du seuil » ; la part
|
||||
exigée, la participation habituelle et G dans « Réglages de la formule », avec les termes définis
|
||||
des lots T3 à T3c ; ce qu'un ordre change, en réordonnant.
|
||||
- **« Proposition d'amorce »** à la place de « Proposition seed ».
|
||||
- **Réordonner au glisser** : la ligne sous le pointeur se lit à sa place dans la mise en page, pas là
|
||||
où l'animation la montre : tirée sur plusieurs lignes, la poignée ne revient plus en arrière, et
|
||||
la nouvelle place est dite.
|
||||
|
||||
Reference in New Issue
Block a user