Files
decision/actes/2026-11-03-m9-amorce-hors-vote.md
T

24 KiB
Raw Blame History

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 : 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 <db> 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 <db> (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

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 <copie d'avant> <copie d'après> 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

(à remplir par orch)