# Mapa de remoção OnZ / AvivPay do Core (Fase 1, map-first)

Data: 2026-07-07
Autor: engenharia (varredura read-only, nenhum arquivo de código alterado)
Escopo varrido: `core/apps/{admin,banking,merchant}/src` e `core/backend/lib`
Objetivo: mapear e classificar toda menção a OnZ / AvivPay / CloudPIX antes de qualquer edição, para aprovação do dono.

> Contexto: o Core foi portado do produto Owem/AvivPay, que sentava sobre o provedor PIX externo OnZ (CloudPIX) e reconciliava contra ele. A Monetarie tem cabine PIX própria (`pix/backend`, serviço `pix-api`) e não usa OnZ. O dono quer remover toda menção a OnZ/AvivPay do produto.

---

## 1. Resumo executivo

### 1.1 Contagem

Tokens brutos casando `onz|aviv|OnZ|AvivPay|CaixaAviv|SettlementBalance|MgmtQuery|ONZ_BASE_URL|onzUsername|onzPassword` na árvore varrida: aprox. **545 ocorrências** (o número "~272" citado no mandato corresponde grosso modo a um único locale + código; o total infla porque as strings i18n são replicadas em 5 idiomas). Distribuição real, já descontados os falsos positivos:

| Área | Ocorrências reais | Observação |
|---|---|---|
| i18n (admin+banking+merchant, 5 locales) | ~188 | strings de UI; a maioria é o mesmo texto repetido por idioma |
| Admin código (`.vue`/`.ts`, fora i18n) | ~312 | inclui 177 no `MgmtQueryView.vue`, que na maioria são chaves `t('mgmtQuery.field*')`, não a marca "OnZ" |
| Banking + Merchant código (fora i18n) | 16 | branding + comentários + fixtures de teste |
| Backend `lib` (`.ex`) | 34 | **quase tudo docstring/comentário**; 1 e-mail hardcoded; endpoints stub |
| `tokens.css` (admin+merchant) | 8 | comentários "AvivPay Design Tokens / AvivPay Blue" |

Falsos positivos confirmados e excluídos: `nonzero` (split_distributor.ex, telemetry.ex), `onze/bronze`, "port-aviv" (nome interno da task de comparação com a produção AVIV, não o provedor OnZ).

### 1.2 Por categoria de ação

| Categoria | O que é | Ocorrências aprox. | Risco predominante |
|---|---|---|---|
| **(a) REMOVER** — integração OnZ pura | credenciais/URL do OnZ, banner de simulador, "resync from OnZ", "OnZ poller" | ~20 (a maioria são chaves i18n **mortas**, consumidas em lugar nenhum) | baixo |
| **(b) READEQUAR** — apontar para nossa cabine | MGMT Query, telas de Liquidação/Conciliação (backend hoje é stub), workers de reconciliação (lógica já migrada, sobra comentário) | ~40 código + ~15 i18n | **money-path / alto** |
| **(c) RENOMEAR** — rótulo/branding | tokens.css, títulos i18n de tesouraria, CaixaAvivView (feature legítima só rebrandada), sidebar/merchant, e-mail CADOC, fixtures de teste | ~450 (inflado por i18n×5) | baixo |

Achado central: **o backend do Core já está praticamente livre de lógica OnZ viva.** As integrações reais (poller OnZ, login OnZ, MGMT API, confirmação de órfãos via OnZ) já foram removidas em ondas anteriores (port coreproviders/AVIV). O que sobra no backend é: (i) docstrings/comentários que explicam a divergência com o Owem; (ii) 4 endpoints **stub** que só devolvem dados locais mas ainda usam o nome `caixa_aviv`/`settlement`; (iii) 1 e-mail `regulatorio@avivpay.com.br`. O grosso da marca OnZ/AvivPay viva está no **frontend admin** (i18n + telas de tesouraria + MGMT Query) e no **branding merchant/banking**.

---

## 2. Tabela por cluster

Legenda de risco: **money-path** (toca crédito/TB/reconciliação de saldo) · **rota** (path de API compartilhado FE/BE) · **backend** · **baixo**.

