Go-live da Nero — checklist com prova

A Nero só recebe key_live_ depois de cumprir esta lista na operação nero-br-hml (sandbox). Cada item tem uma prova: algo que se mostra (saída de teste, log, métrica, print do painel), não uma promessa. Item sem prova conta como não feito. Esta lista complementa o checklist geral de ../go-live-operador.md com o que é específico da bet.

Copie para o tracker da Nero, preencha a coluna "Prova" e anexe ao registro de go-live.

1. Credencial e rede

# Item Prova
N1 Credencial do Dracma legível só pelo user Linux do nero_payments (0400), entregue pelo ops da Nero stat -c '%a %U' <arquivo> = 400 <user do nero_payments>; grep -r key_live_ no repositório e na imagem sem resultado
N2 Egress para o Dracma só do user do nero_payments (R13) regra nftables versionada + teste: curl ao host do Dracma a partir de outro user falha
N3 Allowlist da operação com todos os IPs de saída (NAT, DR) print do painel com a lista + GET /v1/ping 200 a partir de cada IP
N4 Caddy com a lista de IPs de egress do Dracma só na rota do webhook trecho do Caddyfile versionado + curl à rota a partir de IP fora da lista → recusado no Caddy
N5 NTP ativo e alerta de desvio > 5 s via GET /v1/ping chronyc tracking + regra de alerta versionada
N6 mTLS de produção instalado; renovação agendada aos 60 dias certificado com validade ≤ 90 dias + job/alerta de expiração a 30 dias
N7 Rotação de chave e de segredo de webhook ensaiadas no sandbox sem downtime log do ensaio: dois segredos ativos, webhooks ok durante a troca, chave antiga revogada

2. Depósito

# Item Prova
N8 external_id = dep_<uuidv7> = deposit_id = Idempotency-Key, gravado no outbox antes do POST teste: matar o processo entre o commit do intent e a chamada; o worker retoma com a mesma chave e cria 1 depósito
N9 Valor convertido para centavos sem float teste de unidade com 50, 50.5, 0.01, 50.001 (recusa), 1e3 (recusa)
N10 Exigências de GET /v1/currencies respeitadas: player.name e player.email do cadastro quando exigidos; em hml só @….test teste: jogador sem e-mail recebe "complete o cadastro" sem chamada ao Dracma; depósito com e-mail .test cria 201
N11 Front mostra o expires_at devolvido pelo Dracma print da tela + teste do mapeamento
N12 Crédito só em paid lido por fetch-back, idempotente por external_id receita 4.1 de ../sandbox.md: 1 crédito; redeliver do mesmo evento: continua 1
N13 Webhook forjado (assinado com o segredo de sandbox) para depósito pending não credita teste com verificarWebhook + fetch-back: 200, 0 créditos
N14 under_review não credita; returned aparece como failed receita 4.2 (PAYER_MISMATCH) e 4.3 (AMOUNT_MISMATCH)
N15 paid_amount num depósito terminal (pago depois de expirar/cancelar) → needs_decision, sem crédito (D8) teste de unidade do aplicador com um objeto expired + paid_amount

3. Saque

# Item Prova
N16 Reserva antes do POST /withdrawals, na mesma transação do intent wdr_<uuidv7> teste: falha de rede no POST → reserva continua, worker repete com a mesma chave, 1 saque
N17 Reserva devolvida só em rejected/failed/cancelled confirmados ou em 4xx receitas reject e fail no sandbox: devolução exatamente 1 vez; 503 (outage) não devolve
N18 player.ip do jogador em todo saque log do corpo enviado (sem PII) mostrando o campo presente; saque dentro de X× sai approved
N19 Chave PIX normalizada e pix_type legado mapeado teste de unidade (evp → random, telefone em +55…)
N20 Mensagens ao jogador genéricas em bloqueio (sem revelar lista/motivo) print das mensagens para player_blocked, destination_blocked
N21 returned/recalled → needs_decision, sem recrédito automático (D7/D18) receita return no sandbox: caso na fila, carteira intacta
N22 409 idempotency_key_reused no envio → needs_decision, reserva mantida (D12) teste de unidade do tratamento de resposta

4. Recuperação, reconciliação e operação

# Item Prova
N23 Job de GET /events a cada 5 min, cursor persistido, mesmo aplicador do webhook teste: receptor desligado durante um pay; o job credita 1 vez em ≤ 5 min
N24 Reconciliação diária com digest e assinatura conferidos relatório de um dia de sandbox comparado nos dois lados, zero divergência, header guardado
N25 Fila needs_decision no backoffice com permissões payments.decisions.*, step-up e motivo (D11) print da tela + teste de permissão (papel sem concessão não decide)
N26 Alertas da tabela de webhook-e-jobs.md ativos regras versionadas + disparo de teste de cada uma
N27 Logs sem segredo, sem Dracma-Signature inteiro, sem CPF completo nem chave PIX em claro; Dracma-Trace-Id em toda chamada amostra de log revisada + busca pelos valores proibidos sem resultado
N28 Suíte de conformidade verde contra nero-br-hml saída do go test … -v com todos os casos PASS e a data

5. Dia do corte

# Item Prova
N29 Front em prd sem Dracma configurado responde 503 payment_provider_not_configured e o resto da bet funciona (D5) teste em hml com a credencial removida
N30 Rotas legadas de gateway removidas (404) curl em cada rota da lista do §11
N31 Primeira transação real de valor mínimo (depósito e saque) acompanhada pelos dois lados, do POST à linha da reconciliação registro com os external_id, trace_id e a linha do relatório do dia
N32 Caixa inicial conferido em GET /v1/balances e alerta de caixa baixo ativo print + regra de alerta
N33 Decisões do dono registradas: D1 (saques antigos), D6, D7, D8, D12, D18 link para o registro de decisão
N34 Registro de go-live assinado pelos responsáveis da Nero e do Dracma documento assinado