# W1-F5 B10 — Carga do lote no simulador (numeros MEDIDOS)

Data: 2026-07-18. Ambiente: worktree da frente F5, em processo (rota PURA do
simulador — `ResponseGenerator.generate_response`; sem HSM, sem HTTP, sem
NATS). Harness: `Shared.Bacen.Simulator.CapacityTest.run_spi_capacity` com o
modo lote novo (`batch: true`, `batch_size: 10`) e contadores medidos de
POSTs (= envelopes = assinaturas-equivalentes, 1 sign-rsa por envelope) e de
violacoes do ANS de 1600ms POR transacao. Script: `f5_carga.exs` (scratchpad;
comandos reproduziveis abaixo).

ESCOPO HONESTO: este harness mede build do XML + resposta do simulador em
CPU local. O custo dominante do envio REAL (assinatura HSM ~20-30ms + POST
HTTP ao ICOM ~100ms+) NAO existe aqui — e exatamente o custo que o lote
amortiza. Os numeros de AMORTIZACAO (posts/assinaturas por transacao) sao
estruturais e valem em qualquer ambiente; os numeros de LATENCIA por
transacao so ganham significado completo no G3 em HML (runbook da B11).

## Rodadas

| Rodada | txs | posts | avg ms/tx | p95 | p99 | tps efetivo | ANS>1600ms |
|---|---|---|---|---|---|---|---|
| 1. UNITARIO 400tps x 5s | 2000 | 2000 | 0,95 | 1 | 15 | 8.147 | 0 |
| 2. LOTE 10 (mesma carga) | 2000 | **200** | 5,98 | 12 | 15 | **12.728** | 0 |
| 3a. Rajada 500 unitario | 500 | 500 | 0,95 | 2 | 2 | 8.197 | 0 |
| 3b. Rajada 500 lote 10 | 500 | **50** | 5,84 | 7 | 7 | **12.195** | 0 |
| 4. `:partial_reject` lote | 100 | 10 | 7,6 | 8 | 8 | 7.143 | 0 |

Escoamento da rajada de 500: unitario 61ms; lote 41ms (reducao de 33% JA no
harness CPU-only, sem o ganho dominante de HSM/HTTP).

## Criterios de aceite do plano (medidos)

1. **assinaturas <= N/8 e POSTs <= N/8**: **PASSOU FOLGADO** — 200 <= 250
   (razao real N/10, o teto da wave; assinatura = 1 por envelope por
   construcao, A6.5).
2. **p50/avg por tx nao pior que baseline +10%**: **NAO SE APLICA no
   harness CPU-only** — 0,95ms -> 5,98ms porque a latencia do ENVELOPE e
   atribuida a cada uma das 10 tx e aqui nao ha HSM/HTTP para amortizar
   (5,98ms = 0,37% do budget ANS). O criterio real se decide no G3 em HML
   (sign+post dominam; 1 assinatura+1 POST servem 10 tx). Registrado sem
   maquiagem.
3. **ANS breaches = 0**: **PASSOU** em TODAS as rodadas (0/0/0/0/0).
4. **Zero linha sem desfecho no `:partial_reject`**: **PASSOU** — 10
   envelopes de 10, cada resposta com 10 `TxInfAndSts` (9 ACCC + 1 RJCT
   AB09, deterministico); prova da forma no teste
   `capacity_test_batch_test.exs` (extract_status_items = 9+1).
5. **Claims sem vazamento**: coberto na suite da B5
   (`outbound_sender_batch_test.exs`): membro claim+batch_message_id em
   sucesso; release TOTAL em transporte falho; nenhum claim orfao — o
   harness em processo nao toca o DB de claims (o pipeline do sender e
   exercitado pela suite, nao pela carga local).
6. **Throughput**: +56% de tps efetivo com lote (8.147 -> 12.728) ja no
   CPU-only.

## Reproducao

```bash
cd pix/backend/apps/shared
MIX_ENV=test mix run --no-start <script>   # script = f5_carga.exs (4 rodadas)
# ou pontualmente:
# CapacityTest.run_spi_capacity(tps: 400, duration_seconds: 5, batch: true, batch_size: 10)
```

## O que fica para o G3 (HML, runbook B11)

- p50/p95 por transacao com HSM+HTTP reais (criterio 2 decidido la);
- rajada de 12 PIX reais/validos com flag ON: 2 POSTs (10+2) visiveis em
  `[ICOM] SEND_OK batch=10/2`, 12 desfechos individuais, claims conferidos;
- token budget em modo observe sem estouro do bucket (3750/750s).
