Lot T4 : l'ADR 0014, le fichier de relecture textes-amorce.md, les contrôles e2e au document de T4

ADR 0014 « Les informations de fonctionnement ne se votent pas » : ce qui sort
(F1, F1.1, F1.2, F1.3, N1, N1.1, O1 et l'ordre de leurs sections), comment (rien
d'effacé, units.retired_at), la garde et ses refus, aucun vote futur (404 / 400),
ce que dira l'interface (U3), la file de publication, le retour arrière (prouvé
avec l'image de de1b7eb), les limites. textes-amorce.md : chaque texte avant /
après en fr, en, es, E12, ce qui sort, les choix à confirmer par Yvv.

e2e (aucun changement de web/src) : C3, C9 (27 articles, cinq sections, quatre
Propositions seed), C17 (33 modules à voter), C18 et C31 (le texte d'I1 de
T4), C25 (cinq lignes d'ordre, E12 dans l'ordre de « fondamental »), C35 (E12
entre E1 et E2 ; le glisser d'une place), C38 (4 Propositions seed).
CONTROLES.md suit ; CLAUDE.md : article_amend.rs, retire.rs, amorce.rs,
fixtures/seed-m8, le seed de 27 articles, l'invariant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-11-03 21:45:27 +01:00
co-authored by Claude Opus 5.5
parent 093d1ca471
commit 3996f6f99d
11 changed files with 512 additions and 53 deletions
@@ -0,0 +1,143 @@
# 0014 — Les informations de fonctionnement ne se votent pas
> Décision d'Yvv du 2026-11-03 (lot T4). Complète [0009](0009-modules-ordre-et-titre.md) (les
> modules) et [0011](0011-propositions-seed.md) (les Propositions seed). La migration est la
> `0012`. Les textes, avant et après, sont relus dans
> `docs/chantiers/acte-certification/textes-amorce.md`.
**Contexte.** Le seed de l'Acte d'engagement portait, depuis la maquette, trois sections au bas du
document : `formule` (F1 « Formule de vote », F1.1 « Formule du seuil WoT », F1.2 « Paramètres par
défaut », F1.3 « Processus de dépôt officiel »), `inertie` (N1 « Réglage de l'inertie », N1.1
« Niveaux d'inertie ») et `ordonnancement` (O1 « Ordonnancement du document »), chacune avec son
module « ordre des articles » (ADR 0009). Les lots T à T3c ont réécrit F1.1, F1.2 et N1.1 pour
qu'ils disent les règles du moteur. Yvv, 2026-11-03 : « Attention les 3 derniers modules ne sont pas
de votes : ordonnancement, inertie, et formule de vote sont des infos de fonctionnement. Les votes
se font à leur place, et les infos doivent trouver leur place dans l'ux. […] Vire les 3 du bas de
la liste. »
## Décision
**Ce qui sort du document** : les sept articles F1, F1.1, F1.2, F1.3, N1, N1.1, O1, et les trois
modules `ordre.formule`, `ordre.inertie`, `ordre.ordonnancement`. Le document garde cinq
sections (introduction, fondamental, technique, conclusion, annexe) et 27 articles, dont quatre
Propositions seed : I1, E1, E12 « Responsabilité civique » (nouveau, entre E1 et E2) et E2.
**Hors du document, une unité n'est rien pour le vote.** Elle n'est ni lue avec son document
(`docs::load_state` ne lit que les unités sans `retired_at`, et leurs versions), donc ni listée,
ni comptée (`docs::group` : « propositions en cours » ; `overview::modules` : « modules à
voter »), ni mise dans l'ordre d'une section (`DocState::members`), ni publiée (`document.json` et
le Markdown lisent l'état du document ; `publish::waits_for_a_text` et `last_change` l'ignorent).
**Aucun vote futur** : l'API répond 404 à un vote, à la lecture d'une de ses versions, à une
correction, une traduction, une objection faite depuis elle, une proposition sur elle, un
changement d'inertie, un quorum, un ordre (`proposals::guarded` : la version doit être celle d'une
unité du document) ; 400 à un vote groupé qui la nomme (`lines`), à une objection qui la vise
(`other`) et à un nouvel article dans une section sortie (`section`). Rien n'est écrit par ces
refus.
**Une base neuve** naît sans eux : le seed ne les contient plus.
**Une base existante** (la production : Monnaie libre et le groupe d'essai) **n'efface rien**. La
migration `0012` est additive : `units.retired_at` (quand l'unité est sortie) et
`units.retired_reason` (l'amendement qui l'a sortie), les journaux `retirement_amendments` et
`article_amendments`. Le retrait `2026-11-03-fonctionnement-hors-vote`
(`crates/ld-server/src/retire.rs`) est décidé **une fois par document**, pour toutes les unités ou
aucune, et n'écrit que ces deux colonnes : ni leurs versions, ni leurs révisions, ni leurs
traductions, ni la file de publication ne changent. Il n'a lieu que si **aucune personne n'a
laissé de trace** sur l'une d'elles, dans l'une de ses versions, quoi qu'il en soit advenu, et il
dit la première trouvée (raison et code de l'unité) :
| Trace | Raison du refus |
|---|---|
| un vote du serveur, prouvé ou simulé | `votes` |
| une ligne de bulletin, quel que soit son sort | `ballots` |
| une adoption, une version entrée en vigueur ou confirmée, une inertie changée par un vote | `adopted` |
| une version écrite par un membre (texte, retrait, inertie, ordre) | `member_proposal` |
| une révision écrite par une personne, ou d'un genre qu'aucun amendement n'écrit ; une coquille, en attente ou refusée | `corrected` |
| une traduction écrite ou corrigée par un membre | `translation_edited` |
| une objection qui la nomme, levée ou non | `signalled` |
| un quorum fixé (`units.quorum`, `quorum_changes`) | `quorum_set` |
Un amendement du seed n'est pas une trace de personne : F1.1 à sa révision 3, F1.2 et N1.1 à leur
révision 4 (après M6c) ou 5 (après M8) sortent comme les autres. Refusé, rien ne bouge ; la
décision est consignée (`retirement_amendments` : l'issue, la raison, l'unité, les codes sortis)
et dans les journaux. Appliqué là où le document publie (Monnaie libre), une ligne s'ajoute à la
file ; comme toutes, elle attend le premier texte en vigueur (ADR 0011).
Les amendements qui réécrivaient ces textes (`2026-11-02-n1-regles`, `-o1-regles`,
`2026-11-03-f1-1-phrases`, `-f1-2-chiffres`, `-n1-1-chiffres`) sont **dépassés par le retrait**
(`superseded_by`) : le seed ne donne plus leur texte, ils ne se décident plus. Une production
restée à M6c sort donc F1.2 et N1.1 avec le texte de M6c.
## Les textes d'amorce
I1, E1 et E2 prennent les textes d'Yvv du 03/11 par trois amendements gardés de
`seed_amend.rs` sur la Proposition seed elle-même (`Version::SeedProposal`), jamais sur un texte
en vigueur : `2026-11-03-i1-amorce` (suit `2026-10-30-i1-raison-d-etre`), `2026-11-03-e1-amorce`,
`2026-11-03-e2-amorce`. Même garde que tout amendement du seed (une trace de personne refuse,
avec sa raison) ; la ligne d'historique `seed_proposal`, qui ne change aucun texte, est admise
quand l'amendement de Proposition seed l'a écrite, et seulement elle. Les amendements de
Proposition seed (`seed_proposal_amend.rs`) sont dépassés par eux.
E12 entre par un ajout gardé (`crates/ld-server/src/article_amend.rs`, sur le modèle de
`module_amend`), une fois par document : écrit comme une base neuve l'écrit
(`seed::write_unit`), **entre E1 et E2** tant qu'aucun vote n'existe sur l'ordre de la section
(`quorum::voted_units`) et qu'ils s'y suivent — l'ordre en vigueur, qui lit les positions, le dit
aussitôt —, sinon **en fin de section**, comme tout nouvel article. Refus : `code_taken` (une
autre unité porte déjà ce code), `no_section`. Le code E12 suit la famille des engagements (E3 à
E11 existent) ; la place vient de l'ordre de la section, pas du numéro.
## Ce que dira l'interface (lot U3)
Les informations de fonctionnement se montrent **hors du vote** : la formule du seuil, les crans
d'inertie, le quorum, l'ordonnancement, à leur place dans l'écran (Yvv : « les infos doivent
trouver leur place dans l'ux »), d'après les paramètres du moteur et du document, pas d'après
un texte voté. Les vérités que F1.1, F1.2 et N1.1 portaient, chacune vérifiée par un test
(lots T à T3c, `t3c-liste-fermee.md`), en sont la référence ; leurs derniers textes restent dans
`crates/ld-server/tests/fixtures/seed-m8/` et, en production, dans leurs lignes. T4 ne touche pas
`web/`.
## La file de publication
Rien n'y est effacé. Les lignes écrites pour ces textes avant T4 (les amendements de M5 à M8,
« F1.2 », « N1.1 »…) restent telles quelles ; comme toute la file, elles attendent le premier
texte en vigueur (ADR 0011) et partent avec lui : leurs raisons sont des lignes du message de
commit, alors que le contenu publié (`document.json`, le Markdown) ne contient plus ces
articles ; la ligne du retrait, ajoutée à la même file, dit qu'ils sont sortis.
## Le retour arrière
L'image d'avant (`de1b7eb`) ne connaît pas `retired_at` : elle lit les unités sans cette colonne
et les montre de nouveau, **telles qu'elles étaient** (versions, révisions, traductions, ordres
intacts : le retrait n'a écrit que ses deux colonnes). Elle démarre sur la base migrée : les
migrations inconnues sont tolérées (`open_db`). Ce que le retour ne défait pas : E12 reste
(une Proposition seed, que l'image d'avant lit comme les autres), I1, E1 et E2 gardent leurs
textes de T4 (une révision de plus).
**Prouvé** par le test `an_image_that_ignores_the_column_shows_the_rules_of_operation_as_they_were`
(`tests/amorce.rs` : la colonne remise à vide, la vue est celle d'avant), et le 2026-11-03 avec
l'image de `de1b7eb` elle-même, hors du dépôt : une base née du seed de production du 02/11 puis
démarrée par `de1b7eb` (un vote, un article de membre) ; l'image de T4 démarre dessus ; puis
`de1b7eb` de nouveau. Les sept articles et les trois ordres se lisent à l'identique dans les deux
groupes ; aucune ligne d'aucune table n'a disparu ; T4 n'a modifié que `retired_at` et
`retired_reason` (20 unités), et les trois Propositions seed amendées (6 versions, 12
traductions) ; `de1b7eb` relancée n'a rien écrit (une session de lecture). **Sur une copie de la
production**, la même procédure : relever chaque ligne de chaque table (rowid compris) ; démarrer
l'image de T4 sur la copie, sans clé de publication ; relever de nouveau (aucune ligne absente,
aucune colonne changée hors de celles-là) ; démarrer `de1b7eb` sur la copie et comparer
`GET /api/docs/{id}` d'avant et d'après pour F1 à O1 et `ordre.formule`, `ordre.inertie`,
`ordre.ordonnancement`.
Limite : le retrait n'est décidé qu'une fois ; si, après un
retour arrière, quelqu'un agit sur ces articles puis T4 revient, `retired_at` les sort de
nouveau sans relire la garde. Les remettre serait alors une décision (`retired_at` à NULL : une
écriture, pas un effacement).
## Limites connues
- **Une base d'avant M6** (I1, E1, E2 en vigueur, pas Propositions seed) : l'amendement de
Proposition seed étant dépassé, ils restent en vigueur avec leur texte, et les trois
amendements d'amorce refusent (`no_seed_proposal`). Aucune base réelle n'est dans ce cas.
- Un article de membre prend le code `N<n>` (`proposals::new_unit`) d'après le nombre de codes
en `N` du document, unités sorties comprises : en production, N1 et N1.1 restent dans la base
et aucun code n'est repris ; dans une base neuve, le premier article de membre est N1, sans
rapport avec l'ancien « Réglage de l'inertie ».
+1
View File
@@ -18,3 +18,4 @@ pas une décision : on en écrit une nouvelle qui la remplace, et on le note dan
| [0011](0011-propositions-seed.md) | Les Propositions seed : rien en vigueur au départ, trois textes mis en avant au cran 2, la publication attend le premier texte (complète 0002) | 2026-11-02 |
| [0012](0012-tampon-des-votes.md) | Le tampon des votes : l'intention visible tout de suite, la preuve de la chaîne, la réconciliation a posteriori ; la simulation tant que la chaîne est fermée (complète 0008, révise 0010) | 2026-11-02 |
| [0013](0013-quorum.md) | Le quorum par cran (12 · 12 · 50 · 50 · 50), fixé par l'auteur avant le premier vote ; sous le quorum, les votants qui manquent comptent comme « non » (remplace le C de 0002 et 0007) | 2026-11-03 |
| [0014](0014-informations-de-fonctionnement.md) | Les informations de fonctionnement ne se votent pas : formule, inertie, ordonnancement sortent du document sans rien effacer (`units.retired_at`) ; E12 « Responsabilité civique » ajoutée (complète 0009 et 0011) | 2026-11-03 |