MutationAction
A write against state: a verb, an RFC 6901 path, and whatever the verb needs.
Most verbs accept a selector that narrows the write to elements of the array at path rather than the path's own slot — index for one position, or key + equals for every element whose field matches. field narrows once more, to a pointer inside each selected element. So increment /cart key=id equals=A field=/qty bumps the quantity of the cart line with that id, in one action and without spelling out its position.
Value slots hold templates: a literal, or a {"$event": "/pointer"} read into the fired interaction's payload, possibly nested inside a literal object or array.
Inheritors
Types
Add to a number; by defaults to 1 and may be negative. An absent target is treated as 0.
Shallow-merge an object: named keys overwritten, the rest untouched. An absent target is created.
Write one value. Missing object parents along the path are created.
Flip a boolean. An absent target is treated as false, so the first toggle writes true.
Write the fields of set onto every selected element. A selector is required — this is the verb for "adjust the matching rows" — and a selector matching nothing is a no-op, never an error.
"Add it, or adjust the one that is already there." An existing match is merged with onConflict, or replaced by value outright when no onConflict is given; no match appends value. value must carry the key field, since that is what identifies it.