### Categoria (a) — REMOVER (integração OnZ pura)

| Cluster | Arquivos (ocorrências) | Ação | Detalhe | Risco |
|---|---|---|---|---|
| Credenciais / URL do provedor OnZ | `apps/admin/src/i18n/locales/*.ts` chaves `onzUsername`, `onzPassword`, `pixUrlInfoMessage` (menciona `ONZ_BASE_URL`), `simulatorBannerDesc`, `resyncButton` (×5 locales ≈ 25 linhas) | Remover | **Chaves i18n mortas**: `grep` prova que nenhum `.vue`/`.ts` consome `onzUsername`/`onzPassword`/`simulatorBanner`/`resyncButton`. A tela de settings do provedor OnZ já foi removida; sobraram só as strings. Remoção segura. | baixo |
| Comentário "bate na OnZ" | `apps/admin/src/views/settings/PixSettingsView.vue:31` (1) | Remover comentário | Comentário obsoleto ("Read-only, bate na OnZ"); a chamada é `/analytics/dict-bucket/policy` na nossa cabine. | baixo |
| "OnZ poller a cada 5 min" | `apps/admin/src/components/dashboard/SettlementBalanceCard.vue:312` (1) | Remover claim | Não existe poller OnZ; o card é alimentado por saldo do Core. Remover a frase do rodapé. | baixo |
| Comentário "no OnZ HTTP" | `apps/{banking,merchant}/src/views/compliance/ComplianceView.vue:229` (2) | Remover comentário | Lê `pix_infractions` local; comentário só cita ausência de OnZ. | baixo |

### Categoria (b) — READEQUAR (fonte passa a ser a cabine Monetarie)

| Cluster | Arquivos (ocorrências) | Ação | Detalhe do readequar | Risco |
|---|---|---|---|---|
| **OnZ MGMT Query** (caso especial) | `apps/admin/src/composables/useMgmtQuery.ts` (36), `apps/admin/src/views/pix/MgmtQueryView.vue` (177, majoritariamente chaves i18n), `backend .../coreproviders_parity_controller.ex:1128 pix_mgmt_query` (1), rota `router.ex:2644 POST /pix/mgmt/query` | Readequar | Ver **Seção 3**. Manter o contrato de resposta (`MgmtQueryResult`) intacto; trocar a fonte de `mgmt.formatted`: hoje é stub (`found:false`), passa a vir de uma **camt.060 detalha-lancto** (`ReqdMsgNmId=camt.054`, `RptgReq/Id=E2E`) contra a cabine/BACEN, mapeando o camt.054 de retorno para `MgmtFormatted`. | **money-path (leitura), backend, rota** |
| Liquidação / Conciliação de tesouraria (telas) | `apps/admin/src/views/treasury/SettlementBalanceView.vue` (9), `.../ReconciliationView.vue` (14), `apps/admin/src/components/dashboard/SettlementBalanceCard.vue` (20) | Readequar + renomear | Hoje leem `/treasury/settlement-balance/{history,refresh,consolidated-statement}` e `/treasury/reconciliation`. O **backend já é stub** (ver abaixo) e devolve saldo do Core rotulado como "settlement/OnZ". Readequar de verdade = a fonte da "conta liquidação" deve ser **o saldo da conta de liquidação da nossa cabine PIX** (extrato camt.052/053 já baixado pela cabine, ou `CabinStatusLookup` agregado), confrontado com o razão de clientes do Core. Relabel OnZ→cabine em conjunto. | **money-path (exibe drift de custódia)** |
| Backend stubs de liquidação/conciliação | `coreproviders_parity_controller.ex`: `treasury_reconciliation:1239`, `settlement_balance_history:1249`, `refresh_settlement_balance:1275`, `balances_summary_payload` (`caixaAvivTotalSubcent:1903`) | Readequar | **Alerta:** `treasury_reconciliation` devolve sempre `differences: []` (ready) e `settlement_balance_history` fabrica linhas a partir do saldo do Core rotulando `source: "monetarie_core"`. Isto é um **ponto cego de money-path**: a conciliação nunca acusa divergência. Readequar para uma conciliação real cabine×Core. | **money-path, backend** |
| Workers de reconciliação PIX-IN (lógica já migrada) | `backend/lib/monetarie/workers/pix_in_orphan_reconciliation.ex` (6), `.../post_deploy_reconciliation.ex` (3), `.../pix_in_pg_write_job.ex` (2) | Renomear (só comentário) | A lógica **já foi readequada** (D17: OnZ MGMT dropado, `payment_status='settled'` no PG passou a ser autoritativo, `provider "onz"→"spi"`). Sobram apenas docstrings explicando a divergência com o Owem. Ação = limpar comentários; **não mexer na lógica**. Sitam em money-path (chamam `Deposit.execute`→TB). | **money-path (só comentário)** |
| Fronteira de unidade monetária (só comentário) | `backend/lib/monetarie/infra/nats/money_boundary.ex` (4), `.../util/money_unit.ex` (3), `.../use_cases/pix/reason_codes.ex` (2), `.../use_cases/pix/tb_first/handler.ex` (4), `.../tb_first/return_in_handler.ex` (1), `.../use_cases/payments/outbound/pix.ex` (1), `.../schemas/pix/idempotency_log.ex` (1) | Renomear (só comentário) | Docstrings do tipo "o papel que o OnZ faz no Owem é feito pela cabine". Lógica correta e viva. Limpeza textual apenas. `money_unit`/`money_boundary` convertem centavos↔base units (histórico do bug 100x) — **não tocar na lógica**. | **money-path (só comentário)** |

