# Validador: Coerencia Voz-Marca

**Bloqueia:** sim
**Escopo:** fluxo inteiro (cross-bloco)

## O que valida

Todos os blocos seguem MESMA voz. Nao pode ter bloco 1 em "tom amigao informal" e bloco 5 em "tom corporativo formal".

## Como detecta

Skill compara texto-a-texto procurando inconsistencias:

### 1. Tratamento (voce / tu / senhor)
Todo o fluxo deve usar UM. Se ha mistura, erro.

```
RUIM:
  b001: "Como voce esta hoje?"
  b005: "Como o senhor esta?"

BOM:
  b001 e b005 ambos com "voce"
```

### 2. Nivel de formalidade
Skill mede formality score por bloco (0=informal, 1=formal). Variacao >0.4 entre quaisquer dois blocos = warning. Variacao >0.6 = erro.

Sinais de informalidade:
- "tipo", "ai", "entao", "sabe?"
- ponto final em frase curta
- contracoes ("ta", "to", "ne")
- "voce" em lugar de "o senhor"

Sinais de formalidade:
- conjuncoes longas ("portanto", "contudo")
- substantivos abstratos
- frases de 20+ palavras

### 3. Uso de emoji consistente
Se bot usa emoji em 3 blocos e nao usa em outros 8, OK.
Se bot usa 5 emojis em b001 e nenhum no resto, INCONSISTENTE.

### 4. Saudacao + despedida coerente
Se b001 abre com "Oi! Tudo bem?", o bloco final NAO pode ser "Atenciosamente, equipe X".

### 5. Nome da empresa/produto consistente
Se aparece em 3 lugares como "Imperio IA", nao pode aparecer em 1 lugar como "imperio.ia" ou "Imperatriz IA".

### 6. Variaveis usadas consistentemente
Se {{nome}} aparece em b003, deve continuar aparecendo em b007, b015. Pular {{nome}} em alguns blocos depois de coletar e perda de calor.

## Heuristica de score por bloco

Cada bloco recebe vetor:
```
{
  formality: 0.0-1.0,
  emoji_density: 0-N,
  treatment: 'voce' | 'tu' | 'senhor',
  uses_var: ['nome', 'email', ...],
  paragraph_style: 'short' | 'medium' | 'long'
}
```

Calcula desvio padrao do `formality` entre todos os blocos `text`. Threshold:
- DP <0.15: muito coerente ✅
- DP 0.15-0.30: aceitavel
- DP 0.30-0.50: warning
- DP >0.50: erro

## Output do validador

```json
{
  "passed": false,
  "level": "error",
  "issues": [
    {
      "block_id": "b005",
      "message": "Tratamento 'senhor' destoa do resto do bot ('voce')",
      "suggestion": "Trocar 'o senhor' por 'voce' em b005"
    },
    {
      "block_id": "b007",
      "message": "Bloco com formality 0.85 (resto do bot media 0.25) — soa formal demais",
      "suggestion": "Reescrever em tom mais alinhado"
    }
  ],
  "score": 60
}
```

## Quando regenerar

Por bloco identificado como outlier. Pede LLM pra reescrever no estilo dos demais (passa amostras dos blocos coerentes como referencia).
