Acte M8 sur de1b7eb (lots T3, T3b, T3c) : en tête pour Yvv chaque phrase finale avant / après ; répétition réseau coupé (20 h 03) ; prémisses ; relecture et image en cours ; non figé

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 20:04:57 +01:00
co-authored by Claude Opus 5.5
parent de1b7eb5d7
commit 591ed37837
+131 -103
View File
@@ -1,70 +1,118 @@
# Acte — Mise en ligne M8 (aucun chiffre daté dans les textes votés, lots T3 et T3b)
# Acte — Mise en ligne M8 (aucun chiffre daté dans les textes votés, lots T3, T3b et T3c)
Classe : déploie
Projet : libreDecision Date : 2026-11-03
**État : PRÉPARÉ, non figé** (relecture de `e7ab82f` à reprendre ; lot T3c en cours) — sur `e7ab82f`
(`e7ab82f48f41f52b3f31e322553f7cf18bc21601`) ; préparé par l'intégrateur libredecision-d4 ; exécuté par
**État : PRÉPARÉ, non figé** (en attente de la relecture indépendante de `de1b7eb`) — sur `de1b7eb`
(`de1b7eb5d7e982aee7c70a41c9f5799fb171493e`) ; 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).
## Pour Yvv : ce que tu liras de changé
Quatre phrases, avant / après (le français fait foi), et un exemple retiré. Toutes dans les textes votés
de départ, dans les deux groupes ; F1.1 n'est pas touché.
Deux textes votés de départ changent, dans les deux groupes : N1.1 « Niveaux d'inertie » et F1.2
« Paramètres par défaut ». F1.1 « Formule du seuil WoT » n'est pas touché. Chaque phrase finale, avant (le
texte en ligne aujourd'hui) et après, en français, qui fait foi.
1. **N1.1, la phrase du quorum** (premier paragraphe) :
**N1.1 « Niveaux d'inertie »**
1. Le quorum :
- avant : « Chaque cran a aussi son quorum, qui n'est pas un nombre minimal de votants : sous le quorum,
les votants qui manquent comptent comme « non ». »
- après : « Chaque cran a aussi son quorum : sous le quorum, les votants qui manquent comptent comme
« non », et il faut autant de « pour » que si le quorum avait voté. »
2. **N1.1, l'introduction des cinq crans** :
- après : « Chaque cran a aussi son quorum : sous le quorum de l'article, les votants qui manquent
comptent comme « non », et il faut autant de « pour » que si ce quorum avait voté. »
2. La part :
- avant : « La part dépend du cran et du nombre de votants, comparé à la participation habituelle du
groupe : au-delà du quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand tout
le monde vote. »
- après : « La part exigée dépend du cran et du nombre de votants, comparé à la participation habituelle
du groupe : au-delà de ce quorum, plus il y a de votants, plus elle baisse, jusqu'à la majorité M quand
tout le monde vote. »
3. La formule :
- avant : « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum
s'il en manque. »
- après : « `Part exigée = M + (1 − M) × (1 − (T'/W)^G)`, où T' est le nombre de votants, ou le quorum de
l'article s'il en manque. »
4. L'introduction des cinq crans :
- avant : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée quand le groupe vote comme
d'habitude, puis quand tout le monde vote, et ce qui est à ce cran au départ. »
- après : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum, quand le
groupe vote comme d'habitude, puis quand tout le monde vote, et ce qui est à ce cran au départ. »
3. **N1.1, la phrase de G** (dernier paragraphe) :
- avant : « **G** se calcule pour que la part exigée, à la participation habituelle, soit exactement celle
du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃ la
participation habituelle divisée par W. »
- après : « **G** se calcule pour que la part exigée, au-delà du quorum, soit exactement celle du cran
quand le groupe vote comme d'habitude : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette part du
cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
4. **F1.2, « Par défaut »** :
- avant : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et le
groupe demande 75 % de « pour » quand il vote comme d'habitude. Tout nouvel article commence à ce
cran. »
- après : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et,
au-delà du quorum, le groupe demande 75 % de « pour » quand il vote comme d'habitude. Tout nouvel
article commence à ce cran. »
5. **N1.1, l'exemple retiré** (le paragraphe qui suivait la phrase de G ; rien ne le remplace) : « Exemple :
avec 7 224 membres et une participation habituelle de 120 votants, quand 120 personnes votent, il faut 72,
81, 90, 100 ou 108 voix pour, du cran 1 au cran 5 ; au cran 3, 75 % des 120 votants, soit 90. Sous le
quorum, les absents comptent comme « non » : au cran 2 (quorum 12), 9 voix pour passent avec 3 « contre »
au plus ; au cran 3 (quorum 50), il faut 39 voix pour, avec 11 « contre » au plus. »
- après : « **Les cinq crans** : le quorum dans Monnaie libre, la part exigée au-delà du quorum de
l'article, à la participation habituelle, puis quand tout le monde vote, et ce qui est à ce cran au
départ. »
5. Les cinq lignes des crans, la même retouche dans chacune :
- avant : « … quorum 12 ; 60 % comme d'habitude, 50 % quand tout le monde vote. … » (de même 67, 75,
83 et 90 %) ;
- après : « … quorum 12 ; 60 % à la participation habituelle, 50 % quand tout le monde vote. … ». Le
reste de chaque ligne ne change pas.
6. La référence :
- avant : « Tant que le groupe n'a pas voté sur 5 propositions, elle vaut deux fois le quorum de
référence du document : 100 votants dans Monnaie libre. »
- après : « Tant qu'elle repose sur moins de 5 propositions, elle vaut deux fois le quorum de référence
du document : 100 votants dans Monnaie libre. »
7. Les bornes :
- avant : « Elle reste entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
- après : « Elle est ramenée entre 1 % et 50 % de l'électorat, et se mesure une fois par jour. »
8. G :
- avant : « **G** se calcule pour que la part exigée, à la participation habituelle, soit exactement
celle du cran : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est la part exigée comme d'habitude et p̃
la participation habituelle divisée par W. »
- après : « **G** se calcule pour que la part exigée, au-delà du quorum de l'article, soit exactement
celle du cran à la participation habituelle : `G = ln(1 − (s − M)/(1 − M)) / ln(p̃)`, où s est cette
part du cran (60, 67, 75, 83 ou 90 %) et p̃ la participation habituelle divisée par W. »
9. L'exemple, retiré (rien ne le remplace) : « Exemple : avec 7 224 membres et une participation
habituelle de 120 votants, quand 120 personnes votent, il faut 72, 81, 90, 100 ou 108 voix pour, du
cran 1 au cran 5 ; au cran 3, 75 % des 120 votants, soit 90. Sous le quorum, les absents comptent comme
« non » : au cran 2 (quorum 12), 9 voix pour passent avec 3 « contre » au plus ; au cran 3 (quorum 50),
il faut 39 voix pour, avec 11 « contre » au plus. »
**F1.2 « Paramètres par défaut »**
10. Le cran par défaut :
- avant : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et le
groupe demande 75 % de « pour » quand il vote comme d'habitude. Tout nouvel article commence à ce
cran. »
- après : « Le cran par défaut est le 3 (moyenne) : M = 55 %, un quorum de 50 dans Monnaie libre, et,
au-delà du quorum, le groupe demande 75 % de « pour » à sa participation habituelle. Tout nouvel
article commence à ce cran. »
**Pourquoi.**
- L'exemple (5) : ta décision du 03/11, aucun chiffre daté dans un texte voté. 7 224 membres et 120 votants
sont un état de la toile et une participation d'une date ; ce qui en était calculé sort avec eux.
- La phrase du quorum (1) : « pas un nombre minimal de votants » est faux pour un quorum bas fixé par
l'auteur. Au quorum 2 (le plus bas dans Monnaie libre), il faut 2 « pour », à tout cran et sur toute
toile : le quorum y est bien un minimum. La phrase nouvelle est vraie pour tout quorum : sous le quorum,
le moteur demande exactement le seuil du quorum. « autant de « pour » » plutôt que « autant de voix pour »,
qui se lisait d'abord « pour que ».
- Les phrases 2, 3 et 4 disaient la part du cran « comme d'habitude » sans condition. C'est faux quand la
participation habituelle reste sous le quorum : le groupe est alors jugé sur le quorum. Exemple : une
toile de 3 000 membres dont la participation habituelle est de 40 votants (dans les bornes : 1 % de
3 000, c'est 30), au cran 3, quorum 50 : la courbe donne 75 % à 40 votants, mais la part exigée se calcule
sur 50 (74,2 %), et il faut 38 « pour » de ces 40 votants, soit 95 %, pas 75 %. Cela arrive dès que la
toile passe sous 5 000 membres avec une participation habituelle sous 50, ou quand l'auteur d'un article
fixe un quorum au-dessus de la participation habituelle. Les phrases 2 et 4 ont été trouvées par le lot
T3 ; la phrase 3 par la relecture indépendante de T3 (« 2ce2028 : à reprendre »), reprise par le lot T3b.
Accord d'orch sur les trois (03/11, à 17 h 46, puis en réponse à mon message de 18 h 13).
- **L'exemple (9)** : ta décision du 03/11, aucun chiffre daté dans un texte voté. 7 224 membres et
120 votants sont un état de la toile et une participation d'une date ; ce qui en était calculé sort avec
eux.
- **Le quorum (1)** : « pas un nombre minimal de votants » est faux pour un quorum bas fixé par l'auteur.
Au quorum 2 (le plus bas dans Monnaie libre), il faut 2 « pour », à tout cran et sur toute toile : le
quorum y est bien un minimum. La phrase nouvelle est vraie pour tout quorum : sous le quorum de
l'article, le moteur demande exactement le seuil de ce quorum. « Autant de « pour » » plutôt que
« autant de voix pour », qui se lisait d'abord « pour que » ; « de l'article », parce qu'un article peut
avoir le quorum que son auteur a fixé, pas celui du cran.
- **« À la participation habituelle » (4, 5, 8, 10)** : les textes disaient la part du cran « comme
d'habitude », ce qui se lit comme le nombre de votants que le groupe a vraiment d'habitude. Le moteur,
lui, prend la participation habituelle telle que N1.1 la définit : la médiane, **ramenée entre 1 % et
50 % de l'électorat**. Dès que la médiane sort de ces bornes, ou reste sous le quorum de l'article, la
part n'est plus celle du cran. Deux exemples, calculés par le moteur :
- 7 224 membres, médiane de 40 votants (sous 1 %, ramenée à 72,24), cran 2, quorum 12 : à 40 votants,
il faut 28 « pour » (68,7 %), pas 27 (67 %) ;
- 3 000 membres, médiane de 40 (dans les bornes), cran 3, quorum 50 : la part se calcule sur le quorum,
il faut 38 « pour » de ces 40 votants (95 %), pas 75 %.
Le terme défini, « à la participation habituelle », et « au-delà du quorum de l'article » rendent ces
phrases vraies dans tous les cas.
- **La part exigée, le quorum de l'article (2, 3)** : le terme défini, au lieu de « la part » et « le
quorum » nus. La part exigée baisse au-delà du quorum ; le nombre de « pour », arrondi à l'entier, peut
remonter d'une voix (9 sur 12, puis 10 sur 13).
- **La référence (6)** : la médiane ne compte que l'année écoulée. Avec moins de 5 propositions dans
l'année, la référence de 100 votants revient, même si le groupe en a voté plus avant ; « tant que le
groupe n'a pas voté sur 5 propositions » était faux.
- **Les bornes (7)** : « est ramenée » dit ce que fait le moteur (une médiane hors des bornes est remplacée
par la borne) ; « reste » se lisait comme un constat.
Les preuves, phrase par phrase, et les textes entiers en fr, en, es :
`docs/chantiers/acte-certification/textes-quorum-seed.md`, section « Lot T3 » (avec « Après la relecture
de 2ce2028 »).
Trois tours de relecture indépendante y ont mené : T3 (le retrait et les phrases 1, 4, 10), puis T3b (G, et
« autant de « pour » ») après « 2ce2028 : à reprendre », puis T3c (le terme défini partout, 2, 3, 5, 6, 7)
après « e7ab82f : à reprendre ». Orch a donné son accord sur chaque tour : à 17 h 46, après 18 h 13 et
après 19 h 18, avec ces mots : « c'est une correction de vérité, qui reste dans ce qu'il a validé ». Le
détail et les textes entiers en fr, en, es : `docs/chantiers/acte-certification/textes-quorum-seed.md`
(section « Lot T3 »). Chaque phrase de F1.2 et de N1.1, avec le test qui la vérifie :
`docs/chantiers/acte-certification/t3c-liste-fermee.md`.
## Intention
Mettre en ligne les lots T3 et T3b. Yvv, le 03/11 avant 16 h 56, mot pour mot : « Je valide
Mettre en ligne les lots T3, T3b et T3c. Yvv, le 03/11 avant 16 h 56, mot pour mot : « Je valide
textes-quorum-seed (dont le point 3, pas de chiffre datés dans un texte voté). Tu peux lancer la livraison
de decision. » (registre `~/harness/etat/reponses-yvv.md`, commit `9b701da`). Ordre T3 d'orch (dev-63, 03/11
vers 16 h 57) : retirer des textes votés F1.1, F1.2, N1.1 (fr, en, es ; deux groupes) tout chiffre qui
@@ -72,39 +120,19 @@ dépend de l'état de la toile ou d'une participation à une date ; le texte res
de N1.1 « pas un nombre minimal de votants », fausse pour un quorum d'auteur bas, écrite vraie. Points 1, 2,
4 et 8 de `textes-quorum-seed.md` : le défaut reste.
**en et es** (fidèles au français) :
- 1 : « Each level also has its quorum: below the quorum, the voters who are missing count as votes against,
and it takes as many votes in favour as if the quorum had voted. » ; « Cada nivel tiene además su quórum:
por debajo del quórum, los votantes que faltan cuentan como «no», y hacen falta tantos votos a favor como
si hubiera votado el quórum. »
- 2 : « the share asked beyond the quorum, when the group votes as usual » ; « la proporción exigida más allá
del quórum, cuando el grupo vota como de costumbre ».
- 3 : « **G** is computed so that the share asked, beyond the quorum, is exactly that of the level when the
group votes as usual: `G = …`, where s is that share of the level (60, 67, 75, 83 or 90%) and p̃ the usual
turnout divided by W. » ; « **G** se calcula para que la proporción exigida, más allá del quórum, sea
exactamente la del nivel cuando el grupo vota como de costumbre: `G = …`, donde s es esa proporción del
nivel (60, 67, 75, 83 o 90 %) y p̃ la participación habitual dividida por W. »
- 4 : « and, beyond the quorum, the group asks for 75% of votes in favour when it votes as usual » ; « y, más
allá del quórum, el grupo pide un 75 % de votos a favor cuando vota como de costumbre ».
**Les preuves** (tests de `crates/ld-server/tests/seed_quorum_texts.rs`) :
- aucun chiffre daté : `every_number_of_the_quorum_texts_is_the_engine_s` n'admet que des paramètres (vu
rouge sur les textes de T2) ; « 100 votants » y est dit pour ce qu'il est, deux fois le quorum de
référence, et `the_reference_turnout_is_a_parameter_the_bounds_bring_back` montre que les bornes le
ramènent hors de 200 à 10 000 membres ;
- 1 : `under_the_quorum_it_takes_as_many_for_as_if_the_quorum_had_voted`, plus de 500 000 cas (W de 100 à
10 000 000, chaque quorum de la borne basse à W, les cinq crans, quatre participations, le groupe d'essai) ;
- 2 et 4 : `the_share_of_a_level_as_usual_is_asked_beyond_the_quorum` ;
- 3 : `g_gives_the_share_of_the_level_beyond_the_quorum_when_the_group_votes_as_usual` (même grille ; G tel
qu'écrit égale celui du moteur ; s au-delà du quorum, plus bas en dessous ; le cas 3 000 / 40 en dur) ;
- F1.1 laissé : `b_to_the_power_w_never_counts_in_the_web_of_trust` (« B^W ne compte pas », de 100 à
10 000 000 membres).
**Les preuves** (`crates/ld-server/tests/seed_quorum_texts.rs`, `crates/ld-server/tests/quorum.rs`) : la
liste fermée (`t3c-liste-fermee.md`) nomme, pour chaque phrase qui affirme un nombre, une part ou un sens de
variation, le test qui la vérifie contre le moteur sur une grille commune de 85 100 cas. Cette grille
couvre W de 100 à 10 000 000, des médianes sous 1 % et au-dessus de 50 % de W ramenées par le moteur,
chaque quorum d'auteur de 2 à W jusqu'à W = 1 000, et les cinq crans. Huit tests sont vus rouges sur le
texte de `e7ab82f`, et quatre mutations du code sont vues rouges. Aucun chiffre daté : le test des nombres
n'admet que des paramètres.
## Ce qui part
Version `e7ab82f` (lots T3 et T3b), qui contient la version en ligne `6f6197c`. Code touché : `crates/ld-server/src/seed_amend.rs`
Version `de1b7eb` (lots T3, T3b et T3c), qui contient la version en ligne `6f6197c`. Code touché : `crates/ld-server/src/seed_amend.rs`
(les deux amendements), `crates/ld-server/src/wot.rs` (une constante rendue publique pour les tests, valeur
inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des tests et une fixture
inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des tests (`tests/seed_quorum_texts.rs`, `tests/quorum.rs`) et une fixture
(`tests/fixtures/seed-quorum-t2.json`, les textes de T2) ; le reste est documentation. `web/` et
`crates/ld-engine` : rien. Configuration (`docker/`, `.woodpecker/`, `.env`, `data/`) et migrations : rien
(prémisse 4).
@@ -116,7 +144,7 @@ inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des test
(`follows`) ceux de T2 (`2026-11-03-f1-2-phrases`, `-n1-1-phrases`), 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 T2
(F1.2 `96caf353…`, N1.1 `7fbedcb8…`) ; textes d'après : F1.2 `ddce5aa5…`, N1.1 `7f62fd42…` ; F1.2 et N1.1 admis à la révision 4 seulement si ce sont les
(F1.2 `96caf353…`, N1.1 `7fbedcb8…`) ; textes d'après : F1.2 `0c3b800b…`, N1.1 `8107c5fc…` ; F1.2 et N1.1 admis à la révision 4 seulement si ce sont les
amendements suivis (M5, M6b, M6c), et eux seuls, qui l'ont écrite.
- `proposals` : texte fr, révision + 1 (F1.2 et N1.1 → 5) ;
- `revisions` : une ligne `amendment` ;
@@ -133,12 +161,13 @@ inchangée), `seeds/acte-engagement-certification.json` (bases neuves), des test
## Répétition
**Faite le 03/11 de 18 h 54 min 44 à 18 h 55 min 28, réseau coupé** (`unshare -rn`, boucle locale seule :
`m8/repetition-isolee.sh`), avec le serveur de `e7ab82f` (binaire de la boucle, construit à 18 h 54, copié en
`m8/ld-server-e7ab82f`), sur une copie (18 h 47 min 52) de la copie de production prise par orch de
17 h 46 min 22 à 17 h 46 min 30 (production sur `6f6197cc`), publication vers un dépôt nu local (journal
`m8/repetition-m8b.log`, scratchpad de l'intégrateur). Deux démarrages. Orch comparera les comptes de la
production à ceux de cette copie avant de pousser.
**Faite le 03/11 de 20 h 03 min 37 à 20 h 04 min 20, réseau coupé** (`unshare -rn`, boucle locale seule :
`m8/repetition-isolee.sh`), avec le serveur de `de1b7eb` (binaire de la boucle, construit à 20 h 03, copié en
`m8/ld-server-de1b7eb` ; il porte l'empreinte `8107c5fc…`), sur une copie (18 h 47 min 52, empreintes
inchangées depuis) de la copie de production prise par orch de 17 h 46 min 22 à 17 h 46 min 30 (production
sur `6f6197cc`), publication vers un dépôt nu local (journal `m8/repetition-m8c.log`, scratchpad de
l'intégrateur). Deux démarrages. Orch comparera les comptes de la production à ceux de cette copie avant de
pousser.
| | Avant | Après |
|---|---|---|
@@ -157,15 +186,15 @@ F1.2 et N1.1 (`body`, `revision`, `updated_at` : `ff53cbdc`, `13ee215f` dans Mon
4 décisions ajoutées, 2 lignes de file ajoutées et les 10 lignes en attente reportées (`next_at`), les deux
compteurs (`sqlite_sequence` : révisions 123, file 25). Rien d'autre (`settings` inchangé : W n'a pas pu être
relu, réseau coupé). `integrity_check` ok, `foreign_key_check` vide. Les textes écrits sont ceux du seed de
`e7ab82f`, en fr, en et es, dans les deux groupes (comparés). Journal : quatre « seed amendment applied »
`de1b7eb`, en fr, en et es, dans les deux groupes (comparés). Journal : quatre « seed amendment applied »
(`2026-11-03-f1-2-chiffres`, `-n1-1-chiffres` × essai, Monnaie libre), « publication suspended …
waiting=12 », aucune ligne ERROR ; un seul WARN, attendu réseau coupé : « web of trust size: no node nor
indexer answered, keeping the last value ». **Un second démarrage ne rejoue rien** (comptes identiques,
aucun « applied »).
Une première répétition, sur `2ce2028` (lot T3 seul), le 03/11 à 17 h 54, avait donné les mêmes comptes ; le
réseau n'y était pas coupé (W relu sur `rpc.duniter.org`, `settings.wot_size` 5 709 → 5 711), ce que la
relecture a relevé. Ses copies sont retirées (18 h 47).
Deux répétitions précédentes, sur `2ce2028` (17 h 54, réseau non coupé : W relu sur `rpc.duniter.org`,
`settings.wot_size` 5 709 → 5 711) et sur `e7ab82f` (18 h 54, réseau coupé), avaient donné les mêmes comptes ;
seuls les textes écrits diffèrent.
## Effet attendu
@@ -186,7 +215,7 @@ dans l'historique de chaque proposition).
la copie d'orch de 17 h 46 : l'attendu exact ; 0 vote et 0 ligne de bulletin en tout ; une identité. À
relire sur la copie fraîche juste avant la poussée, et comparer `counts.sh` à la colonne « Avant » de la
répétition.
3. La relecture indépendante de `e7ab82f`, inscrite « ok » dans `~/harness/etat/relectures.json`.
3. La relecture indépendante de `de1b7eb`, inscrite « ok » dans `~/harness/etat/relectures.json`.
- Première relecture, **`2ce2028` : à reprendre** (sous-agent neuf, sans le contexte de l'intégrateur,
lancé à 17 h 55, inscrit à 18 h 12 ; transcript
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a3341da520d4c5530.jsonl`) :
@@ -198,28 +227,27 @@ dans l'historique de chaque proposition).
`~/.claude/projects/-home-yvv-Documents-PROD-DEV-libreDecision/d0a7108b-7f2f-484a-bcb0-de339238199d/subagents/agent-a92ddff6f85c88f90.jsonl`) :
« quand le groupe vote comme d'habitude » se lit comme la médiane réelle, alors que le moteur cale G sur
la participation habituelle bornée (W 7 224, médiane 40, cran 2 : 28 « pour » sur 40, pas 27) ; la
grille des tests sautait ces cas. Repris par le lot T3c (lancé à 19 h 18) ; ce dossier sera refait sur
son sha.
4. `git diff 6f6197c e7ab82f -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/ web/ crates/ld-engine/`
→ vide (vu par l'intégrateur le 03/11 à 18 h 48).
5. Boucle verte sur `e7ab82f`, le 03/11 de 18 h 47 à 18 h 54 (journal `m8/loop-b.log`), du premier coup :
fmt, clippy `-D warnings`, 314 tests Rust, svelte-check 0 / 0 (648 fichiers), 78 vitest, build, e2e
42 / 42 (18 h 50 à 18 h 54). Image de production construite le 03/11 de 18 h 56 à 19 h 01 (copie
principale sur `d17a5f6`, même code que `e7ab82f` : le dossier seul en plus), sortie 0 : étage serveur
rejoué (fmt, clippy, 314 tests Rust « ok », 0 échec, build release) ; étage web repris du cache (`web/`
identique depuis `6f6197c`) ; image de contrôle retirée à 19 h 01 (journal `m8/docker-m8b.log`).
grille des tests sautait ces cas. Repris par le lot T3c (lancé à 19 h 18, fusionné à 19 h 57 :
`de1b7eb`), avec la liste fermée des phrases demandée par orch (`t3c-liste-fermee.md`).
- **Relecture de `de1b7eb` : en cours** (sous-agent neuf, sans le contexte de l'intégrateur, sur la liste
fermée ; consigne `m8/relis-m8c.md` du scratchpad de l'intégrateur).
4. `git diff 6f6197c de1b7eb -- docker/ .woodpecker/ .env data/ crates/ld-server/migrations/ web/ crates/ld-engine/`
→ vide (vu par l'intégrateur le 03/11 à 20 h 05).
5. Boucle verte sur `de1b7eb`, le 03/11 de 19 h 57 à 20 h 03 (journal `m8/loop-c.log`), du premier coup :
fmt, clippy `-D warnings`, 316 tests Rust, svelte-check 0 / 0 (648 fichiers), 78 vitest, build, e2e
42 / 42 (19 h 59 à 20 h 03). Image de production : en cours.
6. Sur sonic, aucun témoin `/opt/libredecision-app/deploying`.
## Commande exacte
```sh
cd /home/yvv/Documents/PROD/DEV/libreDecision
git push prod e7ab82f48f41f52b3f31e322553f7cf18bc21601:main
git push prod de1b7eb5d7e982aee7c70a41c9f5799fb171493e:main
```
## Vérifications après
- [ ] Santé vue de l'extérieur → `"build":"e7ab82f4"`.
- [ ] Santé vue de l'extérieur → `"build":"de1b7eb5"`.
- [ ] Journaux : quatre « seed amendment applied » (`2026-11-03-f1-2-chiffres`, `-n1-1-chiffres` × essai,
Monnaie libre), « publication suspended … waiting=12 », aucune ligne ERROR ni WARN.
- [ ] Redémarrage à froid : aucun amendement rejoué.