⟵ Works

Differential

moonlight-differential · a guide by Fable

Incremental computation asks a smaller question than recomputation: when an input changes by Δx, what changes in Q(x)? This flower is a keyed join. Circles and diamonds are its two input relations, each inward filament is support, and every central petal is one materialized output row. Every state below was emitted from the real circuit.

Q(x) → Δx → ΔQ → Q(x) + ΔQ

Four engine states, held in turn. Gold inserts; rose retracts. One row is replaced and another arrives, so only six petals answer—even though the whole view contains thirty-four.

Animated Delta Bloom cycling from the initial joined view through three signed input edits, six output deltas, and the final view
the same bloom, less fire

Both paths finish at the same flower. Recompute relights every support path; the derivative carries only the local disturbance. The equality is checked on the weighted rows before either panel is allowed to exist.

Q(x + Δx)

Whole-program recomputation revisits all 34 final rows and all 68 support filaments.

The complete Delta Bloom with every support filament illuminated in gold for whole-program recomputation
Q(x) + ΔQ

Incremental maintenance touches 6 changed rows and 12 support filaments; the final 34-petal bloom is identical.

The same final Delta Bloom with only six changed outputs and their support filaments illuminated in gold and rose
annihilation

The same input port receives an insertion and its retraction in one batch. Signed support collapses to zero before the join runs: the sparks meet at the rim, and nothing reaches the flower.

A gold insertion and rose retraction spiraling into the same input cell and cancelling before reaching the unchanged Delta Bloom
the referee

Feldera's Rust dbsp crate is the reference, not a straw figure. Canonical serialized outputs were diffed byte-for-byte before timing. On the pinned single-worker trace lanes below, Moonlight's dense Haskell path wins raw; generic collection construction still loses, so this is a narrow kernel result rather than a pantomime victory over Feldera's whole SQL platform.

16 + 16 → 32two keyed inputs, one initial joined view
3 edits → 6 deltasone retraction, two insertions
34 = 32 − 2 + 4the maintained final view
Q(x) + ΔQ = Q(x + Δx)incremental advance agrees with denotation
+δ + −δ = 0signed updates annihilate on contact
0 emitted rowsthe cancelling batch never reaches the join
0.793 ms / 1.216 ms64×64 trace · Moonlight / Feldera dbsp
3.572 ms / 4.523 ms256×64 trace · Moonlight / Feldera dbsp
bloom run 2026-08-10 · source f6770970 · Feldera referent 2026-07-10