# 09 — Roadmap — commerce-vc1

Épicos **E0–E6** com os nomes fixos de `docs/blueprint/_BRIEF.md` §6. Insumo de faseamento: `docs/sources/PLAN-vc1-wholesale.md` §8. Segurança e dívidas a não copiar: `docs/blueprint/08-SECURITY-LGPD.md`.

**Este arquivo não lista tarefas de sprint.** Sprints Beesy (`Nxx`) nascem depois, no repo, com `/pmo plan` (ou `/pmo sprint q`). IDs `E*` são épicos de produto, não sprints.

Regra Beesy: LAB (`*.lab.vc1.com.br`) é o ambiente de trabalho. Qualquer toque em produção, PR no legado (`easy_cicerone` / SipPulse) ou criação de conta demo no ERP real exige **aprovação explícita do operador**. Nenhum deploy sem o operador. Nenhum push em `main`.

---

## Recorte MVP (`PADRÃO PROPOSTO`)

**Go-live de Produto 01 e Produto 02** no modo `reseller_invoices` (revenda fatura o cliente; VC1 fatura a revenda `max(custo dos clientes + uso próprio, mínimo)`; STFC comprovado): **E0 + E1 + E2 + E3 + E4**.

**E5** habilita o modo `vc1_invoices` (mePay cobrança + NFCom via mePay, repasse). Não entra no primeiro go-live.

**E6** (troca de motor) fica fora do MVP até o lab de `falepaco-erp` / Kamailio ter código de portal parceiro e SIP classe 4 novo — hoje não há (PLAN §8).

Migração da base atual VC1/Intelbras: **fora de escopo** (`PADRÃO PROPOSTO`). Clientes novos entram pelo funil commerce-vc1; legado continua no caminho antigo até um épico futuro.

Piloto: **1 revenda** em LAB → depois o mesmo CNPJ em PROD, modo `reseller_invoices`, com contas demo no legado até o operador autorizar IDs reais.

---

## Grafo de dependências

```mermaid
flowchart TD
  subgraph ext [Dependências externas]
    DNS[meDNS zona vc1.com.br]
    TUN[Túnel meCloud ↔ Fale Paco]
    DEMO[Contas demo ERP + SipPulse]
    SIGN[Tenant meSign]
    PAY[mePay readiness]
    NFE[mePay NFCom emissor terceiro]
    HUB[falepaco-api / falepaco-erp / Kamailio maduros]
  end

  E0[E0 Fundação]
  E1[E1 Produto 01 atacado]
  E2[E2 Planos + funil Produto 02]
  E3[E3 Tarifação e fatura]
  E4[E4 Crédito e limites]
  E5[E5 VC1 fatura o cliente final]
  E6[E6 Troca de motor]

  DNS --> E0
  E0 --> E1
  TUN --> E1
  DEMO --> E1
  E1 --> E2
  SIGN --> E2
  E2 --> E3
  E3 --> E4
  E3 --> E5
  PAY --> E5
  NFE --> E5
  E3 --> E6
  HUB --> E6

  MVP[[Go-live MVP: E0–E4 em reseller_invoices]]
  E4 --> MVP
```

```mermaid
gantt
  title commerce-vc1 — épicos relativos (não são sprints)
  dateFormat  YYYY-MM-DD
  axisFormat  %b
  section Fundação
  E0 Fundação (S)           :e0, 2026-11-10, 14d
  section Produto
  E1 Atacado 01 (M)         :e1, after e0, 28d
  E2 Planos + funil 02 (L)  :e2, after e1, 42d
  E3 Tarifação e fatura (L) :e3, after e2, 42d
  section Go-live MVP
  E4 Crédito e limites (M)  :e4, after e3, 28d
  section Pós-MVP
  E5 VC1 fatura cliente (L) :e5, after e3, 42d
  E6 Troca de motor (L)     :e6, after e3, 56d
```

Datas do Gantt são **ilustrativas** (escala relativa S/M/L). Calendário real sai de `/pmo plan`.

---

## E0 — Fundação

