# Handoff de fecho — sessão 2026-07-23 (deep audit balde 4 + certs SM/HSM + latência + SendGrid + markdown STA)

Branch: `deepaudit/paridade-legadopix-2026-07-23`, HEAD `740b6597`, PUSHADA (== origin, 0/0).
`main` intocada. Todo o código desta sessão está na branch (não mergeado na main ainda).

## Revisões vivas ao fim da sessão

| Serviço | HML | PRD | Rollback |
|---|---|---|---|
| pix-api | :206 | :77 | HML :204 / PRD :75 |
| pix-mtls-sidecar | `main-idleconns-20260723` | idem | `main-dualca-20260723` |
| pix-admin-ui | :56 | :30 | :55 / :29 |
| spb-api | :75 | :43 | HML :74 / PRD :42 |
| core-api | :213 | :102 | :212 / :101 |

Todos digest match HML→PRD, TGs healthy, ICOM 6+6 retomado. Sidecar mTLS selftest OK.

## 1. Deep audit balde 4 (defeitos reais) — 7 de 8 CORRIGIDOS (falta só o #7)

Registro-mestre: `docs/reports/2026-07-23-deepaudit-gap-register.md`. Handoff do audit:
`docs/handoff/2026-07-23-deepaudit-paridade-legadopix-handoff.md` (tem a nota detalhada por defeito).

- **#1 hold preso** (`43ef4c92`, DEPLOYADO): admi.002 "nao existe lancamento" da camt.060 op_status
  encerra a operacao presa (limiar 15min `ADMI002_NOT_FOUND_REJECT_AFTER_MINUTES`, escopo amplo,
  automatico; pacs.008/004 OUT = rejected pelo funil do Core, 004 IN = RJCT local).
- **#2 limite diario** (`e286c544`): `get_daily_spent` lia coluna inexistente; agora do modelo
  canonico messages+payments (REAIS->CENTAVOS, exclui RJCT/CANC) + `nighttime?` em hora de BRASILIA.
- **#3 trck.002 PJ + grafo stub** (`d3abe0db`): PrvtId sempre (Party38Choice do XSD; OrgId era
  invalido) + POST tracking-graph delega ao caminho REAL do dict_service (fim do stub fabricado).
- **#4 camt.055->camt.029 COMPLETO em 4 etapas** (decisao do dono: tela do operador + flag auto OFF):
  - A (`09144abb`): camt.029 correta (OrgnlPmtInfCxlId = PmtCxlId original, DHAC/DHRC pelo desfecho,
    CxlStsRsnInf com codigo do whitelist; identidade da camt.055 no claim.evidence; g5 auditoria).
  - B (`c09f58d6`): camt.025 fecha a trck.002 (linha nasce ACSP, recibo ACPT->ACSC/RJCT->RJCT).
  - C (`d02c81bf`): endpoints do operador `/api/v1/med/cancellations` (index/approve/deny) + proxy
    no gateway + flag `CAMT055_AUTO_RESPONSE_ENABLED` (default OFF; ON = auto-approve/RJCR FF08).
  - D (`ad90f458`): tela `/med/cancellations` no pix-admin (i18n 5 idiomas).
- **#5 pacs.008 auto-flow sem TxId** (`71dc970b`): `payment_request_initiation_params` leva
  tx_id/purpose/InitgPty/Ustrd ao builder no fluxo automatico.
- **#6 TariffMonitor camelCase** (`7dc33814`): create/updateTariff falam o contrato snake_case do
  FeeSchedule + read-side corrigido (era valor 0 e status sempre ativo na tela).
- **#8 PIX Automatico wiring invertido** (`2a8fe35c`): pain.009 ACK nao ativa (segue
  PENDING_APPROVAL); update nao emite BACEN (antes mandava cancelamento!); cancel envia pain.011
  (nao pain.012); pain.012 INBOUND ganhou handler (Accptd true->ACTIVE, false->CANCELLED+motivo).

**#2, #3, #5, #6, #8 e #4(A-D) DEPLOYADOS** em pix-api :204→:206 + pix-admin-ui :56 nesta sessao
(HML+PRD). Suites: spi 1045/0, settlement 1024/0, shared 1884/0, vitest 129/129, vue-tsc 0.

**FALTA #7** (unico do balde 4 pendente): telas de reserva inoperantes — a rota
`POST /balance/requests` nao existe no spi_service + admin inject/adjust dao 500
(`spi_proxy_controller.ex:502`, `balance_operation_controller.ex:200-225`). PROXIMO DA FILA.

