362 lines
29 KiB
Markdown
362 lines
29 KiB
Markdown
# 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 <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
|
||
|
||
```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 <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
|
||
|
||
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 <avant> <après>` 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.
|