> 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/construir/padroes-e-antipadroes/checklist-de-revisao-de-codigo-skail.md).

# Checklist de revisão de código skail

Para colar no template de pull request. Cada item aponta para a página que explica o porquê. Marque tudo antes de aprovar um fluxo que vai para produção.

```markdown
## Revisão skail

### Determinismo (dentro de [SkailFunction])
* [ ] Nenhum I/O direto: HttpClient, DbContext, fila, arquivo estão em [SkailCommand]
* [ ] Nenhum DateTime.Now/UtcNow, Guid.NewGuid(), Random, Environment.*; relógio vem de um command
* [ ] Nenhum Task.Delay, Thread.Sleep, Task.WhenAll/WhenAny, Task.Run, Parallel.*; só SkailTask.*
* [ ] Nenhum helper `async Task` com I/O chamado a partir da function
* [ ] Branches decidem só sobre argumentos e resultados de commands

### Commands
* [ ] Um command por operação de I/O
* [ ] Nenhum command chama outro [SkailCommand] nem uma [SkailFunction]; lógica compartilhada entre commands fica em métodos comuns, sem atributo
* [ ] Toda chamada externa que grava, cobra ou envia algo leva chave de idempotência derivada dos argumentos
* [ ] Falha de negócio é resultado (enum/record), não exceção
* [ ] retryCount pensado: maior para integrações instáveis, 0 para efeitos irrepetíveis sem chave
* [ ] Nenhum laço manual de retry na function

### Eventos e tempo
* [ ] Todo WaitForEvent está em um WhenAny com Delay, e o timeout tem tratamento
* [ ] Nomes de evento são constantes compartilhadas com quem dispara
* [ ] instanceId é um id de negócio estável, igual nos dois lados
* [ ] Uma espera reutilizada quando vários prazos se aplicam ao mesmo evento
* [ ] Laços têm condição de saída ou janela máxima; nenhum while(true) sem limite

### Dados
* [ ] Argumentos e retornos são records/DTOs pequenos e serializáveis; nenhuma entidade de ORM, stream ou SkailTask
* [ ] Dados sensíveis desnecessários não passam como argumento nem retorno
* [ ] Resultados de WhenAll lidos pela posição, não pela ordem de término

### Assinatura
* [ ] Métodos decorados: public, instância, async, SkailTask/SkailTask<T>
* [ ] Nenhum .Result, .Wait(), .GetAwaiter().GetResult()
* [ ] Build sem avisos SKAIL001, SKAIL002, SKAIL003

### Versionamento
* [ ] Se a function já tem execuções em produção, a sequência de awaits não mudou, ou foi versionada (skailMethodName ou nova versão do workload)
* [ ] Records usados em passos antigos não perderam nem renomearam propriedades

### Observabilidade e operação
* [ ] Nomes de functions e commands legíveis no Monitor
* [ ] Logs incluem SkailContext.Current.TaskId
* [ ] Quem chama o trigger faz retry com backoff e usa id de negócio
* [ ] Exceções do skail (SkailNonDeterministicException) não são capturadas
```

## Como usar

Copie o bloco para `.github/pull_request_template.md` ou equivalente. Nos primeiros meses, revise com a lista aberta; depois ela vira reflexo. Os cinco itens de determinismo são os que passam despercebidos e só aparecem em produção, dias depois; os de assinatura o compilador pega.

Para uma revisão assistida, o arquivo de regras de [Usar o skail com assistentes de IA](/usar-o-skail-com-assistentes-de-ia.md) cobre a mesma lista e pode ser usado para pedir ao assistente que revise o diff.

## Próximos passos

[Antipadrões](/construir/padroes-e-antipadroes/antipadroes-o-que-nao-fazer-e-por-que.md) explica cada item com o sintoma e a correção. [Padrões recomendados](/construir/padroes-e-antipadroes/padroes-recomendados.md) é a versão positiva.
