Skip to content

feat: Engine durability hardening + dashboard redesign#9

Merged
kasvith merged 16 commits into
mainfrom
feat/dashboard-upgrades
Jun 24, 2026
Merged

feat: Engine durability hardening + dashboard redesign#9
kasvith merged 16 commits into
mainfrom
feat/dashboard-upgrades

Conversation

@kasvith

@kasvith kasvith commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

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

  • Lock fencing + ownership guards on job claim so a recovered/stale worker
    can't resume a job that's since been re-claimed (FOR UPDATE SKIP LOCKED
    plus a fence token).
  • Durable retries with backoff and a per-step :timeout.
  • Child-workflow linkage — parallel children and call_workflow /
    start_workflow sub-workflows are linked to their parent execution.
  • Sleep/wait correctness — a dedicated sleep waker; :waiting suspension
    markers no longer drift the live window.
  • Tests de-mocked — real Postgres-backed suites for parallel race, retries,
    the query API, timeout-worker integration, and a concurrency integration test.

⚠️ Requires migrations. Two new engine migrations ship here
(v20260623000000_add_lock_fencing, v20260623000001_add_child_workflow_link).
Run Durable.Migration.up() (the demo's upgrade migration is included as an
example).

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.

  • Shell — sidebar grouped into Observe / Operate with the live-rail
    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).
  • Shared primitiveslabel / field / field_list, local_time plus a
    future-aware relative_time with JS-localized tooltips, a JSON highlighter,
    DataTable label-idiom headers, and the shared LogLine / StepDetail
    components reused across tabs and the flow inspector.
  • Workflow flow-graph island — ReactFlow nodes (step, start, end, gateway,
    child-workflow) + animated status edge, dagre layout, runtime status overlay.
  • Detail tabs — Summary, Logs, Timeline (absolute-time Gantt with a frozen
    gutter), History (vertical trace spine), I/O.
  • List / overview pages — a segmented status-readout cluster on Overview
    and the Workflows cards, the executions list on DataTable, Settings field-list.
  • Design decisions codified in 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:

  • ⌘K palette is now live. It had shipped unmounted (the trigger dispatched
    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 (latest
    executions). Live data is snapshotted on open, filtered in-memory per keystroke;
    the selected row carries the live rail + a hint.
  • Topbar command toolbar — compact ⌘K trigger (width hugs content, no dead
    middle gap, single ⌘K chip), a hairline divider, then running version ·
    GitHub link · theme toggle as ghost icon controls (github brand icon
    added to Core.icon).
  • Pulse brand mark — replaces the tinted "monitor tile + dot"; indigo stays
    earned by the live signal rather than spent on a branded surface.
  • Step inspector — widened the shared StepDetail panel cap
    (max-w-4xlmax-w-5xl); I/O JSON boxes now fill their column and the grid
    collapses 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)

  • Copy to clipboard — a Core.copy_button primitive (one delegated
    listener, no per-button hook) baked into every JSON block plus opt-in on the
    execution id and Settings config values.
  • Step inspector now fills its container (cap removed); plain-text log
    messages render in a framed code block instead of bare text.
  • Faceted Executions filter bar — replaces the (exact-match!) free-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_filters clauses (:id, :id_prefix,
    multi :status) with tests.
  • READMEs refreshed for the current dashboard IA and features.

Testing

  • Dashboard: 114 tests green; covers core primitives (incl. local_time /
    future relative_time), DataTable, LogLine, Timeline, flow graph, tabs, routes,
    the command palette, and the faceted ExecutionFilters bar.
  • Engine: compiles --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) is
independent of the dashboard. Within the dashboard, c433ebb (shared
primitives) is the foundation the rest build on; a1b2590 is the latest
chrome/inspector polish.

Note: bundled assets (priv/static) are committed alongside the changes that
need them; the .claude/settings.json toggle is 4013a84.

kasvith added 13 commits June 24, 2026 10:45
…, 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.
@kasvith kasvith changed the title Engine durability hardening + dashboard redesign feat: Engine durability hardening + dashboard redesign Jun 24, 2026
kasvith added 3 commits June 24, 2026 12:53
…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).
@kasvith kasvith merged commit f3d0742 into main Jun 24, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant