# Fase B3 — Escrita, lab a lab, com Adapter

> Objetivo da fase: a V2 **escreve** (cria/edita rotas, libera fases, portaria), cada ação como Laboratório, com domínios externos atrás de **Adapters**, e broadcasts via notifier (B1). Escrita ligada **gradualmente por flag**, só após D-1.
> Ref. PRD: §3 (Adapters/Laboratorios) + §4 (Fase 3) + §11 (B3). **Gate: D-1 (isolamento de dados).**

> Ordem de extração (menos acoplado → mais): `Rotas/` → `Portaria/` → **`Romaneio/` (state-machine) por último**.

---

## B3-1 — Adapter Romaneio ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** D-1
- **Objetivo:** isolar escrita em `Romaneios`/`RomaneioPedido`/`RomaneioVeiculo` atrás de `Adapters/Romaneio/`. Precedente: `Edicaorota/Adapters/Romaneio/`.
- **Arquivos:** `Adapters/Romaneio/`
- **Critérios de aceite:** [ ] Labs não importam os models de Romaneio direto — só o Adapter. [ ] `Adapters/Romaneio/Testes/` cobrindo as escritas.

## B3-2 — Adapter MissaoLogistica ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** D-1
- **Objetivo:** isolar `MissoesLogisticas`/`MissoesPersistencia` + enums (`StatusMissao`/`TipoMissao`) usados em libera separação/carregamento e criar missão.
- **Arquivos:** `Adapters/MissaoLogistica/`
- **Critérios de aceite:** [ ] Criação/transição de missão só via Adapter. [ ] Testes próprios.

## B3-3 — Adapter Processo ⬜

- **Status:** ⬜ · **Esforço:** S · **Depende de:** D-1
- **Objetivo:** isolar `Processos`/`ProcessosStatusMovimentacoes` (transições de status) atrás de `Adapters/Processo/`.
- **Arquivos:** `Adapters/Processo/`
- **Critérios de aceite:** [ ] Transições de status só via Adapter.

## B3-4 — Labs `Rotas/` ⬜

- **Status:** ⬜ · **Esforço:** L · **Depende de:** B3-1, B1-4
- **Objetivo:** `salvarRotas`, `novaRota`/`criarRota`, `vincular`/`desvincularMotoristaRota`, `salvarRoteirizacao`, `atualizarDescricaoRomaneio`.
- **Arquivos:** `Laboratorios/Rotas/`
- **Critérios de aceite:** [ ] Cada lab: escreve via Adapter, faz broadcast via notifier (rooms `_v2`), tem TddTest. [ ] Persistir **antes** de broadcast; falha de socket nunca falha a operação.

## B3-5 — Labs `Portaria/` ⬜

- **Status:** ⬜ · **Esforço:** M · **Depende de:** B3-1
- **Objetivo:** `aprovarPortaria`, `listarPortaria`.
- **Arquivos:** `Laboratorios/Portaria/`
- **Critérios de aceite:** [ ] Aprovação reflete em tempo real (rooms `_v2`) com toast de sucesso/erro.

## B3-6 — Labs `Romaneio/` state-machine (POR ÚLTIMO) ⬜

- **Status:** ⬜ · **Esforço:** L · **Depende de:** B3-1, B3-2, B3-3
- **Objetivo:** `finalizar`/`confirmar`/`remover*` + `libera`/`cancela` (Separacao/Faturamento/Carregamento) — o núcleo transacional + socket-entangled.
- **Arquivos:** `Laboratorios/Romaneio/`
- **Critérios de aceite:** [ ] Ordem dos side-effects afirmada em teste (persistir → broadcast). [ ] Cenário 2-navegadores **sem dupla alocação**. [ ] Um lab por PR.

## B3-7 — Flag de escrita + promoção gradual ⬜

- **Status:** ⬜ · **Esforço:** S · **Depende de:** B3-4
- **Objetivo:** ligar a escrita por lab conforme valida (read-only → escrita).
- **Critérios de aceite:** [ ] Flag por capability/lab; default desligado até teste verde.

## B3-8 — Testes TddTest por lab ⬜

- **Status:** ⬜ · **Esforço:** L · **Depende de:** B3-4
- **Arquivos:** `Testes/Laboratorios/{Rotas,Portaria,Romaneio}/`
- **Critérios de aceite:** [ ] Todo lab de escrita tem `*TddTest.php`. [ ] Integração no `dev_gx_goldie` p/ os transacionais.
