# Handoff — Paridade HML=PRD (sidecar + HSM + certs 100% Secrets Manager) + fix #1 deployado

Data: 2026-07-23 (noite). Ordens do dono na sessao: (1) pull do time; (2) deploy do fix #1
(hold preso); (3) HML em paridade EXATA com PRD (sidecar, assinatura HSM, zero key na
aplicacao); (4) certs por ambiente lidos SO do Secrets Manager, incluindo CERTQRC
(cert+key do QR); (5) revisar indices/migrations SPB+PIX; (6) secrets SendGrid do cliente.
Contexto extra do dono: deploy :73 do spb pelo time quebrou assinatura (imagem buildada
sem o dev_self_signed_key.pem gitignorado) — classe de problema morta nesta sessao.

## Revisoes vivas apos esta sessao

| Servico | Antes | Depois | Rollback | Conteudo |
|---|---|---|---|---|
| pix-api HML | :202 | **:203** | :202 | fix #1 admi.002 + time (PRs 21/22) + certs SM + **sidecar pix-mtls NOVO em HML** + URLs BACEN via localhost:9101-9105 |
| pix-api PRD | :73 | **:74** | :73 | mesma imagem (digest match `d20ae98d`), sidecar `main-dualca-20260723`, PIC_CERT_PEM env->**Secrets Manager** |
| spb-api HML | :72 | **:74** | :72 | fix STR0008R1 do time + packer sem chave local (HSM) + BACEN_CERT_PEM via **Secrets Manager** (env BACEN_CERT_PEM_FILE REMOVIDA) |
| spb-api PRD | :41 | :41 (INTOCADO) | — | **:42 REGISTRADA E STAGED, deploy aguarda OK do dono** |

Imagens: pix-api `homolog|prod-b86a5a0b-paridadecerts-20260723` (digest `sha256:d20ae98d...`),
spb-api `homolog|prod-5cfd9646-paridadecerts-20260723` (digest `sha256:def7a1e5...`),
sidecar `monetarie/pix-mtls-sidecar:main-dualca-20260723` (truststores ICP homolog+prod na imagem).

## Provas vivas (todas desta sessao)

- **Sidecar HML (NOVO)**: `[selftest] ... mTLS OK (BACEN accepted our cert)` nos 5 endpoints
  homolog (dict/dict-np/icom/icom-sec/arq `-h`), cert T009 do Secrets Manager, chave no HSM
  HML (sessao vhsm 60042 nas 3 tasks). ICOM CSM+CPM leader 6+6 workers, sessoes abertas
  RETOMADAS via sidecar. TG 3/3 healthy, zero erro novo pos-swap.
- **Sidecar PRD**: selftest mTLS OK nos 5 endpoints prod com PIC_CERT_PEM vindo do secret
  (`monetarie/prod/pix/sidecar/pic_cert_pem`, P002). ICOM 6+6 retomado. TG 3/3 healthy.
- **CertMaterializer**: CERTQRC hidratado do SM nos 2 ambientes (idempotente por kid; HML
  kid `pTBxkmyETC...` cn qrcode-h, PRD kid `MfZSpHTn...` cn qrcode). O access_denied
  historico do boot de PRD foi CURADO (task role ganhou a policy `monetarie-pix-cert-secrets`).
- **SPB HML sem chave local**: boot loga `Loaded our certificate from env BACEN_CERT_PEM
  (Secrets Manager)` + `private_key=false` (por DESIGN); prova rpc:
  `PACKPROOF OK bytes=952 key_local={:error, :not_loaded}` (assinatura C15 no HSM) e
  `DECPROOF match=true` (segredo cifrado na publica do T010 decifrado pelo HSM).
  Imagem spb VERIFICADA sem nenhum `*_key.pem` (docker run + ls priv/certs).

## Secrets Manager criados nesta sessao

- `monetarie/{homolog,prod}/sendgrid/api_key` (key do cliente 23/07) + ARNs nas policies
  `monetarie-ecs-secrets-{env}`. Flip `EMAIL_TRANSPORT=sendgrid` segue PENDENTE (checklist
  do handoff da retomada Twilio; exige deploy core-api com secret+env na MESMA revisao).
