# PIX admin - Onda 2 do deep audit: deploy + handoff completo (2026-06-25)

Continuacao do deep audit do front PIX admin. Esta Onda 2 implementou, verificou e
DEPLOYOU ao vivo as correcoes de maior impacto (mocks, dead-actions, CAMT.060 e features
de backend). Tudo abaixo foi verificado localmente (compilacao/testes/build) e o backend
foi validado empiricamente ao vivo via rpc. A validacao por screenshot do front ficou
pendente porque a VPN derrubou o escopo DNS `monetarie.internal` no meio da sessao.

## Onde trabalhar
- Worktree: `/Users/luizpenha/.config/superpowers/worktrees/monetarie/fix-camt060-verifier`
- Branch: `fix/pix-camt060-verifier-spi-msg-audit` (pushed). HEAD `c17af7a4`.
- NAO editar a working tree principal (`/Users/luizpenha/monetarie`, branch `main`).
- AWS: wrapper `awsmon` (AWS_PROFILE=vulcimonetarie, conta 990933657879, sa-east-1).
- rpc na task viva pix-api (VPN-independente, usa ECS Exec/SSM): `scratchpad/runrpc.sh`
  (recriar do template se a sessao mudar; existe copia em sessoes antigas do scratchpad).
- Front (browser/validacao): PRECISA da VPN ativa com DNS `monetarie.internal`.
  Login http://pixadmin-h.monetarie.internal - admin@monetarie.com.br / Monetarie#Adm2026!.

## Estado de deploy (LIVE, verificado)
- **pix-api**: task-def `monetarie-pix-api-homolog:48`, imagem por DIGEST
  `sha256:b41be768229a768f2e1b579a1c014587b000405801175a0f761f1eb7134cec70`,
  rollout COMPLETED, 1/1 healthy. (Anterior era `:47` digest `9fa101ac`.)
- **pix-admin-ui**: tag MUTAVEL `:homolog-latest` digest
  `sha256:4c9449d8338d387a26202cd510dd1cc33d5f2e9ef730847d223ff093bee114e2`,
  task-def segue `:6` (tag mutavel, conferir por DIGEST), rollout COMPLETED, 1/1 healthy.
  (Anterior era digest `3b10d8b7` da Onda 1.)

## Mecanica de build/deploy (repetir na proxima)
- OrbStack (docker) cai sozinho. Antes de build: `docker info || orb start` (o `orb start`
  imprime "timed out" mas o daemon sobe ~1-3s depois). Bootstrap do builder:
  `docker buildx inspect coreproviders-mk-builder --bootstrap`.
- ECR login: `awsmon ecr get-login-password | docker login --username AWS --password-stdin 990933657879.dkr.ecr.sa-east-1.amazonaws.com`.
- BACKEND (contexto `pix/backend`): `docker buildx build --builder coreproviders-mk-builder
  --platform linux/arm64 -t <ECR>/monetarie/pix-api:<tag> --push --provenance=false .`
  Depois: copiar a task-def atual, trocar `containerDefinitions[0].image` pelo `@digest`
  novo, remover campos read-only (taskDefinitionArn/revision/status/requiresAttributes/
  compatibilities/registeredAt/registeredBy), `register-task-definition`, e
  `ecs update-service --task-definition :N`. Rollout single-task ~2-3 min.
- FRONT (contexto `pix/frontend/admin`): build -> push `:homolog-latest` ->
  `ecs update-service --force-new-deployment` (NAO incrementa task-def). Ao validar no
  browser use cache-buster (`?cb=x`) - o browser cacheia o index.html durante o rollout.
- Verificacao local ANTES do deploy: backend `cd pix/backend && mix compile` (deps via
  `mix deps.get`); front `cd pix/frontend/admin && npm run build:typecheck && npm run test`
  (deps via `npm install`). node/elixir/mix estao no Mac.

## O que foi feito nesta Onda 2 (commit c17af7a4)

### BACKEND (compila limpo; 9 testes camt060; validado ao vivo via rpc)
- **CAMT.060 parametrizado** (`apps/spi_service/lib/spi_service/camt060.ex`): antes as 7
  abas mandavam a MESMA "saldo atual". Agora `camt060_opts/2` mapeia cada acao para uma
  camt.060 distinta (ReqdMsgNmId + ReqdBalTp/Prtry + RptgPrd + `<Id>`): saldo-atual=
  camt.053/CSA; saldo-na-data=camt.053/CSA+RptgPrd; lista-lanctos=camt.052/REL(ou
  tipo_relatorio)+RptgPrd; detalha-lancto=camt.054+`<Id>`(id_evento_pesquisa);
  demonstrativo-tir/total-tir=camt.054+`<Id>`; demonstrativo-remuneracao=camt.053/CRE+
  RptgPrd. A resposta ecoa `sent_query`. A infra ja existia (`SpiClient.get_balance/3`
  aceita `:reqd_msg_nm_id/:prtry/:rptg_prd/:lancto_id`); so faltava passar os params.
  Validado ao vivo na :48 (cada acao gera opts distintos).
