# RESUME — Alinhamento SCD do fluxo vivo + replay da migração + saldo devedor

> Handoff para continuar numa próxima sessão. Plano aprovado: `~/.claude/plans/swirling-seeking-sketch.md`. Fonte de verdade COSIF: `docs/cosif/Plano_de_Contas_Interno_SCD_v2.md` (no repo). Dono: cético, "ache nosso defeito, prove empírico, NÃO assuma". Estilo pt-br humano, SEM travessão de IA.

## Por que esta sessão existe (correções do dono)
1. Eu pus 2 contas com saldo negativo em quarentena dizendo "SCD não pode ter negativo" — FALSO (foi limitação do flag `debits_must_not_exceed_credits: true`). SCD é instituição de crédito; saldo devedor é crédito (ativo COSIF 1.6.x).
2. Eu disse que indicadores do painel são "fora do escopo da migração" — suposição. Verdade em `dashboard/aggregator.ex:549` (pix_in/out/boletos hardcoded 0 com TODO; transactions_today lê a tabela `transactions` real; meds na cabine PIX; Basileia depende de capital).
3. Dono expandiu o escopo: **(a)** popular TODAS as transações do backup na tabela `transactions`; **(b)** seguir o FLUXO REAL do sistema à risca; **(c)** alinhar TODO o fluxo vivo à SCD e DEPOIS fazer o replay; **(d)** os "fora de escopo" (guards de pagamento, cheque especial) entram no escopo.

## DEFEITO central (provado) que estamos consertando
O fluxo vivo posta o saldo do cliente em **"Depósitos à Vista"** (Cosif.Mapper: 2.1.1.10.00-9; AccountingBridge/account.cosif_account_code: 4.1.1.10.01.01-001) — **ilegal para SCD** (Res. CMN 4.656/2018, Plano v2 §1 e §7: "4.1 Depósitos VEDADO"). O correto é conta de pagamento 4.9.8.

## Mapa COSIF alvo SCD (todas as contas JÁ existem vivas no cosif_accounts)
| Papel | Código SCD |
|---|---|
| Conta do cliente (conta de pagamento) | `4.9.8.10.01.10.002` |
| Disponibilidades / caixa | `1.1.2.10.01.10.001` |
| Em trânsito / liquidação (ativo) | `1.8.4.10.01.10.001` |
| Valores a pagar - liquidação | `4.9.6.10.01.10.001` |
| Receita de tarifas | `7.1.7.10.01.10.001` |
| IOF a recolher | `4.9.1.10.02.10.001` (crédito) / `.002` (adicional 0,38%) |
| Juros / rendas de crédito (receita) | `7.1.1.10.01.10.213` |
| Saldo devedor / crédito (ativo) | `1.6.1.20.10.10.213` (Crédito Pessoal); cheque especial `1.6.1.20.01.10.213` |
| Capital social | `6.1.1.10.28.01.001` (país) / `.002` (exterior) |
> NÃO inventar dígito de controle (`bacen_account`) — vem do elenco oficial BCB (Plano v2 §15.3).

## Estado do trabalho

**Worktree:** `~/.config/superpowers/worktrees/monetarie/scd-alignment` · branch `fix/scd-flow-alignment` · base `origin/main = 8ad58415` · HEAD da branch = ver `git log`.

**FEITO (Fase 1, parcial) — commitado:**
- `core/backend/lib/monetarie/use_cases/cosif/mapper.ex`: `@tb_to_cosif` + `@transfer_to_cosif` (códigos 1-9, 100-101, 401-406, 600) → SCD (cliente 4.9.8, caixa 1.1.2, tarifas 7.1.7.10.01.10.001, em trânsito 1.8.4, capital 6.1.1.10.28.01). Códigos cooperativos 605-712 (quotas/FATES/sobras Lei 5.764) ficaram como legado morto (SCD é S.A.).
- `core/backend/lib/monetarie/schemas/relational/account.ex`: default `cosif_account_code` → `4.9.8.10.01.10.002`; `@allowed_cosif_prefixes` aceita `4.9.8.` (+ 4.1.1/4.1.9 legado).
- `core/backend/lib/monetarie/use_cases/accounts/accounting_bridge.ex`: `@mon_fallback_code`/`@caixa_code`/`@receita_tarifas_code`/`@iof_*` → SCD.
- `docs/cosif/Plano_de_Contas_Interno_SCD_v2.md` adicionado (referência).
- Compila por AST. NÃO buildado/deployado ainda.

