# Re-Review (Rodada 2) — dashboard-logistico

**Base**: `5edaf2f9` → **HEAD**: `b7cbb867` · **Diff**: 12 arquivos (+507 / -129)

## Veredito

**APROVADO para merge** com 2 majors arquiteturais que viram issues de follow-up.

## Confirmação dos resolves

### Blockers (todos resolvidos)
- **B1+B4** ✅ Sonda com métodos de domínio (`make`, `save`, `findByBlock`, `atualizarStatus`, `updateByBlock`, `tentarIniciar`). Laboratório migrado pra Sonda. SELECTs raw em `grupos_regioes`/`regioes_administrativas` aceitáveis (sem Sonda no escopo).
- **B2** ✅ Seed removido. Clientes legacy entram no fluxo natural de setup; `garantirGrupoPadrao` é idempotente.
- **B3** ✅ Helper `obterBlockDaSessao()` + `Validators/StatusSetupValidator.php` criados.

### Majors (todos resolvidos)
- **M1** ✅ en/es traduzidos manualmente.
- **M2** ✅ `disable_functions` checado; log path em `LOCAL_NOVO_SISTEMA . '/logs/'` com `mkdir 0775`.
- **M3** ✅ Validator dedicado.
- **M4** ✅ Race resolvida via `tentarIniciar` (INSERT ON CONFLICT DO NOTHING + UPDATE condicional + rowCount).
- **M5** ✅ PHPDoc do cron explicita limitação do shutdown handler vs SIGKILL.

## Novos issues introduzidos na rodada 2

### NM1 (Major, follow-up) — Encapsulamento quebrado em `tentarIniciar`
**Onde**: `Sondas/DashboardExpedicaoSetupSonda.php:187`

`$this->fail = null` reseta propriedade `protected` do framework. Tecnicamente permitido, mas:
- Frágil se `$fail` virar `private` no futuro.
- Silencia QUALQUER erro do `create()`, não só UNIQUE violation (23505).

**Correção sugerida**: detectar SQLSTATE 23505 antes de limpar:
```php
$failMsg = (string) ($this->fail()?->getMessage() ?? '');
if (!str_contains($failMsg, 'duplicate key') && !str_contains($failMsg, '23505')) {
    return false;
}
$this->fail = null;
```

Alternativa: criar `clearFail()` em `ModelInteligencia` (fora do escopo).

### NM2 (Major, follow-up) — Bug em `required()` com `$Grequired` numérico
**Onde**: `Laboratorios/AutoSetupExpedicaoLaboratorio.php:182-191`, `Sondas/DashboardExpedicaoSetupSonda.php:177-180`

`make()->save()` falha silenciosamente porque `required()` itera `$Grequired` com índices numéricos. Workaround: usar `create()` direto. Risco: outras Sondas V2 (Otp, Edicaorota) podem ter o mesmo bug latente.

**Recomendação**: abrir issue `[framework] required() falha com $Grequired numérico` e validar Otp/Edicaorota.

## Nits (informativo)

- **NN1** — `turnOff(['customerControl','companyControl'])` em 4 sites é arquiteturalmente correto (parâmetro `$block` é o discriminador). Sugestão: extrair em `private function semFiltroSessao(): self` para grep-ability.
- **NN2** — `iniciar()` cria 3 instâncias separadas da Sonda. Cosmético.
- **NN3** — `incrementarTentativas` é read-modify-write não atômico. OK para contexto single-threaded do cron, documentado.

## Follow-ups da rodada 1 (minors/nits NÃO tratados)

- **m1** — Polling não pausa em `visibilitychange`.
- **m2** — Sem cleanup de timers em `beforeunload`.
- **m3** — `processarResposta` sem warning em estado retrógrado.
- **m4** — Cast `::jsonb` redundante em `garantirGrupoPadrao:246`.
- **m5** — Blocks mágicos (99991-99995) nos testes sem constante centralizada.
- **m6** — Emoji `❌` no log do cron — verificar se foi removido.
- **n1** — Spec menciona path antigo `sql/dashboard_expedicao_setup.sql`.
- **n2** — `Expedicao.php:75` re-dispara `exec` em `falhou` sem throttle (F5 do user gera N processos). Coluna `tentativas` já existe — usar.
- **n3** — `formatarResposta:307-311` retorna `mensagem` em pt hard-coded sem `show()`.

## Pontos fortes da rodada 2

- Sonda V2 textbook (espelha Edicaorota corretamente).
- `tentarIniciar` tem PHPDoc explicando o algoritmo anti-race passo a passo.
- Validator + helper `obterBlockDaSessao` sem over-engineering.
- Comentários inline justificam cada `turnOff` arquiteturalmente — defesa contra refactors futuros bem-intencionados.

## Recomendação

**Merge agora.** Abrir 2 issues de tech-debt:
- NM1 (`$this->fail = null` encapsulamento) — `tech-debt`
- NM2 (`required()` com chaves numéricas) — `framework-bug`

m1-m6 e n1-n3 viram backlog de polish do dashboard.
