An example to evaluate: a training run, its dashboard, and two bugs it found

make seed-demo builds demo_training — prepare on the engine, a GPU-bound
train, evaluate back here — and a panel that draws the loss curve while the
training is still going. It is the session's whole argument in one flow: batch
runs with parameters and a result, a generator yielding on a declared port
rather than logging, fluksio.emit from inside a callback, artifacts carrying
the dataset and the weights between machines, and a sweep whose configs are
isolated from each other. The train node prefers its label rather than
requiring it, so it runs before a GPU box exists and says which machine and
which numeric backend it actually used.

Building it turned up two real bugs. A run waited for a worker its flow only
*preferred*, because required_labels ignored device_policy — so the example
hung on a label it did not need. And a run's seed never reached the flow, so
sweeping over seeds ran the same experiment N times; it now fills an input of
that name when the flow declares one, which is what the field looked like it
did all along.

Pressing Run on a batch flow now submits a run rather than taking the old
non-durable path — that button is the first thing anyone evaluating will press,
and it was quietly doing something else.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AD8SfVhzXBG2nAfFcVh3iD
This commit is contained in:
2026-08-18 22:04:14 +02:00
co-authored by Claude Fable 5
parent e18f1f6c5f
commit 52c0c5e2ce
7 changed files with 546 additions and 8 deletions
+4
View File
@@ -736,6 +736,10 @@ export class FlowsService {
*
* With unpublished changes this runs the draft, so the button matches what is
* on the canvas. Nothing is deployed by running it.
*
* A *batch* flow is submitted as a run instead, because that is what running
* one means: it is what keeps the parameters, the series and the result, and
* a button that quietly did something else would be a trap.
* @param data The data for the request.
* @param data.name
* @param data.requestBody