**Estimativa:** S.

### Objetivo

Nascer o repo `SoftwareBeesy/commerce-vc1` (fork de `sales-mework360`), tenancy por `Host`, papéis do brief, ports vazios com `Fake*Adapter`, schema mínimo e painel Filament de staff em LAB. Sem SOAP real, sem ERP real.

### Escopo

**Dentro:** skeleton Laravel 12 + Filament 4 + SPA React; schemas `identity`, `tenancy`, `audit` (+ stubs de `pricing`/`catalog`); resolução `{slug}.lab.vc1.com.br` → `tenancy.resellers`; login staff; slugs reservados; `Fake*` + testes de isolamento de Host; CI Beesy (`beesy-pr-security-review`, audit de deps); `LAB_ENFORCE_ALLOWLIST` já no decorator (allowlist vazia = nenhum write).

**Fora:** Funil comercial, rating, mePay (cobrança+fiscal NFCom), DNS vanity, wildcard em DNS **público** de produção, qualquer write no legado.

### Entregáveis

- Repo privado na suíte `falepaco`, manifest `.cursorsuite`.
- Filament em `admin.lab.vc1.com.br`.
- SPA “órfã” no slug lab (revenda sem `legacy_project_id`).
- Pest: Host isolation + 404 cross-tenant.
- `.env.example` com os nomes de `08-SECURITY-LGPD.md` §4 (sem valores).

### Dependências externas

- Zona `vc1.com.br` no **meDNS** (ns1–ns4) pelo menos para `*.lab.vc1.com.br` + certificado wildcard LAB (ACME DNS-01). Sem a zona, o épico valida só por `/etc/hosts` e fica incompleto para aceite de Host.

### Critérios de aceite (verificáveis)

1. `GET https://{slug}.lab.vc1.com.br/painel` resolve o tenant cujo `slug` está em `tenancy.resellers`.
2. Slug reservado (`admin`, `api`, `cliente`, …) **não** cria tenant.
3. Staff cria revenda `status=draft` **sem** `projetos_clientes` no ERP.
4. Pest `it('denies reseller A from reading reseller B by uuid')` verde no CI.
5. Nenhum adapter real é instanciado em `APP_ENV=testing`.
6. Workflow `beesy-pr-security-review.yml` presente; `composer audit` no CI.

### Gates do operador

Nenhum toque em produção. Criação da zona LAB no meDNS = operador (ou quem opera meDNS).

### Riscos

| ID | Risco | Mitigação |
|----|-------|-----------|
| R-E0-1 | Wildcard LAB falha ACME | Validar PowerDNS API em janela curta; fallback hosts file só para dev local se `local_runtime=always` |
| R-E0-2 | Fork sales arrasta mailbox/me360 | Cortar módulos fora do brief na E0; não portar o que não for funil/auth |

---

## E1 — Produto 01 atacado

**Estimativa:** M.

### Objetivo

Onboarding da revenda no painel VC1: projeto WL no legado **piloto/demo**, branding runtime, faixas VC1, tronco próprio opcional. A revenda compra e revende **fora** do sistema. Sem funil de cliente final.

### Escopo

**Dentro:** wizard Filament (`draft` → `onboarding` → `active`); upload **STFC** + verificação manual VC1; guard **422** em fechamento `reseller_invoices` sem STFC válido; `ProvisioningPort` / `LegacyErpProvisioningAdapter` + `LabGuarded*`; `cadastro_total_tronco` opcional; `tenancy.reseller_branding` em runtime (sem SCSS compilado por tenant); tabela de faixas VC1 (`pricing.price_bases` + `vc1_tiers`); painel revenda (marca, leitura de faixa, fatura **stub**); CTA “seja revenda” só no site (repo Site-VC1, fora deste épico de código).

**Fora:** Funil `/p/{code}`, meSign, rating, kill-switch do cron WP, `vc1_invoices`, PABX/`painel_wl`.

### Entregáveis