### Categoria (c) — RENOMEAR (rótulo/branding sem lógica)

| Cluster | Arquivos (ocorrências) | Ação | Risco |
|---|---|---|---|
| Design tokens (marca) | `apps/admin/src/shared/theme/tokens.css` (4), `apps/merchant/src/shared/theme/tokens.css` (4) | Renomear comentários "AvivPay Design Tokens / AvivPay Blue / AvivPay deep dark" → Monetarie | baixo |
| Títulos/labels i18n de tesouraria e MGMT | `apps/admin/src/i18n/locales/{pt-BR,en,es,es-ES,fr,zh-CN}.ts` — "Conta Liquidação OnZ", "Conciliação OnZ × Monetarie", "Consulta MGMT OnZ", "Saldo real OnZ", "saldo próprio AvivPay", "OnZ / BACEN (MGMT)", "PIX OUT presos na cabine OnZ", "stuckForOnz", subtítulos `mgmtQuery.*` (≈28 chaves × 5 locales) | Renomear | baixo |
| **CaixaAvivView** (feature legítima, só rebrandada) | `apps/admin/src/views/treasury/CaixaAvivView.vue` (32), rota `router.ex:1190` (path já é `treasury/caixa-institucional`, name `TreasuryCaixaInstitucional`, mas ainda importa o componente `CaixaAvivView.vue`), `navigation.ts` label | Renomear | ver nota abaixo — **money-path (transfer)** |
| Branding Merchant | `apps/merchant/src/shared/components/FlxSidebar.vue:26` (`brandLabel:'AvivPay'`), `.../views/settings/TwoFactorAuthView.vue:458` (`'avivpay-backup-codes.txt'`), `.../plugins/i18n-fallbacks.ts` (securityRisk3 "A AvivPay recomenda", ×3 locales) | Renomear | baixo |
| Branding Banking | `apps/banking/src/i18n/*.ts` — `aboutTitle:"About AvivPay"`, `appName:"AvivPay"`, `brandSub:"AvivPay - Financial Infrastructure"` | Renomear | baixo |
| Fixtures de teste de comprovante | `apps/{banking,merchant}/src/views/receipts/__tests__/ReceiptView.test.ts` — `institution:'AVIV'` e asserts `not.toContain('AvivPay')` | Renomear fixtures | baixo |
| E-mail regulatório hardcoded | `backend/lib/monetarie/use_cases/regulatory/cadoc1201/aggregator.ex:165` (`"regulatorio@avivpay.com.br"`) | Renomear para e-mail Monetarie | **backend (relatório regulatório BACEN)** |
| Identificadores internos (variáveis/interfaces) | `SettlementBalanceCard.vue` (`onzStatusLabel`, `onzVsClientsDriftSubcent`, `caixaAvivTotalSubcent`), `ReconciliationView.vue`/`SettlementBalanceView.vue` (`onzSubcent`, `onzBrl`, `OnzTransaction`) | Renomear (cosmético) | baixo (fazer junto do readequar b) |