## 2. Certs por ambiente 100% via Secrets Manager + HSM sem chave local

Commits `b86a5a0b` + `5cfd9646`. Ordem do dono: nenhuma key na aplicacao; chave privada SO no HSM
RTM; cert publico SO no Secrets Manager. DEPLOYADO nos 2 ambientes (pix + spb).

- CERTQRC (cert+key+kid+cadeia) hidratado do secret `monetarie/{env}/pix/cert/CERTQRC-46026562`
  no boot (CertMaterializer.hydrate_qrc, idempotente por kid); JwkSet publica x5c da cadeia da linha.
- Sidecar mTLS: PIC vem de `monetarie/{env}/pix/sidecar/pic_cert_pem`; truststore ICP homolog na imagem.
- SPB: `BACEN_CERT_PEM` (conteudo) do secret `monetarie/{env}/spb/cert/our_certificate`; packer
  opera SEM chave local em modo HSM (sentinela :hsm) — corrige o incidente :73 do time (imagem sem
  dev_self_signed_key derrubava assinatura); `.dockerignore` exclui `*_key.pem` para sempre.
- Provas vivas: PACKPROOF (assina via HSM sem chave local) + DECPROOF (decifra T010) nos 2 amb.

## 3. HSM RTM degradado (504) + retry resiliente + dossie

Dossie: `docs/reports/2026-07-23-hsm-rtm-degradacao-504-dossie.md` (para cobrar a RTM).
- **Causa (provada por probe vivo)**: o gateway EcosCryptoServer da RTM devolve 504 "HttpClient.Timeout
  of 3 seconds" em 50-67% das chamadas (HML e PRD) — timeout INTERNO de 3s do gateway->vHSM (nosso
  timeout e 8s). Ate o `GET /v1/health` (sem cripto) leva ~3s. Causou o stale_sweep do GEN0001.
- **Retry** (`53b00011`, DEPLOYADO): `RtmHsm.with_session` (PIX Shared + SPB BacenGateway) retenta
  500/502/503/504 + transporte com backoff+jitter (config retry_max_attempts=3, retry_base_delay_ms=50);
  401 segue renovacao de sessao; 4xx!=401 permanente. Fallback de confiabilidade, NAO de latencia.
- **AINDA COM A RTM**: elevar/tornar configuravel o timeout de 3s do gateway; sanar o vHSM lento;
  investigar o resume_rate 0% (o BACEN nao emite session tickets TLS 1.2). Pre-condicao: limpar nossa
  carga de handshakes (item 4) antes de cobrar, senao devolvem a culpa.

## 4. Revisão de latência do envio PIX (mandato <500ms)

Docs: `docs/reports/2026-07-23-revisao-latencia-pix-post-ms.md` + `2026-07-23-latencia-poller-legadopix-compare.md`.
- **Diagnostico**: o `post_ms` (POST ao BACEN) domina (1-6s), nao o HSM sign direto. Causa: cada
  conexao nova faz handshake mTLS completo, e o handshake chama o HSM (sidecar assina o
  CertificateVerify). resume_rate 0% (BACEN nao retoma) => todo handshake e completo. Conexoes
  esfriam (gateway RSFN fecha idle ~30s). **~11.620 handshakes/dia = sign-rsa auto-infligidos**
  (icom_sec 6060, icom 4200, dict 1360) — carga NOSSA no HSM.
- **Compare legado**: o legado e rapido no frio porque assina o handshake LOCALMENTE (chave em
  memoria, sem HSM). Nao imitavel (chave no HSM e correto). Estrategia: nunca fazer handshake completo
  no caminho critico (conexao sempre quente).
- **Pacote DEPLOYADO** (pix HML:206/PRD:77 + sidecar main-idleconns):
  - #1 sidecar `MaxIdleConnsPerHost=10` (env `SIDECAR_MAX_IDLE_CONNS_PER_HOST`; Go, TDD) — antes o
    default Go de 2 idle/host fechava a conexao quente que o envio reusaria.
  - #2 retry HSM (item 3).
  - #3 EchoProbeWorker ON <30s (`ECHO_PROBE_ENABLED=true`, `ECHO_PROBE_INTERVAL_MS=20000`) — echo por
    POST /api/v1/in (mesma rota do envio) mantem a conexao de envio quente. APROVADO pelo dono.
