> For the complete documentation index, see [llms.txt](https://docs.skail.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skail.dev/operar/retomada-manual-de-execucoes-falhas.md).

# Retomada manual de execuções falhas

Quando uma execução esgota as tentativas, ela fica como falha no Monitor com a exceção e a linha do tempo. Depois de corrigir a causa, você a retoma dali: o que já rodou não repete, só o que faltava executa.

## Quando você precisa disto

Uma execução aparece como falha. As causas típicas: um serviço externo ficou fora por mais tempo que o `retryCount` cobriu; um dado inválido no seu banco fez um command lançar exceção; um bug no código de um command; um deploy que mudou o fluxo com execuções em andamento (`SkailNonDeterministicException`).

## O que acontece na retomada

A execução é entregue de novo à sua aplicação. O runtime reexecuta a function sobre o histórico da execução: todos os commands que já gravaram resultado devolvem o gravado sem executar; delays vencidos e eventos recebidos estão concluídos; o passo que falhou executa de novo, e o fluxo segue. É o mesmo mecanismo do replay automático. Ver [Determinismo e replay](/aprender/fundamentos/determinismo-e-replay.md).

Consequência prática: retomar é seguro em relação aos efeitos já aplicados. A cobrança que deu certo não é refeita; a nota que foi emitida não é reemitida. O que executa é o command que estava falhando e os que vêm depois.

## Procedimento

1. Abra a execução no Monitor e leia a exceção e o passo em que ela ocorreu.
2. Corrija a causa. Serviço externo fora: aguarde voltar. Dado inválido: corrija no seu banco. Bug no command: corrija o código e publique (o corpo de um command pode mudar sem versionar). Fluxo alterado: publique de volta a versão com a sequência original de `await`s.
3. Retome a execução no Monitor.
4. Acompanhe: ela volta a Em execução, o passo que falhava conclui, e a function segue até concluir ou até a próxima espera.

Para muitas execuções falhas pela mesma causa (o gateway ficou fora por uma hora), corrija uma vez e retome as execuções afetadas.

## Quando não retomar

Com `SkailNonDeterministicException` sem ter corrigido o código: a retomada vai falhar de novo com a mesma exceção, porque o histórico e o código continuam divergindo. Primeiro publique o código compatível.

Quando a falha era de negócio e não devia ser exceção (cartão recusado lançando `CartaoRecusadoException`): retomar vai cobrar de novo e ser recusado de novo. Corrija o command para devolver resultado, publique, e decida caso a caso o que fazer com as execuções.

Quando o efeito já aconteceu fora e o command não é idempotente: a retomada executa o command de novo. Confira no sistema externo antes; ver [Como escrever commands idempotentes](/construir/escrever-fluxos/como-escrever-commands-idempotentes.md).

## O que observar

Após retomar: a execução saiu de Falha; o command que falhava aparece concluído na linha do tempo; nenhuma duplicidade no sistema externo. Se falhar de novo com a mesma exceção, a causa não foi corrigida.

## Próximos passos

[Falhas, retries e idempotência](/aprender/fundamentos/falhas-retries-e-idempotencia.md) explica como uma execução chega ao estado de falha. [Monitor](/construir/portal/monitor.md). [Troubleshooting](/operar/troubleshooting.md).