**Nota CaixaAvivView (importante, corrige a premissa do mandato):** o mandato lista `CaixaAvivView` em (a) REMOVER. A varredura mostra que **não é integração OnZ** — é a "Caixa Institucional", conta operacional própria para segregar a receita líquida de tarifas PIX (transfere de `fee_pix` para a Caixa via TigerBeetle). É uma **feature legítima da Monetarie apenas rebrandada "AvivPay"** (título "Conta operacional AvivPay IP", diálogo "Cadastrar EVP ... via OnZ", e operador default hardcoded `vitor.rodrigues@avivpay.com.br` / "Vitor Rodrigues" / CPF `046.680.533-09`, que é identidade de pessoa da AvivPay). Ação correta = **RENOMEAR** (título, defaults do operador, texto do diálogo, nome do arquivo do componente), não remover. Detalhe operacional: o endpoint de dinheiro `POST /treasury/caixa-aviv/transfer` e o `GET /treasury/caixa-aviv/` **não têm rota registrada** hoje no `router.ex` (só existem `provision`/`operator delete`/`pix-key`/`mirror`, todos stubs) — ou seja, o transfer atualmente retornaria 404 (money-path dormente). Renomear o path `caixa-aviv`→`caixa-institucional` exige mudança coordenada FE+BE.

---

## 3. Caso especial — OnZ MGMT Query (READEQUAR, não remover)

### 3.1 Decisão do dono
Manter o **contrato de resposta** que a tela já consome e trocar a **fonte de dados**: em vez de consultar a API MGMT do OnZ, disparar uma **camt.060 de consulta de operação** (detalha-lancto, `ReqdMsgNmId=camt.054`, `RptgReq/Id=E2E`) contra a nossa cabine/BACEN e mapear o **camt.054** de retorno para o mesmo shape.

### 3.2 (i) Contrato de resposta atual que a UI consome
Fonte de verdade: `apps/admin/src/composables/useMgmtQuery.ts`. A tela (`MgmtQueryView.vue`) e o `buildSummaryText()` consomem exatamente estes campos.

Envelope `MgmtQueryResult`:
```
{
  mgmt:  { found: boolean, status: string|null, raw: object|null, formatted: MgmtFormatted|null },
  local: { found, transaction: LocalTransaction|null, fee, webhooks[], accountInfo },  // já é do Core, não muda
  localPacs?: LocalPacsMessage[],   // já é do Core (nossas pacs.002/pacs.008), não muda
  comparison: { state: string, message: string },
  rejectionCode?: RejectionCode
}
```

`MgmtFormatted` (o objeto que hoje viria do MGMT OnZ e precisa passar a vir do camt.054):
`e2e, msgId, status, statusNormalized (CONCLUIDA/CANC/RJCT/PDNG/DVTD), valor(number),
tipoMovimento, formaDeIniciacao, tipoTransacao, finalidade, prioridade,
pagador, documentoPagador, contaPagador, agenciaPagador, ispbPagador, nomeBancoPagador, tipoContaPagador,
recebedor, documentoRecebedor, contaRecebedor, agenciaRecebedor, ispbRecebedor, nomeBancoRecebedor, tipoContaRecebedor,
idContaTransacional, idConciliacao, infoEntreUsuarios,
criacao, dataLiquidacao,
codigoErro, motivoErro, descricaoErro,
motivoCancelamento, solicitanteCancelamento, dataCancelamento,
e2eDevolucao, valorDevolucao(number|string), motivoDevolucao, dataDevolucao,
e2eOriginal,
messages: PacsMessage[]`

