# Fase 1 (higiene de código) da subida para produção — FECHAMENTO

Data: 2026-07-08. `origin/main` = `2c508227`. Todas as 11 ondas da Fase 1 do plano
`docs/plans/2026-07-07-subida-producao-monetarie-plano.md` estão implementadas, revisadas
(dupla revisão por onda; workflow adversarial de 5 lentes na onda money-path mais pesada) e
integradas em `main`. Nada foi deployado — a Fase 1 valida em HML; as imagens são promovidas
por digest para produção depois (Fase 6, bloqueada pelos gates).

## O que foi entregue (por onda)

Higiene coop -> SCD (o Core admin foi portado de um modelo de cooperativa de crédito; a
Monetarie é uma Sociedade de Crédito Direto):
- **1.1** i18n/labels (`9bdb5a0d`, sessão anterior).
- **1.2** types/store: `CooperativeRole`->`StaffRole`, remoção de `conselheiro`, `staff_role`
  normalizado no boundary com fallback ao legado, segregação ato-cooperativo removida de
  `types/accounting.ts`.
- **1.3** rotas + RBAC front: rotas coop removidas/redirecionadas, chaves RBAC `cooperados.*`/
  `cooperativa.*` -> `clients.*` normalizadas no boundary (login/`/me`/reidratação), catálogo de
  relatórios renomeado, `top_capital` removido.
- **1.4** remoção da subárvore órfã `views/cooperative/*` (66 arquivos, −14.876 linhas); fonte do
  nome institucional desacoplada de "branches" para `config/institution.ts`; catch informativo
  "Recurso não aplicável à SCD".
- **1.5** backend + alias (MONEY-PATH): segregação ato-cooperativo removida do COSIF, motor de
  sobras + conselho fiscal + papel `conselheiro` removidos, aliases `/clients/*` para os
  consumidores vivos de `/cooperative/*`, dual-emission `staff_role`+`cooperative_role` /
  `clientes_ativos`+`cooperados_ativos` para deploy skew, 2 migrations (rename de permissões,
  `conselheiro`->NULL). Verificado por workflow adversarial de 5 lentes: **SHIP-WITH-FOLLOWUPS**,
  invariante do balancete provado centavo-idêntico, money-path guard com diff vazio nos arquivos
  proibidos.
- **1.6** varredura final + colapso do split 80/20 do DRE. No caminho, corrigiu uma classe de bug
  money-path real: `SUM(bigint)` retorna `Decimal`, e a aritmética com `-` do Kernel dava
  `ArithmeticError` -> HTTP 500 em `income_statement`, `balance_sheet`, `trial_balance` e
  **CADOC 4010** (arquivo regulatório BACEN). Coeridos via `to_centavos/1` (exato, preserva ao
  centavo), com testes semeados red-first.

Remoção OnZ/AvivPay (o Core foi portado de um produto que sentava sobre o provedor PIX externo
OnZ/CloudPIX; a Monetarie tem cabine PIX própria):
- **1.7** remoções mecânicas: chaves i18n mortas, docstrings, e-mail regulatório, branding ->
  Monetarie. Prova por AST de que os 10 módulos money-path ficaram código-idênticos (só
  docstrings). Corrigiu erro de 10x na unidade documentada (`money_boundary`/`money_unit`:
  "centésimos" e não "milésimos" de centavo).
- **1.8** `CaixaAvivView` -> `CaixaInstitucionalView` (é a Caixa Institucional que segrega receita
  de tarifas PIX, não integração OnZ); operador hardcoded com PII da AvivPay removido; relabels de
  tesouraria/MGMT.
- **1.9** reconciliação REAL de tesouraria contra a nossa cabine PIX (MONEY-PATH), substituindo os
  stubs que respondiam sempre "sem diferenças". Read-only, `MoneyUnit` no boundary, fail-closed
  (`unavailable`, nunca `[]`-fabricado), teste de divergência conhecida. Snapshot com retenção de
  90 dias; GET read-only, run só no refresh explícito.
- **1.10** MgmtQuery real: cabine (`381dd9cc`) expõe `POST /api/v1/operations/query` (camt.060
  detalha-lancto -> camt.054 correlacionada, parser fiel ao XSD SPI 1.15, mecanismo de correlação
  reusado); Core (`e7bd449f`) repontou `pix_mgmt_query` para consumir esse endpoint, mapeia
  camt.054 -> `MgmtFormatted`, faz merge com os pacs locais, fail-closed. A revisão pegou uma race
  escondida pelos testes (correlate-before-insert) e um buraco de fail-closed (`CaseClauseError`),
  ambos corrigidos.
- **1.11** dedup de menus (Administradores vs Usuários Admin consolidados com redirect) +
  confirmação de que os rótulos de ambiente já são env-driven.

Extra do fechamento: **`es.ts` órfão removido** (`2c508227`) — locale não registrado no
`i18n/index.ts`, sem importadores, que carregava 34 strings mortas do provedor legado + ISPB
errado. Eliminado o resíduo.

## Validação do main integrado (2026-07-08)

