# Acte — Mise en ligne M9 (l'Acte d'engagement d'Yvv et les informations de fonctionnement hors vote, lots T4, U3, U3b et U3c) Classe : déploie Projet : libreDecision Date : 2026-11-03 **État : EXÉCUTÉ** le 04/11 de 00 h 16 à 00 h 39 (voir « Exécution ») ; figé sur `fadfff5` (`fadfff55649140a8e240644c3a958ed256a291fd`, lot U3c fusionné le 03/11 à 23 h 49) le 04/11 à 00 h 15 — 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). Relecture indépendante : « fadfff5 : ok » (prémisse 3). 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 ou Yvv » lu « à Chiara ou à Yvv » ; 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 `fadfff5` (lots T4, U3, U3b, U3c), 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 ; « La formule du seuil » dit « quand tout le monde vote, la part exigée est la majorité M » (U3c, vrai pour tout W). - 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, raison « Proposition d'amorce réécrite : … »). 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, « Proposition d'amorce ajoutée : E12 … »). - **`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 autre article. (Les cinq réglages de participation sont remesurés par la tâche quotidienne si la dernière mesure a plus de 24 h, avec ou sans M9 : mêmes valeurs tant qu'aucune proposition n'a été votée.) ## Répétition **Faite sur `fadfff5` le 03/11 de 23 h 50 min 24 à 23 h 52 min 32, réseau coupé** (`unshare -rn`, boucle locale seule : `m9/repetition-isolee.sh`, scratchpad de l'intégrateur), avec le serveur construit sur `fadfff5` (`m9/ld-server-fadfff5`), 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-fadfff5.log` ; comparaison ligne à ligne de chaque table par `m9/compare.py` (lecture seule, par `rowid`). Une première répétition sur `d66823b` (22 h 45 min 39 à 22 h 47 min 46, `m9/repetition-d66823b.log`, états gardés dans `m9/snap-d66823b/`) a donné les mêmes comptes ; la relecture de `fadfff5` a comparé les deux, heures et identifiants neutralisés : seules diffèrent les raisons des quatre lignes de file (« Proposition d'amorce »). | 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`) | | `settings` | 7 | 7 | les 5 mesures de participation refaites (dernière le 02/11 à 22 h 09 UTC, plus de 24 h) : mêmes valeurs (médiane nulle, 0 proposition), seule l'heure change ; ce n'est pas M9 (absent de la répétition de `d66823b`, faite moins de 24 h après) | | Les 21 autres tables (votes 0, bulletins 0, identités 1, 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 `fadfff5` 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, inscrite « ok » dans `~/harness/etat/relectures.json`. - **`fadfff5` : ok.** Sous-agent neuf, sans le contexte de l'intégrateur, sur le delta `d66823b..fadfff5` (accord d'orch, en réponse à la question de l'intégrateur du 03/11 vers 23 h 27), lancé le 03/11 à 23 h 50 sur la consigne `m9/relis-m9b.md`, inscrit le 04/11 à 00 h 14 (transcript `~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-ad733bc6ca86cb5de.jsonl`, dernière ligne « fadfff5 : ok »). Aucun bloquant, aucun « à reprendre ». Ce qu'elle a vérifié : - le delta ne fait que `formula.reading` (fr, en, es) et les quatre raisons ; aucune empreinte, garde, seed ni migration ; - la nouvelle phrase vraie sur 201 484 750 cas (tous les W de 1 à 20 000, 179 692 tirés jusqu'à 10 000 000, les cinq crans, les quorums de la borne basse à W) ; l'ancienne fausse sur 17 couples (W, cran), tous à W ≤ 15 ; en et es disent la même chose ; mutations vues rouges ; - la répétition rejouée par elle, réseau coupé, sur une copie de la copie d'orch, comparée table par table à celle de `d66823b` : seules les quatre raisons diffèrent (et la mesure quotidienne de participation, contrôlée en relançant `d66823b` sur la même copie) ; - boucle : 338 tests Rust, 116 vitest, e2e 48 / 48. Mineurs, liste d'attente : hors de la toile, l'écran ne dit pas que B^W peut demander une voix de plus dans un petit groupe ; « la part de « pour » demandée » puis « la part exigée » dans la même phrase. - **`d66823b` : à reprendre** (sous-agent neuf, sans le contexte de l'intégrateur, lancé le 03/11 à 23 h 00 sur la consigne `m9/relis-m9.md` du scratchpad de l'intégrateur, inscrit à 23 h 25 ; transcript `~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a81f5c0481c04ce9b.jsonl`). Aucun bloquant. **À reprendre** : `formula.reading` (« La formule du seuil » du vote déplié) finit par « quand tout le monde vote, la majorité M suffit », faux pour W ≤ 15 quand M·W est entier (B^W ajoute une voix ; aucun groupe actuel touché : l'essai a un membre, Monnaie libre 5 745) → lot U3c, lancé à 23 h 26, avec les raisons de la file (« Proposition d'amorce » au lieu de « Proposition seed », elles iront dans le message de commit public). **Tient**, prouvé par elle : - le retrait : chaque route sondée sur les 10 unités des deux groupes répond 404, 400 ou 409 ; aucune vue ne contient une unité retirée ; une trace de membre posée à la main (quatre essais : inertie retirée sur F1.3, ordre retiré, brouillon sur N1.1, texte remplacé sur F1) refuse le retrait de son groupe, `member_proposal`, l'autre groupe appliqué ; - la migration 0012 additive ; « AUCUNE LIGNE SUPPRIMÉE » à chaque étape ; - le retour sur `de1b7eb` (binaire reconstruit par elle) : 34 articles, 8 ordres, JSON des 10 unités identique à avant M9 ; repassage sans écriture ; les deux propositions d'inertie retirées d'Yvv, JSON identique avant M9, après M9 et après le retour ; - les textes d'Yvv octet par octet : seule différence « n'y a » → « y a » ; empreintes recalculées ; - boucle : 336 tests Rust, 113 vitest, e2e 48 / 48. Mineurs, **liste d'attente** (aucun ne touche la production d'aujourd'hui) : - la garde de réécriture d'I1, E1, E2 ne lit que la Proposition d'amorce : un quorum fixé sur l'article, un texte rival d'un membre ou un vote sur une proposition d'inertie retirée la laissent passer (la garde du retrait compte le quorum fixé) ; la prémisse 2 lit ces traces avant l'acte ; - `inertia.explain`, première phrase : une tendance, pas une règle ; - `vote.others.rule` ne dit pas qu'une version retenue par une objection n'entre pas en vigueur ; - après un retour, une trace laissée sur F1 à O1 n'empêche pas le repassage de les tenir retirées (limite connue de l'ADR 0014). 4. `git diff de1b7eb fadfff5 -- docker/ .woodpecker/ .env data/` → vide ; sous `crates/ld-server/migrations/`, le seul ajout `0012_retired.sql` ; `git diff d66823b fadfff5 -- crates/ seeds/` → les quatre raisons et des tests seulement. **Vu par l'intégrateur le 04/11 à 00 h 13.** 5. Boucle verte sur `fadfff5`, le 03/11 de 23 h 52 à 23 h 58 (copie principale sur `a43a098`, même code que `fadfff5` : le tableau seul en plus ; journal `m9/loop.log`), du premier coup : fmt, clippy `-D warnings`, 338 tests Rust, svelte-check 0 / 0 (652 fichiers), 116 vitest, build, e2e 48 / 48 (46 contrôles C1 à C44, M1, M2 ; 23 h 54 à 23 h 58). Image de production construite du 03/11 à 23 h 58 au 04/11 à 00 h 12 (copie principale sur `a43a098`), sortie 0 : étage serveur rejoué (fmt, clippy, 338 tests Rust, 0 échec, build release) ; étage web rejoué (svelte-check, vitest, build) ; image de contrôle retirée à 00 h 12 (journal `m9/docker.log`). Sur `d66823b` avant elle : boucle 23 h 00 - 23 h 07, image 23 h 07 - 23 h 11, toutes deux vertes. **Recette écran sur la copie de production**, faite sur `d66823b` (U3c ne change à l'écran que la fin de `formula.reading`, épinglée par `rules.test.ts`) (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 fadfff55649140a8e240644c3a958ed256a291fd: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":"fadfff55"`. - [ ] 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 (à la mesure quotidienne de `settings` près), « AUCUNE LIGNE SUPPRIMÉE » ; `integrity_check` ok ; les cinq nouvelles lignes de file disent « Proposition d'amorce … » et « informations de fonctionnement sorties du document ». - [ ] 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 à `fadfff5` ne rejoue rien. - **Les textes** : pas de retour automatique. L'ancien texte français reste dans l'historique de chaque proposition (`revisions`) ; les traductions en et es d'I1, E1, E2 sont remplacées sur place : les anciennes ne restent que dans git (le seed de `de1b7eb`, identiques 12 sur 12, vérifié par la relecture). Un nouvel amendement gardé pourrait les remettre. E12 reste (donnée). ## Exécution Acte exécuté le 04/11/2026, 00h16-00h39, par orch (session dev-63, e66db8ca), sous mandat « déploie » (03/11 → 08/11, `~/harness/etat/mandats.json`). - **Prémisses** (00 h 16 min 33 s) : santé `{"build":"de1b7eb5","ok":true}` ; `prod/main` → `de1b7eb`, ancêtre de `fadfff5` ; diff `de1b7eb..fadfff5` sur `docker/ .woodpecker/ .env data/` : 0 fichier ; sous `crates/ld-server/migrations/`, le seul ajout `0012_retired.sql` ; « fadfff5 : ok » inscrit (00 h 14), la seule relecture de ce code lancée par l'intégrateur, close ; aucun témoin `deploying` sur sonic. - **Copie d'avant** (00 h 16 min 42 s, `/tmp/ld-m9-avant`) : sortie de `m8/counts.sh` **identique à la ligne près** à celle de la copie de 22 h 41, base de la répétition ; `m9/traces.sh` : l'attendu de la prémisse 2 (pour I1, E1, E2 et les dix unités, dans les deux groupes : 0 vote, bulletin, coquille, objection, traduction de membre et quorum fixé ; propositions de membre : seulement `inertia/withdrawn` sur I1 et E1 dans Monnaie libre ; en vigueur : les trois ordres). - **Poussée** (00 h 17) : la commande du dossier, telle quelle → `de1b7eb..fadfff5 fadfff55… -> main`. - **Pipeline 43** : créé à 00 h 17 min 07 s ; image `latest` df3787b28ee9 construite à 00 h 23 min 19 s ; santé `"build":"fadfff55"` dès 00 h 24 min 02 s ; `success` à 00 h 34 min 49 s. `sbom-publish` en échec, comme au pipeline 42 (étape non bloquante, déjà en échec avant M9). - **Journal du premier démarrage** (23:23:46Z) : six « seed amendment applied » (`2026-11-03-i1-amorce`, `-e1-amorce`, `-e2-amorce`, essai et monnaie-libre), deux « article added amendment="2026-11-03-e12-responsabilite-civique" … placement=Between(4.5) », deux « units out of the document amendment="2026-11-03-fonctionnement-hors-vote" … retired=["F1", "F1.1", "F1.2", "F1.3", "N1", "N1.1", "O1", "ordre.formule", "ordre.inertie", "ordre.ordonnancement"] », « libreDecision listening … build=fadfff55 », « publication suspended … waiting=17 » ; aucune ligne ERROR ni WARN. - **Redémarrage à froid** (00 h 36 min 24 s) : « libreDecision listening … build=fadfff55 », puis « publication suspended … waiting=17 » ; aucun amendement rejoué, aucune ligne ERROR ni WARN. Santé ensuite `{"build":"fadfff55","ok":true}`. - **Copie d'après** (00 h 36 min 42 s, `/tmp/ld-m9-apres`) : `m9/compare.py ` donne la table de la répétition, ligne pour ligne : `_sqlx_migrations` 11 → 12 (+ 12 `retired`) ; `units` 84 → 86 (+ E12 × 2, `fondamental`, position 4,5, cran 2 ; 20 unités marquées `2026-11-03-fonctionnement-hors-vote`, les 64 autres aux deux colonnes nouvelles vides) ; `proposals` 91 → 93 (+ E12 × 2, `open`, `seed`, `seed_featured` ; I1, E1, E2 × 2 : `body`, `revision`, `updated_at`) ; `revisions` 123 → 131 (+ 6 `amendment`, + 2 `initial`) ; `translations` 144 → 148 (+ 4, 12 remplacées : `body`, `source_hash`, `updated_at`) ; `seed_amendments` 26 → 32 ; `article_amendments` et `retirement_amendments` nouvelles, 2 décisions `applied` chacune ; `outbox` 25 → 30 (`pending=17 done=13`), les 12 en attente reportées (`next_at`) ; les 21 autres tables identiques. **« AUCUNE LIGNE SUPPRIMÉE »** ; `integrity_check` ok ; `foreign_key_check` vide. Les cinq nouvelles lignes de file : « Proposition d'amorce réécrite : I1, … », « … : E1, … », « … : E2, … », « Proposition d'amorce ajoutée : E12, … », « informations de fonctionnement sorties du document … ». - **Écart à la répétition, `settings`** : 2 lignes changées, l'heure seule — `wot_size` (5709 → 5709) et `wot_source` (`chain:https://rpc.duniter.org`, inchangé), relus au démarrage, le réseau répondant (la répétition, réseau coupé, gardait la dernière valeur : son seul WARN). Les 5 mesures de participation ne sont pas refaites : la production les a refaites le 03/11 à 22:12:52Z, moins de 24 h avant (la répétition, sur la copie de 22 h 41, les avait refaites). Rien d'autre. - **Vu de l'extérieur** (00 h 37 min 59 s, Chromium, locale `fr-FR`, sans session) : `https://decision.librodrome.org/` 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. » ; aucune requête hors de `decision.librodrome.org`. - **Dépôt des textes** : `main` → `9e0f45a9e8d4af356a0c42daa5f4fb9eb9e6dfb3`, inchangé. - **Retour** : `previous` = 78ca8a1d10e4 (construite le 03/11 à 20 h 31 min 25 s, `de1b7eb`) ; le conteneur tourne sur `latest` df3787b28ee9. - **Copies retirées** à 00 h 38 min 25 s : `/tmp/ld-m9-copie` (22 h 41, base des répétitions), `/tmp/ld-m9-avant`, `/tmp/ld-m9-apres`. Les copies de l'intégrateur (`m9/base`, `m9/rep`, `m9/recette`, `m9/snap-d66823b`) sont à retirer par lui, sur ce message. - **Branche locale** : `main` avancée `de1b7eb..fadfff5` à 00 h 38. - Écart au déroulé : aucun, hors l'écart de `settings` ci-dessus, qui n'est pas de M9. - Copies de l'intégrateur retirées le 04/11 à 00 h 41 (scratchpad de libredecision-d4) : `m9/base` (la copie de la copie d'orch de 22 h 41, donnée aux relecteurs), `m9/rep` (la base de la répétition de `fadfff5`, avec son dépôt nu local et ses états), `m9/recette` (la base et les captures de la recette sur l'état d'après M9) et `m9/snap-d66823b` (les états de la répétition de `d66823b`). Plus aucune base dans ce scratchpad.