### 3.3 (ii) Endpoint/params atuais
- FE → `api.post('/pix/mgmt/query', { e2e_id })` (useMgmtQuery.ts:224).
- BE → `router.ex:2644 POST /pix/mgmt/query` → `CoreprovidersParityController.pix_mgmt_query/2`.
- Estado atual do BE: **stub**. Só busca a transação local (`Transaction where end_to_end_id or transaction_id`) e retorna `mgmt: {found:false, status:nil, raw:nil, formatted:nil}`, `comparison.state ∈ {local_only, not_found}`. Ou seja, **hoje o painel "OnZ / BACEN (MGMT)" já vem vazio** — a tela mostra apenas o lado local.

### 3.4 (iii) Mapeamento proposto camt.054 → `MgmtFormatted` (campo a campo)
Disparo: Core pede à cabine uma **camt.060** com `ReqdMsgNmId = camt.054.001.xx` e `RptgReq/Id = <E2E>` (detalha-lancto de 1 operação). A cabine assina/envia à SPI e devolve o **camt.054** (`BankToCustomerDebitCreditNotification`) correspondente. Mapeamento do `Ntfctn/Ntry` + `NtryDtls/TxDtls`:

| `MgmtFormatted` | Origem no camt.054 (XPath relativo a `Ntfctn/Ntry`) |
|---|---|
| `e2e` | `NtryDtls/TxDtls/Refs/EndToEndId` |
| `msgId` | `../GrpHdr/MsgId` (ou `TxDtls/Refs/MsgId`) |
| `status` / `statusNormalized` | `Sts/Cd` (`BOOK`→CONCLUIDA, `PDNG`→PDNG); `RJCT/CANC/DVTD` derivam do fluxo complementar (ver nota) |
| `valor` | `Amt` (ou `TxDtls/Amt`) → `Number` |
| `tipoMovimento` | `CdtDbtInd` (`CRDT`=Recebido / `DBIT`=Enviado) |
| `formaDeIniciacao` | `TxDtls/LclInstrm/Prtry` (MANU/DICT/QRDN/QRES) |
| `tipoTransacao` | `TxDtls/LclInstrm` / `TxDtls/Purp` |
| `finalidade` | `TxDtls/Purp/Cd` ou `/Prtry` |
| `prioridade` | não vem no camt.054 (é da pacs.008 `InstrPrty`) → `null` |
| `pagador` | `TxDtls/RltdPties/Dbtr/Nm` |
| `documentoPagador` | `RltdPties/Dbtr/Id/{PrvtId/Othr/Id|OrgId/Othr/Id}` |
| `contaPagador` | `RltdPties/DbtrAcct/Id/Othr/Id` |
| `agenciaPagador` | `RltdPties/DbtrAcct/Id/Othr/Issr` (ou `/Prtry`) |
| `ispbPagador` | `RltdAgts/DbtrAgt/FinInstnId/ClrSysMmbId/MmbId` (ISPB) |
| `nomeBancoPagador` | `RltdAgts/DbtrAgt/FinInstnId/Nm` (ou resolver ISPB via `institution_directory`) |
| `tipoContaPagador` | `RltdPties/DbtrAcct/Tp/Prtry` (CACC/SVGS/TRAN/SLRY) |
| `recebedor` | `TxDtls/RltdPties/Cdtr/Nm` |
| `documentoRecebedor` | `RltdPties/Cdtr/Id/...` |
| `contaRecebedor` | `RltdPties/CdtrAcct/Id/Othr/Id` |
| `agenciaRecebedor` | `RltdPties/CdtrAcct/Id/Othr/Issr` |
| `ispbRecebedor` | `RltdAgts/CdtrAgt/FinInstnId/ClrSysMmbId/MmbId` |
| `nomeBancoRecebedor` | `RltdAgts/CdtrAgt/FinInstnId/Nm` |
| `tipoContaRecebedor` | `RltdPties/CdtrAcct/Tp/Prtry` |
| `idContaTransacional` | `RltdPties/CdtrAcct/Prxy/Id` (chave PIX / proxy) |
| `idConciliacao` | `TxDtls/Refs/Prtry` (idConciliacaoRecebedor) ou `NtryDtls/TxDtls/Refs/AcctSvcrRef` |
| `infoEntreUsuarios` | `TxDtls/RmtInf/Ustrd` |
| `criacao` | `BookgDt/DtTm` (ou `TxDtls/RltdDts/...`) |
| `dataLiquidacao` | `ValDt/DtTm` |
| `codigoErro`/`motivoErro`/`descricaoErro` | **não vêm no camt.054 de crédito** — preencher a partir da pacs.002 RJCT que a cabine já tem (via `localPacs`) |
| `motivoCancelamento`/`solicitante`/`dataCancelamento` | fluxo camt.056/pacs.004 — merge complementar |
| `e2eDevolucao`/`valorDevolucao`/`motivoDevolucao`/`dataDevolucao` | pacs.004 (`RtrId`, `RtrdIntrBkSttlmAmt`, `RtrRsnInf/Rsn/Cd`); no camt.054, entry de devolução (`CdtDbtInd`+`RtrInf`) |
| `e2eOriginal` | `TxDtls/Refs/{OrgnlEndToEndId}` (quando a operação é devolução) |
| `messages[]` | sintetizar 1+ `PacsMessage` a partir de `TxDtls` (tipo inferido: pacs.008 crédito, pacs.004 devolução) |

