Minimal workspace UI: one canvas over an ingest run - #142
Draft
kstonekuan wants to merge 1 commit into
Draft
Conversation
The workspace UI as a single screen people already know how to read: a left-to-right node graph with a breadcrumb, an inspector, and one thing to learn -- a node with a chevron opens. Two branches leave the run, because a run has two things worth following: run -> stage -> steps the orchestration, and the code inside it run -> episodes -> episode the data it produced Every judgement about what is honest to draw lives in one pure function, src/canvas/buildGraph.ts, tested without a browser. The rule it keeps is that an edge means a real dependency: - The run level merges each stage's gate and trigger into one node and drops the shortcuts the stage chain already implies, turning a nine-rank ribbon into a five-node line. Both task ids, states and durations stay on the node, so the summary hides nothing. - The stage level expands the mapped process_batch into one node per batch while that is readable, and into one stacked node carrying the state split once it is not. The stacked node takes the WORST state in the fan, so one failure among a hundred successes is still what you see. - The steps level draws a tier as a column and arrows only at the boundaries that are real, because the server is explicit that registered steps have no dependency edges on each other. - The episodes branch hangs off the RUN, not off a stage, and filters on every stage run id at once. Measured, not assumed: the catalog's episodes view is one row per episode, so a per-stage question answers 0 for every stage the same ingest later superseded. src/apiSchema.ts is generated from the server's own OpenAPI declaration and CI fails if it goes stale, so nothing in the client hand-copies a payload field. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
kstonekuan
marked this pull request as draft
August 24, 2026 07:43
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A second attempt at the workspace UI, built to test one question: is a single drill-down canvas more useful than the multi-page app in #87?
It looks like a workflow builder because that is what people already know how to read: a left-to-right node graph, a breadcrumb, an inspector on the right, and one thing to learn — a node with a
>opens.The shape
Two branches leave the run, because a run has two things worth following:
process_batchfan-out, the budget gateThe last two are the drill-down that
episodes.orchestrator_run_id(#140) unblocked.Where the decisions live
src/canvas/buildGraph.tsis the whole thing:focus + server payloads -> nodes and edges, pure, and tested without a browser. Its rule is an edge means a real dependency:enabled_<stage>andtrigger_<stage>into one node and drops the shortcuts the stage chain already implies. That turns a nine-rank ribbon — which only fit on screen at a zoom nobody could read — into a five-node line. Both task ids, both states and both durations stay on the node, so the summary hides nothing.process_batchinto one node per batch while that is readable, and into one stacked node carryingmapped_summary.by_stateonce it is not. The stacked node takes the worst state in the fan, so one failure among a hundred successes is still what you see.hflow_server._graphis explicit that registered steps have no dependency edges on each other.episodesview is one row per episode (latest append wins), so asking per stage returnstotal: 0for sync, meta and labels in a full ingest and6only for media. The union is the honest question.Verification
buildGraphandlayoutGraph, plustsc --noEmitandbiome check.hflow serve— real bundle, real pipeline, real catalog, with only the Airflow HTTP calls stubbed. Light and dark.src/apiSchema.tsis generated from the server's own OpenAPI declaration; the new CI job fails if it goes stale, so nothing here hand-copies a payload field.Size
7,440 additions across 24 files, of which 2,245 are the generated schema and ~1,400 the lockfile — about 3,400 lines hand-written including tests and docs. #87 was 19,304 additions across 52 files.
Notes
openapi-typescriptdrives the compiler API throughts.factory, which TypeScript 7's native port does not expose, sopnpm gen:apidies on 7. Recorded inui/README.md.🤖 Generated with Claude Code