> 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/aprender/arquitetura/runtime.md).

# Runtime

O runtime é o motor de execução durável dentro da sua aplicação. É ele quem mantém as `[SkailFunction]` vivas ao longo das hibernações, delays, esperas por eventos e quedas de processo, e quem garante que cada `[SkailCommand]` não execute de novo depois de ter concluído.

Você não interage com o runtime diretamente no código: toda a conversa entre o SDK e o runtime acontece por baixo dos `await`s. Na prática, o runtime é o que transforma suas classes anotadas em execuções que sobrevivem a dias, a restart de servidores e a deploys.

## O que o runtime faz

### Descoberta

Na inicialização, `builder.UseSkail()` registra o runtime como serviço hospedado e ele varre os assemblies marcados com `[assembly: VisibleToSkailPlatform]` procurando métodos com `[SkailFunction]` e `[SkailCommand]`. Cada método recebe um endereço, `{workload}/{NomeDoMetodo}`, montado a partir de `SKAIL_WORKLOAD`. As classes que contêm esses métodos são registradas no contêiner de injeção de dependência como transient. Sem o atributo de assembly, nada é descoberto.

### Consumo

O runtime busca trabalho no skail, uma ou mais execuções por vez. É um ciclo de pedir trabalho, executar, confirmar. Cada item representa uma execução (um TaskId) a iniciar ou a retomar.

### Replay e memoização

Ao retomar uma execução, o runtime chama a function desde o início e percorre o histórico dela junto com o código. A cada `await` de command, delay, espera ou composição, ele confere: se o passo já foi concluído, devolve o resultado daquela vez sem executar de novo; se não foi, executa e registra o passo. É isso que faz uma retomada continuar de onde parou sem que o código saiba disso. Ver [Determinismo e replay](/aprender/fundamentos/determinismo-e-replay.md).

### Hibernação

Quando a function chega em um `Delay` ou `WaitForEvent` que ainda não foi satisfeito, o runtime registra o passo, informa ao skail o que a execução espera (um prazo ou um par nome e id) e a libera. A execução deixa de existir no processo e volta para a sua aplicação quando o prazo vence ou o evento chega.

### Retry

Quando um command lança exceção, o runtime registra a falha e devolve a execução ao skail; na reentrega, o replay devolve os passos concluídos e reexecuta o command, até o `retryCount` dele (5 por padrão). Só depois disso a exceção é lançada dentro da function, como uma exceção comum de `async/await`. Se a function não a capturar, a própria function é reentregue até o seu `retryCount` (15 por padrão), e então a execução fica como falha no Monitor. O runtime não distingue erros transitórios de definitivos: toda exceção gera nova tentativa. Ver [Falhas, retries e idempotência](/aprender/fundamentos/falhas-retries-e-idempotencia.md).

### Telemetria

Cada function e command abre um span de rastreamento, exportado para o skail. Logs emitidos com `ILogger` dentro dos métodos são correlacionados por `SkailContext.Current.TaskId`. Nada a configurar.

## O que o runtime não faz

Não guarda nada na sua infraestrutura: não precisa de banco, disco nem fila do seu lado, e uma instância da aplicação pode cair sem perder execução. Não classifica exceções. Não versiona código por você: uma execução em andamento referencia os endereços da versão em que começou. Não impõe determinismo em tempo de compilação; ele detecta a divergência no replay e lança `SkailNonDeterministicException`.

## Retomada manual

Execuções que falharam definitivamente ficam disponíveis no Monitor e podem ser retomadas depois que a causa for corrigida. A retomada usa o mesmo mecanismo do replay: commands já concluídos devolvem os resultados da primeira vez; só o que ainda não tinha rodado é executado. Ver [Retomada manual de execuções falhas](/operar/retomada-manual-de-execucoes-falhas.md).

## Configuração

Tudo por variáveis `SKAIL_*` ou pela seção `skail` do `appsettings.json`: workload, namespace, chave e endereço do skail. Ver [Como configurar o runtime](/construir/configurar-e-hospedar/como-configurar-o-runtime.md).

## Próximos passos

[O que o skail faz pela sua execução](/aprender/arquitetura/o-que-o-skail-faz-pela-sua-execucao.md) é o outro lado da conversa. [Configuração do host](/construir/sdk-.net/configuracao-do-host.md) é a referência de `UseSkail` e `VisibleToSkailPlatform`. [Como observar execuções](/construir/testar-depurar-e-observar/como-observar-execucoes-monitor-otlp-logs.md) para a telemetria.
