# Monetarie SPB - Deep System Analysis & Gap Report
## Data: 2026-02-08
## Status: 84 GAPS IDENTIFICADOS (8 CRITICOS, 24 ALTOS, 31 MEDIOS, 21 BAIXOS)

> **Metodologia**: Analise profunda automatizada com 4 agentes de investigacao paralelos:
> 1. Backend Resilience Audit (20 issues)
> 2. Frontend Completeness Audit (34 issues)
> 3. BACEN Protocol Compliance Audit (4 gaps)
> 4. Database Integrity Audit (35 issues)

---

## DEPLOYMENT STATUS (2026-02-08 ~21:00 UTC)

| Componente | Image Tag | Pods | Status |
|-----------|-----------|------|--------|
| spb-backend | `a2129fe` | 2 (+ Cloud SQL Proxy) | Running |
| spb-frontend | `6abfbba` | 2 | Running |
| spb-docs | latest | 1 | Running |
| spb-simulator | latest | 1 | Running |
| ibm-mq | `9.4.2.0-r1` | 1 | Running |

**Cloud Build `df41dfa0`**: SUCCESS (backend deployed with NATS JetStream + XMLDSig + BCMSG + FKs)

---

## ISSUES CRITICOS (8) — Requerem correcao ANTES de homologacao

### C1. Rate Limiting no Login
- **Area**: Backend / Seguranca
- **Arquivo**: `lib/bacen_gateway_web/controllers/auth_controller.ex`
- **Risco**: Sem rate limiting no endpoint `/api/auth/login`. Ataque brute-force pode descobrir senhas.
- **Solucao**: Implementar rate limiter via Plug (ex: `PlugAttack` ou rate limit custom com ETS/counter)

### C2. Health Check Incompleto
- **Area**: Backend / Observabilidade
- **Arquivo**: `lib/bacen_gateway_web/controllers/health_controller.ex`
- **Risco**: `/health` retorna OK sem verificar NATS JetStream, IBM MQ ou Cloud SQL. Pods podem ser considerados saudaveis mesmo com dependencias mortas.
- **Solucao**: Health check deve testar: `Repo.query("SELECT 1")`, NATS ping, MQ connection status

### C3. SQL Injection em Interpolacao Dinamica
- **Area**: Backend / Seguranca
- **Arquivo**: `lib/bacen_gateway_web/controllers/alcadas_controller.ex`
- **Risco**: Nomes de colunas interpolados diretamente em SQL sem sanitizacao. Atacante pode injetar SQL via parametros.
- **Solucao**: Whitelist de colunas permitidas; nunca interpolar input do usuario em SQL

### C4. Atom Table DOS via String.to_atom
- **Area**: Backend / Seguranca
- **Arquivos**: Multiplos controllers
- **Risco**: `String.to_atom()` chamado com input do usuario. Atoms nao sao garbage-collected — atacante pode esgotar a tabela de atoms e crashar a BEAM VM.
- **Solucao**: Substituir `String.to_atom` por `String.to_existing_atom` ou usar strings diretamente

### C5. Validacao de Horario BACEN Ausente
- **Area**: BACEN Protocol / Compliance
- **Arquivo**: `lib/bacen_gateway/lifecycle_engine.ex`, `lib/bacen_gateway_web/controllers/messages_controller.ex`
- **Risco**: Sistema permite envio de mensagens fora do horario de funcionamento do BACEN. Mensagens enviadas fora da grade horaria serao rejeitadas.
- **Solucao**: Consultar tabela `bacen_operating_schedule` antes de enviar. Bloquear envio fora da grade.

### C6. Certificados Placeholder Permitidos em Producao
- **Area**: BACEN Protocol / Seguranca
- **Arquivo**: `lib/bacen_gateway/crypto/signature_manager.ex`
- **Risco**: SignatureManager aceita certificados placeholder para assinatura. Em producao, mensagens BACEN com certificados invalidos serao rejeitadas.
- **Solucao**: Remover fallback para placeholder. Falhar explicitamente se certificado nao for carregado.

### C7. Token Refresh Nao Implementado
- **Area**: Frontend / Seguranca
- **Arquivo**: `frontend-vue/src/services/api.ts`
- **Risco**: JWT expira e usuario perde sessao sem aviso. Nao ha mecanismo de refresh token.
- **Solucao**: Implementar interceptor axios que detecta 401 e faz refresh automatico, ou redirect para login com mensagem.

### C8. Campos Schema Inexistentes
- **Area**: Database / Backend
- **Arquivos**: `lib/bacen_gateway/messages/bacen_message.ex`, controllers
- **Risco**: Queries referenciam campos `message_id`, `scheduled_at`, `priority` que nao existem na tabela `bacen_messages`. Causa erros 500 em runtime.
- **Solucao**: Alinhar schema Ecto com DDL real do banco. Remover campos inexistentes ou criar via migration.

