# Pacote único de ações PRD/externas para OK do dono (2026-07-19)

> **EXECUÇÃO 2026-07-19 TARDE, ONDA 2 (decisões do dono item a item).** §5 purge DLQ EXECUTADO (stream 0 msgs, first_seq 43; alarme do DlqDepthMonitor cessou, 0 ocorrências em 10min). Flips EXECUTADOS e provados no BEAM: `JUDICIAL_TRANSFER_ACCEPT_ENABLED=true` (autorizado direto em PRD sem janela HML, decisão do dono; escalação 60min, cutoff 240min) + `SPB_AUTO_RETURN_ENABLED=true` (limiar 50min) em PRD core:73 e HML core:176. §4 G3 PARCIAL com ACHADO: caminho unitário provado vivo (`SEND_OK batch=1 gate_ms=9 sign_ms=54 xsd_ms=6 post_ms=47`, lookup-to-pay reusando E2E da consulta), flag do lote LIGADA em HML (pix:193, ICOM ok), MAS a rajada de 12 por chave única foi RECUSADA POR DESENHO pela disciplina de submissão (E2eCache = 1 slot por chave; 12/12 `DICT_CONSULT_REQUIRED` ao Core, holds 100% devolvidos, saldo ao centavo) — rajada multi-mensagem REAL exige tráfego MANU ou multi-chave; PRD segue OFF. §10 rotação de chaves: DISPENSADA pelo dono ("não precisa fazer nada"). §9 drift TF: regra permanente = nunca virar problema/regressão (nunca apply; reconciliação só em sessão dedicada).
>
> **EXECUÇÃO 2026-07-19 TARDE (autorização do dono: "build e deploy nos 2 ambientes + todas as pendências").** EXECUTADOS: §1 push (fecho da manhã), §2 deploy completo HML+PRD com as 5 migrations ANTES do swap e todas as validações (revisões: HML core:175 pix:192 admin:32 banking:32 merchant:19 pixadmin:53; PRD core:72 pix:66 admin:25 banking:6 merchant:4 pixadmin:27; CADOC 0 registros nos 2; Wise `resolved/return_completed`), §3 flip `PIX_RETURN_4XX_TERMINAL=true` nos 2 ambientes (provado no BEAM), §6 portal opção A + takedown (docs-portal HML:14 PRD:9, `/raw/` limpo provado), §8 ECR lifecycle nos 3 repos. PENDENTES: §3 demais flips (SES sem identidade no sa-east-1; judicial exige janela HML do reg 07; sweep falta conta tesouraria taggeada — relatório JÁ validado vivo nos 2 ambientes; SPB_AUTO_RETURN pós-segunda), §4 G3 lote (janela HML própria), §5 purge DLQ (destrutivo, aguarda OK), §7 nada a enviar, §9 runbook (nunca apply), §10 rotação de chaves (decisão do dono), §11 AMES-SIMBA (falta secret `monetarie/homolog/simba/cloak_key` + passos de operador). Detalhe: memória `monetarie-deploy-pacote-degrau1-0719`.

Tudo abaixo está PRONTO e aguarda decisão. Nada foi pushado, deployado, publicado, purgado ou transmitido. Cada item traz comando, pré-condição e rollback. Código: 26 commits locais na main (`c3094a0c..86c3ac49` + docs do fecho), todos com TDD e revisão adversarial; suítes completas no relatório de fecho.

REGRA DA SEGUNDA 21/07: o cliente roda sequências com o dono como única interface. NENHUM deploy/restart de pix/spb durante a operação. Janela de deploy recomendada: domingo 20/07 ou segunda após o fecho da operação, com acompanhamento.

## 1. PUSH da main

`git push origin main` leva os 26 commits (mais os docs do fecho). Sem migração de dado, sem mudança de comportamento vivo até o deploy. Rollback: nada muda em runtime só com o push.

## 2. DEPLOY (HML primeiro, depois PRD com digest match)

Serviços com código novo: **core-api** (aceite judicial flag OFF, grade CCS + SES dormente, webhooks test dirigido, natureza judicial, Cadoc1201 corrigido, consumidor remuneração, dict 202 corrigido), **pix-api** (netting schema, MED 422 local, retry idempotente, COERCION, pacs.004 4xx flag OFF + gate de redelivery + return.rejected ao Core, órfãos/timeouts, sweep remuneração flag OFF), **core-admin-ui** (botões de aceite judicial), **core-banking-ui** (delete-key por valor, código de 18/07 nunca deployado), **core-merchant-ui** (delete-key 2 telas), **pix-admin-ui** (form fraud marker válido).

MIGRATIONS via rpc ANTES do swap (todas aditivas, idempotentes, provadas no-op no migrate() da imagem nova):
- core: `20260719103000` (aceite judicial), `20260719110000` (ccs_schedule_notifications), `20260719130000` (pix_remuneration_sweeps)
- pix (Shared.Release.migrate): `20260719130000` (pix_in_orphans.resolution), `20260719140000` (spi_remuneration_sweeps)