- 1 revenda lab com Host, branding e `legacy_project_id` na allowlist.
- Subscriber SipPulse demo **se** o operador autorizar lab telco; senão, Fake Telco até a autorização.
- `integration.legacy_id_map` + `connector_calls`.
- Token ERP só em secret (`LEGACY_ERP_TOKEN`), nunca na URL.

### Dependências externas

- **Túnel meCloud ↔ Fale Paco** (SOAP `172.16.49.222:8080` e HTTP do ERP `erp.falepaco.com.br` / VM 140). Sem túnel o adapter real não fala com o legado.
- **Contas demo**: 1 `projetos_clientes` WL + subscribers SIP demo. Criá-las no legado de produção = gate do operador.
- Credencial `TOKEN_WHITE_LABEL` no cofre do ambiente (PLAN E1).

### Critérios de aceite (verificáveis)

1. Wizard cria projeto no ERP **somente** se o id destino está na allowlist; id fora → recusa + audit.
2. `{slug}.lab.vc1.com.br/painel` mostra logo/cor da revenda sem rebuild.
3. `legacy_project_id` persistido e visível só para `vc1_ops` / `vc1_admin`.
4. Tronco próprio opcional: `cadastro_total_tronco` idempotente (segunda chamada não duplica).
5. Pest: TLS verify on no adapter; token **não** aparece em query string capturada pelo fake HTTP.
6. Site `vc1.com.br` não faz parte deste repo; aceite do CTA é do Site-VC1.

### Gates do operador

- Secret `LEGACY_ERP_TOKEN`.
- Projeto WL piloto / contas demo.
- Qualquer write SOAP (`subscriber`, `callLimit`).
- Túnel de rede.

### Riscos

PLAN R2 (TLS/token URL), R8 (STFC — nesta fase a revenda pode ficar `onboarding` sem STFC; `reseller_invoices` só depois da prova), R11 (`intelbras.vc1.com.br` HTTP 500 — **não** usar esse repo como base).

---

## E2 — Planos + funil (Produto 02)

**Estimativa:** L.

### Objetivo

A revenda clona faixas VC1 com markup, monta planos (`package` / `commitment`) e vende pelo funil white-label: wizard → proposta v2026 voz → PIN → trial SIP → meSign → `AtivacaoTronco` sem PABX. Preço só no servidor.

### Escopo

**Dentro:** `pricing.reseller_tier_tables` + alerta de margem negativa (não bloqueia); `catalog.plans` / `plan_versions` / `plan_quotas` / `suggested_packages`; funil multi-tenant reusando sales (wizard, `/p/{code}`, PIN lockout, PDF 7 folhas, kanban `lead|negotiating|won|lost`); `SignaturePort` / `MeSignAdapter`; ativação SIP `ProvisioningPort` + `TelcoPort`; snapshot imutável; cláusula de contratante conforme `billing_mode` (no MVP = contrato da **revenda**).

**Fora:** Checkout mePay, NFCom, repasse, UI `/tronco-sip` do `wl_label`, Fusion/ramais/URA.

### Entregáveis

- PDF A4 v2026 com marca e preço da revenda.
- Kanban won após assinatura + tronco ativo (lab).
- Docs de portabilidade já em bucket privado (mesmo que o crédito venha na E4).
- Pest: total enviado pelo cliente é ignorado; PIN lockout; HMAC meSign.

### Dependências externas

- **Tenant meSign** (`https://mesign.mework360.com.br`) em lab; webhook `X-Paco-Signature` apontando para `api.lab.vc1.com.br`.
- Estoque DID lab (PLAN E2).
- Túnel + demo (E1) continuam necessários.

### Critérios de aceite (verificáveis)

1. Proposta PDF 7 folhas contém marca, preço da revenda e cláusula “contrato com a revenda” (MVP `reseller_invoices`).
2. PIN 6 dígitos; 6ª falha em 5 tentativas → 429; cookie não leva PIN na URL.
3. Aceite + `envelope.completed` → `proposal.stage=contracted` e subscriber SIP **sem** domínio Fusion.
4. Zero uso da UI `/tronco-sip`.
5. Venda abaixo do custo gera alerta, não HTTP 422.
6. Cross-tenant: proposta do slug A inacessível no slug B (404).
7. Snapshot: mudar a faixa depois de `sent` não altera a proposta já emitida.