---

## ISSUES ALTOS (24) — Corrigir antes de ir para producao

### H1. InboundConsumer Dispatch e Stub
- **Area**: Backend / BACEN Protocol
- **Arquivo**: `lib/bacen_gateway/consumers/inbound_consumer.ex`
- **Impacto**: Mensagens R0/R1/R2/R3/COA/COD recebidas do BACEN sao logadas mas NAO processadas. Lifecycle nao avanca.
- **Solucao**: Implementar dispatch real chamando LifecycleEngine.handle_r1/handle_coa/etc.

### H2. MQ Consumer Inativo
- **Area**: Backend / Infraestrutura
- **Arquivo**: `lib/bacen_gateway/mq/consumer.ex`
- **Impacto**: IBM MQ consumer existe no codigo mas nao esta ativamente consumindo das filas BACEN. Mensagens ficam na fila.
- **Solucao**: Ativar consumer na supervision tree. Conectar ao IBM MQ via AMQP/MQI.

### H3. COA/COD XML Parsing Incompleto
- **Area**: Backend / BACEN Protocol
- **Arquivo**: `lib/bacen_gateway/lifecycle_engine.ex`
- **Impacto**: handle_coa/handle_cod fazem update de status mas nao parseiam o XML recebido para extrair dados.
- **Solucao**: Usar BcmsgEnvelope.parse/1 para extrair dados do COA/COD antes de atualizar.

### H4. Sem Validacao de Input em Criacao de Mensagem
- **Area**: Backend / Seguranca
- **Arquivo**: `lib/bacen_gateway_web/controllers/messages_controller.ex`
- **Impacto**: Dados de mensagem BACEN aceitos sem validacao de campos obrigatorios, formatos, ou limites.
- **Solucao**: Validar campos obrigatorios, ISPBs validos, formatos de data, limites de valor.

### H5. SELECT sem LIMIT em Tabelas Grandes
- **Area**: Backend / Performance
- **Arquivos**: Multiplos controllers
- **Impacto**: Queries sem LIMIT em tabelas com 40K+ registros podem causar OOM ou timeout.
- **Solucao**: Sempre incluir LIMIT/OFFSET ou paginacao. Default max 1000.

### H6. 63 Instancias de `any` no TypeScript
- **Area**: Frontend / Qualidade
- **Arquivos**: Multiplos .vue e .ts
- **Impacto**: Tipos `any` perdem type-safety. Bugs passam despercebidos.
- **Solucao**: Substituir por tipos especificos ou `unknown` com type guards.

### H7. ProfileView Vazio
- **Area**: Frontend / Funcionalidade
- **Arquivo**: `frontend-vue/src/apps/admin/views/ProfileView.vue`
- **Impacto**: Pagina de perfil do usuario e placeholder TODO. Usuario nao consegue ver/editar seu perfil.
- **Solucao**: Implementar view com dados do usuario logado (nome, email, role, ultimo login).

### H8. NotFoundView Vazio
- **Area**: Frontend / UX
- **Arquivo**: `frontend-vue/src/apps/admin/views/NotFoundView.vue`
- **Impacto**: Pagina 404 e placeholder. Rotas invalidas mostram pagina em branco.
- **Solucao**: Implementar pagina 404 com navegacao de volta.

### H9. Sem Loading States nas Views Admin
- **Area**: Frontend / UX
- **Arquivo**: Multiplas views admin
- **Impacto**: Dados carregam sem indicacao visual. Usuario pode pensar que pagina esta quebrada.
- **Solucao**: Adicionar skeleton loaders ou spinners durante fetch.

### H10. Sem Error Boundary Components
- **Area**: Frontend / Resiliencia
- **Impacto**: Erro em um componente pode crashar toda a aplicacao Vue.
- **Solucao**: Implementar ErrorBoundary com `onErrorCaptured` lifecycle hook.

### H11. Sem Auto-Refresh em Views Criticas
- **Area**: Frontend / UX
- **Impacto**: Dashboard, filas, mensagens nao atualizam automaticamente. Operador ve dados stale.
- **Solucao**: Polling a cada 30s ou usar WebSocket (Phoenix Channel ja existe).

### H12. Campos Financeiros sem CHECK Constraint
- **Area**: Database / Integridade
- **Tabelas**: str_transfers.amount, payment_requests.amount, forex_operations.amount
- **Impacto**: Banco aceita valores negativos em campos que devem ser positivos.
- **Solucao**: `ALTER TABLE ADD CONSTRAINT chk_amount_positive CHECK (amount >= 0)`

### H13. Sem Trigger para updated_at
- **Area**: Database / Consistencia
- **Impacto**: Coluna `updated_at` nao e atualizada automaticamente. Depende do codigo da aplicacao.
- **Solucao**: Criar trigger `set_updated_at()` para todas as tabelas com `updated_at`.