PRÉ-CONDIÇÃO CADOC (obrigatória antes do primeiro generate/resend 1201 pós-deploy): varrer snapshots com taxonomia antiga nos 2 ambientes:
```sql
SELECT id, entity_id, reference_year, reference_month, status,
       metadata->>'aggregation_version' AS v, regulatory_file_id, updated_at
  FROM cadoc1201_records
 WHERE metadata->>'aggregation_version' IS DISTINCT FROM '3';
```
Linhas `generated/included/failed`: regenerar pelo painel (o código novo re-agrega e supersede). Linhas `delivered/confirmed`: o mês foi ao BCB com a taxonomia antiga; avaliar retificação caso a caso (o resend guard novo já bloqueia reenvio com 422).

PÓS-DEPLOY pix (1 comando): resolver o órfão vivo da Wise (fora do lookback de 24h):
`bin/monetarie_pix rpc "SpiService.Workers.PixInOrphanReconciliation.run_reconciliation(lookback_hours: 72)"`
Sonda de prova: `SELECT status, reason, resolution FROM monetarie_spi.pix_in_orphans WHERE end_to_end_id='E5958811120260717205916346PG2TJD';` esperado `resolved / return_completed`.

Validação pós-swap padrão: TG healthy, ICOM CPM+CSM reassumidos, DLQ inalterada, reconcile 0. Rollbacks = revisões atuais (PRD core:71 pix:65).

## 3. FLIPS de flag (cada um é decisão separada; todos nasceram OFF)

| Flag | Recomendação | Pré-condição |
|---|---|---|
| `SPB_AUTO_RETURN_ENABLED=true` (core) | LIGAR após a segunda 21/07 | nenhuma; código completo com paridade do cron legado; caminho manual continua |
| `PIX_RETURN_4XX_TERMINAL_ENABLED=true` (pix) | LIGAR no deploy | o fix `d1a6c26a` fechou o re-POST e publica desfecho ao Core; o modo OFF real é PIOR (PDNG eterno + DLQ silenciosa, provado na revisão) |
| `EMAIL_TRANSPORT=ses` + `SES_REGION=sa-east-1` + `CCS_SCHEDULE_*` (core) | LIGAR depois da verificação SES | verificar domínio `monetarie.com.br` no SES sa-east-1 (DKIM/SPF) + `ses:SendRawEmail` na task role; `CCS_NOTIFICATION_EMAILS` com os destinatários que o dono definir; sem isso tudo permanece Logger fail-safe |
| `JUDICIAL_TRANSFER_ACCEPT_ENABLED=true` (core) | HML PRIMEIRO | pré-condição da revisão: provar em HML que o BCB reapresenta o registro 07 não respondido (o 5302 da ordem parkeada sai com a resposta dela retida; a decisão é entregue na reapresentação). Só depois PRD |
| `SPI_REMUNERATION_SWEEP_ENABLED=true` (pix) | ÚLTIMO degrau | 1) O CORE NOVO precisa ter bootado ao menos 1 vez ANTES do flip (o stream `MONETARIE_PIX_REMUNERATION` é criado no boot do core; flag ligada antes = evento publicado evapora sem retenção); 2) configurar a conta institucional: `UPDATE treasury_accounts SET metadata = coalesce(metadata,'{}'::jsonb) || '{"spi_remuneration": true}' WHERE code='<conta que o dono escolher>';` idem `treasury_history_codes` (sem isso o consumo é fail-closed e o evento espera na DLQ, replay recupera); 3) validar o relatório de remuneração em HML; 4) revisão conjunta do fio APROVADA sem bloqueante (payload provado caractere a caractere); sonda extra recomendada no kit: linhas `pix_remuneration_sweeps` em `processing` com idade maior que 2h no core |

## 4. G3 do lote PIX (janela HML dedicada)

Roteiro completo em `docs/operator/2026-07-18-runbook-f5-lote-pix-deploy-janela.md`: deploy HML flags OFF, 1 PIX unitário de prova, ligar `PIX_OUTBOUND_BATCH_ENABLED` SÓ em HML, rajada de 12 PIX reais (2 POSTs batch=10+2, 12 desfechos individuais, claims com batch_message_id, zero órfão), cenário de falha do sidecar opcional. PRD só depois, em janela própria.

## 5. Purge da DLQ PRD

25 mensagens 100% triadas como histórico resolvido (`docs/reports/2026-07-18-reparo-cosif-r2-ca026-e-incidente-duplo-credito-tb.md:100-104`). REGRA DURA: seq 41/42 (RETURN_CREATED da Wise) NUNCA redespachar. Purge total via nats-box na EC2 do NATS PRD (`i-0c9cd61aa15983b89`):
`docker run --rm --network host natsio/nats-box:latest nats stream purge MONETARIE_DLQ -f`
Efeito colateral positivo: o alarme de minuto em minuto do DlqDepthMonitor cessa. Rollback: não há (purge é destrutivo); por isso está aqui e não foi executado.