### Gates do operador

- meSign lab (tenant + webhook secret).
- Estoque DID lab.
- `AtivacaoTronco` em projeto piloto (legado).

### Riscos

PLAN R1 (totais browser), R3 (portabilidade pública), R7 (`callLimit` atrasado — mitigação parcial na E2, bloqueio near-realtime na E4).

---

## E3 — Tarifação e fatura

**Estimativa:** L.

### Objetivo

Importar CDR, tarifar 30/6 (fixo/móvel BR), faturar `max(consumo, compromisso)` no cliente e agregar na revenda. Pró-rata de DID/canal no meio do ciclo. **Kill-switch** do cron WP `geracao_faturas_whitelabel_tronco.php` para projetos VC1. Relatório de reconciliação billsec vs R$ switch.

### Escopo

**Dentro:** `CdrPort` read-only; `rating.*`; `billing.invoices` / `invoice_lines` / `statements` com `invoice.party` `reseller` | `customer`; pró-rata; flag `vc1_commerce` no legado + skip do cron; reconciliação `integration.reconciliation_runs`.

**Fora:** Ledger pré-pago, alerta 80/100 (E4); mePay cobrança **cliente final**; repasse (E5). **Dentro (E3 go-live `reseller_invoices`):** cobrança revenda via **mePay** (boleto/Pix — D-RM-16); NFCom **`party=reseller`** solicitada via **FiscalPort → mePay** (emissor terceiro); até API NFCom no mePay: `FakeFiscalPort` no LAB.

### Entregáveis

- Job de import CDR + rating 30/6.
- Fatura cliente (**statement** para a revenda cobrar fora) + fatura revenda VC1 com NFCom (`party=reseller`, modo `reseller_invoices`).
- Relatório de desvio rating vs SipPulse.
- Teste de ouro: 1 título/ciclo no legado = **zero** `projetos_clientes_titulos` novo para o projeto piloto.

### Dependências externas

- Leitura MySQL `sippulse_reports.cdrs_report` via túnel (credencial read-only).
- PR no `easy_cicerone` para skip do cron — **só com operador**.

### Critérios de aceite (verificáveis)

1. Fixture CDR do exemplo PRODUCTS §7 (consumo R$ 780, compromisso R$ 1.000) → cobrado **R$ 1.000,00** (centavos inteiros).
2. Fatura da revenda = soma do custo VC1 dos filhos + uso próprio, depois `max(., mínimo)`.
3. DID/canal adicionado dia 16/30 → pró-rata ≈ 50% (±1 dia, teste com calendário fixo).
4. Destino `other` bloqueado por default (`PADRÃO PROPOSTO` do brief).
5. No ciclo de teste do piloto: **zero** novo `projetos_clientes_titulos` no ERP.
6. Reconciliação gera linha `integration.reconciliation_runs` com billsec e R$; **não** bloqueia fatura automaticamente (`PADRÃO PROPOSTO` — pergunta aberta PLAN §7 item 7).

### Gates do operador

- Desligar cron tronco no piloto (produção = operador; PR legado).
- Credencial read-only CDR.

### Riscos

PLAN R4 (cobrança dupla), R5 (PG ≠ SipPulse), R6 (cota 750 ≠ franquia comercial — switch = teto alto ou off; franquia só no PG).

---

## E4 — Crédito e limites

**Estimativa:** M.

### Objetivo

Pré-pago: crédito ≥ compromisso, débito por uso, **bloqueio na originação em saldo zero**. Pós-pago: limite por cliente, **alerta 80%**, **bloqueio 100%**. Painel do cliente SIP (credencial, DID, extrato, saldo/%). Completa o go-live MVP em `reseller_invoices`.

### Escopo

