Workflows are data
A workflow is a versioned JSON document: a DAG of operator calls with no floating-point numbers, hashed with JCS and BLAKE3. It can be diffed, approved, replayed and exported, because it is not code.
Ogun is a local-first runtime for acquiring and transforming data on a schedule, built on the Zeus download engine. Workflows are versioned JSON documents. A run that crashes resumes with only the unfinished partitions.
ogun validate examples/bikeshare/trips-backfill.workflow.jsonRuns with ogun 0.0.1a, a pre-alpha for Windows and Linux, on the sample workflows in the ogun repository. Download it or try the hosted hub.




A backfill commits one partition at a time to a journal. Kill the daemon halfway and start it again: only the partitions that had not finished run.
121 of 121 partitions done. A second backfill over the range has 0 to run.
crates/ogun-daemon/tests/exit.rs (a partition is done under O-01 section 5.3 and skipped as up to date under O-04 section 4). Drawn, not recorded: the transcript below is.$ ogund & $ ogun daemon status ogund 0.0.1-alpha up since 2026-10-26T03:38:27.353Z workflows 0 active runs 0 pending approvals 0 streams 0 scheduler on connection human (not interactive) $ ogun put exit-backfill.workflow.json exit-backfill v1 stored b10f029c3d5e2a89a6cf7cd4ea530883283d3ad04f58fdf3b145246ea98c6fdb warning ir.node_has_no_inputs at /nodes/0/inputs: manifest does not start a DAG and nothing feeds this node. runnable now $ ogun backfill exit-backfill --from 2024-01-01 --to 2024-04-30 exit-backfill 2024-01-01 .. 2024-04-30: 121 to run, 0 up to date missing 121 2024-01-01 .. 2024-04-30 dry run; pass --yes to start it $ ogun backfill exit-backfill --from 2024-01-01 --to 2024-04-30 --yes exit-backfill 2024-01-01 .. 2024-04-30: 121 to run, 0 up to date missing 121 2024-01-01 .. 2024-04-30 orun_01M5V4KGACEC47NZK30319FE9W started, 121 partition(s) $ ogun partition-status exit-backfill exit-backfill b10f029c3d5e2a89a6cf7cd4ea530883283d3ad04f58fdf3b145246ea98c6fdb done 30 2024-01-01 .. 2024-01-30 running 91 2024-01-31 .. 2024-04-30 # ogund killed here (SIGKILL; TerminateProcess on Windows) $ ogund & $ ogun partition-status exit-backfill exit-backfill b10f029c3d5e2a89a6cf7cd4ea530883283d3ad04f58fdf3b145246ea98c6fdb done 66 2024-01-01 .. 2024-03-06 running 55 2024-03-07 .. 2024-04-30 $ ogun partition-status exit-backfill exit-backfill b10f029c3d5e2a89a6cf7cd4ea530883283d3ad04f58fdf3b145246ea98c6fdb done 121 2024-01-01 .. 2024-04-30 $ ogun show orun_01M5V4KGACEC47NZK30319FE9W | grep "attempt [2-9]" m [2024-02-01] Succeeded (OutputsCommitted) attempt 2 m [2024-02-02] Succeeded (OutputsCommitted) attempt 2 m [2024-02-03] Succeeded (OutputsCommitted) attempt 2 m [2024-02-04] Succeeded (OutputsCommitted) attempt 2 # 4 of 242 node instances ran again; the other 238 were not touched $ ogun backfill exit-backfill --from 2024-01-01 --to 2024-04-30 exit-backfill 2024-01-01 .. 2024-04-30: 0 to run, 121 up to date done 121 2024-01-01 .. 2024-04-30 dry run; pass --yes to start it


