public async Task Evaluate()
        {
            var builder = CreateRoutingSlipBuilder(_routingSlip);

            Build(builder);

            var routingSlip = builder.Build();

            await _publisher.PublishRoutingSlipActivityCompensated(_compensateContext.ActivityName, _compensateContext.ExecutionId,
                                                                   _compensateContext.Timestamp, _duration, _routingSlip.Variables, _compensateLog.Data).ConfigureAwait(false);

            if (HasMoreCompensations(routingSlip))
            {
                var endpoint = await _compensateContext.GetSendEndpoint(routingSlip.GetNextCompensateAddress()).ConfigureAwait(false);

                await _compensateContext.Forward(endpoint, routingSlip).ConfigureAwait(false);
            }
            else
            {
                var faultedTimestamp = _compensateContext.Timestamp + _duration;
                var faultedDuration  = faultedTimestamp - _routingSlip.CreateTimestamp;

                await _publisher.PublishRoutingSlipFaulted(faultedTimestamp, faultedDuration, _routingSlip.Variables,
                                                           _routingSlip.ActivityExceptions.ToArray()).ConfigureAwait(false);
            }
        }