From 049f3c65b24aee00ec311c1d80d412a3dffca7f8 Mon Sep 17 00:00:00 2001 From: Yvv Date: Mon, 2 Nov 2026 05:40:03 +0100 Subject: [PATCH 01/11] =?UTF-8?q?Tableau=20:=20revue=20d'Yvv=20du=2002/11,?= =?UTF-8?q?=20lots=20S,=20V,=20U=20et=20H=20lanc=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 557e094..61379df 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -16,6 +16,21 @@ fusionnés (B2, F, D), puis `4d4adcc` (mineurs de la relecture de F) ; boucle ve - **F1.2, N1, N1.1, O1** réécrits (amendement de seed sur une proposition ouverte) ; - **licence** AGPL-3.0 (`76b8e9f`). +**Revue d'Yvv du 02/11 (ergonomie, Propositions seed, tampon des votes, accueil)**, armée d'avance par +« Et pousse. Déploie. ». Lots en cours, en copies de travail : +- **S** : I1, E1 et E2 deviennent des « Propositions seed », pas en vigueur, à une inertie basse. + Amendement gardé, ADR 0011, migration 0009. +- **V** : le tampon entre la base des votes et les indexeurs ; « je vois ce que j'ai fait sans + attendre » ; contrôle a posteriori (unique, le dernier qui vaut) ; vote simulé partout tant que la + chaîne est fermée. ADR 0012, migration 0010. +- **U** : le lecteur. Page courte ; ordonnancement par poignées en fin de section ; trois natures de + modules ; consoles sans doublon ; déplier ou panneau, une règle (note `UX-lecteur.md`). Relancé + après un blocage. +- **H** : l'accueil. Les trois points sous la clé de voûte, « boîte à outils » en premier ; le titre + centré, sur deux lignes. + +Puis : fusion, boucle, relecture indépendante, répétition, acte M6. + Yvv relit les quatre textes en ligne. Au prochain tour, avec ses retours : - N1.1 : G se calcule sur p̃ rapporté à W ; - étendre la garde de l'amendement à un texte déjà amendé. From d7f5f6d13c6f56a7e3022a160d97d4e63471a70a Mon Sep 17 00:00:00 2001 From: Yvv Date: Mon, 2 Nov 2026 07:33:02 +0100 Subject: [PATCH 02/11] =?UTF-8?q?Tableau=20:=20d=C3=A9cisions=20d'Yvv=20du?= =?UTF-8?q?=2002/11=20(cran=202,=20quorum=20par=20cran,=20vote=20simul?= =?UTF-8?q?=C3=A9,=20publication=20suspendue)=20;=20U=20et=20H=20relanc?= =?UTF-8?q?=C3=A9s=20;=20Q9,=20Q10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 41 +++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 61379df..909b8bb 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -17,17 +17,28 @@ fusionnés (B2, F, D), puis `4d4adcc` (mineurs de la relecture de F) ; boucle ve - **licence** AGPL-3.0 (`76b8e9f`). **Revue d'Yvv du 02/11 (ergonomie, Propositions seed, tampon des votes, accueil)**, armée d'avance par -« Et pousse. Déploie. ». Lots en cours, en copies de travail : -- **S** : I1, E1 et E2 deviennent des « Propositions seed », pas en vigueur, à une inertie basse. - Amendement gardé, ADR 0011, migration 0009. +« Et pousse. Déploie. ». Décisions d'Yvv du 02/11, de 06 h 26 à 07 h 05 (registre) : +- Propositions seed au **cran 2** ; +- **C devient un quorum** de votants par cran : 12 · 12 · 50 · 50 · 50 en Monnaie libre, 1 à + l'essai. Au-delà, la proportion suit la courbe des cinq crans. L'auteur initial change le quorum + de son article avant le premier vote ; +- l'écran dit, sans prendre de place, combien de « oui » font passer et combien de « non » + bloquent ; +- un vote simulé compte, puis s'efface à l'ouverture de la chaîne (acte « supprime ») ; +- la publication est suspendue jusqu'au premier texte en vigueur. + +Lots en cours, en copies de travail : +- **S** : I1, E1 et E2 deviennent des « Propositions seed », pas en vigueur, au cran 2 ; la + publication suspendue (ADR 0011, migration 0009). Puis le quorum : ADR 0013, migration 0011, + `PUT /units/{id}/quorum`, champs `quorum`, `yesNeeded` et `noNeeded`. - **V** : le tampon entre la base des votes et les indexeurs ; « je vois ce que j'ai fait sans attendre » ; contrôle a posteriori (unique, le dernier qui vaut) ; vote simulé partout tant que la - chaîne est fermée. ADR 0012, migration 0010. + chaîne est fermée, qui compte. ADR 0012, migration 0010. - **U** : le lecteur. Page courte ; ordonnancement par poignées en fin de section ; trois natures de - modules ; consoles sans doublon ; déplier ou panneau, une règle (note `UX-lecteur.md`). Relancé - après un blocage. + modules ; consoles sans doublon ; déplier ou panneau, une règle (note `UX-lecteur.md`) ; la ligne + oui / non et le réglage du quorum. Relancé le 02/11 vers 07 h 20, après une coupure réseau. - **H** : l'accueil. Les trois points sous la clé de voûte, « boîte à outils » en premier ; le titre - centré, sur deux lignes. + centré, sur deux lignes. Relancé le 02/11 vers 07 h 20, après une coupure réseau. Puis : fusion, boucle, relecture indépendante, répétition, acte M6. @@ -93,6 +104,8 @@ chaîne (question stratégique, `docs/recherche/vote-g1-chaine.md`) ; l'affichag | Q6 | Ğ1Companion ne signe pas encore une transaction construite par une page : quelle extension pour le geste unique ? | **tranché** (01/11) : duniter-connect maintenant ; Ğ1Companion et trustinWallet sur la même interface ; Ğecko par lien et QR | | Q7 | Le compte qui reçoit les 0,1 Ğ1 : à qui, et que deviennent les sommes ? | **tranché** (01/11) : un compte « libreDecision » créé par Yvv dans Ğecko, les sommes au collectif ; attend son adresse publique | | Q8 | Le secret du vote tombe par recoupement : la chaîne montre qui vient de voter, et les totaux bougent aussitôt (relecture de `74f96be`) | **tranché** (01/11) : on ne dit rien ; totaux et son propre vote en direct, inchangés | +| Q9 | Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? (Sinon, un « non » peut faire passer un texte en complétant le quorum.) | **défaut appliqué** : oui, ils comptent comme des « non » ; posé à Yvv le 02/11 | +| Q10 | Licence : AGPL-3.0 seulement, ou « ou toute version ultérieure » ? | **défaut appliqué** : AGPL-3.0-only (`76b8e9f`) ; posé à Yvv le 02/11 | Défauts posés par orch, sans question (Yvv peut les corriger) : - Décisions : « modules restant à voter » = les modules du doc pas encore adoptés par un vote @@ -121,15 +134,5 @@ Liste d'attente (relecture de `033b331+4d4adcc`, après M4) : - `place_at_end` coupe toujours le même intervalle : au 52e ajout dans une section, les positions se confondent ; - `publish.rs` : articles sur `tally`, modules sur `shown_tally` (identiques aujourd'hui). -À dire à Yvv : dans le groupe d'essai (C = 1), dès 16 membres une voix seule fait passer un texte, -la garde B^W passant sous la précision du calcul (ADR 0007). Monnaie libre (C = 50) n'est pas -concernée. Pour deux voix dans l'essai quel que soit W : C = 2. - -À demander à Yvv (relecture de `cd7e683`) : sur une version retenue par une objection, ni retirer -son vote ni passer à « contre » ; à la levée, l'adoption tourne aussitôt. Le garder, ou permettre de -retirer son vote et de voter « contre » sur une version retenue ? Défaut : tel quel (ADR 0010). - -Ensuite : Chaque mise en ligne (M1 à M4) attend « déploie » d'Yvv et une relecture -indépendante inscrite. La migration « Raison d'être » touche la base de production : elle ne -remplace le Préambule que s'il est intact (texte de départ, 0 vote, aucune correction), et le -dossier d'acte de M1 le dit. +Chaque mise en ligne attend « déploie » d'Yvv, ou le mandat d'orch, et une relecture indépendante +inscrite. From f4f8d5850e038e9ab3ce61431736e4a3f7b26d1a Mon Sep 17 00:00:00 2001 From: Yvv Date: Mon, 2 Nov 2026 07:41:31 +0100 Subject: [PATCH 03/11] Tableau : heure exacte de la relance de U et H Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 909b8bb..61741d7 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -36,9 +36,9 @@ Lots en cours, en copies de travail : chaîne est fermée, qui compte. ADR 0012, migration 0010. - **U** : le lecteur. Page courte ; ordonnancement par poignées en fin de section ; trois natures de modules ; consoles sans doublon ; déplier ou panneau, une règle (note `UX-lecteur.md`) ; la ligne - oui / non et le réglage du quorum. Relancé le 02/11 vers 07 h 20, après une coupure réseau. + oui / non et le réglage du quorum. Relancé le 02/11 à 07 h 26, après une coupure réseau. - **H** : l'accueil. Les trois points sous la clé de voûte, « boîte à outils » en premier ; le titre - centré, sur deux lignes. Relancé le 02/11 vers 07 h 20, après une coupure réseau. + centré, sur deux lignes. Relancé le 02/11 à 07 h 26, après une coupure réseau. Puis : fusion, boucle, relecture indépendante, répétition, acte M6. From 1027155091b7beea40cd8dbfed3bdda054da2eac Mon Sep 17 00:00:00 2001 From: Yvv Date: Mon, 2 Nov 2026 07:51:36 +0100 Subject: [PATCH 04/11] =?UTF-8?q?WIP=20accueil=20:=20la=20vo=C3=BBte=20abr?= =?UTF-8?q?ite=20les=20trois=20points=20(bo=C3=AEte=20=C3=A0=20outils=20en?= =?UTF-8?q?=20t=C3=AAte),=20titre=20centr=C3=A9=20en=20deux=20lignes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Une clé i18n par ligne du titre (fr, en, es), jamais de
dans une chaîne. Co-Authored-By: Claude Opus 5.5 --- web/src/lib/i18n/en.ts | 3 +- web/src/lib/i18n/es.ts | 3 +- web/src/lib/i18n/fr.ts | 4 +- web/src/routes/+page.svelte | 155 +++++++++++++++++++++++++++--------- 4 files changed, 123 insertions(+), 42 deletions(-) diff --git a/web/src/lib/i18n/en.ts b/web/src/lib/i18n/en.ts index 53f7543..50e861e 100644 --- a/web/src/lib/i18n/en.ts +++ b/web/src/lib/i18n/en.ts @@ -30,7 +30,8 @@ export const en: Messages = { 'nav.menu': 'Menu', 'nav.close': 'Close', - 'home.title': 'Making collective decisions possible', + 'home.title.line1': 'Making it possible', + 'home.title.line2': 'to decide together', 'home.leitmotiv.context': 'context and framing', 'home.leitmotiv.process': 'processes and methods', 'home.leitmotiv.tools': 'a toolbox', diff --git a/web/src/lib/i18n/es.ts b/web/src/lib/i18n/es.ts index b5a606f..144df45 100644 --- a/web/src/lib/i18n/es.ts +++ b/web/src/lib/i18n/es.ts @@ -30,7 +30,8 @@ export const es: Messages = { 'nav.menu': 'Menú', 'nav.close': 'Cerrar', - 'home.title': 'Hacer posible la decisión colectiva', + 'home.title.line1': 'Hacer posible', + 'home.title.line2': 'la decisión colectiva', 'home.leitmotiv.context': 'contexto y encuadre', 'home.leitmotiv.process': 'procesos y modalidades', 'home.leitmotiv.tools': 'caja de herramientas', diff --git a/web/src/lib/i18n/fr.ts b/web/src/lib/i18n/fr.ts index ed9159e..2a922d3 100644 --- a/web/src/lib/i18n/fr.ts +++ b/web/src/lib/i18n/fr.ts @@ -33,7 +33,9 @@ export const fr = { 'nav.menu': 'Menu', 'nav.close': 'Fermer', - 'home.title': 'Rendre possible la décision collective', + // The title on two lines, the break after « possible » (Yvv, 2026-11-02): one key per line. + 'home.title.line1': 'Rendre possible', + 'home.title.line2': 'la décision collective', 'home.leitmotiv.context': 'contexte et cadrage', 'home.leitmotiv.process': 'processus et modalités', 'home.leitmotiv.tools': 'boîte à outils', diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index f25707b..df73a6e 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -1,17 +1,28 @@
-

{t('home.title')}

-
    -
  • {t('home.leitmotiv.context')}
  • -
  • {t('home.leitmotiv.process')}
  • -
  • {t('home.leitmotiv.tools')}
  • -
+
+ +
    + {#each LEITMOTIV as key, i (key)} +
  • {t(key)}
  • + {/each} +
+
+

+ {t('home.title.line1')} + {t('home.title.line2')} +

{#if session.me} @@ -28,56 +39,122 @@ .home { max-width: 44rem; margin: 0 auto; - padding: clamp(3rem, 10vh, 6.5rem) clamp(1.2rem, 5vw, 3.5rem) 5rem; + padding: clamp(2rem, 7vh, 4.5rem) clamp(1.2rem, 5vw, 3.5rem) 5rem; display: grid; gap: clamp(2.4rem, 6vh, 3.6rem); } - .intro h1 { - font-family: var(--font-text); - font-weight: 500; - font-size: clamp(2.1rem, 1.4rem + 3vw, 3.4rem); - letter-spacing: -0.015em; - line-height: 1.08; - font-variation-settings: 'opsz' 72; - max-width: 15ch; - text-wrap: balance; + + /* The arch, drawn by the sign of the logo (stones in the ink of the mood, the keystone in + `--cle`), never tilted. Its box is the stone itself: 92 units wide (the base slab, x from + −46 to 46) and 59 high (y from −40, the top of the keystone, to 19, under the slab); the SVG's + own 3-unit margin spills out on every side. On a phone the arch reaches into the side padding, + 0.75rem short of the screen's edges, so that the opening keeps as much room as it can. */ + .vault { + --w: min(34rem, 100vw - 1.5rem); + container-type: inline-size; + position: relative; + width: var(--w); + margin-inline: calc(50% - var(--w) / 2); + aspect-ratio: 92 / 59; + color: var(--ink); } - /* The leitmotiv: three lines, each set on a small stone of the keystone's colour. */ + .sign { + position: absolute; + inset: calc(-300% / 59) calc(-300% / 92); + } + .sign :global(svg) { + display: block; + width: 100%; + height: 100%; + } + /* The light under the vault: the opening (x from −18.5 to 18.5, from the keystone down to the + slab), its top a half circle, washed with the keystone's colour. */ + .vault::before { + content: ''; + position: absolute; + inset: calc(2150% / 59) calc(2750% / 92) calc(340% / 59); + border-radius: 50% 50% 0 0 / 54.25% 54.25% 0 0; + background: radial-gradient( + ellipse 75% 62% at 50% 60%, + color-mix(in srgb, var(--cle) 12%, transparent), + transparent + ); + } + + /* The three points, sheltered: centred in the opening (x from −19 to 19, a block centred on + y = −1), one line each. The type follows the arch (cqi): the longest line of the three + languages, 10.8 em, holds in the 38 units of the opening with room to spare. */ .leitmotiv { - list-style: none; - margin: 1.4rem 0 0; + position: absolute; + inset-inline: calc(2700% / 92); + top: calc(3900% / 59); + translate: 0 -50%; + margin: 0; padding: 0; + list-style: none; display: grid; - gap: 0.2rem; + justify-items: center; + gap: 0.2em; font-family: var(--font-text); font-style: italic; - font-size: clamp(1.12rem, 1rem + 0.55vw, 1.4rem); - line-height: 1.45; + font-size: 3.55cqi; + line-height: 1.3; color: var(--ink-soft); + white-space: nowrap; + text-align: center; } - .leitmotiv li { - display: flex; - align-items: baseline; - gap: 0.7rem; + + .intro h1 { + margin-top: clamp(1.4rem, 4vh, 2.4rem); + font-family: var(--font-text); + font-weight: 500; + font-size: min(3.3rem, 8.6vw); + letter-spacing: -0.015em; + line-height: 1.1; + font-variation-settings: 'opsz' 72; + text-align: center; } - .leitmotiv li::before { - content: ''; - flex: none; - width: 0.62em; - height: 0.34em; - border-radius: 0.1em; - background: var(--cle); - opacity: 0.75; - translate: 0 -0.12em; + .line { + display: block; + text-wrap: balance; } + .enter { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.6rem 1.2rem; + display: grid; + justify-items: center; + gap: 0.8rem; + text-align: center; + } + .enter .btn { + min-height: 2.75rem; + padding-inline: 1.4rem; } .enter p { font-size: 0.9rem; max-width: 34ch; } + + /* The keystone sets the arch, then the three points come under it. */ + @media (prefers-reduced-motion: no-preference) { + .sign :global(path[fill^='var(--cle']) { + transform-box: fill-box; + animation: settle 0.7s var(--ease) 0.1s backwards; + } + .leitmotiv li { + animation: appear 0.6s var(--ease) backwards; + animation-delay: calc(0.55s + var(--i) * 0.12s); + } + } + @keyframes settle { + from { + transform: translateY(-40%); + opacity: 0; + } + } + @keyframes appear { + from { + transform: translateY(0.4em); + opacity: 0; + } + } From 563745204052c603bee8a982a99804e041cee963 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:42:20 +0100 Subject: [PATCH 05/11] =?UTF-8?q?WIP=20accueil=20:=20la=20bande=20des=20tr?= =?UTF-8?q?ois=20points=20sous=20la=20cl=C3=A9,=20centr=C3=A9e=20sur=20la?= =?UTF-8?q?=20naissance=20de=20l'arche=20;=20marges=20lat=C3=A9rales=20du?= =?UTF-8?q?=20dessin=20rogn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/src/routes/+page.svelte | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index df73a6e..990d05d 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -47,8 +47,9 @@ /* The arch, drawn by the sign of the logo (stones in the ink of the mood, the keystone in `--cle`), never tilted. Its box is the stone itself: 92 units wide (the base slab, x from −46 to 46) and 59 high (y from −40, the top of the keystone, to 19, under the slab); the SVG's - own 3-unit margin spills out on every side. On a phone the arch reaches into the side padding, - 0.75rem short of the screen's edges, so that the opening keeps as much room as it can. */ + own 3-unit margin spills out above and below (clipped on the sides, where it is empty). On a + phone the arch reaches into the side padding, 0.75rem short of the screen's edges, so that the + opening keeps as much room as it can. */ .vault { --w: min(34rem, 100vw - 1.5rem); container-type: inline-size; @@ -56,6 +57,7 @@ width: var(--w); margin-inline: calc(50% - var(--w) / 2); aspect-ratio: 92 / 59; + overflow-x: clip; color: var(--ink); } .sign { @@ -81,18 +83,18 @@ ); } - /* The three points, sheltered: centred in the opening (x from −19 to 19, a block centred on - y = −1), one line each. The type follows the arch (cqi): the longest line of the three - languages, 10.8 em, holds in the 38 units of the opening with room to spare. */ + /* The three points, sheltered: centred in the opening (x from −19 to 19; a band from y = −19, + under the keystone, to 19, centred on the springing line y = 0), one line each. The type + follows the arch (cqi): the longest line of the three languages, 10.8 em, holds in the + 38 units of the opening with room to spare. */ .leitmotiv { position: absolute; - inset-inline: calc(2700% / 92); - top: calc(3900% / 59); - translate: 0 -50%; + inset: calc(2100% / 59) calc(2700% / 92) 0; margin: 0; padding: 0; list-style: none; display: grid; + align-content: center; justify-items: center; gap: 0.2em; font-family: var(--font-text); From 723242e0a68aa6c3c8ba70aafcabe25d31a261b2 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:42:29 +0100 Subject: [PATCH 06/11] =?UTF-8?q?Tableau=20:=20rel=C3=A8ve=20d'orch=20le?= =?UTF-8?q?=2003/11=20=C3=A0=2003=20h=2038,=20=C3=A9tat=20des=20quatre=20c?= =?UTF-8?q?opies,=20ordre=20de=20reprise=20H,=20S,=20V,=20U=20;=20H=20rela?= =?UTF-8?q?nc=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 41 +++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 61741d7..2263f98 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -27,20 +27,35 @@ fusionnés (B2, F, D), puis `4d4adcc` (mineurs de la relecture de F) ; boucle ve - un vote simulé compte, puis s'efface à l'ouverture de la chaîne (acte « supprime ») ; - la publication est suspendue jusqu'au premier texte en vigueur. -Lots en cours, en copies de travail : -- **S** : I1, E1 et E2 deviennent des « Propositions seed », pas en vigueur, au cran 2 ; la - publication suspendue (ADR 0011, migration 0009). Puis le quorum : ADR 0013, migration 0011, - `PUT /units/{id}/quorum`, champs `quorum`, `yesNeeded` et `noNeeded`. -- **V** : le tampon entre la base des votes et les indexeurs ; « je vois ce que j'ai fait sans - attendre » ; contrôle a posteriori (unique, le dernier qui vaut) ; vote simulé partout tant que la - chaîne est fermée, qui compte. ADR 0012, migration 0010. -- **U** : le lecteur. Page courte ; ordonnancement par poignées en fin de section ; trois natures de - modules ; consoles sans doublon ; déplier ou panneau, une règle (note `UX-lecteur.md`) ; la ligne - oui / non et le réglage du quorum. Relancé le 02/11 à 07 h 26, après une coupure réseau. -- **H** : l'accueil. Les trois points sous la clé de voûte, « boîte à outils » en premier ; le titre - centré, sur deux lignes. Relancé le 02/11 à 07 h 26, après une coupure réseau. +**Relève d'orch le 03/11 à 03 h 38**, sur ordre d'orch racine (dev-63). La session d'avant était +bloquée par le quota depuis le 02/11 à 08 h 51, puis coupée par le redémarrage du poste à 02 h 56. +Les quatre agents sont morts, leurs copies sont intactes, `/tmp` est vidé (captures et bases de +test perdues). Budget : finir S, U, V et H, sans nouveau lot, **un sous-agent à la fois** (compte +partagé avec HCO, qui passe en premier). **Pas de mandat** : M6 attend le « déploie » d'Yvv tapé +dans cette session (le « Pousse. Déploie. » du 02/11 a été dit à une autre session). -Puis : fusion, boucle, relecture indépendante, répétition, acte M6. +Ordre de reprise : H, puis S, puis V, puis U. Chaque lot fusionne d'abord le chantier, qui contient +déjà les lots finis. Le contrat du quorum vient de S et sert V et U. + +Lots en cours, en copies de travail (`.claude/worktrees/agent-`) : +- **H** (`a6b179c…`, `lot/h-accueil`) : l'accueil. Les trois points sous la clé de voûte, « boîte + à outils » en premier ; le titre centré, sur deux lignes. WIP `1027155` + un réglage non commité. + **Relancé le 03/11 à 03 h 41.** +- **S** (`a0b2510…`, `lot/s-seed`) : I1, E1 et E2 deviennent des « Propositions seed », pas en + vigueur, au cran 2 ; la publication suspendue (ADR 0011, migration 0009). WIP `6228d39` + 14 + fichiers (tests en reprise). Phase 2 pas commencée : le quorum, ADR 0013, migration 0011, + `PUT /units/{id}/quorum`, champs `quorum`, `yesNeeded` et `noNeeded`. En attente de H. +- **V** (`a78bacc…`, `lot/v-tampon`) : le tampon entre la base des votes et les indexeurs ; « je + vois ce que j'ai fait sans attendre » ; contrôle a posteriori (unique, le dernier qui vaut) ; vote + simulé partout tant que la chaîne est fermée, qui compte, puis s'efface par un acte « supprime ». + ADR 0012 et moteur commités (`e7dda2f`, `ee37c3b`) ; serveur, migration 0010 et tests non + commités (16 fichiers). En attente de S. +- **U** (`adddf06…`, `lot/u-lecteur`) : le lecteur. Page courte ; ordonnancement par poignées en + fin de section ; trois natures de modules ; consoles sans doublon ; déplier ou panneau, une règle ; + la ligne oui / non et le réglage du quorum. Note `UX-lecteur.md` commitée (`d4531da`), 4 fichiers + commencés. En attente de V. + +Puis : boucle sur le chantier, relecture indépendante, répétition, dossier d'acte M6, PRÊT. Yvv relit les quatre textes en ligne. Au prochain tour, avec ses retours : - N1.1 : G se calcule sur p̃ rapporté à W ; From d76598b41b250183759c855d74fb5f9642502d16 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:42:43 +0100 Subject: [PATCH 07/11] Tableau : heure du blocage par le quota en heure de Paris (09 h 51, pas 08 h 51 UTC) Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 2263f98..2a7de14 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -28,7 +28,7 @@ fusionnés (B2, F, D), puis `4d4adcc` (mineurs de la relecture de F) ; boucle ve - la publication est suspendue jusqu'au premier texte en vigueur. **Relève d'orch le 03/11 à 03 h 38**, sur ordre d'orch racine (dev-63). La session d'avant était -bloquée par le quota depuis le 02/11 à 08 h 51, puis coupée par le redémarrage du poste à 02 h 56. +bloquée par le quota depuis le 02/11 à 09 h 51, puis coupée par le redémarrage du poste à 02 h 56. Les quatre agents sont morts, leurs copies sont intactes, `/tmp` est vidé (captures et bases de test perdues). Budget : finir S, U, V et H, sans nouveau lot, **un sous-agent à la fois** (compte partagé avec HCO, qui passe en premier). **Pas de mandat** : M6 attend le « déploie » d'Yvv tapé From 0d3dd416d25a038ca08a09961c8cead3bc0fdd8e Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:46:57 +0100 Subject: [PATCH 08/11] =?UTF-8?q?Tableau=20:=20Q9=20et=20Q10=20tranch?= =?UTF-8?q?=C3=A9es=20par=20Yvv=20le=2003/11=20(votants=20manquants=20=3D?= =?UTF-8?q?=20non=20;=20AGPL-3.0-or-later)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index 2a7de14..ead1b9c 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -119,8 +119,8 @@ chaîne (question stratégique, `docs/recherche/vote-g1-chaine.md`) ; l'affichag | Q6 | Ğ1Companion ne signe pas encore une transaction construite par une page : quelle extension pour le geste unique ? | **tranché** (01/11) : duniter-connect maintenant ; Ğ1Companion et trustinWallet sur la même interface ; Ğecko par lien et QR | | Q7 | Le compte qui reçoit les 0,1 Ğ1 : à qui, et que deviennent les sommes ? | **tranché** (01/11) : un compte « libreDecision » créé par Yvv dans Ğecko, les sommes au collectif ; attend son adresse publique | | Q8 | Le secret du vote tombe par recoupement : la chaîne montre qui vient de voter, et les totaux bougent aussitôt (relecture de `74f96be`) | **tranché** (01/11) : on ne dit rien ; totaux et son propre vote en direct, inchangés | -| Q9 | Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? (Sinon, un « non » peut faire passer un texte en complétant le quorum.) | **défaut appliqué** : oui, ils comptent comme des « non » ; posé à Yvv le 02/11 | -| Q10 | Licence : AGPL-3.0 seulement, ou « ou toute version ultérieure » ? | **défaut appliqué** : AGPL-3.0-only (`76b8e9f`) ; posé à Yvv le 02/11 | +| Q9 | Sous le quorum, les votants qui manquent comptent-ils comme des « non » ? (Sinon, un « non » peut faire passer un texte en complétant le quorum.) | **tranché** (03/11, formulaire d'orch racine vers 03 h 45) : « Ils comptent comme non » ; au cran 2, quorum 12, 9 oui passent avec 3 non au plus | +| Q10 | Licence : AGPL-3.0 seulement, ou « ou toute version ultérieure » ? | **tranché** (03/11, même formulaire) : « Ou version ultérieure » → `AGPL-3.0-or-later` dans les manifestes (`Cargo.toml`, `web/package.json` et son verrou) et le README ; `LICENSE` inchangé ; confié au lot S | Défauts posés par orch, sans question (Yvv peut les corriger) : - Décisions : « modules restant à voter » = les modules du doc pas encore adoptés par un vote From c1275512e1f39580e09b1a9924bed4e064db198c Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:54:14 +0100 Subject: [PATCH 09/11] =?UTF-8?q?Accueil=20:=20sur=20t=C3=A9l=C3=A9phone,?= =?UTF-8?q?=20l'italique=20des=20trois=20points=20garde=20ses=20avances=20?= =?UTF-8?q?exactes=20(lettres=20et=20espaces=20r=C3=A9guliers)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/src/routes/+page.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/web/src/routes/+page.svelte b/web/src/routes/+page.svelte index 990d05d..26d6b08 100644 --- a/web/src/routes/+page.svelte +++ b/web/src/routes/+page.svelte @@ -85,8 +85,10 @@ /* The three points, sheltered: centred in the opening (x from −19 to 19; a band from y = −19, under the keystone, to 19, centred on the springing line y = 0), one line each. The type - follows the arch (cqi): the longest line of the three languages, 10.8 em, holds in the - 38 units of the opening with room to spare. */ + follows the arch (cqi): the longest line of the three languages, 10.5 em (es), holds in the + 38 units of the opening with room to spare. On a phone the italic is small (12px at 360): + its advances are kept exact, not rounded to the pixel, or the letters drift apart + (« pr ocessus ») and the word spaces close up. */ .leitmotiv { position: absolute; inset: calc(2100% / 59) calc(2700% / 92) 0; @@ -104,6 +106,7 @@ color: var(--ink-soft); white-space: nowrap; text-align: center; + text-rendering: geometricPrecision; } .intro h1 { From 48529e5409b2ac0c9c938c3a3f4ecd1cad01ae48 Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 03:58:08 +0100 Subject: [PATCH 10/11] =?UTF-8?q?e2e=20:=20l'accueil=20sous=20la=20vo?= =?UTF-8?q?=C3=BBte=20(C1=20au=20bureau,=20M1=20sur=20t=C3=A9l=C3=A9phone?= =?UTF-8?q?=20=C3=A0=20412=20puis=20360)=20:=20les=20trois=20points=20dans?= =?UTF-8?q?=20l'ouverture=20et=20centr=C3=A9s,=20le=20titre=20centr=C3=A9?= =?UTF-8?q?=20en=20deux=20lignes,=20rien=20d'inclin=C3=A9=20ni=20de=20d?= =?UTF-8?q?=C3=A9bordant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- web/e2e/helpers.ts | 73 +++++++++++++++++++++++++++++++++++++++++- web/e2e/mobile.spec.ts | 10 ++++-- web/e2e/reader.spec.ts | 7 ++-- 3 files changed, 83 insertions(+), 7 deletions(-) diff --git a/web/e2e/helpers.ts b/web/e2e/helpers.ts index ebf61fd..3d881a4 100644 --- a/web/e2e/helpers.ts +++ b/web/e2e/helpers.ts @@ -1,4 +1,4 @@ -import type { Browser, Page } from '@playwright/test'; +import { expect, type Browser, type Page } from '@playwright/test'; export const DOC = '/g/monnaie-libre/docs/acte-engagement-certification'; export const TEST_DOC = '/g/essai/docs/acte-engagement-certification'; @@ -138,3 +138,74 @@ export async function chain(page: Page, docPath = DOC) { (await page.request.post(`${base}/control/${what}`)).json(), }; } + +/** + * The welcome (Yvv, 2026-11-02), in French: the keystone arch shelters the three points, the + * toolbox first, each centred under the keystone in the opening; then the title, centred, on + * two lines broken after « possible ». Nothing tilted, nothing past the edges of the screen. + * Measured once the arch has settled (its entrance done). + */ +export async function expectWelcome(page: Page) { + await expect(page.locator('.vault .leitmotiv li')).toHaveText(['boîte à outils', 'contexte et cadrage', 'processus et modalités']); + const h1 = page.getByRole('heading', { level: 1 }); + await expect(h1).toHaveText('Rendre possible la décision collective'); + await expect(h1.locator('.line')).toHaveText(['Rendre possible', 'la décision collective']); + const m = await page.evaluate(async () => { + const intro = document.querySelector('.intro')!; + await Promise.all(intro.getAnimations({ subtree: true }).map((a) => a.finished)); + const text = (el: Element) => { + const r = document.createRange(); + r.selectNodeContents(el); + return { box: r.getBoundingClientRect(), rects: r.getClientRects().length }; + }; + const v = document.querySelector('.vault')!.getBoundingClientRect(); + // The arch in its own units: 92 wide (x from −46), the top of the keystone at y = −40. + const u = v.width / 92; + const at = (x: number, y: number) => ({ x: v.left + (x + 46) * u, y: v.top + (y + 40) * u }); + const points = [...document.querySelectorAll('.leitmotiv li')].map((li) => { + const { box, rects } = text(li); + // Back into the arch's units, from its axis and its springing line (y = 0). + return { rects, left: (box.left - at(0, 0).x) / u, right: (box.right - at(0, 0).x) / u, top: (box.top - at(0, 0).y) / u, bottom: (box.bottom - at(0, 0).y) / u }; + }); + const h = document.querySelector('h1')!.getBoundingClientRect(); + const lines = [...document.querySelectorAll('h1 .line')].map((l) => ({ ...text(l), block: l.getBoundingClientRect() })); + const tilted = [document.querySelector('.vault svg')!, ...document.querySelectorAll('.vault svg path')] + .flatMap((n) => { + const out: string[] = []; + for (let e: Element | null = n; e && e !== document.body; e = e.parentElement) { + const cs = getComputedStyle(e); + const flat = cs.transform === 'none' || /^matrix\(1, 0, 0, 1, /.test(cs.transform); + if (!flat || (cs.rotate && cs.rotate !== 'none')) out.push(`${e.tagName} ${cs.transform} ${cs.rotate}`); + } + return out; + }); + return { + overflow: document.documentElement.scrollWidth - innerWidth, + axis: v.left + v.width / 2, + vaultBottom: v.bottom, + points, + title: { top: h.top, axis: h.left + h.width / 2 }, + lines: lines.map(({ box, rects, block }) => ({ rects, top: block.top, bottom: block.bottom, axis: box.left + box.width / 2 })), + tilted, + }; + }); + expect(m.overflow, 'nothing past the edge of the screen').toBeLessThanOrEqual(0); + expect(m.tilted, 'the arch is never tilted').toEqual([]); + // The three points: one line each, top to bottom, centred on the axis, under the keystone (its + // foot at y = −19), between the imposts (x = ±19) and above the slab (y = 15.6); a line that + // rises above the springing line stays clear of the voussoirs, closer in there (x = ±17). + for (const [i, p] of m.points.entries()) { + expect(p.rects, `point ${i}: one line`).toBe(1); + expect(Math.abs((p.left + p.right) / 2), `point ${i}: centred`).toBeLessThan(0.3); + expect(p.top, `point ${i}: under the keystone`).toBeGreaterThan(-19); + expect(p.bottom, `point ${i}: above the slab`).toBeLessThan(15.6); + expect(p.right, `point ${i}: in the opening`).toBeLessThan(p.top < 0 ? 17 : 19); + if (i > 0) expect(p.top, `point ${i}: under the one before`).toBeGreaterThan(m.points[i - 1]!.top); + } + // The title: under the arch, centred on its axis, two lines of one line each. + expect(m.title.top).toBeGreaterThanOrEqual(m.vaultBottom); + expect(Math.abs(m.title.axis - m.axis)).toBeLessThan(1); + expect(m.lines.map((l) => l.rects)).toEqual([1, 1]); + expect(m.lines[1]!.top).toBeGreaterThanOrEqual(m.lines[0]!.bottom - 1); + for (const l of m.lines) expect(Math.abs(l.axis - m.axis)).toBeLessThan(1); +} diff --git a/web/e2e/mobile.spec.ts b/web/e2e/mobile.spec.ts index 15ffc4f..6357a22 100644 --- a/web/e2e/mobile.spec.ts +++ b/web/e2e/mobile.spec.ts @@ -1,5 +1,5 @@ import { expect, test, type Locator } from '@playwright/test'; -import { DOC, shot, signIn } from './helpers'; +import { DOC, expectWelcome, shot, signIn } from './helpers'; /** WCAG contrast ratio of two CSS colours `rgb(r, g, b)`. */ function contrast(a: string, b: string): number { @@ -25,13 +25,19 @@ async function backdrop(el: Locator): Promise { }); } -test('M1 — mobile : logo dans la barre, menu en tiroir, vote déplié, panier, réglages lisibles, pastilles au clavier', async ({ page }) => { +test('M1 — mobile : logo dans la barre, l’accueil sous la voûte, menu en tiroir, vote déplié, panier, réglages lisibles, pastilles au clavier', async ({ page }) => { await signIn(page, 'Chiara'); await page.goto('/'); const brand = page.locator('header.topbar a.brand'); await expect(brand).toHaveAccessibleName('libreDecision'); await expect(brand.locator('svg')).toBeVisible(); await expect(page.locator('a.root')).toContainText('Monnaie libre'); + // The welcome on this phone, then on a narrow one (360): the arch still shelters the three points. + await expectWelcome(page); + const size = page.viewportSize(); + await page.setViewportSize({ width: 360, height: 780 }); + await expectWelcome(page); + if (size) await page.setViewportSize(size); await page.goto(DOC); await page.getByRole('button', { name: 'Menu' }).click(); const drawer = page.getByRole('dialog', { name: 'Boîte à outils' }); diff --git a/web/e2e/reader.spec.ts b/web/e2e/reader.spec.ts index 009571b..e4766c3 100644 --- a/web/e2e/reader.spec.ts +++ b/web/e2e/reader.spec.ts @@ -1,10 +1,9 @@ import { expect, test } from '@playwright/test'; -import { BOB, DOC, person, signIn, TEST_DOC, wallet } from './helpers'; +import { BOB, DOC, expectWelcome, person, signIn, TEST_DOC, wallet } from './helpers'; -test('C1 — l’accueil sans session : le titre, le leitmotiv en trois lignes, la connexion, le menu complet', async ({ page }) => { +test('C1 — l’accueil sans session : la voûte abrite les trois points, le titre centré en deux lignes, la connexion, le menu complet', async ({ page }) => { await page.goto('/'); - await expect(page.getByRole('heading', { level: 1 })).toHaveText('Rendre possible la décision collective'); - await expect(page.locator('.leitmotiv li')).toHaveText(['contexte et cadrage', 'processus et modalités', 'boîte à outils']); + await expectWelcome(page); const nav = page.getByRole('navigation', { name: 'Boîte à outils' }); for (const item of ['Décisions', 'Docs de référence', 'Mandats', 'Protocoles']) { await expect(nav.locator('.tool', { hasText: item })).toBeVisible(); From d07883eca006d855379f7fc373dd853c28a3f19f Mon Sep 17 00:00:00 2001 From: Yvv Date: Tue, 3 Nov 2026 04:05:43 +0100 Subject: [PATCH 11/11] =?UTF-8?q?Tableau=20:=20lot=20H=20fusionn=C3=A9=20(?= =?UTF-8?q?a3c0a76),=20S=20relanc=C3=A9=20=C3=A0=2004=20h=2005=20;=20deux?= =?UTF-8?q?=20d=C3=A9fauts=20du=20menu=20et=20du=20sceau=20en=20liste=20d'?= =?UTF-8?q?attente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/chantiers/acte-certification/tableau.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/chantiers/acte-certification/tableau.md b/docs/chantiers/acte-certification/tableau.md index ead1b9c..759f1d4 100644 --- a/docs/chantiers/acte-certification/tableau.md +++ b/docs/chantiers/acte-certification/tableau.md @@ -38,13 +38,15 @@ Ordre de reprise : H, puis S, puis V, puis U. Chaque lot fusionne d'abord le cha déjà les lots finis. Le contrat du quorum vient de S et sert V et U. Lots en cours, en copies de travail (`.claude/worktrees/agent-`) : -- **H** (`a6b179c…`, `lot/h-accueil`) : l'accueil. Les trois points sous la clé de voûte, « boîte - à outils » en premier ; le titre centré, sur deux lignes. WIP `1027155` + un réglage non commité. - **Relancé le 03/11 à 03 h 41.** +- **H** (`a6b179c…`, `lot/h-accueil`) : l'accueil. **Fini et fusionné** le 03/11 à 04 h 03 + (`a3c0a76`). Boucle verte dans sa copie : 237 tests Rust, 55 vitest, e2e 35 / 35. À faire voir + à Yvv : le titre anglais devient « Making it possible / to decide together » ; les trois points + font 12 px à 360 de large. - **S** (`a0b2510…`, `lot/s-seed`) : I1, E1 et E2 deviennent des « Propositions seed », pas en vigueur, au cran 2 ; la publication suspendue (ADR 0011, migration 0009). WIP `6228d39` + 14 - fichiers (tests en reprise). Phase 2 pas commencée : le quorum, ADR 0013, migration 0011, - `PUT /units/{id}/quorum`, champs `quorum`, `yesNeeded` et `noNeeded`. En attente de H. + fichiers (tests en reprise). Phase 2 : le quorum, ADR 0013, migration 0011, + `PUT /units/{id}/quorum`, champs `quorum`, `yesNeeded` et `noNeeded`. Phase 3 : la licence + `AGPL-3.0-or-later`. **Relancé le 03/11 à 04 h 05.** - **V** (`a78bacc…`, `lot/v-tampon`) : le tampon entre la base des votes et les indexeurs ; « je vois ce que j'ai fait sans attendre » ; contrôle a posteriori (unique, le dernier qui vaut) ; vote simulé partout tant que la chaîne est fermée, qui compte, puis s'efface par un acte « supprime ». @@ -92,7 +94,9 @@ Ce qu'Yvv doit fournir : | L12 | Objections « redit » et « contredit » : la plus récente des deux propositions n'est pas votable tant que son auteur n'a pas répondu (redit : modifier l'article visé ; contredit : reformuler) ; un message à l'auteur de l'objection dans trustinWallet : lever ou réitérer ; sans réponse sous 3 jours, l'objection est levée. | F | M4 | | L13 | Coquilles : celle d'un autre que l'auteur attend sa validation (message), puis passe seule après 3 jours ; l'auteur garde la main tant que le texte n'est pas en vigueur ; sur un texte en vigueur, seule une coquille validée le corrige. | F | M4 | -**Liste d'attente** (hors livraison, sauf mot d'Yvv) : l'inscription de chaque vote sur la +**Liste d'attente** (hors livraison, sauf mot d'Yvv) : au bureau, le bas du menu latéral (pastilles +d'ambiance, « Se connecter ») est rogné au bord droit ; sur téléphone avec session, le sceau fixe +chevauche la flèche d'une carte de groupe (vus par le lot H le 03/11, pas comparés à `5cf30e0`) ; l'inscription de chaque vote sur la chaîne (question stratégique, `docs/recherche/vote-g1-chaine.md`) ; l'affichage dans Ğecko. ## Lots