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.