New run: start a run from the app, on the working copy

The site promises simulated inputs and mocked sensor values, and nothing in
the app was that. A run already is: the values are the caller's, the state is
the run's own namespace, and nothing it computes reaches the live flow. What
was missing was a screen to do it from, and the draft flag being honoured.

`/runs/new` is a flow, a field per declared input, a seed and Run; `/runs`
stays the log. A comma-separated list in a number field expands into the grid
`fluksio sweep --param` builds and goes to the sweep route, so launching one
no longer needs a terminal. Only numbers split: a comma in a string is
content, and one in JSON is syntax.

`RunCreate.draft` was validated at submit and dropped before the run
executed, so "try the working copy" ran the published one. `Run.draft` is a
column now, the driver reads the same copy the submit checked, and a retry
carries it. `FlowSummary.mode` came with it so the rail can say which flows
are batch before one is picked.

Also here: a Retry button on a finished run, which the route has always had
and the UI never did, and parameter cells truncated to their column with the
full value on hover.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013TTfoK82awm8wvxXhHz3XF
This commit is contained in:
2026-09-02 15:10:24 +02:00
co-authored by Claude Opus 5
parent d471614e6a
commit 5b122341d5
20 changed files with 926 additions and 91 deletions
+7 -1
View File
@@ -123,9 +123,14 @@ export class ArtifactsService {
* legitimate a body here as a checkpoint, and neither should have to fit in
* memory twice. Capped, because nothing else here was: any account, and any
* worker credential, could otherwise fill the data volume.
*
* ``volatile`` puts it in the ring instead of the store — a frame a screen is
* watching now, which the oldest of falls out of memory rather than being
* kept. A worker on another host publishing a camera sends this.
* @param data The data for the request.
* @param data.name
* @param data.mediaType
* @param data.volatile
* @returns ArtifactRef Successful Response
* @throws ApiError
*/
@@ -135,7 +140,8 @@ export class ArtifactsService {
url: '/api/v1/artifacts',
query: {
name: data.name,
media_type: data.mediaType
media_type: data.mediaType,
volatile: data.volatile
},
errors: {
422: 'Validation Error'