**Nota de projeto (crítica para o dono decidir):**
1. Um único camt.054 de crédito **não carrega** rejeição/cancelamento/devolução com o mesmo detalhe que o MGMT OnZ agregava. O readequar honesto = **merge**: `mgmt.formatted` vem do camt.054, e os campos de rejeição/devolução continuam vindo dos `localPacs`/pacs.002/pacs.004 que a cabine já persiste (é o que a tela já faz para `rejectionCode` e `ourReject`). Nada de inventar caminho.
2. **Não existe builder camt.054 detalha-lancto no `pix-api` hoje** (grep vazio para camt.054 builder). A infra camt.060 existe (`pix/backend/apps/spi_service/.../camt060*`), então o disparo é viável, mas o parser/mapper camt.054→shape é **trabalho novo** na cabine + no Core.
3. **Alternativa já cabeada** que vale colocar na mesa: o Core já tem `Monetarie.Services.PixProviders.InHouse.CabinStatusLookup.by_end_to_end_id/1`, que consulta a API admin da cabine (`GET /api/v1/transactions?end_to_end_id=`) e devolve a transação completa. Isso pode popular `mgmt.formatted` **sem round-trip BACEN**, com o camt.060/camt.054 servindo de fonte-verdade BACEN quando exigido. Recomendo o dono escolher entre (A) camt.060→camt.054 puro (verdade BACEN, custo de build) e (B) CabinStatusLookup como primário + camt.060 como fallback de auditoria.

---

## 4. Itens money-path de ALTO RISCO (revisão obrigatória, mudança mínima)

1. `backend/lib/monetarie/workers/pix_in_orphan_reconciliation.ex` — chama `Deposit.execute` → backfill em TigerBeetle. **Só comentários OnZ**; não alterar lógica.
2. `backend/lib/monetarie/use_cases/pix/tb_first/handler.ex` e `.../tb_first/return_in_handler.ex` — caminho de depósito/crédito PIX-IN e devolução. Só docstring OnZ.
3. `backend/lib/monetarie/workers/pix_in_pg_write_job.ex` — escrita canônica PG do PIX-IN (`provider "spi"`). Só comentário.
4. `backend/lib/monetarie/infra/nats/money_boundary.ex` + `backend/lib/monetarie/util/money_unit.ex` — conversão centavos↔base units (subcentavos). Histórico do **bug 100x**. Só docstring OnZ; **jamais** tocar na aritmética junto do rebrand.
5. `backend/lib/monetarie/workers/post_deploy_reconciliation.ex` — reconciliação pós-deploy TB×PG. Só docstring.
6. Backend stubs de liquidação/conciliação (`coreproviders_parity_controller.ex`: `treasury_reconciliation`, `settlement_balance_history`, `refresh_settlement_balance`) — **ponto cego atual**: a conciliação de custódia sempre responde "sem diferenças". O readequar (categoria b) deve ligar isso à cabine de verdade; enquanto for stub, a tela dá falsa sensação de conciliado.
7. `CaixaAvivView.vue` + `POST /treasury/caixa-aviv/transfer` — transfer `fee_pix`→Caixa via TB (money-path). Hoje o endpoint de transfer **não está roteado** (404). Renomear path exige mudança coordenada FE+BE e re-teste do transfer.
8. **Não confundir com money-path OnZ:** `use_cases/fees/split_distributor.ex` casa o padrão só por causa de `nonzero` (10 "matches" falsos). É money-path (split de tarifas) mas **não tem nada de OnZ** — não entra neste mandato.

