Optional ReadonlycodeReadonlyreasonOptional ReadonlyselectOptional ReadonlyspecThe spec that failed, echoed back verbatim — including inputs,
because a plan may hold two specs of the same op and a caller
retrying needs to know which one it was.
params and inputs are typed unknown because this is an echo of
whatever arrived, and what arrives is exactly what may be malformed.
The plan pass used to normalize — params: null came back as {} —
which was not merely lossy: recomputing an id from the echo then
produced the defaulted spec's valid id, so a broken persisted
entry's report keyed onto a legitimate node (Tidal, on 0.62.0). The
selector pass echoed the original all along, so the two disagreed.
The failure's kind — ProcessError.code, e.g.
'UnknownColumnError'. Absent when the throw did not come from this package, which is itself the useful signal: op code failed, not the plan layer.reasonis prose for a human and its wording is not a contract. UnderonError: 'skip' | 'collect'nothing is thrown, so without this a consumer branching on the kind — a dropped feed column is a dimmed, removable chip; a bad persisted param is a broken one — was left matching on that prose (Tidal,docs/notes/tidal-process-adoption-friction-2026-08.md).