- 3 merges (`wave-16-sweep`, `wave-110-core`, `wave-111-menus`) sem conflito (conjuntos de
  arquivos disjuntos). Merge anterior das trilhas OnZ + coop em `router.ex` reconciliado (pipelines
  `staff_*` + rotas `/clients` + `/treasury/caixa-institucional`), provado por grep + compile +
  `route_info`.
- `mix compile` exit 0; front admin `build` verde; front admin `test:run` 315/315; suítes-alvo
  backend das ondas integradas 35/35 em PG efêmero.
- Menções `onz/aviv` vivas restantes = 9, todas intencionais: 4 rotas alias `/treasury/caixa-aviv/*`
  (compat, remover pós-validação HML) + 5 docstrings/comentários de proveniência que descrevem a
  remoção.

## Itens que precisam de DECISÃO SUA (não bloqueiam a Fase 1, entram no roadmap)

1. **Namespace de domínio backend `Monetarie.Schemas.Cooperative.*` / `UseCases.Cooperative.*`**
   (~1325 hits em `core/backend/lib`) segue com nome cooperativo. As ondas 1.1-1.6 miraram front +
   COSIF/aliases/staff_role; renomear o namespace de domínio é um refactor grande separado (com
   migrations de tabela). Decidir se e quando.
2. **Sinal da despesa no DRE**: hoje `gross_result` = 130k para receita 100k / despesa 30k, porque
   o saldo de despesa é armazenado negativo (`c - d`). Convenção pré-existente, não tocada. O
   líquido econômico seria 70k. Precisa de revisão contábil — pode afetar expectativa do CADOC.

## PRÉ-DEPLOY (checklist antes de promover imagens para produção)

- **Backup do banco antes das 2 migrations da onda 1.5**: os `down` são no-op; o OR-merge de grants
  e o `conselheiro`->NULL são lossy por design. Rodar via `rpc` (não `eval`).
- **Provisionamento SPI:create**: o endpoint de consulta de operação da cabine exige a permissão
  SPI `:create`; o principal `PIX_CABIN_ADMIN_LOGIN` que o Core usa precisa tê-la, senão a MgmtQuery
  retorna `cabin_forbidden` (tratado com honestidade, mas a consulta não funciona). Confirmar vivo.
- **E-mail regulatório CADOC 1201**: default trocado para `regulatorio@monetarie.com.br` (é
  config-com-default: `metadata` -> env `CADOC1201_RESP_EMAIL` -> default). Confirmar que a caixa
  existe (ou setar o override) antes da 1ª transmissão. Os defaults irmãos são placeholders
  (`resp_telefone`/`resp_nome`) — setar valores reais em prod.
- **Drift de saldo informativo na reconciliação (onda 1.9)**: o status é decidido só pelo nível de
  transação; o drift de saldo Conta PI × razão é `informativo` e não vira o status (por decisão do
  dono 2 — nunca é zero num SCD real por itens de custódia não modelados). Ciência.

## Follow-ups técnicos (higiene, fora deste mandato)

- **CADOC 4111 em `Regulatory.Cosif.Cadoc4111` + `AccountingReports.generate_cadoc_4111`**:
  dead code E pré-quebrado (query seleciona colunas `j.cosif_account`/`j.entry_type` que não existem
  em `cosif_journal_entries`; levanta erro de coluna antes de qualquer cálculo; não está roteado — a
  submissão viva usa `Monetarie.UseCases.Cadoc.Generator4111`). Corrigir as colunas ou deletar o
  wrapper morto.
- **Saúde da suíte backend**: o suite completo está ~807 falhas em banco efêmero limpo no próprio
  `origin/main` (constraint `users_tax_id_alfa_chk` no setup de teste + testes obsoletos
  referenciando funções removidas). Pré-existente/ambiental — as revisões usaram delta antes/depois
  (807->807 zero-delta prova zero regressão). Vale uma frente de higiene da suíte.
- **Bug de fixture `RepasseServiceTest.marcar_inadimplente`**: usa `System.unique_integer` para
  montar CPF que ocasionalmente vira 12 chars e viola check constraint; não-determinístico,
  independente das ondas.
- **`serialize_transaction_basic` / drift `webhooks.account_id`**: itens menores anotados nas
  revisões.
- **Remover os shims de compat pós-validação HML**: dual-emission de vocabulário legado
  (`cooperative_role`/`cooperative_permissions`/`cooperados_ativos`), fallback `staff_role`,
  normalização RBAC, `afterHydrate`, aliases `/cooperative/*` e `/treasury/caixa-aviv/*`. Todos
  marcados no código; removê-los depois que a UI nova estiver promovida e o BACEN validado.
- **SPB "Exportações"**: 5 itens de menu apontam para uma rota só (precisa de wiring `?tab=`).

## Próximo passo

Fase 2 (trilhas de auditoria nos 3 fronts) ou seguir para as fases de infra/bootstrap/cripto
conforme a sessão paralela de infra (Fase 3 + 0.2/0.3) avançar. A Fase 0 (spike PKCS#11 do HSM prod
+ acessos de rede 10.50) segue bloqueante do go-live PIX na Fase 6.
