# Acte — Mise en ligne M9 (l'Acte d'engagement d'Yvv et les informations de fonctionnement hors vote, lots T4, U3 et U3b) Classe : déploie Projet : libreDecision Date : 2026-11-03 **État : PRÉPARÉ, non figé** — sur `d66823b` (`d66823b2f626b4833b9422c0bbf418fa698cfcd9`, lot U3b fusionné à 23 h 00) ; en attente de la boucle, de l'image et de la relecture indépendante de `d66823b` — préparé par l'intégrateur libredecision-d4 ; exécuté par orch (dev-63) sous son mandat (« déploie » et « pousse », du 03/11 au 08/11). Mot : **« déploie »** (rien n'est effacé ; voir « Ce que l'acte écrit »). ## Pour Yvv : ce que tu liras de changé Dans les deux groupes (Monnaie libre et l'essai), en français ici ; en anglais et en espagnol dans `docs/chantiers/acte-certification/textes-amorce.md`. Tous restent des **Propositions d'amorce** ouvertes, 0 vote, au cran 2 ; aucun article n'est en vigueur. **I1 « Raison d'être »** - Avant : *« Derrière une clé il n'y a qu'un seul être humain vivant ; derrière un être humain, il n'y a qu'une seule clé certifiante. »* / C'est le seul et unique propos de la certification, qui donne à notre toile fiduciaire sa valeur. Nous pouvons nous fier à l'unicité et l'intégrité de tout geste signé par cette clé. C'est l'enjeu de la certification. / Cet acte d'engagement est par ailleurs le seul acte de nature contractuelle qui fonde l'usage de la première monnaie libre. - Après : *« Derrière une clé il y a un et un seul être humain vivant ; derrière un être humain, il y a une et une seule clé certifiante. »* / C'est l'unique enjeu de la certification et de votre engagement, il donne à notre toile fiduciaire sa valeur : pouvoir nous fier à l'unicité et l'intégrité de tout geste signé par cette clé. / Cet acte d'engagement est par ailleurs le seul acte de nature contractuelle, qui fonde l'usage de la première monnaie libre. **E1 « Unicité du compte »** - Avant : Je m'engage sur l'honneur à n'avoir et n'avoir jamais qu'un seul et unique compte cocréateur de monnaie G1. - Après : Je m'engage sur l'honneur à n'avoir et n'avoir jamais qu'un seul et unique compte certifiant. **E12 « Responsabilité civique »** (nouveau, entre E1 et E2) - Je déclare sur l'honneur avoir la capacité légale et physique de signer un contrat et d'en assumer la responsabilité civique, pour certifier à mon tour. **E2 « Réciprocité »** - Avant : Je m'engage sur l'honneur à ne certifier que des personnes physiques qui respectent scrupuleusement ces deux présents engagements fondamentaux. - Après : Je m'engage sur l'honneur à ne certifier que des personnes physiques qui s'engagent elles-mêmes, à scrupuleusement respecter ces trois principes fondamentaux. **Ce qui sort du document** (rien n'est effacé) : les sections « Formule de vote » (F1, F1.1, F1.2, F1.3), « Inertie » (N1, N1.1) et « Ordonnancement » (O1), avec l'ordre de chacune. Elles ne se lisent plus, ne se votent plus, ne se publient plus. Leurs informations sont maintenant dans l'interface, là où elles servent : au vote déplié, dans le panneau « Réglages de la formule », sur la ligne d'ordre et au réglage du quorum. **Ce que tu verras à l'écran** - En haut du document, avant le texte, l'encadré **« Info ouverture doc de réf. »**, hors vote : ton paragraphe (« Aucun article n'est encore en vigueur. Les Propositions d'amorce y entrent par le vote… »), l'inertie à l'ouverture (Propositions d'amorce 2 / 5, titre 4 / 5, ordre de chaque section 2 / 5, autres articles 3 / 5) et le quorum (12 · 12 · 50 · 50 · 50 votants, du cran 1 au cran 5), lus dans le document. - Un filet entre cet encadré et le texte ; plus les titres « Introduction » ni « Engagements fondamentaux ». - « Proposition d'amorce » à la place de « Proposition seed ». - Sans être connecté, l'accueil dit : « 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. » **Les choix faits pour toi** (appliqués ; dis lequel tu changes, il se change par un nouvel amendement tant qu'aucun vote n'existe) : « il y a une et une seule clé » (« n'y a » lu comme une coquille, la seule correction de tes mots) ; I1 en trois paragraphes, le premier en italique ; tes virgules gardées ; « ces trois principes » = E1, E12, E2 ; E12 au cran 2 ; le chapitre titré comme tu l'as écrit ; « @ chiara » lu « à Chiara » ; une fois un article en vigueur, la première phrase de ton paragraphe disparaît et « y entrent par le vote » devient « entrent en vigueur par le vote ». Tes deux propositions d'inertie retirées le 03/11 (sur I1 et E1, Q12) ne bloquent pas la réécriture de ces textes : elles portent sur l'inertie, pas sur le texte, et restent dans l'historique. ## Intention Mettre en ligne la demande d'Yvv du 03/11, faite dans la session de l'intégrateur (vers 20 h 38, puis avant 20 h 44), mot pour mot dans `docs/chantiers/acte-certification/tableau.md` et `textes-amorce.md` : les textes I1, E1, E2, l'article nouveau « Responsabilité civique » ; « ordonnancement, inertie, et formule de vote sont des infos de fonctionnement […] Vire les 3 du bas de la liste » ; le chapitre « Info ouverture doc de réf. » ; la séparation avant le texte ; les titres « Introduction » et « Engagements fondamentaux » retirés ; le texte pour qui n'est pas invité. Un seul acte pour T4 et U3 (accord d'orch le 03/11 à 21 h 58) : T4 seul retirerait les informations du document avant que l'interface ne les dise. ## Ce qui part Version `d66823b` (lots T4, U3, U3b), qui contient la version en ligne `de1b7eb`. - **Serveur** : migration `0012_retired.sql` (additive) ; `retire.rs` (le retrait) ; `article_amend.rs` (E12) ; `seed_amend.rs` (trois amendements, I1, E1, E2) ; les lectures, votes, propositions, objections, coquilles, traductions, comptes et la publication ignorent une unité retirée ; `docs.rs` : `seedFeatured`. - **Seed** (`seeds/acte-engagement-certification.json`, bases neuves) : les textes d'Yvv, E12, sans les sections formule, inertie, ordonnancement. - **Interface** (`web/`) : le chapitre, la séparation, les titres, les informations dans le vote et les panneaux, « Proposition d'amorce », le texte pour qui n'est pas invité, le réordonnancement sur plusieurs lignes, le tableau des crans lisible sur bureau. - Configuration (`docker/`, `.woodpecker/`, `.env`, `data/`) : rien (prémisse 4). ## Ce que l'acte écrit dans la base de production (donnée runtime) Au premier démarrage, dans une transaction par amendement et par document, une fois : - **Migration 0012, additive** : deux colonnes vides `units.retired_at`, `units.retired_reason` ; deux tables de journal `retirement_amendments`, `article_amendments`. Aucune colonne retirée, aucune ligne effacée. - **`2026-11-03-i1-amorce`, `-e1-amorce`, `-e2-amorce`** (amendements de seed gardés, `Version::SeedProposal`) : texte fr, révision + 1 (I1 → 3, E1 et E2 → 2), une ligne `revisions` `amendment`, en et es remplacés, la décision dans `seed_amendments`, une ligne de file (Monnaie libre). Empreintes : I1 `a7095d70…` → `32eb36b4…`, E1 `bdca2713…` → `df31d0ec…`, E2 `bde76a30…` → `a7dd4690…`. Refusé à la moindre trace d'une personne (vote, simulé compris ; bulletin ; coquille ; traduction de membre ; objection ; texte différent de l'empreinte) : le texte d'avant reste. - **`2026-11-03-e12-responsabilite-civique`** (`article_amend.rs`) : une unité E12 (section `fondamental`, position 4,5, entre E1 et E2 tant que l'ordre de la section n'a pas de vote, sinon en fin de section), sa Proposition d'amorce ouverte (cran 2, `seed_featured`), sa révision initiale, en et es (empreinte `3fa5a8e5…`), la décision dans `article_amendments`, une ligne de file (Monnaie libre). - **`2026-11-03-fonctionnement-hors-vote`** (`retire.rs`) : `UPDATE units SET retired_at, retired_reason` sur dix unités par document (F1, F1.1, F1.2, F1.3, N1, N1.1, O1, `ordre.formule`, `ordre.inertie`, `ordre.ordonnancement`), **tous ou aucun**, seulement si aucune trace d'une personne n'existe sur elles (raisons de refus : `votes`, `ballots`, `adopted`, `member_proposal`, `corrected`, `translation_edited`, `signalled`, `quorum_set`, `changed`) ; la décision dans `retirement_amendments` ; une ligne de file (Monnaie libre). Leurs propositions, révisions, traductions, changements d'inertie et lignes de file restent. - La file de publication : les lignes en attente sont reportées (`next_at`) ; la publication reste suspendue (aucun texte en vigueur). Le groupe d'essai ne publie jamais. - **Rien d'autre** : aucun vote, aucune identité, aucun réglage, aucun autre article. ## Répétition **Faite le 03/11 de 22 h 45 min 39 à 22 h 47 min 46, réseau coupé** (`unshare -rn`, boucle locale seule : `m9/repetition-isolee.sh`, scratchpad de l'intégrateur), avec le serveur construit sur `5730d78` (même code serveur et même seed que `d66823b` : prémisse 4), copié en `m9/ld-server-a47aed0`, sur une copie de la copie de production prise par orch de 22 h 41 min 52 à 22 h 42 min 10 (production sur `de1b7eb5` ; empreintes vérifiées : `05058b76…`, `fd4c9fda…`, WAL vide), publication vers un dépôt nu local. Journal `m9/repetition-1.log` ; comparaison ligne à ligne de chaque table par `m9/compare.py` (lecture seule, par `rowid`). | Table | Avant | Après | Ce qui change | |---|---|---|---| | `_sqlx_migrations` | 11 | 12 | + la migration 12 | | `units` | 84 | 86 | + E12 × 2 ; 20 unités marquées (`retired_at`, `retired_reason`) ; les 64 autres : deux colonnes nouvelles vides | | `proposals` | 91 | 93 | + E12 × 2 (ouvertes, seed, `seed_featured`) ; I1, E1, E2 × 2 : `body`, `revision`, `updated_at` | | `revisions` | 123 | 131 | + 6 `amendment` (I1, E1, E2 × 2), + 2 `initial` (E12 × 2) | | `translations` | 144 | 148 | + 4 (E12 en, es × 2) ; 12 remplacées (I1, E1, E2 en, es × 2 : `body`, `source_hash`, `updated_at`) | | `seed_amendments` | 26 | 32 | + 6 décisions `applied` | | `article_amendments` | — | 2 | table nouvelle, 2 décisions `applied` (`between`, 4,5) | | `retirement_amendments` | — | 2 | table nouvelle, 2 décisions `applied` | | `outbox` | 25 (12 en attente) | 30 (17 en attente) | + 5 (Monnaie libre) ; les 12 en attente reportées (`next_at`) | | Les 22 autres tables (votes 0, bulletins 0, identités 1, réglages, quorums, inertie, invitations, groupes, sessions…) | | | identiques | **Aucune ligne supprimée, dans aucune table.** `integrity_check` ok, `foreign_key_check` vide. Dans chaque groupe, l'ordre de « fondamental » lu : T1, E1, E12, E2. Journal : six « seed amendment applied », deux « article added … placement=Between(4.5) », deux « units out of the document … retired=[F1, F1.1, F1.2, F1.3, N1, N1.1, O1, ordre.formule, ordre.inertie, ordre.ordonnancement] », « publication suspended … waiting=17 », aucune ligne ERROR ; un seul WARN, attendu réseau coupé (« web of trust size: no node nor indexer answered, keeping the last value »). Dépôt nu : 0 commit. **Ce qu'on lit ensuite** (connexion de développement sur une copie à part de l'état d'après) : dans chaque groupe, 27 unités, cinq ordres de section (introduction, fondamental, technique, conclusion, annexe) ; I1, E1, E12, E2 au cran 2, Propositions d'amorce (`seedProposal`, `seedFeatured`) ; ni F, ni N, ni O. **Un second démarrage ne rejoue rien** : toutes les tables identiques, seul le report de la file (`next_at`). **Le retour, rejoué** : le serveur de `de1b7eb` (`m8/ld-server-de1b7eb`, celui de la répétition de M8) sur une copie de l'état d'après : démarre, santé ok ; il n'écrit rien d'autre que le report de la file ; il montre, dans chaque groupe, **34 unités** : les sept articles F1 à O1 et les huit ordres de section reviennent, avec les nouveaux textes d'I1, E1, E2 et E12 entre E1 et E2 (ce sont des données). **Un nouveau passage** au serveur de `d66823b` ensuite ne rejoue rien (seul le report de la file) : les dix unités restent retirées, puisque leur marque est restée. ## Effet attendu - Dans les deux groupes : I1, E1, E2 aux textes d'Yvv, E12 entre E1 et E2, en fr, en, es ; ni formule, ni inertie, ni ordonnancement dans le document ; l'encadré « Info ouverture doc de réf. » en tête. - L'accueil sans session dit le texte pour qui n'est pas invité. - La publication reste suspendue ; le dépôt des textes reste à `9e0f45a`. Irréversibilité : **partielle**. Le code se remet en arrière (`previous` = `de1b7eb`) et les sept articles réapparaissent ; les nouveaux textes et E12 restent (l'ancien texte est dans l'historique de chaque proposition) ; la migration 0012 reste (ignorée par `de1b7eb`, `set_ignore_missing`). ## Avant — prémisses vivantes 1. La production sert `de1b7eb` : santé `"build":"de1b7eb5"` ; `prod/main` → `de1b7eb`. 2. Sur une copie fraîche, `m8/counts.sh ` identique à la ligne près à la colonne « Avant » de la répétition (migrations 1 à 11, integrity ok, identities 1, votes 0, revisions 123, translations 144, file `pending=12 done=13`, `seed_amendments` 26) ; et `m9/traces.sh ` (scratchpad de l'intégrateur, lecture seule) : pour I1, E1, E2 et les dix unités, dans les deux groupes, votes, bulletins, coquilles, objections, traductions de membre et quorums fixés à 0 ; propositions de membre : seulement `inertia/withdrawn` sur I1 et E1 dans Monnaie libre (les deux propositions d'inertie d'Yvv du 29/10, retirées par lui le 03/11, Q12). Elles ne touchent pas le retrait : I1 et E1 ne sont pas retirés, et la garde du retrait n'a aucune exception (une proposition de membre, de toute sorte et de tout statut, sur une des dix unités, refuse le retrait : `retire.rs`, `member_versions`). Elles ne touchent pas non plus la réécriture d'I1 et d'E1 : sa garde lit les traces sur la Proposition d'amorce elle-même (votes, bulletins, coquilles, traductions de membre, objections, révision, empreinte), pas les autres propositions de l'article (`seed_amend.rs`, `facts`) ; elles portent sur l'inertie, pas sur le texte, et restent dans l'historique de l'article. En vigueur : seuls les trois ordres (modules en vigueur sans vote) ; en tout 0 vote, 0 bulletin, aucune E12, migration 11. **Lu par l'intégrateur le 03/11 à 22 h 50** sur sa copie de la copie d'orch de 22 h 41 : l'attendu exact. Une trace fait refuser l'amendement concerné avec sa raison, et rien ne bouge pour lui. 3. La relecture indépendante de `d66823b`, inscrite « ok » dans `~/harness/etat/relectures.json`. 4. `git diff de1b7eb d66823b -- docker/ .woodpecker/ .env data/` → vide ; sous `crates/ld-server/migrations/`, le seul ajout `0012_retired.sql` ; `git diff 5730d78 d66823b -- crates/ seeds/` → vide (la répétition vaut pour `d66823b`). **Vu par l'intégrateur le 03/11 à 23 h 01.** 5. Boucle verte sur `d66823b`, le 03/11 de 23 h 00 à 23 h 07 (journal `m9/loop.log`), du premier coup : fmt, clippy `-D warnings`, 336 tests Rust, svelte-check 0 / 0 (652 fichiers), 113 vitest, build, e2e 48 / 48 (46 contrôles C1 à C44, M1, M2 ; 23 h 02 à 23 h 07). Image de production construite le 03/11 de 23 h 07 à 23 h 11 (copie principale sur `0e26624`, même code que `d66823b` : le dossier, le tableau et le HANDOFF seuls en plus), sortie 0 : étage serveur rejoué (fmt, clippy, 336 tests Rust, 0 échec, build release) ; étage web rejoué (svelte-check 0 erreur 0 avertissement, vitest, build) ; image de contrôle retirée à 23 h 11 (journal `m9/docker.log`). **Recette écran sur la copie de production** (l'état d'après M9 de la répétition, serveur de `d66823b`, chaîne coupée, connexion de développement sur cette copie seulement ; 32 captures, `m9/recette/shots/`, bureau 1360 et Pixel 7, pierre et nuit) : l'accueil sans session dit le texte pour qui n'est pas invité ; en tête du document, « Info ouverture doc de réf. » avec le paragraphe d'Yvv, les crans 2 · 4 · 2 · 3 et le quorum 12 · 12 · 50 · 50 · 50 lus dans la base ; le filet ; puis « Raison d'être » sans titre de section, « Unicité du compte », « Responsabilité civique », « Réciprocité », chacune « Proposition d'amorce », cran 2, « 9 oui sur 12 » ; ni formule, ni inertie, ni ordonnancement dans la page ; le vote déplié d'E12 dit le vote permanent, l'inertie et le quorum de l'article ; le panneau des réglages se lit en entier (W 5 709, la valeur de la copie). 6. Sur sonic, aucun témoin `/opt/libredecision-app/deploying`. ## Commande exacte ```sh cd /home/yvv/Documents/PROD/DEV/libreDecision git push prod d66823b2f626b4833b9422c0bbf418fa698cfcd9:main ``` Puis la branche du chantier (orch, même mandat) : `git push origin chantier/acte-certification`. ## Vérifications après - [ ] Santé vue de l'extérieur → `"build":"d66823b2"`. - [ ] Journaux : six « seed amendment applied » (`2026-11-03-i1-amorce`, `-e1-amorce`, `-e2-amorce` × essai, Monnaie libre), deux « article added … Between(4.5) », deux « units out of the document », « publication suspended … waiting=17 », aucune ligne ERROR ni WARN. - [ ] Redémarrage à froid : aucun amendement rejoué. - [ ] Sur une copie fraîche : `m9/compare.py ` donne exactement la table de la répétition, « AUCUNE LIGNE SUPPRIMÉE » ; `integrity_check` ok. - [ ] Vue de l'extérieur, `https://decision.librodrome.org/` sans session : le texte pour qui n'est pas invité. - [ ] Le dépôt des textes reste à `9e0f45a`. ## Retour - **Le code** : `docker tag libredecision-app:previous libredecision-app:latest`, puis `cd /opt/libredecision-app && docker compose up -d --force-recreate`. `previous` sera `de1b7eb`, qui ignore la migration 0012 et la colonne : les sept articles et les trois ordres réapparaissent, rien d'effacé (rejoué en répétition). Un nouveau passage à `d66823b` ne rejoue rien. - **Les textes** : pas de retour automatique ; l'ancien texte reste dans l'historique de chaque proposition, un nouvel amendement gardé pourrait le remettre. E12 reste (donnée). ## Exécution (à remplir par orch)