v0.79.4
August 5, 2026
The engine becomes crash-proof. Seventeen coordinated changes close critical races and crash windows: events that can no longer be lost, outcomes with a single winner, always-recoverable creations, atomic escalations. With one declared breaking change for n8n integrations.
-
Improvement
No lost events, no duplicate outcomes
Recording an event and dispatching it now happen in the same transaction: a crash can no longer leave orphaned events (they may arrive a few seconds later, but are never lost). Every activity outcome — manual completion, callback, timeout, retry, reopen — goes through an atomic claim: two concurrent actors can no longer write opposite outcomes or run webhooks, AI calls or child flows twice; the loser gets an honest answer and leaves no changes behind. Creations with an idempotency key recover on their own after a crash (the key previously stayed locked forever), and an interrupted entry is resumed automatically within half an hour.
-
Security
Hardened event provenance and alerts that really arrive
An external caller can no longer have data copied from an item by naming its identifier in the payload: automatic copying now happens only for events generated internally by the system. And escalation policies configured on custom roles — silent until now due to a notification-worker defect — finally notify for real: anyone who had them configured will start receiving alerts that never arrived before.
-
Integration
n8n callbacks with an explicit contract
n8n workflow responses to FlowSharp now require the `runId` field (just echo the `xflow.runId` value received in the payload — without it, a clear error with instructions). The `taskId` field must come from the `X-XFlow-Task-Id` header: anyone who copied old templates should regenerate the snippet from settings, which now produces the correct code. This definitively closes "stale" callbacks from superseded runs.
-
Improvement
Always-honest operational health
Event-dispatch health is now visible and never falsely green: backlog, age, attempts and last error are exposed in the worker's health endpoint, with a "degraded" state that never triggers restart loops. Failed rows are retried with growing backoff without blocking later ones, and nothing ever disappears silently: a documented replay procedure covers the extreme cases.