Skip to content

feat(ui): steadier orchestration pages, reviewed reruns and acknowledgements - #1409

Merged
kvlonge merged 26 commits into
mainfrom
feat/orchestration-ui-batch
Nov 11, 2026
Merged

kvlonge merged 26 commits into
mainfrom
feat/orchestration-ui-batch

Conversation

@kvlonge

@kvlonge kvlonge commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

Why

The orchestration UI felt slow and jumpy on a realistic project, a job selected with upstream sources ended partial with nothing wrong, and acknowledged problems kept their place on the overview. A DuckDB copy of DuckShop gives a realistic project to demonstrate against.

Changes

  • DuckShop: a generator writes a DuckDB copy of core DuckShop; an edge case covers a job selecting upstream sources.
  • Plan page laid out like sqb plan; every job run and every rerun is reviewed there before it starts.
  • One loading state everywhere, and pages no longer shift as they load (font wait, fixed-width top bar and toolbar, steady table headers).
  • Lineage: graph never hidden, opening SQL keeps the zoom, job groups collapse; a group run's timeline folds each job.
  • Overview: acknowledge a problem (append-only audit event, view permission); acknowledged items move to a collapsed list; one problem per job, and only a failure or a full run of the job replaces it.
  • Run log filters pick one level and one kind.
  • Worker: a build's selected sources succeed once the command returns and don't make a failed build partial; the server is unchanged, so mixed versions keep working.
  • Server: gzip for people's GET reads and UI assets.

Verification

  • make check-ci passes on the final head; svelte-check 0 errors; vitest 202 passed.
  • Orchestration native tests 126 passed; worker integration 30 passed, including a source-only success and a failed build with a source that still ends failed.
  • Acknowledgement API tests cover denial for unknown and other-location runs.
  • Inspected every affected page in a browser against the DuckDB demo; layout-shift records show the top bar and runs toolbar no longer move on load.

…tions

The script compiles the core project, translates each compiled model from
Snowflake to DuckDB with Polyglot plus DuckShop-specific rewrites, and writes
Snowflake functions DuckDB lacks as project SQL macros. The copy compiles with
no errors and builds every model on DuckDB; an E2E test runs the whole path.
A sql freshness query names the Snowflake raw table, which the DuckDB copy
does not have, so freshness failed and blocked the models reading that source.
Graphs stay hidden until their first fit has painted, so cards no longer
appear at unlaid-out positions and slide into place. The plan page keeps one
layout while it loads: one overlay covers the result from the first command
check until the plan arrives, and the side panel no longer appears late and
narrows the page.
…in the DuckDB copy

Formatted TO_TIMESTAMP calls now parse with their format instead of a plain
cast, so day-first hub tracking times are no longer NULL. REGEXP_SUBSTR and
REGEXP_LIKE now apply Snowflake's i, s and m flags, and e extracts the first
group, so case-insensitive matches such as supplier payment terms and refund
reasons resolve as they do on Snowflake.
Each first-fit attempt is bounded by a frame, so a fit the flow never runs
cannot keep the graph hidden, and an empty graph shows its controls.
The plan page now reads like the terminal plan: work that runs first, one
section per change with its query, config or schema diff, then the routine
models, functions, seeds and warnings. Unchanged tables and views are no
longer counted as skipped. The lineage graph moves to its own tab, and a
selection too large to draw shows only the models the plan changes.

A job run can reprocess a date range (latest data, yesterday, the last 7 or
30 days, or custom dates), kept in the command as its cursor-window flags.
Rebuilding from scratch leaves the run menu and is done by editing the
command. Run opens the plan page; with ?flow=panel it opens a side panel on
the job with the same range and a compact plan, while the two are compared.
…e panel

Pages now switch as soon as a link is clicked and show placeholder rows
until their first read answers, instead of holding the click for 200 ms
and showing loading text only after 400 ms. Page reads start when a link
is hovered, so they are usually ready by the click. List totals and tab
counts wait for the list instead of reading zero.

The lineage inspector keeps the selected node's facts while they reload
and shows the loading state for a newly selected node, instead of
showing the previous node and then flipping to Loading. The graph can
zoom out to the whole project, its page paints before the graph is
built, and a graph laid out before is not laid out again.
…b sidebar out in sections

