# Vigia do netting 00:30 UTC de 19/07 + kit de sondas PRD (provadas vivas em 18/07)

Todas as sondas abaixo foram executadas com sucesso em 18/07 ~16:40-17:10 UTC durante a varredura empirica pos-Wave 1. Sao 100% read-only. Receita geral: rpc via ECS execute-command com payload em base64 (mata escaping; sessao SSM corta output longo, entao fatiar).

## Setup comum

```bash
awsmon() { env -u AWS_ACCESS_KEY_ID -u AWS_SECRET_ACCESS_KEY -u AWS_SESSION_TOKEN AWS_PROFILE=vulcimonetarie AWS_REGION=sa-east-1 aws "$@"; }
CORE_TASK=$(awsmon ecs list-tasks --cluster monetarie-greenfield-prod --service-name core-api --query 'taskArns[0]' --output text)
PIX_TASK=$(awsmon ecs list-tasks --cluster monetarie-greenfield-prod --service-name pix-api --query 'taskArns[0]' --output text)

# helper: roda um .exs no container via rpc
rpc_core() { B64=$(base64 -i "$1" | tr -d '\n'); awsmon ecs execute-command --cluster monetarie-greenfield-prod --task $CORE_TASK --container core-api --interactive --command "bin/monetarie rpc \"Code.eval_string(Base.decode64!(~s|$B64|))\""; }
rpc_pix() { B64=$(base64 -i "$1" | tr -d '\n'); awsmon ecs execute-command --cluster monetarie-greenfield-prod --task $PIX_TASK --container pix-api --interactive --command "bin/monetarie_pix rpc \"Code.eval_string(Base.decode64!(~s|$B64|))\""; }
```

## 1. VIGIA DO NETTING (rodar entre 00:35 e 01:00 UTC de 19/07, ou 21:35 BRT de 18/07)

Contexto: a janela de 00:30 UTC de 18/07 rodou ANTES do DDL `20260718100000` (relax dos NOT NULL legados de `netting_operations`) e o INSERT falhou 23502, indo para a DLQ (seq 40). O DDL foi aplicado em HML+PRD e o probe passou. O primeiro fechamento de janela REAL pos-DDL e o de 00:30 UTC de 19/07. Criterio de sucesso: o ciclo REGISTRA (linha PENDING) e NAO envenena a DLQ.

probe_netting.exs:

```elixir
import Ecto.Query
n = Shared.Repo.all(from x in Shared.Schemas.Settlement.NettingResult, group_by: x.status, select: {x.status, count(x.id)})
IO.puts("NETTING=#{inspect(n)}")
{:ok, %{body: b}} = Gnat.request(Shared.Nats.JetStream.connection_name(), "$JS.API.STREAM.INFO.MONETARIE_DLQ", Jason.encode!(%{subjects_filter: "monetarie.dlq.>"}), receive_timeout: 5000)
dd = Jason.decode!(b)
IO.puts("DLQ msgs=#{get_in(dd, ["state", "messages"])} last_seq=#{get_in(dd, ["state", "last_seq"])}")
```

Rodar: `rpc_pix probe_netting.exs`

- ESPERADO (sucesso): `NETTING=[{"PENDING", 1}]` (ou mais linhas em dias seguintes) e DLQ inalterada (`msgs=25 last_seq=42`, baseline de 18/07 17:00 UTC).
- FALHA (escalar ao dono, NAO redespachar nada): `NETTING=[]` com `last_seq` > 42 significa que o INSERT falhou de novo e caiu na DLQ. Ler a mensagem nova da DLQ ANTES de qualquer acao. Seq 41/42 seguem NAO redespachaveis (duplicariam o espelho da Wise).
- Observacao: os workers de netting registram o ciclo mas NAO executam liquidacao multilateral real (sem LDL). Linha PENDING e o desfecho correto hoje.

## 2. Kit de sondas para segunda 21/07 (antes e depois das sequencias do cliente)

### 2a. TB == extrato (todas as contas)

probe_reconcile.exs:

```elixir
r = Monetarie.Release.StatementBackfill.reconcile()
IO.puts("RECONCILE_DRIFTS=#{length(r)}")
if r != [], do: IO.inspect(Enum.take(r, 5), label: "SAMPLE")
```

Rodar: `rpc_core probe_reconcile.exs`. Sao = `RECONCILE_DRIFTS=0`. Baseline 18/07: 0.

### 2b. Batimento contabil PIX (COSIF)

probe_pixrecon.exs (ajustar a data final para o dia corrente):

```elixir
s = Monetarie.UseCases.Cosif.PixReconciliation.reconcile(~D[2026-07-01], ~D[2026-07-21]).summary
IO.puts("PIXRECON tx=#{s.transactions} matched=#{s.matched} pending=#{s.pending} div=#{s.divergences} kinds=#{inspect(s.by_kind)}")
```

Rodar: `rpc_core probe_pixrecon.exs`. Sao = `div=0` e todos os kinds zerados. `pending>0` transitorio e normal (espelho assincrono em voo); divergencia NAO e. Baseline 18/07: tx=32 matched=32 div=0.

### 2c. Saldo COSIF da conta de liquidacao

probe_cosif.exs:

```elixir
import Ecto.Query
a = Monetarie.Repo.get_by!(Monetarie.Schemas.Cosif.CosifAccount, code: "1.1.2.10.01.10.001")
d = Monetarie.Repo.aggregate(from(j in Monetarie.Schemas.Cosif.JournalEntry, where: j.debit_account_id == ^a.id), :sum, :amount)
c = Monetarie.Repo.aggregate(from(j in Monetarie.Schemas.Cosif.JournalEntry, where: j.credit_account_id == ^a.id), :sum, :amount)
IO.puts("COSIF_LIQ D=#{d} C=#{c}")
```