- **DECISAO DO DONO**: #4 (reduzir slots de recepcao) VETADO — usar o recurso FULL do BACEN
  (6 conexoes/canal §2.2.2.10); altissima volumetria, nao reduzir capacidade.
- **Efeito medido PRD pos-deploy**: echos OK a ~40ms (conexao quente); `:conn_limited` foi
  warm-up transitorio do boot (81 no boot, 0 depois); recepcao funcional (MSG_RECV 37-44ms).
- **A VALIDAR (proxima sessao)**: (a) `post_ms` de uma pacs.008 REAL (nao houve tráfego na madrugada;
  o proxy echo ja mostra ~40ms); (b) a queda do volume de handshakes/dia estabilizada (medir apos 1h+).
- **Follow-up residual (NAO reduz capacidade)**: em baixo volume, avaliar encurtar o long-poll timeout
  (hoje 15s) para liberar permits mais rapido; com conexao quente o churn extra nao paga handshake.
- **Manual v1.12 (a favor da estrategia)**: §2.1.3 recomenda conexao PERSISTENTE; §2.2.2.1 leitura em
  lote `multipart/mixed` (ate 10 msgs/pull) JA implementada.

## 5. E-mail SendGrid + SMS Twilio — DEPLOYADO e validado

Core-api HML:213 / PRD:102 (digest match). `EMAIL_TRANSPORT=sendgrid` + `SENDGRID_API_KEY` (secret)
+ `EMAIL_FROM=noreply@monetarie.com` + fase SMS (`TWILIO_*`, `BANKING_BASE_URL`). Secrets
`monetarie/{env}/sendgrid/api_key` criados + ARNs nas policies. Smoke de HML aceito pelo SendGrid e
**e-mail RECEBIDO pelo dono**. Restam: 1 SMS real em PRD (fase SMS), rotacionar a key SendGrid e o
token Twilio (foram colados em chat). Ver [[monetarie-email-twilio-sendgrid-sms-0723]].

## 6. Markdown de orientacao STA/SISBAJUD/CCS/CADOC/SIMBA (para outro projeto)

`docs/reports/2026-07-23-orientacao-implementacao-sta-sisbajud-ccs-cadoc-simba.md` (`740b6597`,
497 linhas, 10 secoes). Canonico, extraido do codigo vivo, com vocabulario, checklist de 24 erros a
nao repetir e evidencias de PRD. Pedido do dono: cruzar com o markdown do outro projeto (protocolos
STA reais) para validar o vocabulario na 1a transmissao.

## 7. Paridade de banco HML=PRD (feita nesta sessao)

Migrations identicas (pix 71/71, spb 55/55). Unico indice divergente
(`outbound_send_claims` PRD cheio fora de migration) normalizado ao parcial canonico.

## PENDENCIAS ABERTAS (para o comando de retomada)

1. **Deep audit #7** (telas de reserva) — PROXIMO DA FILA. `POST /balance/requests` inexistente no
   spi_service + admin inject/adjust 500.
2. **Medir latencia estabilizada** (proxima sessao): `post_ms` de pacs.008 real + queda dos
   handshakes/dia (baseline 11.620) apos 1h+ estabilizado.
3. **RTM**: entregar o dossie do HSM 504 (depois de confirmar a queda dos nossos handshakes).
4. **Push da branch para a main / merge**: a branch deepaudit tem TUDO (defeitos + certs + latencia
   + SendGrid + markdowns); decidir merge com o dono.
5. **SendGrid/Twilio**: 1 SMS real em PRD + rotacionar as 2 keys coladas em chat.
6. **Deep audit — frentes de PRODUTO/CONTROLE** (decisao do dono, registro-mestre): alcada universal
   no money-path, antifraude externo, antivarredura DICT, multiliquidacao MVP, PIX Automatico lado
   pagador, tarifa por CdMsg, expurgo/retencao.
7. **Validacao visual (regra #11)** das telas deployadas (lote B/C, STA Vue, Sisbajud, nova tela de
   cancelamentos MED) — pendencia herdada.
8. **Follow-up latencia**: avaliar encurtar long-poll timeout (nao reduz capacidade).

## Memorias relacionadas
[[monetarie-paridade-hml-prd-certs-sm-hsm-0723]] [[monetarie-hsm-rtm-504-latencia-0723]]
[[monetarie-deepaudit-paridade-legadopix-0723]] [[monetarie-email-twilio-sendgrid-sms-0723]]
