subtract Folded Evidence
Take a whole fold off the proposition in one statement, without reading it first.
This is how the store honours ProvenanceSubtractionCapable: naming what stays would mean reading the entries, filtering, and replacing, and evidence another writer adds in between would be replaced away. Naming what goes closes that window. One statement deletes the named DERIVED_FROM edges by their own identity, prunes only the sources those edges pointed at, and rewrites the grounding and sourceIds lists with the named members taken out, and Neo4j runs all of it as one transaction, so the read and the write the contract talks about land together. A save after the evidence subtraction would write the survivor's evidence back from a copy taken before it, which is exactly the window this statement is here to close. Nothing else on the node is touched, and a proposition another writer has already deleted matches nothing and stays deleted.
Two ref forms, matching the evidence-key contract. A minted key is compared against the edge's entryKey, so it removes one entry. A bare locator key predates revisions and matches revisionless evidence for that source only, which is why the second predicate requires a null sourceRevision; it also reaches edges written before entryKey existed. A ref carrying the codec's prefix but an unknown version matches no stored key, so it removes nothing.
The revision clocks move only when something actually came off, so a subtraction that names nothing the proposition holds leaves it exactly as it was.
Return
the proposition as the subtraction left it, or null when this store has no proposition with that id. Both branches answer from a fresh read, so a deleted id answers null whether or not anything was named. Collector undo reads that null as the survivor having been deleted while it was working and stops there, so the meaning is load-bearing; subtractProvenance answers null for a proposition that is not there pins it.