Rodar: `rpc_core probe_cosif.exs`. Saldo = D - C em CENTAVOS (calcular fora; sao Decimal). Baseline 18/07 17:00 UTC: D=149094298772 C=148775036095, saldo 319.262.677 cents (R$ 3.192.626,77). ATENCAO: esse agregado inclui 2 lancamentos de acervo do ETL datados 2026-07-31 (net -1.079.740 cents, inseridos em 09/07, refid cash_credit/passthrough_debit 2026-07). Na janela ate o dia corrente o saldo e 320.342.417 cents (R$ 3.203.424,17). Movimento do dia deve ser explicavel pelas operacoes journaled do dia (query por entry_date como em 2d).

### 2d. Movimento COSIF do dia na conta de liquidacao

```elixir
import Ecto.Query
a = Monetarie.Repo.get_by!(Monetarie.Schemas.Cosif.CosifAccount, code: "1.1.2.10.01.10.001")
rows = Monetarie.Repo.all(from j in Monetarie.Schemas.Cosif.JournalEntry, where: (j.debit_account_id == ^a.id or j.credit_account_id == ^a.id) and j.entry_date == ^Date.utc_today(), select: %{amt: j.amount, deb: j.debit_account_id == ^a.id, ref: j.reference_type})
Enum.each(rows, fn r -> IO.puts("#{if r.deb, do: "D", else: "C"} #{r.amt} #{r.ref}") end)
```

### 2e. ICOM vivo (cabine pix)

```elixir
import Ecto.Query
i = Shared.Repo.all(from s in Shared.Schemas.Spi.IcomSession, where: s.status == "open", group_by: s.canal, select: {s.canal, count(s.id)})
IO.puts("ICOM_OPEN=#{inspect(i)}")
```

Rodar: `rpc_pix`. Sao (baseline 18/07) = `[{"CSM", 4}, {"CPM", 4}]`. Zero em qualquer canal = ESCALAR (janela surda).

### 2f. Erros de log desde um instante

```bash
START=$(date -u -j -f '%Y-%m-%dT%H:%M:%S' '2026-07-21T11:00:00' +%s)000
for g in core-api pix-api spb-api; do
  n=$(awsmon logs filter-log-events --log-group-name /ecs/monetarie/prod/$g --start-time $START --filter-pattern '"[error]"' --query 'length(events)' --output text)
  echo "$g [error]: $n"
done
```

### 2g. Remuneracao SPI cross-sistema (sweep preso no core)

Linhas de sweep que o core recebeu e nao concluiu o credito institucional (so relevante com `SPI_REMUNERATION_SWEEP_ENABLED=true`; com a flag OFF a consulta devolve 0 por definicao):

```bash
# via rpc no core-api PRD
Monetarie.Repo.query!("SELECT count(*) FROM pix_remuneration_sweeps WHERE status = 'processing' AND inserted_at < now() - interval '2 hours'")
```

Esperado 0. Se > 0, o consumidor fail-closed rejeitou (conta de tesouraria sem a tag `spi_remuneration`) ou o credito falhou; investigar DLQ + logs do PIX Consumer e replay recupera.

Ruidos CONHECIDOS que nao sao incidente (baseline 18/07; atualizado 19/07 tarde pos-deploy core:72/pix:66):

- `[DlqDepthMonitor] CRITICO DLQ MONEY-PATH acima do teto` a cada minuto: e a DLQ residual triada (25 msgs). Purge aguarda decisao do dono.
- ~~`[PixInOrphanRecon] ORFAO PIX-in ... e2e=E5958811120260717205916346PG2TJD`~~ RESOLVIDO em 19/07 tarde: `run_reconciliation(lookback_hours: 72)` pos-deploy marcou o orfao da Wise `resolved/return_completed` (o codigo novo B7 reconhece devolucao pacs.004 concluida). Se REAPARECER e porque e um orfao NOVO: investigar.
- `Postgrex ... disconnected ... timed out because it queued and checked out the connection for longer than 15000ms`: padrao continuo de 2 a 6 por hora o dia inteiro (provado em 18/07 atravessando as revisoes 61/62/63). Follow-up aberto para identificar o Task periodico lento. Se a FREQUENCIA subir muito acima disso, investigar.
- `[CertMaterializer] erro lendo CPIA/CPIC/PEERPIA ... :access_denied`: so em boot, pre-existente, mTLS opera normal (sessoes ICOM abertas provam).
- `[CCS.Scheduler] CCS submission failed ... column a.status does not exist` no spb-api: trilho de CCS LEGADO da cabine SPB, morto desde sempre, 1 tentativa por boot, nunca chegou ao BACEN. O CCS verdadeiro roda no Core (rodou em 18/07 01:00 BRT, ACCS001_202607180001.xml). Gate `SPB_CCS_SCHEDULER_ENABLED` (default OFF) implementado em 18/07, entra no proximo deploy do spb-api.

## 3. Regras da operacao de segunda 21/07

- O DONO e a UNICA interface com o cliente. Suporte tecnico sob acionamento.
- NUNCA deployar/reiniciar pix/spb durante a operacao (troca de lideranca ICOM perde mensagem do BACEN).
- Reconciliacao (2a + 2b) ANTES do inicio e DEPOIS do fim das sequencias.
- Em producao nao existe teste: acompanhamento perna a perna das operacoes reais.
