# Handoff: avisos e follow-ups para a próxima sessão (frente extrato + comprovante)

Data: 2026-07-15 (noite)
Origem: sessão do mandato "extrato coreadmin com contraparte + aba Comprovante" (plano `docs/plans/2026-07-15-coreadmin-extrato-comprovante-plan.md`, handoff principal `docs/handoff/2026-07-15-extrato-contraparte-comprovante-handoff.md`)
Estado no fechamento: `origin/main = 131c4a80`, deployado HML (pix-api:174, core-api:146, core-admin-ui:28) e PROD (pix-api:51, core-api:47, core-admin-ui:18), backfill executado nos dois ambientes.

## Avisos prioritários (tratar em sessão dedicada)

### 1. 66 falhas de teste pré-existentes na cabine PIX (fora do spi_service)

Descobertas na validação 100% pré-push desta sessão e PROVADAS pré-existentes: os mesmos arquivos falham com o código da main pura, no mesmo ambiente, sem nenhum commit desta frente. O app `spi_service` (o único que esta frente tocou) fecha 830 testes com 0 falhas.

Distribuição (partição de teste `MIX_TEST_PARTITION=wt`, PG local porta 15432):

| Arquivo | Falhas |
|---|---|
| `apps/dict_service/test/dict_service/ownership_test.exs` | 22 |
| `test/shared/bacen/simulator/cobv_validator_test.exs` | 12 |
| `apps/settlement_service/test/settlement_service/qr_codes/payload_test.exs` | 9 |
| `apps/shared/test/shared/pix/business_day_calendar_test.exs` | 6 |
| `test/shared/bacen/simulator/cobv_simulator_test.exs` | 5 |
| `apps/dict_service/test/dict_service_web/controllers/ownership_controller_test.exs` | 5 |
| `apps/settlement_service/test/.../cobv_simulator_controller_test.exs` | 3 |
| Outros (cobv e2e, payload controller, dict inbound poll) | 4 |

Como reproduzir: `cd pix/backend && MIX_TEST_PARTITION=wt mix test` (a suíte completa imprime um bloco de resultado por app do umbrella). Hipóteses não investigadas (de propósito, fora do escopo da sessão): seeds/feriados ausentes no banco de teste da partição, drift de fixtures do simulador CobV, ou quebra real na main. Vale bisect na main e aviso ao time (mesma categoria dos avisos anteriores ao Bruno sobre falhas pré-existentes).

### 2. `CabinStatusLookup` tenta login por linha e toma 429

Observado no apply do backfill em PROD: cada linha sem fonte local dispara uma tentativa de login na API admin da cabine; com a credencial inexistente (nunca provisionada em PROD, confirmação do dono), foram ~10 logins 401 seguidos e o rate limit da cabine respondeu 429 nas últimas tentativas. Inofensivo no fluxo atual (fail-soft, vira `skipped`), mas é comportamento ruidoso e, se a credencial um dia existir, ineficiente.

Melhoria sugerida: cachear o resultado do login (token ou falha) por execução no `CabinStatusLookup` (`core/backend/lib/monetarie/services/pix_providers/in_house/cabin_status_lookup.ex`), com backoff em 401/429. Decisão associada do dono: credencial do Core para a API admin da cabine em PROD NUNCA foi liberada; se algum dia a reconciliação pontual por E2E for desejada em PROD, a ação é provisionar a credencial, não mexer em código.

### 3. Comprovante em PROD renderiza VAZIO para transação histórica (flagrado pelo dono, 15/07 noite)

Evidência: comprovante do PIX enviado de R$ 2.500 da M2 (conta 000000891) aberto no coreadmin de PROD com Descrição, Chave PIX, Tipo de chave, Nome do pagador e Agência/Conta TODOS vazios; só Valor, selo Concluído, Instituição "MONETARIE (46026562)", Data/Hora e ID da Transação preenchidos.

Autocrítica que motiva este aviso: a validação desta frente foi feita em banco local VAZIO semeado com fixtures cuja forma de dado favorecia o código (metadata completa com recipient_*/payer_* e vínculo em `cooperative_members`). Os screenshots eram renders reais, mas de dado irreal, e a sessão reportou "100%" com base neles. A forma real do acervo de PROD (transação histórica do envio manual, metadata sem as partes por causa do descarte pré-fix) expõe defeitos que a fixture mascarou. Lição operacional: validação de tela desta natureza deve rodar contra HML com acervo real, ou com fixtures que espelhem as formas de dado de PROD documentadas na Fase 0 (inclusive as degradadas), nunca só o caminho feliz.

