v0.39.3
July 10, 2026
A fixes-only release: a round of API and UI *hardening*. It closes situations where you could silently lose work (a repeated request with different data, two operations racing on the same item) and some mismatches between what the interface shows and what it then acts on (flow list, map printing, event roles). No database migration.
-
Improvement
No lost work: repeated requests and concurrent operations
If you repeat an item creation with the **same Idempotency-Key** but a **different flow or entity**, XFLOW now returns a **clear error (422)** instead of *silently* returning the original item and discarding the new data — same protection on trigger-based start. And when two operations try to advance the **same item at the same instant**, the second one now gets a **conflict (409) with a clear “try again” message** instead of a generic server error (500) — this also covers the Admin force-transition.
-
Improvement
Flow list coherence
A flow’s row now shows the **live version and takes you there**: badge, version number and link always point to the **same version** (the published/live one), as already happens for Process Maps. And the actions that change things — archive, delete, move, “edit in designer” — keep acting on the **most recent version** (e.g. the draft you’re working on): so with a *live v1 + draft v2* family, you no longer risk archiving or disabling the **published v1** instead of the draft.
-
Security
Printing and event integrity
A Process Map’s **PDF only includes the flows actually linked to the map**: the identifiers passed in the print page’s address are now **filtered** to the flows present in the map, so you can no longer “inject” unrelated flows into the document by tampering with the URL. The **roles allowed on an event are now verified**: when creating/editing an event definition, roles must be **real** roles (system or tenant-custom) — a non-existent role is now **rejected with an error** instead of being saved (and then silently blocking the event for everyone). Finally, an event’s **payload schema is now actually saved** and returned (for documentation), where before it was silently dropped.