# Conta Escrow — Checklist de Go-Live (`ESCROW_ENABLED`)

> Gate operacional do produto Conta Escrow. Enquanto os itens abaixo não
> estiverem satisfeitos, o produto permanece **desligado** (`ESCROW_ENABLED`
> ausente/`false` em prod/dev — default seguro). Ligar é decisão explícita:
> setar `ESCROW_ENABLED=true` na task def + restart.
>
> Mecanismo: `Monetarie.UseCases.Escrow.FeatureFlag.require_enabled/0`, chamado
> na camada de API (controllers escrow). Config em `config/runtime.exs`
> (`escrow_enabled`).

## 1. Pré-condições regulatórias (bloqueantes — §1.3 do guia)

- [ ] Autorização da Monetarie como **emissora de moeda eletrônica** confirmada
      junto ao BCB (modelagem A). O dono confirmou a autorização; anexar a
      evidência formal antes de ligar em produção.
- [ ] **Política PLD/FT** aprovada e **AIR específica** do produto escrow
      (Circular BCB 3.978/2020 + Res. BCB 44/2020). Hook técnico já existe
      (`Escrow.Compliance`, limiar COAF R$ 50k); falta a política formal.
- [ ] **Contrato de escrow tripartite** padronizado, revisado por jurídico
      (condições de liberação objetivamente verificáveis).
- [ ] **Vínculo específico** de cada conta escrow a um negócio jurídico
      documentado (anti-conta-bolsão). Já imposto no código: `escrow_agreement`
      exige `purpose` (`Agreements.create`).
- [ ] Tratamento contábil confirmado com o contador: **COSIF 4.1.1.85.00-1
      DEPÓSITOS VINCULADOS** (seed + AccountingBridge já entregues).

## 2. Pré-condições técnicas

- [ ] Migration `20260708210000_create_escrow_domain` aplicada em produção.
- [ ] Seed COSIF `4.1.1.85.00.10.001` aplicado em produção (scd_cosif_plan.exs).
- [ ] TigerBeetle: ledger `1_004` provisionado (conta cash_asset acessível no
      ledger; validar um deposit/hold de smoke em HML antes de prod).
- [ ] Kind `escrow (5)` incluído no replay/count de contas TB e na validação de
      `Account.kind` (follow-up de PR1/PR3) quando houver contas escrow.
- [ ] Painel admin (PR6) publicado e validado com screenshot estrito (regra #11).
- [ ] Roteamento de saídas PIX/TED de liberação pelas cabines via NATS (PR7);
      **o Core não assina** (regra #13).

## 3. Validação em HML antes de ligar

- [ ] Criar agreement → ativar (provisiona conta 1_004) → deposit → aprovar e
      executar liberação (maker-checker) → conferir par COSIF e reconciliação
      (Σ depósitos = Σ liberações + devoluções + saldo vinculado).
- [ ] Testar os gates: liberação sem condição `:met` e sem KYC `:approved` deve
      ser recusada.
- [ ] Idempotência: reexecutar a mesma liberação não move dinheiro duas vezes.

## 4. Procedimento de ligar / desligar

- Ligar: `ESCROW_ENABLED=true` na task def do core-api + novo deploy/restart.
- Desligar (rollback): remover a env (ou `=false`) + restart. Reversível e
  seguro — o gate na API passa a recusar as rotas; nada é apagado.

## 5. Estado de entrega (2026-07-08)

Entregues e testados no branch `feat/etl-blocked-holds` (todos com
`ESCROW_ENABLED` sem efeito até o enforcement da API):

- Fase 0 (reconciliação dos fundos vinculados legados), PR1 (contábil), PR2
  (domínio), PR3 (execução TB 1_004 + COSIF), PR4 (KYC dual + PLD/FT), PR8
  (flag + este checklist). PR5 (APIs) aplica o gate na borda; PR6 (painel) e PR7
  (eventos/cabines) pendentes.