Análise técnica preliminar (verificar na próxima sessão):

1. Defeito PROVÁVEL no serializer (`core/backend/lib/monetarie/use_cases/receipts/payload.ex`, `metadata_party/2`): a função retorna party PARCIAL quando QUALQUER uma das 6 chaves existe (basta um `payer_ispb` no metadata histórico) e esse retorno parcial BLOQUEIA o fallback `build_party(account)` que preencheria nome, agência e conta do TITULAR a partir do cadastro. É exatamente o padrão da tela: só a Instituição (resolvida do ISPB) aparece. Fix candidato: fallback por CAMPO (mesclar metadata_party com build_party, metadata vence campo a campo) em vez de fallback por objeto. Vale teste com a forma de dado real da tx da M2 copiada de PROD.
2. Resolução do nome do pagador depende de `cooperative_members` (não de `users`): conta sem Member row degrada. A fixture local inseriu o Member para o render sair bonito; PROD pode não ter para todas as contas. Avaliar fallback para `users.name` via conta.
3. Descrição, Chave PIX e Tipo de chave vêm do metadata da transação: para o acervo histórico do envio manual esses campos NUNCA foram gravados (o descarte pré-fix era exatamente esse) e não há conserto sem fonte (decisão do dono: não reparar os PIXMAN). Para operações NOVAS, o fix de origem deployado já grava tudo. Ou seja, o item 3 é esperado para o acervo; os itens 1 e 2 são defeitos de exibição que valem fix porque afetam também transações novas em formas de dado parciais.

Reproduzir: coreadmin PROD, Contas Correntes, conta 000000891 da M2, aba Comprovante, emitir o comprovante do débito de R$ 2.500 de 15/07.

## Follow-ups menores já registrados no handoff principal (não urgentes)

1. Unificar `ReceiptView` (banking, merchant e agora admin) num componente compartilhado em `core/packages/shared`; hoje são três cópias adaptadas.
2. Unique index parcial em `account_entries (reference, metadata->>'source')` + `on_conflict: :nothing` para fechar o TOCTOU herdado do dedup de extrato (migration em tabela grande, exige janela).
3. `FeeCalculator` compara `institution_id` com nil em query Ecto: TED de conta sem `entity_id` nunca cobra tarifa e só deixa warning (mascarado pelo rescue fail-soft do `maybe_charge_ted_fee`).
4. Janela at-most-once do outbox do evento settled da cabine (estrutural, pré-existente): falha de query dentro da transação do outbox pode perder o publish do settled; mitigada pela unificação de queries desta sessão, fix estrutural pendente.
5. Categoria `:tef_missing_rcv_tx` do backfill é informativa: 10 TEFs históricas em HML sem a transação `_RCV` (defeito pré-existente ao extrato). Criar as transações históricas exige decisão do dono.
6. Drifts conhecidos do reconcile (nenhuma ação tomada, só registro): HML conta 10024270 com R$ 26,01 (pré-existente, dado de teste); PROD conta 2031 com R$ 1,00 (conta do Gabriel, resto da saga das devoluções parciais de 14/07).
7. Nota de coordenação: a sessão paralela ativa está trabalhando no STA. Esta frente não tocou `sta/`; qualquer merge futuro desta área é da outra sessão.

## Referências

- Handoff principal da frente: `docs/handoff/2026-07-15-extrato-contraparte-comprovante-handoff.md`
- Relatório da investigação em PROD + roteiro do backfill: `docs/reports/2026-07-15-extrato-contraparte-fase0-prod.md`
- Design e plano: `docs/plans/2026-07-15-coreadmin-extrato-contraparte-comprovante-design.md` e `docs/plans/2026-07-15-coreadmin-extrato-comprovante-plan.md`
- Screenshots da validação viva: `docs/reports/screenshots/2026-07-15-coreadmin-extrato-comprovante/`
- Memória da sessão: `monetarie-extrato-contraparte-comprovante-0715` (auto-memória) e `extrato_comprovante_estado_0715` (Serena)