## O QUE FALTA (por fase)

### Fase 1 (resto)
- `accounting_bridge.ex` categoria **`interest`**: hoje D "Despesas Depósitos" (8.1.1) / C cliente = conceito de banco/cooperativa. Numa SCD, juros cobrado do cliente é **receita 7.1.1.10.01.10.213**. Remodelar o par D/C da categoria interest (e revisar `capital`/`loan_payment`).
- Atualizar a moduledoc/tabela do Mapper (cosmético) e os **testes** de mapper.ex e accounting_bridge.ex (asserts dos códigos antigos vão quebrar — atualizar para SCD).
- Conferir o `Cosif.get_account_by_code` acha os códigos novos (formato 7-segmentos vivo). As 1.604 contas vivas têm `cosif_account_code = 4.1.1.10.01.01-001`; a re-migração recria com 4.9.8 (não precisa migrar as antigas se a Fase 3 reseta).

### Fase 2 — saldo devedor / overdraft (reusar infra existente)
- `wallet.ex`: `@liability_account_flags` → `debits_must_not_exceed_credits: false`; `get_balance/1` typespec `non_neg_integer()` → `integer()`.
- `transaction_pipeline.ex` `stage_balance_check`: desacoplar do flag — exigir `disponível >= total - limite` (limite via `Overdraft.get_active_facility_for_account`, default 0). Centralizar em `payments/balance_guard.ex` (`verify_with_overdraft/3`).
- 6 guards `check_balance` (v2/transfer, v2/pix, partner_v1/transfers, partner_v1/pix, pix_automatico, transaction_pipeline) → usar o helper. `judicial/processor.ex:1518` ajustar bloqueio p/ saldo devedor.
- Infra a REUSAR (já existe, NÃO reescrever): `credit/adiantamento_trigger.ex` (dispara em account_entry confirmado; pos→neg cria ADEP/Cheque Especial + COSIF), `accounts/overdraft_journal.ex`, `accounts/overdraft.ex` (OverdraftFacility limite), seed `033_overdraft_cosif_accounts.exs`.

### Fase 3 — migração = replay pelo fluxo real (popula `transactions`)
- Reescrever `etl/autbank/remigrate.ex`: por movimento (ordem conta, posted_at) dirigir o caminho REAL settled (molde `infra/nats/handlers/pix_handler.ex:296` `handle_transaction_ledger`): `PaymentTransactions.create` (transactions, kind 1/2/3/5/6/8, status accepted, direction, started_at/completed_at retroativos) + `Wallet.deposit/withdraw` + criar `account_entry` pela função canônica que dispara AccountingBridge (COSIF) + AdiantamentoTrigger (devedor→ativo). SEM publicar NATS.
- Abertura de saldo por conta como transação; 2 devedoras (JET PRIVE -8,02 / INSTITUTO G TECH NANO -6,23, ambas PJ, sem histórico) viram saldo devedor (ADEP ativo).
- Criar partições históricas de `transactions` 2024-07..2026-06 (só existem 2026-01+): `PartitionMaintenance.create_partition_if_not_exists("transactions", ano, mes)`.
- `reset_entity!`: incluir `TRUNCATE transactions` + limpar `overdraft_facilities`/loans de adiantamento + as 215 transações vivas de teste.
- Total alvo **R$ 961.178,02** (inclui as 2 devedoras), **0 quarentena**, 1.606 contas. COSIF do fluxo real, não do EventMap próprio.
- **Compute:** 258.959 transações pelo fluxo completo é PESADO p/ 0,5 vCPU/1 GB. Rodar como task one-off dedicada com mais CPU (instâncias EC2 cap 1846 MB; escalar ASG ou task com reserva maior), async + checkpoint.
- `monbank_tmp` (backup restaurado LOCAL em pg 5432, user monetarie/MonetarieDB@2026) tem as 4 tabelas pra inspeção. A origem viva `autbank_src` FOI DROPADA — recarregar do `~/Desktop/monbank_backup_2026-06-26.sql` (caminho S3→load do handoff anterior) antes do replay.