- **Alcada PUT** (`spi_proxy_controller.ex` + `settlement router.ex`):
  `PUT /api/v1/alcada/parameters/:id -> update_alcada_parameter` (a rota SPI ja existia).
  Editar/ativar/desativar param deixam de dar 404.
- **Devolucoes** (`return_controller.ex` + `return_json.ex`): `GET /api/v1/returns`
  agora consulta `monetarie_spi.messages WHERE message_code='pacs.004'` (espelha o
  PaymentController), paginado. Era stub `returns=[]`. Live = 0 linhas (mock apagado) ->
  lista honestamente vazia.
- **Usuarios** (`gateway/users_controller.ex`): serialize inclui `groups`[{id,code,name}]
  + `group_id` (preload `:groups`); create/update aceitam login->username, name->full_name,
  entity_id->institution_id, e gravam o grupo via juncao `monetarie_auth.user_groups`.
  Validado: admin->[ADMINISTRATORS,VIEWERS], bank.admin->[OPERATORS,VIEWERS,BANK_ADMINS].
  OBS: `entity_name` NAO foi fabricado porque `User.institution_id` e `:integer` e
  `Institution.id` e `Ecto.UUID` (vinculo de instituicao inconsistente no schema).
- **Extratos** (`statement_json.ex`): aliases status/record_count/period_start/period_end/
  account_ispb/created_at -> colunas Periodo/Registros/Status/Data e o botao "Baixar"
  (v-if status==='completed') voltam a funcionar.
- **Travessao de IA (U+2014)**: 18 literais de runtime corrigidos (memos do razao em
  status_updater/outbound_sender/inbound_processor, reconciliation.ex, +12 Logger/raise
  em shared/settlement). Sobram so em comentarios/@doc.

### FRONTEND (vue-tsc 0 erros, vitest 29/29, vite build OK) - ~94 arquivos
Pass de correcao Ondas B (mocks/dead-actions) + E (UX/tema/acentos/moeda), SEM i18n:
- Honestidade sobre dado falso: secoes Responsaveis/Webhooks/Limites do participante
  (mock -> empty state, botoes mortos removidos, modal "em desenvolvimento" removido);
  solicitacoes de saldo credito/debito/aporte + aprovar/rejeitar DESABILITADAS (sem
  tabela no backend, nota honesta); CRUD de grupos removido da navegacao; delete de alcada
  removido; itens mortos REDA014/REDA031/APIX001 + "Editar participante" + card "Conta PI
  ---" removidos; LimitsSection duplicada deduplicada; telas message-statistics/
  response-time/rco/legacy-parameters relabeladas honestamente.
- Contratos corrigidos: claims confirmar/cancelar -> {action}; rota transactions/returns
  antes de :id; casing de status das chaves; QR com painel de resultado (copia-e-cola+txid);
  gate de recovery_id das devolucoes MED removido; balance RB/PI mapeado explicito.
- Moeda /100 nas telas de contabilidade; tema escuro corrigido; titulo "Relatorios de
  Tarifas"; monitor contabil com fonte real (/accounting/events).
- Relatorios: templateIds (tpl-X->X); BalanceReport/FeeReport mostram "indisponivel"
  honesto; ReportViewer com download real; ReportHistory com guard de templateName.
- WS do RealTime via `GET /api/v1/auth/socket-token`; metricas via `GET /api/v1/monitoring/metrics`.
- Travessao "—"->"-"; acentos pt-BR.

## Validacao empirica feita
- BACKEND (ao vivo na :48, via rpc - NAO precisa de VPN):
  * CAMT.060: `camt060_opts` por acao retorna opts distintos (provado).
  * Usuarios: `Users.list_users |> preload(:groups)` retorna grupos reais.
  * Devolucoes: count pacs.004 = 0 (query funciona; lista honestamente vazia).
  * Backend compila limpo; 9 testes camt060 passam.
- FRONT (local): vue-tsc 0 erros, vitest 29/29, vite build OK. Imagem buildada e no ar.
- FRONT (ao vivo por screenshot): **PENDENTE** - a VPN derrubou o DNS `monetarie.internal`
  (NXDOMAIN) no meio da sessao. O deploy nao foi afetado (ECR/ECS via endpoints publicos).

## Pendente (proxima sessao)
1. **Validacao por screenshot tela-a-tela** do front novo (reconectar a VPN antes):
   re-rodar o Playwright/captura nas ~120 telas, salvar em `audit/`, gerar o PDF final.