A workflow moves data through eight stages. Each stage is a node or a group of nodes in the run, and all of them write to the same lineage graph.
A workflow is a JSON document: validated, hashed, diffed and approved before it runs. YAML and a Python SDK are planned; they will compile to the same IR.
{
"ir_version": 0,
"workflow": "trips-backfill",
"version": 1,
"description": "Every station of the network, month by month since 2019, from the public open-trips archive, reduced to trips per station per day. A partitioned backfill: a crash resumes only unfinished months.",
"triggers": [
{
"kind": "cron",
"cron": "10 2 4 * *"
}
],
"partitions": {
"kind": "time",
"granularity": "month",
"start": "2019-01"
},
"budgets": {
"bytes": 2147483648,
"wall_ms": 7200000
},
"nodes": [
{
"id": "stations",
"op": "crawl@1",
"config": {
"start": "https://api.open-trips.example.org/v1/stations?limit=1000",
"headers": {
"X-API-Key": {
"secret_ref": "archive_key"
}
},
"select": {
"json_path": "$.results[*].id"
},
"emit": "https://open-trips-archive.s3.amazonaws.com/trips/station={id}/year={partition.year}/month={partition.month}/"
}
},
{
"id": "fetch",
"op": "acquire@1",
"inputs": [
"stations.urls"
],
"config": {
"allowed_domains": [
"open-trips-archive.s3.amazonaws.com"
],
"listing": "s3_prefix"
},
"policy": {
"retries": 5,
"concurrency": 4
}
},
{
"id": "daily",
"op": "sql@1",
"inputs": [
"fetch.artifacts"
],
"config": {
"table": "trips"
},
"code": {
"blake3": "7e92f3fe649e617e27e91a609efcd89955192c39f887c940c9e98610fc961448",
"path": "examples/bikeshare/ops/trips_monthly.sql"
}
},
{
"id": "publish",
"op": "duckdb@1",
"inputs": [
"daily.tables"
],
"config": {
"write": "trips_daily.parquet"
}
}
]
}$ ogun validate examples/bikeshare/trips-backfill.workflow.json trips-backfill v1: valid, 4 nodes workflow hash c4699a1616aada04c07e9dfbeacb49195593fd5128ba8076a65d2ffa9ffbcf19 models not used; runs with no model access user code daily (approval bound to this hash) $ ogun validate examples/bikeshare/rebalance-plan.workflow.json rebalance-plan v1: valid, 3 nodes workflow hash 087b2bb2dcd1be4b446320d0fd2a1d6c8eb80d0798b41420b02fcc34cce16cd0 models not used; runs with no model access user code estimate (approval bound to this hash) $ ogun hash examples/bikeshare/rebalance-plan.workflow.json 087b2bb2dcd1be4b446320d0fd2a1d6c8eb80d0798b41420b02fcc34cce16cd0
$ ogun diff examples/bikeshare/rebalance-plan.workflow.json examples/bikeshare/rebalance-plan.v2.workflow.json v1 -> v2 087b…6cd0 -> b90b…2a18 ~ estimate (config, code) needs approval: {"reason":"code_changed","node":"estimate"} [exit status 1]
$ ogun partitions examples/bikeshare/trips-backfill.workflow.json --from 2019-01 --to 2026-09 93 partitions complete: 2019-01 .. 2026-09 to run 93 (2019-01 .. 2026-09) up to date 0 $ ogun next examples/bikeshare/district-report.workflow.json 2026-11-02T03:00:00.000Z
examples/bikeshare in the ogun repository; the terminal tabs are real output, captured 2026-10-26 with ogun 0.0.1-alpha on Windows 11. IR v0 is a draft (O-02, Draft 2) and may change.

Ogun Studio ships in the release for Windows and Linux. On the hosted hub it runs on the real daemon with sample workflows: runs, partitions, approvals, artifacts and lineage.


trips-backfill workflow, 36 monthly partitions done and 9 missing. Studio draws one cell per key, as the strip above does.

Ogun embeds zeus-core, the Rust engine behind the Zeus app: segmented transfers, a crash-safe journal, validator checks before every resume, SHA-256 and BLAKE3 verification, and polite defaults.
Sources behind your browser login are the one exception: Ogun never holds cookies. It asks the Zeus daemon, as a service client, to acquire them, and imports the result with its provenance. That bridge is built and tested against a fake zeusd, not yet against a real one.


