mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-09-21 00:02:30 +00:00
A finished turn is two questions, and answering them as one is what this keeps getting wrong. Whether the turn succeeded is the run's to answer and it always knows; what the turn said is the rows', and they arrive late, out of order, and sometimes not at all. They were tangled. Retry was offered on the strength of the last row's `success`, so whether the reader could retry a failed turn depended on whether a write the run does not wait for happened to land in time. And the answer shown when no row arrived was decided by proxies for "did anything happen" — how many rows the last read returned, then how much the transcript grew — neither of which distinguishes an answer from a tool call, or a row replaced in place from one that never came. The verdict now comes from the job, and only from the job. A result shaped like a failure is a reason to go and ask, never an answer in itself: a flow is free to return that shape. A job that cannot be read counts as failed, because the alternative is arming the next turn on a guess. What is shown comes from the rows, asked at the one boundary that means anything — the message the turn answers, with the turn's own work after it. A turn whose question is no longer on screen is left alone. The run's result is shown only where the rows have not already shown it and the stream did not, since the two are the same answer twice. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Windmill frontend
The Windmill frontend written in Svelte 5 + Tailwind CSS
The frontend is under AGPL, see the LICENSE file at the root of this repo