v2 : les 14 écrans — le tour complet de la démocratie d'exercice

- Aujourd'hui (Fil 13 sections + capture sticky) + Le chemin (tunnel 2 gestes,
  Q0 inline, 3 chips, dérogation asymétrique, alternatives réglage/consignation)
- Registre + fiche décision (timeline, périmètre premier/second lieu auditable,
  affluence non-ignorable, S'instruire condensé, éléments + cartographie de
  clôture, épreuve du réel, Remettre en question, PV A4, gravure)
- Salle de vote 5 modalités (consentement, nuancé+histogramme, binaire hérité
  avec jauge inertielle, Réglage collectif complet — faisceau, médiane basse,
  Pour moi, Explorer, cristallisation-geste —, élection à départage humain)
- Textes (Pacte en clair, document vivant, diff, vue projetée, Atelier des
  formules porté du v1 sur le moteur unique) + Mandats (faits comptés, feux
  de la rampe, wizard 3 étapes) + Observatoire (consigner→observer→protocoliser)
- Onboarding 7 gabarits + Données locales (export/import, attributs, atelier)
- voting→framing gardé (Reformuler d'un réglage figé non cristallisé)
- Pages v1 supprimées (login, documents, mandates, protocols, sanctuary,
  tools, decisions/new) — 342 tests verts, build zéro erreur

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-08-11 13:47:20 +02:00
co-authored by Claude Fable 5
parent d886302b59
commit e164b5f6c1
96 changed files with 14097 additions and 11777 deletions
+16 -1
View File
@@ -39,7 +39,9 @@ export const TRANSITIONS: Readonly<Partial<Record<DecisionStatus, readonly Decis
advice: ['adopted', 'voting'],
objection: ['adopted', 'framing', 'voting'],
framing: ['voting', 'closed'],
voting: ['adopted', 'rejected'],
voting: ['adopted', 'rejected', 'framing'],
// voting→framing: ONLY the « Reformuler » choice of the crystallization gesture —
// guarded below to a frozen, non-crystallized parametric session (Δ3).
adopted: ['revoked', 'closed'],
}
@@ -77,6 +79,8 @@ const REASONS = {
dossierPending:
'Des éléments du dossier sont encore en cours — le dossier se clôt quand tous ont abouti.',
crystallization: 'Les votes sont figés — la cristallisation attend son geste.',
reformulate:
'Reformuler nest possible que sur un réglage collectif figé, avant sa cristallisation.',
} as const
export interface TransitionContext {
@@ -230,6 +234,17 @@ export function canTransition(
}
}
// voting→framing is EXCLUSIVELY the « Reformuler » branch of the crystallization
// gesture (Δ3): a frozen, not-yet-crystallized parametric session may go back to
// formulation instead of being crystallized. Any other voting→framing is refused.
if (from === 'voting' && to === 'framing') {
const reformulable =
ctx.session?.status === 'frozen' && !ctx.session.crystallizedById
if (!reformulable) {
return refuse(REASONS.reformulate)
}
}
return { ok: true }
}