# Fase B4 — Paridade + cutover gradual (fase separada)

> Objetivo da fase: com a V2 cobrindo o fluxo, **virar a produção da V1 para a V2 gradualmente** (por tenant/usuário) e só então aposentar a V1. Aqui é onde os contras **C3/C4** (adiados) voltam, e as pré-condições **P-1…P-6** **precisam estar satisfeitas**.
> Ref. PRD: §4 (Fase 4) + §6 (pré-condições) + §11 (B4). ⚠️ **Não iniciar B4 sem P-1/P-2 fechados.**

---

## B4-1 — P-3: congelar contrato de socket ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B1-5
- **Objetivo:** promover o payload a schema documentado/versionado com TddTest fixando as chaves.
- **Critérios de aceite:** [ ] Teste de schema verde e obrigatório no CI da V2. [ ] Mudança de chave exige bump de versão.

## B4-2 — P-4: caracterização das ~30 ações da V1 ⬜

- **Status:** ⬜ · **Esforço:** L · **Depende de:** —
- **Objetivo:** registrar input→output/efeito-DB atuais de cada ação da V1 (em `dev_gx_goldie`) como rede de regressão pro cutover.
- **Critérios de aceite:** [ ] Cada ação do `switch` da V1 com caso de caracterização. [ ] V2 comparada contra esses baselines antes de virar.

## B4-3 — P-5: inventariar/confirmar+deletar código morto da V1 ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** —
- **Objetivo:** confirmar sem-caller e remover: algoritmos de roteirização (ClarkeWright/KMeans/ColoniaFormigas/Savings/`Rotas::gerarRotas`), `pegarPedidosTecnosoft`, arquivos `copy`/`old`. **Manter** `filtrarNovosPedidosDisponiveis` (vivo via cron).
- **Critérios de aceite:** [ ] Grep confirma zero callers antes de deletar. [ ] Encolhimento registrado.

## B4-4 — P-6: shims das URLs hardcoded ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B4-2
- **Objetivo:** manter resolvíveis as URLs `Logistica/Central/Central/<acao>` (cron `crompedidos_logistica.php:20`, fetches do `maps.js`) durante/depois da virada.
- **Critérios de aceite:** [ ] Cron segue alimentando pedidos sem 404. [ ] Varredura `setSatelite('Central')` / `new SatelitesCentral` sem rota órfã.

## B4-5 — Flag de cutover por tenant/usuário ⬜

- **Status:** ⬜ · **Esforço:** S · **Depende de:** B3-6
- **Objetivo:** rotear operadores de um tenant/usuário para a V2 (em vez do gate dev-only), reversível.
- **Critérios de aceite:** [ ] Liga/desliga por tenant. [ ] Rollback imediato (volta pra V1).

## B4-6 — Repontar produção + monitorar ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B4-4, B4-5
- **Objetivo:** repontar forms/cron/`maps.js` de produção (com shim) conforme tenants migram; monitorar dupla alocação.
- **Critérios de aceite:** [ ] Tenant piloto operando 100% na V2 sem incidente. [ ] Métricas de sync/alocação OK.

## B4-7 — Aposentar V1 ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B4-6
- **Objetivo:** após todos os tenants migrados, reduzir o satélite V1 a shim e depois deletar (+ `LogisticaSocketTrait`); remover o aviso de "em desenvolvimento" da V2.
- **Critérios de aceite:** [ ] Zero referências ao satélite V1. [ ] README da V2 sem o banner de dev. [ ] V1 removida do VCS.
