> 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/sdk-.net/regras-do-analyzer-skail001-skail002-skail003.md).

# Regras do analyzer: SKAIL001, SKAIL002, SKAIL003

O pacote `Skail.Platform.Analyzer` roda na compilação e bloqueia as assinaturas que o runtime não consegue executar. Três regras, cada uma com causa, exemplo que dispara, correção e política de supressão.

## SKAIL001: assinatura inválida em método decorado

Causa: um método marcado com `[SkailFunction]` ou `[SkailCommand]` é `static`, não retorna `SkailTask`/`SkailTask<T>`, ou não é `public`.

Por que existe: o runtime precisa de uma instância da classe (obtida pelo contêiner de DI) e do method builder de `SkailTask` para interceptar os `await`s; `Task` não tem esse builder e um método `static` não tem instância. O método precisa ser `public`; o analyzer recusa outras visibilidades ("The X method must be public.").

Dispara:

```csharp
[SkailFunction]
public static async SkailTask Estatico() { ... }            // SKAIL001: static

[SkailFunction]
public async Task RetornoErrado(Guid id) { ... }            // SKAIL001: Task em vez de SkailTask

[SkailCommand]
private async SkailTask NaoPublico() { ... }                // SKAIL001: não é public
```

Correção:

```csharp
[SkailFunction]
public async SkailTask Correto(Guid id) { ... }
```

Quando suprimir: nunca. A assinatura errada não falha na compilação por acaso; ela falha em produção, na primeira retomada.

## SKAIL002: método decorado deve ser async

Causa: um método marcado com `[SkailFunction]` ou `[SkailCommand]` não tem o modificador `async`.

Por que existe: sem `async`, o compilador não gera a máquina de estados que o method builder de `SkailTask` controla; o runtime não consegue interceptar os `await`s ("StateMachine not registered." em tempo de execução).

Dispara:

```csharp
[SkailFunction]
public SkailTask SemAsync(Guid id) => Outra(id);            // SKAIL002
```

Correção:

```csharp
[SkailFunction]
public async SkailTask ComAsync(Guid id) => await Outra(id);
```

Um método que só delega ainda precisa de `async` e `await`. Para um command trivial: `public async SkailTask Nada() => await Task.CompletedTask;`.

Quando suprimir: nunca.

## SKAIL003: não chamar GetResult em SkailTask

Causa: chamada a `.GetResult()` (ou ao padrão `.GetAwaiter().GetResult()`) em uma `SkailTask`.

Por que existe: bloquear em uma `SkailTask` impede a hibernação e o replay; a thread fica presa e o runtime perde o controle do passo. O mesmo vale para `.Result` e `.Wait()`, que o analyzer não aponta mas são igualmente proibidos.

Dispara:

```csharp
public async SkailTask Errado()
{
    var r = Outra().GetAwaiter().GetResult();                // SKAIL003
}
```

Correção:

```csharp
public async SkailTask Certo()
{
    var r = await Outra();
}
```

Quando suprimir: nunca.

## O que o analyzer não detecta

O analyzer cobre assinaturas. Ele não detecta não determinismo (`DateTime.UtcNow`, `Guid.NewGuid()`, I/O dentro de function) nem `Task.Delay`/`Task.WhenAll` em function: isso o runtime detecta no replay, lançando `SkailNonDeterministicException`, muitas vezes dias depois. O code review com o [Checklist de revisão](/construir/padroes-e-antipadroes/checklist-de-revisao-de-codigo-skail.md) e o arquivo de regras para [assistentes de IA](/usar-o-skail-com-assistentes-de-ia.md) cobrem o que o compilador não cobre.

## Instalação

O analyzer é o pacote `Skail.Platform.Analyzer`. Se as regras não aparecerem no build, referencie o pacote diretamente no projeto. Ver [Pacotes](/construir/sdk-.net/pacotes.md).

## Veja também

[SkailFunction](/construir/sdk-.net/skailfunction.md), [SkailCommand](/construir/sdk-.net/skailcommand.md), [SkailTask e SkailTask\<T>](/construir/sdk-.net/skailtask-e-skailtask-less-than-t-greater-than.md), [Exceções](/construir/sdk-.net/excecoes.md).
