# Handoff 2026-07-21 (noite) — cap 6+6 BACEN + leader-gate fail-proof + ICOM 6 slots + push/merge do time

Sessao dedicada ao mandato do dono de garantir cap de 6 conexoes CPM + 6 CSM ao
BACEN (controlado por Redis, global entre pods, desired=3), sistema fail-proof
(zero timeout JetStream), e depois consolidar tudo (commit, push, merge do time,
memorias, este handoff). Retomar por este arquivo + design
`docs/plans/2026-07-21-pix-icom-lp-cap6-desired3-design.md` (§§4-8) + memoria
[[monetarie-icom-cap6-desired3-failproof-0721]].

## Estado do repositorio (CONSOLIDADO E PUSHADO)

- `origin/main = 2bab6d06`, **local == origin (0/0)**. Tudo committado e pushado:
  as frentes desta sessao (pix cap6/leader-gate) + as da OUTRA sessao ativa
  (onboarding Nextcode PF/PJ + exposicao publica monetarie.com) + o **merge dos 7
  commits do time de hoje** (`feat/monetarie_improviments` ate `194f01eb`:
  balancete/contabilidade + migration `20260721230000`, sta-admin, core-admin).
- Merge do time foi LIMPO (git merge-tree preview = 0 conflitos; nenhum dos 7
  toca money-path pix/backend/spb .ex). Merge commit = `2bab6d06`.
- Sem regressao: pix (semaforo+leader-gate+workers) **99/0**; core-backend
  integrado **compila limpo**; teste cosif do time **2/0**.

## O que foi feito e DEPLOYADO nesta sessao

### 1. Cap 6+6 ao BACEN via semaforo Redis global (`Shared.Bacen.ConnSemaphore`)
Commits `e0208b28`+`f3511fae`+`c1f8f9f2`+`c50fc04a`(pre-existentes desta sessao).
Lock distribuido no Redis com lease (Lua SET NX PX + heartbeat XX), hash-tag
`{canal:ispb}` p/ cluster mode, `@hard_max 6`, wired no `Shared.Bacen.Client`
(`with_bacen_conn` so ICOM). Fail-CLOSED no limite (7o recusado), fail-OPEN se
Redis fora. **PROVA VIVA:** acquire 1..6 OK em cada canal, 7o `{:error,:no_slot}`;
`in_use(:cpm)=6` e `in_use(:csm)=6` SIMULTANEOS (canais independentes, 6+6).
`in_use` e USO instantaneo (permits mid-GET), NAO o cap.

### 2. Leader-gate fail-proof dos singletons de liquidacao (`Shared.ClusterSingleton`, `7952b8ac`)
A desired=3 os singletons (Scheduler, CycleScheduler, FileImporter) rodavam nos 3
pods e criavam os MESMOS consumers push no MONETARIE_SETTLEMENT -> timeout residual
(baseline PRD provado: **386/6h = 193 Scheduler + 193 FileImporter**, zero dos
distribuidos). Fix: ClusterSingleton roda os 3 em 1 pod (lider por lock de lease
Redis); `SettlementObligationWorker`+`CoreEventProcessor` seguem DISTRIBUIDOS
(queue-group, money-path). **PROVA VIVA (HML e PRD, desired=3):** 0 timeout, 1
"assumiu lideranca", 0 "PERDEU"; rpc por pod: lider tem Scheduler vivo, followers
`scheduler=nil cycle=nil coreEvent=true`. TDD 5/0 + 3/0.

### 3. ICOM 6 slots ativos (defeito de config, corrigido)
`in_use` 4/2 era snapshot, mas o banco provou so 4 sessoes/canal: o env travava
`ICOM_MAX_SLOTS=4`. Fix: `ICOM_CPM_MAX_SLOTS=ICOM_CSM_MAX_SLOTS=ICOM_MAX_SLOTS=6`
nas task-defs. **PROVA VIVA (HML e PRD):** `icom_sessions` open **CPM=6 CSM=6**;
pod lider com **6+6 workers vivos** (outros pods 0, coordinator singleton); PRD
in_use CPM satura em 6; zero slot em error.

### 4. Follow-ups do incidente JF (do inicio da sessao — committados e pushados)
- `b2939c90` fecha `/api/v1` do spi_service SEM auth (fail-closed HMAC) + espelha
  alcada 4-olhos no funil de pagamentos. **DEPLOYADO** (ancestral da imagem
  `7952b8ac` -> esta em pix-api:201 HML / :72 PRD; /api/v1 agora exige auth).
- `c50fc04a` IP do cliente right-most-trusted + cadeia XFF crua nos 3 sistemas +
  SPB grava ator UUID. Parte **pix DEPLOYADA** (pix:201/72); partes **core-backend
  + spb committadas/pushadas mas NAO deployadas** (core-api/spb-api em imagem
  anterior).

### 5. Fix de display da lista PIX (`e4957667`, deployado em pix:201/72)
ACCC=Liquidado, devolucao=Devolvida (roxo), valor da devolucao correto.

## Revisoes vivas (verificadas 2026-07-21 ~17:5x BRT)

| servico | HML | PRD |
|---|---|---|
| pix-api | :201 (desired=3, running=3) | :72 (desired=3, running=3) |
| core-api | :190 (running=1; outra sessao mid-deploy da API publica ext) | :83 (running=1) |
| spb-api | :71 | :40 |
| sta-api | :15 | :19 |
| core-admin-ui | :36 | :29 |
| core-banking-ui | :41 | :11 |
| core-merchant-ui | :25 | :7 |

pix-api :201/72 = imagem `homolog|prod-7952b8ac-failproof-20260721` (digest match,
sidecar pix-mtls preservado no PRD). TG pix 3/3 healthy, ICOM 6+6, semaforo global
capando o 7o, 0 timeout JetStream.

