# Handoff de DEPLOY — SISBAJUD automático + CCS + adoção da UI Vue do STA (2026-07-20)

**Para:** Luiz / Micael (deploy HML + PROD)
**De:** sessão Eduardo 2026-07-20 (auditoria STA + recuperação + fixes + adoção UI Vue)
**Relatório-base:** `docs/reports/2026-07-20-auditoria-sta-prod-sisbajud-ccs.md` (contexto completo, provas e finding de segurança)

---

## 0. Resumo em 5 linhas

1. **PROD nunca processou uma ordem judicial**: os AJUD301 chegam ZIPADOS da cabine STA e o Core os descartava. As 13 ordens represadas (15-17/07) foram **recuperadas e respondidas ao CNJ manualmente em 20/07** (protocolos 435087162/435087274/435111947). O fix torna a ingestão automática.
2. **CCS**: rejeições ECCS0003 de 17-19/07 corrigidas (numeração por dia de movimento + ACCS002 órfão persistido) — **1 migration nova**.
3. **UI do STA**: `sta/frontend` (Vue) substitui `sta/admin-portal` (React) como `sta-admin-ui`. Mesmo endpoint/contrato; deploy muda **apenas o diretório de build**.
4. **sta-api (cabine)** ganhou 2 endpoints ajustados que a UI nova usa (download de protocolos + filtro do timeline).
5. Ordem de deploy importa (abaixo). Nenhuma env nova; 1 migration no Core; 1 env a **conferir/criar em HML** no sta-admin-ui.

---

## 1. Commits do pacote (branch `feat/monetarie_improviments`)

### Já na origin (pushados em 20/07)
| Commit | Serviço | O quê |
|---|---|---|
| `3127f456` | core-api | **Ingestão SISBAJUD via STA descompacta ZIP + Latin-1→UTF-8 por campo** (a causa-raiz das ordens nunca aparecerem). Idempotente por conteúdo descompactado — replay não duplica o que foi subido manualmente hoje |
| `708dfcbc` | — | merge da main (297 commits das outras frentes) |
| `d2ac806e` | core-api | Varas.Sync em LOTES (o AJUD305 real tem 12.7k varas = 76k parâmetros; sem isso o primeiro 5305 pós-deploy estoura o teto de 65535 do Postgres) |
| `a88b178a` | core-api + **core-admin-ui** | Rótulo honesto da vara no detalhe da ordem (catálogo pendente × código ausente no catálogo do BCB) — **exige rebuild do core-admin-ui também** |
| `96ea7a07` | core-api | **CCS: numeração por dia de movimento + ACCS002 órfão persistido** — ⚠️ **migration `20260720210000_create_ccs_accs002_orphans`** |

### Locais (Eduardo autoriza o push antes do deploy)
| Commit | Serviço | O quê |
|---|---|---|
| `9752b30c` | **sta-api** | Download resolve `processed_protocols` (a lista da tela; inbound dava 404) + `/stats/activity` com filtro `?system=` e janelas incluindo a hora/dia corrente (off-by-one que zerava os gráficos) |
| `e8381873` | **sta-admin-ui** | Contrato de deploy da UI Vue: nginx template `${STA_API_HOST}` (idêntico ao contrato do React em PROD), /health desacoplado, index.html no-store, WS proxied, .dockerignore |
| `abb3da23` | **sta-admin-ui** | Pacote da UI Vue: aba Conteúdo real, download por blob, pt-BR completo (3 idiomas), Configuração carregando/salvando (2 bugs de contrato), rotas com CRUD, calendário, dados reais nos gráficos, modal Safari-proof, socket sem domínio legado |

---

## 2. Ordem de deploy (HML → validar → PROD, mesmo digest, padrão da casa)

### Passo 1 — core-api (+ core-admin-ui)
- Build/deploy padrão do `core/backend` e do `core/apps/admin`.
- **Migration** (única, aditiva, idempotente): `20260720210000_create_ccs_accs002_orphans` — aplicar via **rpc** (receita padrão da casa; NUNCA `eval` no Core):
  `bin/monetarie rpc 'Ecto.Migrator.with_repo(Monetarie.Repo, &Ecto.Migrator.run(&1, :up, all: true))'` (ou o caminho de migration one-off usual).
- Sem env nova. Sem mudança nas cabines pix/spb. **Regra da casa continua valendo: não deployar pix/spb com o dono operando money-path** — este pacote não toca nelas.

### Passo 2 — sta-api (cabine STA)
- Build/deploy padrão do `sta/backend`. Sem migration, sem env nova.
- Precisa ir **antes** do sta-admin-ui: a UI nova consome o download de protocolos e o filtro do timeline.

### Passo 3 — sta-admin-ui (a troca React → Vue)
- **Única mudança de build: o diretório.** Onde o pipeline hoje builda `sta/admin-portal/`, buildar **`sta/frontend/`** (Dockerfile próprio já pronto em `sta/frontend/Dockerfile`).
- **PROD: task-def NÃO muda** — a `:8` atual já tem `STA_API_HOST=staapi.monetarie.internal`, porta 8080, health `/health`; a imagem Vue consome exatamente o mesmo contrato (validado vivo com essa env).
- **HML: ATENÇÃO — a task-def `:6` está com env VAZIA** (o React de lá é imagem antiga em tag mutável `homolog-latest`, anterior ao template de 15/07). Para a Vue (e para o próprio React novo) funcionar em HML: **nova revisão da task-def com `STA_API_HOST=staapi-h.monetarie.internal`** e tag imutável (padrão da casa: `homolog-<sha>-<data>`).
- Rollback: anotar as revisões correntes no momento do deploy (em 20/07: PROD sta-admin-ui `:8`, sta-api `:15`, core-api `:76`; conferir na hora — outras frentes avançam).

