What actually runs today

Every result checked row for row against DuckDB

If it is on this list there is a test proving it, and 43 end-to-end scripts run against a real broker. What is missing is on what Ubik is not.

Real SQL

The DuckDB parser, binder and type system, with the full scalar surface. Three streaming extensions (TUMBLE, HOP, WATERMARK) shaped like Flink SQL. Nobody learns a DSL to sum counters per window.

Three window kinds

TUMBLE fixed, HOP sliding, SESSION gap-based and merging. Event-time, watermark-closed, emitted mid-stream. Late events are counted and reported before they are dropped.

Aggregates that survive a crash

count, sum, avg, min, max, first, last, arg_min, arg_max, string_agg, list, exact quantile and median, approx_count_distinct, approx_quantile. Each one checkpointable and bounded in memory, or refused at plan time rather than mis-saved.

Lookup joins, including ASOF

Enrich a stream against a bounded file, a host Arrow or pandas table, or a live Kafka changelog, with the versioned ASOF pick. Checkpoint-safe and parallel-safe, proven against a DuckDB JOIN oracle across SIGKILL cycles.

A quiet partition cannot wedge you

A watermark is the minimum across partitions, so one silent partition on an over-partitioned topic stalls every window and looks like a hang. An idle-partition timeout excludes it from the minimum, durably and visibly, and names it in the progress line.

Bigger than RAM

Aggregate state spills to NVMe past a memory budget, so state larger than memory does not OOM. Even a single group larger than RAM sorts, through a bounded external merge, for an exact quantile.

Kafka native, no migration

Source and sink over the Kafka protocol, against the Kafka, Redpanda, WarpStream or MSK you already run. Avro and JSON Schema read from a Confluent Schema Registry, or a local .avsc.

Credentials stay in the environment

TLS and SASL (SCRAM, PLAIN, OAUTHBEARER, mTLS) configured from env vars, proven against a real broker. Nothing sensitive reaches pipeline.json, logs, state or checkpoints. Broker settings the engine owns for correctness are refused, so config cannot silently break exactly-once.

No daemon, no control plane

ubik pipeline create, start, stop, list, logs. One detached process per pipeline, resumed from its last checkpoint across a restart. The OS is the supervisor. Every error carries a code, a message and what to do next.