New Features
Cron Scheduling for Workflows, Pipelines, and Agents
Workflows, Airway ELT pipelines, and analytics agents can now run on a cron schedule, with a full CRUD surface in workspace settings. Previously, every run was tied to an explicit HTTP request — now Oxy ships a durable standalone consumer that drives scheduled jobs across replicas.- Schedules settings panel — A new Schedules section under Settings → Workspace lists every schedule with its next and last run, enable toggle, run-now, edit, and delete actions. The create/edit dialog includes a hand-built visual cron builder with a populated target picker (workflow files, Airway pipelines, agents) and an IANA timezone select.
- Cron-driven targets across the platform — A schedule can target a workflow file, an Airway ELT pipeline, or an analytics agent. Agent schedules carry a required
questionfield, so each tick fires the agent with a fixed prompt and threads results into the run history. - Exactly-once across replicas — Schedules tick through a CAS-based
next_run_atclaim, so multiple Oxy processes can run side by side without double-firing. Missed runs from extended downtime collapse to a single execution rather than replaying. - Per-schedule observability — Each schedule surfaces its last error (with a destructive icon and tooltip when set) and clears it on success. A per-schedule duration-spike anomaly feed surfaces runs that take meaningfully longer than the recent baseline.
- Cross-process cancel — Cancelling a scheduled run from the dashboard works even when the run is executing on a different process. A persistent
cancel_requested_atflag is polled by the executing worker, so cancels are no longer tied to the originating HTTP connection. - Workspace-scoped — Schedules and the runs they produce are scoped per workspace; tenants see only their own schedules even on shared deployments.
- Inert by default — Scheduled firing is gated behind the
OXY_INPROC_GLOBAL_WORKERenvironment flag. With the flag off, behavior matches today’s release — schedule CRUD still works (defining a schedule is harmless), but the periodic loop, latency worker, and tick do nothing.
Orchestrator Dashboard (Coordinator Redesign)
The Coordinator surface is rebuilt as a three-tab Orchestrator dashboard, giving a single place to see job health, manage schedules, and inspect individual runs across workflows, ELT pipelines, and agents.- Overview tab — Health cards, a swimlane timeline (lanes for each run type with a “now” marker) with a board toggle, and an anomaly feed for failures and duration spikes.
- Jobs tab — Catalog of every schedule with filter, search, enable toggle, run-now (with confirm), edit, and delete actions. A Job Detail view shows the schedule definition with the next five runs in its timezone, a health card with a missed-run audit and a Backfill button, and per-job run history. The backfill dialog computes a live blast radius before queuing.
- Runs tab — URL-synced filters (copy the URL → filters survive), a trigger column labeling each run as
scheduled/manual/backfill/retry, list-level cost hints on agent rows with LLM activity, bulk retry and cancel respecting actionable counts, and aSystem: off/ontoggle that hides preagg cycles and other system-managed runs from the feed by default. - Polymorphic Run Detail — Each run type shows the right view at the top of its detail page:
- Agent runs — an LLM Usage card with tokens in/out/cache, dollar cost, and model list.
- Workflow runs — a per-step timing card with hot-spot marker.
- ELT runs — a per-table row-count card with extract/load phase durations and drop warnings.
- Bulk retry — Bulk retry on the Runs tab clones the failed runs as new attempts, so backfills and recoveries don’t require manual one-at-a-time replays.
- Per-tenant correctness — Every coordinator endpoint (list, active, tree, retry, recovery, queue, live SSE) is now scoped by
workspace_idfrom the URL. Multi-tenant deployments no longer expose runs across workspace boundaries.
Semantic Pre-Aggregation Rollups
Semantic-layer queries can now be served from locally-materialized Parquet rollups instead of round-tripping to the warehouse, with a background worker that keeps them fresh.- Background pre-aggregation worker — A coordinator-driven worker evaluates each rollup’s
refresh_key, rebuilds stale rollups in parallel, and materializes results to local Parquet via a hot-swap rename. Empty rollups don’t poison the manifest, and crash-recovered cycles are retried from scratch on the next tick. - Fast path on every semantic query surface — The local Parquet path is wired into every place semantic queries execute: workflow and procedure
semantic_querysteps, the IDE Run button on/semantic, the analytics agent pipeline (both serial and fan-out execution), and the Builder’ssemantic_compilertool. When a query matches a fresh rollup, it serves from Parquet via an in-process DuckDB instance; otherwise it falls back to the warehouse. - Three-layer freshness — Per-query freshness is verified by an in-memory cache, the on-disk manifest’s
build_date(which survives restarts), and a SQLrefresh_keycheck against the warehouse. The operator-configurablepre_aggregations.refresh_worker.renewal_thresholdcontrols how aggressively the worker rebuilds. - Pre-aggregation badge in the UI —
QueryExecutedevents now carry anis_preaggflag. Analytics agent thread SQL blocks, workflowsemantic_queryresults, and procedure runs all surface a Pre-aggregated badge so users can see at a glance which queries served from a rollup. - Rollup explorer integration — The semantic explorer surfaces rollup detail with click-to-apply dimensions and measures, so it’s easy to see which rollups feed which questions.
Workspaces in Git Subdirectories
Oxy now supports git repositories where the workspace lives in a subdirectory, not at the repo root — a common pattern when several Oxy workspaces share a single repo.- Automatic git root discovery — Workspace tooling now walks up from the workspace directory to find the actual
.gitentry, mirroring git’s own discovery behavior. Git operations resolve to the correct repo regardless of where in the tree the workspace lives. - Correct GitHub URLs from the IDE header — Links from the IDE now include the subdirectory path (
/tree/<branch>/packages/my-app) so they jump to the right folder on GitHub. Workspaces at the repo root continue to work unchanged.
Platform Improvements
Pre-Aggregation Reliability
- Crash-recovery for stuck pre-aggregation cycles — Any pre-aggregation runs left in
runningat startup are now marked failed so the next tick can retry from scratch, instead of blocking the worker indefinitely. Database errors during recovery are logged rather than silently swallowed. - Workspace-scoped pre-aggregation runs — Pre-aggregation runs now carry a
workspace_idso the worker schedules and tracks them per tenant. Fixes a compile-time regression where the background worker hadn’t been updated to the new run-insertion signature. - Defensive overflow handling on
Everyintervals — Extremely largeEveryinterval values no longer cause spurious continuous rebuilds. The overflow case is logged with the interval and rollup hash and treated as “always fresh” until the misconfiguration is corrected.
Workspace Examples
- Missing example view restored — The starter workspace shipped without one of its expected example
.view.ymlfiles, which broke a downstream example dashboard. The missing view is now included again sooxy initworkspaces work end-to-end out of the box.