forked from yvv/decision
Lot T4 : les textes et la structure de l'Acte d'engagement (Yvv, 03/11) — I1, E1, E2 prennent les textes d'Yvv (fr, en, es ; « il y a une et une seule clé » lu comme la coquille de « il n'y a une et une seule ») ; E12 « Responsabilité civique », Proposition seed au cran 2, entre E1 et E2 ; les sections formule, inertie, ordonnancement sortent du document (ADR 0014). Migration 0012 additive (units.retired_at et retired_reason, retirement_amendments, article_amendments) ; une unité retirée n'est ni lue avec son document, ni listée, ni votée, ni proposée, corrigée, traduite ou objectée (404), ni comptée, ni publiée ; rien d'effacé. Amendements gardés, une fois par document : 2026-11-03-i1-amorce, -e1-amorce, -e2-amorce (Version::SeedProposal ; la ligne seed_proposal admise quand l'amendement de Proposition seed l'a écrite), 2026-11-03-e12-responsabilite-civique (article_amend : entre E1 et E2 tant que l'ordre de la section n'a pas de vote, sinon en fin de section), 2026-11-03-fonctionnement-hors-vote (retire : tous ou aucun, refus à la moindre trace d'une personne, avec sa raison et l'unité) ; les amendements dont le seed ne donne plus le texte, dépassés (superseded_by) ; seed::write_unit partagé
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -526,6 +526,9 @@ async fn production_gets_lot_t4_once(base: AppState, rules_revision: i64) {
|
||||
let untouched_versions = rows(&base, "proposals", &[], "unit_id NOT IN (SELECT u.id FROM units u WHERE u.code IN ('I1', 'E1', 'E2'))").await;
|
||||
|
||||
let state = t4(&base).await;
|
||||
// Taken at once, before anyone signs in (a session writes its identity).
|
||||
let after = tables(&state).await;
|
||||
let after_rows = rowids(&state).await;
|
||||
|
||||
// I1, E1 and E2: Yvv's texts, written over the seed proposal, one revision more.
|
||||
let today = today_seed();
|
||||
@@ -609,8 +612,6 @@ async fn production_gets_lot_t4_once(base: AppState, rules_revision: i64) {
|
||||
|
||||
// Nothing erased, anywhere, the publication queue included: every row of before is
|
||||
// there, and each table holds exactly what lot T4 adds.
|
||||
let after = tables(&state).await;
|
||||
let after_rows = rowids(&state).await;
|
||||
for (t, ids) in &before_rows {
|
||||
let missing: Vec<&i64> = ids.difference(&after_rows[t]).collect();
|
||||
assert!(missing.is_empty(), "{t}: rows erased {missing:?}");
|
||||
@@ -650,9 +651,15 @@ async fn production_gets_lot_t4_once(base: AppState, rules_revision: i64) {
|
||||
assert!(queued.iter().any(|(_, r)| r.contains("formule")), "{queued:?}");
|
||||
assert!(queued.iter().any(|(_, r)| r.contains(NEW)), "{queued:?}");
|
||||
|
||||
// Decided once: a second start replays nothing.
|
||||
// Decided once: a second start replays nothing (the sessions opened above, and what they
|
||||
// wrote of their identities and groups, aside).
|
||||
let settled = tables(&state).await;
|
||||
let again = t4(&state).await;
|
||||
assert_eq!(tables(&again).await, after);
|
||||
assert_eq!(tables(&again).await, settled);
|
||||
let unchanged = |t: &BTreeMap<String, i64>| {
|
||||
t.iter().filter(|(k, _)| !matches!(k.as_str(), "identities" | "sessions" | "memberships")).map(|(k, n)| (k.clone(), *n)).collect::<Vec<_>>()
|
||||
};
|
||||
assert_eq!(unchanged(&settled), unchanged(&after));
|
||||
assert_eq!(retirements(&again).await, [mark("essai"), mark("monnaie-libre")]);
|
||||
assert_eq!(rewrites(&again).await, rw);
|
||||
assert_eq!(additions(&again).await, [between("essai"), between("monnaie-libre")]);
|
||||
|
||||
Reference in New Issue
Block a user