Extraction Run Conflict Exception
A write disagreed with what the store already holds.
Five cases, one per door: a terminal write whose fingerprint differs from the one that ended the run; a write, through ExtractionRunStore.save or ExtractionRunStore.recordInvocation, against a run that has already ended; a save that disagrees with the stored run's lineage or start time (tenant cannot disagree — it is half of ExtractionRunKey, so a different tenant always addresses an entirely separate run); a save whose ExtractionRun.version does not name the version currently stored; and an invocation record, through ExtractionRunStore.recordInvocation — the only door onto that state — that differs from an attempt the store already holds as terminal. save cannot raise that last case: it does not read or write invocation rows, so nothing it carries there is ever compared against one.
The message never quotes a fingerprint in full or any part of a payload. It says which run and which rule, which is what an operator needs, and leaves the values to a deliberate read.
EXPERIMENTAL. The shape may still change while extraction runs (DICE #67) land.