11 KiB
Acte — Mise en ligne M6c (trois phrases de F1.1, F1.2 et N1.1 écrites justes, lot T2)
Classe : déploie
Projet : libreDecision Date : 2026-11-03
État : FIGÉ sur 84f015a (84f015ad58a2e87803dd1100d55f271f014339de) le 03/11 à 10 h 48 — 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 : « 84f015a : ok » (prémisse 3).
Intention
Mettre en ligne le lot T2 : les trois phrases que la relecture de M6b (« bb4bdf5 : ok », 03/11) a laissées
inexactes dans les textes du seed réécrits par le lot T, en ligne depuis le 03/11 à 08 h 02 ; et, dans
l'interface, la même imprécision (« presque l'unanimité ») et un espace perdu (« 0 contredont 1 simulé »).
Décision d'orch (dev-63, 03/11 à 08 h 07, puis 09 h 45) : T2 après U, un sous-agent à la fois.
- F1.1 : « presque l'unanimité quand peu de gens votent » → « cette part est la plus haute au quorum et baisse quand la participation monte, jusqu'à la majorité M quand tout le monde vote ».
- F1.2 : « tant que personne n'a voté sur l'article ; ensuite, il ne change plus » → « tant que
l'article ne garde la trace d'aucun vote ». (Le défaut proposé, « compté », se trompait dans l'autre
sens : un vote retiré sur la chaîne n'est plus compté, mais garde la trace et fige le quorum. Le choix
reste à Yvv :
textes-quorum-seed.md, point 8.) - N1.1 : « le groupe demande un quorum de votants, puis une part de « pour » » → « une part de « pour » parmi les votants […]. Chaque cran a aussi son quorum, qui n'est pas un nombre minimal de votants ».
- Interface :
inertia.explain,formula.reading,quorum.error.voted(fr, en, es) ; espaces perdus en tête d'un bloc Svelte (VoteFold,VersionDetails, menu).
Ce qui part
Version 84f015a, qui contient la version en ligne b2e597b. Code touché : crates/ld-server/src/seed_amend.rs
(l'amendement), seeds/acte-engagement-certification.json (bases neuves), web/ (chaînes fr, en, es ;
VoteFold.svelte, VersionDetails.svelte, +layout.svelte), des tests ; le reste est documentation.
crates/ld-engine : des tests seulement. Configuration (docker/, .woodpecker/, .env, data/) et
migrations : rien (prémisse 4).
Ce que l'acte écrit dans la base de production (donnée runtime)
- Aucune migration.
- Amendement de seed gardé
2026-11-03-f1-1-phrases,-f1-2-phrases,-n1-1-phrases, qui suit (follows) ceux de M6b, décidé une fois par document, dans une transaction, seulement si personne n'a touché l'article : 0 vote (simulé compris), 0 ligne de bulletin, aucune coquille, traduction de membre ni objection, texte d'avant identique à l'empreinte posée par M6b ; F1.1 admis à la révision 2, F1.2 et N1.1 à la révision 3, seulement si c'est l'amendement de M6b, et lui seul, qui l'a écrite.proposals: texte fr, révision + 1 (F1.1 → 3 ; F1.2 et N1.1 → 4) ;revisions: une ligneamendment;translations: en et es remplacés ;seed_amendments: la décision ;outbox: une ligne par article dans Monnaie libre, qui attend (publication suspendue) ; rien pour l'essai. Refus possibles, le texte d'avant reste :not_a_seed,no_open_version(une version entrée en vigueur, par exemple d'une voix dans l'essai),voted_into_force,confirmed,votes,ballots,corrected,translation_edited,signalled,revised,text_differs,changed(seed_amend.rs:283,:589).
- Les amendements de M6b sont marqués dépassés : ils ne décident plus rien.
- Aucun vote, aucune autre proposition, aucun autre article n'est touché ; la publication reste suspendue.
Répétition
Faite le 03/11 de 10 h 23 à 10 h 24, avec le serveur de 84f015a (binaire de la boucle, copié en
m6c/ld-server-84f015a), sur une copie de la copie de production prise par orch à 10 h 23 min 10 (santé
b2e597b6), publication vers un dépôt nu local (m6c/repetition.sh ; journal m6c/repetition-m6c.log,
scratchpad de l'intégrateur). Deux démarrages.
| Avant | Après | |
|---|---|---|
| F1.1 (deux groupes) | ouverte, seed, révision 2, 0 vote, 0 bulletin | révision 3 |
| F1.2, N1.1 (deux groupes) | ouvertes, seed, révision 3, 0 vote, 0 bulletin | révision 4 |
| Révisions | 113 | 119 |
| Traductions | 144 | 144 (en, es des trois articles remplacés) |
seed_amendments |
16 | 22 |
| File de publication (Monnaie libre) | 7 en attente, 13 faites | 10 en attente, 13 faites |
| Commits vers le dépôt des textes (local) | — | 0 (« publication suspended ») |
Tout le reste (m6c/counts.sh : migrations 1–11, propositions, unités en vigueur, I1/E1/E2, inertia_changes, votes, bulletins, signalements, identités) |
identique |
La base entière comparée (.dump) : changent exactement les 6 propositions de F1.1, F1.2, N1.1
(identifiants de la prémisse 2), leurs 12 traductions en et es, 6 révisions et 6 décisions ajoutées, 3
lignes de file ajoutées et les 7 lignes en attente reportées (next_at), les deux compteurs
(sqlite_sequence : révisions 119, file 23). Rien d'autre. integrity_check ok, foreign_key_check
vide. Journal : six « seed amendment applied » (2026-11-03-f1-1-phrases, -f1-2-phrases,
-n1-1-phrases × essai, Monnaie libre), « publication suspended », aucune ligne ERROR ni WARN. Un second
démarrage ne rejoue rien (comptes identiques, aucun « applied »).
Effet attendu
- Dans les deux groupes, F1.1, F1.2 et N1.1 montrent les phrases corrigées, en fr, en et es ; la note d'inertie et la lecture de la formule de l'interface disent la même chose ; « 0 contre dont 1 simulé ».
- Rien d'autre ne change ; le dépôt des textes reste à
9e0f45a.
Irréversibilité : partielle. Le code se remet en arrière ; les nouveaux textes restent (l'ancien est dans l'historique de chaque proposition).
Avant — prémisses vivantes
- La production sert
b2e597b: santé"build":"b2e597b6";prod/main→b2e597b. - Sur une copie fraîche,
m6c/premisse.sh <db>(scratchpad de l'intégrateur, lecture seule) : 6 lignes, toutesopen, origineseed, révision 2 pour F1.1 et 3 pour F1.2 et N1.1, votes, bulletins, coquilles et objections à 0 ; migration 11. Un article touché est refusé par l'amendement avec sa raison, et l'acte reste valable pour les autres. Lu par orch sur la copie de 10 h 23 min 10 (santéb2e597b6), puis par l'intégrateur sur sa copie de cette copie : l'attendu exact ; 0 vote et 0 ligne de bulletin en tout. À relire sur la copie fraîche juste avant la poussée. - La relecture indépendante de
84f015a, inscrite « ok » dans~/harness/etat/relectures.json. Faite : sous-agent neuf, sans le contexte de l'intégrateur, surb2e597b..84f015a, lancée à 10 h 26, rendue à 10 h 46, inscrite à 10 h 47 (transcript~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a59503237fefa982a.jsonl, dernière ligne «84f015a: ok »). Aucun bloquant, aucun « à reprendre ». Ce qu'elle a exécuté, sur des copies de la copie de 10 h 23 (supprimées depuis), réseau coupé :- les écritures, base entière comparée : exactement celles annoncées (colonnes
body,revision,updated_atdes 6 propositions ;body,source_hash,updated_atdes 12 traductions) ; - second démarrage, retour vers
b2e597b(qu'elle a construit) et réavance : rien de rejoué, les nouveaux textes servis parb2e597b; - la garde avec de vrais votes par l'API de
b2e597bet des états forgés : refusvotes,ballots,corrected,translation_edited,signalled,no_open_version,voted_into_force,revised,text_differs; appliqué après un vote direct retiré dans l'essai et après « supprime » (limites écrites) ; - F1.2, « tant que l'article ne garde la trace d'aucun vote », vrai face à
PUT /units/{id}/quorumdans tous les cas (409 sur un vote simulé tenu ou retiré ; 200 après « supprime » et après un vote direct retiré dans l'essai) ; - les chiffres recalculés (64,4 · 73,5 · 77,4 · 85,3 · 91,9 % ; 8/12, 9/12, 39/50, 43/50, 46/50 ; l'exemple de N1.1) ; en et es fidèles au français ;
- 220 tests Rust ciblés, svelte-check 0 / 0, vitest 69 / 69, build, C34 et C37. Mineurs, liste d'attente (pour Yvv le premier, U2 ou un prochain tour de textes les autres) :
- N1.1, « qui n'est pas un nombre minimal de votants » : vrai pour les quorums par cran ; faux pour un quorum d'auteur bas (Q = 2 ou 3 à tout cran, 6 au cran 3…), où le moteur demande Q « pour » ;
settings.reading(fr, en, es) sans « au-delà du quorum » ;- vocabulaire anglais mêlé (“yes”/“no”, « against », favor/favour) ;
- deux raisons de refus absentes de ce dossier (
no_open_version,changed) : ajoutées ; spaces.test.ts: un faux positif théorique dans<pre>, deux angles morts (absents du code) ;- commentaire
crates/ld-engine/src/threshold.rs:9-11(« near-unanimity ») ; - N1 garde « quand peu de gens votent », que l'interface ne dit plus. Non vérifié par elle : la production (prémisses 1 et 6), le binaire bit pour bit, l'image, la boucle complète, un vote prouvé par la chaîne puis retiré.
- les écritures, base entière comparée : exactement celles annoncées (colonnes
git diff b2e597b 84f015a -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/→ vide (vu par l'intégrateur à 10 h 22 et par orch à 10 h 23).- Boucle verte sur
84f015a, le 03/11 de 10 h 22 à 10 h 26 (journalm6c/loop.log), du premier coup : fmt, clippy-D warnings, 301 tests Rust, svelte-check 0 / 0, 69 vitest, build, e2e 40 / 40 (10 h 23 à 10 h 26). Image de production construite le 03/11 de 10 h 26 à 10 h 29, sortie 0 : étage serveur rejoué (fmt, clippy, 301 tests Rust « ok », 0 échec), étage web rejoué (svelte-check 0 / 0, 69 vitest, build) ; image de contrôle retirée à 10 h 29 (journalm6c/docker-m6c.log). - Sur sonic, aucun témoin
/opt/libredecision-app/deploying.
Commande exacte
cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod 84f015ad58a2e87803dd1100d55f271f014339de:main
Vérifications après
- Santé vue de l'extérieur →
"build":"84f015ad". - Journaux : six « seed amendment applied » (
2026-11-03-f1-1-phrases,-f1-2-phrases,-n1-1-phrases× essai, Monnaie libre), « publication suspended », aucune ligne ERROR ni WARN. - Redémarrage à froid : aucun amendement rejoué.
- Sur une copie fraîche : F1.1 en révision 3, F1.2 et N1.1 en révision 4, dans les deux groupes ; le
reste identique à la ligne près à la copie d'avant (comptes de
counts.sh) ;integrity_checkok. - Le dépôt des textes reste à
9e0f45a.
Retour
- Le code :
docker tag libredecision-app:previous libredecision-app:latest, puiscd /opt/libredecision-app && docker compose up -d --force-recreate.previousserab2e597b, qui attend aussi le premier texte pour publier : pas de coupure de la publication à faire. - Les textes : pas de retour automatique ; l'ancien texte reste dans l'historique de chaque proposition, un nouvel amendement gardé pourrait le remettre.
Exécution
(à remplir par orch)