Every job run now chooses its data in one place: the latest data, a date
range for jobs with a cursor, or a full refresh, in the plan page and the
side panel alike. An option still being typed in a job run's command,
such as `--`, holds Run until it is finished instead of being refused.

The job sidebar shows recent runs with their outcomes, what starts the
job and when, its definition and its settings, in headed sections like
the lineage inspector. A full refresh plan lists each materialization
with its model count.
…ide lists between node clicks

The run timeline moved its window to the server's clock on every answer,
which read the timeline again as soon as each answer arrived: jobs,
triggers, the newest runs and every trigger's ticks, several times a
second for as long as the overview or runs page was open. It now
follows the server's clock only when that is a minute away, and moves
on with time once a minute.

A node's detail reused nothing between clicks and read every check,
job and trigger in the project to show one node's. Those lists are now
kept until the next change signal, or a minute at most.
Browsers now receive the control API's reads and the embedded UI's
files gzip-compressed; a project's check or run listing is a tenth of
its size or less on the wire. Sign-in responses, which carry the CSRF
token, writes and the location API stay uncompressed, so a secret is
never compressed beside text a requester chose.
@kvlonge
kvlonge enabled auto-merge (squash) November 11, 2026 04:43
Drops the side-panel run flow that was offered for comparison, and the compact
plan layout only it used.
…most specific job

A node built by several member jobs is drawn in the job building the fewest
nodes, so a small job inside a broad one is no longer an empty box; each box
counts every node its job builds. A collapsed box shows only its header, and
lineage to its nodes meets the box.
A job selected with upstream operators (+model) includes the sources it
reads. A build never executes a source, so the worker reported each one as
skipped and every such run finished as partial with no failure behind it.
Runs now record and report only the nodes they execute; a source in a
build's selection gets no node row and no outcome.
Anyone who can see a run can acknowledge it. Each acknowledgement and its
withdrawal is an append-only security audit event, and the overview moves
acknowledged items into a collapsed Acknowledged list with who and when.
The list now shows one problem per job, its latest finished run, so a
later success clears it and acknowledging never brings an older failure
back. A problem's detail names what went wrong (failed and skipped node
counts) instead of how the worker stopped.
…one level or kind

Rerunning from a run's page or from the runs list opens a review page with
the nodes each rerun repeats and the permissions it needs; nothing reruns
until Run is pressed, as for every other run. The log's level and kind
filters are single choices with All, like the checks page.
… worker

A build never runs a selected source, so the worker marked each one
skipped and a job selected with upstream sources ended partial with
nothing wrong. The earlier server-side exclusion broke older workers and
in-flight group runs during a server-first upgrade, so it is reverted:
the server again keeps a row per selection key, and the worker completes
a build's selected sources as succeeded once the command returns.
- The overview lists one problem per job; only a failure or a full run of
  the job settles it, so a cancelled or narrowed run never hides a failure.
- The rerun review page falls back to rerun all for an unknown mode, and
  after a partial failure narrows to the runs that didn't start.
- Pages no longer shift as they load: the first paint waits briefly for
  the web fonts, the top bar and runs toolbar hold their width, and the
  checks table keeps its header while rows load.
- Opening the SQL panel on the lineage graph keeps the zoom.
- A group run's timeline folds each job's nodes.
…succeed

Sources a build completes without running no longer count towards a
partial outcome, in the worker and in a group's parent, so a build whose
models all failed ends failed as before. The rerun page now leaves out
runs whose rerun already started, so Run never repeats one, and falls
back to rerun all for an unknown mode on several runs.
@kvlonge kvlonge added the full-verify Run the full Verify matrix on this pull request label Nov 11, 2026 — with Amp for GitHub
@kvlonge kvlonge changed the title feat(ui): steadier, faster orchestration pages and a DuckDB DuckShop demo feat(ui): steadier orchestration pages, reviewed reruns and acknowledgements Nov 11, 2026
@kvlonge
kvlonge disabled auto-merge November 11, 2026 09:40
@kvlonge
kvlonge merged commit 9e53736 into main Nov 11, 2026
49 checks passed
@kvlonge
kvlonge deleted the feat/orchestration-ui-batch branch November 11, 2026 11:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-verify Run the full Verify matrix on this pull request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant