Back to the changelog

v0.77.0

August 1, 2026

Automatic rules now do what the designer promises. A rule written exactly the way the help, the hints and the assisted generator show it saw no data at all and stayed silent forever, with no error and no trace. Rules now genuinely read the item's data, numeric comparisons understand numbers that arrive as text, a field never filled in no longer sends anything forward, and when a rule does not fire the history says why.

  • Improvement

    Rules finally read the item's data

    A JavaScript rule written as `data.<field>` or `item.data.<field>` — the forms shown by the help, the designer's hints and the assisted generator — resolved into nothing: it was always false and the item never moved, with no error at all. They now read the item's real content, and rules written in the one form that used to work keep working: no existing rule gets worse. The same applied to condition-based rules, where the `data.` shorthand was switched off by the presence of a field also named `data` and ended up looking inside that field. And the assisted generator now teaches the right contract, so the code it produces works first time.

  • Improvement

    Nobody moves forward without being entitled to

    An amount arriving from a form or an integration is often text: `"150"` never cleared `≥ 100` and the item slid onto the fallback branch. Both sides of a comparison are now read as numbers when they are numbers, spaces included, while equality comparisons stay strict. Negative conditions were vacuously true: "outcome other than rejected" approved, on its own, items nobody had written anything on yet — and now a field that does not exist satisfies no condition, except those that exist precisely to reason about absence. A rule with no conditions, which the designer shows as inert, no longer overrides the others: a single half-finished rule at the top of the order was enough to divert the whole flow.

  • Improvement

    The history says why a rule did not fire

    Until now there was no telling a false condition from a field never filled in or from incompatible types, and the "no rule satisfied and no fallback branch" case left no trace at all: the item simply stood still. The history now reports the detail rule by rule, once only until the situation changes. That detail describes the shape of the data and never its content — it says "field is not numeric (text)", not the value — because the history is readable even by the lowest permission level. Errors are now visible on phase expiry too, where they used to die in a technical log, and the note makes clear that this evaluation has less information available than entry into the phase did.

  • Improvement

    Saves that lose nothing

    A rule pointing to a non-existent phase was silently discarded with a successful outcome: the rule vanished while everything else, renames included, was saved. Saving now stops and explains, writing nothing halfway — while a rule whose destination you have not chosen yet stays work in progress and blocks nothing. And deleting a phase clears the references pointing at it, including the exits for expiry, work-in-progress limit and maximum number of passes.

  • Improvement

    A phase deadline no longer restarts

    A scheduled wait inside a phase rewrote the deadline "from now": the time measured was no longer the time elapsed since entering the phase, and with several waits in sequence it restarted every time. A timeout set to one minute could fire after three. The deadline is now set by entry into the phase, whatever the item is waiting for.

  • Improvement

    An empty filter no longer errors the list

    Filtering items by "expired" with no matches produced an invalid-parameter message: the list was trying to move to a page that does not exist. This applied to any filter with an empty result.