# Validador: Ritmo

**Bloqueia:** sim
**Escopo:** sequencias de blocos no grafo do fluxo

## O que valida

Cadencia da conversa. Bot que so fala (5 textos seguidos) ou so pergunta (5 inputs seguidos) cansa.

## Regras

### Max 3 blocos `text` consecutivos
Antes do 4o, OBRIGATORIO ter input/choice/multi_choice/ai.

```
RUIM:  text → text → text → text → input
BOM:   text → text → text → choice → text
```

### Max 5 blocos `input_*` consecutivos
Visitante cansa de formulario. Quebra com `text` no meio.

```
RUIM:  input_text → input_email → input_phone → choice → choice → choice
BOM:   input_text → text → input_email → text → choice → choice
```

### `ai` block deve ter pelo menos 1 `text` antes
Senao cai direto numa caixa de "digite mensagem livre" e o visitante nao sabe o contexto.

```
RUIM:  choice → ai
BOM:   choice → text (contextualiza) → ai
```

### `redirect` deve ter pelo menos 1 `text` de despedida antes
Se nao, parece corte abrupto.

```
RUIM:  set_var → redirect
BOM:   set_var → text ("Bora! Te mandando o link...") → redirect
```

### `condition` em sequencia (max 2)
Se 3+ condicoes seguidas, e logica complexa demais. Refatora.

### Delay sugerido por bloco

`text` com delay_ms:
- 0-100 chars → 600ms
- 100-200 chars → 1000ms
- 200-280 chars → 1400ms
- (limite 1500ms — alem disso visitante acha bot travou)

Se mentorada quer animacao "digitando", sequencia 2-3 textos com delays escalonados e melhor.

## Sinais de falha

- 4+ `text` consecutivos no grafo
- 6+ `input_*` consecutivos
- `ai` sem `text` precedente
- `redirect` sem `text` precedente
- 3+ `condition` consecutivos
- `delay_ms` > 1500 ou ausente em texto >100 chars

## Output do validador

```json
{
  "passed": false,
  "level": "error",
  "issues": [
    {
      "block_id": "b008",
      "message": "Sequencia de 4 'text' consecutivos (b005→b006→b007→b008) — visitante cansa",
      "suggestion": "Adicionar choice/input apos b007"
    }
  ],
  "score": 75
}
```

## Quando regenerar

Identifica trecho com ritmo ruim. Sugere insercao de bloco interativo. Caso `ai` sem context, gera `text` precedente.
