Initial commit — Pedrito Hechakuaa v0

Bot de Telegram para monitoreo de notificaciones judiciales del PJ Paraguay.
Multi-tenant con onboarding conversacional, audit log, y polling automático.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
markosbenitez
2026-05-25 10:58:32 -03:00
commit 7743919695
24 changed files with 5242 additions and 0 deletions

47
TECH_DEBT.md Normal file
View File

@@ -0,0 +1,47 @@
# TECH_DEBT.md — Deuda técnica
Deuda técnica conocida y aceptada en v0. Cada ítem se migra en v1 salvo indicación contraria.
---
## Alta prioridad (migrar antes de agregar más usuarios)
### TD-001: Fernet single-key en lugar de envelope encryption
**Descripción**: Las credenciales usan Fernet con una sola clave maestra en `.env`.
En v1 se reemplaza por envelope encryption (DEK por tenant + MK separada).
**Impacto**: Si la FERNET_KEY se compromete, todas las credenciales son vulnerables.
**Mitigation actual**: El `.env` nunca va al repo; la key no está en el código.
**Destino**: `app/vault/` en v1 (ver `docs/ARCHITECTURE.md §6`).
### TD-002: Snapshot en JSON local sin concurrencia
**Descripción**: `storage.py` lee/escribe un JSON sin locks. Con un solo proceso no hay problema.
**Impacto**: Cero en v0 (single process). Race condition posible en v1 (multi-worker).
**Destino**: Reemplazar por Postgres con transacciones en v1.
### TD-003: Sin refresh token implementado
**Descripción**: Cuando el bearer token expira (TTL 1h), el cliente hace relogin completo.
El endpoint de refresh token no fue capturado en el reconocimiento.
**Impacto**: Relogin extra cada hora (costo ~0 ya que no hay captcha).
**Destino**: Capturar el endpoint en sesión 2 de reconocimiento e implementar.
---
## Baja prioridad (mejoras futuras)
### TD-004: aiogram en lugar de python-telegram-bot
**Descripción**: aiogram tiene FSM nativo más robusto y mejor async que python-telegram-bot.
**Impacto**: Cero en v0 (no usamos FSM complejo). Relevante cuando el bot tenga flujos multi-paso.
**Decisión**: Evaluar al inicio de v1. No migrar en v0.
### TD-005: structlog sin filtro global de credenciales
**Descripción**: `scrub()` existe pero se llama manualmente en cada log.
Sería más seguro registrarlo como processor global de structlog.
**Destino**: En v1, registrar como processor en la configuración de structlog.
### TD-006: Sin tests de integración reales
**Descripción**: Los tests unitarios usan mocks. No hay tests que peguen al PJ real.
**Decisión aceptada**: Tests contra el PJ real son `@pytest.mark.manual` por diseño.
---
*Última actualización: 2026-05-20*