completed
fun completed(finishedAt: Instant, counts: ExtractionRunCounts? = null, failures: List<ExtractionFailure>? = null): ExtractionRunTransition
The run finished everything it was asked for: every product its request called for is durably persisted or terminally disposed.
Only call this after persistence has returned. On the legacy path that is the coordinator once persistAndProject returns; on the #68 path it is inside the commit transaction. A run whose persistence never finished stays running and retryable, which is the whole reason the state exists.
A run with zero products takes this too: there was nothing to persist, so the coverage claim holds vacuously.