---

## 3. A pergunta-chave: as ordens judiciais passam a aparecer SOZINHAS no Core?

**SIM — após o Passo 1 (core-api), a ingestão fica 100% automática.** O fluxo pós-deploy:

1. CNJ/BACEN disponibiliza o AJUD301 → cabine STA baixa (poller, ciclo 60s) → publica `monetarie.sta.file.received` com o conteúdo (ZIP) no NATS — **isso já funcionava**.
2. Core consome → enfileira `SisbajudStaIngestWorker` (Oban durável, retry 10x) — **já funcionava**.
3. **[NOVO]** `Sisbajud.ingest` descompacta o ZIP, corrige o encoding Latin-1 e classifica `5301` → **processa as ordens (congela os valores no TigerBeetle)** e **gera o 5302** — era aqui que tudo morria (classificava o ZIP como "unknown" e descartava).
4. As ordens **aparecem na tela SISBAJUD automaticamente**, com os bloqueios executados.
5. **O ENVIO do 5302 ao CNJ continua MANUAL** (botão na tela, operador revisa antes) — decisão do dono de 14/07. Existe a flag `SISBAJUD_AUTO_SEND_ENABLED` (default OFF) para tornar o envio automático também, quando o dono decidir.

De brinde, também automáticos após o deploy: AJUD305 (sincroniza o catálogo de varas — o "Não catalogada (5305 pendente)" da tela resolve sozinho no próximo 5305, que o BCB manda ~diariamente às ~22:2x BRT), AJUD303/304/331 (validações consumidas), AJUD308 (requisições).

**O upload manual de hoje foi só a recuperação do represado** — não é o fluxo. E é seguro conviver com o automático: a idempotência é por conteúdo e por identidade da ordem (reapresentação re-emite a resposta, nunca re-congela).

## 4. Validação pós-deploy (checklist)

**Core (SISBAJUD/CCS):**
- [ ] Migration aplicada: tabela `ccs_accs002_orphans` existe (`\dt` via rpc/psql).
- [ ] No próximo AJUD305 (~22:2x BRT): log `[SisbajudStaIngest] arquivo de varas 5305 sincronizado → 12xxx vara(s)` e o detalhe da ordem mostra o NOME da vara (quando o código constar no catálogo do BCB).
- [ ] No próximo AJUD301 real: log `remessa ingerida via STA → RegulatoryFile`, ordens NA TELA sem upload, 5302 `generated` aguardando o botão do operador.
- [ ] CCS: job de terça 01:00 BRT envia `202607220001` e confirma; no fim de semana o log passa a mostrar `não é dia útil — skip` (sáb/dom) e a segunda consolida sex+sáb+dom.
- [ ] Ordens de 15-17/07 já respondidas: NÃO reprocessar (já estão no banco; replay é idempotente de toda forma).

**STA admin (UI Vue):**
- [ ] Login → Dashboard com card "Informações do Sistema" (Ambiente = Produção).
- [ ] Arquivos: lista real, olho → aba Conteúdo renderiza, Baixar salva com nome certo, filtros de data e sistema funcionam.
- [ ] Configuração: carrega (antes NUNCA carregava), Salvar responde sucesso, Rotas com editar/adicionar.
- [ ] Pill "Conectado" verde (WebSocket via nginx `/socket`).

## 5. O que NÃO muda / riscos conhecidos

- **Nenhuma env nova** em nenhum serviço (exceto criar `STA_API_HOST` na task-def de HML do sta-admin-ui, que estava faltando até para o React).
- **Rotas/Configuração do STA**: PROD tem `config_overrides` = 0 → a UI Vue mostra exatamente o que o React mostra hoje (mesmos defaults do backend). Os 3 cards extras do React (API de Saída/Admin/Armazenamento) exibiam **defaults inventados no frontend**; na Vue só aparecem se o backend enviar as seções — nada real se perdeu (auditoria campo a campo no relatório).
- **Dados**: zero mudança de dados neste deploy além da migration aditiva. Os "arquivos de exemplo" e seeds citados no relatório existem SÓ no ambiente local do Eduardo.
- 🔴 **Finding de segurança para o time avaliar (NÃO bloqueia o deploy, é pré-existente):** `/api/v1/*` do sta_connector não tem autenticação (download/upload/delete + stats), acessível via proxy `/api` do nginx da UI. Mitigado pela rede interna, mas com download servindo conteúdo real (PII judicial) merece prioridade: token de serviço m2m + `SsoAuth` no escopo v1 (o core usa essa API para subir CCS — coordenar credencial).
- Follow-ups menores registrados no relatório: canais Phoenix da UI com join timeout (REST cobre tudo; só ruído de console), tela de "enviados" da cabine, notificações CCS sem destinatário configurado (`CCS_NOTIFICATION_EMAILS`).
