# Task 005 — `OtpConfig` por contexto

**Depende de:** 001
**Bloqueia:** 006, 007

## Objetivo

Permitir que cada contexto consumidor (`edicao_rota`, `alteracao_senha`, etc.) defina seus próprios parâmetros sem alterar o core.

## Deliverable

`Configuracao/OtpConfig.php`:

```php
class OtpConfig {
    private static array $registros = [];     // contexto => array de config
    private static array $defaults = [
        'validade_segundos' => 300,
        'max_tentativas'    => 3,
        'tamanho_codigo'    => 6,                // entre 4 e 8
        'canal_padrao'      => 'log',
    ];

    public static function registrar(string $contexto, array $config): void;
    public static function paraContexto(string $contexto): array;        // merge defaults + registro
    public static function setDefaults(array $defaults): void;             // sobrescreve defaults globais
    public static function reset(): void;                                  // testes
}
```

## Validações

- `tamanho_codigo` em [4, 8] — fora disso, exceção em `registrar()`.
- `validade_segundos` >= 30.
- `max_tentativas` >= 1.
- `canal_padrao` deve estar registrado no `OtpCanalRegistry` no momento do `criar` (validação preguiçosa — não no momento do `registrar` da config).

## Critério de aceite

- Defaults globais aplicados quando contexto não tem registro.
- Override por contexto funciona (verificado em testes 012).