Every artifact is content-addressed and recorded with the run, node and partition that produced it. Parents and operator versions are carried in the lineage events.
{
"artifact_id": "art_01M5V4KHKAJP8EZQEE9BNRKEAP",
"blake3": "826a435cc93bbcae8f876f5c8c036d1a7879c8b2b0f2b4d36e34565fddb9c419",
"size_bytes": 98,
"media_type": "application/json",
"run_id": "orun_01M5V4KGACEC47NZK30319FE9W",
"node": "m",
"partition": "2024-01-01",
"output": "manifest",
"committed_at": "2026-10-26T03:38:28.852Z"
}ogun artifacts --json, captured 2026-10-26 with ogun 0.0.1-alpha on Windows 11. Its BLAKE3 digest is its address in the store.artifacts/store.json {"format":"zeus-artifact-store","format_version":1,"object_algorithm":"blake3","fanout":[2,2],"index":"redb"}
objects/blake3/00/f4/00f4e791631167aabc7c951e4df7b4fe88bc5c253efef2ef37d1bc32825e33a2
objects/blake3/04/74/0474f23641f77e2f6054af901e6005485fd1e2480b1bd27f476a4e833c452711
objects/blake3/05/e9/05e9911c8ce2e14519b49569c9f6010b65738e9530b4c9eb125f084e660084e1
objects/blake3/07/06/0706905f576ea69a5ee852e1adebfa82fe99281d0684eca708e60ed6fc42c51b
... 121 objects in all, one per distinct content

A benchmark is a controlled set of runs, each with a workflow, environment, agent, policy, inputs and evaluator. Ogun reads existing task formats and records cost, efficiency and recovery alongside the official score.
Adapters for Spider 2.0-DBT, ADE-bench and Terminal-Bench 2.0 tasks in the Harbor format are written. Their task formats come from public descriptions and are not yet verified against the official releases, so there are no results. The benchmark binary is not part of release 0.0.1a.
Cs = Σi costi / successful tasks
Compares agents at the same pass rate by what each success costs.
interventions / run
How often a person or an outside recovery had to step in.
useful tool calls / all tool calls
Proxies: duplicate, failed and repeated commands; files re-read.
HGE(H) = (1/N) Σm [ Score(m, H) − Score(m, Hbase) ]
How much capability a harness unlocks across N models.


Each traces to an architecture decision record. ADRs 0002 to 0005 are accepted.
A workflow is a versioned JSON document: a DAG of operator calls with no floating-point numbers, hashed with JCS and BLAKE3. It can be diffed, approved, replayed and exported, because it is not code.
Every node instance, checkpoint and artifact edge is journaled. If the daemon is killed or the machine restarts, the run resumes and completed partitions are not fetched again.
Outputs are content-addressed artifacts that know their parents, the operator and version that made them, the model and prompt hash if any, and the run that produced them.
Acquisition runs on zeus-core: segmented, resumable, verified transfers with a crash-safe journal, written in Rust and shared with the Zeus app.
DuckDB, dbt, Polars, ffmpeg, pandoc, OCR engines and Python run as out-of-process operators. Integrations for Airflow, Dagster, Prefect and Kestra start and watch Ogun runs; they are in the repository and not yet released as packages.
A new or changed code hash, a larger budget, a first model operator and any node whose policy asks every time need a human approval bound to the request hash. No agent channel can approve.


Ogun orchestrates tools you already trust as out-of-process operators with pinned versions, and has integrations for the orchestrators you already run.
Names belong to their owners and indicate compatibility, not endorsement. The orchestrator integrations are in the repository, not yet on PyPI, and were tested against fakes rather than the real services.


Ogun is a local-first developer platform for data acquisition, data engineering and AI-agent benchmarks, made by Verne. It turns authenticated, messy web and filesystem sources into verified, reproducible datasets on a schedule, and it can run benchmark tasks for data and terminal agents in isolation. It is built on the Zeus download engine.
As a pre-alpha. Release 0.0.1a has Ogun Studio for Windows and Linux and the ogun and ogund binaries, and a hosted hub runs Studio on the real daemon with sample data (see Get started). The runtime passed its phase O1 exit test on Linux in October 2026: a partitioned backfill and a stream window survive kill -9 of the daemon and resume only the unfinished work. Code operators, remote approvals and most connectors are not ready; expect breaking changes. See the roadmap.
No. Ogun contains enough durable orchestration to run acquisition and data workflows by itself, but its job is materializing trustworthy artifacts. It is designed to be called from orchestrators as a task, resource or operator, not to replace them.
The workflow is hashed; operators are pinned by version and content hash; inputs are content-addressed artifacts; model calls record the model and a prompt hash; and every output records its parents. Re-running a version with the same inputs is a lookup, not a guess.
Adapters for Spider 2.0-DBT, ADE-bench and Terminal-Bench 2.0 tasks in the Harbor format are written; their task formats are still being checked against the official releases. Official evaluators run unmodified and their versions are recorded. Ogun does not invent a competing task format.
The decisions and first-draft specifications are public, and the runtime is being tested. Feedback is most useful now, before the contracts are frozen.