feat: Engine durability hardening + dashboard redesign#9
Merged
Conversation
…, child workflows Lock fencing + ownership guards on job claim, durable retry/backoff with step timeout, child-workflow linkage, a dedicated sleep waker, and the lock-fencing + child-workflow-link schema migrations.
Real Postgres-backed suites replacing mocks: parallel race, retry/backoff, query API, timeout-worker integration, and the integration/concurrency tests.
Sidebar grouped into Observe/Operate with the live-rail active marker and the heartbeat brand mark; command-bar topbar ("Jump to…"); refined tokens. Direction, live-rail signature and status-readout pattern codified in DESIGN.md.
Core label/field/field_list, local_time + future-aware relative_time with JS-localized tooltips, JSON highlighter, DataTable label-idiom headers, and the shared LogLine / StepDetail components reused across tabs and the flow inspector.
graph_builder + ReactFlow nodes (step, start, end, gateway, child-workflow) and the animated status edge, with dagre layout and runtime status overlay.
Summary, Logs, Timeline (absolute-time Gantt with frozen gutter), History (vertical trace spine) and I/O tabs sharing LogLine/StepDetail; the workflow_live tab shell.
Segmented status-readout cluster on Overview and the Workflows cards, executions list on DataTable, Settings field-list, plus the routes/paths they need.
Specs for core primitives (incl. local_time / future relative_time), DataTable, LogLine, Timeline, flow graph, workflow tabs and routing.
Rebuilt app.css / app.js and the flow-graph + xyflow vendor chunks for the redesign.
Phoenix demo dev config, the example drip-email-campaign workflow, home LiveView, the durable upgrade migration, and the root mix.lock.
…ider inspector Sidebar - Replace the tinted "monitor tile + dot" brand with a pulse mark: a muted oscilloscope baseline + one indigo beat with a led-dot blip at its apex (the worker heartbeat made literal). Drops the branded tint so indigo stays earned by the live signal; rebalances the wordmark (lowercase mono "console"). Command palette (⌘K) - Wire the palette into Layouts.app (it was built but never mounted, so ⌘K and the "Jump to…" button did nothing). Thread `durable` through all 7 LiveViews so it can query. - Rewrite it to search the console's nouns, grouped: Go to (pages, incl. the previously-missing Executions), Workflows (live list_workflows), Recent runs (latest executions). Live data is snapshotted on open and filtered in-memory per keystroke. Selected row wears the indigo live rail + a ↵ hint; nav wraps across groups. Topbar - Rework the right cluster into a toolbar: compact ⌘K trigger (width hugs content — no dead gap, single ⌘K chip), hairline divider, then a meta group with the running version, a GitHub link, and the theme toggle (ghost icon controls). Add a `github` brand icon to Core.icon. Step inspector - Widen the shared StepDetail panel cap max-w-4xl -> max-w-5xl. Make the I/O JSON boxes fill their column (w-full) and collapse to a single full-width column when only one side has data, so a cron step's output isn't penned into a half-panel beside an empty "No input" cell. DESIGN.md updated for each (brand mark, live-rail list, palette pattern, topbar toolbar, brand-icon viewBox rule, StepDetail I/O layout). Bundled app.css rebuilt.
…cutions filters
Copy to clipboard
- New `Core.copy_button` + `clipboard` icon, driven by one delegated listener
(hooks/copy.ts) — buttons are plain `data-copy` markup, no per-button hook/id.
Clipboard ⇄ check swap via `.copy-btn[data-copied]` CSS.
- Baked into `Core.json` (every JSON block: step I/O, error, I/O tab, child
preview, flow inspector, log payloads) with a plain-text twin of the
highlighter so the copy matches what's shown. Opt-in `<.code copy={…}>` on the
execution id and Settings config values.
Step inspector
- Plain-text log messages now render in a framed code block (matching the JSON
boxes) with a copy button, instead of bare mono text.
- `StepDetail` fills its container (dropped the max-width cap); the I/O grid
collapses to one full-width column when only one side has data.
Faceted Executions filter bar
- Engine: add `:id`, `:id_prefix` (uuid::text LIKE), and multi `:status` (IN)
clauses to `Query.apply_filters` (+ tests).
- New `ExecutionFilters` LiveComponent: workflow combobox (autocomplete from the
known names — replaces exact-match free-text search), status multi-select, time
presets + custom UTC range (→ :from/:to), execution-id prefix filter with
jump-on-full-uuid. Server-side popover state; close via click-away/Escape.
Active facets fill neutral (indigo stays reserved for live/now/here).
- ExecutionsLive: URL params (workflow/status[]/range/from/to/id) are the source
of truth for both the bar and the table; DataTable renders rows with filters=[].
- Tests: engine filter clauses + ExecutionFilters render. DESIGN.md updated
(copy_button, faceted filter bar, StepDetail I/O). Bundled assets rebuilt.
- durable_dashboard/README: Features + URL surface updated for the Executions page and its faceted filter bar (workflow/status/time/id), the current detail tabs (Summary/Flow/Timeline/Logs/I/O/History, drop the stale "topology"), the ⌘K palette (jump to page/workflow/run), and copy buttons. - durable/README: mirror the dashboard feature bullets. - examples/phoenix_demo/README: fix the dev URL (port 4005, /dashboard mount).
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.
Summary
Two bodies of work on this branch: hardening the durable execution engine
for correctness under concurrency, and a ground-up visual redesign of the
dashboard around a single design direction. Grouped into 14 dependency-ordered
commits so the history reads as a progression (shared primitives land before the
surfaces that consume them; tests and rebuilt assets come last).
Engine — durability & correctness
can't resume a job that's since been re-claimed (
FOR UPDATE SKIP LOCKEDplus a fence token).
:timeout.call_workflow/start_workflowsub-workflows are linked to their parent execution.:waitingsuspensionmarkers no longer drift the live window.
the query API, timeout-worker integration, and a concurrency integration test.
(
v20260623000000_add_lock_fencing,v20260623000001_add_child_workflow_link).Run
Durable.Migration.up()(the demo's upgrade migration is included as anexample).
Dashboard — redesign
One direction runs through every surface: an instrument panel for durable
execution. The indigo accent now carries a single meaning — now / live / you
are here (active nav, running graph edge, in-flight timeline bars). Machine
facts render in mono, human prose in Inter. Status is the only decorative color.
active marker and the pulse brand mark (a muted oscilloscope baseline + one
indigo heartbeat beat — the worker heartbeat made literal); topbar command
toolbar (⌘K trigger · version · GitHub · theme).
label/field/field_list,local_timeplus afuture-aware
relative_timewith JS-localized tooltips, a JSON highlighter,DataTable label-idiom headers, and the shared
LogLine/StepDetailcomponents reused across tabs and the flow inspector.
child-workflow) + animated status edge, dagre layout, runtime status overlay.
gutter), History (vertical trace spine), I/O.
and the Workflows cards, the executions list on DataTable, Settings field-list.
durable_dashboard/DESIGN.md(direction,live-rail signature, status-readout pattern).
Follow-up polish (
a1b2590)A pass over the chrome and the step inspector after using it on real data:
to nothing), so it's wired into the app shell and rewritten to search the
console's nouns, grouped — Go to (pages, incl. the previously-missing
Executions), Workflows (live
list_workflows), Recent runs (latestexecutions). Live data is snapshotted on open, filtered in-memory per keystroke;
the selected row carries the live rail + a
↵hint.middle gap, single
⌘Kchip), a hairline divider, then running version ·GitHub link · theme toggle as ghost icon controls (
githubbrand iconadded to
Core.icon).earned by the live signal rather than spent on a branded surface.
StepDetailpanel cap(
max-w-4xl→max-w-5xl); I/O JSON boxes now fill their column and the gridcollapses to one full-width column when only one side has data, so a cron
step's output isn't penned into a half-panel beside an empty "No input" cell.
Copy, full-width inspector, faceted filters (
9341826,c2be144)Core.copy_buttonprimitive (one delegatedlistener, no per-button hook) baked into every JSON block plus opt-in on the
execution id and Settings config values.
messages render in a framed code block instead of bare text.
search with a query-builder: workflow combobox (autocomplete from known
names), multi-select status, relative/custom time range, and an execution-id
prefix filter with jump-on-full-uuid. URL-param driven, so filtered views are
shareable. Backed by new
Query.apply_filtersclauses (:id,:id_prefix,multi
:status) with tests.Testing
local_time/future
relative_time), DataTable, LogLine, Timeline, flow graph, tabs, routes,the command palette, and the faceted ExecutionFilters bar.
--warnings-as-errors; new DB-backed concurrency / retry /race / query suites (need Postgres on the test port), incl. the new
id / id-prefix / status-list / time filter clauses.
Reviewing
Commit-by-commit is the intended path. Engine (
6b56c35,53f7ea5) isindependent of the dashboard. Within the dashboard,
c433ebb(sharedprimitives) is the foundation the rest build on;
a1b2590is the latestchrome/inspector polish.