Effect Key Collision
data class EffectKeyCollision(val key: String, val firstStep: TypedValue, val collidingStep: TypedValue) : Exception
Two saga steps within the same run produced the same effect-key.
This is a programming error in the user's key-lambda: effect-keys must be unique per run so the engine can unambiguously identify which step an idempotency record belongs to.
Extends Exception so it can serve as the SagaExecutionError.exception payload and be returned via the standard StatefulSagaResult.Aborted abort path — no dedicated result variant is needed (approach b from T012 Technical Notes).