### H14. bacen_messages.state sem ENUM/CHECK
- **Area**: Database / Integridade
- **Impacto**: Coluna `state` aceita qualquer string. Dados invalidos podem entrar.
- **Solucao**: `ALTER TABLE ADD CONSTRAINT chk_valid_state CHECK (state IN (...))`

### H15. Missing Partial Indexes
- **Area**: Database / Performance
- **Impacto**: Queries filtradas por status comuns (pending, processing) fazem full scan.
- **Solucao**: Partial indexes: `CREATE INDEX ... WHERE state = 'pending'`

### H16. COA/COD Day Opening/Closing Desconectado
- **Area**: BACEN Protocol
- **Impacto**: Abertura/fechamento do dia BACEN (GEN0014/0015/0017/0018) nao consulta grade horaria real.
- **Solucao**: Conectar CoaCodHandler ao bacen_operating_schedule.

### H17. Fluxo R2 Settlement Incompleto
- **Area**: BACEN Protocol
- **Impacto**: R2 (confirmacao de liquidacao) e parseado mas nao aciona settlement real em str_transfers.
- **Solucao**: Apos R2 ACCP, atualizar status de str_transfers para 'settled'.

### H18. Sem Request ID para Distributed Tracing
- **Area**: Backend / Observabilidade
- **Impacto**: Logs nao tem correlacao entre requests. Dificil rastrear problemas em producao.
- **Solucao**: Plug que gera X-Request-ID e propaga no Logger metadata.

### H19. WebSocket Auth Token Nao Validado em Reconexao
- **Area**: Backend / Seguranca
- **Impacto**: Token expirado pode manter conexao WebSocket ativa.
- **Solucao**: Verificar token em cada join/reconnect do Phoenix Channel.

### H20. Sem Handling de Offline/Reconexao
- **Area**: Frontend / Resiliencia
- **Impacto**: Se rede cai, usuario nao e notificado e dados ficam stale.
- **Solucao**: Detectar `navigator.onLine` e mostrar banner de desconexao.

### H21. Audit Logs sem IP Address
- **Area**: Database / Compliance
- **Tabela**: audit_logs
- **Impacto**: Sem IP de origem, auditoria BACEN fica incompleta.
- **Solucao**: Adicionar coluna `ip_address INET` e capturar `conn.remote_ip`.

### H22. Sem Particionamento de Tabela de Mensagens
- **Area**: Database / Performance
- **Tabela**: bacen_messages
- **Impacto**: Com 40K+ e crescendo, queries ficam lentas sem particionamento.
- **Solucao**: Particionar por `created_at` (mensal) quando volume justificar.

### H23. DLQ Entries sem Link para Mensagem Original
- **Area**: Database / Rastreabilidade
- **Tabela**: dlq_entries
- **Impacto**: Entries no DLQ nao referenciam a mensagem original que falhou.
- **Solucao**: Adicionar `original_message_id` com FK para bacen_messages.

### H24. Sem Monitoramento de Connection Pool
- **Area**: Database / Operacional
- **Impacto**: Pool de 500 conexoes sem metricas. Pode esgotar sem alertas.
- **Solucao**: Telemetry handler para Ecto pool metrics.

---

## ISSUES MEDIOS (31)

| # | Area | Issue |
|---|------|-------|
| M1 | Backend | Paginacao sem defaults seguros (page_size pode ser 999999) |
| M2 | Backend | Respostas de erro inconsistentes (mix de formatos) |
| M3 | Backend | Logs sem nivel estruturado (Logger.info com string concatenation) |
| M4 | Backend | Sem metricas Prometheus/Telemetry |
| M5 | Backend | CORS permite qualquer metodo HTTP |
| M6 | Backend | Sem timeout em queries SQL longas |
| M7 | Frontend | Acessibilidade (aria-labels ausentes) |
| M8 | Frontend | i18n incompleto (mix pt-BR/en) |
| M9 | Frontend | Sem dark mode |
| M10 | Frontend | Sem favicon customizado |
| M11 | Frontend | Tabelas sem ordenacao client-side |
| M12 | Frontend | Graficos sem fallback para dados vazios |
| M13 | Frontend | Forms sem validacao client-side |
| M14 | Frontend | Sem export CSV/Excel |
| M15 | Frontend | Sem breadcrumbs consistentes |
| M16 | Frontend | SessionStorge para tokens (deveria ser httpOnly cookie) |
| M17 | Frontend | Bundle size nao otimizado (sem code splitting) |
| M18 | Frontend | Sem service worker para cache |
| M19 | Frontend | Console.log residuais em codigo |
| M20 | Database | Sem comments em tabelas/colunas (documentacao) |
| M21 | Database | Inconsistencia timestamp: mix de `inserted_at` e `created_at` |
| M22 | Database | Sem pg_stat_statements para query analysis |
| M23 | Database | Index duplicados em algumas tabelas |
| M24 | Database | Sem vacuum/analyze agendado |
| M25 | Database | Sem pgcrypto para UUID nativo |
| M26 | Database | FK sem ON UPDATE CASCADE onde necessario |
| M27 | Database | Sem connection pooling externo (PgBouncer) |
| M28 | Database | Sequences sem CYCLE para ambiente dev |
| M29 | Backend | CertificateRegistry fallback to empty se certs nao encontrados |
| M30 | Backend | Sem graceful shutdown para consumers |
| M31 | BACEN | Retry policy para mensagens rejeitadas nao implementada |