**Dentro:** `billing.credit_wallets` / `credit_ledger` / `credit_limits` / `limit_events`; jobs near-realtime `TelcoPort.block/unblock`; e-mail/SMS 80% para revenda e VC1; app `/app`; portabilidade 100% em bucket privado (se ainda restar gap da E2); idempotência de block.

**Fora:** mePay (recarga MVP = registro manual de crédito pela revenda / staff — `PADRÃO PROPOSTO` até E5); payout; NFCom.

### Entregáveis

- Ledger + eventos 80/100.
- Painel cliente: senha SIP (revelar uma vez), DID, extrato, saldo ou %.
- Pest: saldo 0 → `subscription.status=blocked_credit` + chamada SOAP block (fake/lab); 80% dispara notificação; 100% block.

### Dependências externas

- SOAP `blockSubscriber` no piloto (mesmo túnel E1).
- NotificationPort (SMTP/SMS) em lab.

### Critérios de aceite (verificáveis)

1. Wallet zera → originação bloqueada (`telco.block_events`) em até **60 s** **somente se** D-INT-07 confirmar quota SipPulse monetária em tempo real; com fallback 90% (`blockOutgoingCalls`), SLA = **próximo import CDR (≤ 5 min) + 60 s**.
2. Recarga registrada reabre originação (idempotente).
3. 80% do limite: e-mail + item no painel revenda e Filament.
4. 100%: `blocked_limit` + SOAP block.
5. GET do arquivo de portabilidade **sem** URL assinada → 404; com assinatura válida → 200.
6. Cliente A não vê CDR/saldo do cliente B.

### Gates do operador

- SOAP `blockSubscriber` em piloto.
- Recarga manual em PROD (quando houver piloto pago).

### Riscos

PLAN R7 (block atrasado) — job + idempotência; origem bloqueada mesmo com fatura em aberto.

---

## E5 — VC1 fatura o cliente final (mePay, NFCom, repasse)

**Estimativa:** L. **Fora do MVP de go-live.** Habilita `billing_mode=vc1_invoices`.

### Objetivo

VC1 cobra o cliente no preço da revenda via mePay, entrega NFCom 62 (mePay → emissor terceiro; `issued` só com chave 44 dígitos no webhook), contrato VC1 com cláusula de N1/comercial da revenda, e calcula **repasse** mensal contra nota de comissão. Guard STFC / modo `reseller_invoices` permanece o da **E1** (RN-133, RN-136).

### Escopo

**Dentro:** `PaymentPort` + `FiscalPort` → **mePay** (Svix webhooks `invoice.paid`, `fiscal.issued` quando existir); ação cliente **Nota fiscal** (`POST/GET .../fiscal-note`); `billing.payouts` / `commission_invoices`; abate de falta até o mínimo e margem negativa; se repasse &lt; 0 → fatura VC1 para a revenda; `invoices` `party=customer`; cláusula contratual VC1 no snapshot. **Fora do escopo E5:** reimplementar validação STFC (reusa guard E1).

**Fora:** Split de pagamento (não existe); payout automático via mePay até o produto oferecer (`PADRÃO PROPOSTO`: transferência manual registrada); Omie; cron WP `gerar_nota_fiscal_mensal_vc1.php`.

### Entregáveis

- Checkout boleto/Pix/cartão mePay no funil/fatura do cliente.
- NFCom autorizada (não só importada) — evita FINDINGS QA-009.
- Cálculo de payout = Σ(sell − cost) **pagas** − max(0, mínimo − Σ cost pago − uso próprio); exemplo brief: mínimo 2.000, custo 1.500, margem 600 → payout 100.
- DPA / papéis LGPD atualizados (VC1 controladora).

### Dependências externas

- **mePay readiness** — cobrança (`openapi.yaml`) + **NFCom via emissor terceiro** (API/webhooks **a criar no mePay**, owner mePay). Sem NFCom mePay, E5 emite só com `FakeFiscalPort` em LAB.
- Tenant meSign já da E2 (contrato VC1).

### Critérios de aceite (verificáveis)

