# Handoff de sessão — 2026-07-10 — Telas do admin página a página + merge da main

**Para retomar em sessão nova: digite `/retomar`** (comando em `.claude/commands/retomar.md`), ou siga a seção "Como retomar" no fim.

---

## 1. O que foi alcançado (tudo validado VIVO em localhost, TDD RED primeiro + review adversarial)

### Frente do dia: 6 telas do admin consertadas (mandato do dono: "página por página")

1. **Logs de Auditoria** (`24d13127`): view lia camelCase de API snake_case (só ação/changes apareciam); ator era 100% `system` (AuditPlug lia `assigns[:current_user]` que ninguém seta; agora Guardian resource: `platform_admin`→`admin`, `ib_admin` segue `user` per SEC-006); `AuditContext` agora carrega IP e as linhas de Repo gravam ator+IP reais; filtros from/to/ip, `resource_type_contains` (exato preservado p/ /api/v1 e backoffice `list_users`), tie-breaker `id`, paginador lazy 50 com `meta.total`, export CSV com filtros (XLSX removido: não há writer), **gate `EnsureAdmin` no controller** (/api/v1/audit-logs estava aberto a qualquer autenticado).
2. **Gestão de Clientes + Contas Correntes + Saldo** (`11cf2723`): ordenação alfabética; busca normalizada nas 3 telas via `Monetarie.Util.SearchTerm` — máscara ("000.350.121-37"=="00035012137"; "101755-1"=="1017551") e **CNPJ ALFANUMÉRICO** (IN RFB 2.229/2024); filtros PF/PJ e status criados; card Contas Encerradas pedia status `closed` INEXISTENTE (legado=`inactive`) → filtro = `!= active` (igual ao card); re-clique em card força refetch; `createdAt` era nil hardcoded → `users.inserted_at`; vocabulário de status = o do schema (`active/blocked/suspended/excluded`) + i18n `common.userStatus*` nos 5 locales.
3. **Painéis Regulatório e CADOC** (`1be64baa`): painel regulatório falava API imaginária → realinhado ao `serialize_order` real (protocolo, `requested_amount` CENTAVOS, BLOCK/UNBLOCK, received/partial/no_balance), labels compartilhados em `views/regulatory/types.ts`, documento mascarado, SIMBA fora do gerador rápido, ortografia; painel CADOC: Prazo era `deadline: nil` HARDCODED → `reference_date + deadline_days` do `Orchestrator.schedule`; grupos crédito/outros eram invisíveis → 5 cards; coluna Qtd removida; **`formatDateTime` global SEM sufixo "GMT-3 BRT"** (decisão do dono).

### Merge da main (tarde, mandato: "atualizar a branch mantendo nossas correções")

- **`b10a2c7f`**: merge de 118 commits da main (escrow PRs 1-8 gated, WAL PIX-in, rollups, KYC AutBank, fixes PROD — ver bloco do CLAUDE.md; **PRODUÇÃO existe**: cluster `monetarie-greenfield-prod`). As telas de auditoria/clientes tinham sido corrigidas EM PARALELO na main (Luiz `db3ad1f3`, Micael `d76a2952`); comparação fina por 6 agentes decidiu item a item: **implementação da branch venceu** (ator real, gate, fuso, paginação, CNPJ alfa); absorvidos da main: `auditLabels` rico, terminologia cliente, campos extras do `useClients`.
- **`31606aa0`** (portes): `client_ip` com X-Forwarded-For usando a **ÚLTIMA entrada válida** (anti-spoof; a main usava a primeira, forjável) + 4 testes; **BOM UTF-8** no export CSV; ator "Sistema" limpo na coluna; `ip_capture_test` da main adaptado ao fail-closed.
- **Migrations renomeadas por colisão de timestamp** (versão igual = migration PULADA em silêncio): `20260708130000`→`20260708131000` (judicial response_file, agora idempotente) e `20260709120000`→`20260709121000` (rates 4966). `schema_migrations` locais realinhados por UPDATE.
- **`scd_cosif_plan.exs`**: appends paralelos (.003 SISBAJUD + escrow 4.1.1.85) unidos com **IDs EXPLÍCITOS 50_300..50_304** — regra nova: conta nova no seed SEMPRE com `:id` explícito >= 50_300 (upsert por code preserva ids já semeados).
- **`runtime.exs`**: crontab da main (horários escalonados P1) + crons de crédito do Bruno preservados (juros 03:30 → stop 04:10 → provisão 05:00) + bloco de paridade dos 12 workers.
- **2º merge da main** (`dfcb1cf3`, +6 commits): conflito único em `reports/accounts_balance.ex` — os DOIS lados corrigiram o mesmo bug de join; mantido o do **Bruno** (`member_number == account_number`, EXATO 1606/1606; o da main por `user_id` duplicaria saldo p/ 46 usuários multi-member) + terminologia cliente.
- **`45ab3175`**: fix do mesmo fan-out nas TARIFAS (`checking_account_reports.ex`, arquivo da main): consolidado inflava R$ 21.176,62 (+6,9%); join exato aplicado em `fees_consolidated` + `fees_by_member`, teste novo do caso multi-member. Cheque especial não era afetado (liga por member_id/account_id).

