v0.39.3
10 luglio 2026
Release di sole correzioni: un giro di hardening su API e interfaccia. Chiude alcune situazioni in cui si poteva perdere lavoro in silenzio (una richiesta ripetuta con dati diversi, due operazioni in corsa sullo stesso item) e alcune incoerenze tra ciò che l’interfaccia mostra e ciò su cui poi agisce (lista flussi, stampa mappa, ruoli degli eventi). Nessuna migrazione di database.
-
Miglioramento
Niente lavoro perso: richieste ripetute e operazioni concorrenti
Se ripeti la creazione di un item con la stessa Idempotency-Key ma un flusso o un’entità diversi, XFLOW risponde ora con un errore chiaro (422) invece di restituire silenziosamente l’item originale scartando i nuovi dati — stessa protezione sull’avvio via trigger. E quando due operazioni provano a far avanzare lo stesso item nello stesso istante, la seconda riceve ora un conflitto (409) con messaggio chiaro “riprova” invece di un errore generico del server (500) — vale anche per il force-transizione dell’Admin.
-
Miglioramento
Coerenza della lista flussi
La riga di un flusso mostra ora la versione live e ci porta lì: badge, numero di versione e link indicano sempre la stessa versione (quella pubblicata/live), come già avviene per le Process Map. E le azioni che modificano — archivia, elimina, sposta, “modifica nel designer” — continuano ad agire sulla versione più recente (es. la bozza in lavorazione): così, con una famiglia live v1 + bozza v2, non si rischia più di archiviare o disabilitare la v1 pubblicata al posto della bozza.
-
Sicurezza
Integrità di stampa ed eventi
Il PDF di una Process Map include solo i flussi davvero collegati alla mappa: gli identificativi passati nell’indirizzo della pagina di stampa vengono ora filtrati sui flussi presenti nella mappa, così non è più possibile “iniettare” flussi estranei nel documento manipolando l’URL. I ruoli abilitati a un evento vengono ora verificati: alla creazione/modifica di una definizione di evento i ruoli devono essere reali (di sistema o personalizzati del tenant) — un ruolo inesistente viene rifiutato con un errore invece di essere salvato (e poi bloccare silenziosamente l’evento per tutti). Infine, lo schema del payload di un evento viene finalmente salvato e restituito (a scopo di documentazione), mentre prima veniva scartato senza avviso.