1. Cliente de revenda `vc1_invoices` recebe 1 fatura VC1 no preço da revenda (não no custo).
2. Fatura em atraso **não** entra no payout (e, `PADRÃO PROPOSTO`, o custo dela **não** conta no mínimo até pagar).
3. Fixture brief: payout 100; variante margem 300 → payout 0 + invoice revenda 200.
4. `fiscal_documents.status=issued` só com chave 44 dígitos no webhook mePay `fiscal.issued` (ou poll fallback).
5. Cliente consegue solicitar e baixar nota fiscal pela SPA (`CLI-09`).
6. Webhook mePay Svix + replay + idempotência (não baixa duas vezes).

### Gates do operador

- Emissão NFCom em **lab** (e depois PROD).
- Credenciais mePay (`MEPAY_API_KEY`, webhook secret) no cofre.
- Repasse pago (transferência manual) — registro no sistema, dinheiro fora.

### Riscos

PLAN R12 (margem negativa); FINDINGS QA-009 / SEC-001 / SEC-002 / SEC-003; mePay ainda inexistente localmente.

---

## E6 — Troca de motor (falepaco-api / falepaco-erp / Kamailio)

**Estimativa:** L. **Não-MVP.**

### Objetivo

Trocar adapters: `ProvisioningPort` / `TelcoPort` / `CdrPort` passam a falar com `falepaco-api` (hub, hoje fase 0 docs) + `falepaco-erp` + Kamailio, **mesma UX**. `legacy_id` já mapeado desde E1.

### Escopo

**Dentro:** novos adapters; contratos versionados; feature flag por revenda; testes de paridade de provisionamento/block/CDR.

**Fora:** Reescrever funil; PABX; Fusion; `ResellerWS` markup.

### Entregáveis

- `FalepacoApiProvisioningAdapter`, `KamailioTelcoAdapter` (nomes `PADRÃO PROPOSTO`) + fakes.
- Runbook de cutover por tenant.

### Dependências externas

- Lab ERP com **portal parceiro em código** (hoje só `partners.md`).
- SIP classe 4 novo em condições de produção — **hoje não**.

### Critérios de aceite (verificáveis)

1. Revenda flaggada no lab provisiona DID/canal/block **sem** chamar `api/white_label` nem SOAP SipPulse.
2. Paridade: mesma fixture E3 gera a mesma fatura ±0 centavos.
3. Rollback: desligar flag volta ao adapter legado sem downtime de painel.
4. Nenhuma revenda PROD migrada sem o operador.

### Gates do operador

- Declaração de que o lab novo está maduro.
- Cutover de cada tenant.

### Riscos

PLAN R10 (lab ERP divergir dos ports) — contratos versionados + `legacy_id`.

---

## Fora de escopo (até depois de E6, salvo decisão)

- PABX, ramais, URA, filas, Fusion.
- `ResellerWS` / RatePlanWS como motor comercial.
- Multi-domínio no `wl_label`.
- Funil Intelbras (`VC1-Intelbras`, HTTP 500 em 2026-11-01).
- Deploy de produção sem operador.
- Wildcard em DNS **público** sem piloto.
- **Migração dos clientes atuais VC1/Intelbras** (`PADRÃO PROPOSTO`: fora).
- Split de pagamento.
- Payout automático mePay (até o produto oferecer).

---

## Checklist de go-live (Produto 01 + 02, `reseller_invoices`)

Só depois de E0–E4 verdes em LAB e **autorização do operador**. O agente não executa os itens de produção.

