# Handoff 2026-07-16 — CCS: primeira aceitação do BACEN (SitArq=A) + 3 fixes em PROD

## 0. Resultado

O CCS **nunca tinha funcionado**: o BACEN rejeitava todo ACCS001 (nosso e do legado
cecresa/mwbank) e o sistema marcava "Confirmado" pelo sucesso do upload. Em 16/07 o
arquivo `202607160002` foi **ACEITO (SitArq=A, protocolo 433477214)**, com o ACCS002
real gravado no banco. Obrigação diária do dia 16 cumprida.

## 1. Os 3 defeitos (todos provados contra o BACEN vivo, zero inferência)

Fonte da verdade: os ACCS002 CRUS lidos do JetStream (`$JS.API.STREAM.MSG.GET.MONETARIE_STA`,
leitura pura por seq). O BACEN escreve a explicação de cada rejeição em comentário
dentro do próprio XML.

1. **Encoding (ECCS0001)** — gerávamos UTF-8; o CCS exige **UTF-16BE sem BOM**
   (arquivos dele começam `<<0x00, 0x3C>>`, declaração sem `encoding=`). Texto dele:
   "Os arquivos enviados ao CCS devem obrigatoriamente estarem codificados em formato
   Unicode de 16 bits big endian (UTF-16BE)". Fix: canônico UTF-8 no banco
   (`file_content` é `text`; Postgres recusa 0x00 — erro 22021) e transcodificação na
   fronteira (`StaSubmission.to_ccs_wire_format/1` + `drop_encoding_decl` p/ legados).
2. **Numeração (ECCS0003)** — `NumRemessaArq` deve ser `UltNumRemessaArq + 1`.
   O `Ult` é o contador DO BACEN (avança só quando aceita); NÃO é eco do nosso número.
   Texto dele: "O numero informado ... foi 202607160001. O numero correto seria
   202607160002". Fix: `next_num_remessa` = max(por-dia, Ult+1 do último ACCS002).
3. **Autoridade do ACCS002 (handoff anterior §3.1) + correlação de rejeição** —
   upload success → transição NÃO-terminal "uploaded" (guarda `sta_protocol`, arquivo
   segue `submitted`); só o ACCS002 confirma/rejeita; confirm preserva o protocolo.
   E numa REJEIÇÃO o `Ult` aponta pro último ACEITO → `resolve_accs002_target/2`
   discrimina por CONTEÚDO (terminal + mesmo XML = redelivery idempotente; XML
   diferente = veredito novo → único awaiting). Validado vivo: replay do seq 105
   aplicou ECCS0300 ao `202607160003` pelo caminho novo.

## 2. Fatos novos do BACEN (por escrito, nos ACCS002)

- **Grade horária do CCS: 20:00 da véspera → 08:00 BRT** (fora = ECCS0300). O job
  diário (04:00 UTC = 01:00 BRT) está dentro.
- **Retroativo NÃO é aceito** (movimento de 12/07 enviado dia 16 = ECCS0003).
  O backlog 13-15/07 fica `generated` (lacuna histórica; cadastro é cumulativo).
- Arquivo ilegível → resposta com `NumRemessaArq=999999999999` (sentinela).

## 3. Deploys e commits

| O quê | HML | PROD | rollback |
|---|---|---|---|
| encoding + autoridade (`877ca1af`) | core-api:148 | **:52** | :51 |
| numeração (`54700561`) | :149 | **:53** | :52 |
| correlação de rejeição (`4bbeabb9`) | :150 | **:54** | :53 |

Mesmo digest homolog→prod via `docker buildx imagetools create`. GOTCHA: retag via
`aws ecr batch-get-image`+`put-image` MUDA o digest do índice OCI (o guard de MATCH
do deploy.sh pegou). Suíte completa core: **7719/0** (6 falhas Treasury eram flake de
fronteira de meia-noite, provado com stash e por terem sumido após o horário).
**Push pendente de OK do dono** (3 commits locais).

## 4. Reparo de dados em PROD (executado)

Todos com o XML REAL do veredito (stream seq → arquivo, associação por horário
upload→resposta): 09=seq54, 10=seq61, 11=seq69 (ECCS0001), 12=seq81 (ECCS0003),
0003=seq105 (ECCS0300, aplicado pelo caminho novo). O 08 = rejected descritivo sem
código (a cabine da época não embutia o conteúdo; não inventamos ECCS). Estado final:
08-12 e 160001/160003 `rejected` (verdade), 160002 `confirmed` (SitArq=A), 13-15
`generated`.

## 5. Pendências

1. **CHECAR o job diário de 17/07 ~01:05 BRT**: a virada de dia da numeração não é
   100% confirmada (envia `202607170001`; se ECCS0003, o veredito agora É capturado e
   o comentário do BACEN diz o número certo — ajustar `next_num_remessa` com esse dado).
2. Push dos 3 commits (pedir OK).
3. SISBAJUD: excluir o RESP bogus da aba Arquivos (handoff anterior §3.2; a Tarefa de
   confirmar a origem foi fechada: era 5305 mesmo — `AJUD305` com `cadastro_varas.txt`).
4. DLQ triagem (MONETARIE_DLQ ~22, BACEN_DLQ ~6) — inalterada.
5. Follow-ups do handoff anterior que continuam: 403/retry da cabine re-pede protocolo
   (outro vetor de duplicado), arquivo `uploading` órfão sem repescagem, ACCS005R gera
   XML UTF-8 (hoje não é enviado a lugar nenhum; corrigir se um dia for).
6. GOTCHA rede: VPN Viscosity em full-tunnel intermitente engole AWS + `.internal`
   (google passa). Diagnóstico: `route -n get <ip>` mostrando `utun10`.