- `monetarie/{homolog,prod}/pix/sidecar/pic_cert_pem` (T009 / P002, so cert publico).
- `monetarie/{homolog,prod}/pix/cert/CERTQRC-46026562` (bundle JSON cert+key+kid+ca_pem,
  exportado das bases vivas via rpc; fonte EXCLUSIVA do JWS do QR a partir de agora).
- `monetarie/{homolog,prod}/spb/cert/our_certificate` (T010 HML / P001 PRD serial
  3422F6C3C91AE4BE, so cert publico).
- IAM: execution roles ganharam os ARNs novos; task role PRD ganhou
  `monetarie-pix-cert-secrets` (runtime SM read no prefixo pix/cert).

## Codigo (branch `deepaudit/paridade-legadopix-2026-07-23`, SEM push)

- `43ef4c92` fix #1 hold preso (admi.002 not_found encerra operacao presa; ver handoff do
  deep audit).
- `ef636904` merge origin/main (PR #21 spb SitLancSTR + PR #22 core cookie).
- `b86a5a0b` certs via SM: CertMaterializer.hydrate_qrc + CertQrc ca_pem + JwkSet cadeia da
  linha + spb BACEN_CERT_PEM env-conteudo + packer sem chave local em modo HSM (sentinela
  :hsm, tamanho RSA do modulo do cert publico) + truststore homolog no sidecar.
- `5cfd9646` .dockerignore do spb exclui `*_key.pem` da imagem PARA SEMPRE (independente
  da maquina de build — blindagem do incidente :73).
- Suites: pix shared 1877/0, spi_service 1011/0, spb bacen_gateway 17.932/0 (6 doctests,
  4 properties, 24 skipped).

## Paridade de banco (auditada por agente, relatorio em scratchpad `db-parity-hml-prd.md`)

- Migrations: paridade PERFEITA (mon_pix 71/71, mon_spb 55/55).
- Indices: 1 divergencia real corrigida — `monetarie_spi.outbound_send_claims` em PRD tinha
  indice CHEIO `_index` fora de migration; normalizado para o PARCIAL canonico `_idx`
  (migration 20260718130000) e o divergente dropado. Residuais legitimos documentados
  (particoes de retencao 2026_06 so-HML; tabelas de staging de reparo `_e2e_*` so-PRD;
  19 tabelas ETL legado so-HML no spb).
- SPB certs no banco: PRD `our_signing_certificates` = P001 ATIVO (self-service);
  HML VAZIA (cert agora vem do env BACEN_CERT_PEM/SM — mecanismo equivalente, fonte SM).

## Pendencias / follow-ups

1. **Deploy spb-api PRD :42 — aguarda OK do dono** (packer HSM sem chave local + fix
   STR0008R1 do time + BACEN_CERT_PEM do SM). Um comando:
   `aws ecs update-service --cluster monetarie-greenfield-prod --service spb-api --task-definition monetarie-spb-api-prod:42`.
   Janela recomendada: fora de operacao money-path do dono.
2. Push da branch (fix #1 + merge do time + certs SM) — aguarda OK explicito.
3. Acervo SPB HML: `get_institution_cert("46026562", SPB01)` devolve o cert T009 (do PIX!)
   — foi o que invalidou o roundtrip de teste; corrigir a linha do acervo para T010
   (nao bloqueia nada vivo: BACEN cifra para o cert ATIVO no BACEN, que e o T010).
4. 19 tabelas ETL do spb so existem em HML (spb_alcadas, spb_vistos, *_operations legadas):
   se alguma feature viva ler essas tabelas, em PRD da undefined_table — varrer o codigo.
5. Certos PUBLICOS ainda baked nas imagens como fallback (truststores ICP, BACEN T068/T069,
   `monetarie_spb_t010.pem` agora sem uso em HML): se o dono quiser zero, remover num
   proximo build (exige mover BACEN T068/T069 para o acervo do banco/SM antes).
6. Flip SendGrid (`EMAIL_TRANSPORT=sendgrid` + secret na mesma revisao do core-api) +
   push/deploy dos commits Twilio — checklist em
   `docs/handoff/2026-07-23-email-twilio-sendgrid-retomada-handoff.md`.
7. Rotacionar a API key SendGrid apos o flip (foi colada em chat) + token Twilio live (idem).
8. Defeitos #2-#8 do deep audit (proximo da fila: #2 limite diario `limits.ex:125`).