---

## 5. Ordem de execução em ondas

**Onda 0 — risco zero, sem money-path, sem rota (limpeza mecânica):**
- Remover chaves i18n mortas do provedor OnZ (`onzUsername`, `onzPassword`, `pixUrlInfoMessage`/`ONZ_BASE_URL`, `simulatorBannerDesc`, `resyncButton`) nos 5 locales.
- Renomear branding em `tokens.css` (admin+merchant), `FlxSidebar` `brandLabel`, `TwoFactorAuthView` nome do arquivo de backup, `i18n-fallbacks` securityRisk3, banking `aboutTitle/appName/brandSub`.
- Trocar `regulatorio@avivpay.com.br` (cadoc1201) por e-mail Monetarie.
- Remover comentários obsoletos ("bate na OnZ", "no OnZ HTTP", "OnZ poller").

**Onda 1 — rótulo de UI (baixo risco, sem lógica):**
- Renomear strings i18n de tesouraria/MGMT OnZ→cabine/custódia (Conta Liquidação, Conciliação, Consulta MGMT, Saldo real, saldo próprio, "presos na cabine OnZ").
- Renomear `CaixaAvivView`: título, texto do diálogo ("via OnZ"), defaults do operador (remover a identidade AvivPay hardcoded). Renomear o arquivo do componente e ajustar o import no `router.ex` (path/route name já estão em `caixa-institucional`).
- Renomear rótulos/variáveis internas nas telas de settlement/reconciliation (`onz*`, `caixaAviv*`, `OnzTransaction`).
- Atualizar fixtures de teste de comprovante (`institution:'AVIV'`, asserts AvivPay).

**Onda 2 — readequar backend de liquidação/conciliação (médio, backend):**
- Trocar os stubs `settlement_balance_history`/`refresh_settlement_balance`/`treasury_reconciliation` por leitura real: saldo da conta de liquidação da cabine PIX (extrato camt.052/053 já baixado, ou agregação via CabinStatusLookup) × razão de clientes do Core. Fim do "sempre sem diferenças".
- Decidir o destino dos endpoints `caixa-aviv/*` não roteados (rotear+renomear o transfer ou remover o botão da tela).

**Onda 3 — readequar a MGMT Query (alto, backend+cabine, com prova empírica):**
- Implementar `pix_mgmt_query` para disparar camt.060 detalha-lancto (`ReqdMsgNmId=camt.054`, `RptgReq/Id=E2E`) à cabine e mapear o camt.054 para `MgmtFormatted` (Seção 3.4), preservando 100% o contrato. Merge com `localPacs` para rejeição/devolução. Validar contra um E2E real em HML.

**Onda 4 — limpeza de comentários em módulos money-path (alto, só texto):**
- Remover docstrings OnZ dos módulos de money-path (workers de reconciliação, `money_boundary`, `money_unit`, `tb_first/*`, `reason_codes`, `outbound/pix`, `idempotency_log`). **Diff só de comentário, revisão dupla, zero mudança de lógica**, para não arriscar o caminho do dinheiro por causa de rebrand.

---