2. **Onda C (i18n)**: 62 views ainda hardcoded em pt-BR. Estrategia segura: por lotes de
   views disjuntas, agentes retornam o mapa de chaves e UM dono unico faz o merge no
   `pt-BR.json` (conflito de escrita no JSON unico se paralelizar a edicao direta). Os
   outros 4 locales (en/es/fr/zh) estao com ~metade das chaves; o fallback p/ pt-BR cobre.
3. **PDF final completo** com as evidencias da captura nova.

## Divergencia main <-> branch (o que a sessao do Codex finalizou)
- `main` (= origin/main, HEAD `9e98a0aa`) tem **12 commits que este branch NAO tem** - a
  sessao do **Codex** finalizou fixes de Core/IB/banking/merchant + um pass PARALELO no
  front PIX admin (53 arquivos) + ajustes no backend PIX:
  `9e98a0aa` NATS connection timeout; `c527432b` PIX NATS callback ownership;
  `e551f1bc` outbound callback ids; `7c6957c5` transaction.created callbacks;
  `d145e649` fee preview account context; `a76a5b06` outbound timestamp precision;
  `ffeca8ba` confirm account restore + merchant balances; `91b5bc25` send storage +
  frontend render blockers; `0ab7b8de` DICT flow + admin data loading; `80923258`
  duplicate migration version; `de99239b` IB money scale + admin onboarding;
  `38e7b5fb` banking/merchant admin parity.
- Este branch tem **14 commits que main nao tem** (builders SPI v5.12.1, camt.060,
  verify_spi, Onda A, Onda 1) + esta Onda 2.
- Ponto de divergencia (merge-base): `f7a0f9eb`.
- **ATENCAO na reconciliacao**: branch E main editaram o MESMO front PIX admin -> um
  merge `main -> branch` (ou `branch -> main`) vai conflitar em dezenas de arquivos do
  `frontend/admin/src` e em alguns do backend PIX. Os fixes de Core/IB/banking/merchant do
  Codex (core/apps/banking, core/backend, core/apps/merchant, core/apps/admin) NAO colidem
  com o trabalho PIX admin e podem vir limpos. Recomendacao: reconciliar num passo dedicado,
  preferindo as versoes deste branch onde o alvo for o front PIX admin do deep audit, e
  trazendo os fixes de Core/IB/banking/merchant do Codex por cima.

## Metodo (regras do dono)
- BACEN nunca erra; quando rejeita, o defeito e NOSSO e tem que ser PROVADO. Zero inferencia.
- pt-BR com acento, SEM travessao de IA (—). Segredos so no Secrets Manager.
- Nao considerar tela validada sem screenshot, metadados e ausencia de erro no validador.
- Conferir o front por DIGEST da imagem (tag mutavel `:homolog-latest`), nao por revisao.

## Comando para colar na proxima sessao (resume)

```
Continuar o deep audit do front PIX admin (Onda 3). Worktree fix-camt060-verifier, branch
fix/pix-camt060-verifier-spi-msg-audit (HEAD bb57378f, pushed). Ler PRIMEIRO, inteiro:
docs/handoff/2026-06-25-pix-admin-onda2-deploy-handoff.md. A Onda 2 JA esta deployada e
verificada (pix-api task-def :48 digest b41be768; pix-admin-ui :homolog-latest digest
4c9449d8; backend validado ao vivo via rpc). RECONECTAR A VPN (DNS monetarie.internal)
antes de validar o front. Tarefas: (1) validar tela-a-tela com Playwright as ~120 telas e
gerar o PDF final (login http://pixadmin-h.monetarie.internal admin@monetarie.com.br /
Monetarie#Adm2026!; usar ?cb= ao validar pois o index.html cacheia no rollout); (2) Onda C
i18n - 62 views hardcoded em pt-BR -> externalizar para t() e fazer o merge no pt-BR.json
por UM dono unico (paralelizar a edicao direta do JSON conflita); (3) reconciliar a
divergencia main<->branch: main 9e98a0aa tem 12 commits da sessao Codex (Core/IB/banking/
merchant + pass paralelo do front PIX de 53 arquivos), merge-base f7a0f9eb - o merge vai
conflitar no front PIX admin, preferir as versoes da branch no alvo do deep audit e trazer
os fixes de Core/IB/banking/merchant por cima. Gotchas: OrbStack cai (docker info || orb
start; bootstrap do builder coreproviders-mk-builder); rpc viva = scratchpad/runrpc.sh
(ECS Exec/SSM, nao precisa de VPN); conferir o front por DIGEST (tag mutavel). Regras do
dono: BACEN nunca erra (defeito e NOSSO e tem que ser PROVADO); pt-BR com acento e SEM
travessao de IA; nada validado sem screenshot + metadados.
```
