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
34 lines
796 B
Python
34 lines
796 B
Python
"""run.draft
|
|
|
|
A run submitted against the working copy validated the draft and then executed
|
|
what was published. The row now records which copy was asked for, so the
|
|
driver reads the same one the submit checked.
|
|
|
|
Revision ID: a8f6f79e40be
|
|
Revises: e7d3b1a9c624
|
|
Create Date: 2026-09-02
|
|
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = "a8f6f79e40be"
|
|
down_revision = "e7d3b1a9c624"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
# Not null with a default, so every run recorded before this reads as what
|
|
# it was: a run of the published flow.
|
|
op.add_column(
|
|
"run",
|
|
sa.Column("draft", sa.Boolean(), nullable=False, server_default=sa.text("0")),
|
|
)
|
|
|
|
|
|
def downgrade():
|
|
op.drop_column("run", "draft")
|