# Fase 1 (higiene de código) — deploy em HML

Data: 2026-07-08. Executado a partir de `origin/main` = `3d818aa3`. As imagens da Fase 1 foram
construídas, deployadas no ECS HML (`monetarie-greenfield-homolog`) e as migrations aplicadas.
Backup do banco feito antes. Validação por rollout ECS + saúde do target group ALB. A validação
por screenshot (regra #11) fica pendente da VPN (desconectada nesta execução).

## Imagens construídas e deployadas (tag `homolog-3d818aa3-20260708`, arm64)

| Serviço | Task-def nova | Anterior (rollback) | Digest da imagem |
|---|---|---|---|
| core-api | `monetarie-core-api-homolog:89` | `:88` | `sha256:e84770f1…` |
| pix-api (cabine, 1.10a) | `monetarie-pix-api-homolog:127` | `:126` | tag `homolog-3d818aa3-20260708` |
| core-admin-ui | `monetarie-core-admin-ui-homolog:13` | `:12` | `sha256:456d67b3…` |
| core-banking-ui | `monetarie-core-banking-ui-homolog:26` | `:25` | tag `homolog-3d818aa3-20260708` |
| core-merchant-ui | `monetarie-core-merchant-ui-homolog:16` | `:15` | tag `homolog-3d818aa3-20260708` |

Não redeployado: **pix-admin-ui** (`:34` mantido) — a única mudança da Fase 1 em `pix/frontend/admin`
foi um comentário, sem alteração funcional. **SPB** (spb-api, spb-admin-ui) fora do escopo desta
subida (frente separada). Método de registro: `describe-task-definition` -> troca só a imagem ->
`register-task-definition`, preservando env/secrets/networking.

## Sequência executada (segura, sem quebra de skew)

1. Baseline de rollback capturado (revisões e digests atuais).
2. **Snapshot manual do Aurora HML** `monetarie-core-homolog-45-pre-fase1-20260708` = `available`
   (backup antes da migration lossy).
3. Build+push das 5 imagens arm64 para o ECR, confirmadas por digest.
4. Deploy dos 5 serviços (novas task-defs). Todos os fronts subiram novos ao mesmo tempo — o código
   novo funciona contra o DB não-migrado (dual-emission + normalização RBAC no boundary), então não
   houve janela de quebra de RBAC para a UI antiga.
5. `ecs wait services-stable` -> os 5 COMPLETED, running=desired=1; tasks rodando confirmadas na
   imagem nova por tag.
6. **Migrations via task one-off** (`monetarie-core-api-homolog:89`,
   `bin/monetarie eval Monetarie.Release.migrate()`, launch-type EC2, exit 0). Logs provam as 3:
   - `20260707190000` RenameRbacCoopFeaturesToClients: ANTES features legadas=11/clients=0/módulos
     legados=2 -> DEPOIS legadas=0/clients=8/módulos legados=0 (rename + OR-merge de grants + remoção
     de sobras/fates).
   - `20260707190100` NullConselheiroRoleOnUserEntities: 0 usuários afetados (nenhum `conselheiro`
     em HML, esperado).
   - `20260708100000` CreateTreasuryReconciliationSnapshots: tabela + índice criados.

## Validação (o que foi provado sem VPN)

- Os 5 serviços: rollout `COMPLETED`, running=desired=1, **target group ALB `healthy`** (o
  health-check interno do ALB bate o `/health` de cada container e passou — prova que os apps sobem
  e servem).
- Logs recentes de core-api e pix-api sem erro de boot/crash (só trabalho de fundo normal:
  CacheWarmer "0 errors", PixStatusRecon "errors: 0").
- Migrations aplicadas com evidência de log (acima).

## Pendente: validação por screenshot (regra #11)

A captura de telas exige VPN ativa (hosts `*-h.monetarie.internal` só resolvem via VPN, que estava
**desconectada** nesta execução — `coreapi-h /health` deu HTTP 000 do Mac). Passo a executar quando
a VPN subir (ou o dono conecta):

```
# com a VPN ativa:
CORE_PASSWORD=$(awsmon secretsmanager get-secret-value --secret-id monetarie/homolog/admin/core/initial_password --query SecretString --output text)
PIX_PASSWORD=$(awsmon secretsmanager get-secret-value --secret-id monetarie/homolog/admin/pix/initial_password --query SecretString --output text)
SPB_PASSWORD=$(awsmon secretsmanager get-secret-value --secret-id monetarie/homolog/admin/spb/initial_password --query SecretString --output text)
EVIDENCE_DIR="$HOME/Desktop/monetarie-evidencias-aws-homolog-2026-06-21" \
CORE_URL='http://coreadmin-h.monetarie.internal' PIX_URL='http://pixadmin-h.monetarie.internal' SPB_URL='http://spbadmin-h.monetarie.internal' \
CORE_LOGIN='admin@monetarie.com.br' PIX_LOGIN='admin@monetarie.com.br' SPB_LOGIN='admin@monetarie.com.br' \
CORE_PASSWORD="$CORE_PASSWORD" PIX_PASSWORD="$PIX_PASSWORD" SPB_PASSWORD="$SPB_PASSWORD" \
SYSTEMS='core,pix' node scripts/codex_capture_core_pix_spb.cjs
```

Focar as telas que a Fase 1 mexeu: Tesouraria (Caixa Institucional, Conciliação real, Conta de
Liquidação), MgmtQuery (Consulta de Operação via cabine), menus (dedup Administradores), relatórios
de clientes, e conferir que não há vocabulário coop/OnZ visível.

## Rollback (se necessário)

```
awsmon ecs update-service --cluster monetarie-greenfield-homolog --service <svc> --task-definition <familia>:<rev-antiga>
# core-api:88  pix-api:126  core-admin-ui:12  core-banking-ui:25  core-merchant-ui:15
```
As migrations não têm down reversível (RBAC OR-merge e conselheiro->NULL são lossy); restauração de
dados = restore do snapshot `monetarie-core-homolog-45-pre-fase1-20260708`. O código novo, porém, é
compatível com o schema antigo e novo (dual-emission + normalização), então um rollback só de código
não exige reverter as migrations.

## Pendências pré-produção (do relatório de validação, não bloqueiam HML)

- Provisionar `SPI:create` para o principal `PIX_CABIN_ADMIN_LOGIN` (senão MgmtQuery = `cabin_forbidden`).
- Confirmar a caixa `regulatorio@monetarie.com.br` do CADOC 1201.
- Itens de decisão do dono (namespace `Cooperative.*`, sinal despesa DRE) e follow-ups técnicos:
  ver `docs/reports/2026-07-08-fase1-validacao-prontidao-deploy.md`.
