Re-derive a cell's rows without any input having changed — the code moved, not the data.
The frontier says "an input moved, redo this". That is the wrong sentence for a changed prompt, a fixed fold, or a suspect result: the inputs are identical and the function is not. Mechanically the mark is the same, but the reason matters, and a job is the honest place to put it.
Selecting what to redo
Whole cell, and everything below it:
%{"cell" => "budget_rollups"} |> ReactiveDag.ReprocessWorker.new() |> Oban.insert()A slice — the common case, and what slice exists for:
%{"cell" => "budget_rollups", "where" => %{"fiscal_year" => "FY25"}}
|> ReactiveDag.ReprocessWorker.new()
|> Oban.insert()Or exact keys, when a UI has already chosen them:
%{"cell" => "budget_rollups", "keys" => ["gf|FY25", "water|FY25"]}Whole-cell means everything downstream
A "*" claim propagates :all, so reprocessing a cell re-derives every cell
beneath it. That is usually what "the code changed" means and occasionally
much more work than intended — a slice or an explicit key list keeps it
proportional, which is the whole point of the engine.
It invalidates first
A per_key node skips rows whose declared inputs have not moved — and after
a prompt change they have not. Marking alone would therefore skip exactly the
rows you asked it to redo.
So the stored fingerprint is CLEARED on the selected keys before they are marked. That is not a bypass: a null fingerprint means "no valid prior result", which is precisely true once the code that produced it has changed. The recompute then runs for the ordinary reason, and stores a fresh fingerprint as it always would.
invalidated in the telemetry says how many rows that touched — 0 on a node
with no fingerprint column, which needs no invalidation to recompute.
Telemetry
[:reactive_dag, :reprocess, :start] with system_time, and
[:reactive_dag, :reprocess, :stop] with claimed, invalidated and
changed, so a dashboard can say "queued 412, 88 actually moved".
Both carry cell, reason and the job's own args — a reprocess is
usually one leg of something a host named, and only the job knows what.