v3 : interface des objections, des coquilles validées et de la messagerie ; contrôles C28–C31

Une version retenue par une objection le dit sous l'article, à chacun
selon son rôle : la personne qui vote voit qu'elle ne se vote plus (les
votes faits restent) ; l'auteur, quoi faire (« Modifier l'article visé »
pour une redite, « Reformuler » pour une contradiction) ; la personne qui
objecte, lever ou réitérer avant l'échéance. Le panier la montre sans
choix et ne l'envoie jamais.

« Détails » : faire une objection (redit / contredit), les objections et
où elles en sont, les coquilles proposées par d'autres avec leur diff
resserré, valider / refuser / revenir, l'historique dit qui a validé.
Une coquille se propose sur toute version ouverte ou en vigueur.

Boîte « Messages » dans le menu, avec le nombre de non-lus (pastille sur
le bouton du menu en mobile) : objet, texte, gestes, échéance ; un message
traité n'a plus de geste. Répondre à une objection lit son message.

Trilingue (fr, en, es). C6 suit la règle : la coquille d'un administrateur
sur un texte du seed passe tout de suite ; C28–C31 couvrent le reste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-31 04:21:20 +01:00
co-authored by Claude Opus 5.5
parent 3f1f968f16
commit 83f8ca0981
31 changed files with 1732 additions and 197 deletions
+2
View File
@@ -216,6 +216,7 @@ async fn a_redit_holds_the_latest_back_until_its_author_answers_and_the_objector
let m = chiara.messages().await;
assert_eq!(gestures(&m["messages"][0]), Vec::<&str>::new());
assert_eq!(m["messages"][0]["outcome"], "answered");
assert_eq!(m["unread"], 0, "answering reads one's message");
// Yvv lifts from his message: the proposal is votable again, the message offers nothing more.
yvv.ok("POST", &format!("/api/objections/{oid}/lift"), None).await;
@@ -263,6 +264,7 @@ async fn a_contredit_answered_by_a_rewording_is_lifted_alone_at_the_deadline() {
"Je m'engage à ne certifier que des personnes qui respectent ces engagements, après les avoir rencontrées.";
let r = chiara.ok("PATCH", &format!("/api/proposals/{b}"), Some(json!({ "title": title, "body": reworded }))).await;
assert_eq!(r["edit"], "substantive");
assert_eq!(chiara.ok("GET", "/api/messages/unread", None).await["unread"], 0, "rewording reads one's message");
let det = yvv.detail(&b).await;
assert_eq!(phase(&det), (Some("objector".into()), Some(1)));
assert_eq!(det["objections"][0]["answer"], "revision");