forked from yvv/decision
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:
@@ -157,7 +157,7 @@ describe('La table des transitions', () => {
|
||||
expect(TRANSITIONS.advice).toEqual(['adopted', 'voting'])
|
||||
expect(TRANSITIONS.objection).toEqual(['adopted', 'framing', 'voting'])
|
||||
expect(TRANSITIONS.framing).toEqual(['voting', 'closed'])
|
||||
expect(TRANSITIONS.voting).toEqual(['adopted', 'rejected'])
|
||||
expect(TRANSITIONS.voting).toEqual(['adopted', 'rejected', 'framing'])
|
||||
expect(TRANSITIONS.adopted).toEqual(['revoked', 'closed'])
|
||||
})
|
||||
|
||||
@@ -621,3 +621,30 @@ describe('windowOutcome — l’échéance des fenêtres d’objection', () => {
|
||||
expect(windowOutcome(decision, makeCtx())).toBe('wait')
|
||||
})
|
||||
})
|
||||
|
||||
describe('Garde j — reformuler (voting→framing) réservé au réglage collectif figé', () => {
|
||||
it('session figée non cristallisée — reformuler est permis', () => {
|
||||
const decision = makeDecision({ status: 'voting', route: 'collective' })
|
||||
const ctx = makeCtx({ session: makeSession({ status: 'frozen' }) })
|
||||
expect(canTransition(decision, 'framing', ctx).ok).toBe(true)
|
||||
})
|
||||
|
||||
it('session ouverte — reformuler est refusé', () => {
|
||||
const decision = makeDecision({ status: 'voting', route: 'collective' })
|
||||
const ctx = makeCtx({ session: makeSession({ status: 'open' }) })
|
||||
expect(canTransition(decision, 'framing', ctx).ok).toBe(false)
|
||||
})
|
||||
|
||||
it('session cristallisée — reformuler est refusé', () => {
|
||||
const decision = makeDecision({ status: 'voting', route: 'collective' })
|
||||
const ctx = makeCtx({
|
||||
session: makeSession({ status: 'closed', crystallizedById: 'p-steward' }),
|
||||
})
|
||||
expect(canTransition(decision, 'framing', ctx).ok).toBe(false)
|
||||
})
|
||||
|
||||
it('sans session — reformuler est refusé', () => {
|
||||
const decision = makeDecision({ status: 'voting', route: 'collective' })
|
||||
expect(canTransition(decision, 'framing', makeCtx()).ok).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user