1. Operador aprova o recorte MVP (este documento).
2. Pentest externo sem HIGH/CRITICAL aberto (`D-SEC-18`).
3. CI: Pest isolamento + rating ouro + HMAC + TLS; `composer audit` / `npm audit` limpos em HIGH.
4. 2FA TOTP obrigatório para todo staff com acesso PROD.
5. Secrets no cofre PROD (distintos do LAB); nenhum token em URL.
6. Zona meDNS `vc1.com.br` + wildcard TLS PROD.
7. Túnel meCloud–Fale Paco estável; contas **não-demo** só com lista explícita do operador (senão o piloto continua na allowlist demo).
8. 1 revenda piloto com STFC validado.
9. Kill-switch do cron tronco **ligado** no `legacy_project_id` piloto (PR legado mergeado pelo operador).
10. Bucket privado + ClamAV + URL assinada.
11. Backup PBS cifrado verificado pelo operador.
12. DPA assinado com a revenda piloto.
13. Runbook de block 80/100 e de incidente HMAC.
14. Site institucional (Site-VC1) apontando CTA; este repo **não** publica `vc1.com.br`.
15. Sem migração da base Intelbras neste go-live.

---

## Plano de piloto (1 revenda)

| Fase | Onde | O quê |
|------|------|-------|
| P0 | LAB | Slug demo, allowlist, funil interno, CDR sintético, block SOAP demo |
| P1 | LAB + legado demo | Ciclo completo: proposta → assinatura → tronco → fatura statement → crédito/block |
| P2 | PROD | Mesma revenda (CNPJ real), modo `reseller_invoices`, clientes **novos** apenas; IDs legado autorizados um a um |
| P3 | PROD | 1 ciclo de rating fechado; conferência humana da fatura VC1 à revenda; zero título WP duplicado |
| P4 | — | Decisão de abrir mais revendas **ou** puxar E5 |

Critério de saída do piloto: um ciclo faturado correto, sem cobrança dupla, sem write fora da allowlist, pentest tratado, operador declara go.

---

## Itens para 10-DECISIONS

| ID | Linha | Default (`PADRÃO PROPOSTO`) |
|----|-------|-----------------------------|
| D-RM-01 | Recorte de go-live | **FECHADA:** E0–E4 `reseller_invoices`; 1 piloto; `vc1_invoices` na E5 |
| D-RM-02 | Quando entra `vc1_invoices` | E5, depois do piloto E4 |
| D-RM-03 | Migração clientes atuais VC1/Intelbras | Fora de escopo deste roadmap |
| D-RM-04 | Tamanho do piloto | 1 revenda |
| D-RM-05 | Paralelismo E4/E5 | E5 pode desenhar em paralelo após E3; **não** entra no go-live |
| D-RM-06 | Estimativas relativas | E0 S; E1 M; E2 L; E3 L; E4 M; E5 L; E6 L |
| D-RM-07 | Recarga no MVP (E4) | Lançamento manual no ledger até mePay (E5) |
| D-RM-08 | Bloquear fatura se desvio rating vs SipPulse &gt; X% | Não bloquear; só relatório (pergunta aberta PLAN) |
| D-RM-09 | Destino `other` | Bloqueado por default |
| D-RM-10 | Fallback `painel_wl` via `generate_login_link` no MVP | Não no go-live (E4 entrega `/app`). LAB E1–E3: permitido só com flag `legacy_painel_wl_link` off por default |
| D-RM-11 | Payout mePay | Manual até mePay oferecer payouts |
| D-RM-12 | Nomes dos adapters E6 | `FalepacoApiProvisioningAdapter`, `KamailioTelcoAdapter` |
| D-RM-13 | SLA de block na originação | 60 s se D-INT-07 quota real-time; senão próximo CDR (≤ 5 min) + 60 s |
| D-RM-14 | Wildcard DNS público | Só no piloto, com operador; LAB usa `*.lab.vc1.com.br` desde E0 |
| D-RM-15 | Tarefas de sprint neste doc | **Proibido**; gerar com `/pmo plan` no repo |
| D-RM-16 | Pagamento fatura revenda MVP | Boleto/Pix gerados pelo **mePay** (**FECHADA** ADR-013) |

### Pós-MVP (E5+) — entidades mínimas

| Tema | Entidades / telas |
|------|-------------------|
| Webhooks outbound (REV-28) | `integration.outbound_webhooks`, `integration.outbound_deliveries` |
| Tickets suporte (CLI-11 / REV-29) | `support.tickets`, `support.ticket_messages` |
| Preferências de notificação (REV-30) | `notifications.event_preferences` |