---

## ISSUES BAIXOS (21)

| # | Area | Issue |
|---|------|-------|
| L1 | Backend | Mix.env() chamado em runtime (deveria ser compile-time) |
| L2 | Backend | Sem compressao gzip em respostas API |
| L3 | Backend | Documentacao Swagger/OpenAPI ausente |
| L4 | Frontend | CSS inconsistente em algumas views |
| L5 | Frontend | Sem animacoes de transicao |
| L6 | Frontend | Tooltip truncados em telas pequenas |
| L7 | Frontend | Sem testes unitarios |
| L8 | Frontend | Sem testes e2e automatizados |
| L9 | Frontend | Vuetify theme nao customizado |
| L10 | Frontend | Sem PWA manifest |
| L11 | Frontend | Links externos sem rel="noopener" |
| L12 | Frontend | Sem lazy loading de imagens |
| L13 | Database | Tabela institutions sem indice em `name` |
| L14 | Database | Sem extensao pg_trgm para busca fuzzy |
| L15 | Database | Coluna `metadata JSONB` sem GIN index |
| L16 | Database | Sem read replica para queries pesadas |
| L17 | Database | Sem backup verification automatizado |
| L18 | Database | Sem alertas de espaco em disco |
| L19 | BACEN | SLA monitoring nao implementado |
| L20 | Backend | Sem circuit breaker para chamadas externas |
| L21 | Backend | Logger sem structured JSON format |

---

## PRIORIZACAO RECOMENDADA

### Sprint 1 — Seguranca & Compliance (Criticos)
1. C1: Rate limiting no login
2. C3: SQL injection fix
3. C4: String.to_atom fix
4. C5: Validacao horario BACEN
5. C6: Remover certificados placeholder
6. C7: Token refresh/redirect
7. C8: Alinhar schema com DB

### Sprint 2 — Protocolo BACEN Funcional
1. H1: InboundConsumer dispatch real
2. H2: MQ Consumer ativo
3. H3: COA/COD parsing completo
4. H16: Day opening/closing com grade
5. H17: R2 settlement completo

### Sprint 3 — Qualidade & Resiliencia
1. C2: Health check completo
2. H4: Input validation
3. H5: LIMIT em queries
4. H9: Loading states
5. H10: Error boundaries
6. H12: CHECK constraints financeiros

### Sprint 4 — Polish & Production Readiness
1. H6: Remover 63 `any` types
2. H7/H8: ProfileView + NotFoundView
3. H11: Auto-refresh
4. H13: updated_at triggers
5. H14: state CHECK constraint
6. H18: Request ID tracing
7. H21: IP address em audit logs

---

## O QUE ESTA 100% PRONTO

| Area | Status |
|------|--------|
| Infraestrutura GKE | 5 pods operacionais, 3 zonas |
| Cloud SQL | PG16, 41 tabelas, 41 FKs, 173 indexes |
| NATS JetStream | 3-node cluster, 4 streams, 3 consumers |
| IBM MQ | 21 filas BACEN, QM ativo |
| Backend API | ~100+ endpoints, 18 controllers |
| Frontend Admin | ~50 paginas, zero mock data |
| 529 R1/R2/R3 Modules | Gerados e compilam |
| LifecycleEngine | State machine com 18 estados |
| CoaCodHandler | GEN0014/0015/0017/0018 |
| MessageTimeline | Frontend component funcional |
| XMLDSig | RSA-SHA256, Exclusive C14N |
| CertificateRegistry | 462 certificados (CloudWalk + BACEN + 460 inst) |
| BCMSG Envelope | Builder + Parser centralizado |
| Transactional | Repo.transaction em operacoes criticas |
| JWT Auth | HMAC-SHA256, login/logout/refresh |
| CORS | Configurado para ambos dominios |
| Simulator | 11 cenarios, R1/R2 + COA/COD |

---

*Gerado automaticamente por analise profunda em 2026-02-08*
*4 agentes de investigacao: Backend, Frontend, BACEN Protocol, Database*