### Fase 4 — relatório + evidências
- Reescrever pendências (devedores como saldo devedor/ADEP ativo; indicadores com a verdade) e regenerar PDF (`scripts/etl_remigration_report.cjs`). Re-capturar prints (painel 961.178,02; balancete com ativo 1.6.x; razão; extrato devedor -6,23/-8,02; uma transação no detalhe).

## Acessos / gotchas
- `awsmon() { env -u AWS_ACCESS_KEY_ID -u AWS_SECRET_ACCESS_KEY -u AWS_SESSION_TOKEN AWS_PROFILE=vulcimonetarie AWS_REGION=sa-east-1 aws "$@"; }`
- DB vivo via ECS exec na task core-api (tem psql/bin/monetarie; sem aws cli): `TASK=$(awsmon ecs list-tasks --cluster monetarie-greenfield-homolog --service-name core-api --query "taskArns[0]" --output text|sed 's#.*/##'); B64=$(base64<script.sh|tr -d '\n'); awsmon ecs execute-command --cluster monetarie-greenfield-homolog --task $TASK --container core-api --interactive --command "/bin/sh -c \"echo $B64|base64 -d|sh\""`. Dentro: `PGURL=$(printf '%s' "$DATABASE_URL"|sed 's#^ecto://#postgresql://#'); psql "$PGURL" -c "..."`.
- core-api vivo = task-def **:43** (img homolog do outro merge). Build ARM64: `docker buildx --builder coreproviders-mk-builder --platform linux/arm64 -f core/backend/Dockerfile -t 990933657879.dkr.ecr.sa-east-1.amazonaws.com/monetarie/core-api:homolog-<sha> --push core/backend`. OrbStack precisa estar de pé (`open -a OrbStack`). Migração roda async via spawn+/tmp/out (a task que serve pode reciclar). `ALLOW_ENTITY_RESET=true` via `System.put_env` no rpc.
- A sessão PIX trabalha nas cabines (mon_pix/mon_spb), disjunto — pode seguir sem coordenar (confirmado pelo dono).

## RETOMAR — colar na próxima sessão
```
Retomar SCD flow alignment + replay. Leia NA ORDEM: (1) docs/handoff/2026-06-27-scd-flow-alignment-RESUME.md no worktree ~/.config/superpowers/worktrees/monetarie/scd-alignment (branch fix/scd-flow-alignment); (2) ~/.claude/plans/swirling-seeking-sketch.md; (3) docs/cosif/Plano_de_Contas_Interno_SCD_v2.md. Fase 1 (Mapper+account.ex+accounting_bridge consts) FEITA e commitada. Continue: terminar Fase 1 (categoria interest do accounting_bridge + testes), Fase 2 (wallet flag=false + overdraft nos guards reusando AdiantamentoTrigger), Fase 3 (reescrever remigrate.ex como replay pelo fluxo real populando transactions, recarregar autbank_src, partições históricas, rodar, total 961.178,02 com 2 devedoras como ativo 1.6.x), Fase 4 (relatorio+prints). Tudo na AWS conta 990933657879 profile vulcimonetarie, nada no Mac. NAO inventar (dono cetico, prove empirico). Anote cada etapa vencida.
```
</content>