### Anexo — arquivos-chave citados (caminhos absolutos)
- `/Users/luizpenha/monetarie/core/apps/admin/src/composables/useMgmtQuery.ts`
- `/Users/luizpenha/monetarie/core/apps/admin/src/views/pix/MgmtQueryView.vue`
- `/Users/luizpenha/monetarie/core/apps/admin/src/views/treasury/CaixaAvivView.vue`
- `/Users/luizpenha/monetarie/core/apps/admin/src/views/treasury/SettlementBalanceView.vue`
- `/Users/luizpenha/monetarie/core/apps/admin/src/views/treasury/ReconciliationView.vue`
- `/Users/luizpenha/monetarie/core/apps/admin/src/components/dashboard/SettlementBalanceCard.vue`
- `/Users/luizpenha/monetarie/core/apps/admin/src/router/index.ts`
- `/Users/luizpenha/monetarie/core/apps/admin/src/lib/navigation.ts`
- `/Users/luizpenha/monetarie/core/apps/admin/src/i18n/locales/{pt-BR,en,es,es-ES,fr,zh-CN}.ts`
- `/Users/luizpenha/monetarie/core/apps/{admin,merchant}/src/shared/theme/tokens.css`
- `/Users/luizpenha/monetarie/core/apps/merchant/src/shared/components/FlxSidebar.vue`
- `/Users/luizpenha/monetarie/core/apps/merchant/src/views/settings/TwoFactorAuthView.vue`
- `/Users/luizpenha/monetarie/core/apps/merchant/src/plugins/i18n-fallbacks.ts`
- `/Users/luizpenha/monetarie/core/apps/banking/src/i18n/*.ts`
- `/Users/luizpenha/monetarie/core/apps/{banking,merchant}/src/views/receipts/__tests__/ReceiptView.test.ts`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie_web/controllers/admin/coreproviders_parity_controller.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie_web/router.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie/workers/{pix_in_orphan_reconciliation,post_deploy_reconciliation,pix_in_pg_write_job}.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie/infra/nats/money_boundary.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie/util/money_unit.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie/use_cases/pix/tb_first/{handler,return_in_handler}.ex`
- `/Users/luizpenha/monetarie/core/backend/lib/monetarie/use_cases/regulatory/cadoc1201/aggregator.ex`
- Cabine (fonte para o readequar): `/Users/luizpenha/monetarie/core/backend/lib/monetarie/services/pix_providers/in_house/cabin_status_lookup.ex`; `/Users/luizpenha/monetarie/pix/backend/apps/spi_service/` (camt.060)

---

## Decisões do dono aprovadas (2026-07-07)

1. **MGMT Query: readequar para camt.060 REAL.** `POST /pix/mgmt/query` dispara a camt.060 de consulta de operação (`detalha-lancto`, `ReqdMsgNmId=camt.054`, `RptgReq/Id=E2E`) à cabine Monetarie. Criar o parser/builder camt.054 na cabine (trabalho novo) e fazer o MERGE com os pacs locais para cobrir rejeição/cancelamento/devolução (um camt.054 de crédito não cobre esses casos). Mapear para o shape `MgmtFormatted` que a tela já espera. Contrato documentado neste relatório.
2. **Conciliação de tesouraria: readequar para reconciliar contra a NOSSA cabine agora.** Substituir os stubs que respondem sempre "sem diferenças" por reconciliação real de saldo/liquidação contra a cabine Monetarie, com diferenças reais. Money-path: revisão dupla.
3. **CaixaAvivView: RENOMEAR (não remover).** É a Caixa Institucional (segrega receita líquida de tarifas PIX via transfer no TB). Renomear para "Caixa Institucional Monetarie", remover a marca AvivPay e o operador hardcoded `vitor.rodrigues@avivpay.com.br` (parametrizar). Cuidado com o transfer money-path (hoje sem rota, dormente).
4. **Remoções mecânicas:** chaves i18n mortas (`onzUsername`/`onzPassword`/`ONZ_BASE_URL`/`simulatorBanner`/`resyncButton`), docstrings, e o e-mail `regulatorio@avivpay.com.br`.
