# Central2 — Timeline de desenvolvimento

> Tarefas derivadas do PRD **`../review-central.md`** (Estratégia B — V2 paralela, dev-gated, V1 intacta). Esta pasta é o **tracking vivo** do desenvolvimento da V2.
>
> **Status:** ✅ feito · 🟦 em andamento · ⬜ a fazer · 🟨 decisão/gate · ⛔ bloqueado
> **Esforço (estimativa grosseira):** `S` ≤1d · `M` 2–3d · `L` ≥1 semana
> Datas: B0 concluído em jun/2026. As demais são sequenciadas por dependência (sem data fixa).

## Fluxo das fases

```
B0 esqueleto ─► B1 socket ─► B3 escrita ─► B4 cutover
                   │            ▲
                   ├─► B2 leitura┘
                   └─► (F front: workstream paralelo)
   D = decisões/gates transversais
```

## Tabela de tarefas

| ID | Tarefa | Fase | Status | Depende de | Esf. | Detalhe |
|----|--------|------|--------|-----------|------|---------|
| **B0-1** | Esqueleto + gate dev-only | B0 | ✅ | — | S | [B0-esqueleto](B0-esqueleto.md) |
| **D-1** | Decidir isolamento de dados no dev | D | ✅ | — | S | [D-decisoes](D-decisoes.md) |
| **D-2** | Front: derivar do maps.js (não 100%) | D | ✅ | — | — | [D-decisoes](D-decisoes.md) |
| **D-3** | Nome do Sinal = `Central2` | D | ✅ | — | — | [D-decisoes](D-decisoes.md) |
| **B1-1** | `CentralBroadcastInterface` (contrato do payload) | B1 | ✅ | B0-1 | S | [B1-socket](B1-socket.md) |
| **B1-2** | `CentralSocketNotifier` (impl, rooms `_v2`) | B1 | ✅ | B1-1 | M | [B1-socket](B1-socket.md) |
| **B1-3** | `CentralBroadcastRegistry` (real ↔ spy/no-op) | B1 | ✅ | B1-1 | S | [B1-socket](B1-socket.md) |
| **B1-4** | Bootstrap do controller registra o notifier | B1 | ✅ | B1-2, B1-3 | S | [B1-socket](B1-socket.md) |
| **B1-5** | Testes Eventos + schema do payload | B1 | ✅ | B1-2, B1-3 | M | [B1-socket](B1-socket.md) |
| **F-1** | Portar núcleo mapa/markers/rota (asset próprio) | F | ⬜ | B0-1 | L | [F-front](F-front.md) |
| **F-2** | Store de estado (substitui textarea `.rotasGeradas`) | F | ⬜ | F-1 | M | [F-front](F-front.md) |
| **F-3** | Camada de socket desacoplada no front (rooms `_v2`) | F | ⬜ | B1-2, F-2 | M | [F-front](F-front.md) |
| **F-4** | i18n via `show()` (sem PT hardcoded) | F | ⬜ | F-1 | S | [F-front](F-front.md) |
| **B2-1** | Sondas V2 de leitura (pedidos/romaneios/veículos) | B2 | ✅ | B0-1 | M | [B2-leitura](B2-leitura.md) |
| **B2-2** | Labs de leitura (disponíveis/dados/cubagem) | B2 | ✅ | B2-1 | M | [B2-leitura](B2-leitura.md) |
| **B2-3** | Lab listagem de romaneios | B2 | ✅ | B2-1 | S | [B2-leitura](B2-leitura.md) |
| **B2-4** | Telas read-only no front (tenant sandbox) | B2 | ⬜ | B2-2, F-1, F-2, D-1 | M | [B2-leitura](B2-leitura.md) |
| **B2-5** | Testes de leitura | B2 | ✅ | B2-2 | S | [B2-leitura](B2-leitura.md) |
| **B3-1** | Adapter Romaneio | B3 | ⬜ | D-1 | M | [B3-escrita](B3-escrita.md) |
| **B3-2** | Adapter MissaoLogistica | B3 | ⬜ | D-1 | M | [B3-escrita](B3-escrita.md) |
| **B3-3** | Adapter Processo | B3 | ⬜ | D-1 | S | [B3-escrita](B3-escrita.md) |
| **B3-4** | Labs `Rotas/` (salvar/nova/vincular/roteirização) | B3 | ⬜ | B3-1, B1-4 | L | [B3-escrita](B3-escrita.md) |
| **B3-5** | Labs `Portaria/` (aprovar/listar) | B3 | ⬜ | B3-1 | M | [B3-escrita](B3-escrita.md) |
| **B3-6** | Labs `Romaneio/` state-machine (**por último**) | B3 | ⬜ | B3-1, B3-2, B3-3 | L | [B3-escrita](B3-escrita.md) |
| **B3-7** | Flag de escrita + promoção gradual | B3 | ⬜ | B3-4 | S | [B3-escrita](B3-escrita.md) |
| **B3-8** | Testes TddTest por lab | B3 | ⬜ | B3-4 | L | [B3-escrita](B3-escrita.md) |
| **B4-1** | P-3: congelar contrato de socket (schema + teste) | B4 | ⬜ | B1-5 | M | [B4-cutover](B4-cutover.md) |
| **B4-2** | P-4: caracterização das ~30 ações da V1 | B4 | ⬜ | — | L | [B4-cutover](B4-cutover.md) |
| **B4-3** | P-5: inventariar/confirmar código morto da V1 | B4 | ⬜ | — | M | [B4-cutover](B4-cutover.md) |
| **B4-4** | P-6: shims das URLs hardcoded (cron/forms/maps) | B4 | ⬜ | B4-2 | M | [B4-cutover](B4-cutover.md) |
| **B4-5** | Flag de cutover por tenant/usuário | B4 | ⬜ | B3-6 | S | [B4-cutover](B4-cutover.md) |
| **B4-6** | Repontar produção (cron/forms/maps) + monitorar | B4 | ⬜ | B4-4, B4-5 | M | [B4-cutover](B4-cutover.md) |
| **B4-7** | Aposentar V1 (deletar satélite + trait) | B4 | ⬜ | B4-6 | M | [B4-cutover](B4-cutover.md) |

## Marcos

- **M1 — V2 viva pra dev (esqueleto):** B0 ✅
- **M2 — Realtime isolado em rooms `_v2`:** B1 ✅ + F-3 ⬜
- **M3 — Telas read-only da V2 sobre sandbox:** B2 + F-1/F-2
- **M4 — V2 com escrita (paridade funcional) atrás de flag:** B3
- **M5 — Cutover por tenant + V1 aposentada:** B4

## Caminho crítico & gates

- **Backend:** B0 → B1 → B3 → B4.
- **D-1 (isolamento de dados)** é **gate de B3** — bater o martelo antes de qualquer escrita.
- **B4 (cutover)** só começa após os gates do PRD §6: **P-1** (fechar P0 da V1), **P-2** (estabilizar canal Scaledrone), **P-3** (B4-1), **P-4** (B4-2), **P-6** (B4-4).
- **Front (F)** é paralelo: F-1/F-2 após B0; F-3 após B1.

## Regra permanente (todas as tarefas)

Enquanto a V1 estiver no ar: **gate dev-only** sempre ativo · socket só em rooms `_v2` · escrita só em tenant sandbox até validar · migrations **aditivas** · **não** editar V1, tema/menu global, cron, forms ou o `maps.js` compartilhado (isso é fase B4). Ver `../README.md`.
