plan: add implementation plan for fraud detection engine

Stack: Python 3.12/FastAPI + React 19/TypeScript + PostgreSQL + Redis.
6 artifacts: plan.md, research.md, data-model.md, api.yaml (OpenAPI),
quickstart.md, updated AGENTS.md. Constitution check: 6/6 PASS.
This commit is contained in:
Felipe Domingues 2026-05-12 14:58:21 -03:00
parent e31cba2847
commit 7f9832bf4b
6 changed files with 1487 additions and 1 deletions

View file

@ -0,0 +1,127 @@
# Research: Motor de Detecção de Fraudes Bancárias
**Feature**: 001-fraud-detection-engine
**Date**: 2026-05-11
**Status**: Complete
## 1. Backend Runtime & Framework
**Decision**: Python 3.12 + FastAPI
**Rationale**:
- Python é a linguagem dominante em data science e financial services — facilita contratação e evolução futura para ML.
- FastAPI oferece async nativo, validação automática via Pydantic, OpenAPI auto-generated, e performance comparável a Node.js.
- Ecossistema rico para processamento de dados (pandas, numpy) útil para análise de transações e backtesting de regras.
- Tipagem estática com mypy alinha-se com o princípio de Test-First da constituição.
**Alternatives considered**:
- **Node.js + Express**: Bom para I/O, mas ecossistema de data processing inferior. Regras complexas seriam mais verbosas.
- **Go**: Performance superior, mas ecossistema de dados limitado e curva de aprendizado maior para analistas que contribuem com regras.
- **Java + Spring Boot**: Maduro para banking, mas verboso e lento para iteração. Overkill para MVP.
## 2. Frontend Framework
**Decision**: React 19 + TypeScript + Tailwind CSS
**Rationale**:
- Dashboard com múltiplos gráficos e filtros se beneficia do modelo de componentes React.
- TypeScript alinha-se com a tipagem do backend (Pydantic → TypeScript types via OpenAPI codegen).
- Tailwind CSS para velocidade de desenvolvimento e consistência visual sem CSS complexo.
- Recharts ou Tremor para gráficos de dashboard (nativos React, bem mantidos).
**Alternatives considered**:
- **HTMX + templates Jinja2**: Mais simples, mas dashboard interativo com filtros dinâmicos e real-time updates seria complexo.
- **Vue 3 + Nuxt**: Excelente framework, mas React tem ecossistema maior de componentes de dashboard.
- **Svelte**: Performance superior, mas ecossistema de componentes para dashboard ainda imaturo comparado a React.
## 3. Database
**Decision**: PostgreSQL 16
**Rationale**:
- Audit log imutável: PostgreSQL com triggers ou particionamento por mês atende sem complexidade adicional.
- JSONB para payload flexível das transações e regras.
- Full-text search nativo para busca em explicações.
- Window functions para cálculos de médias móveis (baseline do cliente).
- `pgAudit` extension para camada extra de auditoria a nível de banco.
- Row-Level Security como defesa em profundidade.
**Alternatives considered**:
- **MongoDB**: Schema flexível para transações, mas audit log imutável é mais natural em relacional. Transações ACID são essenciais para dados financeiros.
- **SQLite**: Ótimo para dev/local, insuficiente para concorrência em produção.
- **TimescaleDB (extensão PostgreSQL)**: Considerar para hypertables de transações se volume crescer além de 100k/dia. Não necessário para MVP.
## 4. Cache & Real-Time
**Decision**: Redis 7
**Rationale**:
- Contadores em tempo real do dashboard (transações/minuto, alertas/24h) via Redis `INCR` + TTL.
- Cache de médias do cliente (gasto médio, localização habitual) para o motor de regras (evita JOIN pesado a cada transação).
- Rate limiting da API de ingestão.
- Pub/Sub para notificações de novos alertas no dashboard (SSE ou WebSocket).
**Alternatives considered**:
- **Sem cache (query direta no PostgreSQL)**: Viável para MVP com <10k transações/dia, mas dashboard near real-time sofreria.
- **Memcached**: Mais simples, mas sem Pub/Sub e estruturas de dados avançadas.
## 5. Message Queue (Picos de Volume)
**Decision**: Redis Streams (MVP) → RabbitMQ (scale)
**Rationale**:
- Para MVP, Redis Streams oferece consumer groups, acknowledgments, e já está na stack.
- Se volume crescer, migrar para RabbitMQ que oferece dead letter queues, retry policies, e routing complexo.
- Padrão: API de ingestão → Redis Streams → Workers de processamento → PostgreSQL.
- Desacopla ingestão do processamento, essencial para os picos de 5x mencionados na spec.
**Alternatives considered**:
- **Kafka**: Overkill para MVP. Operação complexa.
- **Processamento síncrono**: Violaria SC-001 (2s p95) durante picos.
## 6. Rule Engine Architecture
**Decision**: Python rules engine built on Pydantic models + expression evaluator
**Rationale**:
- Regras são condições booleanas com peso. Exemplo: `transaction.amount > customer.avg_amount * 3` → score 30.
- Pydantic models definem o schema da regra, validação automática.
- `simpleeval` ou `lark-parser` para avaliar expressões de forma segura (sem `eval()` nativo).
- Cada regra é uma classe Python que implementa `evaluate(transaction, context) -> RuleResult`.
- Conjunto de regras é carregado do PostgreSQL no boot e cacheado em memória. Reload via endpoint admin.
- Snapshot versionado: cada transação registra qual versão do ruleset foi usada (rastreabilidade → FR-005).
**Alternatives considered**:
- **Drools (Java)**: Maduro mas exige JVM, complexidade desnecessária.
- **Django Rules**: Acoplado ao Django ORM, não adequado para FastAPI.
- **JSONLogic**: Bom para regras simples, limitado para expressões aritméticas complexas.
## 7. Testing Strategy
**Decision**: pytest + pytest-asyncio (backend), Vitest + React Testing Library (frontend)
**Rationale**:
- TDD mandatório por constituição.
- Testes de regra: dataset de transações com fraudes conhecidas → assert score, assert explicação, assert alerta.
- Testes de contrato: OpenAPI schema validation, garantir que API não quebra entre versões.
- Testes de integração: pipeline completo (API → rules → alerta → decisão).
- Testes E2E: Playwright para fluxos do analista (login → fila → avalia alerta → decide).
## 8. Authentication & Authorization
**Decision**: JWT + OAuth2/OIDC via external IdP (Keycloak ou Auth0)
**Rationale**:
- Spec assume identity provider externo. FastAPI tem suporte nativo a OAuth2 + JWT.
- Perfis (analista, admin, sênior) mapeados para claims no token.
- Middleware de autorização por rota verifica claims.
- Sem senhas armazenadas no FraudShield — compliance LGPD simplificada.
## 9. Deployment
**Decision**: Docker Compose (dev/local) → Kubernetes ou cloud PaaS (produção)
**Rationale**:
- Docker Compose para ambiente dev: PostgreSQL + Redis + API + Frontend em containers.
- Simplicidade para MVP: um `docker compose up` resolve.
- Produção depende de onde hospedar (AWS ECS, GCP Cloud Run, Railway, etc.). Fora do escopo do MVP decidir.