# Subida para Produção do Monetarie (Core/PIX/SPB): Plano de Execução

> **Para o Claude:** SUB-SKILL OBRIGATÓRIA: use superpowers:executing-plans (ou
> superpowers:subagent-driven-development) para implementar tarefa a tarefa.
>
> Design: `docs/plans/2026-07-07-subida-producao-monetarie-design.md`.
> Mapas aprovados: `docs/reports/2026-07-07-mapa-coop-scd.md`,
> `docs/reports/2026-07-07-mapa-onz-avivpay.md`.

**Objetivo:** subir Core, PIX e SPB em produção (conta 990933657879, VPC 10.50 adotada),
espelhando homologação, com estado inicial limpo (sem dados de teste), código higienizado
(sem coop/OnZ/homolog), trilhas de auditoria funcionais e certs de produção validados por eco
assinado no BACEN.

**Arquitetura:** a stack Terraform de `infra/aws/greenfield/` é reusada com um estado novo
`env=prod` adotando a VPC existente `vpc-0da523dbdbac50b5d` (10.50). O código é compartilhado
(as mesmas imagens servem HML e prod), então a higiene roda no repo e é validada em HML antes de
promover as imagens por digest para prod. Cripto usa o HSM de produção via PKCS#11.

**Tech stack:** Terraform, AWS (ECS Fargate + EC2, Aurora PG 17.9, ElastiCache, ECR, KMS,
Secrets Manager), Elixir/Phoenix (Core/PIX/SPB), Vue 3 (fronts), TigerBeetle 0.17.3, NATS
JetStream, IBM MQ, HSM RTM (PKCS#11), ICP-Brasil.

**Regra de ouro em cada tarefa:** gate de evidência (build/testes verdes, plan limpo, health
200, contagem conferida, prova viva) antes de avançar. Segredos só no Secrets Manager
`monetarie/prod/*`. Sem `homolog`/`coop`/`OnZ` no código de produto ao final.

---

## FASE 0: Pré-condições e spikes bloqueantes

### Task 0.1: Spike PKCS#11 do HSM de produção (BLOQUEANTE do go-live PIX)
**Objetivo:** provar que o HSM de produção assina (PIA) e faz mTLS (PIC) via PKCS#11 antes de
qualquer dependência.
- Levantar com a RTM: endpoint do HSM de produção, se expõe PKCS#11/KMIP, e como o cliente
  (Erlang/OTP `:crypto`/`:public_key` ou engine) usa a chave privada do PIC no handshake mTLS.
- `locate-all` no HSM de produção para confirmar os UIDs das chaves PIA P003, PIC P002 e dos 2
  certs SPB. Gravar UIDs em `monetarie/prod/*` (nunca no repo).
- Prova: assinar um blob de teste com a chave PIA via HSM prod e verificar com o cert público.
- **Gate:** assinatura HSM prod OK + caminho de mTLS-PIC definido. Se PKCS#11 não existir,
  ESCALAR ao dono antes de seguir (é a pré-condição #3 do design).

### Task 0.2: Validação de acessos de rede de produção (origem 10.50)
- De um host na VPC 10.50 (EC2 OpenVPN prod ou task de teste), provar CONNECT + auth:
  HSM prod (443), MQ Linux `172.31.1.50` (canal SPB, porta real a confirmar como na HML), RSFN
  direto (DICT/ICOM/ARQ), DNS RSFN via resolver.
- **Gate:** matriz de acessos preenchida (CONNECT + auth por serviço). Bloqueios viram chamado RTM.

### Task 0.3: Truststore ICP-Brasil de produção (cadeia completa)
**Files:** Create `apps/shared/priv/certs/icp_brasil_ca_chain_prod.pem` (PIX),
`spb/services/bacen_gateway/priv/certs/` (SPB).
- Montar a cadeia: Raiz Brasileira v5/v10/v11/v12, AC SERPRO SSLv1, AC SERPRO Final SSL,
  CSPB-1/CSPB-6, AC VALID SPB v5.
- Validar cada cert de folha contra a cadeia: `openssl verify -CAfile chain.pem <cert>` para os
  4 nossos + os 4 peers BACEN (PIA-P515, PIC-P514, SPB-P060, MES-P061).
- **Gate:** `openssl verify` OK para todos os 8 certs. Commit da cadeia.

---

## FASE 1: Higiene de código (roda em HML, imagens promovidas depois)

> Ordem por onda conforme os mapas. Cada onda: TDD onde há lógica, build dos fronts verde,
> testes verdes, revisão spec + qualidade, commit. Referência exaustiva por arquivo nos mapas.

### Task 1.1: coop->SCD Onda 1 (i18n/labels, baixo risco)
**Files:** `core/apps/admin/src/i18n/locales/*.ts` (pt-BR/en/es/es-ES/fr/zh-CN), ver tabela 2.1
do mapa coop.
- Remover chaves do bloco `cooperative.*` (surplus, capital, assemblies, refunds) e trocar
  rótulos "cooperado/associado" por "cliente" nas telas que a SCD mantém.
- Manter `Cooperativa Capital e Empréstimo (uso exclusivo BCB)` (rótulo de código oficial).
- **Test:** `core/apps/admin` build (`npm run build`) verde; testes i18n que fixam chaves
  atualizados (`useReportsCatalog.spec.ts` etc.).
- **Commit.**

### Task 1.2: coop->SCD Onda 2 (types/interfaces)
**Files:** `types/cooperative.ts`, `types/index.ts` (`CooperativeRole`->`StaffRole`,
`cooperative_role`->`staff_role`, remover `conselheiro`), `types/accounting.ts` (remover a
segregação ato-cooperativo, decisão do dono), `stores/admin.ts` (`cooperativeRole`->`staffRole`).
- TDD onde houver lógica (RBAC/store). Cuidado: `staff_role` vem do backend no login (Task 1.6).
- **Commit.**

### Task 1.3: coop->SCD Onda 3 (rotas + RBAC front, com redirect)
**Files:** `router/index.ts` (blocos coop), `composables/useReportsCatalog.ts`,
`useRbacPermissions.ts`.
- Remover rotas de surplus/capital/assemblies/refunds. Redirecionar `/dashboard/cooperative/members*`
  -> `/dashboard/clients*` e `reports/cooperative/*` -> `reports/clients/*` (redirect de compat).
- Renomear chaves RBAC `cooperados.*`/`cooperativa.*` -> `clients.*` (casar com backend Task 1.6).
- **Test:** navegação por URL antiga cai no redirect; build verde.
- **Commit.**

### Task 1.4: coop->SCD Onda 4 (remover subárvore órfã)
**Files:** remover `views/cooperative/{members,capital,surplus,assemblies,branches,refunds}/*`,
`views/accounting/Surplus*`, `views/dashboard/components/sections/FinanceiroSobrasSection.vue`,
composables `useMembers/useMemberDetail/useCapital`.
- ANTES: desacoplar `useInstitution.ts` da fonte "branches" (nome institucional passa a vir de um
  endpoint SCD ou config), senão o cabeçalho da UI quebra.
- **Test:** build verde; nenhuma rota viva referencia os removidos.
- **Commit.**

### Task 1.5: coop->SCD Onda 5 (backend correlato + alias)
**Files:** `core/backend/lib/monetarie_web/router.ex` (scope `/cooperative/*`),
`use_cases/cooperative/roles.ex`, `fiscal_council.ex`, plugs `cooperative_*`, `results_engine.ex`,
`results.ex`, `flows/cooperativa.ex`, `v2/auth_controller.ex`, `dashboard/aggregator.ex`.
- Manter os paths `/cooperative/*` de fluxo vivo (crédito, loan collateral, accounts reports,
  branch header) via ALIAS/redirect para os novos nomes SCD. Remover papel `conselheiro` e o
  fiscal council. Remover a segregação ato-cooperativo do COSIF (revisão contábil, preservar
  balancete/DRE ao centavo nos demais campos).
- **Test (TDD):** testes de results_engine provam que o balancete fecha sem a segregação;
  teste de login prova `staff_role` sem `conselheiro`; teste de RBAC com as novas chaves.
- **Commit.**

### Task 1.6: coop->SCD Onda 6 (testes + varredura final)
- Atualizar todos os specs que fixam nomes coop. `grep -rniE 'cooperad|cooperativ|conselheiro'`
  volta só o mantido conscientemente (documentado no mapa).
- **Gate:** build dos fronts + `mix test` do Core verdes; screenshots antes/depois dos menus.
- **Commit.**

### Task 1.7: OnZ Onda 0 (remoções mecânicas)
**Files:** chaves i18n mortas (`onzUsername/onzPassword/ONZ_BASE_URL/simulatorBanner/resyncButton`),
docstrings OnZ no backend, e-mail `regulatorio@avivpay.com.br`, 4 stubs.
- **Test:** build verde; nenhuma chave removida é consumida (grep).
- **Commit.**

### Task 1.8: OnZ Onda 1 (renomear CaixaAviv -> Caixa Institucional)
**Files:** `views/treasury/CaixaAvivView.vue` (renomear arquivo/rota/labels),
`SettlementBalanceCard.vue`, `SettlementBalanceView.vue`, i18n, `tokens.css`.
- Remover marca AvivPay/OnZ dos rótulos; parametrizar o operador hardcoded
  `vitor.rodrigues@avivpay.com.br`. Preservar o transfer money-path (hoje dormente).
- **Commit.**

### Task 1.9: OnZ Onda 2 (readequar reconciliação de tesouraria -> nossa cabine)
**Files:** `pix_in_orphan_reconciliation.ex`, `post_deploy_reconciliation.ex`, stubs de
reconciliação de tesouraria, `ReconciliationView.vue`.
- **TDD:** substituir o "sempre sem diferenças" por reconciliação real de saldo/liquidação contra
  a cabine Monetarie (pix-api), com diferenças reais. Teste com um caso de divergência conhecida
  provando que a diferença aparece. MONEY-PATH: revisão dupla, `money_boundary`/`money_unit`
  intactos (histórico do bug 100x).
- **Commit.**

### Task 1.10: OnZ Onda 3 (MGMT Query -> camt.060 real)
**Files:** PIX cabine: novo parser/builder camt.054 + endpoint `POST /pix/mgmt/query`; Core:
`useMgmtQuery.ts`, `MgmtQueryView.vue` (repointar para o Core, que chama a cabine).
- **TDD:** (a) parser camt.054 na cabine extrai valor/ISPBs/status do `Ntfctn/Ntry/NtryDtls/TxDtls`
  (reusar `Shared.Med.TransactionEnrichment.extract_camt054_entry` como base, ver bateria 07-07);
  (b) endpoint dispara camt.060 detalha-lancto (`event_id=E2E`) e faz MERGE com os pacs locais
  para cobrir rejeição/cancelamento/devolução; (c) mapeamento camt.054 -> shape `MgmtFormatted`
  documentado no mapa OnZ, campo a campo. Reusar o fix de RptgPrd/agrupamento provado nesta sessão.
- **Test:** teste do parser com camt.054 real (inclusive byte Latin-1, ver fix desta sessão);
  teste do endpoint com stub de cabine; front consome o mesmo shape sem mudança de UI.
- **Commit.**

### Task 1.11: Dedup de menus (Administradores vs Usuários Admin) e nomenclatura homolog
**Files:** menus dos 3 fronts (Core `AdminLayout.vue`/`Sidebar`, PIX `Sidebar.vue`, SPB `Sidebar.vue`),
hardcode de `homolog/HML` nos 3 fronts + backends.
- Consolidar itens duplicados numa rota canônica (redirect na redundante). Parametrizar por `env`
  os rótulos de ambiente; remover texto morto "Homologação"; endpoints homolog hardcoded viram
  config por `env`.
- **Gate:** `grep -rniE 'homolog'` volta só o parametrizado por env; screenshots dos menus.
- **Commit.**

---

## FASE 2: Trilhas de auditoria (3 fronts) + tags

### Task 2.1: Diagnóstico das 3 trilhas (banco vivo)
- PIX `GET /api/v1/audit/logs`, SPB `/admin/audit-trail`, Core (mapear o que existe vs o que a
  tela espera). Provar, por front, se o vazio é gravação, leitura ou exibição.
- **Gate:** relatório `docs/reports/2026-07-07-auditoria-3-fronts-diagnostico.md` com a causa por front.

### Task 2.2: Fechar a malha de gravação (plug/middleware de auditoria)
**TDD:** garantir que login, CRUD de usuário/grupo/permissão, mudança de config, aprovações e
operações BACEN gravam evento de auditoria com origem (SYSTEM/USER/BACEN) e tag. Teste: ação
dispara -> linha na trilha.
- **Commit por front.**

### Task 2.3: Dicionário de tags (tabela de referência + legenda na UI)
**Files:** seed de referência `audit_event_types` (AUTH_LOGIN, CONFIG_CHANGE, USER_CREATE,
ALCADA_APPROVE, BACEN_SEND, DAY_OPEN etc. com origem/severidade/retenção); legenda nas 3 telas.
- **Gate:** login + criar grupo aparecem na trilha com a tag certa, provado ao vivo + screenshot.
- **Commit.**

---

## FASE 3: Infra de produção (Terraform env=prod)

### Task 3.1: Estado Terraform prod isolado + data sources da VPC 10.50
**Files:** `infra/aws/greenfield/` novo backend/workspace `prod`, `terraform.tfvars` prod
(`env=prod`, CIDR/subnets 10.50, endpoints RTM/HSM/MQ/RSFN prod). `data.tf` adota
`vpc-0da523dbdbac50b5d` e subnets `monbank-rtm-prod-1a/1b/1c`.
- **Gate:** `terraform init` + `terraform plan` (sem apply) coerente, adotando a VPC, sem tocar HML.

### Task 3.2: Aurora PG 17.9, Redis, KMS, ECR prod
- Aurora `aurora-postgresql` 17.9 (não 16), bancos `mon_*`. Redis. Uma CMK KMS por domínio. ECR
  (mesmos repos, imagens promovidas por digest).
- **Gate:** `terraform apply` do bloco de dados; endpoints resolvem; sem recurso órfão.

### Task 3.3: NATS 3 nós
- Cluster JetStream 3 nós EC2 (streams com 3 réplicas), IPs na 10.50.
- **Gate:** 3 nós Online, streams criadas com replica=3.

### Task 3.4: TigerBeetle cluster 3 nós (0.17.3, 1 por AZ)
**Files:** módulo TB generalizado para 3 réplicas (`--addresses` dos peers), EBS dedicado por nó,
1 nó por AZ (10.50.1.x/2.x/3.x). Imagem `ghcr.io/tigerbeetle/tigerbeetle:0.17.3`.
- `TB_POOL_SIZE=3` nas task-defs das cabines/Core.
- **Gate:** cluster forma quorum (3 réplicas), `tigerbeetle` responde; conta de teste criada e lida.

### Task 3.5: ALB interno, Route 53 privada, VPC endpoints, OpenVPN, RSFN resolver
- Espelhar HML com valores prod. Zona `monetarie.internal` de produção (hosts `-p` ou equivalente,
  NÃO reusar os `-h` de HML).
- **Gate:** `terraform plan` limpo; hosts internos resolvem.

---

## FASE 4: Bootstrap de dados (produção vazia de negócio)

### Task 4.1: Auditoria e split dos seeds
**Files:** classificar cada bloco de seed (Core/PIX/SPB) REAL vs SUJEIRA conforme design B1.
Criar perfil `SEED_PROFILE=prod` (ou `seeds/prod/*`) que roda só o REAL.
- **Test:** rodar o seed prod num banco limpo local prova: referência populada, negócio=0.
- **Commit.**

### Task 4.2: Migrations limpas no Aurora prod
- Rodar todas via `rpc` (não `eval`). Conferir contagem: referência esperada, negócio=0.
- **Gate:** dump de contagem.

### Task 4.3: Diretório de instituições (oficial PRD + participantes PIX + Ativados)
**TDD:** construir o diretório concatenando a fonte oficial de produção do BACEN com o
`Shared.Bacen.PixParticipants.ImportWorker` (bcb.gov.br), reconciliando ISPB a ISPB e cruzando com
os certs dos bundles `Ativados-SPB`/`Ativados-MES`. Teste: ISPBs conhecidos (00038166, 46026562)
presentes com nome e cert.
- **Commit.**

### Task 4.4: Parametrizações iniciais + admin inicial
- ISPB 46026562, COMPE 526, SISBACEN 00018, endpoints BACEN de PRODUÇÃO, flags no estado seguro
  (ENVIO desabilitado até o eco). Admin `admin@monetarie.com` nos 3 sistemas, senha só no Secrets
  Manager `monetarie/prod/admin/*` (troca no 1º login). CONFIRMAR o e-mail (`.com` vs `.com.br`).
- **Gate:** 1 admin por sistema, login OK, negócio=0.

---

## FASE 5: Cripto/certs no HSM prod

### Task 5.1: Registrar peers BACEN + Ativados no truststore/registry
**Files:** PIX `apps/shared/priv/certs/` (PIA-P515, PIC-P514), SPB registry (SPB-P060, MES-P061,
bundles Ativados). Só públicos no repo.
- **Test:** verificação de assinatura de uma mensagem BACEN de exemplo usa o peer certo.

### Task 5.2: Nossos certs no HSM prod (PIA/PIC PIX, 2 SPB) via secrets
- UIDs em `monetarie/prod/*`. PIX assina (PIA) e faz mTLS (PIC via PKCS#11, Task 0.1). SPB idem.
- **Gate:** assinatura de teste OK no HSM prod.

---

## FASE 6: Deploy e gate BACEN

### Task 6.1: Promover imagens por digest (HML validada -> prod) e subir serviços
- Ordem SPB -> PIX -> Core. Task-defs com secrets `monetarie/prod/*`, `TB_POOL_SIZE=3`, endpoints
  prod. spb-api preserva o sidecar MQ.
- **Gate:** rollouts COMPLETED, health 200 nos hosts prod.

### Task 6.2: GATE BACEN (eco assinado, go/no-go do ENVIO)
- PIX: pibr.001 assinada com PIA P003 -> esperar 201 + eco pibr.002 do BACEN de produção.
- SPB: eco/GEN0001 assinado -> 201.
- **Gate:** eco aceito (201) em PIX e SPB com certs de produção, evidência capturada. SÓ então
  liberar a flag de ENVIO real.

### Task 6.3: Handoff de go-live
- Consolidar evidências (regra #11) de todos os gates num handoff
  `docs/handoff/2026-07-07-go-live-producao.md`. Rollback documentado por serviço.

---

## Riscos e gates que travam avanço (resumo)

- **PKCS#11 do HSM prod** (Task 0.1) bloqueia o go-live PIX.
- **Acessos RTM prod** (Task 0.2): HSM/MQ `172.31.1.50`/RSFN precisam CONNECT+auth de 10.50.
- **Money-path** (Tasks 1.9, 1.10, 1.5): revisão dupla, TB/money_unit intactos, balancete ao centavo.
- **Nenhum ENVIO real** antes do eco (Task 6.2).
- **Segredos** só no Secrets Manager; `grep` final sem `homolog/coop/OnZ` no produto.