### Estado do remoto

`origin/feat/monetarie_improviments` = **`45ab3175`** (tudo pushado COM autorização do dono). Suítes: 43/43 reports, 78/0 stack auditoria/clientes, 669→0 regressão ampla, **vitest 320/320** (o merge consertou as 7 falhas antigas de fee-config/router).

## 2. Ambiente local (mudanças IMPORTANTES de hoje)

- **`mon_core` migrations DESTRAVADAS**: o quebrador histórico do `Release.migrate` era a tabela residual `pix_keys` do ETL (só coluna `id`) — DROPADA; backlog de 24 migrations aplicado; `mix ecto.migrate` local funciona normal (comando na memória `dev_commands` do Serena).
- **`core-admin` local SEM mount de nginx**: um processo externo na máquina sobrescreve os `nginx*.conf` do repo com a config de HML (upstream `core-api-h.monetarie.internal`, irresolvível local → /api inteiro pendura). O container agora usa a parametrização da própria imagem: `-e CORE_API_UPSTREAM=http://192.168.155.2:4000 -e CORE_API_HOST=localhost` (IP do core-api na rede; se o core-api for recriado e /api der timeout, reconferir o IP). **Perguntar ao dono que processo é esse.**
- Containers: `core-api` (:4002) e `core-admin` (:5180) com o código do merge; `monetarie-pg`, `tigerbeetle` (192.168.155.3:3001), `monetarie-nats` de pé.
- **Runner de testes: SEMPRE rodar da raiz do repo** (mounts usam $PWD; cwd errado compila app vazio no volume).

## 3. Pendências (ordem sugerida)

1. **Retomar a frente "página por página"**: o dono manda a próxima tela com screenshot. Padrões de bug recorrentes na memória `frente-admin-paginas` (camelCase vs snake_case; filtros surdos; busca sem `SearchTerm`; vocabulário de status inventado; nil hardcoded no serializer).
2. **Avisar o Bruno**: (a) rodar no localhost dele os 2 UPDATEs de `schema_migrations` (130000→131000, 120000→121000); (b) as 14 falhas de `GeneratorAuditWireTest` são pré-existentes da frente dele; (c) o fix de fan-out das tarifas tocou o arquivo do Micael.
3. **Revisão adversarial por agentes do merge**: não rodou (limite de sessão); as 3 lentes foram verificadas MANUALMENTE com evidência (perdas zero nos `--ours`; refs antigas = falso positivo; seed ok). Re-rodar o workflow se quiser o carimbo formal: `wf_4be05f6c-09b` (script salvo, resumeFromRunId).
4. **Follow-ups das telas**: prazo 4111 em dias corridos vs dia útil (validar com regulatório); gerador E-Financeira legado (XML divergente do leiaute RFB); LOGIN/LOGOUT sem linha própria de auditoria; acervo antigo de auditoria segue ator `system`; `inserted_at` de users legados = data do ETL; índice trigram p/ buscas se acervo crescer.
5. **Pendências SISBAJUD herdadas de 09/07**: contador (folha `.003`), cabine STA (5302 fica `delivering`; também trava Protocolo STA do painel CADOC), TRANSFER/CANCEL sem teste vivo, gap tesouraria HML.

## 4. Regras de trabalho (inegociáveis — reforçadas HOJE)

- **PUSH: autorização NÃO é transitiva nem fica de pé.** "Pode ajustar"/"pode corrigir"/"incorpore" = trabalho + commit LOCAL; cada push exige OK explícito naquele momento (correção dada em 10/07 após push indevido do fix de tarifas).
- **NUNCA alterar nada de infra nem incluir infra em commits** (nginx de deploy, terraform, task defs; reforçado em 10/07).
- Desenvolvimento ISOLADO em localhost; HML/PROD só com pedido explícito (até leitura).
- TDD com RED primeiro; dinheiro = integração com TB real; consultar `MoneyUnit` antes de tocar valor.
- Review adversarial após cada mudança; nunca travessão em texto de UI.
- Manter SEMPRE: `CLAUDE.md` + memória do Claude + memórias do projeto `monetarie` no Serena.

## 5. Como retomar (sessão nova)

1. Digite **`/retomar`** — carrega este handoff, o CLAUDE.md, e ativa o Serena.
2. Ou manualmente: `activate_project monetarie` no Serena e ler `admin_paginas_estado_atual` + `dev_commands` + `conventions_money_units` + `sisbajud_estado_atual`; ler este handoff; conferir `docker ps` e `git log --oneline -5`; `git fetch` para ver o time (SEM pull/push sem pedido).