## PENDENCIAS para a proxima sessao (nada esquecido)

### Do incidente JF (prioridade que abriu a sessao — NAO reexaminado hoje)
1. **MONITORAR as 2 contenções no BACEN de PROD** (nao reabrir): MED 2.0 id
   `94889900-4bf7-477e-9d51-c6a8e10530bd` (AWAITING_ANALYSIS) e Marcador de fraude
   `5ce23971-3942-4762-bd1d-aa0505946a31` (REGISTERED). Consultar desfecho via
   `Shared.Bacen.DictClient.get_funds_recovery/1` + listagem de fraud markers (rpc
   pix-api PRD). Reportar se houve bloqueio/devolucao pelo PSP recebedor (ISPB
   02038232). Detalhe: `docs/handoff/2026-07-21-incidente-movimentacoes-jf-handoff.md`
   (LOCAL, confidencial). Memoria [[monetarie-incidente-jf-forense-0721]].
2. **Deploy das partes core-backend + spb do follow-up XFF** (`c50fc04a`) — hoje so
   a parte pix subiu. Coordenar deploy core-api/spb-api.
3. **Verificacao funcional do auth /api/v1** (agora LIVE em pix:201/72): confirmar
   que os chamadores legitimos (Core m2m, browser) seguem 200 e nao-auth = 401.
   Avaliar maker-checker/limites por operador p/ PIX/TED de alto valor (o espelho
   de alcada 4-olhos ja entrou; limites por operador seguem a desenhar).

### Da migração/frentes anteriores (herdadas, ainda abertas)
4. **QR dinamico: cadastrar CQRC no BACEN via STA** (CADASTRAL, acao do cliente; x5c
   ja no ar). PEMs prontos no Desktop; exige usuario STA "Sisbacen SCERTQRC"; depois
   revalidar no PIX Tester. [[monetarie-qr-cert-audit-tednumctrlif-0720]]
5. **TED viva pelo IB em HML** (PR#20 ponta a ponta no gate :xsd_oficial).
6. **Validacao VISUAL por screenshot (regra #11)** das telas deployadas (lote B/C
   IB/merchant, STA Vue, SisbajudView) — VPN instavel bloqueou.
7. **Deploy do lote IB** (paridade banking/merchant-ui): main tem `edf4e791` (B/C) +
   `a7064b44` (B4-B9); segurados p/ validacao visual. [[monetarie-lote-b4-b9-ib-0720]]
8. **STA follow-ups**: token DEDICADO `STA_SERVICE_TOKEN` (exige +1 ARN na whitelist
   da execution role); job de snapshot do saldo da cabine em PRD (CA-001/002);
   MetricsView ainda mock. [[monetarie-sta-v1-auth-failclosed-0721]]
9. **pix-api PRD**: Postgrex disconnects periodicos (2-6/h, pre-existente, Task
   segurando conexao >15s). [[monetarie-varredura-pos-wave1-0718]]
10. **Bloqueado em TERCEIROS**: SES sa-east-1 zero identidades; conta de tesouraria
    p/ SPI_REMUNERATION_SWEEP; ensaio AMES-SIMBA (secret cloak_key+operador);
    infracao/MED em HML exige transacao LIQUIDADA via outra instituicao.
11. **Vulci item 6 (tarifa SLB)**: unico ainda em desenvolvimento (14/15 atendidos).
    Design em `docs/plans/2026-07-21-tarifa-slb-mapeamento-design.md`.
12. **Higiene (baixa)**: 4 memorias 06-30 citam PIX signing UID `lMcWo5` (STALE;
    autoritativo pos-07-03 = T011 `oe1ZQyCUK4CwYFfbRaiX` [[monetarie-pix-hsm-uids-t011]]).

### Do time / outra sessao (integrados, deploy proprio deles)
13. **Migration `20260721230000`** (balancete item 10, prune orphan cosif families +
    barra snapshot futuro) — MERGEADA na main; deploy core-backend = do time (handoff
    deles `194f01eb`). Aplicar via rpc antes do swap.
14. **Onboarding Nextcode PF/PJ + exposicao publica monetarie.com** (outra sessao):
    committado/pushado; core-api mid-deploy (API publica ext TG). Deploy/validacao =
    frente da outra sessao. [[monetarie-exposicao-publica-onboarding-0721]]

## GOTCHAS
- `ICOM_*_MAX_SLOTS=6` vive na TASK-DEF; deploy futuro partindo de template antigo
  (=4) REVERTE. Basear sempre na revisao viva (HML>=201, PRD>=72).
- `in_use(canal,ispb)` = permits em uso AGORA (workers mid-GET), flutua abaixo de 6;
  NAO e o numero de sessoes (=6, ver `icom_sessions status=open`) nem o cap (=6).
- Worker ICOM e poll+sleep 200ms, nao held-open long-poll.
- DUAS sessoes ativas na mesma main local: push/merge feitos com preview read-only
  (merge-tree) e ff-check antes de cada escrita; a outra sessao commita ao vivo
  (HEAD mexe entre comandos) — sempre re-checar HEAD antes de push.
- `timeout`/`gtimeout` nao existem por padrao no macOS desta maquina.

## Regras da casa (valendo)
BACEN e verdade, ache o NOSSO defeito e prove empiricamente; em producao nao existe
teste; NUNCA deployar pix/spb com o dono operando money-path ao vivo; os follow-ups
JF sao INTERNOS (nao vao a relatorio de cliente); docs pt-br sem travessao; nada de
push/commit sem OK do dono (este handoff foi feito COM ordem explicita de push+merge).
