# 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*