## 6. Portal do parceiro (opção A) + takedown docs-h

`docs/reports/2026-07-18-proposta-publicacao-portal-parceiro.md`. Passos: (1) rebuild do dist VitePress (a doc fonte mudou na sessão: webhooks test dirigido); (2) build da imagem LIMPA `docs/partner-portal/Dockerfile` (sem `/raw/`), push ao ECR `monetarie/docs-portal` com tag imutável; (3) `force-new-deployment` em HML e, se aprovado, PRD. Executa o takedown da exposição interna de brinde. Decisões embutidas: host docs vira exclusivo do portal; HML e PRD; tag imutável.

## 7. APIX de abril: veredito NÃO RETIFICAR

`docs/reports/2026-07-19-apix-abril-batimento-semantica-oficial.md`: pela instrução oficial v2.6, o arquivo do legado estava CORRETO nos baldes de transação; consultas indeterminadas (definição oficial = cópia local do DICT); o defeito de taxonomia era NOSSO e foi corrigido no gerador (`32da38b8`+`85d3d4b8`). Única célula não verificável: receita fonte 1 (586,03, origem desconhecida). Se o dono souber a origem e ela divergir, o caminho de retificação (TipoEnvio S pelo painel CADOC + STA) está pronto; senão, nada a enviar. Geração dos meses futuros: pelo Cadoc1201 corrigido com overrides do operador documentados.

## 8. ECR lifecycle (aplicação = decisão; apagar imagem afeta rollback por digest)

Política conservadora proposta (por repositório principal: core-api, pix-api, spb-api):
```json
{"rules":[{"rulePriority":1,"description":"expira untagged com mais de 30 dias","selection":{"tagStatus":"untagged","countType":"sinceImagePushed","countUnit":"days","countNumber":30},"action":{"type":"expire"}}]}
```
Nunca toca imagem tagueada. Risco residual: task-def antiga apontando por digest de imagem untagged com mais de 30 dias deixaria de ser restaurável; mitigação: as revisões de rollback ativas são sempre recentes. Aplicar com `awsmon ecr put-lifecycle-policy --repository-name monetarie/<svc> --lifecycle-policy-text file://policy.json`.

## 9. Drift Terraform HML (NUNCA apply)

Estado: plan = 26 add / 15 change / 9 destroy (NATS, TigerBeetle e OpenVPN de HML seriam RECRIADOS). Caminho seguro quando houver vontade: sessão dedicada de reconciliação de state recurso a recurso (`terraform state rm` + `import` dos vivos, alinhar AMIs/volumes declarados ao real, remover a infra NAT desenhada e nunca aplicada), com `plan` zerando antes de qualquer apply. Até lá: proibido apply, como já é regra.

## 10. Chaves do antigo `diversos/`

Movidas para `/Users/luizpenha/monetarie-diversos-sensivel/` (chmod 700, fora do repo). Tratar como expostas a tooling local: rotação dos certificados TLS qrcode*, do perfil OpenVPN PRD do Eduardo e revisão do credentials.csv = decisão do dono (BACEN T010/T011 têm processo próprio de troca, avaliar necessidade).

## 11. Validações vivas pendentes de janela HML

- AMES-SIMBA: deliver real ao STA (receita em `docs/reports/2026-07-19-ames-simba-validacao.md`; exige deploy core HML + secret `monetarie/homolog/simba/cloak_key`).
- Aceite judicial: reapresentação do registro 07 (item 3).
- Remuneração SPI: relatório de tesouraria com dados reais + primeiro sweep em HML.
- Primeira transação LIQUIDADA real (segunda 21/07) habilita o degrau final da infração/MED sobre raiz liquidada (abrir = decisão do dono na hora).

## 12. Envs novos consolidados por task-def

- core-api: `EMAIL_TRANSPORT`, `SES_REGION`, `CCS_SCHEDULE_ACCS003|ACCS009|SYSTEM_WINDOW|CC_IMPORTED|CONSOLIDATION|GENERATION|SUBMISSION|VERDICT` (opcionais, defaults embutidos), `JUDICIAL_TRANSFER_ACCEPT_ENABLED`, `JUDICIAL_ACCEPT_ESCALATION_MINUTES`, `JUDICIAL_ACCEPT_CUTOFF_MINUTES`, `SPB_AUTO_RETURN_ENABLED` (já existia).
- pix-api: `PIX_RETURN_4XX_TERMINAL_ENABLED`, `SPI_REMUNERATION_SWEEP_ENABLED`.
Todos default OFF/ausente = comportamento atual.
